aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/pinctrl-rockchip.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pinctrl/pinctrl-rockchip.c')
-rw-r--r--drivers/pinctrl/pinctrl-rockchip.c50
1 files changed, 14 insertions, 36 deletions
diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
index 43eacc924b7e..dee7d5f06c60 100644
--- a/drivers/pinctrl/pinctrl-rockchip.c
+++ b/drivers/pinctrl/pinctrl-rockchip.c
@@ -89,7 +89,7 @@ struct rockchip_iomux {
89 * @reg_pull: optional separate register for additional pull settings 89 * @reg_pull: optional separate register for additional pull settings
90 * @clk: clock of the gpio bank 90 * @clk: clock of the gpio bank
91 * @irq: interrupt of the gpio bank 91 * @irq: interrupt of the gpio bank
92 * @saved_enables: Saved content of GPIO_INTEN at suspend time. 92 * @saved_masks: Saved content of GPIO_INTEN at suspend time.
93 * @pin_base: first pin number 93 * @pin_base: first pin number
94 * @nr_pins: number of pins in this bank 94 * @nr_pins: number of pins in this bank
95 * @name: name of the bank 95 * @name: name of the bank
@@ -108,7 +108,7 @@ struct rockchip_pin_bank {
108 struct regmap *regmap_pull; 108 struct regmap *regmap_pull;
109 struct clk *clk; 109 struct clk *clk;
110 int irq; 110 int irq;
111 u32 saved_enables; 111 u32 saved_masks;
112 u32 pin_base; 112 u32 pin_base;
113 u8 nr_pins; 113 u8 nr_pins;
114 char *name; 114 char *name;
@@ -1142,7 +1142,7 @@ static int rockchip_pinctrl_parse_groups(struct device_node *np,
1142 return -EINVAL; 1142 return -EINVAL;
1143 1143
1144 np_config = of_find_node_by_phandle(be32_to_cpup(phandle)); 1144 np_config = of_find_node_by_phandle(be32_to_cpup(phandle));
1145 ret = pinconf_generic_parse_dt_config(np_config, 1145 ret = pinconf_generic_parse_dt_config(np_config, NULL,
1146 &grp->data[j].configs, &grp->data[j].nconfigs); 1146 &grp->data[j].configs, &grp->data[j].nconfigs);
1147 if (ret) 1147 if (ret)
1148 return ret; 1148 return ret;
@@ -1545,8 +1545,8 @@ static void rockchip_irq_suspend(struct irq_data *d)
1545 struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); 1545 struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
1546 struct rockchip_pin_bank *bank = gc->private; 1546 struct rockchip_pin_bank *bank = gc->private;
1547 1547
1548 bank->saved_enables = irq_reg_readl(gc, GPIO_INTEN); 1548 bank->saved_masks = irq_reg_readl(gc, GPIO_INTMASK);
1549 irq_reg_writel(gc, gc->wake_active, GPIO_INTEN); 1549 irq_reg_writel(gc, ~gc->wake_active, GPIO_INTMASK);
1550} 1550}
1551 1551
1552static void rockchip_irq_resume(struct irq_data *d) 1552static void rockchip_irq_resume(struct irq_data *d)
@@ -1554,35 +1554,7 @@ static void rockchip_irq_resume(struct irq_data *d)
1554 struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); 1554 struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
1555 struct rockchip_pin_bank *bank = gc->private; 1555 struct rockchip_pin_bank *bank = gc->private;
1556 1556
1557 irq_reg_writel(gc, bank->saved_enables, GPIO_INTEN); 1557 irq_reg_writel(gc, bank->saved_masks, GPIO_INTMASK);
1558}
1559
1560static void rockchip_irq_disable(struct irq_data *d)
1561{
1562 struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
1563 u32 val;
1564
1565 irq_gc_lock(gc);
1566
1567 val = irq_reg_readl(gc, GPIO_INTEN);
1568 val &= ~d->mask;
1569 irq_reg_writel(gc, val, GPIO_INTEN);
1570
1571 irq_gc_unlock(gc);
1572}
1573
1574static void rockchip_irq_enable(struct irq_data *d)
1575{
1576 struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
1577 u32 val;
1578
1579 irq_gc_lock(gc);
1580
1581 val = irq_reg_readl(gc, GPIO_INTEN);
1582 val |= d->mask;
1583 irq_reg_writel(gc, val, GPIO_INTEN);
1584
1585 irq_gc_unlock(gc);
1586} 1558}
1587 1559
1588static int rockchip_interrupts_register(struct platform_device *pdev, 1560static int rockchip_interrupts_register(struct platform_device *pdev,
@@ -1620,6 +1592,14 @@ static int rockchip_interrupts_register(struct platform_device *pdev,
1620 continue; 1592 continue;
1621 } 1593 }
1622 1594
1595 /*
1596 * Linux assumes that all interrupts start out disabled/masked.
1597 * Our driver only uses the concept of masked and always keeps
1598 * things enabled, so for us that's all masked and all enabled.
1599 */
1600 writel_relaxed(0xffffffff, bank->reg_base + GPIO_INTMASK);
1601 writel_relaxed(0xffffffff, bank->reg_base + GPIO_INTEN);
1602
1623 gc = irq_get_domain_generic_chip(bank->domain, 0); 1603 gc = irq_get_domain_generic_chip(bank->domain, 0);
1624 gc->reg_base = bank->reg_base; 1604 gc->reg_base = bank->reg_base;
1625 gc->private = bank; 1605 gc->private = bank;
@@ -1628,8 +1608,6 @@ static int rockchip_interrupts_register(struct platform_device *pdev,
1628 gc->chip_types[0].chip.irq_ack = irq_gc_ack_set_bit; 1608 gc->chip_types[0].chip.irq_ack = irq_gc_ack_set_bit;
1629 gc->chip_types[0].chip.irq_mask = irq_gc_mask_set_bit; 1609 gc->chip_types[0].chip.irq_mask = irq_gc_mask_set_bit;
1630 gc->chip_types[0].chip.irq_unmask = irq_gc_mask_clr_bit; 1610 gc->chip_types[0].chip.irq_unmask = irq_gc_mask_clr_bit;
1631 gc->chip_types[0].chip.irq_enable = rockchip_irq_enable;
1632 gc->chip_types[0].chip.irq_disable = rockchip_irq_disable;
1633 gc->chip_types[0].chip.irq_set_wake = irq_gc_set_wake; 1611 gc->chip_types[0].chip.irq_set_wake = irq_gc_set_wake;
1634 gc->chip_types[0].chip.irq_suspend = rockchip_irq_suspend; 1612 gc->chip_types[0].chip.irq_suspend = rockchip_irq_suspend;
1635 gc->chip_types[0].chip.irq_resume = rockchip_irq_resume; 1613 gc->chip_types[0].chip.irq_resume = rockchip_irq_resume;