Skip to content

Commit 055d8d9

Browse files
committed
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
2 parents 40fa916 + 9ce7610 commit 055d8d9

File tree

4 files changed

+23
-6
lines changed

4 files changed

+23
-6
lines changed

drivers/i2c/busses/i2c-designware-master.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@ static void i2c_dw_configure_fifo_master(struct dw_i2c_dev *dev)
3434

3535
static int i2c_dw_set_timings_master(struct dw_i2c_dev *dev)
3636
{
37-
u32 ic_clk = i2c_dw_clk_rate(dev);
3837
const char *mode_str, *fp_str = "";
3938
u32 comp_param1;
4039
u32 sda_falling_time, scl_falling_time;
4140
struct i2c_timings *t = &dev->timings;
41+
u32 ic_clk;
4242
int ret;
4343

4444
ret = i2c_dw_acquire_lock(dev);
@@ -53,6 +53,7 @@ static int i2c_dw_set_timings_master(struct dw_i2c_dev *dev)
5353

5454
/* Calculate SCL timing parameters for standard mode if not set */
5555
if (!dev->ss_hcnt || !dev->ss_lcnt) {
56+
ic_clk = i2c_dw_clk_rate(dev);
5657
dev->ss_hcnt =
5758
i2c_dw_scl_hcnt(ic_clk,
5859
4000, /* tHD;STA = tHIGH = 4.0 us */
@@ -89,6 +90,7 @@ static int i2c_dw_set_timings_master(struct dw_i2c_dev *dev)
8990
* needed also in high speed mode.
9091
*/
9192
if (!dev->fs_hcnt || !dev->fs_lcnt) {
93+
ic_clk = i2c_dw_clk_rate(dev);
9294
dev->fs_hcnt =
9395
i2c_dw_scl_hcnt(ic_clk,
9496
600, /* tHD;STA = tHIGH = 0.6 us */

drivers/i2c/busses/i2c-isch.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ static s32 sch_access(struct i2c_adapter *adap, u16 addr,
164164
* run ~75 kHz instead which should do no harm.
165165
*/
166166
dev_notice(&sch_adapter.dev,
167-
"Clock divider unitialized. Setting defaults\n");
167+
"Clock divider uninitialized. Setting defaults\n");
168168
outw(backbone_speed / (4 * 100), SMBHSTCLK);
169169
}
170170

drivers/i2c/busses/i2c-qcom-geni.c

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -367,20 +367,26 @@ static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
367367
dma_addr_t rx_dma;
368368
enum geni_se_xfer_mode mode;
369369
unsigned long time_left = XFER_TIMEOUT;
370+
void *dma_buf;
370371

371372
gi2c->cur = msg;
372-
mode = msg->len > 32 ? GENI_SE_DMA : GENI_SE_FIFO;
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+
373378
geni_se_select_mode(&gi2c->se, mode);
374379
writel_relaxed(msg->len, gi2c->se.base + SE_I2C_RX_TRANS_LEN);
375380
geni_se_setup_m_cmd(&gi2c->se, I2C_READ, m_param);
376381
if (mode == GENI_SE_DMA) {
377382
int ret;
378383

379-
ret = geni_se_rx_dma_prep(&gi2c->se, msg->buf, msg->len,
384+
ret = geni_se_rx_dma_prep(&gi2c->se, dma_buf, msg->len,
380385
&rx_dma);
381386
if (ret) {
382387
mode = GENI_SE_FIFO;
383388
geni_se_select_mode(&gi2c->se, mode);
389+
i2c_put_dma_safe_msg_buf(dma_buf, msg, false);
384390
}
385391
}
386392

@@ -393,6 +399,7 @@ static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
393399
if (gi2c->err)
394400
geni_i2c_rx_fsm_rst(gi2c);
395401
geni_se_rx_dma_unprep(&gi2c->se, rx_dma, msg->len);
402+
i2c_put_dma_safe_msg_buf(dma_buf, msg, !gi2c->err);
396403
}
397404
return gi2c->err;
398405
}
@@ -403,20 +410,26 @@ static int geni_i2c_tx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
403410
dma_addr_t tx_dma;
404411
enum geni_se_xfer_mode mode;
405412
unsigned long time_left;
413+
void *dma_buf;
406414

407415
gi2c->cur = msg;
408-
mode = msg->len > 32 ? GENI_SE_DMA : GENI_SE_FIFO;
416+
mode = GENI_SE_FIFO;
417+
dma_buf = i2c_get_dma_safe_msg_buf(msg, 32);
418+
if (dma_buf)
419+
mode = GENI_SE_DMA;
420+
409421
geni_se_select_mode(&gi2c->se, mode);
410422
writel_relaxed(msg->len, gi2c->se.base + SE_I2C_TX_TRANS_LEN);
411423
geni_se_setup_m_cmd(&gi2c->se, I2C_WRITE, m_param);
412424
if (mode == GENI_SE_DMA) {
413425
int ret;
414426

415-
ret = geni_se_tx_dma_prep(&gi2c->se, msg->buf, msg->len,
427+
ret = geni_se_tx_dma_prep(&gi2c->se, dma_buf, msg->len,
416428
&tx_dma);
417429
if (ret) {
418430
mode = GENI_SE_FIFO;
419431
geni_se_select_mode(&gi2c->se, mode);
432+
i2c_put_dma_safe_msg_buf(dma_buf, msg, false);
420433
}
421434
}
422435

@@ -432,6 +445,7 @@ static int geni_i2c_tx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
432445
if (gi2c->err)
433446
geni_i2c_tx_fsm_rst(gi2c);
434447
geni_se_tx_dma_unprep(&gi2c->se, tx_dma, msg->len);
448+
i2c_put_dma_safe_msg_buf(dma_buf, msg, !gi2c->err);
435449
}
436450
return gi2c->err;
437451
}

drivers/i2c/busses/i2c-scmi.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ acpi_smbus_cmi_access(struct i2c_adapter *adap, u16 addr, unsigned short flags,
152152
mt_params[3].type = ACPI_TYPE_INTEGER;
153153
mt_params[3].integer.value = len;
154154
mt_params[4].type = ACPI_TYPE_BUFFER;
155+
mt_params[4].buffer.length = len;
155156
mt_params[4].buffer.pointer = data->block + 1;
156157
}
157158
break;

0 commit comments

Comments
 (0)