2018-07-02 06:31:16 +00:00
// SPDX-License-Identifier: GPL-2.0
//
// ASoC audio graph sound card support
//
// Copyright (C) 2016 Renesas Solutions Corp.
// Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
//
// based on ${LINUX}/sound/soc/generic/simple-card.c
2017-04-20 01:36:08 +00:00
# include <linux/clk.h>
# include <linux/device.h>
# include <linux/gpio.h>
2017-06-29 21:26:38 +08:00
# include <linux/gpio/consumer.h>
2017-04-20 01:36:08 +00:00
# include <linux/module.h>
# include <linux/of.h>
# include <linux/of_device.h>
# include <linux/of_gpio.h>
# include <linux/of_graph.h>
# include <linux/platform_device.h>
# include <linux/string.h>
# include <sound/simple_card_utils.h>
2019-04-04 09:52:15 +09:00
# define DPCM_SELECTABLE 1
2018-12-14 11:32:25 +09:00
# define PREFIX "audio-graph-card,"
2018-12-20 10:46:33 +09:00
static int graph_outdrv_event ( struct snd_soc_dapm_widget * w ,
struct snd_kcontrol * kcontrol ,
int event )
2017-06-29 21:26:38 +08:00
{
struct snd_soc_dapm_context * dapm = w - > dapm ;
ASoC: simple_card_utils: share common priv for simple-card/audio-graph
Historically, simple-card/simple-scu-card/audio-graph/audio-graph-scu
are similar but different generic sound card.
simple-scu-card which was for DPCM was merged into simple-card, and
audio-graph-scu which was for DPCM was merged into audio-graph.
simple-card is for non OF graph sound card, and
audio-graph is for OF graph sound card.
And, small detail difference (= function parameter, naming, etc)
between simple-card/audio-graph has been unified.
So today, the difference between simple-card/audio-graph are
just using OF graph style, or not.
In other words, there should no difference other than OF graph sytle.
simple-card/audio-graph are using own priv today , but we can merge it.
This patch merge it at simple_card_utils.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-03-20 13:54:59 +09:00
struct asoc_simple_priv * priv = snd_soc_card_get_drvdata ( dapm - > card ) ;
2017-06-29 21:26:38 +08:00
switch ( event ) {
case SND_SOC_DAPM_POST_PMU :
gpiod_set_value_cansleep ( priv - > pa_gpio , 1 ) ;
break ;
case SND_SOC_DAPM_PRE_PMD :
gpiod_set_value_cansleep ( priv - > pa_gpio , 0 ) ;
break ;
default :
return - EINVAL ;
}
return 0 ;
}
2018-12-20 10:46:33 +09:00
static const struct snd_soc_dapm_widget graph_dapm_widgets [ ] = {
2017-06-29 21:26:38 +08:00
SND_SOC_DAPM_OUT_DRV_E ( " Amplifier " , SND_SOC_NOPM ,
2018-12-20 10:46:33 +09:00
0 , 0 , NULL , 0 , graph_outdrv_event ,
2017-06-29 21:26:38 +08:00
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD ) ,
2017-04-20 01:36:08 +00:00
} ;
2018-12-20 10:46:33 +09:00
static const struct snd_soc_ops graph_ops = {
2019-03-20 13:55:14 +09:00
. startup = asoc_simple_startup ,
2019-03-20 13:55:27 +09:00
. shutdown = asoc_simple_shutdown ,
2019-03-20 13:55:39 +09:00
. hw_params = asoc_simple_hw_params ,
2017-04-20 01:36:08 +00:00
} ;
2019-03-20 13:56:36 +09:00
static int graph_get_dai_id ( struct device_node * ep )
{
struct device_node * node ;
struct device_node * endpoint ;
struct of_endpoint info ;
int i , id ;
int ret ;
/* use driver specified DAI ID if exist */
ret = snd_soc_get_dai_id ( ep ) ;
if ( ret ! = - ENOTSUPP )
return ret ;
/* use endpoint/port reg if exist */
ret = of_graph_parse_endpoint ( ep , & info ) ;
if ( ret = = 0 ) {
/*
* Because it will count port / endpoint if it doesn ' t have " reg " .
* But , we can ' t judge whether it has " no reg " , or " reg = <0> "
* only of_graph_parse_endpoint ( ) .
* We need to check " reg " property
*/
if ( of_get_property ( ep , " reg " , NULL ) )
return info . id ;
node = of_get_parent ( ep ) ;
of_node_put ( node ) ;
if ( of_get_property ( node , " reg " , NULL ) )
return info . port ;
}
node = of_graph_get_port_parent ( ep ) ;
/*
* Non HDMI sound case , counting port / endpoint on its DT
* is enough . Let ' s count it .
*/
i = 0 ;
id = - 1 ;
for_each_endpoint_of_node ( node , endpoint ) {
if ( endpoint = = ep )
id = i ;
i + + ;
}
of_node_put ( node ) ;
if ( id < 0 )
return - ENODEV ;
return id ;
}
2019-03-20 13:56:50 +09:00
static int asoc_simple_parse_dai ( struct device_node * ep ,
struct snd_soc_dai_link_component * dlc ,
struct device_node * * dai_of_node ,
const char * * dai_name ,
int * is_single_link )
2019-03-20 13:56:36 +09:00
{
struct device_node * node ;
struct of_phandle_args args ;
int ret ;
/*
* Use snd_soc_dai_link_component instead of legacy style .
* It is only for codec , but cpu will be supported in the future .
* see
* soc - core . c : : snd_soc_init_multicodec ( )
*/
if ( dlc ) {
dai_name = & dlc - > dai_name ;
dai_of_node = & dlc - > of_node ;
}
if ( ! ep )
return 0 ;
if ( ! dai_name )
return 0 ;
node = of_graph_get_port_parent ( ep ) ;
/* Get dai->name */
args . np = node ;
args . args [ 0 ] = graph_get_dai_id ( ep ) ;
args . args_count = ( of_graph_get_endpoint_count ( node ) > 1 ) ;
ret = snd_soc_get_dai_name ( & args , dai_name ) ;
if ( ret < 0 )
return ret ;
* dai_of_node = node ;
if ( is_single_link )
* is_single_link = of_graph_get_endpoint_count ( node ) = = 1 ;
return 0 ;
}
2019-03-18 13:50:25 +09:00
static void graph_parse_convert ( struct device * dev ,
struct device_node * ep ,
2019-03-20 13:56:50 +09:00
struct asoc_simple_data * adata )
2018-12-20 10:45:48 +09:00
{
struct device_node * top = dev - > of_node ;
struct device_node * port = of_get_parent ( ep ) ;
struct device_node * ports = of_get_parent ( port ) ;
struct device_node * node = of_graph_get_port_parent ( ep ) ;
2019-03-20 13:56:50 +09:00
asoc_simple_parse_convert ( dev , top , NULL , adata ) ;
asoc_simple_parse_convert ( dev , node , PREFIX , adata ) ;
asoc_simple_parse_convert ( dev , ports , NULL , adata ) ;
asoc_simple_parse_convert ( dev , port , NULL , adata ) ;
asoc_simple_parse_convert ( dev , ep , NULL , adata ) ;
2019-03-18 13:50:25 +09:00
of_node_put ( port ) ;
of_node_put ( ports ) ;
of_node_put ( node ) ;
2018-12-20 10:45:48 +09:00
}
2019-03-18 13:50:31 +09:00
static void graph_parse_mclk_fs ( struct device_node * top ,
struct device_node * ep ,
ASoC: simple_card_utils: share common priv for simple-card/audio-graph
Historically, simple-card/simple-scu-card/audio-graph/audio-graph-scu
are similar but different generic sound card.
simple-scu-card which was for DPCM was merged into simple-card, and
audio-graph-scu which was for DPCM was merged into audio-graph.
simple-card is for non OF graph sound card, and
audio-graph is for OF graph sound card.
And, small detail difference (= function parameter, naming, etc)
between simple-card/audio-graph has been unified.
So today, the difference between simple-card/audio-graph are
just using OF graph style, or not.
In other words, there should no difference other than OF graph sytle.
simple-card/audio-graph are using own priv today , but we can merge it.
This patch merge it at simple_card_utils.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-03-20 13:54:59 +09:00
struct simple_dai_props * props )
2019-03-18 13:50:31 +09:00
{
struct device_node * port = of_get_parent ( ep ) ;
struct device_node * ports = of_get_parent ( port ) ;
struct device_node * node = of_graph_get_port_parent ( ep ) ;
of_property_read_u32 ( top , " mclk-fs " , & props - > mclk_fs ) ;
of_property_read_u32 ( ports , " mclk-fs " , & props - > mclk_fs ) ;
of_property_read_u32 ( port , " mclk-fs " , & props - > mclk_fs ) ;
of_property_read_u32 ( ep , " mclk-fs " , & props - > mclk_fs ) ;
of_node_put ( port ) ;
of_node_put ( ports ) ;
of_node_put ( node ) ;
}
ASoC: simple_card_utils: share common priv for simple-card/audio-graph
Historically, simple-card/simple-scu-card/audio-graph/audio-graph-scu
are similar but different generic sound card.
simple-scu-card which was for DPCM was merged into simple-card, and
audio-graph-scu which was for DPCM was merged into audio-graph.
simple-card is for non OF graph sound card, and
audio-graph is for OF graph sound card.
And, small detail difference (= function parameter, naming, etc)
between simple-card/audio-graph has been unified.
So today, the difference between simple-card/audio-graph are
just using OF graph style, or not.
In other words, there should no difference other than OF graph sytle.
simple-card/audio-graph are using own priv today , but we can merge it.
This patch merge it at simple_card_utils.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-03-20 13:54:59 +09:00
static int graph_dai_link_of_dpcm ( struct asoc_simple_priv * priv ,
2018-12-20 10:46:33 +09:00
struct device_node * cpu_ep ,
struct device_node * codec_ep ,
struct link_info * li ,
int dup_codec )
2018-12-14 11:32:25 +09:00
{
ASoC: simple_card_utils: share common priv for simple-card/audio-graph
Historically, simple-card/simple-scu-card/audio-graph/audio-graph-scu
are similar but different generic sound card.
simple-scu-card which was for DPCM was merged into simple-card, and
audio-graph-scu which was for DPCM was merged into audio-graph.
simple-card is for non OF graph sound card, and
audio-graph is for OF graph sound card.
And, small detail difference (= function parameter, naming, etc)
between simple-card/audio-graph has been unified.
So today, the difference between simple-card/audio-graph are
just using OF graph style, or not.
In other words, there should no difference other than OF graph sytle.
simple-card/audio-graph are using own priv today , but we can merge it.
This patch merge it at simple_card_utils.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-03-20 13:54:59 +09:00
struct device * dev = simple_priv_to_dev ( priv ) ;
struct snd_soc_dai_link * dai_link = simple_priv_to_link ( priv , li - > link ) ;
struct simple_dai_props * dai_props = simple_priv_to_props ( priv , li - > link ) ;
2018-12-20 10:46:05 +09:00
struct device_node * top = dev - > of_node ;
2018-12-20 10:45:59 +09:00
struct device_node * ep = li - > cpu ? cpu_ep : codec_ep ;
2018-12-20 10:46:05 +09:00
struct device_node * port ;
struct device_node * ports ;
struct device_node * node ;
2018-12-14 11:32:25 +09:00
struct asoc_simple_dai * dai ;
2018-12-14 11:32:43 +09:00
struct snd_soc_dai_link_component * codecs = dai_link - > codecs ;
2018-12-14 11:32:25 +09:00
int ret ;
2018-12-20 10:46:05 +09:00
/* Do it all CPU endpoint, and 1st Codec endpoint */
if ( ! li - > cpu & & dup_codec )
return 0 ;
port = of_get_parent ( ep ) ;
ports = of_get_parent ( port ) ;
node = of_graph_get_port_parent ( ep ) ;
2018-12-20 10:45:59 +09:00
li - > link + + ;
dev_dbg ( dev , " link_of DPCM (%pOF) \n " , ep ) ;
2018-12-14 11:32:25 +09:00
2018-12-14 11:32:30 +09:00
of_node_put ( ports ) ;
of_node_put ( port ) ;
2018-12-20 10:46:05 +09:00
of_node_put ( node ) ;
2018-12-14 11:32:30 +09:00
2018-12-20 10:45:59 +09:00
if ( li - > cpu ) {
2019-03-20 13:56:36 +09:00
int is_single_links = 0 ;
2018-12-14 11:32:25 +09:00
/* BE is dummy */
codecs - > of_node = NULL ;
codecs - > dai_name = " snd-soc-dummy-dai " ;
codecs - > name = " snd-soc-dummy " ;
/* FE settings */
dai_link - > dynamic = 1 ;
dai_link - > dpcm_merged_format = 1 ;
dai =
2018-12-20 10:45:59 +09:00
dai_props - > cpu_dai = & priv - > dais [ li - > dais + + ] ;
2018-12-14 11:32:25 +09:00
2019-03-20 13:56:50 +09:00
ret = asoc_simple_parse_cpu ( ep , dai_link , & is_single_links ) ;
2018-12-14 11:32:25 +09:00
if ( ret )
return ret ;
2019-03-20 13:56:50 +09:00
ret = asoc_simple_parse_clk_cpu ( dev , ep , dai_link , dai ) ;
2018-12-14 11:32:25 +09:00
if ( ret < 0 )
return ret ;
2019-03-20 13:56:50 +09:00
ret = asoc_simple_set_dailink_name ( dev , dai_link ,
" fe.%s " ,
dai_link - > cpu_dai_name ) ;
2018-12-14 11:32:25 +09:00
if ( ret < 0 )
return ret ;
/* card->num_links includes Codec */
2019-03-20 13:56:50 +09:00
asoc_simple_canonicalize_cpu ( dai_link , is_single_links ) ;
2018-12-14 11:32:25 +09:00
} else {
struct snd_soc_codec_conf * cconf ;
/* FE is dummy */
dai_link - > cpu_of_node = NULL ;
dai_link - > cpu_dai_name = " snd-soc-dummy-dai " ;
dai_link - > cpu_name = " snd-soc-dummy " ;
/* BE settings */
dai_link - > no_pcm = 1 ;
2019-03-20 13:56:06 +09:00
dai_link - > be_hw_params_fixup = asoc_simple_be_hw_params_fixup ;
2018-12-14 11:32:25 +09:00
dai =
2018-12-20 10:45:59 +09:00
dai_props - > codec_dai = & priv - > dais [ li - > dais + + ] ;
2018-12-14 11:32:25 +09:00
cconf =
2018-12-20 10:45:59 +09:00
dai_props - > codec_conf = & priv - > codec_conf [ li - > conf + + ] ;
2018-12-14 11:32:25 +09:00
2019-03-20 13:56:50 +09:00
ret = asoc_simple_parse_codec ( ep , dai_link ) ;
2018-12-14 11:32:25 +09:00
if ( ret < 0 )
return ret ;
2019-03-20 13:56:50 +09:00
ret = asoc_simple_parse_clk_codec ( dev , ep , dai_link , dai ) ;
2018-12-14 11:32:25 +09:00
if ( ret < 0 )
return ret ;
2019-03-20 13:56:50 +09:00
ret = asoc_simple_set_dailink_name ( dev , dai_link ,
" be.%s " ,
codecs - > dai_name ) ;
2018-12-14 11:32:25 +09:00
if ( ret < 0 )
return ret ;
/* check "prefix" from top node */
2018-12-14 11:32:43 +09:00
snd_soc_of_parse_node_prefix ( top , cconf , codecs - > of_node ,
2018-12-14 11:32:25 +09:00
" prefix " ) ;
2018-12-14 11:32:43 +09:00
snd_soc_of_parse_node_prefix ( node , cconf , codecs - > of_node ,
PREFIX " prefix " ) ;
snd_soc_of_parse_node_prefix ( ports , cconf , codecs - > of_node ,
" prefix " ) ;
snd_soc_of_parse_node_prefix ( port , cconf , codecs - > of_node ,
" prefix " ) ;
2018-12-14 11:32:25 +09:00
}
2019-03-18 13:50:31 +09:00
graph_parse_convert ( dev , ep , & dai_props - > adata ) ;
graph_parse_mclk_fs ( top , ep , dai_props ) ;
2019-03-20 13:56:50 +09:00
asoc_simple_canonicalize_platform ( dai_link ) ;
2019-01-21 16:40:59 +09:00
2019-03-20 13:56:50 +09:00
ret = asoc_simple_parse_tdm ( ep , dai ) ;
2018-12-14 11:32:25 +09:00
if ( ret )
return ret ;
2019-03-20 13:56:50 +09:00
ret = asoc_simple_parse_daifmt ( dev , cpu_ep , codec_ep ,
NULL , & dai_link - > dai_fmt ) ;
2018-12-14 11:32:25 +09:00
if ( ret < 0 )
return ret ;
dai_link - > dpcm_playback = 1 ;
dai_link - > dpcm_capture = 1 ;
2018-12-20 10:46:33 +09:00
dai_link - > ops = & graph_ops ;
2019-03-20 13:55:52 +09:00
dai_link - > init = asoc_simple_dai_init ;
2018-12-14 11:32:25 +09:00
return 0 ;
}
ASoC: simple_card_utils: share common priv for simple-card/audio-graph
Historically, simple-card/simple-scu-card/audio-graph/audio-graph-scu
are similar but different generic sound card.
simple-scu-card which was for DPCM was merged into simple-card, and
audio-graph-scu which was for DPCM was merged into audio-graph.
simple-card is for non OF graph sound card, and
audio-graph is for OF graph sound card.
And, small detail difference (= function parameter, naming, etc)
between simple-card/audio-graph has been unified.
So today, the difference between simple-card/audio-graph are
just using OF graph style, or not.
In other words, there should no difference other than OF graph sytle.
simple-card/audio-graph are using own priv today , but we can merge it.
This patch merge it at simple_card_utils.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-03-20 13:54:59 +09:00
static int graph_dai_link_of ( struct asoc_simple_priv * priv ,
2018-12-20 10:46:33 +09:00
struct device_node * cpu_ep ,
struct device_node * codec_ep ,
struct link_info * li )
2017-04-20 01:36:08 +00:00
{
ASoC: simple_card_utils: share common priv for simple-card/audio-graph
Historically, simple-card/simple-scu-card/audio-graph/audio-graph-scu
are similar but different generic sound card.
simple-scu-card which was for DPCM was merged into simple-card, and
audio-graph-scu which was for DPCM was merged into audio-graph.
simple-card is for non OF graph sound card, and
audio-graph is for OF graph sound card.
And, small detail difference (= function parameter, naming, etc)
between simple-card/audio-graph has been unified.
So today, the difference between simple-card/audio-graph are
just using OF graph style, or not.
In other words, there should no difference other than OF graph sytle.
simple-card/audio-graph are using own priv today , but we can merge it.
This patch merge it at simple_card_utils.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-03-20 13:54:59 +09:00
struct device * dev = simple_priv_to_dev ( priv ) ;
struct snd_soc_dai_link * dai_link = simple_priv_to_link ( priv , li - > link ) ;
struct simple_dai_props * dai_props = simple_priv_to_props ( priv , li - > link ) ;
2018-12-20 10:46:05 +09:00
struct device_node * top = dev - > of_node ;
2018-11-30 02:07:48 +00:00
struct asoc_simple_dai * cpu_dai ;
struct asoc_simple_dai * codec_dai ;
2019-03-20 13:56:36 +09:00
int ret , single_cpu ;
2017-04-20 01:36:08 +00:00
2018-12-20 10:46:05 +09:00
/* Do it only CPU turn */
if ( ! li - > cpu )
return 0 ;
2018-12-20 10:45:59 +09:00
dev_dbg ( dev , " link_of (%pOF) \n " , cpu_ep ) ;
li - > link + + ;
2018-12-14 11:32:25 +09:00
2018-11-30 02:07:48 +00:00
cpu_dai =
2018-12-20 10:45:59 +09:00
dai_props - > cpu_dai = & priv - > dais [ li - > dais + + ] ;
2018-11-30 02:07:48 +00:00
codec_dai =
2018-12-20 10:45:59 +09:00
dai_props - > codec_dai = & priv - > dais [ li - > dais + + ] ;
2018-11-30 02:07:48 +00:00
2018-12-14 11:32:30 +09:00
/* Factor to mclk, used in hw_params() */
2019-03-18 13:50:31 +09:00
graph_parse_mclk_fs ( top , cpu_ep , dai_props ) ;
graph_parse_mclk_fs ( top , codec_ep , dai_props ) ;
2018-12-14 11:32:30 +09:00
2019-03-20 13:56:50 +09:00
ret = asoc_simple_parse_daifmt ( dev , cpu_ep , codec_ep ,
NULL , & dai_link - > dai_fmt ) ;
2017-04-20 01:36:08 +00:00
if ( ret < 0 )
2018-12-14 11:32:25 +09:00
return ret ;
2017-04-20 01:36:08 +00:00
2019-03-20 13:56:50 +09:00
ret = asoc_simple_parse_cpu ( cpu_ep , dai_link , & single_cpu ) ;
2017-04-20 01:36:08 +00:00
if ( ret < 0 )
2018-12-14 11:32:25 +09:00
return ret ;
2017-04-20 01:36:08 +00:00
2019-03-20 13:56:50 +09:00
ret = asoc_simple_parse_codec ( codec_ep , dai_link ) ;
2017-04-20 01:36:08 +00:00
if ( ret < 0 )
2018-12-14 11:32:25 +09:00
return ret ;
2017-04-20 01:36:08 +00:00
2019-03-20 13:56:50 +09:00
ret = asoc_simple_parse_tdm ( cpu_ep , cpu_dai ) ;
2017-04-20 01:36:08 +00:00
if ( ret < 0 )
2018-12-14 11:32:25 +09:00
return ret ;
2017-04-20 01:36:08 +00:00
2019-03-20 13:56:50 +09:00
ret = asoc_simple_parse_tdm ( codec_ep , codec_dai ) ;
2017-04-20 01:36:08 +00:00
if ( ret < 0 )
2018-12-14 11:32:25 +09:00
return ret ;
2017-04-20 01:36:08 +00:00
2019-03-20 13:56:50 +09:00
ret = asoc_simple_parse_clk_cpu ( dev , cpu_ep , dai_link , cpu_dai ) ;
2017-04-20 01:36:08 +00:00
if ( ret < 0 )
2018-12-14 11:32:25 +09:00
return ret ;
2017-04-20 01:36:08 +00:00
2019-03-20 13:56:50 +09:00
ret = asoc_simple_parse_clk_codec ( dev , codec_ep , dai_link , codec_dai ) ;
2017-04-20 01:36:08 +00:00
if ( ret < 0 )
2018-12-14 11:32:25 +09:00
return ret ;
2017-04-20 01:36:08 +00:00
2019-03-20 13:56:50 +09:00
ret = asoc_simple_set_dailink_name ( dev , dai_link ,
" %s-%s " ,
dai_link - > cpu_dai_name ,
dai_link - > codecs - > dai_name ) ;
2017-04-20 01:36:08 +00:00
if ( ret < 0 )
2018-12-14 11:32:25 +09:00
return ret ;
2017-04-20 01:36:08 +00:00
2018-12-20 10:46:33 +09:00
dai_link - > ops = & graph_ops ;
2019-03-20 13:55:52 +09:00
dai_link - > init = asoc_simple_dai_init ;
2017-04-20 01:36:08 +00:00
2019-03-20 13:56:50 +09:00
asoc_simple_canonicalize_cpu ( dai_link , single_cpu ) ;
asoc_simple_canonicalize_platform ( dai_link ) ;
2017-04-20 01:36:08 +00:00
2018-12-14 11:32:25 +09:00
return 0 ;
2017-04-20 01:36:08 +00:00
}
ASoC: simple_card_utils: share common priv for simple-card/audio-graph
Historically, simple-card/simple-scu-card/audio-graph/audio-graph-scu
are similar but different generic sound card.
simple-scu-card which was for DPCM was merged into simple-card, and
audio-graph-scu which was for DPCM was merged into audio-graph.
simple-card is for non OF graph sound card, and
audio-graph is for OF graph sound card.
And, small detail difference (= function parameter, naming, etc)
between simple-card/audio-graph has been unified.
So today, the difference between simple-card/audio-graph are
just using OF graph style, or not.
In other words, there should no difference other than OF graph sytle.
simple-card/audio-graph are using own priv today , but we can merge it.
This patch merge it at simple_card_utils.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-03-20 13:54:59 +09:00
static int graph_for_each_link ( struct asoc_simple_priv * priv ,
2018-12-20 10:46:20 +09:00
struct link_info * li ,
ASoC: simple_card_utils: share common priv for simple-card/audio-graph
Historically, simple-card/simple-scu-card/audio-graph/audio-graph-scu
are similar but different generic sound card.
simple-scu-card which was for DPCM was merged into simple-card, and
audio-graph-scu which was for DPCM was merged into audio-graph.
simple-card is for non OF graph sound card, and
audio-graph is for OF graph sound card.
And, small detail difference (= function parameter, naming, etc)
between simple-card/audio-graph has been unified.
So today, the difference between simple-card/audio-graph are
just using OF graph style, or not.
In other words, there should no difference other than OF graph sytle.
simple-card/audio-graph are using own priv today , but we can merge it.
This patch merge it at simple_card_utils.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-03-20 13:54:59 +09:00
int ( * func_noml ) ( struct asoc_simple_priv * priv ,
2018-12-20 10:46:20 +09:00
struct device_node * cpu_ep ,
struct device_node * codec_ep ,
struct link_info * li ) ,
ASoC: simple_card_utils: share common priv for simple-card/audio-graph
Historically, simple-card/simple-scu-card/audio-graph/audio-graph-scu
are similar but different generic sound card.
simple-scu-card which was for DPCM was merged into simple-card, and
audio-graph-scu which was for DPCM was merged into audio-graph.
simple-card is for non OF graph sound card, and
audio-graph is for OF graph sound card.
And, small detail difference (= function parameter, naming, etc)
between simple-card/audio-graph has been unified.
So today, the difference between simple-card/audio-graph are
just using OF graph style, or not.
In other words, there should no difference other than OF graph sytle.
simple-card/audio-graph are using own priv today , but we can merge it.
This patch merge it at simple_card_utils.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-03-20 13:54:59 +09:00
int ( * func_dpcm ) ( struct asoc_simple_priv * priv ,
2018-12-20 10:46:20 +09:00
struct device_node * cpu_ep ,
struct device_node * codec_ep ,
struct link_info * li , int dup_codec ) )
2017-04-20 01:36:08 +00:00
{
struct of_phandle_iterator it ;
ASoC: simple_card_utils: share common priv for simple-card/audio-graph
Historically, simple-card/simple-scu-card/audio-graph/audio-graph-scu
are similar but different generic sound card.
simple-scu-card which was for DPCM was merged into simple-card, and
audio-graph-scu which was for DPCM was merged into audio-graph.
simple-card is for non OF graph sound card, and
audio-graph is for OF graph sound card.
And, small detail difference (= function parameter, naming, etc)
between simple-card/audio-graph has been unified.
So today, the difference between simple-card/audio-graph are
just using OF graph style, or not.
In other words, there should no difference other than OF graph sytle.
simple-card/audio-graph are using own priv today , but we can merge it.
This patch merge it at simple_card_utils.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-03-20 13:54:59 +09:00
struct device * dev = simple_priv_to_dev ( priv ) ;
2018-12-20 10:46:20 +09:00
struct device_node * node = dev - > of_node ;
2018-12-14 11:32:25 +09:00
struct device_node * cpu_port ;
2018-12-20 10:46:20 +09:00
struct device_node * cpu_ep ;
struct device_node * codec_ep ;
struct device_node * codec_port ;
struct device_node * codec_port_old = NULL ;
2019-03-20 13:56:50 +09:00
struct asoc_simple_data adata ;
2019-04-04 09:52:15 +09:00
uintptr_t dpcm_selectable = ( uintptr_t ) of_device_get_match_data ( dev ) ;
2018-11-30 02:07:48 +00:00
int rc , ret ;
2017-04-20 01:36:08 +00:00
2018-12-20 10:46:20 +09:00
/* loop for all listed CPU port */
of_for_each_phandle ( & it , rc , node , " dais " , NULL , 0 ) {
cpu_port = it . node ;
cpu_ep = NULL ;
/* loop for all CPU endpoint */
while ( 1 ) {
cpu_ep = of_get_next_child ( cpu_port , cpu_ep ) ;
if ( ! cpu_ep )
break ;
/* get codec */
codec_ep = of_graph_get_remote_endpoint ( cpu_ep ) ;
codec_port = of_get_parent ( codec_ep ) ;
of_node_put ( codec_ep ) ;
of_node_put ( codec_port ) ;
/* get convert-xxx property */
memset ( & adata , 0 , sizeof ( adata ) ) ;
2019-03-18 13:50:25 +09:00
graph_parse_convert ( dev , codec_ep , & adata ) ;
graph_parse_convert ( dev , cpu_ep , & adata ) ;
2018-12-20 10:46:20 +09:00
/*
* It is DPCM
* if Codec port has many endpoints ,
* or has convert - xxx property
*/
2019-04-04 09:52:15 +09:00
if ( dpcm_selectable & &
( ( of_get_child_count ( codec_port ) > 1 ) | |
adata . convert_rate | | adata . convert_channels ) )
2018-12-20 10:46:20 +09:00
ret = func_dpcm ( priv , cpu_ep , codec_ep , li ,
( codec_port_old = = codec_port ) ) ;
/* else normal sound */
else
ret = func_noml ( priv , cpu_ep , codec_ep , li ) ;
if ( ret < 0 )
return ret ;
codec_port_old = codec_port ;
}
}
return 0 ;
}
ASoC: simple_card_utils: share common priv for simple-card/audio-graph
Historically, simple-card/simple-scu-card/audio-graph/audio-graph-scu
are similar but different generic sound card.
simple-scu-card which was for DPCM was merged into simple-card, and
audio-graph-scu which was for DPCM was merged into audio-graph.
simple-card is for non OF graph sound card, and
audio-graph is for OF graph sound card.
And, small detail difference (= function parameter, naming, etc)
between simple-card/audio-graph has been unified.
So today, the difference between simple-card/audio-graph are
just using OF graph style, or not.
In other words, there should no difference other than OF graph sytle.
simple-card/audio-graph are using own priv today , but we can merge it.
This patch merge it at simple_card_utils.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-03-20 13:54:59 +09:00
static int graph_parse_of ( struct asoc_simple_priv * priv )
2018-12-20 10:46:20 +09:00
{
ASoC: simple_card_utils: share common priv for simple-card/audio-graph
Historically, simple-card/simple-scu-card/audio-graph/audio-graph-scu
are similar but different generic sound card.
simple-scu-card which was for DPCM was merged into simple-card, and
audio-graph-scu which was for DPCM was merged into audio-graph.
simple-card is for non OF graph sound card, and
audio-graph is for OF graph sound card.
And, small detail difference (= function parameter, naming, etc)
between simple-card/audio-graph has been unified.
So today, the difference between simple-card/audio-graph are
just using OF graph style, or not.
In other words, there should no difference other than OF graph sytle.
simple-card/audio-graph are using own priv today , but we can merge it.
This patch merge it at simple_card_utils.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-03-20 13:54:59 +09:00
struct snd_soc_card * card = simple_priv_to_card ( priv ) ;
2018-12-20 10:46:20 +09:00
struct link_info li ;
int ret ;
2019-03-20 13:56:50 +09:00
ret = asoc_simple_parse_widgets ( card , NULL ) ;
2017-06-29 21:26:38 +08:00
if ( ret < 0 )
return ret ;
2019-03-20 13:56:50 +09:00
ret = asoc_simple_parse_routing ( card , NULL ) ;
2017-06-29 21:26:38 +08:00
if ( ret < 0 )
return ret ;
2018-12-20 10:45:59 +09:00
memset ( & li , 0 , sizeof ( li ) ) ;
for ( li . cpu = 1 ; li . cpu > = 0 ; li . cpu - - ) {
2018-12-14 11:32:25 +09:00
/*
* Detect all CPU first , and Detect all Codec 2 nd .
*
* In Normal sound case , all DAIs are detected
* as " CPU-Codec " .
*
* In DPCM sound case ,
* all CPUs are detected as " CPU-dummy " , and
* all Codecs are detected as " dummy-Codec " .
* To avoid random sub - device numbering ,
* detect " dummy-Codec " in last ;
*/
2018-12-20 10:46:33 +09:00
ret = graph_for_each_link ( priv , & li ,
graph_dai_link_of ,
graph_dai_link_of_dpcm ) ;
2018-12-20 10:46:20 +09:00
if ( ret < 0 )
return ret ;
2017-04-20 01:36:08 +00:00
}
2019-03-20 13:56:50 +09:00
return asoc_simple_parse_card_name ( card , NULL ) ;
2017-04-20 01:36:08 +00:00
}
ASoC: simple_card_utils: share common priv for simple-card/audio-graph
Historically, simple-card/simple-scu-card/audio-graph/audio-graph-scu
are similar but different generic sound card.
simple-scu-card which was for DPCM was merged into simple-card, and
audio-graph-scu which was for DPCM was merged into audio-graph.
simple-card is for non OF graph sound card, and
audio-graph is for OF graph sound card.
And, small detail difference (= function parameter, naming, etc)
between simple-card/audio-graph has been unified.
So today, the difference between simple-card/audio-graph are
just using OF graph style, or not.
In other words, there should no difference other than OF graph sytle.
simple-card/audio-graph are using own priv today , but we can merge it.
This patch merge it at simple_card_utils.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-03-20 13:54:59 +09:00
static int graph_count_noml ( struct asoc_simple_priv * priv ,
2018-12-20 10:46:33 +09:00
struct device_node * cpu_ep ,
struct device_node * codec_ep ,
struct link_info * li )
2017-04-20 01:36:08 +00:00
{
ASoC: simple_card_utils: share common priv for simple-card/audio-graph
Historically, simple-card/simple-scu-card/audio-graph/audio-graph-scu
are similar but different generic sound card.
simple-scu-card which was for DPCM was merged into simple-card, and
audio-graph-scu which was for DPCM was merged into audio-graph.
simple-card is for non OF graph sound card, and
audio-graph is for OF graph sound card.
And, small detail difference (= function parameter, naming, etc)
between simple-card/audio-graph has been unified.
So today, the difference between simple-card/audio-graph are
just using OF graph style, or not.
In other words, there should no difference other than OF graph sytle.
simple-card/audio-graph are using own priv today , but we can merge it.
This patch merge it at simple_card_utils.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-03-20 13:54:59 +09:00
struct device * dev = simple_priv_to_dev ( priv ) ;
2018-12-20 10:46:05 +09:00
li - > link + = 1 ; /* 1xCPU-Codec */
li - > dais + = 2 ; /* 1xCPU + 1xCodec */
dev_dbg ( dev , " Count As Normal \n " ) ;
return 0 ;
}
ASoC: simple_card_utils: share common priv for simple-card/audio-graph
Historically, simple-card/simple-scu-card/audio-graph/audio-graph-scu
are similar but different generic sound card.
simple-scu-card which was for DPCM was merged into simple-card, and
audio-graph-scu which was for DPCM was merged into audio-graph.
simple-card is for non OF graph sound card, and
audio-graph is for OF graph sound card.
And, small detail difference (= function parameter, naming, etc)
between simple-card/audio-graph has been unified.
So today, the difference between simple-card/audio-graph are
just using OF graph style, or not.
In other words, there should no difference other than OF graph sytle.
simple-card/audio-graph are using own priv today , but we can merge it.
This patch merge it at simple_card_utils.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-03-20 13:54:59 +09:00
static int graph_count_dpcm ( struct asoc_simple_priv * priv ,
2018-12-20 10:46:33 +09:00
struct device_node * cpu_ep ,
struct device_node * codec_ep ,
struct link_info * li ,
int dup_codec )
2018-12-20 10:46:05 +09:00
{
ASoC: simple_card_utils: share common priv for simple-card/audio-graph
Historically, simple-card/simple-scu-card/audio-graph/audio-graph-scu
are similar but different generic sound card.
simple-scu-card which was for DPCM was merged into simple-card, and
audio-graph-scu which was for DPCM was merged into audio-graph.
simple-card is for non OF graph sound card, and
audio-graph is for OF graph sound card.
And, small detail difference (= function parameter, naming, etc)
between simple-card/audio-graph has been unified.
So today, the difference between simple-card/audio-graph are
just using OF graph style, or not.
In other words, there should no difference other than OF graph sytle.
simple-card/audio-graph are using own priv today , but we can merge it.
This patch merge it at simple_card_utils.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-03-20 13:54:59 +09:00
struct device * dev = simple_priv_to_dev ( priv ) ;
2018-12-20 10:46:05 +09:00
li - > link + + ; /* 1xCPU-dummy */
li - > dais + + ; /* 1xCPU */
if ( ! dup_codec ) {
li - > link + + ; /* 1xdummy-Codec */
li - > conf + + ; /* 1xdummy-Codec */
li - > dais + + ; /* 1xCodec */
}
dev_dbg ( dev , " Count As DPCM \n " ) ;
return 0 ;
}
ASoC: simple_card_utils: share common priv for simple-card/audio-graph
Historically, simple-card/simple-scu-card/audio-graph/audio-graph-scu
are similar but different generic sound card.
simple-scu-card which was for DPCM was merged into simple-card, and
audio-graph-scu which was for DPCM was merged into audio-graph.
simple-card is for non OF graph sound card, and
audio-graph is for OF graph sound card.
And, small detail difference (= function parameter, naming, etc)
between simple-card/audio-graph has been unified.
So today, the difference between simple-card/audio-graph are
just using OF graph style, or not.
In other words, there should no difference other than OF graph sytle.
simple-card/audio-graph are using own priv today , but we can merge it.
This patch merge it at simple_card_utils.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-03-20 13:54:59 +09:00
static void graph_get_dais_count ( struct asoc_simple_priv * priv ,
2018-12-20 10:46:33 +09:00
struct link_info * li )
2018-12-20 10:46:05 +09:00
{
ASoC: simple_card_utils: share common priv for simple-card/audio-graph
Historically, simple-card/simple-scu-card/audio-graph/audio-graph-scu
are similar but different generic sound card.
simple-scu-card which was for DPCM was merged into simple-card, and
audio-graph-scu which was for DPCM was merged into audio-graph.
simple-card is for non OF graph sound card, and
audio-graph is for OF graph sound card.
And, small detail difference (= function parameter, naming, etc)
between simple-card/audio-graph has been unified.
So today, the difference between simple-card/audio-graph are
just using OF graph style, or not.
In other words, there should no difference other than OF graph sytle.
simple-card/audio-graph are using own priv today , but we can merge it.
This patch merge it at simple_card_utils.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-03-20 13:54:59 +09:00
struct device * dev = simple_priv_to_dev ( priv ) ;
2017-04-20 01:36:08 +00:00
2018-12-14 11:32:25 +09:00
/*
* link_num : number of links .
* CPU - Codec / CPU - dummy / dummy - Codec
* dais_num : number of DAIs
* ccnf_num : number of codec_conf
* same number for " dummy-Codec "
*
* ex1 )
* CPU0 - - - Codec0 link : 5
* CPU1 - - - Codec1 dais : 7
* CPU2 - / ccnf : 1
* CPU3 - - - Codec2
*
* = > 5 links = 2 xCPU - Codec + 2 xCPU - dummy + 1 xdummy - Codec
* = > 7 DAIs = 4 xCPU + 3 xCodec
* = > 1 ccnf = 1 xdummy - Codec
*
* ex2 )
* CPU0 - - - Codec0 link : 5
* CPU1 - - - Codec1 dais : 6
* CPU2 - / ccnf : 1
* CPU3 - /
*
* = > 5 links = 1 xCPU - Codec + 3 xCPU - dummy + 1 xdummy - Codec
* = > 6 DAIs = 4 xCPU + 2 xCodec
* = > 1 ccnf = 1 xdummy - Codec
*
* ex3 )
* CPU0 - - - Codec0 link : 6
* CPU1 - / dais : 6
* CPU2 - - - Codec1 ccnf : 2
* CPU3 - /
*
* = > 6 links = 0xC PU - Codec + 4 xCPU - dummy + 2 xdummy - Codec
* = > 6 DAIs = 4 xCPU + 2 xCodec
* = > 2 ccnf = 2 xdummy - Codec
2018-12-20 10:45:54 +09:00
*
* ex4 )
* CPU0 - - - Codec0 ( convert - rate ) link : 3
* CPU1 - - - Codec1 dais : 4
* ccnf : 1
*
* = > 3 links = 1 xCPU - Codec + 1 xCPU - dummy + 1 xdummy - Codec
* = > 4 DAIs = 2 xCPU + 2 xCodec
* = > 1 ccnf = 1 xdummy - Codec
2018-12-14 11:32:25 +09:00
*/
2018-12-20 10:46:33 +09:00
graph_for_each_link ( priv , li ,
graph_count_noml ,
graph_count_dpcm ) ;
2018-12-20 10:46:20 +09:00
dev_dbg ( dev , " link %d, dais %d, ccnf %d \n " ,
li - > link , li - > dais , li - > conf ) ;
2017-04-20 01:36:08 +00:00
}
2018-12-20 10:46:33 +09:00
static int graph_card_probe ( struct snd_soc_card * card )
2018-06-11 17:32:14 +09:00
{
ASoC: simple_card_utils: share common priv for simple-card/audio-graph
Historically, simple-card/simple-scu-card/audio-graph/audio-graph-scu
are similar but different generic sound card.
simple-scu-card which was for DPCM was merged into simple-card, and
audio-graph-scu which was for DPCM was merged into audio-graph.
simple-card is for non OF graph sound card, and
audio-graph is for OF graph sound card.
And, small detail difference (= function parameter, naming, etc)
between simple-card/audio-graph has been unified.
So today, the difference between simple-card/audio-graph are
just using OF graph style, or not.
In other words, there should no difference other than OF graph sytle.
simple-card/audio-graph are using own priv today , but we can merge it.
This patch merge it at simple_card_utils.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-03-20 13:54:59 +09:00
struct asoc_simple_priv * priv = snd_soc_card_get_drvdata ( card ) ;
2018-06-11 17:32:14 +09:00
int ret ;
2019-03-20 13:56:50 +09:00
ret = asoc_simple_init_hp ( card , & priv - > hp_jack , NULL ) ;
2018-06-11 17:32:14 +09:00
if ( ret < 0 )
return ret ;
2019-03-20 13:56:50 +09:00
ret = asoc_simple_init_mic ( card , & priv - > mic_jack , NULL ) ;
2018-06-11 17:32:14 +09:00
if ( ret < 0 )
return ret ;
return 0 ;
}
2018-12-20 10:46:33 +09:00
static int graph_probe ( struct platform_device * pdev )
2017-04-20 01:36:08 +00:00
{
ASoC: simple_card_utils: share common priv for simple-card/audio-graph
Historically, simple-card/simple-scu-card/audio-graph/audio-graph-scu
are similar but different generic sound card.
simple-scu-card which was for DPCM was merged into simple-card, and
audio-graph-scu which was for DPCM was merged into audio-graph.
simple-card is for non OF graph sound card, and
audio-graph is for OF graph sound card.
And, small detail difference (= function parameter, naming, etc)
between simple-card/audio-graph has been unified.
So today, the difference between simple-card/audio-graph are
just using OF graph style, or not.
In other words, there should no difference other than OF graph sytle.
simple-card/audio-graph are using own priv today , but we can merge it.
This patch merge it at simple_card_utils.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-03-20 13:54:59 +09:00
struct asoc_simple_priv * priv ;
2017-04-20 01:36:08 +00:00
struct device * dev = & pdev - > dev ;
struct snd_soc_card * card ;
2018-12-20 10:45:59 +09:00
struct link_info li ;
2019-03-20 13:56:26 +09:00
int ret ;
2017-04-20 01:36:08 +00:00
/* Allocate the private data and the DAI link array */
priv = devm_kzalloc ( dev , sizeof ( * priv ) , GFP_KERNEL ) ;
if ( ! priv )
return - ENOMEM ;
ASoC: simple_card_utils: share common priv for simple-card/audio-graph
Historically, simple-card/simple-scu-card/audio-graph/audio-graph-scu
are similar but different generic sound card.
simple-scu-card which was for DPCM was merged into simple-card, and
audio-graph-scu which was for DPCM was merged into audio-graph.
simple-card is for non OF graph sound card, and
audio-graph is for OF graph sound card.
And, small detail difference (= function parameter, naming, etc)
between simple-card/audio-graph has been unified.
So today, the difference between simple-card/audio-graph are
just using OF graph style, or not.
In other words, there should no difference other than OF graph sytle.
simple-card/audio-graph are using own priv today , but we can merge it.
This patch merge it at simple_card_utils.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-03-20 13:54:59 +09:00
card = simple_priv_to_card ( priv ) ;
2018-12-20 10:46:05 +09:00
card - > owner = THIS_MODULE ;
card - > dev = dev ;
2018-12-20 10:46:33 +09:00
card - > dapm_widgets = graph_dapm_widgets ;
card - > num_dapm_widgets = ARRAY_SIZE ( graph_dapm_widgets ) ;
card - > probe = graph_card_probe ;
2018-12-20 10:46:05 +09:00
2018-12-20 10:45:59 +09:00
memset ( & li , 0 , sizeof ( li ) ) ;
2018-12-20 10:46:33 +09:00
graph_get_dais_count ( priv , & li ) ;
2018-12-20 10:45:59 +09:00
if ( ! li . link | | ! li . dais )
2017-04-20 01:36:08 +00:00
return - EINVAL ;
2019-03-20 13:56:50 +09:00
ret = asoc_simple_init_priv ( priv , & li ) ;
2019-03-20 13:56:26 +09:00
if ( ret < 0 )
return ret ;
2018-08-31 03:09:05 +00:00
2017-06-29 21:26:38 +08:00
priv - > pa_gpio = devm_gpiod_get_optional ( dev , " pa " , GPIOD_OUT_LOW ) ;
if ( IS_ERR ( priv - > pa_gpio ) ) {
ret = PTR_ERR ( priv - > pa_gpio ) ;
dev_err ( dev , " failed to get amplifier gpio: %d \n " , ret ) ;
return ret ;
}
2018-12-20 10:46:33 +09:00
ret = graph_parse_of ( priv ) ;
2017-04-20 01:36:08 +00:00
if ( ret < 0 ) {
if ( ret ! = - EPROBE_DEFER )
dev_err ( dev , " parse error %d \n " , ret ) ;
goto err ;
}
snd_soc_card_set_drvdata ( card , priv ) ;
2019-03-20 13:54:42 +09:00
asoc_simple_debug_info ( priv ) ;
2017-04-20 01:36:08 +00:00
ret = devm_snd_soc_register_card ( dev , card ) ;
2017-05-19 00:58:00 +00:00
if ( ret < 0 )
goto err ;
return 0 ;
2017-04-20 01:36:08 +00:00
err :
2019-03-20 13:56:50 +09:00
asoc_simple_clean_reference ( card ) ;
2017-04-20 01:36:08 +00:00
return ret ;
}
2018-12-20 10:46:33 +09:00
static int graph_remove ( struct platform_device * pdev )
2017-04-20 01:36:08 +00:00
{
struct snd_soc_card * card = platform_get_drvdata ( pdev ) ;
2019-03-20 13:56:50 +09:00
return asoc_simple_clean_reference ( card ) ;
2017-04-20 01:36:08 +00:00
}
2018-12-20 10:46:33 +09:00
static const struct of_device_id graph_of_match [ ] = {
2017-04-20 01:36:08 +00:00
{ . compatible = " audio-graph-card " , } ,
2019-04-04 09:52:15 +09:00
{ . compatible = " audio-graph-scu-card " ,
. data = ( void * ) DPCM_SELECTABLE } ,
2017-04-20 01:36:08 +00:00
{ } ,
} ;
2018-12-20 10:46:33 +09:00
MODULE_DEVICE_TABLE ( of , graph_of_match ) ;
2017-04-20 01:36:08 +00:00
2018-12-20 10:46:33 +09:00
static struct platform_driver graph_card = {
2017-04-20 01:36:08 +00:00
. driver = {
. name = " asoc-audio-graph-card " ,
2017-08-22 04:56:44 +00:00
. pm = & snd_soc_pm_ops ,
2018-12-20 10:46:33 +09:00
. of_match_table = graph_of_match ,
2017-04-20 01:36:08 +00:00
} ,
2018-12-20 10:46:33 +09:00
. probe = graph_probe ,
. remove = graph_remove ,
2017-04-20 01:36:08 +00:00
} ;
2018-12-20 10:46:33 +09:00
module_platform_driver ( graph_card ) ;
2017-04-20 01:36:08 +00:00
MODULE_ALIAS ( " platform:asoc-audio-graph-card " ) ;
MODULE_LICENSE ( " GPL v2 " ) ;
MODULE_DESCRIPTION ( " ASoC Audio Graph Sound Card " ) ;
MODULE_AUTHOR ( " Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> " ) ;