drm/amdgpu: add return result for amdgpu_i2c_{get/put}_byte
authorBob Zhou <bob.zhou@amd.com>
Wed, 24 Apr 2024 07:24:05 +0000 (15:24 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 26 Apr 2024 21:22:43 +0000 (17:22 -0400)
After amdgpu_i2c_get_byte fail, amdgpu_i2c_put_byte shouldn't be
conducted to put wrong value.
So return and check the i2c transfer result.

Signed-off-by: Bob Zhou <bob.zhou@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.c

index d79cb13e1aa835db4028173957d24f3132049521..00d6211e0fbf910e249f29fa328d4d5b6893b0cd 100644 (file)
@@ -279,7 +279,7 @@ amdgpu_i2c_lookup(struct amdgpu_device *adev,
        return NULL;
 }
 
-static void amdgpu_i2c_get_byte(struct amdgpu_i2c_chan *i2c_bus,
+static int amdgpu_i2c_get_byte(struct amdgpu_i2c_chan *i2c_bus,
                                 u8 slave_addr,
                                 u8 addr,
                                 u8 *val)
@@ -304,16 +304,18 @@ static void amdgpu_i2c_get_byte(struct amdgpu_i2c_chan *i2c_bus,
        out_buf[0] = addr;
        out_buf[1] = 0;
 
-       if (i2c_transfer(&i2c_bus->adapter, msgs, 2) == 2) {
-               *val = in_buf[0];
-               DRM_DEBUG("val = 0x%02x\n", *val);
-       } else {
-               DRM_DEBUG("i2c 0x%02x 0x%02x read failed\n",
-                         addr, *val);
+       if (i2c_transfer(&i2c_bus->adapter, msgs, 2) != 2) {
+               DRM_DEBUG("i2c 0x%02x read failed\n", addr);
+               return -EIO;
        }
+
+       *val = in_buf[0];
+       DRM_DEBUG("val = 0x%02x\n", *val);
+
+       return 0;
 }
 
-static void amdgpu_i2c_put_byte(struct amdgpu_i2c_chan *i2c_bus,
+static int amdgpu_i2c_put_byte(struct amdgpu_i2c_chan *i2c_bus,
                                 u8 slave_addr,
                                 u8 addr,
                                 u8 val)
@@ -329,9 +331,12 @@ static void amdgpu_i2c_put_byte(struct amdgpu_i2c_chan *i2c_bus,
        out_buf[0] = addr;
        out_buf[1] = val;
 
-       if (i2c_transfer(&i2c_bus->adapter, &msg, 1) != 1)
-               DRM_DEBUG("i2c 0x%02x 0x%02x write failed\n",
-                         addr, val);
+       if (i2c_transfer(&i2c_bus->adapter, &msg, 1) != 1) {
+               DRM_DEBUG("i2c 0x%02x 0x%02x write failed\n", addr, val);
+               return -EIO;
+       }
+
+       return 0;
 }
 
 /* ddc router switching */
@@ -346,16 +351,18 @@ amdgpu_i2c_router_select_ddc_port(const struct amdgpu_connector *amdgpu_connecto
        if (!amdgpu_connector->router_bus)
                return;
 
-       amdgpu_i2c_get_byte(amdgpu_connector->router_bus,
+       if (amdgpu_i2c_get_byte(amdgpu_connector->router_bus,
                            amdgpu_connector->router.i2c_addr,
-                           0x3, &val);
+                           0x3, &val))
+               return;
        val &= ~amdgpu_connector->router.ddc_mux_control_pin;
        amdgpu_i2c_put_byte(amdgpu_connector->router_bus,
                            amdgpu_connector->router.i2c_addr,
                            0x3, val);
-       amdgpu_i2c_get_byte(amdgpu_connector->router_bus,
+       if (amdgpu_i2c_get_byte(amdgpu_connector->router_bus,
                            amdgpu_connector->router.i2c_addr,
-                           0x1, &val);
+                           0x1, &val))
+               return;
        val &= ~amdgpu_connector->router.ddc_mux_control_pin;
        val |= amdgpu_connector->router.ddc_mux_state;
        amdgpu_i2c_put_byte(amdgpu_connector->router_bus,
@@ -375,16 +382,18 @@ amdgpu_i2c_router_select_cd_port(const struct amdgpu_connector *amdgpu_connector
        if (!amdgpu_connector->router_bus)
                return;
 
-       amdgpu_i2c_get_byte(amdgpu_connector->router_bus,
+       if (amdgpu_i2c_get_byte(amdgpu_connector->router_bus,
                            amdgpu_connector->router.i2c_addr,
-                           0x3, &val);
+                           0x3, &val))
+               return;
        val &= ~amdgpu_connector->router.cd_mux_control_pin;
        amdgpu_i2c_put_byte(amdgpu_connector->router_bus,
                            amdgpu_connector->router.i2c_addr,
                            0x3, val);
-       amdgpu_i2c_get_byte(amdgpu_connector->router_bus,
+       if (amdgpu_i2c_get_byte(amdgpu_connector->router_bus,
                            amdgpu_connector->router.i2c_addr,
-                           0x1, &val);
+                           0x1, &val))
+               return;
        val &= ~amdgpu_connector->router.cd_mux_control_pin;
        val |= amdgpu_connector->router.cd_mux_state;
        amdgpu_i2c_put_byte(amdgpu_connector->router_bus,