drm/panel: novatek-nt35950: Improve error handling
authorKonrad Dybcio <konrad.dybcio@linaro.org>
Sat, 15 Apr 2023 11:00:30 +0000 (13:00 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 11 May 2023 14:03:29 +0000 (23:03 +0900)
[ Upstream commit 5dd45b66742a1f3cfa9a92dc0ac8714c7708ee6c ]

In a very peculiar case when probing and registering with the secondary
DSI host succeeds, but the OF backlight or DSI attachment fails, the
primary DSI device is automatically cleaned up, but the secondary one
is not, leading to -EEXIST when the driver core tries to handle
-EPROBE_DEFER.

Unregister the DSI1 device manually on failure to prevent that.

Fixes: 623a3531e9cf ("drm/panel: Add driver for Novatek NT35950 DSI DriverIC panels")
Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org>
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20230415-konrad-longbois-next-v1-1-ce695dc9df84@linaro.org
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/panel/panel-novatek-nt35950.c

index 3a844917da075b1251f055cfe40b7045518929cb..4359b02754aacb8728aecab7f4eb17a2697f4928 100644 (file)
@@ -593,8 +593,11 @@ static int nt35950_probe(struct mipi_dsi_device *dsi)
                       DRM_MODE_CONNECTOR_DSI);
 
        ret = drm_panel_of_backlight(&nt->panel);
-       if (ret)
+       if (ret) {
+               mipi_dsi_device_unregister(nt->dsi[1]);
+
                return dev_err_probe(dev, ret, "Failed to get backlight\n");
+       }
 
        drm_panel_add(&nt->panel);
 
@@ -610,6 +613,9 @@ static int nt35950_probe(struct mipi_dsi_device *dsi)
 
                ret = mipi_dsi_attach(nt->dsi[i]);
                if (ret < 0) {
+                       /* If we fail to attach to either host, we're done */
+                       mipi_dsi_device_unregister(nt->dsi[1]);
+
                        return dev_err_probe(dev, ret,
                                             "Cannot attach to DSI%d host.\n", i);
                }