2020-05-01 09:58:50 -05:00
// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
2019-04-12 11:05:17 -05:00
//
// This file is provided under a dual BSD/GPLv2 license. When using or
// redistributing this file, you may do so under either license.
//
// Copyright(c) 2018 Intel Corporation. All rights reserved.
//
// Author: Liam Girdwood <liam.r.girdwood@linux.intel.com>
//
# include <linux/module.h>
# include <sound/sof.h>
2020-11-20 16:16:53 +02:00
# include "sof-audio.h"
2019-04-12 11:05:17 -05:00
# include "sof-priv.h"
static struct snd_soc_card sof_nocodec_card = {
. name = " nocodec " , /* the sof- prefix is added by the core */
2020-11-20 16:16:53 +02:00
. topology_shortname = " sof-nocodec " ,
2020-06-25 14:12:52 -05:00
. owner = THIS_MODULE
2019-04-12 11:05:17 -05:00
} ;
static int sof_nocodec_bes_setup ( struct device * dev ,
2021-04-09 15:01:21 -07:00
struct snd_soc_dai_driver * drv ,
2019-04-12 11:05:17 -05:00
struct snd_soc_dai_link * links ,
2021-04-09 15:01:21 -07:00
int link_num , struct snd_soc_card * card )
2019-04-12 11:05:17 -05:00
{
2019-06-06 13:19:24 +09:00
struct snd_soc_dai_link_component * dlc ;
2019-04-12 11:05:17 -05:00
int i ;
2021-04-09 15:01:21 -07:00
if ( ! drv | | ! links | | ! card )
2019-04-12 11:05:17 -05:00
return - EINVAL ;
/* set up BE dai_links */
for ( i = 0 ; i < link_num ; i + + ) {
2019-06-06 13:19:24 +09:00
dlc = devm_kzalloc ( dev , 3 * sizeof ( * dlc ) , GFP_KERNEL ) ;
if ( ! dlc )
return - ENOMEM ;
2019-04-12 11:05:17 -05:00
links [ i ] . name = devm_kasprintf ( dev , GFP_KERNEL ,
" NoCodec-%d " , i ) ;
if ( ! links [ i ] . name )
return - ENOMEM ;
2020-11-20 16:16:53 +02:00
links [ i ] . stream_name = links [ i ] . name ;
2019-06-06 13:19:24 +09:00
links [ i ] . cpus = & dlc [ 0 ] ;
links [ i ] . codecs = & dlc [ 1 ] ;
links [ i ] . platforms = & dlc [ 2 ] ;
links [ i ] . num_cpus = 1 ;
links [ i ] . num_codecs = 1 ;
links [ i ] . num_platforms = 1 ;
2019-04-12 11:05:17 -05:00
links [ i ] . id = i ;
links [ i ] . no_pcm = 1 ;
2021-04-09 15:01:21 -07:00
links [ i ] . cpus - > dai_name = drv [ i ] . name ;
links [ i ] . platforms - > name = dev_name ( dev - > parent ) ;
2019-06-06 13:19:24 +09:00
links [ i ] . codecs - > dai_name = " snd-soc-dummy-dai " ;
links [ i ] . codecs - > name = " snd-soc-dummy " ;
2021-04-09 15:01:21 -07:00
if ( drv [ i ] . playback . channels_min )
2020-06-08 14:44:15 -05:00
links [ i ] . dpcm_playback = 1 ;
2021-04-09 15:01:21 -07:00
if ( drv [ i ] . capture . channels_min )
2020-06-08 14:44:15 -05:00
links [ i ] . dpcm_capture = 1 ;
2020-11-20 16:16:53 +02:00
2021-04-09 15:01:21 -07:00
links [ i ] . be_hw_params_fixup = sof_pcm_dai_link_fixup ;
2019-04-12 11:05:17 -05:00
}
card - > dai_link = links ;
card - > num_links = link_num ;
return 0 ;
}
2021-04-09 15:01:21 -07:00
static int sof_nocodec_setup ( struct device * dev ,
u32 num_dai_drivers ,
struct snd_soc_dai_driver * dai_drivers )
2019-04-12 11:05:17 -05:00
{
struct snd_soc_dai_link * links ;
/* create dummy BE dai_links */
2021-04-09 15:01:21 -07:00
links = devm_kzalloc ( dev , sizeof ( struct snd_soc_dai_link ) * num_dai_drivers , GFP_KERNEL ) ;
2019-04-12 11:05:17 -05:00
if ( ! links )
return - ENOMEM ;
2021-04-09 15:01:21 -07:00
return sof_nocodec_bes_setup ( dev , dai_drivers , links , num_dai_drivers , & sof_nocodec_card ) ;
2019-04-12 11:05:17 -05:00
}
static int sof_nocodec_probe ( struct platform_device * pdev )
{
struct snd_soc_card * card = & sof_nocodec_card ;
2021-04-09 15:01:21 -07:00
struct snd_soc_acpi_mach * mach ;
int ret ;
2019-04-12 11:05:17 -05:00
card - > dev = & pdev - > dev ;
2020-11-20 16:16:53 +02:00
card - > topology_shortname_created = true ;
2021-04-09 15:01:21 -07:00
mach = pdev - > dev . platform_data ;
ret = sof_nocodec_setup ( card - > dev , mach - > mach_params . num_dai_drivers ,
mach - > mach_params . dai_drivers ) ;
if ( ret < 0 )
return ret ;
2019-04-12 11:05:17 -05:00
return devm_snd_soc_register_card ( & pdev - > dev , card ) ;
}
static int sof_nocodec_remove ( struct platform_device * pdev )
{
return 0 ;
}
static struct platform_driver sof_nocodec_audio = {
. probe = sof_nocodec_probe ,
. remove = sof_nocodec_remove ,
. driver = {
. name = " sof-nocodec " ,
. pm = & snd_soc_pm_ops ,
} ,
} ;
module_platform_driver ( sof_nocodec_audio )
MODULE_DESCRIPTION ( " ASoC sof nocodec " ) ;
MODULE_AUTHOR ( " Liam Girdwood " ) ;
MODULE_LICENSE ( " Dual BSD/GPL " ) ;
MODULE_ALIAS ( " platform:sof-nocodec " ) ;