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

Merge tag 'for-6.7-rc1-part2' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux

Pull more i2c updates from Wolfram Sang:
"This contains one patch which slipped through the cracks (iproc), a
core sanitizing improvement as the new memdup_array_user() helper went
upstream (i2c-dev), and two driver bugfixes (designware, cp2615)"

* tag 'for-6.7-rc1-part2' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux:
i2c: cp2615: Fix 'assignment to __be16' warning
i2c: dev: copy userspace array safely
i2c: designware: Disable TX_EMPTY irq while waiting for block length byte
i2c: iproc: handle invalid slave state

+111 -81
+92 -75
drivers/i2c/busses/i2c-bcm-iproc.c
··· 316 316 iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, val); 317 317 } 318 318 319 - static void bcm_iproc_i2c_check_slave_status( 320 - struct bcm_iproc_i2c_dev *iproc_i2c) 319 + static bool bcm_iproc_i2c_check_slave_status 320 + (struct bcm_iproc_i2c_dev *iproc_i2c, u32 status) 321 321 { 322 322 u32 val; 323 + bool recover = false; 323 324 324 - val = iproc_i2c_rd_reg(iproc_i2c, S_CMD_OFFSET); 325 - /* status is valid only when START_BUSY is cleared after it was set */ 326 - if (val & BIT(S_CMD_START_BUSY_SHIFT)) 327 - return; 325 + /* check slave transmit status only if slave is transmitting */ 326 + if (!iproc_i2c->slave_rx_only) { 327 + val = iproc_i2c_rd_reg(iproc_i2c, S_CMD_OFFSET); 328 + /* status is valid only when START_BUSY is cleared */ 329 + if (!(val & BIT(S_CMD_START_BUSY_SHIFT))) { 330 + val = (val >> S_CMD_STATUS_SHIFT) & S_CMD_STATUS_MASK; 331 + if (val == S_CMD_STATUS_TIMEOUT || 332 + val == S_CMD_STATUS_MASTER_ABORT) { 333 + dev_warn(iproc_i2c->device, 334 + (val == S_CMD_STATUS_TIMEOUT) ? 335 + "slave random stretch time timeout\n" : 336 + "Master aborted read transaction\n"); 337 + recover = true; 338 + } 339 + } 340 + } 328 341 329 - val = (val >> S_CMD_STATUS_SHIFT) & S_CMD_STATUS_MASK; 330 - if (val == S_CMD_STATUS_TIMEOUT || val == S_CMD_STATUS_MASTER_ABORT) { 331 - dev_err(iproc_i2c->device, (val == S_CMD_STATUS_TIMEOUT) ? 332 - "slave random stretch time timeout\n" : 333 - "Master aborted read transaction\n"); 342 + /* RX_EVENT is not valid when START_BUSY is set */ 343 + if ((status & BIT(IS_S_RX_EVENT_SHIFT)) && 344 + (status & BIT(IS_S_START_BUSY_SHIFT))) { 345 + dev_warn(iproc_i2c->device, "Slave aborted read transaction\n"); 346 + recover = true; 347 + } 348 + 349 + if (recover) { 334 350 /* re-initialize i2c for recovery */ 335 351 bcm_iproc_i2c_enable_disable(iproc_i2c, false); 336 352 bcm_iproc_i2c_slave_init(iproc_i2c, true); 337 353 bcm_iproc_i2c_enable_disable(iproc_i2c, true); 338 354 } 355 + 356 + return recover; 339 357 } 340 358 341 359 static void bcm_iproc_i2c_slave_read(struct bcm_iproc_i2c_dev *iproc_i2c) ··· 438 420 u32 val; 439 421 u8 value; 440 422 423 + 424 + if (status & BIT(IS_S_TX_UNDERRUN_SHIFT)) { 425 + iproc_i2c->tx_underrun++; 426 + if (iproc_i2c->tx_underrun == 1) 427 + /* Start of SMBUS for Master Read */ 428 + i2c_slave_event(iproc_i2c->slave, 429 + I2C_SLAVE_READ_REQUESTED, 430 + &value); 431 + else 432 + /* Master read other than start */ 433 + i2c_slave_event(iproc_i2c->slave, 434 + I2C_SLAVE_READ_PROCESSED, 435 + &value); 436 + 437 + iproc_i2c_wr_reg(iproc_i2c, S_TX_OFFSET, value); 438 + /* start transfer */ 439 + val = BIT(S_CMD_START_BUSY_SHIFT); 440 + iproc_i2c_wr_reg(iproc_i2c, S_CMD_OFFSET, val); 441 + 442 + /* clear interrupt */ 443 + iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, 444 + BIT(IS_S_TX_UNDERRUN_SHIFT)); 445 + } 446 + 447 + /* Stop received from master in case of master read transaction */ 448 + if (status & BIT(IS_S_START_BUSY_SHIFT)) { 449 + /* 450 + * Disable interrupt for TX FIFO becomes empty and 451 + * less than PKT_LENGTH bytes were output on the SMBUS 452 + */ 453 + iproc_i2c->slave_int_mask &= ~BIT(IE_S_TX_UNDERRUN_SHIFT); 454 + val = iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET); 455 + val &= ~BIT(IE_S_TX_UNDERRUN_SHIFT); 456 + iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, val); 457 + 458 + /* End of SMBUS for Master Read */ 459 + val = BIT(S_TX_WR_STATUS_SHIFT); 460 + iproc_i2c_wr_reg(iproc_i2c, S_TX_OFFSET, val); 461 + 462 + val = BIT(S_CMD_START_BUSY_SHIFT); 463 + iproc_i2c_wr_reg(iproc_i2c, S_CMD_OFFSET, val); 464 + 465 + /* flush TX FIFOs */ 466 + val = iproc_i2c_rd_reg(iproc_i2c, S_FIFO_CTRL_OFFSET); 467 + val |= (BIT(S_FIFO_TX_FLUSH_SHIFT)); 468 + iproc_i2c_wr_reg(iproc_i2c, S_FIFO_CTRL_OFFSET, val); 469 + 470 + i2c_slave_event(iproc_i2c->slave, I2C_SLAVE_STOP, &value); 471 + 472 + /* clear interrupt */ 473 + iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, 474 + BIT(IS_S_START_BUSY_SHIFT)); 475 + } 476 + 477 + /* if the controller has been reset, immediately return from the ISR */ 478 + if (bcm_iproc_i2c_check_slave_status(iproc_i2c, status)) 479 + return true; 480 + 441 481 /* 442 482 * Slave events in case of master-write, master-write-read and, 443 483 * master-read ··· 529 453 /* schedule tasklet to read data later */ 530 454 tasklet_schedule(&iproc_i2c->slave_rx_tasklet); 531 455 532 - /* 533 - * clear only IS_S_RX_EVENT_SHIFT and 534 - * IS_S_RX_FIFO_FULL_SHIFT interrupt. 535 - */ 536 - val = BIT(IS_S_RX_EVENT_SHIFT); 537 - if (status & BIT(IS_S_RX_FIFO_FULL_SHIFT)) 538 - val |= BIT(IS_S_RX_FIFO_FULL_SHIFT); 539 - iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, val); 456 + /* clear IS_S_RX_FIFO_FULL_SHIFT interrupt */ 457 + if (status & BIT(IS_S_RX_FIFO_FULL_SHIFT)) { 458 + val = BIT(IS_S_RX_FIFO_FULL_SHIFT); 459 + iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, val); 460 + } 540 461 } 541 - 542 - if (status & BIT(IS_S_TX_UNDERRUN_SHIFT)) { 543 - iproc_i2c->tx_underrun++; 544 - if (iproc_i2c->tx_underrun == 1) 545 - /* Start of SMBUS for Master Read */ 546 - i2c_slave_event(iproc_i2c->slave, 547 - I2C_SLAVE_READ_REQUESTED, 548 - &value); 549 - else 550 - /* Master read other than start */ 551 - i2c_slave_event(iproc_i2c->slave, 552 - I2C_SLAVE_READ_PROCESSED, 553 - &value); 554 - 555 - iproc_i2c_wr_reg(iproc_i2c, S_TX_OFFSET, value); 556 - /* start transfer */ 557 - val = BIT(S_CMD_START_BUSY_SHIFT); 558 - iproc_i2c_wr_reg(iproc_i2c, S_CMD_OFFSET, val); 559 - 560 - /* clear interrupt */ 561 - iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, 562 - BIT(IS_S_TX_UNDERRUN_SHIFT)); 563 - } 564 - 565 - /* Stop received from master in case of master read transaction */ 566 - if (status & BIT(IS_S_START_BUSY_SHIFT)) { 567 - /* 568 - * Disable interrupt for TX FIFO becomes empty and 569 - * less than PKT_LENGTH bytes were output on the SMBUS 570 - */ 571 - iproc_i2c->slave_int_mask &= ~BIT(IE_S_TX_UNDERRUN_SHIFT); 572 - iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, 573 - iproc_i2c->slave_int_mask); 574 - 575 - /* End of SMBUS for Master Read */ 576 - val = BIT(S_TX_WR_STATUS_SHIFT); 577 - iproc_i2c_wr_reg(iproc_i2c, S_TX_OFFSET, val); 578 - 579 - val = BIT(S_CMD_START_BUSY_SHIFT); 580 - iproc_i2c_wr_reg(iproc_i2c, S_CMD_OFFSET, val); 581 - 582 - /* flush TX FIFOs */ 583 - val = iproc_i2c_rd_reg(iproc_i2c, S_FIFO_CTRL_OFFSET); 584 - val |= (BIT(S_FIFO_TX_FLUSH_SHIFT)); 585 - iproc_i2c_wr_reg(iproc_i2c, S_FIFO_CTRL_OFFSET, val); 586 - 587 - i2c_slave_event(iproc_i2c->slave, I2C_SLAVE_STOP, &value); 588 - 589 - /* clear interrupt */ 590 - iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, 591 - BIT(IS_S_START_BUSY_SHIFT)); 592 - } 593 - 594 - /* check slave transmit status only if slave is transmitting */ 595 - if (!iproc_i2c->slave_rx_only) 596 - bcm_iproc_i2c_check_slave_status(iproc_i2c); 597 462 598 463 return true; 599 464 }
+1 -1
drivers/i2c/busses/i2c-cp2615.c
··· 85 85 if (!ret) 86 86 return -EINVAL; 87 87 88 - ret->preamble = 0x2A2A; 88 + ret->preamble = htons(0x2A2AU); 89 89 ret->length = htons(data_len + 6); 90 90 ret->msg = htons(msg); 91 91 if (data && data_len)
+16 -3
drivers/i2c/busses/i2c-designware-master.c
··· 519 519 520 520 /* 521 521 * Because we don't know the buffer length in the 522 - * I2C_FUNC_SMBUS_BLOCK_DATA case, we can't stop 523 - * the transaction here. 522 + * I2C_FUNC_SMBUS_BLOCK_DATA case, we can't stop the 523 + * transaction here. Also disable the TX_EMPTY IRQ 524 + * while waiting for the data length byte to avoid the 525 + * bogus interrupts flood. 524 526 */ 525 - if (buf_len > 0 || flags & I2C_M_RECV_LEN) { 527 + if (flags & I2C_M_RECV_LEN) { 528 + dev->status |= STATUS_WRITE_IN_PROGRESS; 529 + intr_mask &= ~DW_IC_INTR_TX_EMPTY; 530 + break; 531 + } else if (buf_len > 0) { 526 532 /* more bytes to be written */ 527 533 dev->status |= STATUS_WRITE_IN_PROGRESS; 528 534 break; ··· 563 557 dev->tx_buf_len = len - min_t(u8, len, dev->rx_outstanding); 564 558 msgs[dev->msg_read_idx].len = len; 565 559 msgs[dev->msg_read_idx].flags &= ~I2C_M_RECV_LEN; 560 + 561 + /* 562 + * Received buffer length, re-enable TX_EMPTY interrupt 563 + * to resume the SMBUS transaction. 564 + */ 565 + regmap_update_bits(dev->map, DW_IC_INTR_MASK, DW_IC_INTR_TX_EMPTY, 566 + DW_IC_INTR_TX_EMPTY); 566 567 567 568 return len; 568 569 }
+2 -2
drivers/i2c/i2c-dev.c
··· 450 450 if (rdwr_arg.nmsgs > I2C_RDWR_IOCTL_MAX_MSGS) 451 451 return -EINVAL; 452 452 453 - rdwr_pa = memdup_user(rdwr_arg.msgs, 454 - rdwr_arg.nmsgs * sizeof(struct i2c_msg)); 453 + rdwr_pa = memdup_array_user(rdwr_arg.msgs, 454 + rdwr_arg.nmsgs, sizeof(struct i2c_msg)); 455 455 if (IS_ERR(rdwr_pa)) 456 456 return PTR_ERR(rdwr_pa); 457 457