@@ -24,27 +24,27 @@ static int loongson_card_hw_params(struct snd_pcm_substream *substream,
2424 struct snd_pcm_hw_params * params )
2525{
2626 struct snd_soc_pcm_runtime * rtd = snd_soc_substream_to_rtd (substream );
27- struct snd_soc_dai * cpu_dai = snd_soc_rtd_to_cpu (rtd , 0 );
28- struct snd_soc_dai * codec_dai = snd_soc_rtd_to_codec (rtd , 0 );
2927 struct loongson_card_data * ls_card = snd_soc_card_get_drvdata (rtd -> card );
28+ struct snd_soc_dai * codec_dai = snd_soc_rtd_to_codec (rtd , 0 );
29+ struct snd_soc_dai * cpu_dai = snd_soc_rtd_to_cpu (rtd , 0 );
3030 int ret , mclk ;
3131
32- if (ls_card -> mclk_fs ) {
33- mclk = ls_card -> mclk_fs * params_rate (params );
34- ret = snd_soc_dai_set_sysclk (cpu_dai , 0 , mclk ,
35- SND_SOC_CLOCK_OUT );
36- if (ret < 0 ) {
37- dev_err (codec_dai -> dev , "cpu_dai clock not set\n" );
38- return ret ;
39- }
32+ if (!ls_card -> mclk_fs )
33+ return 0 ;
4034
41- ret = snd_soc_dai_set_sysclk (codec_dai , 0 , mclk ,
42- SND_SOC_CLOCK_IN );
43- if (ret < 0 ) {
44- dev_err (codec_dai -> dev , "codec_dai clock not set\n" );
45- return ret ;
46- }
35+ mclk = ls_card -> mclk_fs * params_rate (params );
36+ ret = snd_soc_dai_set_sysclk (cpu_dai , 0 , mclk , SND_SOC_CLOCK_OUT );
37+ if (ret < 0 ) {
38+ dev_err (codec_dai -> dev , "cpu_dai clock not set\n" );
39+ return ret ;
40+ }
41+
42+ ret = snd_soc_dai_set_sysclk (codec_dai , 0 , mclk , SND_SOC_CLOCK_IN );
43+ if (ret < 0 ) {
44+ dev_err (codec_dai -> dev , "codec_dai clock not set\n" );
45+ return ret ;
4746 }
47+
4848 return 0 ;
4949}
5050
@@ -68,46 +68,53 @@ static struct snd_soc_dai_link loongson_dai_links[] = {
6868 },
6969};
7070
71- static int loongson_card_parse_acpi (struct loongson_card_data * data )
71+ static struct acpi_device * loongson_card_acpi_find_device (struct snd_soc_card * card ,
72+ const char * name )
7273{
73- struct snd_soc_card * card = & data -> snd_card ;
7474 struct fwnode_handle * fwnode = card -> dev -> fwnode ;
7575 struct fwnode_reference_args args ;
76+ int status ;
77+
78+ memset (& args , 0 , sizeof (args ));
79+ status = acpi_node_get_property_reference (fwnode , name , 0 , & args );
80+ if (status || !is_acpi_device_node (args .fwnode )) {
81+ dev_err (card -> dev , "No matching phy in ACPI table\n" );
82+ return NULL ;
83+ }
84+
85+ return to_acpi_device_node (args .fwnode );
86+ }
87+
88+ static int loongson_card_parse_acpi (struct loongson_card_data * data )
89+ {
90+ struct snd_soc_card * card = & data -> snd_card ;
7691 const char * codec_dai_name ;
7792 struct acpi_device * adev ;
7893 struct device * phy_dev ;
79- int ret , i ;
94+ int i ;
8095
8196 /* fixup platform name based on reference node */
82- memset (& args , 0 , sizeof (args ));
83- ret = acpi_node_get_property_reference (fwnode , "cpu" , 0 , & args );
84- if (ret || !is_acpi_device_node (args .fwnode )) {
85- dev_err (card -> dev , "No matching phy in ACPI table\n" );
86- return ret ?: - ENOENT ;
87- }
88- adev = to_acpi_device_node (args .fwnode );
97+ adev = loongson_card_acpi_find_device (card , "cpu" );
98+ if (!adev )
99+ return - ENOENT ;
100+
89101 phy_dev = acpi_get_first_physical_node (adev );
90102 if (!phy_dev )
91103 return - EPROBE_DEFER ;
92- for (i = 0 ; i < card -> num_links ; i ++ )
93- loongson_dai_links [i ].platforms -> name = dev_name (phy_dev );
94104
95105 /* fixup codec name based on reference node */
96- memset (& args , 0 , sizeof (args ));
97- ret = acpi_node_get_property_reference (fwnode , "codec" , 0 , & args );
98- if (ret || !is_acpi_device_node (args .fwnode )) {
99- dev_err (card -> dev , "No matching phy in ACPI table\n" );
100- return ret ?: - ENOENT ;
101- }
102- adev = to_acpi_device_node (args .fwnode );
106+ adev = loongson_card_acpi_find_device (card , "codec" );
107+ if (!adev )
108+ return - ENOENT ;
103109 snprintf (codec_name , sizeof (codec_name ), "i2c-%s" , acpi_dev_name (adev ));
104- for (i = 0 ; i < card -> num_links ; i ++ )
105- loongson_dai_links [i ].codecs -> name = codec_name ;
106110
107- device_property_read_string (card -> dev , "codec-dai-name" ,
108- & codec_dai_name );
109- for (i = 0 ; i < card -> num_links ; i ++ )
111+ device_property_read_string (card -> dev , "codec-dai-name" , & codec_dai_name );
112+
113+ for (i = 0 ; i < card -> num_links ; i ++ ) {
114+ loongson_dai_links [i ].platforms -> name = dev_name (phy_dev );
115+ loongson_dai_links [i ].codecs -> name = codec_name ;
110116 loongson_dai_links [i ].codecs -> dai_name = codec_dai_name ;
117+ }
111118
112119 return 0 ;
113120}
@@ -159,40 +166,36 @@ static int loongson_card_parse_of(struct loongson_card_data *data)
159166static int loongson_asoc_card_probe (struct platform_device * pdev )
160167{
161168 struct loongson_card_data * ls_priv ;
169+ struct device * dev = & pdev -> dev ;
162170 struct snd_soc_card * card ;
163171 int ret ;
164172
165- ls_priv = devm_kzalloc (& pdev -> dev , sizeof (* ls_priv ), GFP_KERNEL );
173+ ls_priv = devm_kzalloc (dev , sizeof (* ls_priv ), GFP_KERNEL );
166174 if (!ls_priv )
167175 return - ENOMEM ;
168176
169177 card = & ls_priv -> snd_card ;
170178
171- card -> dev = & pdev -> dev ;
179+ card -> dev = dev ;
172180 card -> owner = THIS_MODULE ;
173181 card -> dai_link = loongson_dai_links ;
174182 card -> num_links = ARRAY_SIZE (loongson_dai_links );
175183 snd_soc_card_set_drvdata (card , ls_priv );
176184
177- ret = device_property_read_string (& pdev -> dev , "model" , & card -> name );
178- if (ret ) {
179- dev_err (& pdev -> dev , "Error parsing card name: %d\n" , ret );
180- return ret ;
181- }
182- ret = device_property_read_u32 (& pdev -> dev , "mclk-fs" , & ls_priv -> mclk_fs );
183- if (ret ) {
184- dev_err (& pdev -> dev , "Error parsing mclk-fs: %d\n" , ret );
185- return ret ;
186- }
185+ ret = device_property_read_string (dev , "model" , & card -> name );
186+ if (ret )
187+ dev_err_probe (dev , ret , "Error parsing card name\n" );
187188
188- if (has_acpi_companion (& pdev -> dev ))
189- ret = loongson_card_parse_acpi (ls_priv );
190- else
191- ret = loongson_card_parse_of (ls_priv );
192- if (ret < 0 )
193- return ret ;
189+ ret = device_property_read_u32 (dev , "mclk-fs" , & ls_priv -> mclk_fs );
190+ if (ret )
191+ dev_err_probe (dev , ret , "Error parsing mclk-fs\n" );
192+
193+ ret = has_acpi_companion (dev ) ? loongson_card_parse_acpi (ls_priv )
194+ : loongson_card_parse_of (ls_priv );
195+ if (ret )
196+ dev_err_probe (dev , ret , "Error parsing acpi/of properties\n" );
194197
195- return devm_snd_soc_register_card (& pdev -> dev , card );
198+ return devm_snd_soc_register_card (dev , card );
196199}
197200
198201static const struct of_device_id loongson_asoc_dt_ids [] = {
0 commit comments