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

Wolfram writes:
"i2c for 4.19

I2C has three driver bugfixes and a fix for a typo for you."

* 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux:
i2c: designware: Call i2c_dw_clk_rate() only when calculating timings
i2c: i2c-scmi: fix for i2c_smbus_write_block_data
i2c: i2c-isch: fix spelling mistake "unitialized" -> "uninitialized"
i2c: i2c-qcom-geni: Properly handle DMA safe buffers

+23 -6
+3 -1
drivers/i2c/busses/i2c-designware-master.c
··· 34 35 static int i2c_dw_set_timings_master(struct dw_i2c_dev *dev) 36 { 37 - u32 ic_clk = i2c_dw_clk_rate(dev); 38 const char *mode_str, *fp_str = ""; 39 u32 comp_param1; 40 u32 sda_falling_time, scl_falling_time; 41 struct i2c_timings *t = &dev->timings; 42 int ret; 43 44 ret = i2c_dw_acquire_lock(dev); ··· 53 54 /* Calculate SCL timing parameters for standard mode if not set */ 55 if (!dev->ss_hcnt || !dev->ss_lcnt) { 56 dev->ss_hcnt = 57 i2c_dw_scl_hcnt(ic_clk, 58 4000, /* tHD;STA = tHIGH = 4.0 us */ ··· 90 * needed also in high speed mode. 91 */ 92 if (!dev->fs_hcnt || !dev->fs_lcnt) { 93 dev->fs_hcnt = 94 i2c_dw_scl_hcnt(ic_clk, 95 600, /* tHD;STA = tHIGH = 0.6 us */
··· 34 35 static int i2c_dw_set_timings_master(struct dw_i2c_dev *dev) 36 { 37 const char *mode_str, *fp_str = ""; 38 u32 comp_param1; 39 u32 sda_falling_time, scl_falling_time; 40 struct i2c_timings *t = &dev->timings; 41 + u32 ic_clk; 42 int ret; 43 44 ret = i2c_dw_acquire_lock(dev); ··· 53 54 /* Calculate SCL timing parameters for standard mode if not set */ 55 if (!dev->ss_hcnt || !dev->ss_lcnt) { 56 + ic_clk = i2c_dw_clk_rate(dev); 57 dev->ss_hcnt = 58 i2c_dw_scl_hcnt(ic_clk, 59 4000, /* tHD;STA = tHIGH = 4.0 us */ ··· 89 * needed also in high speed mode. 90 */ 91 if (!dev->fs_hcnt || !dev->fs_lcnt) { 92 + ic_clk = i2c_dw_clk_rate(dev); 93 dev->fs_hcnt = 94 i2c_dw_scl_hcnt(ic_clk, 95 600, /* tHD;STA = tHIGH = 0.6 us */
+1 -1
drivers/i2c/busses/i2c-isch.c
··· 164 * run ~75 kHz instead which should do no harm. 165 */ 166 dev_notice(&sch_adapter.dev, 167 - "Clock divider unitialized. Setting defaults\n"); 168 outw(backbone_speed / (4 * 100), SMBHSTCLK); 169 } 170
··· 164 * run ~75 kHz instead which should do no harm. 165 */ 166 dev_notice(&sch_adapter.dev, 167 + "Clock divider uninitialized. Setting defaults\n"); 168 outw(backbone_speed / (4 * 100), SMBHSTCLK); 169 } 170
+18 -4
drivers/i2c/busses/i2c-qcom-geni.c
··· 367 dma_addr_t rx_dma; 368 enum geni_se_xfer_mode mode; 369 unsigned long time_left = XFER_TIMEOUT; 370 371 gi2c->cur = msg; 372 - mode = msg->len > 32 ? GENI_SE_DMA : GENI_SE_FIFO; 373 geni_se_select_mode(&gi2c->se, mode); 374 writel_relaxed(msg->len, gi2c->se.base + SE_I2C_RX_TRANS_LEN); 375 geni_se_setup_m_cmd(&gi2c->se, I2C_READ, m_param); 376 if (mode == GENI_SE_DMA) { 377 int ret; 378 379 - ret = geni_se_rx_dma_prep(&gi2c->se, msg->buf, msg->len, 380 &rx_dma); 381 if (ret) { 382 mode = GENI_SE_FIFO; 383 geni_se_select_mode(&gi2c->se, mode); 384 } 385 } 386 ··· 399 if (gi2c->err) 400 geni_i2c_rx_fsm_rst(gi2c); 401 geni_se_rx_dma_unprep(&gi2c->se, rx_dma, msg->len); 402 } 403 return gi2c->err; 404 } ··· 410 dma_addr_t tx_dma; 411 enum geni_se_xfer_mode mode; 412 unsigned long time_left; 413 414 gi2c->cur = msg; 415 - mode = msg->len > 32 ? GENI_SE_DMA : GENI_SE_FIFO; 416 geni_se_select_mode(&gi2c->se, mode); 417 writel_relaxed(msg->len, gi2c->se.base + SE_I2C_TX_TRANS_LEN); 418 geni_se_setup_m_cmd(&gi2c->se, I2C_WRITE, m_param); 419 if (mode == GENI_SE_DMA) { 420 int ret; 421 422 - ret = geni_se_tx_dma_prep(&gi2c->se, msg->buf, msg->len, 423 &tx_dma); 424 if (ret) { 425 mode = GENI_SE_FIFO; 426 geni_se_select_mode(&gi2c->se, mode); 427 } 428 } 429 ··· 445 if (gi2c->err) 446 geni_i2c_tx_fsm_rst(gi2c); 447 geni_se_tx_dma_unprep(&gi2c->se, tx_dma, msg->len); 448 } 449 return gi2c->err; 450 }
··· 367 dma_addr_t rx_dma; 368 enum geni_se_xfer_mode mode; 369 unsigned long time_left = XFER_TIMEOUT; 370 + void *dma_buf; 371 372 gi2c->cur = msg; 373 + mode = GENI_SE_FIFO; 374 + dma_buf = i2c_get_dma_safe_msg_buf(msg, 32); 375 + if (dma_buf) 376 + mode = GENI_SE_DMA; 377 + 378 geni_se_select_mode(&gi2c->se, mode); 379 writel_relaxed(msg->len, gi2c->se.base + SE_I2C_RX_TRANS_LEN); 380 geni_se_setup_m_cmd(&gi2c->se, I2C_READ, m_param); 381 if (mode == GENI_SE_DMA) { 382 int ret; 383 384 + ret = geni_se_rx_dma_prep(&gi2c->se, dma_buf, msg->len, 385 &rx_dma); 386 if (ret) { 387 mode = GENI_SE_FIFO; 388 geni_se_select_mode(&gi2c->se, mode); 389 + i2c_put_dma_safe_msg_buf(dma_buf, msg, false); 390 } 391 } 392 ··· 393 if (gi2c->err) 394 geni_i2c_rx_fsm_rst(gi2c); 395 geni_se_rx_dma_unprep(&gi2c->se, rx_dma, msg->len); 396 + i2c_put_dma_safe_msg_buf(dma_buf, msg, !gi2c->err); 397 } 398 return gi2c->err; 399 } ··· 403 dma_addr_t tx_dma; 404 enum geni_se_xfer_mode mode; 405 unsigned long time_left; 406 + void *dma_buf; 407 408 gi2c->cur = msg; 409 + mode = GENI_SE_FIFO; 410 + dma_buf = i2c_get_dma_safe_msg_buf(msg, 32); 411 + if (dma_buf) 412 + mode = GENI_SE_DMA; 413 + 414 geni_se_select_mode(&gi2c->se, mode); 415 writel_relaxed(msg->len, gi2c->se.base + SE_I2C_TX_TRANS_LEN); 416 geni_se_setup_m_cmd(&gi2c->se, I2C_WRITE, m_param); 417 if (mode == GENI_SE_DMA) { 418 int ret; 419 420 + ret = geni_se_tx_dma_prep(&gi2c->se, dma_buf, msg->len, 421 &tx_dma); 422 if (ret) { 423 mode = GENI_SE_FIFO; 424 geni_se_select_mode(&gi2c->se, mode); 425 + i2c_put_dma_safe_msg_buf(dma_buf, msg, false); 426 } 427 } 428 ··· 432 if (gi2c->err) 433 geni_i2c_tx_fsm_rst(gi2c); 434 geni_se_tx_dma_unprep(&gi2c->se, tx_dma, msg->len); 435 + i2c_put_dma_safe_msg_buf(dma_buf, msg, !gi2c->err); 436 } 437 return gi2c->err; 438 }
+1
drivers/i2c/busses/i2c-scmi.c
··· 152 mt_params[3].type = ACPI_TYPE_INTEGER; 153 mt_params[3].integer.value = len; 154 mt_params[4].type = ACPI_TYPE_BUFFER; 155 mt_params[4].buffer.pointer = data->block + 1; 156 } 157 break;
··· 152 mt_params[3].type = ACPI_TYPE_INTEGER; 153 mt_params[3].integer.value = len; 154 mt_params[4].type = ACPI_TYPE_BUFFER; 155 + mt_params[4].buffer.length = len; 156 mt_params[4].buffer.pointer = data->block + 1; 157 } 158 break;