aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/vc4/vc4_hdmi.c47
1 files changed, 15 insertions, 32 deletions
diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
index 984501e3f0b0..b92c6603c7a2 100644
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -995,15 +995,17 @@ static const struct snd_soc_dapm_route vc4_hdmi_audio_routes[] = {
995 { "TX", NULL, "Playback" }, 995 { "TX", NULL, "Playback" },
996}; 996};
997 997
998static const struct snd_soc_codec_driver vc4_hdmi_audio_codec_drv = { 998static const struct snd_soc_component_driver vc4_hdmi_audio_component_drv = {
999 .component_driver = { 999 .controls = vc4_hdmi_audio_controls,
1000 .controls = vc4_hdmi_audio_controls, 1000 .num_controls = ARRAY_SIZE(vc4_hdmi_audio_controls),
1001 .num_controls = ARRAY_SIZE(vc4_hdmi_audio_controls), 1001 .dapm_widgets = vc4_hdmi_audio_widgets,
1002 .dapm_widgets = vc4_hdmi_audio_widgets, 1002 .num_dapm_widgets = ARRAY_SIZE(vc4_hdmi_audio_widgets),
1003 .num_dapm_widgets = ARRAY_SIZE(vc4_hdmi_audio_widgets), 1003 .dapm_routes = vc4_hdmi_audio_routes,
1004 .dapm_routes = vc4_hdmi_audio_routes, 1004 .num_dapm_routes = ARRAY_SIZE(vc4_hdmi_audio_routes),
1005 .num_dapm_routes = ARRAY_SIZE(vc4_hdmi_audio_routes), 1005 .idle_bias_on = 1,
1006 }, 1006 .use_pmdown_time = 1,
1007 .endianness = 1,
1008 .non_legacy_dai_naming = 1,
1007}; 1009};
1008 1010
1009static const struct snd_soc_dai_ops vc4_hdmi_audio_dai_ops = { 1011static const struct snd_soc_dai_ops vc4_hdmi_audio_dai_ops = {
@@ -1101,11 +1103,11 @@ static int vc4_hdmi_audio_init(struct vc4_hdmi *hdmi)
1101 return ret; 1103 return ret;
1102 } 1104 }
1103 1105
1104 /* register codec and codec dai */ 1106 /* register component and codec dai */
1105 ret = snd_soc_register_codec(dev, &vc4_hdmi_audio_codec_drv, 1107 ret = devm_snd_soc_register_component(dev, &vc4_hdmi_audio_component_drv,
1106 &vc4_hdmi_audio_codec_dai_drv, 1); 1108 &vc4_hdmi_audio_codec_dai_drv, 1);
1107 if (ret) { 1109 if (ret) {
1108 dev_err(dev, "Could not register codec: %d\n", ret); 1110 dev_err(dev, "Could not register component: %d\n", ret);
1109 return ret; 1111 return ret;
1110 } 1112 }
1111 1113
@@ -1130,29 +1132,11 @@ static int vc4_hdmi_audio_init(struct vc4_hdmi *hdmi)
1130 */ 1132 */
1131 snd_soc_card_set_drvdata(card, hdmi); 1133 snd_soc_card_set_drvdata(card, hdmi);
1132 ret = devm_snd_soc_register_card(dev, card); 1134 ret = devm_snd_soc_register_card(dev, card);
1133 if (ret) { 1135 if (ret)
1134 dev_err(dev, "Could not register sound card: %d\n", ret); 1136 dev_err(dev, "Could not register sound card: %d\n", ret);
1135 goto unregister_codec;
1136 }
1137
1138 return 0;
1139
1140unregister_codec:
1141 snd_soc_unregister_codec(dev);
1142 1137
1143 return ret; 1138 return ret;
1144}
1145
1146static void vc4_hdmi_audio_cleanup(struct vc4_hdmi *hdmi)
1147{
1148 struct device *dev = &hdmi->pdev->dev;
1149 1139
1150 /*
1151 * If drvdata is not set this means the audio card was not
1152 * registered, just skip codec unregistration in this case.
1153 */
1154 if (dev_get_drvdata(dev))
1155 snd_soc_unregister_codec(dev);
1156} 1140}
1157 1141
1158#ifdef CONFIG_DRM_VC4_HDMI_CEC 1142#ifdef CONFIG_DRM_VC4_HDMI_CEC
@@ -1480,7 +1464,6 @@ static void vc4_hdmi_unbind(struct device *dev, struct device *master,
1480 struct vc4_dev *vc4 = drm->dev_private; 1464 struct vc4_dev *vc4 = drm->dev_private;
1481 struct vc4_hdmi *hdmi = vc4->hdmi; 1465 struct vc4_hdmi *hdmi = vc4->hdmi;
1482 1466
1483 vc4_hdmi_audio_cleanup(hdmi);
1484 cec_unregister_adapter(hdmi->cec_adap); 1467 cec_unregister_adapter(hdmi->cec_adap);
1485 vc4_hdmi_connector_destroy(hdmi->connector); 1468 vc4_hdmi_connector_destroy(hdmi->connector);
1486 vc4_hdmi_encoder_destroy(hdmi->encoder); 1469 vc4_hdmi_encoder_destroy(hdmi->encoder);