aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-09-01 18:03:13 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-09-01 18:03:13 -0400
commitf8c6d7246a380fd8d13ebc3f7dac2495dc53db47 (patch)
treee7d6dfd31f99aed57411e927a755e6ac3b7eb2fb
parent138e4ad67afd5c6c318b056b4d17c17f2c0ca5c0 (diff)
parent231d069fcde22bd0582c2c9564f1b334d280c7d7 (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.c16
-rw-r--r--drivers/i2c/busses/i2c-ismt.c6
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;