|
52 | 52 | #define ICCR1_ICE BIT(7)
|
53 | 53 | #define ICCR1_IICRST BIT(6)
|
54 | 54 | #define ICCR1_SOWP BIT(4)
|
| 55 | +#define ICCR1_SCLO BIT(3) |
| 56 | +#define ICCR1_SDAO BIT(2) |
55 | 57 | #define ICCR1_SCLI BIT(1)
|
56 | 58 | #define ICCR1_SDAI BIT(0)
|
57 | 59 |
|
@@ -151,11 +153,11 @@ static int riic_bus_barrier(struct riic_dev *riic)
|
151 | 153 | ret = readb_poll_timeout(riic->base + riic->info->regs[RIIC_ICCR2], val,
|
152 | 154 | !(val & ICCR2_BBSY), 10, riic->adapter.timeout);
|
153 | 155 | if (ret)
|
154 |
| - return ret; |
| 156 | + return i2c_recover_bus(&riic->adapter); |
155 | 157 |
|
156 | 158 | if ((riic_readb(riic, RIIC_ICCR1) & (ICCR1_SDAI | ICCR1_SCLI)) !=
|
157 | 159 | (ICCR1_SDAI | ICCR1_SCLI))
|
158 |
| - return -EBUSY; |
| 160 | + return i2c_recover_bus(&riic->adapter); |
159 | 161 |
|
160 | 162 | return 0;
|
161 | 163 | }
|
@@ -439,6 +441,52 @@ static int riic_init_hw(struct riic_dev *riic)
|
439 | 441 | return 0;
|
440 | 442 | }
|
441 | 443 |
|
| 444 | +static int riic_get_scl(struct i2c_adapter *adap) |
| 445 | +{ |
| 446 | + struct riic_dev *riic = i2c_get_adapdata(adap); |
| 447 | + |
| 448 | + return !!(riic_readb(riic, RIIC_ICCR1) & ICCR1_SCLI); |
| 449 | +} |
| 450 | + |
| 451 | +static int riic_get_sda(struct i2c_adapter *adap) |
| 452 | +{ |
| 453 | + struct riic_dev *riic = i2c_get_adapdata(adap); |
| 454 | + |
| 455 | + return !!(riic_readb(riic, RIIC_ICCR1) & ICCR1_SDAI); |
| 456 | +} |
| 457 | + |
| 458 | +static void riic_set_scl(struct i2c_adapter *adap, int val) |
| 459 | +{ |
| 460 | + struct riic_dev *riic = i2c_get_adapdata(adap); |
| 461 | + |
| 462 | + if (val) |
| 463 | + riic_clear_set_bit(riic, ICCR1_SOWP, ICCR1_SCLO, RIIC_ICCR1); |
| 464 | + else |
| 465 | + riic_clear_set_bit(riic, ICCR1_SOWP | ICCR1_SCLO, 0, RIIC_ICCR1); |
| 466 | + |
| 467 | + riic_clear_set_bit(riic, 0, ICCR1_SOWP, RIIC_ICCR1); |
| 468 | +} |
| 469 | + |
| 470 | +static void riic_set_sda(struct i2c_adapter *adap, int val) |
| 471 | +{ |
| 472 | + struct riic_dev *riic = i2c_get_adapdata(adap); |
| 473 | + |
| 474 | + if (val) |
| 475 | + riic_clear_set_bit(riic, ICCR1_SOWP, ICCR1_SDAO, RIIC_ICCR1); |
| 476 | + else |
| 477 | + riic_clear_set_bit(riic, ICCR1_SOWP | ICCR1_SDAO, 0, RIIC_ICCR1); |
| 478 | + |
| 479 | + riic_clear_set_bit(riic, 0, ICCR1_SOWP, RIIC_ICCR1); |
| 480 | +} |
| 481 | + |
| 482 | +static struct i2c_bus_recovery_info riic_bri = { |
| 483 | + .recover_bus = i2c_generic_scl_recovery, |
| 484 | + .get_scl = riic_get_scl, |
| 485 | + .set_scl = riic_set_scl, |
| 486 | + .get_sda = riic_get_sda, |
| 487 | + .set_sda = riic_set_sda, |
| 488 | +}; |
| 489 | + |
442 | 490 | static const struct riic_irq_desc riic_irqs[] = {
|
443 | 491 | { .res_num = 0, .isr = riic_tend_isr, .name = "riic-tend" },
|
444 | 492 | { .res_num = 1, .isr = riic_rdrf_isr, .name = "riic-rdrf" },
|
@@ -495,6 +543,7 @@ static int riic_i2c_probe(struct platform_device *pdev)
|
495 | 543 | adap->algo = &riic_algo;
|
496 | 544 | adap->dev.parent = dev;
|
497 | 545 | adap->dev.of_node = dev->of_node;
|
| 546 | + adap->bus_recovery_info = &riic_bri; |
498 | 547 |
|
499 | 548 | init_completion(&riic->msg_done);
|
500 | 549 |
|
|
0 commit comments