Merge branch 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
Pull i2c fixes from Wolfram Sang: "The ismt driver had a problem with a rarely used transaction type and the designware driver was made even more robust against non standard ACPI tables" * 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux: i2c: designware: Round down ACPI provided clk to nearest supported clk i2c: ismt: Return EMSGSIZE for block reads with bogus length i2c: ismt: Don't duplicate the receive length for block reads
This commit is contained in:
commit
f8c6d7246a
2 changed files with 16 additions and 6 deletions
|
@ -256,7 +256,8 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
|
|||
struct dw_i2c_dev *dev;
|
||||
u32 acpi_speed, ht = 0;
|
||||
struct resource *mem;
|
||||
int irq, ret;
|
||||
int i, irq, ret;
|
||||
const int supported_speeds[] = { 0, 100000, 400000, 1000000, 3400000 };
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0)
|
||||
|
@ -297,9 +298,16 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
acpi_speed = i2c_acpi_find_bus_speed(&pdev->dev);
|
||||
/* Some broken DSTDs use 1MiHz instead of 1MHz */
|
||||
if (acpi_speed == 1048576)
|
||||
acpi_speed = 1000000;
|
||||
/*
|
||||
* Some DSTDs use a non standard speed, round down to the lowest
|
||||
* standard speed.
|
||||
*/
|
||||
for (i = 1; i < ARRAY_SIZE(supported_speeds); i++) {
|
||||
if (acpi_speed < supported_speeds[i])
|
||||
break;
|
||||
}
|
||||
acpi_speed = supported_speeds[i - 1];
|
||||
|
||||
/*
|
||||
* Find bus speed from the "clock-frequency" device property, ACPI
|
||||
* or by using fast mode if neither is set.
|
||||
|
|
|
@ -341,8 +341,10 @@ static int ismt_process_desc(const struct ismt_desc *desc,
|
|||
break;
|
||||
case I2C_SMBUS_BLOCK_DATA:
|
||||
case I2C_SMBUS_I2C_BLOCK_DATA:
|
||||
memcpy(&data->block[1], dma_buffer, desc->rxbytes);
|
||||
data->block[0] = desc->rxbytes;
|
||||
if (desc->rxbytes != dma_buffer[0] + 1)
|
||||
return -EMSGSIZE;
|
||||
|
||||
memcpy(data->block, dma_buffer, desc->rxbytes);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
|
|
Loading…
Reference in a new issue