[PATCH 2/4] pinctrl: exynos: Add irq_chip instance for Exynos7 wakeup interrupts
Thomas Abraham
ta.omasab at gmail.com
Sat Sep 13 03:03:19 PDT 2014
Hi Abhilash,
On Sat, Sep 13, 2014 at 2:20 PM, Abhilash Kesavan <a.kesavan at samsung.com> wrote:
> Exynos7 uses different offsets for wakeup interrupt configuration registers.
> So a new irq_chip instance for Exynos7 wakeup interrupts is added. The irq_chip
> selection is now based on the wakeup interrupt controller compatible string.
>
> Signed-off-by: Abhilash Kesavan <a.kesavan at samsung.com>
> Cc: Thomas Abraham <thomas.ab at samsung.com>
> Cc: Tomasz Figa <tomasz.figa at gmail.com>
> Cc: Linus Walleij <linus.walleij at linaro.org>
> ---
> .../bindings/pinctrl/samsung-pinctrl.txt | 2 +
> drivers/pinctrl/samsung/pinctrl-exynos.c | 42 +++++++++++++++-----
> drivers/pinctrl/samsung/pinctrl-exynos.h | 3 ++
> 3 files changed, 38 insertions(+), 9 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/pinctrl/samsung-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/samsung-pinctrl.txt
> index e82aaf4..f80519a 100644
> --- a/Documentation/devicetree/bindings/pinctrl/samsung-pinctrl.txt
> +++ b/Documentation/devicetree/bindings/pinctrl/samsung-pinctrl.txt
> @@ -136,6 +136,8 @@ B. External Wakeup Interrupts: For supporting external wakeup interrupts, a
> found on Samsung S3C64xx SoCs,
> - samsung,exynos4210-wakeup-eint: represents wakeup interrupt controller
> found on Samsung Exynos4210 and S5PC110/S5PV210 SoCs.
> + - samsung,exynos7-wakeup-eint: represents wakeup interrupt controller
> + found on Samsung Exynos7 SoC.
> - interrupt-parent: phandle of the interrupt parent to which the external
> wakeup interrupts are forwarded to.
> - interrupts: interrupt used by multiplexed wakeup interrupts.
> diff --git a/drivers/pinctrl/samsung/pinctrl-exynos.c b/drivers/pinctrl/samsung/pinctrl-exynos.c
> index 3133a1e..fe15ab8 100644
> --- a/drivers/pinctrl/samsung/pinctrl-exynos.c
> +++ b/drivers/pinctrl/samsung/pinctrl-exynos.c
> @@ -56,12 +56,6 @@ static struct samsung_pin_bank_type bank_type_alive = {
> .reg_offset = { 0x00, 0x04, 0x08, 0x0c, },
> };
>
> -/* list of external wakeup controllers supported */
> -static const struct of_device_id exynos_wkup_irq_ids[] = {
> - { .compatible = "samsung,exynos4210-wakeup-eint", },
> - { }
> -};
> -
> static void exynos_irq_mask(struct irq_data *irqd)
> {
> struct irq_chip *chip = irq_data_get_irq_chip(irqd);
> @@ -328,9 +322,11 @@ static int exynos_wkup_irq_set_wake(struct irq_data *irqd, unsigned int on)
> /*
> * irq_chip for wakeup interrupts
> */
> -static struct exynos_irq_chip exynos_wkup_irq_chip = {
> +static struct exynos_irq_chip exynos_wkup_irq_chip;
> +
> +static struct exynos_irq_chip exynos4210_wkup_irq_chip = {
This should be marked as initdata.
> .chip = {
> - .name = "exynos_wkup_irq_chip",
> + .name = "exynos4210_wkup_irq_chip",
> .irq_unmask = exynos_irq_unmask,
> .irq_mask = exynos_irq_mask,
> .irq_ack = exynos_irq_ack,
> @@ -342,6 +338,29 @@ static struct exynos_irq_chip exynos_wkup_irq_chip = {
> .eint_pend = EXYNOS_WKUP_EPEND_OFFSET,
> };
>
> +static struct exynos_irq_chip exynos7_wkup_irq_chip = {
this as well.
> + .chip = {
> + .name = "exynos7_wkup_irq_chip",
> + .irq_unmask = exynos_irq_unmask,
> + .irq_mask = exynos_irq_mask,
> + .irq_ack = exynos_irq_ack,
> + .irq_set_type = exynos_irq_set_type,
> + .irq_set_wake = exynos_wkup_irq_set_wake,
> + },
> + .eint_con = EXYNOS7_WKUP_ECON_OFFSET,
> + .eint_mask = EXYNOS7_WKUP_EMASK_OFFSET,
> + .eint_pend = EXYNOS7_WKUP_EPEND_OFFSET,
> +};
> +
> +/* list of external wakeup controllers supported */
> +static const struct of_device_id exynos_wkup_irq_ids[] = {
> + { .compatible = "samsung,exynos4210-wakeup-eint",
> + .data = &exynos4210_wkup_irq_chip },
> + { .compatible = "samsung,exynos7-wakeup-eint",
> + .data = &exynos7_wkup_irq_chip },
> + { }
> +};
> +
> /* interrupt handler for wakeup interrupts 0..15 */
> static void exynos_irq_eint0_15(unsigned int irq, struct irq_desc *desc)
> {
> @@ -434,7 +453,12 @@ static int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d)
> int idx, irq;
>
> for_each_child_of_node(dev->of_node, np) {
> - if (of_match_node(exynos_wkup_irq_ids, np)) {
> + const struct of_device_id *match;
> +
> + match = of_match_node(exynos_wkup_irq_ids, np);
> + if (match) {
> + memcpy(&exynos_wkup_irq_chip, match->data,
> + sizeof(struct exynos_irq_chip));
> wkup_np = np;
> break;
> }
> diff --git a/drivers/pinctrl/samsung/pinctrl-exynos.h b/drivers/pinctrl/samsung/pinctrl-exynos.h
> index e060722..0db1e52 100644
> --- a/drivers/pinctrl/samsung/pinctrl-exynos.h
> +++ b/drivers/pinctrl/samsung/pinctrl-exynos.h
> @@ -25,6 +25,9 @@
> #define EXYNOS_WKUP_ECON_OFFSET 0xE00
> #define EXYNOS_WKUP_EMASK_OFFSET 0xF00
> #define EXYNOS_WKUP_EPEND_OFFSET 0xF40
> +#define EXYNOS7_WKUP_ECON_OFFSET 0x700
> +#define EXYNOS7_WKUP_EMASK_OFFSET 0x900
> +#define EXYNOS7_WKUP_EPEND_OFFSET 0xA00
> #define EXYNOS_SVC_OFFSET 0xB08
> #define EXYNOS_EINT_FUNC 0xF
>
Regards,
Thomas.
> --
> 1.7.9.5
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
More information about the linux-arm-kernel
mailing list