Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux

Pull i2c bugfixes from Wolfram Sang:
"These should have been in rc2 but I missed it due to working on devm
longer than expected.

There is one ID addition, since we are touching the driver anyhow.
And the feature bit documentation is one outcome of a debug session
and will make it easier for users to work around problems. The rest
is typical driver bugfixes."

* 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux:
i2c: suppress lockdep warning on delete_device
i2c: mv64xxx: work around signals causing I2C transactions to be aborted
i2c: i801: Document feature bits in modinfo
i2c: designware: add Intel BayTrail ACPI ID
i2c: designware: always clear interrupts before enabling them
i2c: designware: fix RX FIFO overrun

+26 -8
+12 -2
drivers/i2c/busses/i2c-designware-core.c
··· 383 383 /* Enable the adapter */ 384 384 __i2c_dw_enable(dev, true); 385 385 386 - /* Enable interrupts */ 386 + /* Clear and enable interrupts */ 387 + i2c_dw_clear_int(dev); 387 388 dw_writel(dev, DW_IC_INTR_DEFAULT_MASK, DW_IC_INTR_MASK); 388 389 } 389 390 ··· 449 448 cmd |= BIT(9); 450 449 451 450 if (msgs[dev->msg_write_idx].flags & I2C_M_RD) { 451 + 452 + /* avoid rx buffer overrun */ 453 + if (rx_limit - dev->rx_outstanding <= 0) 454 + break; 455 + 452 456 dw_writel(dev, cmd | 0x100, DW_IC_DATA_CMD); 453 457 rx_limit--; 458 + dev->rx_outstanding++; 454 459 } else 455 460 dw_writel(dev, cmd | *buf++, DW_IC_DATA_CMD); 456 461 tx_limit--; buf_len--; ··· 509 502 510 503 rx_valid = dw_readl(dev, DW_IC_RXFLR); 511 504 512 - for (; len > 0 && rx_valid > 0; len--, rx_valid--) 505 + for (; len > 0 && rx_valid > 0; len--, rx_valid--) { 513 506 *buf++ = dw_readl(dev, DW_IC_DATA_CMD); 507 + dev->rx_outstanding--; 508 + } 514 509 515 510 if (len > 0) { 516 511 dev->status |= STATUS_READ_IN_PROGRESS; ··· 570 561 dev->msg_err = 0; 571 562 dev->status = STATUS_IDLE; 572 563 dev->abort_source = 0; 564 + dev->rx_outstanding = 0; 573 565 574 566 ret = i2c_dw_wait_bus_not_busy(dev); 575 567 if (ret < 0)
+2
drivers/i2c/busses/i2c-designware-core.h
··· 60 60 * @adapter: i2c subsystem adapter node 61 61 * @tx_fifo_depth: depth of the hardware tx fifo 62 62 * @rx_fifo_depth: depth of the hardware rx fifo 63 + * @rx_outstanding: current master-rx elements in tx fifo 63 64 */ 64 65 struct dw_i2c_dev { 65 66 struct device *dev; ··· 89 88 u32 master_cfg; 90 89 unsigned int tx_fifo_depth; 91 90 unsigned int rx_fifo_depth; 91 + int rx_outstanding; 92 92 }; 93 93 94 94 #define ACCESS_SWAP 0x00000001
+1
drivers/i2c/busses/i2c-designware-platdrv.c
··· 69 69 static const struct acpi_device_id dw_i2c_acpi_match[] = { 70 70 { "INT33C2", 0 }, 71 71 { "INT33C3", 0 }, 72 + { "80860F41", 0 }, 72 73 { } 73 74 }; 74 75 MODULE_DEVICE_TABLE(acpi, dw_i2c_acpi_match);
+5 -1
drivers/i2c/busses/i2c-i801.c
··· 231 231 232 232 static unsigned int disable_features; 233 233 module_param(disable_features, uint, S_IRUGO | S_IWUSR); 234 - MODULE_PARM_DESC(disable_features, "Disable selected driver features"); 234 + MODULE_PARM_DESC(disable_features, "Disable selected driver features:\n" 235 + "\t\t 0x01 disable SMBus PEC\n" 236 + "\t\t 0x02 disable the block buffer\n" 237 + "\t\t 0x08 disable the I2C block read functionality\n" 238 + "\t\t 0x10 don't use interrupts "); 235 239 236 240 /* Make sure the SMBus host is ready to start transmitting. 237 241 Return 0 if it is, -EBUSY if it is not. */
+4 -4
drivers/i2c/busses/i2c-mv64xxx.c
··· 252 252 writel(drv_data->cntl_bits, 253 253 drv_data->reg_base + MV64XXX_I2C_REG_CONTROL); 254 254 drv_data->block = 0; 255 - wake_up_interruptible(&drv_data->waitq); 255 + wake_up(&drv_data->waitq); 256 256 break; 257 257 258 258 case MV64XXX_I2C_ACTION_CONTINUE: ··· 300 300 writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_STOP, 301 301 drv_data->reg_base + MV64XXX_I2C_REG_CONTROL); 302 302 drv_data->block = 0; 303 - wake_up_interruptible(&drv_data->waitq); 303 + wake_up(&drv_data->waitq); 304 304 break; 305 305 306 306 case MV64XXX_I2C_ACTION_INVALID: ··· 315 315 writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_STOP, 316 316 drv_data->reg_base + MV64XXX_I2C_REG_CONTROL); 317 317 drv_data->block = 0; 318 - wake_up_interruptible(&drv_data->waitq); 318 + wake_up(&drv_data->waitq); 319 319 break; 320 320 } 321 321 } ··· 381 381 unsigned long flags; 382 382 char abort = 0; 383 383 384 - time_left = wait_event_interruptible_timeout(drv_data->waitq, 384 + time_left = wait_event_timeout(drv_data->waitq, 385 385 !drv_data->block, drv_data->adapter.timeout); 386 386 387 387 spin_lock_irqsave(&drv_data->lock, flags);
+2 -1
drivers/i2c/i2c-core.c
··· 892 892 } 893 893 894 894 static DEVICE_ATTR(new_device, S_IWUSR, NULL, i2c_sysfs_new_device); 895 - static DEVICE_ATTR(delete_device, S_IWUSR, NULL, i2c_sysfs_delete_device); 895 + static DEVICE_ATTR_IGNORE_LOCKDEP(delete_device, S_IWUSR, NULL, 896 + i2c_sysfs_delete_device); 896 897 897 898 static struct attribute *i2c_adapter_attrs[] = { 898 899 &dev_attr_name.attr,