2018-07-02 09:30:44 +03:00
/* SPDX-License-Identifier: GPL-2.0
*
2016-12-02 08:27:30 +03:00
* simple_card_utils . h
2016-05-31 12:00:14 +03:00
*
* Copyright ( c ) 2016 Kuninori Morimoto < kuninori . morimoto . gx @ renesas . com >
*/
2018-07-02 09:30:44 +03:00
2016-12-02 08:27:30 +03:00
# ifndef __SIMPLE_CARD_UTILS_H
# define __SIMPLE_CARD_UTILS_H
2016-05-31 12:00:14 +03:00
2019-10-09 18:36:14 +03:00
# include <linux/clk.h>
2016-05-31 12:00:14 +03:00
# include <sound/soc.h>
2019-03-20 07:56:50 +03:00
# define asoc_simple_init_hp(card, sjack, prefix) \
2020-07-15 17:09:37 +03:00
asoc_simple_init_jack ( card , sjack , 1 , prefix , NULL )
2019-03-20 07:56:50 +03:00
# define asoc_simple_init_mic(card, sjack, prefix) \
2020-07-15 17:09:37 +03:00
asoc_simple_init_jack ( card , sjack , 0 , prefix , NULL )
2018-06-11 11:32:12 +03:00
2022-02-28 20:27:54 +03:00
struct asoc_simple_tdm_width_map {
u8 sample_bits ;
u8 slot_count ;
u16 slot_width ;
} ;
2016-06-30 09:02:46 +03:00
struct asoc_simple_dai {
const char * name ;
unsigned int sysclk ;
2017-08-17 14:42:36 +03:00
int clk_direction ;
2016-06-30 09:02:46 +03:00
int slots ;
int slot_width ;
unsigned int tx_slot_mask ;
unsigned int rx_slot_mask ;
struct clk * clk ;
2022-01-20 22:58:32 +03:00
bool clk_fixed ;
2022-02-28 20:27:54 +03:00
struct asoc_simple_tdm_width_map * tdm_width_map ;
int n_tdm_widths ;
2016-06-30 09:02:46 +03:00
} ;
2019-03-20 07:56:50 +03:00
struct asoc_simple_data {
2017-06-15 03:24:09 +03:00
u32 convert_rate ;
u32 convert_channels ;
} ;
2018-06-11 11:32:12 +03:00
struct asoc_simple_jack {
struct snd_soc_jack jack ;
struct snd_soc_jack_pin pin ;
struct snd_soc_jack_gpio gpio ;
} ;
2021-04-01 07:15:23 +03:00
struct prop_nums {
int cpus ;
int codecs ;
int platforms ;
2021-10-12 07:54:13 +03:00
int c2c ;
2021-04-01 07:15:23 +03: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 07:54:59 +03:00
struct asoc_simple_priv {
struct snd_soc_card snd_card ;
struct simple_dai_props {
struct asoc_simple_dai * cpu_dai ;
struct asoc_simple_dai * codec_dai ;
2021-03-26 06:26:06 +03:00
struct snd_soc_dai_link_component * cpus ;
struct snd_soc_dai_link_component * codecs ;
struct snd_soc_dai_link_component * platforms ;
2019-03-20 07:56:50 +03:00
struct asoc_simple_data adata ;
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 07:54:59 +03:00
struct snd_soc_codec_conf * codec_conf ;
2021-10-12 07:54:13 +03:00
struct snd_soc_pcm_stream * c2c_conf ;
2021-04-01 07:15:23 +03:00
struct prop_nums num ;
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 07:54:59 +03:00
unsigned int mclk_fs ;
} * dai_props ;
struct asoc_simple_jack hp_jack ;
struct asoc_simple_jack mic_jack ;
struct snd_soc_dai_link * dai_link ;
struct asoc_simple_dai * dais ;
2021-03-26 06:26:06 +03:00
struct snd_soc_dai_link_component * dlcs ;
2021-04-01 07:15:33 +03:00
struct snd_soc_dai_link_component dummy ;
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 07:54:59 +03:00
struct snd_soc_codec_conf * codec_conf ;
2021-10-12 07:54:13 +03:00
struct snd_soc_pcm_stream * c2c_conf ;
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 07:54:59 +03:00
struct gpio_desc * pa_gpio ;
2020-11-02 18:10:13 +03:00
const struct snd_soc_ops * ops ;
unsigned int dpcm_selectable : 1 ;
unsigned int force_dpcm : 1 ;
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 07:54:59 +03:00
} ;
# define simple_priv_to_card(priv) (&(priv)->snd_card)
# define simple_priv_to_props(priv, i) ((priv)->dai_props + (i))
# define simple_priv_to_dev(priv) (simple_priv_to_card(priv)->dev)
# define simple_priv_to_link(priv, i) (simple_priv_to_card(priv)->dai_link + (i))
2021-04-12 02:52:32 +03:00
# define simple_props_to_dlc_cpu(props, i) ((props)->cpus + i)
# define simple_props_to_dlc_codec(props, i) ((props)->codecs + i)
# define simple_props_to_dlc_platform(props, i) ((props)->platforms + i)
# define simple_props_to_dai_cpu(props, i) ((props)->cpu_dai + i)
# define simple_props_to_dai_codec(props, i) ((props)->codec_dai + i)
# define simple_props_to_codec_conf(props, i) ((props)->codec_conf + i)
2021-04-12 02:52:09 +03:00
# define for_each_prop_dlc_cpus(props, i, cpu) \
for ( ( i ) = 0 ; \
2021-04-12 02:52:32 +03:00
( ( i ) < ( props ) - > num . cpus ) & & \
( ( cpu ) = simple_props_to_dlc_cpu ( props , i ) ) ; \
2021-04-12 02:52:09 +03:00
( i ) + + )
2021-04-12 02:52:32 +03:00
# define for_each_prop_dlc_codecs(props, i, codec) \
2021-04-12 02:52:09 +03:00
for ( ( i ) = 0 ; \
2021-04-12 02:52:32 +03:00
( ( i ) < ( props ) - > num . codecs ) & & \
( ( codec ) = simple_props_to_dlc_codec ( props , i ) ) ; \
2021-04-12 02:52:09 +03:00
( i ) + + )
# define for_each_prop_dlc_platforms(props, i, platform) \
for ( ( i ) = 0 ; \
2021-04-12 02:52:32 +03:00
( ( i ) < ( props ) - > num . platforms ) & & \
( ( platform ) = simple_props_to_dlc_platform ( props , i ) ) ; \
2021-04-12 02:52:09 +03:00
( i ) + + )
# define for_each_prop_codec_conf(props, i, conf) \
for ( ( i ) = 0 ; \
( ( i ) < ( props ) - > num . codecs ) & & \
( props ) - > codec_conf & & \
2021-04-12 02:52:32 +03:00
( ( conf ) = simple_props_to_codec_conf ( props , i ) ) ; \
2021-04-12 02:52:09 +03:00
( i ) + + )
# define for_each_prop_dai_cpu(props, i, cpu) \
for ( ( i ) = 0 ; \
2021-04-12 02:52:32 +03:00
( ( i ) < ( props ) - > num . cpus ) & & \
( ( cpu ) = simple_props_to_dai_cpu ( props , i ) ) ; \
2021-04-12 02:52:09 +03:00
( i ) + + )
# define for_each_prop_dai_codec(props, i, codec) \
for ( ( i ) = 0 ; \
2021-04-12 02:52:32 +03:00
( ( i ) < ( props ) - > num . codecs ) & & \
( ( codec ) = simple_props_to_dai_codec ( props , i ) ) ; \
2021-04-12 02:52:09 +03:00
( i ) + + )
2021-09-13 19:42:10 +03:00
# define SNDRV_MAX_LINKS 512
2021-04-16 10:11:47 +03:00
2019-03-20 07:56:26 +03:00
struct link_info {
int link ; /* number of link */
int cpu ; /* turn for CPU / Codec */
2021-04-16 10:11:47 +03:00
struct prop_nums num [ SNDRV_MAX_LINKS ] ;
2019-03-20 07:56:26 +03:00
} ;
2019-03-20 07:56:50 +03:00
int asoc_simple_parse_daifmt ( struct device * dev ,
struct device_node * node ,
struct device_node * codec ,
char * prefix ,
unsigned int * retfmt ) ;
2022-02-28 20:27:54 +03:00
int asoc_simple_parse_tdm_width_map ( struct device * dev , struct device_node * np ,
struct asoc_simple_dai * dai ) ;
2016-08-23 11:51:22 +03:00
__printf ( 3 , 4 )
2019-03-20 07:56:50 +03:00
int asoc_simple_set_dailink_name ( struct device * dev ,
struct snd_soc_dai_link * dai_link ,
const char * fmt , . . . ) ;
int asoc_simple_parse_card_name ( struct snd_soc_card * card ,
char * prefix ) ;
int asoc_simple_parse_clk ( struct device * dev ,
struct device_node * node ,
struct asoc_simple_dai * simple_dai ,
struct snd_soc_dai_link_component * dlc ) ;
2019-03-20 07:55:14 +03:00
int asoc_simple_startup ( struct snd_pcm_substream * substream ) ;
2019-03-20 07:55:27 +03:00
void asoc_simple_shutdown ( struct snd_pcm_substream * substream ) ;
2019-03-20 07:55:39 +03:00
int asoc_simple_hw_params ( struct snd_pcm_substream * substream ,
struct snd_pcm_hw_params * params ) ;
2019-03-20 07:55:52 +03:00
int asoc_simple_dai_init ( struct snd_soc_pcm_runtime * rtd ) ;
2019-03-20 07:56:06 +03:00
int asoc_simple_be_hw_params_fixup ( struct snd_soc_pcm_runtime * rtd ,
struct snd_pcm_hw_params * params ) ;
2016-08-08 08:59:56 +03:00
2019-03-20 07:56:50 +03:00
# define asoc_simple_parse_tdm(np, dai) \
2017-06-14 03:34:35 +03:00
snd_soc_of_parse_tdm_slot ( np , & ( dai ) - > tx_slot_mask , \
& ( dai ) - > rx_slot_mask , \
& ( dai ) - > slots , \
& ( dai ) - > slot_width ) ;
2021-04-12 02:52:45 +03:00
void asoc_simple_canonicalize_platform ( struct snd_soc_dai_link_component * platforms ,
struct snd_soc_dai_link_component * cpus ) ;
void asoc_simple_canonicalize_cpu ( struct snd_soc_dai_link_component * cpus ,
int is_single_links ) ;
2016-08-09 08:49:41 +03:00
2019-03-20 07:56:50 +03:00
int asoc_simple_clean_reference ( struct snd_soc_card * card ) ;
2016-08-10 05:21:25 +03:00
2019-03-20 07:56:50 +03:00
void asoc_simple_convert_fixup ( struct asoc_simple_data * data ,
2017-06-15 03:24:09 +03:00
struct snd_pcm_hw_params * params ) ;
2021-04-12 02:53:00 +03:00
void asoc_simple_parse_convert ( struct device_node * np , char * prefix ,
2019-03-20 07:56:50 +03:00
struct asoc_simple_data * data ) ;
2017-06-15 03:24:09 +03:00
2019-03-20 07:56:50 +03:00
int asoc_simple_parse_routing ( struct snd_soc_card * card ,
2018-11-21 05:11:13 +03:00
char * prefix ) ;
2019-03-20 07:56:50 +03:00
int asoc_simple_parse_widgets ( struct snd_soc_card * card ,
2017-06-16 04:38:50 +03:00
char * prefix ) ;
2019-04-26 05:25:49 +03:00
int asoc_simple_parse_pin_switches ( struct snd_soc_card * card ,
char * prefix ) ;
2017-06-15 03:25:02 +03:00
2019-03-20 07:56:50 +03:00
int asoc_simple_init_jack ( struct snd_soc_card * card ,
2018-06-11 11:32:12 +03:00
struct asoc_simple_jack * sjack ,
2020-07-15 17:09:37 +03:00
int is_hp , char * prefix , char * pin ) ;
2019-03-20 07:56:50 +03:00
int asoc_simple_init_priv ( struct asoc_simple_priv * priv ,
2019-03-20 07:56:26 +03:00
struct link_info * li ) ;
2021-04-19 05:02:25 +03:00
int asoc_simple_remove ( struct platform_device * pdev ) ;
2019-03-20 07:54:42 +03:00
2021-04-19 05:02:19 +03:00
int asoc_graph_card_probe ( struct snd_soc_card * card ) ;
2021-10-12 07:54:01 +03:00
int asoc_graph_is_ports0 ( struct device_node * port ) ;
2021-04-19 05:02:19 +03:00
2019-03-20 07:54:42 +03:00
# ifdef DEBUG
2019-10-09 18:36:15 +03:00
static inline void asoc_simple_debug_dai ( struct asoc_simple_priv * priv ,
char * name ,
struct asoc_simple_dai * dai )
2019-03-20 07:54:42 +03:00
{
struct device * dev = simple_priv_to_dev ( priv ) ;
2019-07-10 10:59:55 +03:00
/* dai might be NULL */
if ( ! dai )
return ;
2019-03-20 07:54:42 +03:00
if ( dai - > name )
dev_dbg ( dev , " %s dai name = %s \n " ,
name , dai - > name ) ;
if ( dai - > slots )
dev_dbg ( dev , " %s slots = %d \n " , name , dai - > slots ) ;
if ( dai - > slot_width )
dev_dbg ( dev , " %s slot width = %d \n " , name , dai - > slot_width ) ;
if ( dai - > tx_slot_mask )
dev_dbg ( dev , " %s tx slot mask = %d \n " , name , dai - > tx_slot_mask ) ;
if ( dai - > rx_slot_mask )
dev_dbg ( dev , " %s rx slot mask = %d \n " , name , dai - > rx_slot_mask ) ;
if ( dai - > clk )
dev_dbg ( dev , " %s clk %luHz \n " , name , clk_get_rate ( dai - > clk ) ) ;
2021-04-12 02:52:50 +03:00
if ( dai - > sysclk )
dev_dbg ( dev , " %s sysclk = %dHz \n " ,
name , dai - > sysclk ) ;
if ( dai - > clk | | dai - > sysclk )
dev_dbg ( dev , " %s direction = %s \n " ,
name , dai - > clk_direction ? " OUT " : " IN " ) ;
2019-03-20 07:54:42 +03:00
}
2019-10-09 18:36:15 +03:00
static inline void asoc_simple_debug_info ( struct asoc_simple_priv * priv )
2019-03-20 07:54:42 +03:00
{
struct snd_soc_card * card = simple_priv_to_card ( priv ) ;
struct device * dev = simple_priv_to_dev ( priv ) ;
int i ;
if ( card - > name )
dev_dbg ( dev , " Card Name: %s \n " , card - > name ) ;
for ( i = 0 ; i < card - > num_links ; i + + ) {
struct simple_dai_props * props = simple_priv_to_props ( priv , i ) ;
struct snd_soc_dai_link * link = simple_priv_to_link ( priv , i ) ;
2021-04-12 02:52:09 +03:00
struct asoc_simple_dai * dai ;
struct snd_soc_codec_conf * cnf ;
int j ;
2019-03-20 07:54:42 +03:00
dev_dbg ( dev , " DAI%d \n " , i ) ;
2021-04-12 02:52:27 +03:00
dev_dbg ( dev , " cpu num = %d \n " , link - > num_cpus ) ;
2021-04-12 02:52:09 +03:00
for_each_prop_dai_cpu ( props , j , dai )
asoc_simple_debug_dai ( priv , " cpu " , dai ) ;
2021-04-12 02:52:27 +03:00
dev_dbg ( dev , " codec num = %d \n " , link - > num_codecs ) ;
2021-04-12 02:52:09 +03:00
for_each_prop_dai_codec ( props , j , dai )
asoc_simple_debug_dai ( priv , " codec " , dai ) ;
2019-03-20 07:54:42 +03:00
if ( link - > name )
dev_dbg ( dev , " dai name = %s \n " , link - > name ) ;
2021-04-12 02:52:23 +03:00
if ( link - > dai_fmt )
dev_dbg ( dev , " dai format = %04x \n " , link - > dai_fmt ) ;
2019-03-20 07:54:42 +03:00
if ( props - > adata . convert_rate )
2021-04-12 02:52:55 +03:00
dev_dbg ( dev , " convert_rate = %d \n " , props - > adata . convert_rate ) ;
2019-03-20 07:54:42 +03:00
if ( props - > adata . convert_channels )
2021-04-12 02:52:55 +03:00
dev_dbg ( dev , " convert_channels = %d \n " , props - > adata . convert_channels ) ;
2021-04-12 02:52:09 +03:00
for_each_prop_codec_conf ( props , j , cnf )
if ( cnf - > name_prefix )
dev_dbg ( dev , " name prefix = %s \n " , cnf - > name_prefix ) ;
2019-03-20 07:54:42 +03:00
if ( props - > mclk_fs )
2021-04-12 02:52:55 +03:00
dev_dbg ( dev , " mclk-fs = %d \n " , props - > mclk_fs ) ;
2019-03-20 07:54:42 +03:00
}
}
# else
# define asoc_simple_debug_info(priv)
# endif /* DEBUG */
2016-12-02 08:27:30 +03:00
# endif /* __SIMPLE_CARD_UTILS_H */