diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-09-01 18:03:13 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-09-01 18:03:13 -0400 |
commit | f8c6d7246a380fd8d13ebc3f7dac2495dc53db47 (patch) | |
tree | e7d6dfd31f99aed57411e927a755e6ac3b7eb2fb | |
parent | 138e4ad67afd5c6c318b056b4d17c17f2c0ca5c0 (diff) | |
parent | 231d069fcde22bd0582c2c9564f1b334d280c7d7 (diff) |
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
-rw-r--r-- | drivers/i2c/busses/i2c-designware-platdrv.c | 16 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-ismt.c | 6 |
2 files changed, 16 insertions, 6 deletions
diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c index 57248bccadbc..2b98a173136f 100644 --- a/drivers/i2c/busses/i2c-designware-platdrv.c +++ b/drivers/i2c/busses/i2c-designware-platdrv.c | |||
@@ -256,7 +256,8 @@ static int dw_i2c_plat_probe(struct platform_device *pdev) | |||
256 | struct dw_i2c_dev *dev; | 256 | struct dw_i2c_dev *dev; |
257 | u32 acpi_speed, ht = 0; | 257 | u32 acpi_speed, ht = 0; |
258 | struct resource *mem; | 258 | struct resource *mem; |
259 | int irq, ret; | 259 | int i, irq, ret; |
260 | const int supported_speeds[] = { 0, 100000, 400000, 1000000, 3400000 }; | ||
260 | 261 | ||
261 | irq = platform_get_irq(pdev, 0); | 262 | irq = platform_get_irq(pdev, 0); |
262 | if (irq < 0) | 263 | if (irq < 0) |
@@ -297,9 +298,16 @@ static int dw_i2c_plat_probe(struct platform_device *pdev) | |||
297 | } | 298 | } |
298 | 299 | ||
299 | acpi_speed = i2c_acpi_find_bus_speed(&pdev->dev); | 300 | acpi_speed = i2c_acpi_find_bus_speed(&pdev->dev); |
300 | /* Some broken DSTDs use 1MiHz instead of 1MHz */ | 301 | /* |
301 | if (acpi_speed == 1048576) | 302 | * Some DSTDs use a non standard speed, round down to the lowest |
302 | acpi_speed = 1000000; | 303 | * standard speed. |
304 | */ | ||
305 | for (i = 1; i < ARRAY_SIZE(supported_speeds); i++) { | ||
306 | if (acpi_speed < supported_speeds[i]) | ||
307 | break; | ||
308 | } | ||
309 | acpi_speed = supported_speeds[i - 1]; | ||
310 | |||
303 | /* | 311 | /* |
304 | * Find bus speed from the "clock-frequency" device property, ACPI | 312 | * Find bus speed from the "clock-frequency" device property, ACPI |
305 | * or by using fast mode if neither is set. | 313 | * or by using fast mode if neither is set. |
diff --git a/drivers/i2c/busses/i2c-ismt.c b/drivers/i2c/busses/i2c-ismt.c index e98e44e584a4..22ffcb73c185 100644 --- a/drivers/i2c/busses/i2c-ismt.c +++ b/drivers/i2c/busses/i2c-ismt.c | |||
@@ -341,8 +341,10 @@ static int ismt_process_desc(const struct ismt_desc *desc, | |||
341 | break; | 341 | break; |
342 | case I2C_SMBUS_BLOCK_DATA: | 342 | case I2C_SMBUS_BLOCK_DATA: |
343 | case I2C_SMBUS_I2C_BLOCK_DATA: | 343 | case I2C_SMBUS_I2C_BLOCK_DATA: |
344 | memcpy(&data->block[1], dma_buffer, desc->rxbytes); | 344 | if (desc->rxbytes != dma_buffer[0] + 1) |
345 | data->block[0] = desc->rxbytes; | 345 | return -EMSGSIZE; |
346 | |||
347 | memcpy(data->block, dma_buffer, desc->rxbytes); | ||
346 | break; | 348 | break; |
347 | } | 349 | } |
348 | return 0; | 350 | return 0; |