diff options
-rw-r--r-- | drivers/gpu/drm/vc4/vc4_hdmi.c | 47 |
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 | ||
998 | static const struct snd_soc_codec_driver vc4_hdmi_audio_codec_drv = { | 998 | static 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 | ||
1009 | static const struct snd_soc_dai_ops vc4_hdmi_audio_dai_ops = { | 1011 | static 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 | |||
1140 | unregister_codec: | ||
1141 | snd_soc_unregister_codec(dev); | ||
1142 | 1137 | ||
1143 | return ret; | 1138 | return ret; |
1144 | } | ||
1145 | |||
1146 | static 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); |