From patchwork Fri May 20 07:59:21 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sascha Hauer X-Patchwork-Id: 802592 Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id p4K83CiQ016083 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 20 May 2011 08:03:32 GMT Received: from canuck.infradead.org ([2001:4978:20e::1]) by bombadil.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux)) id 1QNKeS-0004EE-F7; Fri, 20 May 2011 08:01:40 +0000 Received: from localhost ([127.0.0.1] helo=canuck.infradead.org) by canuck.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1QNKeQ-0004gA-K4; Fri, 20 May 2011 08:01:38 +0000 Received: from metis.ext.pengutronix.de ([2001:6f8:1178:4:290:27ff:fe1d:cc33]) by canuck.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux)) id 1QNKcM-0004Z6-Sd for linux-arm-kernel@lists.infradead.org; Fri, 20 May 2011 07:59:39 +0000 Received: from octopus.hi.pengutronix.de ([2001:6f8:1178:2:215:17ff:fe12:23b0]) by metis.ext.pengutronix.de with esmtp (Exim 4.72) (envelope-from ) id 1QNKcJ-0005jG-2d; Fri, 20 May 2011 09:59:27 +0200 Received: from sha by octopus.hi.pengutronix.de with local (Exim 4.75) (envelope-from ) id 1QNKcI-0000VL-Ud; Fri, 20 May 2011 09:59:26 +0200 From: Sascha Hauer To: alkml Subject: [PATCH 5/9] ARM i.MX mx31ads: allocate irqs for expio dynamically Date: Fri, 20 May 2011 09:59:21 +0200 Message-Id: <1305878365-827-7-git-send-email-s.hauer@pengutronix.de> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1305878365-827-1-git-send-email-s.hauer@pengutronix.de> References: <1305878365-827-1-git-send-email-s.hauer@pengutronix.de> X-SA-Exim-Connect-IP: 2001:6f8:1178:2:215:17ff:fe12:23b0 X-SA-Exim-Mail-From: sha@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-arm-kernel@lists.infradead.org X-CRM114-Version: 20090807-BlameThorstenAndJenny ( TRE 0.7.6 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20110520_035931_620210_4DD4A9ED X-CRM114-Status: GOOD ( 23.35 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.3.1 on canuck.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 T_RP_MATCHES_RCVD Envelope sender domain matches handover relay domain Cc: Thomas Gleixner , Sascha Hauer , Guennadi Liakhovetski X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: linux-arm-kernel-bounces@lists.infradead.org Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.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, 20 May 2011 08:03:32 +0000 (UTC) Signed-off-by: Sascha Hauer --- arch/arm/mach-imx/mach-mx31ads.c | 45 +++++++++++++++++++------------------ 1 files changed, 23 insertions(+), 22 deletions(-) diff --git a/arch/arm/mach-imx/mach-mx31ads.c b/arch/arm/mach-imx/mach-mx31ads.c index f4dee02..d183592 100644 --- a/arch/arm/mach-imx/mach-mx31ads.c +++ b/arch/arm/mach-imx/mach-mx31ads.c @@ -62,11 +62,6 @@ #define PBC_INTMASK_CLEAR_REG (PBC_INTMASK_CLEAR + PBC_BASE_ADDRESS) #define EXPIO_PARENT_INT IOMUX_TO_IRQ(MX31_PIN_GPIO1_4) -#define MXC_IRQ_TO_EXPIO(irq) ((irq) - MXC_EXP_IO_BASE) - -#define EXPIO_INT_XUART_INTA (MXC_EXP_IO_BASE + 10) -#define EXPIO_INT_XUART_INTB (MXC_EXP_IO_BASE + 11) - #define MXC_MAX_EXP_IO_LINES 16 /* @@ -76,7 +71,6 @@ static struct plat_serial8250_port serial_platform_data[] = { { .membase = (void *)(PBC_BASE_ADDRESS + PBC_SC16C652_UARTA), .mapbase = (unsigned long)(MX31_CS4_BASE_ADDR + PBC_SC16C652_UARTA), - .irq = EXPIO_INT_XUART_INTA, .uartclk = 14745600, .regshift = 0, .iotype = UPIO_MEM, @@ -84,7 +78,6 @@ static struct plat_serial8250_port serial_platform_data[] = { }, { .membase = (void *)(PBC_BASE_ADDRESS + PBC_SC16C652_UARTB), .mapbase = (unsigned long)(MX31_CS4_BASE_ADDR + PBC_SC16C652_UARTB), - .irq = EXPIO_INT_XUART_INTB, .uartclk = 14745600, .regshift = 0, .iotype = UPIO_MEM, @@ -101,11 +94,6 @@ static struct platform_device serial_device = { }, }; -static int __init mxc_init_extuart(void) -{ - return platform_device_register(&serial_device); -} - static const struct imxuart_platform_data uart_pdata __initconst = { .flags = IMXUART_HAVE_RTSCTS, }; @@ -123,6 +111,8 @@ static inline void mxc_init_imx_uart(void) imx31_add_imx_uart0(&uart_pdata); } +static int expio_base_irq; + static void mx31ads_expio_irq_handler(u32 irq, struct irq_desc *desc) { u32 imr_val; @@ -132,7 +122,7 @@ static void mx31ads_expio_irq_handler(u32 irq, struct irq_desc *desc) imr_val = __raw_readw(PBC_INTMASK_SET_REG); int_valid = __raw_readw(PBC_INTSTATUS_REG) & imr_val; - expio_irq = MXC_EXP_IO_BASE; + expio_irq = expio_base_irq; for (; int_valid != 0; int_valid >>= 1, expio_irq++) { if ((int_valid & 1) == 0) continue; @@ -147,8 +137,8 @@ static void mx31ads_expio_irq_handler(u32 irq, struct irq_desc *desc) */ static void expio_mask_irq(struct irq_data *d) { - u32 expio = MXC_IRQ_TO_EXPIO(d->irq); - /* mask the interrupt */ + u32 expio = d->irq - expio_base_irq; + __raw_writew(1 << expio, PBC_INTMASK_CLEAR_REG); __raw_readw(PBC_INTMASK_CLEAR_REG); } @@ -159,8 +149,8 @@ static void expio_mask_irq(struct irq_data *d) */ static void expio_ack_irq(struct irq_data *d) { - u32 expio = MXC_IRQ_TO_EXPIO(d->irq); - /* clear the interrupt status */ + u32 expio = d->irq - expio_base_irq; + __raw_writew(1 << expio, PBC_INTSTATUS_REG); } @@ -170,8 +160,8 @@ static void expio_ack_irq(struct irq_data *d) */ static void expio_unmask_irq(struct irq_data *d) { - u32 expio = MXC_IRQ_TO_EXPIO(d->irq); - /* unmask the interrupt */ + u32 expio = d->irq - expio_base_irq; + __raw_writew(1 << expio, PBC_INTMASK_SET_REG); } @@ -188,6 +178,13 @@ static void __init mx31ads_init_expio(void) printk(KERN_INFO "MX31ADS EXPIO(CPLD) hardware\n"); + /* Currently we rely on the exact irq number as this must be hardcoded + * into the cs89x0 driver + */ + expio_base_irq = irq_alloc_descs(-1, MXC_EXP_IO_BASE, MXC_MAX_EXP_IO_LINES, 0); + if (expio_base_irq != MXC_EXP_IO_BASE) + return; + /* * Configure INT line as GPIO input */ @@ -196,13 +193,18 @@ static void __init mx31ads_init_expio(void) /* disable the interrupt and clear the status */ __raw_writew(0xFFFF, PBC_INTMASK_CLEAR_REG); __raw_writew(0xFFFF, PBC_INTSTATUS_REG); - for (i = MXC_EXP_IO_BASE; i < (MXC_EXP_IO_BASE + MXC_MAX_EXP_IO_LINES); + for (i = expio_base_irq; i < (expio_base_irq + MXC_MAX_EXP_IO_LINES); i++) { irq_set_chip_and_handler(i, &expio_irq_chip, handle_level_irq); set_irq_flags(i, IRQF_VALID); } irq_set_irq_type(EXPIO_PARENT_INT, IRQ_TYPE_LEVEL_HIGH); irq_set_chained_handler(EXPIO_PARENT_INT, mx31ads_expio_irq_handler); + + serial_platform_data[0].irq = expio_base_irq + 10; + serial_platform_data[1].irq = expio_base_irq + 11; + + platform_device_register(&serial_device); } #ifdef CONFIG_MACH_MX31ADS_WM1133_EV1 @@ -511,12 +513,11 @@ static void __init mx31ads_map_io(void) static void __init mx31ads_init_irq(void) { mx31_init_irq(); - mx31ads_init_expio(); } static void __init mx31ads_init(void) { - mxc_init_extuart(); + mx31ads_init_expio(); mxc_init_imx_uart(); mxc_init_i2c(); mxc_init_audio();