Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d3f420d1 authored by Alex Deucher's avatar Alex Deucher Committed by Dave Airlie
Browse files

drm/radeon/kms: make sure i2c id matches



Entries in the i2c table aren't always ordered
by id.  This allows us to remove some quirks
that are no longer needed.

Signed-off-by: default avatarAlex Deucher <alexdeucher@gmail.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 279b215e
Loading
Loading
Loading
Loading
+43 −48
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ static inline struct radeon_i2c_bus_rec radeon_lookup_i2c_gpio(struct radeon_dev
	int index = GetIndexIntoMasterTable(DATA, GPIO_I2C_Info);
	struct _ATOM_GPIO_I2C_INFO *i2c_info;
	uint16_t data_offset;
	int i;

	memset(&i2c, 0, sizeof(struct radeon_i2c_bus_rec));
	i2c.valid = false;
@@ -78,8 +79,11 @@ static inline struct radeon_i2c_bus_rec radeon_lookup_i2c_gpio(struct radeon_dev

	i2c_info = (struct _ATOM_GPIO_I2C_INFO *)(ctx->bios + data_offset);

	gpio = &i2c_info->asGPIO_Info[id];

	for (i = 0; i < ATOM_MAX_SUPPORTED_DEVICE; i++) {
		gpio = &i2c_info->asGPIO_Info[i];

		if (gpio->sucI2cId.ucAccess == id) {
			i2c.mask_clk_reg = le16_to_cpu(gpio->usClkMaskRegisterIndex) * 4;
			i2c.mask_data_reg = le16_to_cpu(gpio->usDataMaskRegisterIndex) * 4;
			i2c.en_clk_reg = le16_to_cpu(gpio->usClkEnRegisterIndex) * 4;
@@ -110,6 +114,8 @@ static inline struct radeon_i2c_bus_rec radeon_lookup_i2c_gpio(struct radeon_dev
			i2c.i2c_id = gpio->sucI2cId.ucAccess;

			i2c.valid = true;
		}
	}

	return i2c;
}
@@ -503,6 +509,7 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
								 usRecordOffset));
						ATOM_I2C_RECORD *i2c_record;
						ATOM_HPD_INT_RECORD *hpd_record;
						ATOM_I2C_ID_CONFIG_ACCESS *i2c_config;
						hpd.hpd = RADEON_HPD_NONE;

						while (record->ucRecordType > 0
@@ -514,10 +521,12 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
								i2c_record =
								    (ATOM_I2C_RECORD *)
									record;
								i2c_config =
									(ATOM_I2C_ID_CONFIG_ACCESS *)
									&i2c_record->sucI2cId;
								ddc_bus = radeon_lookup_i2c_gpio(rdev,
												 i2c_record->
												 sucI2cId.
												 bfI2C_LineMux);
												 i2c_config->
												 ucAccess);
								break;
							case ATOM_HPD_INT_RECORD_TYPE:
								hpd_record =
@@ -670,22 +679,8 @@ bool radeon_get_atom_connector_info_from_supported_devices_table(struct

		dac = ci.sucConnectorInfo.sbfAccess.bfAssociatedDAC;

		if ((rdev->family == CHIP_RS690) ||
		    (rdev->family == CHIP_RS740)) {
			if ((i == ATOM_DEVICE_DFP2_INDEX)
			    && (ci.sucI2cId.sbfAccess.bfI2C_LineMux == 2))
				bios_connectors[i].line_mux =
				    ci.sucI2cId.sbfAccess.bfI2C_LineMux + 1;
			else if ((i == ATOM_DEVICE_DFP3_INDEX)
				 && (ci.sucI2cId.sbfAccess.bfI2C_LineMux == 1))
				bios_connectors[i].line_mux =
				    ci.sucI2cId.sbfAccess.bfI2C_LineMux + 1;
			else
				bios_connectors[i].line_mux =
				    ci.sucI2cId.sbfAccess.bfI2C_LineMux;
		} else
		bios_connectors[i].line_mux =
			    ci.sucI2cId.sbfAccess.bfI2C_LineMux;
			ci.sucI2cId.ucAccess;

		/* give tv unique connector ids */
		if (i == ATOM_DEVICE_TV1_INDEX) {