2019-05-27 08:55:01 +02:00
// SPDX-License-Identifier: GPL-2.0-or-later
2014-02-12 18:20:56 +01:00
/*
* Copyright ( C ) 2014 Marvell
*
* Thomas Petazzoni < thomas . petazzoni @ free - electrons . com >
*/
# include <linux/module.h>
# include <linux/moduleparam.h>
# include <linux/interrupt.h>
# include <linux/platform_device.h>
# include <linux/slab.h>
# include <sound/soc.h>
# include <linux/of.h>
# include <linux/platform_data/asoc-kirkwood.h>
# include "../codecs/cs42l51.h"
static int a370db_hw_params ( struct snd_pcm_substream * substream ,
struct snd_pcm_hw_params * params )
{
2020-07-20 10:19:41 +09:00
struct snd_soc_pcm_runtime * rtd = asoc_substream_to_rtd ( substream ) ;
2020-03-23 14:19:14 +09:00
struct snd_soc_dai * codec_dai = asoc_rtd_to_codec ( rtd , 0 ) ;
2014-02-12 18:20:56 +01:00
unsigned int freq ;
switch ( params_rate ( params ) ) {
default :
case 44100 :
freq = 11289600 ;
break ;
case 48000 :
freq = 12288000 ;
break ;
case 96000 :
freq = 24576000 ;
break ;
}
return snd_soc_dai_set_sysclk ( codec_dai , 0 , freq , SND_SOC_CLOCK_IN ) ;
}
2016-10-15 16:55:49 +02:00
static const struct snd_soc_ops a370db_ops = {
2014-02-12 18:20:56 +01:00
. hw_params = a370db_hw_params ,
} ;
static const struct snd_soc_dapm_widget a370db_dapm_widgets [ ] = {
SND_SOC_DAPM_HP ( " Out Jack " , NULL ) ,
SND_SOC_DAPM_LINE ( " In Jack " , NULL ) ,
} ;
static const struct snd_soc_dapm_route a370db_route [ ] = {
{ " Out Jack " , NULL , " HPL " } ,
{ " Out Jack " , NULL , " HPR " } ,
{ " AIN1L " , NULL , " In Jack " } ,
{ " AIN1L " , NULL , " In Jack " } ,
} ;
2019-06-06 13:12:34 +09:00
SND_SOC_DAILINK_DEFS ( analog ,
DAILINK_COMP_ARRAY ( COMP_CPU ( " i2s " ) ) ,
2019-06-28 10:47:38 +09:00
DAILINK_COMP_ARRAY ( COMP_CODEC ( NULL , " cs42l51-hifi " ) ) ,
DAILINK_COMP_ARRAY ( COMP_EMPTY ( ) ) ) ;
2019-06-06 13:12:34 +09:00
SND_SOC_DAILINK_DEFS ( spdif_out ,
DAILINK_COMP_ARRAY ( COMP_CPU ( " spdif " ) ) ,
2019-06-28 10:47:38 +09:00
DAILINK_COMP_ARRAY ( COMP_CODEC ( NULL , " dit-hifi " ) ) ,
DAILINK_COMP_ARRAY ( COMP_EMPTY ( ) ) ) ;
2019-06-06 13:12:34 +09:00
SND_SOC_DAILINK_DEFS ( spdif_in ,
DAILINK_COMP_ARRAY ( COMP_CPU ( " spdif " ) ) ,
2019-06-28 10:47:38 +09:00
DAILINK_COMP_ARRAY ( COMP_CODEC ( NULL , " dir-hifi " ) ) ,
DAILINK_COMP_ARRAY ( COMP_EMPTY ( ) ) ) ;
2019-06-06 13:12:34 +09:00
2014-02-12 18:20:56 +01:00
static struct snd_soc_dai_link a370db_dai [ ] = {
{
. name = " CS42L51 " ,
. stream_name = " analog " ,
. dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS ,
. ops = & a370db_ops ,
2019-06-06 13:12:34 +09:00
SND_SOC_DAILINK_REG ( analog ) ,
2014-02-12 18:20:56 +01:00
} ,
2014-02-12 18:20:57 +01:00
{
. name = " S/PDIF out " ,
. stream_name = " spdif-out " ,
. dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS ,
2019-06-06 13:12:34 +09:00
SND_SOC_DAILINK_REG ( spdif_out ) ,
2014-02-12 18:20:57 +01:00
} ,
{
. name = " S/PDIF in " ,
. stream_name = " spdif-in " ,
. dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS ,
2019-06-06 13:12:34 +09:00
SND_SOC_DAILINK_REG ( spdif_in ) ,
2014-02-12 18:20:57 +01:00
} ,
2014-02-12 18:20:56 +01:00
} ;
static struct snd_soc_card a370db = {
. name = " a370db " ,
. owner = THIS_MODULE ,
. dai_link = a370db_dai ,
. num_links = ARRAY_SIZE ( a370db_dai ) ,
. dapm_widgets = a370db_dapm_widgets ,
. num_dapm_widgets = ARRAY_SIZE ( a370db_dapm_widgets ) ,
. dapm_routes = a370db_route ,
. num_dapm_routes = ARRAY_SIZE ( a370db_route ) ,
} ;
static int a370db_probe ( struct platform_device * pdev )
{
struct snd_soc_card * card = & a370db ;
card - > dev = & pdev - > dev ;
2019-06-06 13:12:34 +09:00
a370db_dai [ 0 ] . cpus - > of_node =
2014-02-12 18:20:56 +01:00
of_parse_phandle ( pdev - > dev . of_node ,
" marvell,audio-controller " , 0 ) ;
2019-06-28 10:47:38 +09:00
a370db_dai [ 0 ] . platforms - > of_node = a370db_dai [ 0 ] . cpus - > of_node ;
2014-02-12 18:20:56 +01:00
2019-06-06 13:12:34 +09:00
a370db_dai [ 0 ] . codecs - > of_node =
2014-02-12 18:20:56 +01:00
of_parse_phandle ( pdev - > dev . of_node ,
" marvell,audio-codec " , 0 ) ;
2019-06-06 13:12:34 +09:00
a370db_dai [ 1 ] . cpus - > of_node = a370db_dai [ 0 ] . cpus - > of_node ;
2019-06-28 10:47:38 +09:00
a370db_dai [ 1 ] . platforms - > of_node = a370db_dai [ 0 ] . cpus - > of_node ;
2014-02-12 18:20:57 +01:00
2019-06-06 13:12:34 +09:00
a370db_dai [ 1 ] . codecs - > of_node =
2014-02-12 18:20:57 +01:00
of_parse_phandle ( pdev - > dev . of_node ,
" marvell,audio-codec " , 1 ) ;
2019-06-06 13:12:34 +09:00
a370db_dai [ 2 ] . cpus - > of_node = a370db_dai [ 0 ] . cpus - > of_node ;
2019-06-28 10:47:38 +09:00
a370db_dai [ 2 ] . platforms - > of_node = a370db_dai [ 0 ] . cpus - > of_node ;
2014-02-12 18:20:57 +01:00
2019-06-06 13:12:34 +09:00
a370db_dai [ 2 ] . codecs - > of_node =
2014-02-12 18:20:57 +01:00
of_parse_phandle ( pdev - > dev . of_node ,
" marvell,audio-codec " , 2 ) ;
2014-02-12 18:20:56 +01:00
return devm_snd_soc_register_card ( card - > dev , card ) ;
}
2020-11-25 17:44:20 +01:00
static const struct of_device_id a370db_dt_ids [ ] __maybe_unused = {
2014-02-12 18:20:56 +01:00
{ . compatible = " marvell,a370db-audio " } ,
{ } ,
} ;
2015-09-03 12:59:32 +02:00
MODULE_DEVICE_TABLE ( of , a370db_dt_ids ) ;
2014-02-12 18:20:56 +01:00
static struct platform_driver a370db_driver = {
. driver = {
. name = " a370db-audio " ,
. of_match_table = of_match_ptr ( a370db_dt_ids ) ,
} ,
. probe = a370db_probe ,
} ;
module_platform_driver ( a370db_driver ) ;
MODULE_AUTHOR ( " Thomas Petazzoni <thomas.petazzoni@free-electrons.com> " ) ;
MODULE_DESCRIPTION ( " ALSA SoC a370db audio client " ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_ALIAS ( " platform:a370db-audio " ) ;