]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/bridge: ti-sn65dsi86: Check bridge connection failure
authorWolfram Sang <wsa+renesas@sang-engineering.com>
Tue, 18 Mar 2025 15:52:56 +0000 (16:52 +0100)
committerDouglas Anderson <dianders@chromium.org>
Mon, 24 Mar 2025 15:47:58 +0000 (08:47 -0700)
Read out and check the ID registers, so we can bail out if I2C
communication does not work or if the device is unknown. Tested on a
Renesas GrayHawk board (R-Car V4M) by using a wrong I2C address and by
not enabling RuntimePM for the device.

Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
Signed-off-by: Douglas Anderson <dianders@chromium.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20250318155549.19625-2-wsa+renesas@sang-engineering.com
drivers/gpu/drm/bridge/ti-sn65dsi86.c

index c2bdc7e57ac7937b2235eecc0dbd40bd5b92ee3e..f72675766e01108d72033b8b83c25d3e4d8fd1a7 100644 (file)
@@ -35,6 +35,7 @@
 #include <drm/drm_print.h>
 #include <drm/drm_probe_helper.h>
 
+#define SN_DEVICE_ID_REGS                      0x00    /* up to 0x07 */
 #define SN_DEVICE_REV_REG                      0x08
 #define SN_DPPLL_SRC_REG                       0x0A
 #define  DPPLL_CLK_SRC_DSICLK                  BIT(0)
@@ -1898,6 +1899,7 @@ static int ti_sn65dsi86_probe(struct i2c_client *client)
 {
        struct device *dev = &client->dev;
        struct ti_sn65dsi86 *pdata;
+       u8 id_buf[8];
        int ret;
 
        if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
@@ -1941,6 +1943,16 @@ static int ti_sn65dsi86_probe(struct i2c_client *client)
        if (ret)
                return ret;
 
+       pm_runtime_get_sync(dev);
+       ret = regmap_bulk_read(pdata->regmap, SN_DEVICE_ID_REGS, id_buf, ARRAY_SIZE(id_buf));
+       pm_runtime_put_autosuspend(dev);
+       if (ret)
+               return dev_err_probe(dev, ret, "failed to read device id\n");
+
+       /* The ID string is stored backwards */
+       if (strncmp(id_buf, "68ISD   ", ARRAY_SIZE(id_buf)))
+               return dev_err_probe(dev, -EOPNOTSUPP, "unsupported device id\n");
+
        /*
         * Break ourselves up into a collection of aux devices. The only real
         * motiviation here is to solve the chicken-and-egg problem of probe