diff options
| -rw-r--r-- | drivers/pinctrl/pinctrl-rockchip.c | 57 | ||||
| -rw-r--r-- | drivers/pinctrl/pinctrl-st.c | 5 |
2 files changed, 58 insertions, 4 deletions
diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c index ba74f0aa60c7..3c22dbebc80f 100644 --- a/drivers/pinctrl/pinctrl-rockchip.c +++ b/drivers/pinctrl/pinctrl-rockchip.c | |||
| @@ -89,6 +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 | * @pin_base: first pin number | 93 | * @pin_base: first pin number |
| 93 | * @nr_pins: number of pins in this bank | 94 | * @nr_pins: number of pins in this bank |
| 94 | * @name: name of the bank | 95 | * @name: name of the bank |
| @@ -107,6 +108,7 @@ struct rockchip_pin_bank { | |||
| 107 | struct regmap *regmap_pull; | 108 | struct regmap *regmap_pull; |
| 108 | struct clk *clk; | 109 | struct clk *clk; |
| 109 | int irq; | 110 | int irq; |
| 111 | u32 saved_enables; | ||
| 110 | u32 pin_base; | 112 | u32 pin_base; |
| 111 | u8 nr_pins; | 113 | u8 nr_pins; |
| 112 | char *name; | 114 | char *name; |
| @@ -1543,6 +1545,51 @@ static int rockchip_irq_set_type(struct irq_data *d, unsigned int type) | |||
| 1543 | return 0; | 1545 | return 0; |
| 1544 | } | 1546 | } |
| 1545 | 1547 | ||
| 1548 | static void rockchip_irq_suspend(struct irq_data *d) | ||
| 1549 | { | ||
| 1550 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); | ||
| 1551 | struct rockchip_pin_bank *bank = gc->private; | ||
| 1552 | |||
| 1553 | bank->saved_enables = irq_reg_readl(gc, GPIO_INTEN); | ||
| 1554 | irq_reg_writel(gc, gc->wake_active, GPIO_INTEN); | ||
| 1555 | } | ||
| 1556 | |||
| 1557 | static void rockchip_irq_resume(struct irq_data *d) | ||
| 1558 | { | ||
| 1559 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); | ||
| 1560 | struct rockchip_pin_bank *bank = gc->private; | ||
| 1561 | |||
| 1562 | irq_reg_writel(gc, bank->saved_enables, GPIO_INTEN); | ||
| 1563 | } | ||
| 1564 | |||
| 1565 | static void rockchip_irq_disable(struct irq_data *d) | ||
| 1566 | { | ||
| 1567 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); | ||
| 1568 | u32 val; | ||
| 1569 | |||
| 1570 | irq_gc_lock(gc); | ||
| 1571 | |||
| 1572 | val = irq_reg_readl(gc, GPIO_INTEN); | ||
| 1573 | val &= ~d->mask; | ||
| 1574 | irq_reg_writel(gc, val, GPIO_INTEN); | ||
| 1575 | |||
| 1576 | irq_gc_unlock(gc); | ||
| 1577 | } | ||
| 1578 | |||
| 1579 | static void rockchip_irq_enable(struct irq_data *d) | ||
| 1580 | { | ||
| 1581 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); | ||
| 1582 | u32 val; | ||
| 1583 | |||
| 1584 | irq_gc_lock(gc); | ||
| 1585 | |||
| 1586 | val = irq_reg_readl(gc, GPIO_INTEN); | ||
| 1587 | val |= d->mask; | ||
| 1588 | irq_reg_writel(gc, val, GPIO_INTEN); | ||
| 1589 | |||
| 1590 | irq_gc_unlock(gc); | ||
| 1591 | } | ||
| 1592 | |||
| 1546 | static int rockchip_interrupts_register(struct platform_device *pdev, | 1593 | static int rockchip_interrupts_register(struct platform_device *pdev, |
| 1547 | struct rockchip_pinctrl *info) | 1594 | struct rockchip_pinctrl *info) |
| 1548 | { | 1595 | { |
| @@ -1581,12 +1628,16 @@ static int rockchip_interrupts_register(struct platform_device *pdev, | |||
| 1581 | gc = irq_get_domain_generic_chip(bank->domain, 0); | 1628 | gc = irq_get_domain_generic_chip(bank->domain, 0); |
| 1582 | gc->reg_base = bank->reg_base; | 1629 | gc->reg_base = bank->reg_base; |
| 1583 | gc->private = bank; | 1630 | gc->private = bank; |
| 1584 | gc->chip_types[0].regs.mask = GPIO_INTEN; | 1631 | gc->chip_types[0].regs.mask = GPIO_INTMASK; |
| 1585 | gc->chip_types[0].regs.ack = GPIO_PORTS_EOI; | 1632 | gc->chip_types[0].regs.ack = GPIO_PORTS_EOI; |
| 1586 | gc->chip_types[0].chip.irq_ack = irq_gc_ack_set_bit; | 1633 | gc->chip_types[0].chip.irq_ack = irq_gc_ack_set_bit; |
| 1587 | gc->chip_types[0].chip.irq_mask = irq_gc_mask_clr_bit; | 1634 | gc->chip_types[0].chip.irq_mask = irq_gc_mask_set_bit; |
| 1588 | gc->chip_types[0].chip.irq_unmask = irq_gc_mask_set_bit; | 1635 | gc->chip_types[0].chip.irq_unmask = irq_gc_mask_clr_bit; |
| 1636 | gc->chip_types[0].chip.irq_enable = rockchip_irq_enable; | ||
| 1637 | gc->chip_types[0].chip.irq_disable = rockchip_irq_disable; | ||
| 1589 | gc->chip_types[0].chip.irq_set_wake = irq_gc_set_wake; | 1638 | gc->chip_types[0].chip.irq_set_wake = irq_gc_set_wake; |
| 1639 | gc->chip_types[0].chip.irq_suspend = rockchip_irq_suspend; | ||
| 1640 | gc->chip_types[0].chip.irq_resume = rockchip_irq_resume; | ||
| 1590 | gc->chip_types[0].chip.irq_set_type = rockchip_irq_set_type; | 1641 | gc->chip_types[0].chip.irq_set_type = rockchip_irq_set_type; |
| 1591 | gc->wake_enabled = IRQ_MSK(bank->nr_pins); | 1642 | gc->wake_enabled = IRQ_MSK(bank->nr_pins); |
| 1592 | 1643 | ||
diff --git a/drivers/pinctrl/pinctrl-st.c b/drivers/pinctrl/pinctrl-st.c index 7c9d51382248..9e5ec00084bb 100644 --- a/drivers/pinctrl/pinctrl-st.c +++ b/drivers/pinctrl/pinctrl-st.c | |||
| @@ -1012,8 +1012,10 @@ static void st_pinconf_dbg_show(struct pinctrl_dev *pctldev, | |||
| 1012 | struct seq_file *s, unsigned pin_id) | 1012 | struct seq_file *s, unsigned pin_id) |
| 1013 | { | 1013 | { |
| 1014 | unsigned long config; | 1014 | unsigned long config; |
| 1015 | st_pinconf_get(pctldev, pin_id, &config); | ||
| 1016 | 1015 | ||
| 1016 | mutex_unlock(&pctldev->mutex); | ||
| 1017 | st_pinconf_get(pctldev, pin_id, &config); | ||
| 1018 | mutex_lock(&pctldev->mutex); | ||
| 1017 | seq_printf(s, "[OE:%ld,PU:%ld,OD:%ld]\n" | 1019 | seq_printf(s, "[OE:%ld,PU:%ld,OD:%ld]\n" |
| 1018 | "\t\t[retime:%ld,invclk:%ld,clknotdat:%ld," | 1020 | "\t\t[retime:%ld,invclk:%ld,clknotdat:%ld," |
| 1019 | "de:%ld,rt-clk:%ld,rt-delay:%ld]", | 1021 | "de:%ld,rt-clk:%ld,rt-delay:%ld]", |
| @@ -1443,6 +1445,7 @@ static struct gpio_chip st_gpio_template = { | |||
| 1443 | 1445 | ||
| 1444 | static struct irq_chip st_gpio_irqchip = { | 1446 | static struct irq_chip st_gpio_irqchip = { |
| 1445 | .name = "GPIO", | 1447 | .name = "GPIO", |
| 1448 | .irq_disable = st_gpio_irq_mask, | ||
| 1446 | .irq_mask = st_gpio_irq_mask, | 1449 | .irq_mask = st_gpio_irq_mask, |
| 1447 | .irq_unmask = st_gpio_irq_unmask, | 1450 | .irq_unmask = st_gpio_irq_unmask, |
| 1448 | .irq_set_type = st_gpio_irq_set_type, | 1451 | .irq_set_type = st_gpio_irq_set_type, |
