diff options
author | Tomasz Figa <t.figa@samsung.com> | 2012-09-20 18:33:48 -0400 |
---|---|---|
committer | Kukjin Kim <kgene.kim@samsung.com> | 2012-09-20 18:33:48 -0400 |
commit | ee2f573c4206ff3c4dbff2296c8d383d045c80a2 (patch) | |
tree | 1ce7b96feeb3e2afe709470de9db6cf4144c33d1 /drivers/pinctrl/pinctrl-exynos.c | |
parent | 011527b45f8e3092e1f3192e5aea94187a6ca269 (diff) |
pinctrl: exynos: Set pin function to EINT in irq_set_type of GPIO EINTa
Pins used as GPIO interrupts need to be configured as EINTs. This patch
adds the required configuration code to exynos_gpio_irq_set_type,
to set the pin as EINT when its interrupt trigger is configured.
Signed-off-by: Tomasz Figa <t.figa@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
Diffstat (limited to 'drivers/pinctrl/pinctrl-exynos.c')
-rw-r--r-- | drivers/pinctrl/pinctrl-exynos.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/pinctrl/pinctrl-exynos.c b/drivers/pinctrl/pinctrl-exynos.c index 447818d9851b..c2fa85f18764 100644 --- a/drivers/pinctrl/pinctrl-exynos.c +++ b/drivers/pinctrl/pinctrl-exynos.c | |||
@@ -76,9 +76,11 @@ static int exynos_gpio_irq_set_type(struct irq_data *irqd, unsigned int type) | |||
76 | struct samsung_pinctrl_drv_data *d = irqd->domain->host_data; | 76 | struct samsung_pinctrl_drv_data *d = irqd->domain->host_data; |
77 | struct samsung_pin_ctrl *ctrl = d->ctrl; | 77 | struct samsung_pin_ctrl *ctrl = d->ctrl; |
78 | struct exynos_geint_data *edata = irq_data_get_irq_handler_data(irqd); | 78 | struct exynos_geint_data *edata = irq_data_get_irq_handler_data(irqd); |
79 | struct samsung_pin_bank *bank = edata->bank; | ||
79 | unsigned int shift = EXYNOS_EINT_CON_LEN * edata->pin; | 80 | unsigned int shift = EXYNOS_EINT_CON_LEN * edata->pin; |
80 | unsigned int con, trig_type; | 81 | unsigned int con, trig_type; |
81 | unsigned long reg_con = ctrl->geint_con + edata->eint_offset; | 82 | unsigned long reg_con = ctrl->geint_con + edata->eint_offset; |
83 | unsigned int mask; | ||
82 | 84 | ||
83 | switch (type) { | 85 | switch (type) { |
84 | case IRQ_TYPE_EDGE_RISING: | 86 | case IRQ_TYPE_EDGE_RISING: |
@@ -110,6 +112,16 @@ static int exynos_gpio_irq_set_type(struct irq_data *irqd, unsigned int type) | |||
110 | con &= ~(EXYNOS_EINT_CON_MASK << shift); | 112 | con &= ~(EXYNOS_EINT_CON_MASK << shift); |
111 | con |= trig_type << shift; | 113 | con |= trig_type << shift; |
112 | writel(con, d->virt_base + reg_con); | 114 | writel(con, d->virt_base + reg_con); |
115 | |||
116 | reg_con = bank->pctl_offset; | ||
117 | shift = edata->pin * bank->func_width; | ||
118 | mask = (1 << bank->func_width) - 1; | ||
119 | |||
120 | con = readl(d->virt_base + reg_con); | ||
121 | con &= ~(mask << shift); | ||
122 | con |= EXYNOS_EINT_FUNC << shift; | ||
123 | writel(con, d->virt_base + reg_con); | ||
124 | |||
113 | return 0; | 125 | return 0; |
114 | } | 126 | } |
115 | 127 | ||