From patchwork Fri Apr 22 11:08:21 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: charu@ti.com X-Patchwork-Id: 726981 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id p3MB5Fl3028451 for ; Fri, 22 Apr 2011 11:05:15 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755196Ab1DVLFO (ORCPT ); Fri, 22 Apr 2011 07:05:14 -0400 Received: from arroyo.ext.ti.com ([192.94.94.40]:60482 "EHLO arroyo.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755188Ab1DVLFG (ORCPT ); Fri, 22 Apr 2011 07:05:06 -0400 Received: from dbdp20.itg.ti.com ([172.24.170.38]) by arroyo.ext.ti.com (8.13.7/8.13.7) with ESMTP id p3MB4aXj016223 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 22 Apr 2011 06:04:39 -0500 Received: from dbde70.ent.ti.com (localhost [127.0.0.1]) by dbdp20.itg.ti.com (8.13.8/8.13.8) with ESMTP id p3MB4WGk028971; Fri, 22 Apr 2011 16:34:36 +0530 (IST) Received: from dbdp31.itg.ti.com (172.24.170.98) by DBDE70.ent.ti.com (172.24.170.148) with Microsoft SMTP Server id 8.3.106.1; Fri, 22 Apr 2011 16:34:16 +0530 Received: from ucmsshproxy.india.ext.ti.com (dbdp20.itg.ti.com [172.24.170.38]) by dbdp31.itg.ti.com (8.13.8/8.13.8) with SMTP id p3MB4XkY021579; Fri, 22 Apr 2011 16:34:33 +0530 (IST) Received: from x0084895-pc (unknown [10.24.244.78]) by ucmsshproxy.india.ext.ti.com (Postfix) with ESMTP id 96E94158009; Fri, 22 Apr 2011 16:34:30 +0530 (IST) From: Charulatha V To: , CC: , , , Charulatha V Subject: [RFC PATCH 07/18] OMAP: GPIO: cleanup set/get IRQ, clr irqstatus funcs Date: Fri, 22 Apr 2011 16:38:21 +0530 Message-ID: <1303470512-19671-8-git-send-email-charu@ti.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1303470512-19671-1-git-send-email-charu@ti.com> References: <1303470512-19671-1-git-send-email-charu@ti.com> MIME-Version: 1.0 Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Fri, 22 Apr 2011 11:05:15 +0000 (UTC) Remove the usage of CONFIG_ARCH* checks in the following functions of the GPIO driver and move SoC specific code to SoC specific files. _enable_gpio_irqbank _get_gpio_irqbank_mask _clear_gpio_irqbank Signed-off-by: Charulatha V --- arch/arm/mach-omap1/gpio15xx.c | 21 ++++ arch/arm/mach-omap1/gpio16xx.c | 16 +++ arch/arm/mach-omap1/gpio7xx.c | 20 ++++ arch/arm/mach-omap2/gpio.c | 26 +++++ arch/arm/plat-omap/gpio.c | 187 ++++++-------------------------- arch/arm/plat-omap/include/plat/gpio.h | 2 + 6 files changed, 116 insertions(+), 156 deletions(-) diff --git a/arch/arm/mach-omap1/gpio15xx.c b/arch/arm/mach-omap1/gpio15xx.c index 3c64e69..7a7a123 100644 --- a/arch/arm/mach-omap1/gpio15xx.c +++ b/arch/arm/mach-omap1/gpio15xx.c @@ -27,6 +27,7 @@ #define OMAP1510_GPIO_BANK_CNT 2 #define OMAP1510_NON_MPUIO_GPIO_VALID ((OMAP1510_GPIO_BANK_CNT - 1) *\ OMAP1510_GPIO_WIDTH) +#define OMAP1510_GPIO_IRQENA_MASK 0xffff static u16 reg_map[] = { [DATAIN] = 0x00, @@ -144,12 +145,32 @@ static int gpio_set_trigger(void __iomem *base, int gpio, int trigger) return 0; } +static u32 gpio_is_irqena(void __iomem *base) +{ + return (~gpio_read(base, IRQENABLE1)) + & OMAP1510_GPIO_IRQENA_MASK; +} + +static void gpio_enable_irq(void __iomem *base, int gpio_mask, int enable) +{ + u32 l = gpio_read(base, IRQENABLE1); + + if (enable) + l &= ~(gpio_mask); + else + l |= gpio_mask; + + gpio_write(l, base, IRQENABLE1); +} + static struct omap_gpio_func gpio_fn = { .get_index = get_gpio_index, .gpio_valid = gpio_valid, .gpio_read = gpio_read, .gpio_write = gpio_write, .gpio_set_trigger = gpio_set_trigger, + .gpio_is_irqena = gpio_is_irqena, + .gpio_enable_irq = gpio_enable_irq, }; /* diff --git a/arch/arm/mach-omap1/gpio16xx.c b/arch/arm/mach-omap1/gpio16xx.c index 6b4afa2..f05e0c7 100644 --- a/arch/arm/mach-omap1/gpio16xx.c +++ b/arch/arm/mach-omap1/gpio16xx.c @@ -30,6 +30,7 @@ #define OMAP1610_GPIO_BANK_CNT 5 #define OMAP1610_NON_MPUIO_GPIO_VALID ((OMAP1610_GPIO_BANK_CNT - 1) *\ OMAP1610_GPIO_WIDTH) +#define OMAP1610_GPIO_IRQENA_MASK 0xffff #define OMAP1610_GPIO_USE_EDGE_CTRL2_REG 0x08 #define OMAP1610_GPIO_SET_FALLING_EDGE 0x01 @@ -272,12 +273,27 @@ static int gpio_set_trigger(void __iomem *base, int gpio, int trigger) return 0; } +static u32 gpio_is_irqena(void __iomem *base) +{ + return gpio_read(base, IRQENABLE1) & OMAP1610_GPIO_IRQENA_MASK; +} + +static void gpio_enable_irq(void __iomem *base, int gpio_mask, int enable) +{ + if (enable) + gpio_write(gpio_mask, base, SETIRQENA1); + else + gpio_write(gpio_mask, base, CLEARIRQENA1); +} + static struct omap_gpio_func gpio_fn = { .get_index = get_gpio_index, .gpio_valid = gpio_valid, .gpio_read = gpio_read, .gpio_write = gpio_write, .gpio_set_trigger = gpio_set_trigger, + .gpio_is_irqena = gpio_is_irqena, + .gpio_enable_irq = gpio_enable_irq, }; /* diff --git a/arch/arm/mach-omap1/gpio7xx.c b/arch/arm/mach-omap1/gpio7xx.c index 599067d..1103efc 100644 --- a/arch/arm/mach-omap1/gpio7xx.c +++ b/arch/arm/mach-omap1/gpio7xx.c @@ -34,6 +34,7 @@ #define OMAP7XX_GPIO_BANK_CNT 7 #define OMAP7XX_NON_MPUIO_GPIO_VALID ((OMAP7XX_GPIO_BANK_CNT - 1) *\ OMAP7XX_GPIO_WIDTH) +#define OMAP7XX_GPIO_IRQENA_MASK 0xffffffff static u16 reg_map[] = { [DATAIN] = 0x00, @@ -307,12 +308,31 @@ static int gpio_set_trigger(void __iomem *base, int gpio, int trigger) return 0; } +static u32 gpio_is_irqena(void __iomem *base) +{ + return (~gpio_read(base, IRQENABLE1)) & OMAP7XX_GPIO_IRQENA_MASK; +} + +static void gpio_enable_irq(void __iomem *base, int gpio_mask, int enable) +{ + u32 l = gpio_read(base, IRQENABLE1); + + if (enable) + l &= ~(gpio_mask); + else + l |= gpio_mask; + + gpio_write(l, base, IRQENABLE1); +} + static struct omap_gpio_func gpio_fn = { .get_index = get_gpio_index, .gpio_valid = gpio_valid, .gpio_read = gpio_read, .gpio_write = gpio_write, .gpio_set_trigger = gpio_set_trigger, + .gpio_is_irqena = gpio_is_irqena, + .gpio_enable_irq = gpio_enable_irq, }; /* diff --git a/arch/arm/mach-omap2/gpio.c b/arch/arm/mach-omap2/gpio.c index ff3ea7b..25fe8a4 100644 --- a/arch/arm/mach-omap2/gpio.c +++ b/arch/arm/mach-omap2/gpio.c @@ -26,6 +26,7 @@ #include #define OMAP2_GPIO_INDEX_MASK 0x1f +#define OMAP2_GPIO_IRQENA_MASK 0xffffffff int bank_width; static u16 *reg_map; @@ -147,12 +148,37 @@ static int gpio_set_trigger(void __iomem *base, int gpio, int trigger) return 0; } +static u32 gpio_is_irqena(void __iomem *base) +{ + if (cpu_is_omap44xx()) + return gpio_read(base, IRQSTATUSSET0) & OMAP2_GPIO_IRQENA_MASK; + else + return gpio_read(base, IRQENABLE1) & OMAP2_GPIO_IRQENA_MASK; +} + +static void gpio_enable_irq(void __iomem *base, int gpio_mask, int enable) +{ + if (cpu_is_omap44xx()) { + if (enable) + return gpio_write(gpio_mask, base, IRQSTATUSSET0); + else + return gpio_write(gpio_mask, base, IRQSTATUSCLR0); + } else { + if (enable) + return gpio_write(gpio_mask, base, SETIRQENA1); + else + return gpio_write(gpio_mask, base, CLEARIRQENA1); + } +} + static struct omap_gpio_func gpio_fn = { .get_index = get_gpio_index, .gpio_valid = gpio_valid, .gpio_read = gpio_read, .gpio_write = gpio_write, .gpio_set_trigger = gpio_set_trigger, + .gpio_is_irqena = gpio_is_irqena, + .gpio_enable_irq = gpio_enable_irq, }; static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused) diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c index 938cc4d..115916d 100644 --- a/arch/arm/plat-omap/gpio.c +++ b/arch/arm/plat-omap/gpio.c @@ -30,6 +30,7 @@ #include #include +#define MPUIO_GPIO_IRQENA_MASK 0xffff /* * OMAP1510 GPIO registers */ @@ -551,58 +552,31 @@ static int gpio_irq_type(struct irq_data *d, unsigned type) static void _clear_gpio_irqbank(struct gpio_bank *bank, int gpio_mask) { - void __iomem *reg = bank->base; - switch (bank->method) { -#ifdef CONFIG_ARCH_OMAP1 case METHOD_MPUIO: /* MPUIO irqstatus is reset by reading the status register, * so do nothing here */ - return; -#endif -#ifdef CONFIG_ARCH_OMAP15XX - case METHOD_GPIO_1510: - reg += OMAP1510_GPIO_INT_STATUS; - break; -#endif -#ifdef CONFIG_ARCH_OMAP16XX - case METHOD_GPIO_1610: - reg += OMAP1610_GPIO_IRQSTATUS1; - break; -#endif -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) - case METHOD_GPIO_7XX: - reg += OMAP7XX_GPIO_INT_STATUS; break; -#endif -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) + case METHOD_GPIO_24XX: - reg += OMAP24XX_GPIO_IRQSTATUS1; - break; -#endif -#if defined(CONFIG_ARCH_OMAP4) case METHOD_GPIO_44XX: - reg += OMAP4_GPIO_IRQSTATUS0; - break; -#endif + /* WA for clearing DSP GPIO interrupts to allow retention */ + gpio_fn.gpio_write(gpio_mask, bank->base, IRQSTATUS_REG1); + /* + * Flush posted write for the irq status + * to avoid spurious interrupts + */ + gpio_fn.gpio_read(bank->base, IRQSTATUS_REG1); default: - WARN_ON(1); - return; - } - __raw_writel(gpio_mask, reg); - - /* Workaround for clearing DSP GPIO interrupts to allow retention */ - if (cpu_is_omap24xx() || cpu_is_omap34xx()) - reg = bank->base + OMAP24XX_GPIO_IRQSTATUS2; - else if (cpu_is_omap44xx()) - reg = bank->base + OMAP4_GPIO_IRQSTATUS1; - - if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx()) { - __raw_writel(gpio_mask, reg); - - /* Flush posted write for the irq status to avoid spurious interrupts */ - __raw_readl(reg); + gpio_fn.gpio_write(gpio_mask, bank->base, IRQSTATUS_REG0); + /* + * Flush posted write for the irq status + * to avoid spurious interrupts + */ + gpio_fn.gpio_read(bank->base, IRQSTATUS_REG0); + break; } + return; } static inline void _clear_gpio_irqstatus(struct gpio_bank *bank, int gpio) @@ -612,131 +586,30 @@ static inline void _clear_gpio_irqstatus(struct gpio_bank *bank, int gpio) static u32 _get_gpio_irqbank_mask(struct gpio_bank *bank) { - void __iomem *reg = bank->base; - int inv = 0; - u32 l; - u32 mask; - - switch (bank->method) { -#ifdef CONFIG_ARCH_OMAP1 - case METHOD_MPUIO: - reg += OMAP_MPUIO_GPIO_MASKIT / bank->stride; - mask = 0xffff; - inv = 1; - break; -#endif -#ifdef CONFIG_ARCH_OMAP15XX - case METHOD_GPIO_1510: - reg += OMAP1510_GPIO_INT_MASK; - mask = 0xffff; - inv = 1; - break; -#endif -#ifdef CONFIG_ARCH_OMAP16XX - case METHOD_GPIO_1610: - reg += OMAP1610_GPIO_IRQENABLE1; - mask = 0xffff; - break; -#endif -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) - case METHOD_GPIO_7XX: - reg += OMAP7XX_GPIO_INT_MASK; - mask = 0xffffffff; - inv = 1; - break; -#endif -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) - case METHOD_GPIO_24XX: - reg += OMAP24XX_GPIO_IRQENABLE1; - mask = 0xffffffff; - break; -#endif -#if defined(CONFIG_ARCH_OMAP4) - case METHOD_GPIO_44XX: - reg += OMAP4_GPIO_IRQSTATUSSET0; - mask = 0xffffffff; - break; -#endif - default: - WARN_ON(1); - return 0; + if (bank->method == METHOD_MPUIO) { + u32 offset = OMAP_MPUIO_GPIO_MASKIT / bank->stride; + return (~gpio_mpuio_read(bank->base, offset)) + & MPUIO_GPIO_IRQENA_MASK; } - l = __raw_readl(reg); - if (inv) - l = ~l; - l &= mask; - return l; + return gpio_fn.gpio_is_irqena(bank->base); } static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask, int enable) { - void __iomem *reg = bank->base; - u32 l; + if (bank->method == METHOD_MPUIO) { + u32 offset = OMAP_MPUIO_GPIO_MASKIT / bank->stride; + u32 l = gpio_mpuio_read(bank->base, offset); - switch (bank->method) { -#ifdef CONFIG_ARCH_OMAP1 - case METHOD_MPUIO: - reg += OMAP_MPUIO_GPIO_MASKIT / bank->stride; - l = __raw_readl(reg); - if (enable) - l &= ~(gpio_mask); - else - l |= gpio_mask; - break; -#endif -#ifdef CONFIG_ARCH_OMAP15XX - case METHOD_GPIO_1510: - reg += OMAP1510_GPIO_INT_MASK; - l = __raw_readl(reg); - if (enable) - l &= ~(gpio_mask); - else - l |= gpio_mask; - break; -#endif -#ifdef CONFIG_ARCH_OMAP16XX - case METHOD_GPIO_1610: - if (enable) - reg += OMAP1610_GPIO_SET_IRQENABLE1; - else - reg += OMAP1610_GPIO_CLEAR_IRQENABLE1; - l = gpio_mask; - break; -#endif -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) - case METHOD_GPIO_7XX: - reg += OMAP7XX_GPIO_INT_MASK; - l = __raw_readl(reg); if (enable) l &= ~(gpio_mask); else l |= gpio_mask; - break; -#endif -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) - case METHOD_GPIO_24XX: - if (enable) - reg += OMAP24XX_GPIO_SETIRQENABLE1; - else - reg += OMAP24XX_GPIO_CLEARIRQENABLE1; - l = gpio_mask; - break; -#endif -#ifdef CONFIG_ARCH_OMAP4 - case METHOD_GPIO_44XX: - if (enable) - reg += OMAP4_GPIO_IRQSTATUSSET0; - else - reg += OMAP4_GPIO_IRQSTATUSCLR0; - l = gpio_mask; - break; -#endif - default: - WARN_ON(1); - return; + + gpio_mpuio_write(l, bank->base, offset); + } else { + gpio_fn.gpio_enable_irq(bank->base, gpio_mask, enable); } - __raw_writel(l, reg); } static inline void _set_gpio_irqenable(struct gpio_bank *bank, int gpio, int enable) @@ -1468,6 +1341,8 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev) gpio_fn.gpio_read = pdata->gpio_fn->gpio_read; gpio_fn.gpio_write = pdata->gpio_fn->gpio_write; gpio_fn.gpio_set_trigger = pdata->gpio_fn->gpio_set_trigger; + gpio_fn.gpio_is_irqena = pdata->gpio_fn->gpio_is_irqena; + gpio_fn.gpio_enable_irq = pdata->gpio_fn->gpio_enable_irq; } id = pdev->id; diff --git a/arch/arm/plat-omap/include/plat/gpio.h b/arch/arm/plat-omap/include/plat/gpio.h index b7c10bd..c21f2e9 100644 --- a/arch/arm/plat-omap/include/plat/gpio.h +++ b/arch/arm/plat-omap/include/plat/gpio.h @@ -114,6 +114,8 @@ struct omap_gpio_func { u32 (*gpio_read)(void __iomem *base, int reg); void (*gpio_write)(u32 val, void __iomem *base, int reg); int (*gpio_set_trigger)(void __iomem *base, int gpio, int trigger); + u32 (*gpio_is_irqena)(void __iomem *base); + void (*gpio_enable_irq)(void __iomem *base, int gpio_mask, int enable); }; struct omap_gpio_platform_data {