From: Chaoyi Chen <[email protected]>

This patch checks whether the device is a valid mipi_dsi_device before
accessing it in mipi_dsi_remove_device_fn().

The mipi_dsi_host_unregister() assumes that all child devices of the
host device are mipi_dsi_devices and uses mipi_dsi_remove_device_fn()
to perform subsequent operations specific to mipi_dsi_device.

In rockchip platform, for dw-mipi-dsi-rockchip.c, it creates a dphy
device, and it use the dsi host device as its parent device.

And when we call dw_mipi_dsi_remove() in
dw_mipi_dsi_rockchip_remove(), mipi_dsi_host_unregister() will get
such a dphy child device and treat it as an mipi_dsi_device, which
will lead to a further panic.

Signed-off-by: Chaoyi Chen <[email protected]>
---
 drivers/gpu/drm/drm_mipi_dsi.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/drm_mipi_dsi.c b/drivers/gpu/drm/drm_mipi_dsi.c
index a712e177b350..5b9cc799eb87 100644
--- a/drivers/gpu/drm/drm_mipi_dsi.c
+++ b/drivers/gpu/drm/drm_mipi_dsi.c
@@ -349,7 +349,12 @@ EXPORT_SYMBOL(mipi_dsi_host_register);
 
 static int mipi_dsi_remove_device_fn(struct device *dev, void *priv)
 {
-       struct mipi_dsi_device *dsi = to_mipi_dsi_device(dev);
+       struct mipi_dsi_device *dsi;
+
+       if (!dev_is_mipi_dsi(dev))
+               return 0;
+
+       dsi = to_mipi_dsi_device(dev);
 
        if (dsi->attached)
                mipi_dsi_detach(dsi);
-- 
2.51.1

Reply via email to