mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	drm/amdgpu: add return result for amdgpu_i2c_{get/put}_byte
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>
This commit is contained in:
		
							parent
							
								
									8b2faf1a4f
								
							
						
					
					
						commit
						cd48b97ce7
					
				
					 1 changed files with 28 additions and 19 deletions
				
			
		| 
						 | 
				
			
			@ -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;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
static void amdgpu_i2c_put_byte(struct amdgpu_i2c_chan *i2c_bus,
 | 
			
		||||
	*val = in_buf[0];
 | 
			
		||||
	DRM_DEBUG("val = 0x%02x\n", *val);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue