diff --git a/drivers/gpu/drm/bridge/dw-hdmi-audio.h b/drivers/gpu/drm/bridge/dw-hdmi-audio.h index b9e839f4151a..d3194b4e186b 100644 --- a/drivers/gpu/drm/bridge/dw-hdmi-audio.h +++ b/drivers/gpu/drm/bridge/dw-hdmi-audio.h @@ -13,6 +13,7 @@ struct dw_hdmi_audio_data { struct dw_hdmi_i2s_audio_data { struct dw_hdmi *hdmi; + struct platform_device *pdev; void (*write)(struct dw_hdmi *hdmi, u8 val, int offset); u8 (*read)(struct dw_hdmi *hdmi, int offset); diff --git a/drivers/gpu/drm/bridge/dw-hdmi-i2s-audio.c b/drivers/gpu/drm/bridge/dw-hdmi-i2s-audio.c index d4ad3f0014e7..f1f62d8c1d16 100644 --- a/drivers/gpu/drm/bridge/dw-hdmi-i2s-audio.c +++ b/drivers/gpu/drm/bridge/dw-hdmi-i2s-audio.c @@ -234,11 +234,23 @@ static int snd_dw_hdmi_probe(struct platform_device *pdev) pdevinfo.size_data = sizeof(pdata); pdevinfo.dma_mask = DMA_BIT_MASK(32); - return IS_ERR_OR_NULL(platform_device_register_full(&pdevinfo)); + audio->pdev = platform_device_register_full(&pdevinfo); + return IS_ERR_OR_NULL(audio->pdev); +} + +static int snd_dw_hdmi_remove(struct platform_device *pdev) +{ + struct dw_hdmi_i2s_audio_data *audio = pdev->dev.platform_data; + + if (!IS_ERR_OR_NULL(audio->pdev)) + platform_device_unregister(audio->pdev); + + return 0; } static struct platform_driver snd_dw_hdmi_driver = { .probe = snd_dw_hdmi_probe, + .remove = snd_dw_hdmi_remove, .driver = { .name = DRIVER_NAME, .owner = THIS_MODULE,