diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-10-29 17:44:03 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-10-29 17:44:03 -0400 |
commit | 57dbde63f2888af1be5111d369d124f4e659c0f8 (patch) | |
tree | 52b8e66f1f45f7076c2f65da56e78b0830efcfc6 /drivers | |
parent | 134bf98c5596605af90f104716ef912e8f7eb56b (diff) | |
parent | 84de6e96e036dcfb18dded04a506b1dd72ba0e5b (diff) |
Merge branch 'i2c/for-4.20' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
Pull i2c updates from Wolfram Sang:
"I2C has not so much stuff this time. Mostly driver enablement for new
SoCs, some driver bugfixes, and some cleanups"
* 'i2c/for-4.20' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux: (35 commits)
MAINTAINERS: add maintainer for Renesas RIIC driver
i2c: sh_mobile: Remove dummy runtime PM callbacks
i2c: uniphier-f: fix race condition when IRQ is cleared
i2c: uniphier-f: fix occasional timeout error
i2c: uniphier-f: make driver robust against concurrency
i2c: i2c-qcom-geni: Simplify irq handler
i2c: i2c-qcom-geni: Simplify tx/rx functions
i2c: designware: Set IRQF_NO_SUSPEND flag for all BYT and CHT controllers
i2c: mux: mlxcpld: simplify code to reach the adapter
i2c: mux: ltc4306: simplify code to reach the adapter
i2c: mux: pca954x: simplify code to reach the adapter
i2c: core: remove level of indentation in i2c_transfer
i2c: core: remove outdated DEBUG output
i2c: zx2967: use core to detect 'no zero length' quirk
i2c: tegra: use core to detect 'no zero length' quirk
i2c: qup: use core to detect 'no zero length' quirk
i2c: omap: use core to detect 'no zero length' quirk
i2c: Convert to using %pOFn instead of device_node.name
i2c: brcmstb: Allow enabling the driver on DSL SoCs
eeprom: at24: fix unexpected timeout under high load
...
Diffstat (limited to 'drivers')
23 files changed, 435 insertions, 319 deletions
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index 451d4ae50e66..56ccb1ea7da5 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig | |||
@@ -432,12 +432,13 @@ config I2C_BCM_KONA | |||
432 | If you do not need KONA I2C interface, say N. | 432 | If you do not need KONA I2C interface, say N. |
433 | 433 | ||
434 | config I2C_BRCMSTB | 434 | config I2C_BRCMSTB |
435 | tristate "BRCM Settop I2C controller" | 435 | tristate "BRCM Settop/DSL I2C controller" |
436 | depends on ARCH_BRCMSTB || BMIPS_GENERIC || COMPILE_TEST | 436 | depends on ARCH_BRCMSTB || BMIPS_GENERIC || ARCH_BCM_63XX || \ |
437 | COMPILE_TEST | ||
437 | default y | 438 | default y |
438 | help | 439 | help |
439 | If you say yes to this option, support will be included for the | 440 | If you say yes to this option, support will be included for the |
440 | I2C interface on the Broadcom Settop SoCs. | 441 | I2C interface on the Broadcom Settop/DSL SoCs. |
441 | 442 | ||
442 | If you do not need I2C interface, say N. | 443 | If you do not need I2C interface, say N. |
443 | 444 | ||
diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c index a4f956c6d567..8dc9161ced38 100644 --- a/drivers/i2c/busses/i2c-aspeed.c +++ b/drivers/i2c/busses/i2c-aspeed.c | |||
@@ -82,6 +82,11 @@ | |||
82 | #define ASPEED_I2CD_INTR_RX_DONE BIT(2) | 82 | #define ASPEED_I2CD_INTR_RX_DONE BIT(2) |
83 | #define ASPEED_I2CD_INTR_TX_NAK BIT(1) | 83 | #define ASPEED_I2CD_INTR_TX_NAK BIT(1) |
84 | #define ASPEED_I2CD_INTR_TX_ACK BIT(0) | 84 | #define ASPEED_I2CD_INTR_TX_ACK BIT(0) |
85 | #define ASPEED_I2CD_INTR_MASTER_ERRORS \ | ||
86 | (ASPEED_I2CD_INTR_SDA_DL_TIMEOUT | \ | ||
87 | ASPEED_I2CD_INTR_SCL_TIMEOUT | \ | ||
88 | ASPEED_I2CD_INTR_ABNORMAL | \ | ||
89 | ASPEED_I2CD_INTR_ARBIT_LOSS) | ||
85 | #define ASPEED_I2CD_INTR_ALL \ | 90 | #define ASPEED_I2CD_INTR_ALL \ |
86 | (ASPEED_I2CD_INTR_SDA_DL_TIMEOUT | \ | 91 | (ASPEED_I2CD_INTR_SDA_DL_TIMEOUT | \ |
87 | ASPEED_I2CD_INTR_BUS_RECOVER_DONE | \ | 92 | ASPEED_I2CD_INTR_BUS_RECOVER_DONE | \ |
@@ -137,7 +142,8 @@ struct aspeed_i2c_bus { | |||
137 | /* Synchronizes I/O mem access to base. */ | 142 | /* Synchronizes I/O mem access to base. */ |
138 | spinlock_t lock; | 143 | spinlock_t lock; |
139 | struct completion cmd_complete; | 144 | struct completion cmd_complete; |
140 | u32 (*get_clk_reg_val)(u32 divisor); | 145 | u32 (*get_clk_reg_val)(struct device *dev, |
146 | u32 divisor); | ||
141 | unsigned long parent_clk_frequency; | 147 | unsigned long parent_clk_frequency; |
142 | u32 bus_frequency; | 148 | u32 bus_frequency; |
143 | /* Transaction state. */ | 149 | /* Transaction state. */ |
@@ -227,32 +233,26 @@ reset_out: | |||
227 | } | 233 | } |
228 | 234 | ||
229 | #if IS_ENABLED(CONFIG_I2C_SLAVE) | 235 | #if IS_ENABLED(CONFIG_I2C_SLAVE) |
230 | static bool aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus) | 236 | static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) |
231 | { | 237 | { |
232 | u32 command, irq_status, status_ack = 0; | 238 | u32 command, irq_handled = 0; |
233 | struct i2c_client *slave = bus->slave; | 239 | struct i2c_client *slave = bus->slave; |
234 | bool irq_handled = true; | ||
235 | u8 value; | 240 | u8 value; |
236 | 241 | ||
237 | if (!slave) { | 242 | if (!slave) |
238 | irq_handled = false; | 243 | return 0; |
239 | goto out; | ||
240 | } | ||
241 | 244 | ||
242 | command = readl(bus->base + ASPEED_I2C_CMD_REG); | 245 | command = readl(bus->base + ASPEED_I2C_CMD_REG); |
243 | irq_status = readl(bus->base + ASPEED_I2C_INTR_STS_REG); | ||
244 | 246 | ||
245 | /* Slave was requested, restart state machine. */ | 247 | /* Slave was requested, restart state machine. */ |
246 | if (irq_status & ASPEED_I2CD_INTR_SLAVE_MATCH) { | 248 | if (irq_status & ASPEED_I2CD_INTR_SLAVE_MATCH) { |
247 | status_ack |= ASPEED_I2CD_INTR_SLAVE_MATCH; | 249 | irq_handled |= ASPEED_I2CD_INTR_SLAVE_MATCH; |
248 | bus->slave_state = ASPEED_I2C_SLAVE_START; | 250 | bus->slave_state = ASPEED_I2C_SLAVE_START; |
249 | } | 251 | } |
250 | 252 | ||
251 | /* Slave is not currently active, irq was for someone else. */ | 253 | /* Slave is not currently active, irq was for someone else. */ |
252 | if (bus->slave_state == ASPEED_I2C_SLAVE_STOP) { | 254 | if (bus->slave_state == ASPEED_I2C_SLAVE_STOP) |
253 | irq_handled = false; | 255 | return irq_handled; |
254 | goto out; | ||
255 | } | ||
256 | 256 | ||
257 | dev_dbg(bus->dev, "slave irq status 0x%08x, cmd 0x%08x\n", | 257 | dev_dbg(bus->dev, "slave irq status 0x%08x, cmd 0x%08x\n", |
258 | irq_status, command); | 258 | irq_status, command); |
@@ -269,31 +269,31 @@ static bool aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus) | |||
269 | bus->slave_state = | 269 | bus->slave_state = |
270 | ASPEED_I2C_SLAVE_WRITE_REQUESTED; | 270 | ASPEED_I2C_SLAVE_WRITE_REQUESTED; |
271 | } | 271 | } |
272 | status_ack |= ASPEED_I2CD_INTR_RX_DONE; | 272 | irq_handled |= ASPEED_I2CD_INTR_RX_DONE; |
273 | } | 273 | } |
274 | 274 | ||
275 | /* Slave was asked to stop. */ | 275 | /* Slave was asked to stop. */ |
276 | if (irq_status & ASPEED_I2CD_INTR_NORMAL_STOP) { | 276 | if (irq_status & ASPEED_I2CD_INTR_NORMAL_STOP) { |
277 | status_ack |= ASPEED_I2CD_INTR_NORMAL_STOP; | 277 | irq_handled |= ASPEED_I2CD_INTR_NORMAL_STOP; |
278 | bus->slave_state = ASPEED_I2C_SLAVE_STOP; | 278 | bus->slave_state = ASPEED_I2C_SLAVE_STOP; |
279 | } | 279 | } |
280 | if (irq_status & ASPEED_I2CD_INTR_TX_NAK) { | 280 | if (irq_status & ASPEED_I2CD_INTR_TX_NAK) { |
281 | status_ack |= ASPEED_I2CD_INTR_TX_NAK; | 281 | irq_handled |= ASPEED_I2CD_INTR_TX_NAK; |
282 | bus->slave_state = ASPEED_I2C_SLAVE_STOP; | 282 | bus->slave_state = ASPEED_I2C_SLAVE_STOP; |
283 | } | 283 | } |
284 | if (irq_status & ASPEED_I2CD_INTR_TX_ACK) | ||
285 | irq_handled |= ASPEED_I2CD_INTR_TX_ACK; | ||
284 | 286 | ||
285 | switch (bus->slave_state) { | 287 | switch (bus->slave_state) { |
286 | case ASPEED_I2C_SLAVE_READ_REQUESTED: | 288 | case ASPEED_I2C_SLAVE_READ_REQUESTED: |
287 | if (irq_status & ASPEED_I2CD_INTR_TX_ACK) | 289 | if (irq_status & ASPEED_I2CD_INTR_TX_ACK) |
288 | dev_err(bus->dev, "Unexpected ACK on read request.\n"); | 290 | dev_err(bus->dev, "Unexpected ACK on read request.\n"); |
289 | bus->slave_state = ASPEED_I2C_SLAVE_READ_PROCESSED; | 291 | bus->slave_state = ASPEED_I2C_SLAVE_READ_PROCESSED; |
290 | |||
291 | i2c_slave_event(slave, I2C_SLAVE_READ_REQUESTED, &value); | 292 | i2c_slave_event(slave, I2C_SLAVE_READ_REQUESTED, &value); |
292 | writel(value, bus->base + ASPEED_I2C_BYTE_BUF_REG); | 293 | writel(value, bus->base + ASPEED_I2C_BYTE_BUF_REG); |
293 | writel(ASPEED_I2CD_S_TX_CMD, bus->base + ASPEED_I2C_CMD_REG); | 294 | writel(ASPEED_I2CD_S_TX_CMD, bus->base + ASPEED_I2C_CMD_REG); |
294 | break; | 295 | break; |
295 | case ASPEED_I2C_SLAVE_READ_PROCESSED: | 296 | case ASPEED_I2C_SLAVE_READ_PROCESSED: |
296 | status_ack |= ASPEED_I2CD_INTR_TX_ACK; | ||
297 | if (!(irq_status & ASPEED_I2CD_INTR_TX_ACK)) | 297 | if (!(irq_status & ASPEED_I2CD_INTR_TX_ACK)) |
298 | dev_err(bus->dev, | 298 | dev_err(bus->dev, |
299 | "Expected ACK after processed read.\n"); | 299 | "Expected ACK after processed read.\n"); |
@@ -317,13 +317,6 @@ static bool aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus) | |||
317 | break; | 317 | break; |
318 | } | 318 | } |
319 | 319 | ||
320 | if (status_ack != irq_status) | ||
321 | dev_err(bus->dev, | ||
322 | "irq handled != irq. expected %x, but was %x\n", | ||
323 | irq_status, status_ack); | ||
324 | writel(status_ack, bus->base + ASPEED_I2C_INTR_STS_REG); | ||
325 | |||
326 | out: | ||
327 | return irq_handled; | 320 | return irq_handled; |
328 | } | 321 | } |
329 | #endif /* CONFIG_I2C_SLAVE */ | 322 | #endif /* CONFIG_I2C_SLAVE */ |
@@ -380,21 +373,21 @@ static int aspeed_i2c_is_irq_error(u32 irq_status) | |||
380 | return 0; | 373 | return 0; |
381 | } | 374 | } |
382 | 375 | ||
383 | static bool aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus) | 376 | static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) |
384 | { | 377 | { |
385 | u32 irq_status, status_ack = 0, command = 0; | 378 | u32 irq_handled = 0, command = 0; |
386 | struct i2c_msg *msg; | 379 | struct i2c_msg *msg; |
387 | u8 recv_byte; | 380 | u8 recv_byte; |
388 | int ret; | 381 | int ret; |
389 | 382 | ||
390 | irq_status = readl(bus->base + ASPEED_I2C_INTR_STS_REG); | ||
391 | /* Ack all interrupt bits. */ | ||
392 | writel(irq_status, bus->base + ASPEED_I2C_INTR_STS_REG); | ||
393 | |||
394 | if (irq_status & ASPEED_I2CD_INTR_BUS_RECOVER_DONE) { | 383 | if (irq_status & ASPEED_I2CD_INTR_BUS_RECOVER_DONE) { |
395 | bus->master_state = ASPEED_I2C_MASTER_INACTIVE; | 384 | bus->master_state = ASPEED_I2C_MASTER_INACTIVE; |
396 | status_ack |= ASPEED_I2CD_INTR_BUS_RECOVER_DONE; | 385 | irq_handled |= ASPEED_I2CD_INTR_BUS_RECOVER_DONE; |
397 | goto out_complete; | 386 | goto out_complete; |
387 | } else { | ||
388 | /* Master is not currently active, irq was for someone else. */ | ||
389 | if (bus->master_state == ASPEED_I2C_MASTER_INACTIVE) | ||
390 | goto out_no_complete; | ||
398 | } | 391 | } |
399 | 392 | ||
400 | /* | 393 | /* |
@@ -403,19 +396,22 @@ static bool aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus) | |||
403 | * INACTIVE state. | 396 | * INACTIVE state. |
404 | */ | 397 | */ |
405 | ret = aspeed_i2c_is_irq_error(irq_status); | 398 | ret = aspeed_i2c_is_irq_error(irq_status); |
406 | if (ret < 0) { | 399 | if (ret) { |
407 | dev_dbg(bus->dev, "received error interrupt: 0x%08x\n", | 400 | dev_dbg(bus->dev, "received error interrupt: 0x%08x\n", |
408 | irq_status); | 401 | irq_status); |
409 | bus->cmd_err = ret; | 402 | bus->cmd_err = ret; |
410 | bus->master_state = ASPEED_I2C_MASTER_INACTIVE; | 403 | bus->master_state = ASPEED_I2C_MASTER_INACTIVE; |
404 | irq_handled |= (irq_status & ASPEED_I2CD_INTR_MASTER_ERRORS); | ||
411 | goto out_complete; | 405 | goto out_complete; |
412 | } | 406 | } |
413 | 407 | ||
414 | /* We are in an invalid state; reset bus to a known state. */ | 408 | /* We are in an invalid state; reset bus to a known state. */ |
415 | if (!bus->msgs) { | 409 | if (!bus->msgs) { |
416 | dev_err(bus->dev, "bus in unknown state\n"); | 410 | dev_err(bus->dev, "bus in unknown state. irq_status: 0x%x\n", |
411 | irq_status); | ||
417 | bus->cmd_err = -EIO; | 412 | bus->cmd_err = -EIO; |
418 | if (bus->master_state != ASPEED_I2C_MASTER_STOP) | 413 | if (bus->master_state != ASPEED_I2C_MASTER_STOP && |
414 | bus->master_state != ASPEED_I2C_MASTER_INACTIVE) | ||
419 | aspeed_i2c_do_stop(bus); | 415 | aspeed_i2c_do_stop(bus); |
420 | goto out_no_complete; | 416 | goto out_no_complete; |
421 | } | 417 | } |
@@ -428,13 +424,18 @@ static bool aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus) | |||
428 | */ | 424 | */ |
429 | if (bus->master_state == ASPEED_I2C_MASTER_START) { | 425 | if (bus->master_state == ASPEED_I2C_MASTER_START) { |
430 | if (unlikely(!(irq_status & ASPEED_I2CD_INTR_TX_ACK))) { | 426 | if (unlikely(!(irq_status & ASPEED_I2CD_INTR_TX_ACK))) { |
427 | if (unlikely(!(irq_status & ASPEED_I2CD_INTR_TX_NAK))) { | ||
428 | bus->cmd_err = -ENXIO; | ||
429 | bus->master_state = ASPEED_I2C_MASTER_INACTIVE; | ||
430 | goto out_complete; | ||
431 | } | ||
431 | pr_devel("no slave present at %02x\n", msg->addr); | 432 | pr_devel("no slave present at %02x\n", msg->addr); |
432 | status_ack |= ASPEED_I2CD_INTR_TX_NAK; | 433 | irq_handled |= ASPEED_I2CD_INTR_TX_NAK; |
433 | bus->cmd_err = -ENXIO; | 434 | bus->cmd_err = -ENXIO; |
434 | aspeed_i2c_do_stop(bus); | 435 | aspeed_i2c_do_stop(bus); |
435 | goto out_no_complete; | 436 | goto out_no_complete; |
436 | } | 437 | } |
437 | status_ack |= ASPEED_I2CD_INTR_TX_ACK; | 438 | irq_handled |= ASPEED_I2CD_INTR_TX_ACK; |
438 | if (msg->len == 0) { /* SMBUS_QUICK */ | 439 | if (msg->len == 0) { /* SMBUS_QUICK */ |
439 | aspeed_i2c_do_stop(bus); | 440 | aspeed_i2c_do_stop(bus); |
440 | goto out_no_complete; | 441 | goto out_no_complete; |
@@ -449,14 +450,14 @@ static bool aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus) | |||
449 | case ASPEED_I2C_MASTER_TX: | 450 | case ASPEED_I2C_MASTER_TX: |
450 | if (unlikely(irq_status & ASPEED_I2CD_INTR_TX_NAK)) { | 451 | if (unlikely(irq_status & ASPEED_I2CD_INTR_TX_NAK)) { |
451 | dev_dbg(bus->dev, "slave NACKed TX\n"); | 452 | dev_dbg(bus->dev, "slave NACKed TX\n"); |
452 | status_ack |= ASPEED_I2CD_INTR_TX_NAK; | 453 | irq_handled |= ASPEED_I2CD_INTR_TX_NAK; |
453 | goto error_and_stop; | 454 | goto error_and_stop; |
454 | } else if (unlikely(!(irq_status & ASPEED_I2CD_INTR_TX_ACK))) { | 455 | } else if (unlikely(!(irq_status & ASPEED_I2CD_INTR_TX_ACK))) { |
455 | dev_err(bus->dev, "slave failed to ACK TX\n"); | 456 | dev_err(bus->dev, "slave failed to ACK TX\n"); |
456 | goto error_and_stop; | 457 | goto error_and_stop; |
457 | } | 458 | } |
458 | status_ack |= ASPEED_I2CD_INTR_TX_ACK; | 459 | irq_handled |= ASPEED_I2CD_INTR_TX_ACK; |
459 | /* fallthrough intended */ | 460 | /* fall through */ |
460 | case ASPEED_I2C_MASTER_TX_FIRST: | 461 | case ASPEED_I2C_MASTER_TX_FIRST: |
461 | if (bus->buf_index < msg->len) { | 462 | if (bus->buf_index < msg->len) { |
462 | bus->master_state = ASPEED_I2C_MASTER_TX; | 463 | bus->master_state = ASPEED_I2C_MASTER_TX; |
@@ -472,13 +473,13 @@ static bool aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus) | |||
472 | /* RX may not have completed yet (only address cycle) */ | 473 | /* RX may not have completed yet (only address cycle) */ |
473 | if (!(irq_status & ASPEED_I2CD_INTR_RX_DONE)) | 474 | if (!(irq_status & ASPEED_I2CD_INTR_RX_DONE)) |
474 | goto out_no_complete; | 475 | goto out_no_complete; |
475 | /* fallthrough intended */ | 476 | /* fall through */ |
476 | case ASPEED_I2C_MASTER_RX: | 477 | case ASPEED_I2C_MASTER_RX: |
477 | if (unlikely(!(irq_status & ASPEED_I2CD_INTR_RX_DONE))) { | 478 | if (unlikely(!(irq_status & ASPEED_I2CD_INTR_RX_DONE))) { |
478 | dev_err(bus->dev, "master failed to RX\n"); | 479 | dev_err(bus->dev, "master failed to RX\n"); |
479 | goto error_and_stop; | 480 | goto error_and_stop; |
480 | } | 481 | } |
481 | status_ack |= ASPEED_I2CD_INTR_RX_DONE; | 482 | irq_handled |= ASPEED_I2CD_INTR_RX_DONE; |
482 | 483 | ||
483 | recv_byte = readl(bus->base + ASPEED_I2C_BYTE_BUF_REG) >> 8; | 484 | recv_byte = readl(bus->base + ASPEED_I2C_BYTE_BUF_REG) >> 8; |
484 | msg->buf[bus->buf_index++] = recv_byte; | 485 | msg->buf[bus->buf_index++] = recv_byte; |
@@ -506,11 +507,13 @@ static bool aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus) | |||
506 | goto out_no_complete; | 507 | goto out_no_complete; |
507 | case ASPEED_I2C_MASTER_STOP: | 508 | case ASPEED_I2C_MASTER_STOP: |
508 | if (unlikely(!(irq_status & ASPEED_I2CD_INTR_NORMAL_STOP))) { | 509 | if (unlikely(!(irq_status & ASPEED_I2CD_INTR_NORMAL_STOP))) { |
509 | dev_err(bus->dev, "master failed to STOP\n"); | 510 | dev_err(bus->dev, |
511 | "master failed to STOP. irq_status:0x%x\n", | ||
512 | irq_status); | ||
510 | bus->cmd_err = -EIO; | 513 | bus->cmd_err = -EIO; |
511 | /* Do not STOP as we have already tried. */ | 514 | /* Do not STOP as we have already tried. */ |
512 | } else { | 515 | } else { |
513 | status_ack |= ASPEED_I2CD_INTR_NORMAL_STOP; | 516 | irq_handled |= ASPEED_I2CD_INTR_NORMAL_STOP; |
514 | } | 517 | } |
515 | 518 | ||
516 | bus->master_state = ASPEED_I2C_MASTER_INACTIVE; | 519 | bus->master_state = ASPEED_I2C_MASTER_INACTIVE; |
@@ -540,33 +543,57 @@ out_complete: | |||
540 | bus->master_xfer_result = bus->msgs_index + 1; | 543 | bus->master_xfer_result = bus->msgs_index + 1; |
541 | complete(&bus->cmd_complete); | 544 | complete(&bus->cmd_complete); |
542 | out_no_complete: | 545 | out_no_complete: |
543 | if (irq_status != status_ack) | 546 | return irq_handled; |
544 | dev_err(bus->dev, | ||
545 | "irq handled != irq. expected 0x%08x, but was 0x%08x\n", | ||
546 | irq_status, status_ack); | ||
547 | return !!irq_status; | ||
548 | } | 547 | } |
549 | 548 | ||
550 | static irqreturn_t aspeed_i2c_bus_irq(int irq, void *dev_id) | 549 | static irqreturn_t aspeed_i2c_bus_irq(int irq, void *dev_id) |
551 | { | 550 | { |
552 | struct aspeed_i2c_bus *bus = dev_id; | 551 | struct aspeed_i2c_bus *bus = dev_id; |
553 | bool ret; | 552 | u32 irq_received, irq_remaining, irq_handled; |
554 | 553 | ||
555 | spin_lock(&bus->lock); | 554 | spin_lock(&bus->lock); |
555 | irq_received = readl(bus->base + ASPEED_I2C_INTR_STS_REG); | ||
556 | /* Ack all interrupts except for Rx done */ | ||
557 | writel(irq_received & ~ASPEED_I2CD_INTR_RX_DONE, | ||
558 | bus->base + ASPEED_I2C_INTR_STS_REG); | ||
559 | irq_remaining = irq_received; | ||
556 | 560 | ||
557 | #if IS_ENABLED(CONFIG_I2C_SLAVE) | 561 | #if IS_ENABLED(CONFIG_I2C_SLAVE) |
558 | if (aspeed_i2c_slave_irq(bus)) { | 562 | /* |
559 | dev_dbg(bus->dev, "irq handled by slave.\n"); | 563 | * In most cases, interrupt bits will be set one by one, although |
560 | ret = true; | 564 | * multiple interrupt bits could be set at the same time. It's also |
561 | goto out; | 565 | * possible that master interrupt bits could be set along with slave |
566 | * interrupt bits. Each case needs to be handled using corresponding | ||
567 | * handlers depending on the current state. | ||
568 | */ | ||
569 | if (bus->master_state != ASPEED_I2C_MASTER_INACTIVE) { | ||
570 | irq_handled = aspeed_i2c_master_irq(bus, irq_remaining); | ||
571 | irq_remaining &= ~irq_handled; | ||
572 | if (irq_remaining) | ||
573 | irq_handled |= aspeed_i2c_slave_irq(bus, irq_remaining); | ||
574 | } else { | ||
575 | irq_handled = aspeed_i2c_slave_irq(bus, irq_remaining); | ||
576 | irq_remaining &= ~irq_handled; | ||
577 | if (irq_remaining) | ||
578 | irq_handled |= aspeed_i2c_master_irq(bus, | ||
579 | irq_remaining); | ||
562 | } | 580 | } |
581 | #else | ||
582 | irq_handled = aspeed_i2c_master_irq(bus, irq_remaining); | ||
563 | #endif /* CONFIG_I2C_SLAVE */ | 583 | #endif /* CONFIG_I2C_SLAVE */ |
564 | 584 | ||
565 | ret = aspeed_i2c_master_irq(bus); | 585 | irq_remaining &= ~irq_handled; |
586 | if (irq_remaining) | ||
587 | dev_err(bus->dev, | ||
588 | "irq handled != irq. expected 0x%08x, but was 0x%08x\n", | ||
589 | irq_received, irq_handled); | ||
566 | 590 | ||
567 | out: | 591 | /* Ack Rx done */ |
592 | if (irq_received & ASPEED_I2CD_INTR_RX_DONE) | ||
593 | writel(ASPEED_I2CD_INTR_RX_DONE, | ||
594 | bus->base + ASPEED_I2C_INTR_STS_REG); | ||
568 | spin_unlock(&bus->lock); | 595 | spin_unlock(&bus->lock); |
569 | return ret ? IRQ_HANDLED : IRQ_NONE; | 596 | return irq_remaining ? IRQ_NONE : IRQ_HANDLED; |
570 | } | 597 | } |
571 | 598 | ||
572 | static int aspeed_i2c_master_xfer(struct i2c_adapter *adap, | 599 | static int aspeed_i2c_master_xfer(struct i2c_adapter *adap, |
@@ -684,16 +711,27 @@ static const struct i2c_algorithm aspeed_i2c_algo = { | |||
684 | #endif /* CONFIG_I2C_SLAVE */ | 711 | #endif /* CONFIG_I2C_SLAVE */ |
685 | }; | 712 | }; |
686 | 713 | ||
687 | static u32 aspeed_i2c_get_clk_reg_val(u32 clk_high_low_max, u32 divisor) | 714 | static u32 aspeed_i2c_get_clk_reg_val(struct device *dev, |
715 | u32 clk_high_low_mask, | ||
716 | u32 divisor) | ||
688 | { | 717 | { |
689 | u32 base_clk, clk_high, clk_low, tmp; | 718 | u32 base_clk_divisor, clk_high_low_max, clk_high, clk_low, tmp; |
719 | |||
720 | /* | ||
721 | * SCL_high and SCL_low represent a value 1 greater than what is stored | ||
722 | * since a zero divider is meaningless. Thus, the max value each can | ||
723 | * store is every bit set + 1. Since SCL_high and SCL_low are added | ||
724 | * together (see below), the max value of both is the max value of one | ||
725 | * them times two. | ||
726 | */ | ||
727 | clk_high_low_max = (clk_high_low_mask + 1) * 2; | ||
690 | 728 | ||
691 | /* | 729 | /* |
692 | * The actual clock frequency of SCL is: | 730 | * The actual clock frequency of SCL is: |
693 | * SCL_freq = APB_freq / (base_freq * (SCL_high + SCL_low)) | 731 | * SCL_freq = APB_freq / (base_freq * (SCL_high + SCL_low)) |
694 | * = APB_freq / divisor | 732 | * = APB_freq / divisor |
695 | * where base_freq is a programmable clock divider; its value is | 733 | * where base_freq is a programmable clock divider; its value is |
696 | * base_freq = 1 << base_clk | 734 | * base_freq = 1 << base_clk_divisor |
697 | * SCL_high is the number of base_freq clock cycles that SCL stays high | 735 | * SCL_high is the number of base_freq clock cycles that SCL stays high |
698 | * and SCL_low is the number of base_freq clock cycles that SCL stays | 736 | * and SCL_low is the number of base_freq clock cycles that SCL stays |
699 | * low for a period of SCL. | 737 | * low for a period of SCL. |
@@ -703,47 +741,59 @@ static u32 aspeed_i2c_get_clk_reg_val(u32 clk_high_low_max, u32 divisor) | |||
703 | * SCL_low = clk_low + 1 | 741 | * SCL_low = clk_low + 1 |
704 | * Thus, | 742 | * Thus, |
705 | * SCL_freq = APB_freq / | 743 | * SCL_freq = APB_freq / |
706 | * ((1 << base_clk) * (clk_high + 1 + clk_low + 1)) | 744 | * ((1 << base_clk_divisor) * (clk_high + 1 + clk_low + 1)) |
707 | * The documentation recommends clk_high >= clk_high_max / 2 and | 745 | * The documentation recommends clk_high >= clk_high_max / 2 and |
708 | * clk_low >= clk_low_max / 2 - 1 when possible; this last constraint | 746 | * clk_low >= clk_low_max / 2 - 1 when possible; this last constraint |
709 | * gives us the following solution: | 747 | * gives us the following solution: |
710 | */ | 748 | */ |
711 | base_clk = divisor > clk_high_low_max ? | 749 | base_clk_divisor = divisor > clk_high_low_max ? |
712 | ilog2((divisor - 1) / clk_high_low_max) + 1 : 0; | 750 | ilog2((divisor - 1) / clk_high_low_max) + 1 : 0; |
713 | tmp = (divisor + (1 << base_clk) - 1) >> base_clk; | ||
714 | clk_low = tmp / 2; | ||
715 | clk_high = tmp - clk_low; | ||
716 | 751 | ||
717 | if (clk_high) | 752 | if (base_clk_divisor > ASPEED_I2CD_TIME_BASE_DIVISOR_MASK) { |
718 | clk_high--; | 753 | base_clk_divisor = ASPEED_I2CD_TIME_BASE_DIVISOR_MASK; |
754 | clk_low = clk_high_low_mask; | ||
755 | clk_high = clk_high_low_mask; | ||
756 | dev_err(dev, | ||
757 | "clamping clock divider: divider requested, %u, is greater than largest possible divider, %u.\n", | ||
758 | divisor, (1 << base_clk_divisor) * clk_high_low_max); | ||
759 | } else { | ||
760 | tmp = (divisor + (1 << base_clk_divisor) - 1) | ||
761 | >> base_clk_divisor; | ||
762 | clk_low = tmp / 2; | ||
763 | clk_high = tmp - clk_low; | ||
764 | |||
765 | if (clk_high) | ||
766 | clk_high--; | ||
719 | 767 | ||
720 | if (clk_low) | 768 | if (clk_low) |
721 | clk_low--; | 769 | clk_low--; |
770 | } | ||
722 | 771 | ||
723 | 772 | ||
724 | return ((clk_high << ASPEED_I2CD_TIME_SCL_HIGH_SHIFT) | 773 | return ((clk_high << ASPEED_I2CD_TIME_SCL_HIGH_SHIFT) |
725 | & ASPEED_I2CD_TIME_SCL_HIGH_MASK) | 774 | & ASPEED_I2CD_TIME_SCL_HIGH_MASK) |
726 | | ((clk_low << ASPEED_I2CD_TIME_SCL_LOW_SHIFT) | 775 | | ((clk_low << ASPEED_I2CD_TIME_SCL_LOW_SHIFT) |
727 | & ASPEED_I2CD_TIME_SCL_LOW_MASK) | 776 | & ASPEED_I2CD_TIME_SCL_LOW_MASK) |
728 | | (base_clk & ASPEED_I2CD_TIME_BASE_DIVISOR_MASK); | 777 | | (base_clk_divisor |
778 | & ASPEED_I2CD_TIME_BASE_DIVISOR_MASK); | ||
729 | } | 779 | } |
730 | 780 | ||
731 | static u32 aspeed_i2c_24xx_get_clk_reg_val(u32 divisor) | 781 | static u32 aspeed_i2c_24xx_get_clk_reg_val(struct device *dev, u32 divisor) |
732 | { | 782 | { |
733 | /* | 783 | /* |
734 | * clk_high and clk_low are each 3 bits wide, so each can hold a max | 784 | * clk_high and clk_low are each 3 bits wide, so each can hold a max |
735 | * value of 8 giving a clk_high_low_max of 16. | 785 | * value of 8 giving a clk_high_low_max of 16. |
736 | */ | 786 | */ |
737 | return aspeed_i2c_get_clk_reg_val(16, divisor); | 787 | return aspeed_i2c_get_clk_reg_val(dev, GENMASK(2, 0), divisor); |
738 | } | 788 | } |
739 | 789 | ||
740 | static u32 aspeed_i2c_25xx_get_clk_reg_val(u32 divisor) | 790 | static u32 aspeed_i2c_25xx_get_clk_reg_val(struct device *dev, u32 divisor) |
741 | { | 791 | { |
742 | /* | 792 | /* |
743 | * clk_high and clk_low are each 4 bits wide, so each can hold a max | 793 | * clk_high and clk_low are each 4 bits wide, so each can hold a max |
744 | * value of 16 giving a clk_high_low_max of 32. | 794 | * value of 16 giving a clk_high_low_max of 32. |
745 | */ | 795 | */ |
746 | return aspeed_i2c_get_clk_reg_val(32, divisor); | 796 | return aspeed_i2c_get_clk_reg_val(dev, GENMASK(3, 0), divisor); |
747 | } | 797 | } |
748 | 798 | ||
749 | /* precondition: bus.lock has been acquired. */ | 799 | /* precondition: bus.lock has been acquired. */ |
@@ -756,7 +806,7 @@ static int aspeed_i2c_init_clk(struct aspeed_i2c_bus *bus) | |||
756 | clk_reg_val &= (ASPEED_I2CD_TIME_TBUF_MASK | | 806 | clk_reg_val &= (ASPEED_I2CD_TIME_TBUF_MASK | |
757 | ASPEED_I2CD_TIME_THDSTA_MASK | | 807 | ASPEED_I2CD_TIME_THDSTA_MASK | |
758 | ASPEED_I2CD_TIME_TACST_MASK); | 808 | ASPEED_I2CD_TIME_TACST_MASK); |
759 | clk_reg_val |= bus->get_clk_reg_val(divisor); | 809 | clk_reg_val |= bus->get_clk_reg_val(bus->dev, divisor); |
760 | writel(clk_reg_val, bus->base + ASPEED_I2C_AC_TIMING_REG1); | 810 | writel(clk_reg_val, bus->base + ASPEED_I2C_AC_TIMING_REG1); |
761 | writel(ASPEED_NO_TIMEOUT_CTRL, bus->base + ASPEED_I2C_AC_TIMING_REG2); | 811 | writel(ASPEED_NO_TIMEOUT_CTRL, bus->base + ASPEED_I2C_AC_TIMING_REG2); |
762 | 812 | ||
@@ -872,7 +922,8 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) | |||
872 | if (!match) | 922 | if (!match) |
873 | bus->get_clk_reg_val = aspeed_i2c_24xx_get_clk_reg_val; | 923 | bus->get_clk_reg_val = aspeed_i2c_24xx_get_clk_reg_val; |
874 | else | 924 | else |
875 | bus->get_clk_reg_val = (u32 (*)(u32))match->data; | 925 | bus->get_clk_reg_val = (u32 (*)(struct device *, u32)) |
926 | match->data; | ||
876 | 927 | ||
877 | /* Initialize the I2C adapter */ | 928 | /* Initialize the I2C adapter */ |
878 | spin_lock_init(&bus->lock); | 929 | spin_lock_init(&bus->lock); |
diff --git a/drivers/i2c/busses/i2c-designware-baytrail.c b/drivers/i2c/busses/i2c-designware-baytrail.c index a2a275cfc1f6..9ca1feaba98f 100644 --- a/drivers/i2c/busses/i2c-designware-baytrail.c +++ b/drivers/i2c/busses/i2c-designware-baytrail.c | |||
@@ -164,7 +164,7 @@ int i2c_dw_probe_lock_support(struct dw_i2c_dev *dev) | |||
164 | dev_info(dev->dev, "I2C bus managed by PUNIT\n"); | 164 | dev_info(dev->dev, "I2C bus managed by PUNIT\n"); |
165 | dev->acquire_lock = baytrail_i2c_acquire; | 165 | dev->acquire_lock = baytrail_i2c_acquire; |
166 | dev->release_lock = baytrail_i2c_release; | 166 | dev->release_lock = baytrail_i2c_release; |
167 | dev->pm_disabled = true; | 167 | dev->shared_with_punit = true; |
168 | 168 | ||
169 | pm_qos_add_request(&dev->pm_qos, PM_QOS_CPU_DMA_LATENCY, | 169 | pm_qos_add_request(&dev->pm_qos, PM_QOS_CPU_DMA_LATENCY, |
170 | PM_QOS_DEFAULT_VALUE); | 170 | PM_QOS_DEFAULT_VALUE); |
diff --git a/drivers/i2c/busses/i2c-designware-common.c b/drivers/i2c/busses/i2c-designware-common.c index 69ec4a791f23..36271cd75342 100644 --- a/drivers/i2c/busses/i2c-designware-common.c +++ b/drivers/i2c/busses/i2c-designware-common.c | |||
@@ -201,6 +201,8 @@ int i2c_dw_set_sda_hold(struct dw_i2c_dev *dev) | |||
201 | dev_dbg(dev->dev, "SDA Hold Time TX:RX = %d:%d\n", | 201 | dev_dbg(dev->dev, "SDA Hold Time TX:RX = %d:%d\n", |
202 | dev->sda_hold_time & ~(u32)DW_IC_SDA_HOLD_RX_MASK, | 202 | dev->sda_hold_time & ~(u32)DW_IC_SDA_HOLD_RX_MASK, |
203 | dev->sda_hold_time >> DW_IC_SDA_HOLD_RX_SHIFT); | 203 | dev->sda_hold_time >> DW_IC_SDA_HOLD_RX_SHIFT); |
204 | } else if (dev->set_sda_hold_time) { | ||
205 | dev->set_sda_hold_time(dev); | ||
204 | } else if (dev->sda_hold_time) { | 206 | } else if (dev->sda_hold_time) { |
205 | dev_warn(dev->dev, | 207 | dev_warn(dev->dev, |
206 | "Hardware too old to adjust SDA hold time.\n"); | 208 | "Hardware too old to adjust SDA hold time.\n"); |
diff --git a/drivers/i2c/busses/i2c-designware-core.h b/drivers/i2c/busses/i2c-designware-core.h index e367b1af4ab2..9ec8394f4787 100644 --- a/drivers/i2c/busses/i2c-designware-core.h +++ b/drivers/i2c/busses/i2c-designware-core.h | |||
@@ -212,7 +212,7 @@ | |||
212 | * @pm_qos: pm_qos_request used while holding a hardware lock on the bus | 212 | * @pm_qos: pm_qos_request used while holding a hardware lock on the bus |
213 | * @acquire_lock: function to acquire a hardware lock on the bus | 213 | * @acquire_lock: function to acquire a hardware lock on the bus |
214 | * @release_lock: function to release a hardware lock on the bus | 214 | * @release_lock: function to release a hardware lock on the bus |
215 | * @pm_disabled: true if power-management should be disabled for this i2c-bus | 215 | * @shared_with_punit: true if this bus is shared with the SoCs PUNIT |
216 | * @disable: function to disable the controller | 216 | * @disable: function to disable the controller |
217 | * @disable_int: function to disable all interrupts | 217 | * @disable_int: function to disable all interrupts |
218 | * @init: function to initialize the I2C hardware | 218 | * @init: function to initialize the I2C hardware |
@@ -225,6 +225,7 @@ | |||
225 | struct dw_i2c_dev { | 225 | struct dw_i2c_dev { |
226 | struct device *dev; | 226 | struct device *dev; |
227 | void __iomem *base; | 227 | void __iomem *base; |
228 | void __iomem *ext; | ||
228 | struct completion cmd_complete; | 229 | struct completion cmd_complete; |
229 | struct clk *clk; | 230 | struct clk *clk; |
230 | struct reset_control *rst; | 231 | struct reset_control *rst; |
@@ -265,10 +266,11 @@ struct dw_i2c_dev { | |||
265 | struct pm_qos_request pm_qos; | 266 | struct pm_qos_request pm_qos; |
266 | int (*acquire_lock)(struct dw_i2c_dev *dev); | 267 | int (*acquire_lock)(struct dw_i2c_dev *dev); |
267 | void (*release_lock)(struct dw_i2c_dev *dev); | 268 | void (*release_lock)(struct dw_i2c_dev *dev); |
268 | bool pm_disabled; | 269 | bool shared_with_punit; |
269 | void (*disable)(struct dw_i2c_dev *dev); | 270 | void (*disable)(struct dw_i2c_dev *dev); |
270 | void (*disable_int)(struct dw_i2c_dev *dev); | 271 | void (*disable_int)(struct dw_i2c_dev *dev); |
271 | int (*init)(struct dw_i2c_dev *dev); | 272 | int (*init)(struct dw_i2c_dev *dev); |
273 | int (*set_sda_hold_time)(struct dw_i2c_dev *dev); | ||
272 | int mode; | 274 | int mode; |
273 | struct i2c_bus_recovery_info rinfo; | 275 | struct i2c_bus_recovery_info rinfo; |
274 | }; | 276 | }; |
@@ -276,8 +278,11 @@ struct dw_i2c_dev { | |||
276 | #define ACCESS_SWAP 0x00000001 | 278 | #define ACCESS_SWAP 0x00000001 |
277 | #define ACCESS_16BIT 0x00000002 | 279 | #define ACCESS_16BIT 0x00000002 |
278 | #define ACCESS_INTR_MASK 0x00000004 | 280 | #define ACCESS_INTR_MASK 0x00000004 |
281 | #define ACCESS_NO_IRQ_SUSPEND 0x00000008 | ||
279 | 282 | ||
280 | #define MODEL_CHERRYTRAIL 0x00000100 | 283 | #define MODEL_CHERRYTRAIL 0x00000100 |
284 | #define MODEL_MSCC_OCELOT 0x00000200 | ||
285 | #define MODEL_MASK 0x00000f00 | ||
281 | 286 | ||
282 | u32 dw_readl(struct dw_i2c_dev *dev, int offset); | 287 | u32 dw_readl(struct dw_i2c_dev *dev, int offset); |
283 | void dw_writel(struct dw_i2c_dev *dev, u32 b, int offset); | 288 | void dw_writel(struct dw_i2c_dev *dev, u32 b, int offset); |
diff --git a/drivers/i2c/busses/i2c-designware-master.c b/drivers/i2c/busses/i2c-designware-master.c index 18cc324f3ca9..8d1bc44d2530 100644 --- a/drivers/i2c/busses/i2c-designware-master.c +++ b/drivers/i2c/busses/i2c-designware-master.c | |||
@@ -709,7 +709,7 @@ int i2c_dw_probe(struct dw_i2c_dev *dev) | |||
709 | adap->dev.parent = dev->dev; | 709 | adap->dev.parent = dev->dev; |
710 | i2c_set_adapdata(adap, dev); | 710 | i2c_set_adapdata(adap, dev); |
711 | 711 | ||
712 | if (dev->pm_disabled) { | 712 | if (dev->flags & ACCESS_NO_IRQ_SUSPEND) { |
713 | irq_flags = IRQF_NO_SUSPEND; | 713 | irq_flags = IRQF_NO_SUSPEND; |
714 | } else { | 714 | } else { |
715 | irq_flags = IRQF_SHARED | IRQF_COND_SUSPEND; | 715 | irq_flags = IRQF_SHARED | IRQF_COND_SUSPEND; |
diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c index b5750fd85125..997bbb3d925f 100644 --- a/drivers/i2c/busses/i2c-designware-platdrv.c +++ b/drivers/i2c/busses/i2c-designware-platdrv.c | |||
@@ -85,10 +85,6 @@ static int dw_i2c_acpi_configure(struct platform_device *pdev) | |||
85 | struct dw_i2c_dev *dev = platform_get_drvdata(pdev); | 85 | struct dw_i2c_dev *dev = platform_get_drvdata(pdev); |
86 | struct i2c_timings *t = &dev->timings; | 86 | struct i2c_timings *t = &dev->timings; |
87 | u32 ss_ht = 0, fp_ht = 0, hs_ht = 0, fs_ht = 0; | 87 | u32 ss_ht = 0, fp_ht = 0, hs_ht = 0, fs_ht = 0; |
88 | acpi_handle handle = ACPI_HANDLE(&pdev->dev); | ||
89 | const struct acpi_device_id *id; | ||
90 | struct acpi_device *adev; | ||
91 | const char *uid; | ||
92 | 88 | ||
93 | dev->adapter.nr = -1; | 89 | dev->adapter.nr = -1; |
94 | dev->tx_fifo_depth = 32; | 90 | dev->tx_fifo_depth = 32; |
@@ -119,22 +115,6 @@ static int dw_i2c_acpi_configure(struct platform_device *pdev) | |||
119 | break; | 115 | break; |
120 | } | 116 | } |
121 | 117 | ||
122 | id = acpi_match_device(pdev->dev.driver->acpi_match_table, &pdev->dev); | ||
123 | if (id && id->driver_data) | ||
124 | dev->flags |= (u32)id->driver_data; | ||
125 | |||
126 | if (acpi_bus_get_device(handle, &adev)) | ||
127 | return -ENODEV; | ||
128 | |||
129 | /* | ||
130 | * Cherrytrail I2C7 gets used for the PMIC which gets accessed | ||
131 | * through ACPI opregions during late suspend / early resume | ||
132 | * disable pm for it. | ||
133 | */ | ||
134 | uid = adev->pnp.unique_id; | ||
135 | if ((dev->flags & MODEL_CHERRYTRAIL) && !strcmp(uid, "7")) | ||
136 | dev->pm_disabled = true; | ||
137 | |||
138 | return 0; | 118 | return 0; |
139 | } | 119 | } |
140 | 120 | ||
@@ -143,8 +123,8 @@ static const struct acpi_device_id dw_i2c_acpi_match[] = { | |||
143 | { "INT33C3", 0 }, | 123 | { "INT33C3", 0 }, |
144 | { "INT3432", 0 }, | 124 | { "INT3432", 0 }, |
145 | { "INT3433", 0 }, | 125 | { "INT3433", 0 }, |
146 | { "80860F41", 0 }, | 126 | { "80860F41", ACCESS_NO_IRQ_SUSPEND }, |
147 | { "808622C1", MODEL_CHERRYTRAIL }, | 127 | { "808622C1", ACCESS_NO_IRQ_SUSPEND | MODEL_CHERRYTRAIL }, |
148 | { "AMD0010", ACCESS_INTR_MASK }, | 128 | { "AMD0010", ACCESS_INTR_MASK }, |
149 | { "AMDI0010", ACCESS_INTR_MASK }, | 129 | { "AMDI0010", ACCESS_INTR_MASK }, |
150 | { "AMDI0510", 0 }, | 130 | { "AMDI0510", 0 }, |
@@ -161,6 +141,51 @@ static inline int dw_i2c_acpi_configure(struct platform_device *pdev) | |||
161 | } | 141 | } |
162 | #endif | 142 | #endif |
163 | 143 | ||
144 | #ifdef CONFIG_OF | ||
145 | #define MSCC_ICPU_CFG_TWI_DELAY 0x0 | ||
146 | #define MSCC_ICPU_CFG_TWI_DELAY_ENABLE BIT(0) | ||
147 | #define MSCC_ICPU_CFG_TWI_SPIKE_FILTER 0x4 | ||
148 | |||
149 | static int mscc_twi_set_sda_hold_time(struct dw_i2c_dev *dev) | ||
150 | { | ||
151 | writel((dev->sda_hold_time << 1) | MSCC_ICPU_CFG_TWI_DELAY_ENABLE, | ||
152 | dev->ext + MSCC_ICPU_CFG_TWI_DELAY); | ||
153 | |||
154 | return 0; | ||
155 | } | ||
156 | |||
157 | static int dw_i2c_of_configure(struct platform_device *pdev) | ||
158 | { | ||
159 | struct dw_i2c_dev *dev = platform_get_drvdata(pdev); | ||
160 | struct resource *mem; | ||
161 | |||
162 | switch (dev->flags & MODEL_MASK) { | ||
163 | case MODEL_MSCC_OCELOT: | ||
164 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 1); | ||
165 | dev->ext = devm_ioremap_resource(&pdev->dev, mem); | ||
166 | if (!IS_ERR(dev->ext)) | ||
167 | dev->set_sda_hold_time = mscc_twi_set_sda_hold_time; | ||
168 | break; | ||
169 | default: | ||
170 | break; | ||
171 | } | ||
172 | |||
173 | return 0; | ||
174 | } | ||
175 | |||
176 | static const struct of_device_id dw_i2c_of_match[] = { | ||
177 | { .compatible = "snps,designware-i2c", }, | ||
178 | { .compatible = "mscc,ocelot-i2c", .data = (void *)MODEL_MSCC_OCELOT }, | ||
179 | {}, | ||
180 | }; | ||
181 | MODULE_DEVICE_TABLE(of, dw_i2c_of_match); | ||
182 | #else | ||
183 | static inline int dw_i2c_of_configure(struct platform_device *pdev) | ||
184 | { | ||
185 | return -ENODEV; | ||
186 | } | ||
187 | #endif | ||
188 | |||
164 | static void i2c_dw_configure_master(struct dw_i2c_dev *dev) | 189 | static void i2c_dw_configure_master(struct dw_i2c_dev *dev) |
165 | { | 190 | { |
166 | struct i2c_timings *t = &dev->timings; | 191 | struct i2c_timings *t = &dev->timings; |
@@ -221,7 +246,7 @@ static void dw_i2c_plat_pm_cleanup(struct dw_i2c_dev *dev) | |||
221 | { | 246 | { |
222 | pm_runtime_disable(dev->dev); | 247 | pm_runtime_disable(dev->dev); |
223 | 248 | ||
224 | if (dev->pm_disabled) | 249 | if (dev->shared_with_punit) |
225 | pm_runtime_put_noidle(dev->dev); | 250 | pm_runtime_put_noidle(dev->dev); |
226 | } | 251 | } |
227 | 252 | ||
@@ -291,6 +316,11 @@ static int dw_i2c_plat_probe(struct platform_device *pdev) | |||
291 | else | 316 | else |
292 | t->bus_freq_hz = 400000; | 317 | t->bus_freq_hz = 400000; |
293 | 318 | ||
319 | dev->flags |= (uintptr_t)device_get_match_data(&pdev->dev); | ||
320 | |||
321 | if (pdev->dev.of_node) | ||
322 | dw_i2c_of_configure(pdev); | ||
323 | |||
294 | if (has_acpi_companion(&pdev->dev)) | 324 | if (has_acpi_companion(&pdev->dev)) |
295 | dw_i2c_acpi_configure(pdev); | 325 | dw_i2c_acpi_configure(pdev); |
296 | 326 | ||
@@ -348,7 +378,7 @@ static int dw_i2c_plat_probe(struct platform_device *pdev) | |||
348 | pm_runtime_use_autosuspend(&pdev->dev); | 378 | pm_runtime_use_autosuspend(&pdev->dev); |
349 | pm_runtime_set_active(&pdev->dev); | 379 | pm_runtime_set_active(&pdev->dev); |
350 | 380 | ||
351 | if (dev->pm_disabled) | 381 | if (dev->shared_with_punit) |
352 | pm_runtime_get_noresume(&pdev->dev); | 382 | pm_runtime_get_noresume(&pdev->dev); |
353 | 383 | ||
354 | pm_runtime_enable(&pdev->dev); | 384 | pm_runtime_enable(&pdev->dev); |
@@ -393,14 +423,6 @@ static int dw_i2c_plat_remove(struct platform_device *pdev) | |||
393 | return 0; | 423 | return 0; |
394 | } | 424 | } |
395 | 425 | ||
396 | #ifdef CONFIG_OF | ||
397 | static const struct of_device_id dw_i2c_of_match[] = { | ||
398 | { .compatible = "snps,designware-i2c", }, | ||
399 | {}, | ||
400 | }; | ||
401 | MODULE_DEVICE_TABLE(of, dw_i2c_of_match); | ||
402 | #endif | ||
403 | |||
404 | #ifdef CONFIG_PM_SLEEP | 426 | #ifdef CONFIG_PM_SLEEP |
405 | static int dw_i2c_plat_prepare(struct device *dev) | 427 | static int dw_i2c_plat_prepare(struct device *dev) |
406 | { | 428 | { |
@@ -434,7 +456,7 @@ static int dw_i2c_plat_suspend(struct device *dev) | |||
434 | { | 456 | { |
435 | struct dw_i2c_dev *i_dev = dev_get_drvdata(dev); | 457 | struct dw_i2c_dev *i_dev = dev_get_drvdata(dev); |
436 | 458 | ||
437 | if (i_dev->pm_disabled) | 459 | if (i_dev->shared_with_punit) |
438 | return 0; | 460 | return 0; |
439 | 461 | ||
440 | i_dev->disable(i_dev); | 462 | i_dev->disable(i_dev); |
@@ -447,7 +469,7 @@ static int dw_i2c_plat_resume(struct device *dev) | |||
447 | { | 469 | { |
448 | struct dw_i2c_dev *i_dev = dev_get_drvdata(dev); | 470 | struct dw_i2c_dev *i_dev = dev_get_drvdata(dev); |
449 | 471 | ||
450 | if (!i_dev->pm_disabled) | 472 | if (!i_dev->shared_with_punit) |
451 | i2c_dw_prepare_clk(i_dev, true); | 473 | i2c_dw_prepare_clk(i_dev, true); |
452 | 474 | ||
453 | i_dev->init(i_dev); | 475 | i_dev->init(i_dev); |
diff --git a/drivers/i2c/busses/i2c-mt65xx.c b/drivers/i2c/busses/i2c-mt65xx.c index 1e57f58fcb00..a74ef76705e0 100644 --- a/drivers/i2c/busses/i2c-mt65xx.c +++ b/drivers/i2c/busses/i2c-mt65xx.c | |||
@@ -441,6 +441,8 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs, | |||
441 | u16 control_reg; | 441 | u16 control_reg; |
442 | u16 restart_flag = 0; | 442 | u16 restart_flag = 0; |
443 | u32 reg_4g_mode; | 443 | u32 reg_4g_mode; |
444 | u8 *dma_rd_buf = NULL; | ||
445 | u8 *dma_wr_buf = NULL; | ||
444 | dma_addr_t rpaddr = 0; | 446 | dma_addr_t rpaddr = 0; |
445 | dma_addr_t wpaddr = 0; | 447 | dma_addr_t wpaddr = 0; |
446 | int ret; | 448 | int ret; |
@@ -500,10 +502,18 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs, | |||
500 | if (i2c->op == I2C_MASTER_RD) { | 502 | if (i2c->op == I2C_MASTER_RD) { |
501 | writel(I2C_DMA_INT_FLAG_NONE, i2c->pdmabase + OFFSET_INT_FLAG); | 503 | writel(I2C_DMA_INT_FLAG_NONE, i2c->pdmabase + OFFSET_INT_FLAG); |
502 | writel(I2C_DMA_CON_RX, i2c->pdmabase + OFFSET_CON); | 504 | writel(I2C_DMA_CON_RX, i2c->pdmabase + OFFSET_CON); |
503 | rpaddr = dma_map_single(i2c->dev, msgs->buf, | 505 | |
506 | dma_rd_buf = i2c_get_dma_safe_msg_buf(msgs, 0); | ||
507 | if (!dma_rd_buf) | ||
508 | return -ENOMEM; | ||
509 | |||
510 | rpaddr = dma_map_single(i2c->dev, dma_rd_buf, | ||
504 | msgs->len, DMA_FROM_DEVICE); | 511 | msgs->len, DMA_FROM_DEVICE); |
505 | if (dma_mapping_error(i2c->dev, rpaddr)) | 512 | if (dma_mapping_error(i2c->dev, rpaddr)) { |
513 | i2c_put_dma_safe_msg_buf(dma_rd_buf, msgs, false); | ||
514 | |||
506 | return -ENOMEM; | 515 | return -ENOMEM; |
516 | } | ||
507 | 517 | ||
508 | if (i2c->dev_comp->support_33bits) { | 518 | if (i2c->dev_comp->support_33bits) { |
509 | reg_4g_mode = mtk_i2c_set_4g_mode(rpaddr); | 519 | reg_4g_mode = mtk_i2c_set_4g_mode(rpaddr); |
@@ -515,10 +525,18 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs, | |||
515 | } else if (i2c->op == I2C_MASTER_WR) { | 525 | } else if (i2c->op == I2C_MASTER_WR) { |
516 | writel(I2C_DMA_INT_FLAG_NONE, i2c->pdmabase + OFFSET_INT_FLAG); | 526 | writel(I2C_DMA_INT_FLAG_NONE, i2c->pdmabase + OFFSET_INT_FLAG); |
517 | writel(I2C_DMA_CON_TX, i2c->pdmabase + OFFSET_CON); | 527 | writel(I2C_DMA_CON_TX, i2c->pdmabase + OFFSET_CON); |
518 | wpaddr = dma_map_single(i2c->dev, msgs->buf, | 528 | |
529 | dma_wr_buf = i2c_get_dma_safe_msg_buf(msgs, 0); | ||
530 | if (!dma_wr_buf) | ||
531 | return -ENOMEM; | ||
532 | |||
533 | wpaddr = dma_map_single(i2c->dev, dma_wr_buf, | ||
519 | msgs->len, DMA_TO_DEVICE); | 534 | msgs->len, DMA_TO_DEVICE); |
520 | if (dma_mapping_error(i2c->dev, wpaddr)) | 535 | if (dma_mapping_error(i2c->dev, wpaddr)) { |
536 | i2c_put_dma_safe_msg_buf(dma_wr_buf, msgs, false); | ||
537 | |||
521 | return -ENOMEM; | 538 | return -ENOMEM; |
539 | } | ||
522 | 540 | ||
523 | if (i2c->dev_comp->support_33bits) { | 541 | if (i2c->dev_comp->support_33bits) { |
524 | reg_4g_mode = mtk_i2c_set_4g_mode(wpaddr); | 542 | reg_4g_mode = mtk_i2c_set_4g_mode(wpaddr); |
@@ -530,16 +548,39 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs, | |||
530 | } else { | 548 | } else { |
531 | writel(I2C_DMA_CLR_FLAG, i2c->pdmabase + OFFSET_INT_FLAG); | 549 | writel(I2C_DMA_CLR_FLAG, i2c->pdmabase + OFFSET_INT_FLAG); |
532 | writel(I2C_DMA_CLR_FLAG, i2c->pdmabase + OFFSET_CON); | 550 | writel(I2C_DMA_CLR_FLAG, i2c->pdmabase + OFFSET_CON); |
533 | wpaddr = dma_map_single(i2c->dev, msgs->buf, | 551 | |
552 | dma_wr_buf = i2c_get_dma_safe_msg_buf(msgs, 0); | ||
553 | if (!dma_wr_buf) | ||
554 | return -ENOMEM; | ||
555 | |||
556 | wpaddr = dma_map_single(i2c->dev, dma_wr_buf, | ||
534 | msgs->len, DMA_TO_DEVICE); | 557 | msgs->len, DMA_TO_DEVICE); |
535 | if (dma_mapping_error(i2c->dev, wpaddr)) | 558 | if (dma_mapping_error(i2c->dev, wpaddr)) { |
559 | i2c_put_dma_safe_msg_buf(dma_wr_buf, msgs, false); | ||
560 | |||
536 | return -ENOMEM; | 561 | return -ENOMEM; |
537 | rpaddr = dma_map_single(i2c->dev, (msgs + 1)->buf, | 562 | } |
563 | |||
564 | dma_rd_buf = i2c_get_dma_safe_msg_buf((msgs + 1), 0); | ||
565 | if (!dma_rd_buf) { | ||
566 | dma_unmap_single(i2c->dev, wpaddr, | ||
567 | msgs->len, DMA_TO_DEVICE); | ||
568 | |||
569 | i2c_put_dma_safe_msg_buf(dma_wr_buf, msgs, false); | ||
570 | |||
571 | return -ENOMEM; | ||
572 | } | ||
573 | |||
574 | rpaddr = dma_map_single(i2c->dev, dma_rd_buf, | ||
538 | (msgs + 1)->len, | 575 | (msgs + 1)->len, |
539 | DMA_FROM_DEVICE); | 576 | DMA_FROM_DEVICE); |
540 | if (dma_mapping_error(i2c->dev, rpaddr)) { | 577 | if (dma_mapping_error(i2c->dev, rpaddr)) { |
541 | dma_unmap_single(i2c->dev, wpaddr, | 578 | dma_unmap_single(i2c->dev, wpaddr, |
542 | msgs->len, DMA_TO_DEVICE); | 579 | msgs->len, DMA_TO_DEVICE); |
580 | |||
581 | i2c_put_dma_safe_msg_buf(dma_wr_buf, msgs, false); | ||
582 | i2c_put_dma_safe_msg_buf(dma_rd_buf, (msgs + 1), false); | ||
583 | |||
543 | return -ENOMEM; | 584 | return -ENOMEM; |
544 | } | 585 | } |
545 | 586 | ||
@@ -578,14 +619,21 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs, | |||
578 | if (i2c->op == I2C_MASTER_WR) { | 619 | if (i2c->op == I2C_MASTER_WR) { |
579 | dma_unmap_single(i2c->dev, wpaddr, | 620 | dma_unmap_single(i2c->dev, wpaddr, |
580 | msgs->len, DMA_TO_DEVICE); | 621 | msgs->len, DMA_TO_DEVICE); |
622 | |||
623 | i2c_put_dma_safe_msg_buf(dma_wr_buf, msgs, true); | ||
581 | } else if (i2c->op == I2C_MASTER_RD) { | 624 | } else if (i2c->op == I2C_MASTER_RD) { |
582 | dma_unmap_single(i2c->dev, rpaddr, | 625 | dma_unmap_single(i2c->dev, rpaddr, |
583 | msgs->len, DMA_FROM_DEVICE); | 626 | msgs->len, DMA_FROM_DEVICE); |
627 | |||
628 | i2c_put_dma_safe_msg_buf(dma_rd_buf, msgs, true); | ||
584 | } else { | 629 | } else { |
585 | dma_unmap_single(i2c->dev, wpaddr, msgs->len, | 630 | dma_unmap_single(i2c->dev, wpaddr, msgs->len, |
586 | DMA_TO_DEVICE); | 631 | DMA_TO_DEVICE); |
587 | dma_unmap_single(i2c->dev, rpaddr, (msgs + 1)->len, | 632 | dma_unmap_single(i2c->dev, rpaddr, (msgs + 1)->len, |
588 | DMA_FROM_DEVICE); | 633 | DMA_FROM_DEVICE); |
634 | |||
635 | i2c_put_dma_safe_msg_buf(dma_wr_buf, msgs, true); | ||
636 | i2c_put_dma_safe_msg_buf(dma_rd_buf, (msgs + 1), true); | ||
589 | } | 637 | } |
590 | 638 | ||
591 | if (ret == 0) { | 639 | if (ret == 0) { |
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index 65d06a819307..b1086bfb0465 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c | |||
@@ -661,9 +661,6 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adap, | |||
661 | dev_dbg(omap->dev, "addr: 0x%04x, len: %d, flags: 0x%x, stop: %d\n", | 661 | dev_dbg(omap->dev, "addr: 0x%04x, len: %d, flags: 0x%x, stop: %d\n", |
662 | msg->addr, msg->len, msg->flags, stop); | 662 | msg->addr, msg->len, msg->flags, stop); |
663 | 663 | ||
664 | if (msg->len == 0) | ||
665 | return -EINVAL; | ||
666 | |||
667 | omap->receiver = !!(msg->flags & I2C_M_RD); | 664 | omap->receiver = !!(msg->flags & I2C_M_RD); |
668 | omap_i2c_resize_fifo(omap, msg->len, omap->receiver); | 665 | omap_i2c_resize_fifo(omap, msg->len, omap->receiver); |
669 | 666 | ||
@@ -1179,6 +1176,10 @@ static const struct i2c_algorithm omap_i2c_algo = { | |||
1179 | .functionality = omap_i2c_func, | 1176 | .functionality = omap_i2c_func, |
1180 | }; | 1177 | }; |
1181 | 1178 | ||
1179 | static const struct i2c_adapter_quirks omap_i2c_quirks = { | ||
1180 | .flags = I2C_AQ_NO_ZERO_LEN, | ||
1181 | }; | ||
1182 | |||
1182 | #ifdef CONFIG_OF | 1183 | #ifdef CONFIG_OF |
1183 | static struct omap_i2c_bus_platform_data omap2420_pdata = { | 1184 | static struct omap_i2c_bus_platform_data omap2420_pdata = { |
1184 | .rev = OMAP_I2C_IP_VERSION_1, | 1185 | .rev = OMAP_I2C_IP_VERSION_1, |
@@ -1453,6 +1454,7 @@ omap_i2c_probe(struct platform_device *pdev) | |||
1453 | adap->class = I2C_CLASS_DEPRECATED; | 1454 | adap->class = I2C_CLASS_DEPRECATED; |
1454 | strlcpy(adap->name, "OMAP I2C adapter", sizeof(adap->name)); | 1455 | strlcpy(adap->name, "OMAP I2C adapter", sizeof(adap->name)); |
1455 | adap->algo = &omap_i2c_algo; | 1456 | adap->algo = &omap_i2c_algo; |
1457 | adap->quirks = &omap_i2c_quirks; | ||
1456 | adap->dev.parent = &pdev->dev; | 1458 | adap->dev.parent = &pdev->dev; |
1457 | adap->dev.of_node = pdev->dev.of_node; | 1459 | adap->dev.of_node = pdev->dev.of_node; |
1458 | adap->bus_recovery_info = &omap_i2c_bus_recovery_info; | 1460 | adap->bus_recovery_info = &omap_i2c_bus_recovery_info; |
diff --git a/drivers/i2c/busses/i2c-powermac.c b/drivers/i2c/busses/i2c-powermac.c index f2a2067525ef..f6f4ed8afc93 100644 --- a/drivers/i2c/busses/i2c-powermac.c +++ b/drivers/i2c/busses/i2c-powermac.c | |||
@@ -388,9 +388,8 @@ static void i2c_powermac_register_devices(struct i2c_adapter *adap, | |||
388 | static int i2c_powermac_probe(struct platform_device *dev) | 388 | static int i2c_powermac_probe(struct platform_device *dev) |
389 | { | 389 | { |
390 | struct pmac_i2c_bus *bus = dev_get_platdata(&dev->dev); | 390 | struct pmac_i2c_bus *bus = dev_get_platdata(&dev->dev); |
391 | struct device_node *parent = NULL; | 391 | struct device_node *parent; |
392 | struct i2c_adapter *adapter; | 392 | struct i2c_adapter *adapter; |
393 | const char *basename; | ||
394 | int rc; | 393 | int rc; |
395 | 394 | ||
396 | if (bus == NULL) | 395 | if (bus == NULL) |
@@ -407,23 +406,25 @@ static int i2c_powermac_probe(struct platform_device *dev) | |||
407 | parent = of_get_parent(pmac_i2c_get_controller(bus)); | 406 | parent = of_get_parent(pmac_i2c_get_controller(bus)); |
408 | if (parent == NULL) | 407 | if (parent == NULL) |
409 | return -EINVAL; | 408 | return -EINVAL; |
410 | basename = parent->name; | 409 | snprintf(adapter->name, sizeof(adapter->name), "%pOFn %d", |
410 | parent, | ||
411 | pmac_i2c_get_channel(bus)); | ||
412 | of_node_put(parent); | ||
411 | break; | 413 | break; |
412 | case pmac_i2c_bus_pmu: | 414 | case pmac_i2c_bus_pmu: |
413 | basename = "pmu"; | 415 | snprintf(adapter->name, sizeof(adapter->name), "pmu %d", |
416 | pmac_i2c_get_channel(bus)); | ||
414 | break; | 417 | break; |
415 | case pmac_i2c_bus_smu: | 418 | case pmac_i2c_bus_smu: |
416 | /* This is not what we used to do but I'm fixing drivers at | 419 | /* This is not what we used to do but I'm fixing drivers at |
417 | * the same time as this change | 420 | * the same time as this change |
418 | */ | 421 | */ |
419 | basename = "smu"; | 422 | snprintf(adapter->name, sizeof(adapter->name), "smu %d", |
423 | pmac_i2c_get_channel(bus)); | ||
420 | break; | 424 | break; |
421 | default: | 425 | default: |
422 | return -EINVAL; | 426 | return -EINVAL; |
423 | } | 427 | } |
424 | snprintf(adapter->name, sizeof(adapter->name), "%s %d", basename, | ||
425 | pmac_i2c_get_channel(bus)); | ||
426 | of_node_put(parent); | ||
427 | 428 | ||
428 | platform_set_drvdata(dev, adapter); | 429 | platform_set_drvdata(dev, adapter); |
429 | adapter->algo = &i2c_powermac_algorithm; | 430 | adapter->algo = &i2c_powermac_algorithm; |
diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c index 9f2eb02481d3..527f55c8c4c7 100644 --- a/drivers/i2c/busses/i2c-qcom-geni.c +++ b/drivers/i2c/busses/i2c-qcom-geni.c | |||
@@ -201,21 +201,23 @@ static void geni_i2c_err(struct geni_i2c_dev *gi2c, int err) | |||
201 | static irqreturn_t geni_i2c_irq(int irq, void *dev) | 201 | static irqreturn_t geni_i2c_irq(int irq, void *dev) |
202 | { | 202 | { |
203 | struct geni_i2c_dev *gi2c = dev; | 203 | struct geni_i2c_dev *gi2c = dev; |
204 | int j; | 204 | void __iomem *base = gi2c->se.base; |
205 | int j, p; | ||
205 | u32 m_stat; | 206 | u32 m_stat; |
206 | u32 rx_st; | 207 | u32 rx_st; |
207 | u32 dm_tx_st; | 208 | u32 dm_tx_st; |
208 | u32 dm_rx_st; | 209 | u32 dm_rx_st; |
209 | u32 dma; | 210 | u32 dma; |
211 | u32 val; | ||
210 | struct i2c_msg *cur; | 212 | struct i2c_msg *cur; |
211 | unsigned long flags; | 213 | unsigned long flags; |
212 | 214 | ||
213 | spin_lock_irqsave(&gi2c->lock, flags); | 215 | spin_lock_irqsave(&gi2c->lock, flags); |
214 | m_stat = readl_relaxed(gi2c->se.base + SE_GENI_M_IRQ_STATUS); | 216 | m_stat = readl_relaxed(base + SE_GENI_M_IRQ_STATUS); |
215 | rx_st = readl_relaxed(gi2c->se.base + SE_GENI_RX_FIFO_STATUS); | 217 | rx_st = readl_relaxed(base + SE_GENI_RX_FIFO_STATUS); |
216 | dm_tx_st = readl_relaxed(gi2c->se.base + SE_DMA_TX_IRQ_STAT); | 218 | dm_tx_st = readl_relaxed(base + SE_DMA_TX_IRQ_STAT); |
217 | dm_rx_st = readl_relaxed(gi2c->se.base + SE_DMA_RX_IRQ_STAT); | 219 | dm_rx_st = readl_relaxed(base + SE_DMA_RX_IRQ_STAT); |
218 | dma = readl_relaxed(gi2c->se.base + SE_GENI_DMA_MODE_EN); | 220 | dma = readl_relaxed(base + SE_GENI_DMA_MODE_EN); |
219 | cur = gi2c->cur; | 221 | cur = gi2c->cur; |
220 | 222 | ||
221 | if (!cur || | 223 | if (!cur || |
@@ -238,26 +240,17 @@ static irqreturn_t geni_i2c_irq(int irq, void *dev) | |||
238 | 240 | ||
239 | /* Disable the TX Watermark interrupt to stop TX */ | 241 | /* Disable the TX Watermark interrupt to stop TX */ |
240 | if (!dma) | 242 | if (!dma) |
241 | writel_relaxed(0, gi2c->se.base + | 243 | writel_relaxed(0, base + SE_GENI_TX_WATERMARK_REG); |
242 | SE_GENI_TX_WATERMARK_REG); | 244 | } else if (dma) { |
243 | goto irqret; | ||
244 | } | ||
245 | |||
246 | if (dma) { | ||
247 | dev_dbg(gi2c->se.dev, "i2c dma tx:0x%x, dma rx:0x%x\n", | 245 | dev_dbg(gi2c->se.dev, "i2c dma tx:0x%x, dma rx:0x%x\n", |
248 | dm_tx_st, dm_rx_st); | 246 | dm_tx_st, dm_rx_st); |
249 | goto irqret; | 247 | } else if (cur->flags & I2C_M_RD && |
250 | } | 248 | m_stat & (M_RX_FIFO_WATERMARK_EN | M_RX_FIFO_LAST_EN)) { |
251 | |||
252 | if (cur->flags & I2C_M_RD && | ||
253 | m_stat & (M_RX_FIFO_WATERMARK_EN | M_RX_FIFO_LAST_EN)) { | ||
254 | u32 rxcnt = rx_st & RX_FIFO_WC_MSK; | 249 | u32 rxcnt = rx_st & RX_FIFO_WC_MSK; |
255 | 250 | ||
256 | for (j = 0; j < rxcnt; j++) { | 251 | for (j = 0; j < rxcnt; j++) { |
257 | u32 val; | 252 | p = 0; |
258 | int p = 0; | 253 | val = readl_relaxed(base + SE_GENI_RX_FIFOn); |
259 | |||
260 | val = readl_relaxed(gi2c->se.base + SE_GENI_RX_FIFOn); | ||
261 | while (gi2c->cur_rd < cur->len && p < sizeof(val)) { | 254 | while (gi2c->cur_rd < cur->len && p < sizeof(val)) { |
262 | cur->buf[gi2c->cur_rd++] = val & 0xff; | 255 | cur->buf[gi2c->cur_rd++] = val & 0xff; |
263 | val >>= 8; | 256 | val >>= 8; |
@@ -270,44 +263,39 @@ static irqreturn_t geni_i2c_irq(int irq, void *dev) | |||
270 | m_stat & M_TX_FIFO_WATERMARK_EN) { | 263 | m_stat & M_TX_FIFO_WATERMARK_EN) { |
271 | for (j = 0; j < gi2c->tx_wm; j++) { | 264 | for (j = 0; j < gi2c->tx_wm; j++) { |
272 | u32 temp; | 265 | u32 temp; |
273 | u32 val = 0; | ||
274 | int p = 0; | ||
275 | 266 | ||
267 | val = 0; | ||
268 | p = 0; | ||
276 | while (gi2c->cur_wr < cur->len && p < sizeof(val)) { | 269 | while (gi2c->cur_wr < cur->len && p < sizeof(val)) { |
277 | temp = cur->buf[gi2c->cur_wr++]; | 270 | temp = cur->buf[gi2c->cur_wr++]; |
278 | val |= temp << (p * 8); | 271 | val |= temp << (p * 8); |
279 | p++; | 272 | p++; |
280 | } | 273 | } |
281 | writel_relaxed(val, gi2c->se.base + SE_GENI_TX_FIFOn); | 274 | writel_relaxed(val, base + SE_GENI_TX_FIFOn); |
282 | /* TX Complete, Disable the TX Watermark interrupt */ | 275 | /* TX Complete, Disable the TX Watermark interrupt */ |
283 | if (gi2c->cur_wr == cur->len) { | 276 | if (gi2c->cur_wr == cur->len) { |
284 | writel_relaxed(0, gi2c->se.base + | 277 | writel_relaxed(0, base + SE_GENI_TX_WATERMARK_REG); |
285 | SE_GENI_TX_WATERMARK_REG); | ||
286 | break; | 278 | break; |
287 | } | 279 | } |
288 | } | 280 | } |
289 | } | 281 | } |
290 | irqret: | 282 | |
291 | if (m_stat) | 283 | if (m_stat) |
292 | writel_relaxed(m_stat, gi2c->se.base + SE_GENI_M_IRQ_CLEAR); | 284 | writel_relaxed(m_stat, base + SE_GENI_M_IRQ_CLEAR); |
285 | |||
286 | if (dma && dm_tx_st) | ||
287 | writel_relaxed(dm_tx_st, base + SE_DMA_TX_IRQ_CLR); | ||
288 | if (dma && dm_rx_st) | ||
289 | writel_relaxed(dm_rx_st, base + SE_DMA_RX_IRQ_CLR); | ||
293 | 290 | ||
294 | if (dma) { | ||
295 | if (dm_tx_st) | ||
296 | writel_relaxed(dm_tx_st, gi2c->se.base + | ||
297 | SE_DMA_TX_IRQ_CLR); | ||
298 | if (dm_rx_st) | ||
299 | writel_relaxed(dm_rx_st, gi2c->se.base + | ||
300 | SE_DMA_RX_IRQ_CLR); | ||
301 | } | ||
302 | /* if this is err with done-bit not set, handle that through timeout. */ | 291 | /* if this is err with done-bit not set, handle that through timeout. */ |
303 | if (m_stat & M_CMD_DONE_EN || m_stat & M_CMD_ABORT_EN) | 292 | if (m_stat & M_CMD_DONE_EN || m_stat & M_CMD_ABORT_EN || |
304 | complete(&gi2c->done); | 293 | dm_tx_st & TX_DMA_DONE || dm_tx_st & TX_RESET_DONE || |
305 | else if (dm_tx_st & TX_DMA_DONE || dm_tx_st & TX_RESET_DONE) | 294 | dm_rx_st & RX_DMA_DONE || dm_rx_st & RX_RESET_DONE) |
306 | complete(&gi2c->done); | ||
307 | else if (dm_rx_st & RX_DMA_DONE || dm_rx_st & RX_RESET_DONE) | ||
308 | complete(&gi2c->done); | 295 | complete(&gi2c->done); |
309 | 296 | ||
310 | spin_unlock_irqrestore(&gi2c->lock, flags); | 297 | spin_unlock_irqrestore(&gi2c->lock, flags); |
298 | |||
311 | return IRQ_HANDLED; | 299 | return IRQ_HANDLED; |
312 | } | 300 | } |
313 | 301 | ||
@@ -365,29 +353,24 @@ static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg, | |||
365 | u32 m_param) | 353 | u32 m_param) |
366 | { | 354 | { |
367 | dma_addr_t rx_dma; | 355 | dma_addr_t rx_dma; |
368 | enum geni_se_xfer_mode mode; | 356 | unsigned long time_left; |
369 | unsigned long time_left = XFER_TIMEOUT; | ||
370 | void *dma_buf; | 357 | void *dma_buf; |
358 | struct geni_se *se = &gi2c->se; | ||
359 | size_t len = msg->len; | ||
371 | 360 | ||
372 | gi2c->cur = msg; | ||
373 | mode = GENI_SE_FIFO; | ||
374 | dma_buf = i2c_get_dma_safe_msg_buf(msg, 32); | 361 | dma_buf = i2c_get_dma_safe_msg_buf(msg, 32); |
375 | if (dma_buf) | 362 | if (dma_buf) |
376 | mode = GENI_SE_DMA; | 363 | geni_se_select_mode(se, GENI_SE_DMA); |
377 | 364 | else | |
378 | geni_se_select_mode(&gi2c->se, mode); | 365 | geni_se_select_mode(se, GENI_SE_FIFO); |
379 | writel_relaxed(msg->len, gi2c->se.base + SE_I2C_RX_TRANS_LEN); | 366 | |
380 | geni_se_setup_m_cmd(&gi2c->se, I2C_READ, m_param); | 367 | writel_relaxed(len, se->base + SE_I2C_RX_TRANS_LEN); |
381 | if (mode == GENI_SE_DMA) { | 368 | geni_se_setup_m_cmd(se, I2C_READ, m_param); |
382 | int ret; | 369 | |
383 | 370 | if (dma_buf && geni_se_rx_dma_prep(se, dma_buf, len, &rx_dma)) { | |
384 | ret = geni_se_rx_dma_prep(&gi2c->se, dma_buf, msg->len, | 371 | geni_se_select_mode(se, GENI_SE_FIFO); |
385 | &rx_dma); | 372 | i2c_put_dma_safe_msg_buf(dma_buf, msg, false); |
386 | if (ret) { | 373 | dma_buf = NULL; |
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 | } | 374 | } |
392 | 375 | ||
393 | time_left = wait_for_completion_timeout(&gi2c->done, XFER_TIMEOUT); | 376 | time_left = wait_for_completion_timeout(&gi2c->done, XFER_TIMEOUT); |
@@ -395,12 +378,13 @@ static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg, | |||
395 | geni_i2c_abort_xfer(gi2c); | 378 | geni_i2c_abort_xfer(gi2c); |
396 | 379 | ||
397 | gi2c->cur_rd = 0; | 380 | gi2c->cur_rd = 0; |
398 | if (mode == GENI_SE_DMA) { | 381 | if (dma_buf) { |
399 | if (gi2c->err) | 382 | if (gi2c->err) |
400 | geni_i2c_rx_fsm_rst(gi2c); | 383 | geni_i2c_rx_fsm_rst(gi2c); |
401 | geni_se_rx_dma_unprep(&gi2c->se, rx_dma, msg->len); | 384 | geni_se_rx_dma_unprep(se, rx_dma, len); |
402 | i2c_put_dma_safe_msg_buf(dma_buf, msg, !gi2c->err); | 385 | i2c_put_dma_safe_msg_buf(dma_buf, msg, !gi2c->err); |
403 | } | 386 | } |
387 | |||
404 | return gi2c->err; | 388 | return gi2c->err; |
405 | } | 389 | } |
406 | 390 | ||
@@ -408,45 +392,41 @@ static int geni_i2c_tx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg, | |||
408 | u32 m_param) | 392 | u32 m_param) |
409 | { | 393 | { |
410 | dma_addr_t tx_dma; | 394 | dma_addr_t tx_dma; |
411 | enum geni_se_xfer_mode mode; | ||
412 | unsigned long time_left; | 395 | unsigned long time_left; |
413 | void *dma_buf; | 396 | void *dma_buf; |
397 | struct geni_se *se = &gi2c->se; | ||
398 | size_t len = msg->len; | ||
414 | 399 | ||
415 | gi2c->cur = msg; | ||
416 | mode = GENI_SE_FIFO; | ||
417 | dma_buf = i2c_get_dma_safe_msg_buf(msg, 32); | 400 | dma_buf = i2c_get_dma_safe_msg_buf(msg, 32); |
418 | if (dma_buf) | 401 | if (dma_buf) |
419 | mode = GENI_SE_DMA; | 402 | geni_se_select_mode(se, GENI_SE_DMA); |
420 | 403 | else | |
421 | geni_se_select_mode(&gi2c->se, mode); | 404 | geni_se_select_mode(se, GENI_SE_FIFO); |
422 | writel_relaxed(msg->len, gi2c->se.base + SE_I2C_TX_TRANS_LEN); | 405 | |
423 | geni_se_setup_m_cmd(&gi2c->se, I2C_WRITE, m_param); | 406 | writel_relaxed(len, se->base + SE_I2C_TX_TRANS_LEN); |
424 | if (mode == GENI_SE_DMA) { | 407 | geni_se_setup_m_cmd(se, I2C_WRITE, m_param); |
425 | int ret; | 408 | |
426 | 409 | if (dma_buf && geni_se_tx_dma_prep(se, dma_buf, len, &tx_dma)) { | |
427 | ret = geni_se_tx_dma_prep(&gi2c->se, dma_buf, msg->len, | 410 | geni_se_select_mode(se, GENI_SE_FIFO); |
428 | &tx_dma); | 411 | i2c_put_dma_safe_msg_buf(dma_buf, msg, false); |
429 | if (ret) { | 412 | dma_buf = NULL; |
430 | mode = GENI_SE_FIFO; | ||
431 | geni_se_select_mode(&gi2c->se, mode); | ||
432 | i2c_put_dma_safe_msg_buf(dma_buf, msg, false); | ||
433 | } | ||
434 | } | 413 | } |
435 | 414 | ||
436 | if (mode == GENI_SE_FIFO) /* Get FIFO IRQ */ | 415 | if (!dma_buf) /* Get FIFO IRQ */ |
437 | writel_relaxed(1, gi2c->se.base + SE_GENI_TX_WATERMARK_REG); | 416 | writel_relaxed(1, se->base + SE_GENI_TX_WATERMARK_REG); |
438 | 417 | ||
439 | time_left = wait_for_completion_timeout(&gi2c->done, XFER_TIMEOUT); | 418 | time_left = wait_for_completion_timeout(&gi2c->done, XFER_TIMEOUT); |
440 | if (!time_left) | 419 | if (!time_left) |
441 | geni_i2c_abort_xfer(gi2c); | 420 | geni_i2c_abort_xfer(gi2c); |
442 | 421 | ||
443 | gi2c->cur_wr = 0; | 422 | gi2c->cur_wr = 0; |
444 | if (mode == GENI_SE_DMA) { | 423 | if (dma_buf) { |
445 | if (gi2c->err) | 424 | if (gi2c->err) |
446 | geni_i2c_tx_fsm_rst(gi2c); | 425 | geni_i2c_tx_fsm_rst(gi2c); |
447 | geni_se_tx_dma_unprep(&gi2c->se, tx_dma, msg->len); | 426 | geni_se_tx_dma_unprep(se, tx_dma, len); |
448 | i2c_put_dma_safe_msg_buf(dma_buf, msg, !gi2c->err); | 427 | i2c_put_dma_safe_msg_buf(dma_buf, msg, !gi2c->err); |
449 | } | 428 | } |
429 | |||
450 | return gi2c->err; | 430 | return gi2c->err; |
451 | } | 431 | } |
452 | 432 | ||
@@ -474,6 +454,7 @@ static int geni_i2c_xfer(struct i2c_adapter *adap, | |||
474 | 454 | ||
475 | m_param |= ((msgs[i].addr << SLV_ADDR_SHFT) & SLV_ADDR_MSK); | 455 | m_param |= ((msgs[i].addr << SLV_ADDR_SHFT) & SLV_ADDR_MSK); |
476 | 456 | ||
457 | gi2c->cur = &msgs[i]; | ||
477 | if (msgs[i].flags & I2C_M_RD) | 458 | if (msgs[i].flags & I2C_M_RD) |
478 | ret = geni_i2c_rx_one_msg(gi2c, &msgs[i], m_param); | 459 | ret = geni_i2c_rx_one_msg(gi2c, &msgs[i], m_param); |
479 | else | 460 | else |
diff --git a/drivers/i2c/busses/i2c-qup.c b/drivers/i2c/busses/i2c-qup.c index c86c3ae1318f..e09cd0775ae9 100644 --- a/drivers/i2c/busses/i2c-qup.c +++ b/drivers/i2c/busses/i2c-qup.c | |||
@@ -1088,11 +1088,6 @@ static int qup_i2c_xfer(struct i2c_adapter *adap, | |||
1088 | writel(I2C_MINI_CORE | I2C_N_VAL, qup->base + QUP_CONFIG); | 1088 | writel(I2C_MINI_CORE | I2C_N_VAL, qup->base + QUP_CONFIG); |
1089 | 1089 | ||
1090 | for (idx = 0; idx < num; idx++) { | 1090 | for (idx = 0; idx < num; idx++) { |
1091 | if (msgs[idx].len == 0) { | ||
1092 | ret = -EINVAL; | ||
1093 | goto out; | ||
1094 | } | ||
1095 | |||
1096 | if (qup_i2c_poll_state_i2c_master(qup)) { | 1091 | if (qup_i2c_poll_state_i2c_master(qup)) { |
1097 | ret = -EIO; | 1092 | ret = -EIO; |
1098 | goto out; | 1093 | goto out; |
@@ -1520,9 +1515,6 @@ qup_i2c_determine_mode_v2(struct qup_i2c_dev *qup, | |||
1520 | 1515 | ||
1521 | /* All i2c_msgs should be transferred using either dma or cpu */ | 1516 | /* All i2c_msgs should be transferred using either dma or cpu */ |
1522 | for (idx = 0; idx < num; idx++) { | 1517 | for (idx = 0; idx < num; idx++) { |
1523 | if (msgs[idx].len == 0) | ||
1524 | return -EINVAL; | ||
1525 | |||
1526 | if (msgs[idx].flags & I2C_M_RD) | 1518 | if (msgs[idx].flags & I2C_M_RD) |
1527 | max_rx_len = max_t(unsigned int, max_rx_len, | 1519 | max_rx_len = max_t(unsigned int, max_rx_len, |
1528 | msgs[idx].len); | 1520 | msgs[idx].len); |
@@ -1636,9 +1628,14 @@ static const struct i2c_algorithm qup_i2c_algo_v2 = { | |||
1636 | * which limits the possible read to 256 (QUP_READ_LIMIT) bytes. | 1628 | * which limits the possible read to 256 (QUP_READ_LIMIT) bytes. |
1637 | */ | 1629 | */ |
1638 | static const struct i2c_adapter_quirks qup_i2c_quirks = { | 1630 | static const struct i2c_adapter_quirks qup_i2c_quirks = { |
1631 | .flags = I2C_AQ_NO_ZERO_LEN, | ||
1639 | .max_read_len = QUP_READ_LIMIT, | 1632 | .max_read_len = QUP_READ_LIMIT, |
1640 | }; | 1633 | }; |
1641 | 1634 | ||
1635 | static const struct i2c_adapter_quirks qup_i2c_quirks_v2 = { | ||
1636 | .flags = I2C_AQ_NO_ZERO_LEN, | ||
1637 | }; | ||
1638 | |||
1642 | static void qup_i2c_enable_clocks(struct qup_i2c_dev *qup) | 1639 | static void qup_i2c_enable_clocks(struct qup_i2c_dev *qup) |
1643 | { | 1640 | { |
1644 | clk_prepare_enable(qup->clk); | 1641 | clk_prepare_enable(qup->clk); |
@@ -1701,6 +1698,7 @@ static int qup_i2c_probe(struct platform_device *pdev) | |||
1701 | is_qup_v1 = true; | 1698 | is_qup_v1 = true; |
1702 | } else { | 1699 | } else { |
1703 | qup->adap.algo = &qup_i2c_algo_v2; | 1700 | qup->adap.algo = &qup_i2c_algo_v2; |
1701 | qup->adap.quirks = &qup_i2c_quirks_v2; | ||
1704 | is_qup_v1 = false; | 1702 | is_qup_v1 = false; |
1705 | if (acpi_match_device(qup_i2c_acpi_match, qup->dev)) | 1703 | if (acpi_match_device(qup_i2c_acpi_match, qup->dev)) |
1706 | goto nodma; | 1704 | goto nodma; |
diff --git a/drivers/i2c/busses/i2c-sh_mobile.c b/drivers/i2c/busses/i2c-sh_mobile.c index 818cab14e87c..a7a7a9c3bc7c 100644 --- a/drivers/i2c/busses/i2c-sh_mobile.c +++ b/drivers/i2c/busses/i2c-sh_mobile.c | |||
@@ -947,27 +947,9 @@ static int sh_mobile_i2c_remove(struct platform_device *dev) | |||
947 | return 0; | 947 | return 0; |
948 | } | 948 | } |
949 | 949 | ||
950 | static int sh_mobile_i2c_runtime_nop(struct device *dev) | ||
951 | { | ||
952 | /* Runtime PM callback shared between ->runtime_suspend() | ||
953 | * and ->runtime_resume(). Simply returns success. | ||
954 | * | ||
955 | * This driver re-initializes all registers after | ||
956 | * pm_runtime_get_sync() anyway so there is no need | ||
957 | * to save and restore registers here. | ||
958 | */ | ||
959 | return 0; | ||
960 | } | ||
961 | |||
962 | static const struct dev_pm_ops sh_mobile_i2c_dev_pm_ops = { | ||
963 | .runtime_suspend = sh_mobile_i2c_runtime_nop, | ||
964 | .runtime_resume = sh_mobile_i2c_runtime_nop, | ||
965 | }; | ||
966 | |||
967 | static struct platform_driver sh_mobile_i2c_driver = { | 950 | static struct platform_driver sh_mobile_i2c_driver = { |
968 | .driver = { | 951 | .driver = { |
969 | .name = "i2c-sh_mobile", | 952 | .name = "i2c-sh_mobile", |
970 | .pm = &sh_mobile_i2c_dev_pm_ops, | ||
971 | .of_match_table = sh_mobile_i2c_dt_ids, | 953 | .of_match_table = sh_mobile_i2c_dt_ids, |
972 | }, | 954 | }, |
973 | .probe = sh_mobile_i2c_probe, | 955 | .probe = sh_mobile_i2c_probe, |
diff --git a/drivers/i2c/busses/i2c-synquacer.c b/drivers/i2c/busses/i2c-synquacer.c index 915f5edbab33..2184b7c3580e 100644 --- a/drivers/i2c/busses/i2c-synquacer.c +++ b/drivers/i2c/busses/i2c-synquacer.c | |||
@@ -404,7 +404,7 @@ static irqreturn_t synquacer_i2c_isr(int irq, void *dev_id) | |||
404 | if (i2c->state == STATE_READ) | 404 | if (i2c->state == STATE_READ) |
405 | goto prepare_read; | 405 | goto prepare_read; |
406 | 406 | ||
407 | /* fallthru */ | 407 | /* fall through */ |
408 | 408 | ||
409 | case STATE_WRITE: | 409 | case STATE_WRITE: |
410 | if (bsr & SYNQUACER_I2C_BSR_LRB) { | 410 | if (bsr & SYNQUACER_I2C_BSR_LRB) { |
diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c index 60c8561fbe65..437294ea2f0a 100644 --- a/drivers/i2c/busses/i2c-tegra.c +++ b/drivers/i2c/busses/i2c-tegra.c | |||
@@ -684,9 +684,6 @@ static int tegra_i2c_xfer_msg(struct tegra_i2c_dev *i2c_dev, | |||
684 | 684 | ||
685 | tegra_i2c_flush_fifos(i2c_dev); | 685 | tegra_i2c_flush_fifos(i2c_dev); |
686 | 686 | ||
687 | if (msg->len == 0) | ||
688 | return -EINVAL; | ||
689 | |||
690 | i2c_dev->msg_buf = msg->buf; | 687 | i2c_dev->msg_buf = msg->buf; |
691 | i2c_dev->msg_buf_remaining = msg->len; | 688 | i2c_dev->msg_buf_remaining = msg->len; |
692 | i2c_dev->msg_err = I2C_ERR_NONE; | 689 | i2c_dev->msg_err = I2C_ERR_NONE; |
@@ -831,6 +828,7 @@ static const struct i2c_algorithm tegra_i2c_algo = { | |||
831 | 828 | ||
832 | /* payload size is only 12 bit */ | 829 | /* payload size is only 12 bit */ |
833 | static const struct i2c_adapter_quirks tegra_i2c_quirks = { | 830 | static const struct i2c_adapter_quirks tegra_i2c_quirks = { |
831 | .flags = I2C_AQ_NO_ZERO_LEN, | ||
834 | .max_read_len = 4096, | 832 | .max_read_len = 4096, |
835 | .max_write_len = 4096, | 833 | .max_write_len = 4096, |
836 | }; | 834 | }; |
diff --git a/drivers/i2c/busses/i2c-uniphier-f.c b/drivers/i2c/busses/i2c-uniphier-f.c index a403e8579b65..dd384743dbbd 100644 --- a/drivers/i2c/busses/i2c-uniphier-f.c +++ b/drivers/i2c/busses/i2c-uniphier-f.c | |||
@@ -98,6 +98,7 @@ struct uniphier_fi2c_priv { | |||
98 | unsigned int flags; | 98 | unsigned int flags; |
99 | unsigned int busy_cnt; | 99 | unsigned int busy_cnt; |
100 | unsigned int clk_cycle; | 100 | unsigned int clk_cycle; |
101 | spinlock_t lock; /* IRQ synchronization */ | ||
101 | }; | 102 | }; |
102 | 103 | ||
103 | static void uniphier_fi2c_fill_txfifo(struct uniphier_fi2c_priv *priv, | 104 | static void uniphier_fi2c_fill_txfifo(struct uniphier_fi2c_priv *priv, |
@@ -142,9 +143,10 @@ static void uniphier_fi2c_set_irqs(struct uniphier_fi2c_priv *priv) | |||
142 | writel(priv->enabled_irqs, priv->membase + UNIPHIER_FI2C_IE); | 143 | writel(priv->enabled_irqs, priv->membase + UNIPHIER_FI2C_IE); |
143 | } | 144 | } |
144 | 145 | ||
145 | static void uniphier_fi2c_clear_irqs(struct uniphier_fi2c_priv *priv) | 146 | static void uniphier_fi2c_clear_irqs(struct uniphier_fi2c_priv *priv, |
147 | u32 mask) | ||
146 | { | 148 | { |
147 | writel(-1, priv->membase + UNIPHIER_FI2C_IC); | 149 | writel(mask, priv->membase + UNIPHIER_FI2C_IC); |
148 | } | 150 | } |
149 | 151 | ||
150 | static void uniphier_fi2c_stop(struct uniphier_fi2c_priv *priv) | 152 | static void uniphier_fi2c_stop(struct uniphier_fi2c_priv *priv) |
@@ -162,12 +164,17 @@ static irqreturn_t uniphier_fi2c_interrupt(int irq, void *dev_id) | |||
162 | struct uniphier_fi2c_priv *priv = dev_id; | 164 | struct uniphier_fi2c_priv *priv = dev_id; |
163 | u32 irq_status; | 165 | u32 irq_status; |
164 | 166 | ||
167 | spin_lock(&priv->lock); | ||
168 | |||
165 | irq_status = readl(priv->membase + UNIPHIER_FI2C_INT); | 169 | irq_status = readl(priv->membase + UNIPHIER_FI2C_INT); |
170 | irq_status &= priv->enabled_irqs; | ||
166 | 171 | ||
167 | dev_dbg(&priv->adap.dev, | 172 | dev_dbg(&priv->adap.dev, |
168 | "interrupt: enabled_irqs=%04x, irq_status=%04x\n", | 173 | "interrupt: enabled_irqs=%04x, irq_status=%04x\n", |
169 | priv->enabled_irqs, irq_status); | 174 | priv->enabled_irqs, irq_status); |
170 | 175 | ||
176 | uniphier_fi2c_clear_irqs(priv, irq_status); | ||
177 | |||
171 | if (irq_status & UNIPHIER_FI2C_INT_STOP) | 178 | if (irq_status & UNIPHIER_FI2C_INT_STOP) |
172 | goto complete; | 179 | goto complete; |
173 | 180 | ||
@@ -230,6 +237,8 @@ static irqreturn_t uniphier_fi2c_interrupt(int irq, void *dev_id) | |||
230 | goto handled; | 237 | goto handled; |
231 | } | 238 | } |
232 | 239 | ||
240 | spin_unlock(&priv->lock); | ||
241 | |||
233 | return IRQ_NONE; | 242 | return IRQ_NONE; |
234 | 243 | ||
235 | data_done: | 244 | data_done: |
@@ -244,7 +253,7 @@ complete: | |||
244 | } | 253 | } |
245 | 254 | ||
246 | handled: | 255 | handled: |
247 | uniphier_fi2c_clear_irqs(priv); | 256 | spin_unlock(&priv->lock); |
248 | 257 | ||
249 | return IRQ_HANDLED; | 258 | return IRQ_HANDLED; |
250 | } | 259 | } |
@@ -252,6 +261,8 @@ handled: | |||
252 | static void uniphier_fi2c_tx_init(struct uniphier_fi2c_priv *priv, u16 addr) | 261 | static void uniphier_fi2c_tx_init(struct uniphier_fi2c_priv *priv, u16 addr) |
253 | { | 262 | { |
254 | priv->enabled_irqs |= UNIPHIER_FI2C_INT_TE; | 263 | priv->enabled_irqs |= UNIPHIER_FI2C_INT_TE; |
264 | uniphier_fi2c_set_irqs(priv); | ||
265 | |||
255 | /* do not use TX byte counter */ | 266 | /* do not use TX byte counter */ |
256 | writel(0, priv->membase + UNIPHIER_FI2C_TBC); | 267 | writel(0, priv->membase + UNIPHIER_FI2C_TBC); |
257 | /* set slave address */ | 268 | /* set slave address */ |
@@ -284,6 +295,8 @@ static void uniphier_fi2c_rx_init(struct uniphier_fi2c_priv *priv, u16 addr) | |||
284 | priv->enabled_irqs |= UNIPHIER_FI2C_INT_RF; | 295 | priv->enabled_irqs |= UNIPHIER_FI2C_INT_RF; |
285 | } | 296 | } |
286 | 297 | ||
298 | uniphier_fi2c_set_irqs(priv); | ||
299 | |||
287 | /* set slave address with RD bit */ | 300 | /* set slave address with RD bit */ |
288 | writel(UNIPHIER_FI2C_DTTX_CMD | UNIPHIER_FI2C_DTTX_RD | addr << 1, | 301 | writel(UNIPHIER_FI2C_DTTX_CMD | UNIPHIER_FI2C_DTTX_RD | addr << 1, |
289 | priv->membase + UNIPHIER_FI2C_DTTX); | 302 | priv->membase + UNIPHIER_FI2C_DTTX); |
@@ -307,14 +320,16 @@ static void uniphier_fi2c_recover(struct uniphier_fi2c_priv *priv) | |||
307 | } | 320 | } |
308 | 321 | ||
309 | static int uniphier_fi2c_master_xfer_one(struct i2c_adapter *adap, | 322 | static int uniphier_fi2c_master_xfer_one(struct i2c_adapter *adap, |
310 | struct i2c_msg *msg, bool stop) | 323 | struct i2c_msg *msg, bool repeat, |
324 | bool stop) | ||
311 | { | 325 | { |
312 | struct uniphier_fi2c_priv *priv = i2c_get_adapdata(adap); | 326 | struct uniphier_fi2c_priv *priv = i2c_get_adapdata(adap); |
313 | bool is_read = msg->flags & I2C_M_RD; | 327 | bool is_read = msg->flags & I2C_M_RD; |
314 | unsigned long time_left; | 328 | unsigned long time_left, flags; |
315 | 329 | ||
316 | dev_dbg(&adap->dev, "%s: addr=0x%02x, len=%d, stop=%d\n", | 330 | dev_dbg(&adap->dev, "%s: addr=0x%02x, len=%d, repeat=%d, stop=%d\n", |
317 | is_read ? "receive" : "transmit", msg->addr, msg->len, stop); | 331 | is_read ? "receive" : "transmit", msg->addr, msg->len, |
332 | repeat, stop); | ||
318 | 333 | ||
319 | priv->len = msg->len; | 334 | priv->len = msg->len; |
320 | priv->buf = msg->buf; | 335 | priv->buf = msg->buf; |
@@ -326,22 +341,36 @@ static int uniphier_fi2c_master_xfer_one(struct i2c_adapter *adap, | |||
326 | priv->flags |= UNIPHIER_FI2C_STOP; | 341 | priv->flags |= UNIPHIER_FI2C_STOP; |
327 | 342 | ||
328 | reinit_completion(&priv->comp); | 343 | reinit_completion(&priv->comp); |
329 | uniphier_fi2c_clear_irqs(priv); | 344 | uniphier_fi2c_clear_irqs(priv, U32_MAX); |
330 | writel(UNIPHIER_FI2C_RST_TBRST | UNIPHIER_FI2C_RST_RBRST, | 345 | writel(UNIPHIER_FI2C_RST_TBRST | UNIPHIER_FI2C_RST_RBRST, |
331 | priv->membase + UNIPHIER_FI2C_RST); /* reset TX/RX FIFO */ | 346 | priv->membase + UNIPHIER_FI2C_RST); /* reset TX/RX FIFO */ |
332 | 347 | ||
348 | spin_lock_irqsave(&priv->lock, flags); | ||
349 | |||
333 | if (is_read) | 350 | if (is_read) |
334 | uniphier_fi2c_rx_init(priv, msg->addr); | 351 | uniphier_fi2c_rx_init(priv, msg->addr); |
335 | else | 352 | else |
336 | uniphier_fi2c_tx_init(priv, msg->addr); | 353 | uniphier_fi2c_tx_init(priv, msg->addr); |
337 | 354 | ||
338 | uniphier_fi2c_set_irqs(priv); | ||
339 | |||
340 | dev_dbg(&adap->dev, "start condition\n"); | 355 | dev_dbg(&adap->dev, "start condition\n"); |
341 | writel(UNIPHIER_FI2C_CR_MST | UNIPHIER_FI2C_CR_STA, | 356 | /* |
342 | priv->membase + UNIPHIER_FI2C_CR); | 357 | * For a repeated START condition, writing a slave address to the FIFO |
358 | * kicks the controller. So, the UNIPHIER_FI2C_CR register should be | ||
359 | * written only for a non-repeated START condition. | ||
360 | */ | ||
361 | if (!repeat) | ||
362 | writel(UNIPHIER_FI2C_CR_MST | UNIPHIER_FI2C_CR_STA, | ||
363 | priv->membase + UNIPHIER_FI2C_CR); | ||
364 | |||
365 | spin_unlock_irqrestore(&priv->lock, flags); | ||
343 | 366 | ||
344 | time_left = wait_for_completion_timeout(&priv->comp, adap->timeout); | 367 | time_left = wait_for_completion_timeout(&priv->comp, adap->timeout); |
368 | |||
369 | spin_lock_irqsave(&priv->lock, flags); | ||
370 | priv->enabled_irqs = 0; | ||
371 | uniphier_fi2c_set_irqs(priv); | ||
372 | spin_unlock_irqrestore(&priv->lock, flags); | ||
373 | |||
345 | if (!time_left) { | 374 | if (!time_left) { |
346 | dev_err(&adap->dev, "transaction timeout.\n"); | 375 | dev_err(&adap->dev, "transaction timeout.\n"); |
347 | uniphier_fi2c_recover(priv); | 376 | uniphier_fi2c_recover(priv); |
@@ -394,6 +423,7 @@ static int uniphier_fi2c_master_xfer(struct i2c_adapter *adap, | |||
394 | struct i2c_msg *msgs, int num) | 423 | struct i2c_msg *msgs, int num) |
395 | { | 424 | { |
396 | struct i2c_msg *msg, *emsg = msgs + num; | 425 | struct i2c_msg *msg, *emsg = msgs + num; |
426 | bool repeat = false; | ||
397 | int ret; | 427 | int ret; |
398 | 428 | ||
399 | ret = uniphier_fi2c_check_bus_busy(adap); | 429 | ret = uniphier_fi2c_check_bus_busy(adap); |
@@ -404,9 +434,11 @@ static int uniphier_fi2c_master_xfer(struct i2c_adapter *adap, | |||
404 | /* Emit STOP if it is the last message or I2C_M_STOP is set. */ | 434 | /* Emit STOP if it is the last message or I2C_M_STOP is set. */ |
405 | bool stop = (msg + 1 == emsg) || (msg->flags & I2C_M_STOP); | 435 | bool stop = (msg + 1 == emsg) || (msg->flags & I2C_M_STOP); |
406 | 436 | ||
407 | ret = uniphier_fi2c_master_xfer_one(adap, msg, stop); | 437 | ret = uniphier_fi2c_master_xfer_one(adap, msg, repeat, stop); |
408 | if (ret) | 438 | if (ret) |
409 | return ret; | 439 | return ret; |
440 | |||
441 | repeat = !stop; | ||
410 | } | 442 | } |
411 | 443 | ||
412 | return num; | 444 | return num; |
@@ -529,6 +561,7 @@ static int uniphier_fi2c_probe(struct platform_device *pdev) | |||
529 | 561 | ||
530 | priv->clk_cycle = clk_rate / bus_speed; | 562 | priv->clk_cycle = clk_rate / bus_speed; |
531 | init_completion(&priv->comp); | 563 | init_completion(&priv->comp); |
564 | spin_lock_init(&priv->lock); | ||
532 | priv->adap.owner = THIS_MODULE; | 565 | priv->adap.owner = THIS_MODULE; |
533 | priv->adap.algo = &uniphier_fi2c_algo; | 566 | priv->adap.algo = &uniphier_fi2c_algo; |
534 | priv->adap.dev.parent = dev; | 567 | priv->adap.dev.parent = dev; |
diff --git a/drivers/i2c/busses/i2c-zx2967.c b/drivers/i2c/busses/i2c-zx2967.c index 48281c1b30c6..b8f9e020d80e 100644 --- a/drivers/i2c/busses/i2c-zx2967.c +++ b/drivers/i2c/busses/i2c-zx2967.c | |||
@@ -281,9 +281,6 @@ static int zx2967_i2c_xfer_msg(struct zx2967_i2c *i2c, | |||
281 | int ret; | 281 | int ret; |
282 | int i; | 282 | int i; |
283 | 283 | ||
284 | if (msg->len == 0) | ||
285 | return -EINVAL; | ||
286 | |||
287 | zx2967_i2c_flush_fifos(i2c); | 284 | zx2967_i2c_flush_fifos(i2c); |
288 | 285 | ||
289 | i2c->cur_trans = msg->buf; | 286 | i2c->cur_trans = msg->buf; |
@@ -498,6 +495,10 @@ static const struct i2c_algorithm zx2967_i2c_algo = { | |||
498 | .functionality = zx2967_i2c_func, | 495 | .functionality = zx2967_i2c_func, |
499 | }; | 496 | }; |
500 | 497 | ||
498 | static const struct i2c_adapter_quirks zx2967_i2c_quirks = { | ||
499 | .flags = I2C_AQ_NO_ZERO_LEN, | ||
500 | }; | ||
501 | |||
501 | static const struct of_device_id zx2967_i2c_of_match[] = { | 502 | static const struct of_device_id zx2967_i2c_of_match[] = { |
502 | { .compatible = "zte,zx296718-i2c", }, | 503 | { .compatible = "zte,zx296718-i2c", }, |
503 | { }, | 504 | { }, |
@@ -568,6 +569,7 @@ static int zx2967_i2c_probe(struct platform_device *pdev) | |||
568 | strlcpy(i2c->adap.name, "zx2967 i2c adapter", | 569 | strlcpy(i2c->adap.name, "zx2967 i2c adapter", |
569 | sizeof(i2c->adap.name)); | 570 | sizeof(i2c->adap.name)); |
570 | i2c->adap.algo = &zx2967_i2c_algo; | 571 | i2c->adap.algo = &zx2967_i2c_algo; |
572 | i2c->adap.quirks = &zx2967_i2c_quirks; | ||
571 | i2c->adap.nr = pdev->id; | 573 | i2c->adap.nr = pdev->id; |
572 | i2c->adap.dev.parent = &pdev->dev; | 574 | i2c->adap.dev.parent = &pdev->dev; |
573 | i2c->adap.dev.of_node = pdev->dev.of_node; | 575 | i2c->adap.dev.of_node = pdev->dev.of_node; |
diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c index 9200e349f29e..dc78aa7369de 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c | |||
@@ -1922,6 +1922,11 @@ int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) | |||
1922 | { | 1922 | { |
1923 | int ret; | 1923 | int ret; |
1924 | 1924 | ||
1925 | if (!adap->algo->master_xfer) { | ||
1926 | dev_dbg(&adap->dev, "I2C level transfers not supported\n"); | ||
1927 | return -EOPNOTSUPP; | ||
1928 | } | ||
1929 | |||
1925 | /* REVISIT the fault reporting model here is weak: | 1930 | /* REVISIT the fault reporting model here is weak: |
1926 | * | 1931 | * |
1927 | * - When we get an error after receiving N bytes from a slave, | 1932 | * - When we get an error after receiving N bytes from a slave, |
@@ -1938,35 +1943,19 @@ int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) | |||
1938 | * one (discarding status on the second message) or errno | 1943 | * one (discarding status on the second message) or errno |
1939 | * (discarding status on the first one). | 1944 | * (discarding status on the first one). |
1940 | */ | 1945 | */ |
1941 | 1946 | if (in_atomic() || irqs_disabled()) { | |
1942 | if (adap->algo->master_xfer) { | 1947 | ret = i2c_trylock_bus(adap, I2C_LOCK_SEGMENT); |
1943 | #ifdef DEBUG | 1948 | if (!ret) |
1944 | for (ret = 0; ret < num; ret++) { | 1949 | /* I2C activity is ongoing. */ |
1945 | dev_dbg(&adap->dev, | 1950 | return -EAGAIN; |
1946 | "master_xfer[%d] %c, addr=0x%02x, len=%d%s\n", | ||
1947 | ret, (msgs[ret].flags & I2C_M_RD) ? 'R' : 'W', | ||
1948 | msgs[ret].addr, msgs[ret].len, | ||
1949 | (msgs[ret].flags & I2C_M_RECV_LEN) ? "+" : ""); | ||
1950 | } | ||
1951 | #endif | ||
1952 | |||
1953 | if (in_atomic() || irqs_disabled()) { | ||
1954 | ret = i2c_trylock_bus(adap, I2C_LOCK_SEGMENT); | ||
1955 | if (!ret) | ||
1956 | /* I2C activity is ongoing. */ | ||
1957 | return -EAGAIN; | ||
1958 | } else { | ||
1959 | i2c_lock_bus(adap, I2C_LOCK_SEGMENT); | ||
1960 | } | ||
1961 | |||
1962 | ret = __i2c_transfer(adap, msgs, num); | ||
1963 | i2c_unlock_bus(adap, I2C_LOCK_SEGMENT); | ||
1964 | |||
1965 | return ret; | ||
1966 | } else { | 1951 | } else { |
1967 | dev_dbg(&adap->dev, "I2C level transfers not supported\n"); | 1952 | i2c_lock_bus(adap, I2C_LOCK_SEGMENT); |
1968 | return -EOPNOTSUPP; | ||
1969 | } | 1953 | } |
1954 | |||
1955 | ret = __i2c_transfer(adap, msgs, num); | ||
1956 | i2c_unlock_bus(adap, I2C_LOCK_SEGMENT); | ||
1957 | |||
1958 | return ret; | ||
1970 | } | 1959 | } |
1971 | EXPORT_SYMBOL(i2c_transfer); | 1960 | EXPORT_SYMBOL(i2c_transfer); |
1972 | 1961 | ||
diff --git a/drivers/i2c/muxes/i2c-mux-gpmux.c b/drivers/i2c/muxes/i2c-mux-gpmux.c index 92cf5f48afe6..f60b670deff7 100644 --- a/drivers/i2c/muxes/i2c-mux-gpmux.c +++ b/drivers/i2c/muxes/i2c-mux-gpmux.c | |||
@@ -120,8 +120,8 @@ static int i2c_mux_probe(struct platform_device *pdev) | |||
120 | 120 | ||
121 | ret = of_property_read_u32(child, "reg", &chan); | 121 | ret = of_property_read_u32(child, "reg", &chan); |
122 | if (ret < 0) { | 122 | if (ret < 0) { |
123 | dev_err(dev, "no reg property for node '%s'\n", | 123 | dev_err(dev, "no reg property for node '%pOFn'\n", |
124 | child->name); | 124 | child); |
125 | goto err_children; | 125 | goto err_children; |
126 | } | 126 | } |
127 | 127 | ||
diff --git a/drivers/i2c/muxes/i2c-mux-ltc4306.c b/drivers/i2c/muxes/i2c-mux-ltc4306.c index a9af93259b19..83a714605cd6 100644 --- a/drivers/i2c/muxes/i2c-mux-ltc4306.c +++ b/drivers/i2c/muxes/i2c-mux-ltc4306.c | |||
@@ -208,7 +208,7 @@ MODULE_DEVICE_TABLE(of, ltc4306_of_match); | |||
208 | 208 | ||
209 | static int ltc4306_probe(struct i2c_client *client) | 209 | static int ltc4306_probe(struct i2c_client *client) |
210 | { | 210 | { |
211 | struct i2c_adapter *adap = to_i2c_adapter(client->dev.parent); | 211 | struct i2c_adapter *adap = client->adapter; |
212 | const struct chip_desc *chip; | 212 | const struct chip_desc *chip; |
213 | struct i2c_mux_core *muxc; | 213 | struct i2c_mux_core *muxc; |
214 | struct ltc4306 *data; | 214 | struct ltc4306 *data; |
diff --git a/drivers/i2c/muxes/i2c-mux-mlxcpld.c b/drivers/i2c/muxes/i2c-mux-mlxcpld.c index f2bf3e57ed67..5ed55ca4fe93 100644 --- a/drivers/i2c/muxes/i2c-mux-mlxcpld.c +++ b/drivers/i2c/muxes/i2c-mux-mlxcpld.c | |||
@@ -132,7 +132,7 @@ static int mlxcpld_mux_deselect(struct i2c_mux_core *muxc, u32 chan) | |||
132 | static int mlxcpld_mux_probe(struct i2c_client *client, | 132 | static int mlxcpld_mux_probe(struct i2c_client *client, |
133 | const struct i2c_device_id *id) | 133 | const struct i2c_device_id *id) |
134 | { | 134 | { |
135 | struct i2c_adapter *adap = to_i2c_adapter(client->dev.parent); | 135 | struct i2c_adapter *adap = client->adapter; |
136 | struct mlxcpld_mux_plat_data *pdata = dev_get_platdata(&client->dev); | 136 | struct mlxcpld_mux_plat_data *pdata = dev_get_platdata(&client->dev); |
137 | struct i2c_mux_core *muxc; | 137 | struct i2c_mux_core *muxc; |
138 | int num, force; | 138 | int num, force; |
diff --git a/drivers/i2c/muxes/i2c-mux-pca954x.c b/drivers/i2c/muxes/i2c-mux-pca954x.c index 24bd9275fde5..bfabf985e830 100644 --- a/drivers/i2c/muxes/i2c-mux-pca954x.c +++ b/drivers/i2c/muxes/i2c-mux-pca954x.c | |||
@@ -347,7 +347,7 @@ static void pca954x_cleanup(struct i2c_mux_core *muxc) | |||
347 | static int pca954x_probe(struct i2c_client *client, | 347 | static int pca954x_probe(struct i2c_client *client, |
348 | const struct i2c_device_id *id) | 348 | const struct i2c_device_id *id) |
349 | { | 349 | { |
350 | struct i2c_adapter *adap = to_i2c_adapter(client->dev.parent); | 350 | struct i2c_adapter *adap = client->adapter; |
351 | struct pca954x_platform_data *pdata = dev_get_platdata(&client->dev); | 351 | struct pca954x_platform_data *pdata = dev_get_platdata(&client->dev); |
352 | struct device *dev = &client->dev; | 352 | struct device *dev = &client->dev; |
353 | struct device_node *np = dev->of_node; | 353 | struct device_node *np = dev->of_node; |
diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c index 7e50e1d6f58c..636ed7149793 100644 --- a/drivers/misc/eeprom/at24.c +++ b/drivers/misc/eeprom/at24.c | |||
@@ -106,23 +106,6 @@ static unsigned int at24_write_timeout = 25; | |||
106 | module_param_named(write_timeout, at24_write_timeout, uint, 0); | 106 | module_param_named(write_timeout, at24_write_timeout, uint, 0); |
107 | MODULE_PARM_DESC(at24_write_timeout, "Time (in ms) to try writes (default 25)"); | 107 | MODULE_PARM_DESC(at24_write_timeout, "Time (in ms) to try writes (default 25)"); |
108 | 108 | ||
109 | /* | ||
110 | * Both reads and writes fail if the previous write didn't complete yet. This | ||
111 | * macro loops a few times waiting at least long enough for one entire page | ||
112 | * write to work while making sure that at least one iteration is run before | ||
113 | * checking the break condition. | ||
114 | * | ||
115 | * It takes two parameters: a variable in which the future timeout in jiffies | ||
116 | * will be stored and a temporary variable holding the time of the last | ||
117 | * iteration of processing the request. Both should be unsigned integers | ||
118 | * holding at least 32 bits. | ||
119 | */ | ||
120 | #define at24_loop_until_timeout(tout, op_time) \ | ||
121 | for (tout = jiffies + msecs_to_jiffies(at24_write_timeout), \ | ||
122 | op_time = 0; \ | ||
123 | op_time ? time_before(op_time, tout) : true; \ | ||
124 | usleep_range(1000, 1500), op_time = jiffies) | ||
125 | |||
126 | struct at24_chip_data { | 109 | struct at24_chip_data { |
127 | /* | 110 | /* |
128 | * these fields mirror their equivalents in | 111 | * these fields mirror their equivalents in |
@@ -308,13 +291,22 @@ static ssize_t at24_regmap_read(struct at24_data *at24, char *buf, | |||
308 | /* adjust offset for mac and serial read ops */ | 291 | /* adjust offset for mac and serial read ops */ |
309 | offset += at24->offset_adj; | 292 | offset += at24->offset_adj; |
310 | 293 | ||
311 | at24_loop_until_timeout(timeout, read_time) { | 294 | timeout = jiffies + msecs_to_jiffies(at24_write_timeout); |
295 | do { | ||
296 | /* | ||
297 | * The timestamp shall be taken before the actual operation | ||
298 | * to avoid a premature timeout in case of high CPU load. | ||
299 | */ | ||
300 | read_time = jiffies; | ||
301 | |||
312 | ret = regmap_bulk_read(regmap, offset, buf, count); | 302 | ret = regmap_bulk_read(regmap, offset, buf, count); |
313 | dev_dbg(&client->dev, "read %zu@%d --> %d (%ld)\n", | 303 | dev_dbg(&client->dev, "read %zu@%d --> %d (%ld)\n", |
314 | count, offset, ret, jiffies); | 304 | count, offset, ret, jiffies); |
315 | if (!ret) | 305 | if (!ret) |
316 | return count; | 306 | return count; |
317 | } | 307 | |
308 | usleep_range(1000, 1500); | ||
309 | } while (time_before(read_time, timeout)); | ||
318 | 310 | ||
319 | return -ETIMEDOUT; | 311 | return -ETIMEDOUT; |
320 | } | 312 | } |
@@ -358,14 +350,23 @@ static ssize_t at24_regmap_write(struct at24_data *at24, const char *buf, | |||
358 | regmap = at24_client->regmap; | 350 | regmap = at24_client->regmap; |
359 | client = at24_client->client; | 351 | client = at24_client->client; |
360 | count = at24_adjust_write_count(at24, offset, count); | 352 | count = at24_adjust_write_count(at24, offset, count); |
353 | timeout = jiffies + msecs_to_jiffies(at24_write_timeout); | ||
354 | |||
355 | do { | ||
356 | /* | ||
357 | * The timestamp shall be taken before the actual operation | ||
358 | * to avoid a premature timeout in case of high CPU load. | ||
359 | */ | ||
360 | write_time = jiffies; | ||
361 | 361 | ||
362 | at24_loop_until_timeout(timeout, write_time) { | ||
363 | ret = regmap_bulk_write(regmap, offset, buf, count); | 362 | ret = regmap_bulk_write(regmap, offset, buf, count); |
364 | dev_dbg(&client->dev, "write %zu@%d --> %d (%ld)\n", | 363 | dev_dbg(&client->dev, "write %zu@%d --> %d (%ld)\n", |
365 | count, offset, ret, jiffies); | 364 | count, offset, ret, jiffies); |
366 | if (!ret) | 365 | if (!ret) |
367 | return count; | 366 | return count; |
368 | } | 367 | |
368 | usleep_range(1000, 1500); | ||
369 | } while (time_before(write_time, timeout)); | ||
369 | 370 | ||
370 | return -ETIMEDOUT; | 371 | return -ETIMEDOUT; |
371 | } | 372 | } |