Re: [PATCH v3 11/33] drm/mediatek: mtk_hdmi: Unregister audio platform device on failure

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Il 23/12/24 06:22, CK Hu (胡俊光) ha scritto:
Hi, Angelo:

On Tue, 2024-12-17 at 16:43 +0100, AngeloGioacchino Del Regno wrote:
External email : Please do not click links or open attachments until you have verified the sender or the content.


The probe function of this driver may fail after registering the
audio platform device: in that case, the state is not getting
cleaned up, leaving this device registered.

Adding up to the mix, should the probe function of this driver
return a probe deferral for N times, we're registering up to N
audio platform devices and, again, never freeing them up.

To fix this, add a pointer to the audio platform device in the
mtk_hdmi structure, and add a devm action to unregister it upon
driver removal or probe failure.

Fixes: 8f83f26891e1 ("drm/mediatek: Add HDMI support")
Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@xxxxxxxxxxxxx>
---
  drivers/gpu/drm/mediatek/mtk_hdmi.c | 27 +++++++++++++++++++++------
  1 file changed, 21 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi.c b/drivers/gpu/drm/mediatek/mtk_hdmi.c
index 59a8a81fa0ec..9131c2fdfba8 100644
--- a/drivers/gpu/drm/mediatek/mtk_hdmi.c
+++ b/drivers/gpu/drm/mediatek/mtk_hdmi.c
@@ -172,6 +172,7 @@ struct mtk_hdmi {
         unsigned int sys_offset;
         void __iomem *regs;
         enum hdmi_colorspace csp;
+       struct platform_device *audio_pdev;
         struct hdmi_audio_param aud_param;
         bool audio_enable;
         bool powered;
@@ -1662,6 +1663,11 @@ static const struct hdmi_codec_ops mtk_hdmi_audio_codec_ops = {
         .no_capture_mute = 1,
  };

+static void mtk_hdmi_unregister_audio_driver(void *data)
+{
+       platform_device_unregister(data);
+}
+
  static int mtk_hdmi_register_audio_driver(struct device *dev)
  {
         struct mtk_hdmi *hdmi = dev_get_drvdata(dev);
@@ -1671,13 +1677,22 @@ static int mtk_hdmi_register_audio_driver(struct device *dev)
                 .i2s = 1,
                 .data = hdmi,
         };
-       struct platform_device *pdev;
+       int ret;

-       pdev = platform_device_register_data(dev, HDMI_CODEC_DRV_NAME,
-                                            PLATFORM_DEVID_AUTO, &codec_data,
-                                            sizeof(codec_data));
-       if (IS_ERR(pdev))
-               return PTR_ERR(pdev);
+       hdmi->audio_pdev = platform_device_register_data(dev,
+                                                        HDMI_CODEC_DRV_NAME,
+                                                        PLATFORM_DEVID_AUTO,
+                                                        &codec_data,
+                                                        sizeof(codec_data));
+       if (IS_ERR(hdmi->audio_pdev))
+               return PTR_ERR(hdmi->audio_pdev);
+
+       ret = devm_add_action_or_reset(dev, mtk_hdmi_unregister_audio_driver,
+                                      hdmi->audio_pdev);
+       if (ret) {
+               platform_device_unregister(hdmi->audio_pdev);

When devm_add_action_or_reset() fail, it would call mtk_hdmi_unregister_audio_driver() inside it.
So it's not necessary to call platform_device_unregister() here.


Oh, right. Yeah, that was quite an overlook from me.

I'll fix that in v4.

Thanks,
Angelo

Regards,
CK

+               return ret;
+       }

         DRM_INFO("%s driver bound to HDMI\n", HDMI_CODEC_DRV_NAME);
         return 0;
--
2.47.0






[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux