hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/sound/soc/bcm/cygnus-ssp.c
....@@ -1052,9 +1052,12 @@
10521052 }
10531053
10541054 #ifdef CONFIG_PM_SLEEP
1055
-static int cygnus_ssp_suspend(struct snd_soc_dai *cpu_dai)
1055
+static int __cygnus_ssp_suspend(struct snd_soc_dai *cpu_dai)
10561056 {
10571057 struct cygnus_aio_port *aio = cygnus_dai_get_portinfo(cpu_dai);
1058
+
1059
+ if (!snd_soc_dai_active(cpu_dai))
1060
+ return 0;
10581061
10591062 if (!aio->is_slave) {
10601063 u32 val;
....@@ -1078,10 +1081,24 @@
10781081 return 0;
10791082 }
10801083
1081
-static int cygnus_ssp_resume(struct snd_soc_dai *cpu_dai)
1084
+static int cygnus_ssp_suspend(struct snd_soc_component *component)
1085
+{
1086
+ struct snd_soc_dai *dai;
1087
+ int ret = 0;
1088
+
1089
+ for_each_component_dais(component, dai)
1090
+ ret |= __cygnus_ssp_suspend(dai);
1091
+
1092
+ return ret;
1093
+}
1094
+
1095
+static int __cygnus_ssp_resume(struct snd_soc_dai *cpu_dai)
10821096 {
10831097 struct cygnus_aio_port *aio = cygnus_dai_get_portinfo(cpu_dai);
10841098 int error;
1099
+
1100
+ if (!snd_soc_dai_active(cpu_dai))
1101
+ return 0;
10851102
10861103 if (!aio->is_slave) {
10871104 if (aio->clk_trace.cap_clk_en) {
....@@ -1109,6 +1126,18 @@
11091126
11101127 return 0;
11111128 }
1129
+
1130
+static int cygnus_ssp_resume(struct snd_soc_component *component)
1131
+{
1132
+ struct snd_soc_dai *dai;
1133
+ int ret = 0;
1134
+
1135
+ for_each_component_dais(component, dai)
1136
+ ret |= __cygnus_ssp_resume(dai);
1137
+
1138
+ return ret;
1139
+}
1140
+
11121141 #else
11131142 #define cygnus_ssp_suspend NULL
11141143 #define cygnus_ssp_resume NULL
....@@ -1149,8 +1178,6 @@
11491178 SNDRV_PCM_FMTBIT_S32_LE, \
11501179 }, \
11511180 .ops = &cygnus_ssp_dai_ops, \
1152
- .suspend = cygnus_ssp_suspend, \
1153
- .resume = cygnus_ssp_resume, \
11541181 }
11551182
11561183 static const struct snd_soc_dai_driver cygnus_ssp_dai_info[] = {
....@@ -1169,14 +1196,14 @@
11691196 SNDRV_PCM_FMTBIT_S32_LE,
11701197 },
11711198 .ops = &cygnus_spdif_dai_ops,
1172
- .suspend = cygnus_ssp_suspend,
1173
- .resume = cygnus_ssp_resume,
11741199 };
11751200
11761201 static struct snd_soc_dai_driver cygnus_ssp_dai[CYGNUS_MAX_PORTS];
11771202
11781203 static const struct snd_soc_component_driver cygnus_ssp_component = {
11791204 .name = "cygnus-audio",
1205
+ .suspend = cygnus_ssp_suspend,
1206
+ .resume = cygnus_ssp_resume,
11801207 };
11811208
11821209 /*
....@@ -1334,7 +1361,7 @@
13341361 cygaud->active_ports = 0;
13351362
13361363 dev_dbg(dev, "Registering %d DAIs\n", active_port_count);
1337
- err = snd_soc_register_component(dev, &cygnus_ssp_component,
1364
+ err = devm_snd_soc_register_component(dev, &cygnus_ssp_component,
13381365 cygnus_ssp_dai, active_port_count);
13391366 if (err) {
13401367 dev_err(dev, "snd_soc_register_dai failed\n");
....@@ -1342,35 +1369,27 @@
13421369 }
13431370
13441371 cygaud->irq_num = platform_get_irq(pdev, 0);
1345
- if (cygaud->irq_num <= 0) {
1346
- dev_err(dev, "platform_get_irq failed\n");
1347
- err = cygaud->irq_num;
1348
- goto err_irq;
1349
- }
1372
+ if (cygaud->irq_num <= 0)
1373
+ return cygaud->irq_num;
13501374
13511375 err = audio_clk_init(pdev, cygaud);
13521376 if (err) {
13531377 dev_err(dev, "audio clock initialization failed\n");
1354
- goto err_irq;
1378
+ return err;
13551379 }
13561380
13571381 err = cygnus_soc_platform_register(dev, cygaud);
13581382 if (err) {
13591383 dev_err(dev, "platform reg error %d\n", err);
1360
- goto err_irq;
1384
+ return err;
13611385 }
13621386
13631387 return 0;
1364
-
1365
-err_irq:
1366
- snd_soc_unregister_component(dev);
1367
- return err;
13681388 }
13691389
13701390 static int cygnus_ssp_remove(struct platform_device *pdev)
13711391 {
13721392 cygnus_soc_platform_unregister(&pdev->dev);
1373
- snd_soc_unregister_component(&pdev->dev);
13741393
13751394 return 0;
13761395 }