2019-04-12 11:05:17 -05:00
// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
//
// 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>
# include "sof-priv.h"
static struct snd_soc_card sof_nocodec_card = {
. name = " nocodec " , /* the sof- prefix is added by the core */
} ;
static int sof_nocodec_bes_setup ( struct device * dev ,
const struct snd_sof_dsp_ops * ops ,
struct snd_soc_dai_link * links ,
int link_num , struct snd_soc_card * card )
{
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 ;
if ( ! ops | | ! links | | ! card )
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 ;
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 ;
2019-06-06 13:19:24 +09:00
links [ i ] . cpus - > dai_name = ops - > drv [ i ] . name ;
links [ i ] . platforms - > name = dev_name ( dev ) ;
links [ i ] . codecs - > dai_name = " snd-soc-dummy-dai " ;
links [ i ] . codecs - > name = " snd-soc-dummy " ;
2019-04-12 11:05:17 -05:00
links [ i ] . dpcm_playback = 1 ;
links [ i ] . dpcm_capture = 1 ;
}
card - > dai_link = links ;
card - > num_links = link_num ;
return 0 ;
}
int sof_nocodec_setup ( struct device * dev ,
const struct snd_sof_dsp_ops * ops )
{
struct snd_soc_dai_link * links ;
int ret ;
/* create dummy BE dai_links */
links = devm_kzalloc ( dev , sizeof ( struct snd_soc_dai_link ) *
ops - > num_drv , GFP_KERNEL ) ;
if ( ! links )
return - ENOMEM ;
ret = sof_nocodec_bes_setup ( dev , ops , links , ops - > num_drv ,
& sof_nocodec_card ) ;
return ret ;
}
EXPORT_SYMBOL ( sof_nocodec_setup ) ;
static int sof_nocodec_probe ( struct platform_device * pdev )
{
struct snd_soc_card * card = & sof_nocodec_card ;
card - > dev = & pdev - > dev ;
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 " ) ;