diff options
-rw-r--r-- | Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt | 21 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-mv64xxx.c | 11 |
2 files changed, 25 insertions, 7 deletions
diff --git a/Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt b/Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt index 21062bc3408d..befd4fb4764f 100644 --- a/Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt +++ b/Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt | |||
@@ -4,19 +4,26 @@ | |||
4 | Required properties : | 4 | Required properties : |
5 | 5 | ||
6 | - reg : Offset and length of the register set for the device | 6 | - reg : Offset and length of the register set for the device |
7 | - compatible : Should be "marvell,mv64xxx-i2c" or "allwinner,sun4i-i2c" | 7 | - compatible : Should be either: |
8 | or "marvell,mv78230-i2c" or "marvell,mv78230-a0-i2c" | 8 | - "allwinner,sun4i-i2c" |
9 | Note: Only use "marvell,mv78230-a0-i2c" for a very rare, | 9 | - "allwinner,sun6i-a31-i2c" |
10 | initial version of the SoC which had broken offload | 10 | - "marvell,mv64xxx-i2c" |
11 | support. Linux auto-detects this and sets it | 11 | - "marvell,mv78230-i2c" |
12 | appropriately. | 12 | - "marvell,mv78230-a0-i2c" |
13 | * Note: Only use "marvell,mv78230-a0-i2c" for a | ||
14 | very rare, initial version of the SoC which | ||
15 | had broken offload support. Linux | ||
16 | auto-detects this and sets it appropriately. | ||
13 | - interrupts : The interrupt number | 17 | - interrupts : The interrupt number |
14 | 18 | ||
15 | Optional properties : | 19 | Optional properties : |
16 | 20 | ||
17 | - clock-frequency : Desired I2C bus clock frequency in Hz. If not set the | 21 | - clock-frequency : Desired I2C bus clock frequency in Hz. If not set the |
18 | default frequency is 100kHz | 22 | default frequency is 100kHz |
19 | - resets : phandle to the parent reset controller | 23 | |
24 | - resets : phandle to the parent reset controller. Mandatory | ||
25 | whenever you're using the "allwinner,sun6i-a31-i2c" | ||
26 | compatible. | ||
20 | 27 | ||
21 | Examples: | 28 | Examples: |
22 | 29 | ||
diff --git a/drivers/i2c/busses/i2c-mv64xxx.c b/drivers/i2c/busses/i2c-mv64xxx.c index 1bb69b6f746d..203a5482a866 100644 --- a/drivers/i2c/busses/i2c-mv64xxx.c +++ b/drivers/i2c/busses/i2c-mv64xxx.c | |||
@@ -150,6 +150,7 @@ struct mv64xxx_i2c_data { | |||
150 | /* 5us delay in order to avoid repeated start timing violation */ | 150 | /* 5us delay in order to avoid repeated start timing violation */ |
151 | bool errata_delay; | 151 | bool errata_delay; |
152 | struct reset_control *rstc; | 152 | struct reset_control *rstc; |
153 | bool irq_clear_inverted; | ||
153 | }; | 154 | }; |
154 | 155 | ||
155 | static struct mv64xxx_i2c_regs mv64xxx_i2c_regs_mv64xxx = { | 156 | static struct mv64xxx_i2c_regs mv64xxx_i2c_regs_mv64xxx = { |
@@ -568,6 +569,11 @@ mv64xxx_i2c_intr(int irq, void *dev_id) | |||
568 | status = readl(drv_data->reg_base + drv_data->reg_offsets.status); | 569 | status = readl(drv_data->reg_base + drv_data->reg_offsets.status); |
569 | mv64xxx_i2c_fsm(drv_data, status); | 570 | mv64xxx_i2c_fsm(drv_data, status); |
570 | mv64xxx_i2c_do_action(drv_data); | 571 | mv64xxx_i2c_do_action(drv_data); |
572 | |||
573 | if (drv_data->irq_clear_inverted) | ||
574 | writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_IFLG, | ||
575 | drv_data->reg_base + drv_data->reg_offsets.control); | ||
576 | |||
571 | rc = IRQ_HANDLED; | 577 | rc = IRQ_HANDLED; |
572 | } | 578 | } |
573 | spin_unlock_irqrestore(&drv_data->lock, flags); | 579 | spin_unlock_irqrestore(&drv_data->lock, flags); |
@@ -687,6 +693,7 @@ static const struct i2c_algorithm mv64xxx_i2c_algo = { | |||
687 | */ | 693 | */ |
688 | static const struct of_device_id mv64xxx_i2c_of_match_table[] = { | 694 | static const struct of_device_id mv64xxx_i2c_of_match_table[] = { |
689 | { .compatible = "allwinner,sun4i-i2c", .data = &mv64xxx_i2c_regs_sun4i}, | 695 | { .compatible = "allwinner,sun4i-i2c", .data = &mv64xxx_i2c_regs_sun4i}, |
696 | { .compatible = "allwinner,sun6i-a31-i2c", .data = &mv64xxx_i2c_regs_sun4i}, | ||
690 | { .compatible = "marvell,mv64xxx-i2c", .data = &mv64xxx_i2c_regs_mv64xxx}, | 697 | { .compatible = "marvell,mv64xxx-i2c", .data = &mv64xxx_i2c_regs_mv64xxx}, |
691 | { .compatible = "marvell,mv78230-i2c", .data = &mv64xxx_i2c_regs_mv64xxx}, | 698 | { .compatible = "marvell,mv78230-i2c", .data = &mv64xxx_i2c_regs_mv64xxx}, |
692 | { .compatible = "marvell,mv78230-a0-i2c", .data = &mv64xxx_i2c_regs_mv64xxx}, | 699 | { .compatible = "marvell,mv78230-a0-i2c", .data = &mv64xxx_i2c_regs_mv64xxx}, |
@@ -795,6 +802,10 @@ mv64xxx_of_config(struct mv64xxx_i2c_data *drv_data, | |||
795 | drv_data->offload_enabled = false; | 802 | drv_data->offload_enabled = false; |
796 | drv_data->errata_delay = true; | 803 | drv_data->errata_delay = true; |
797 | } | 804 | } |
805 | |||
806 | if (of_device_is_compatible(np, "allwinner,sun6i-a31-i2c")) | ||
807 | drv_data->irq_clear_inverted = true; | ||
808 | |||
798 | out: | 809 | out: |
799 | return rc; | 810 | return rc; |
800 | #endif | 811 | #endif |