From: s.hauer@pengutronix.de (Sascha Hauer) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH 6/9] ARM i.MX 3ds debugboard: allocate irqs dynamically Date: Fri, 20 May 2011 09:59:22 +0200 [thread overview] Message-ID: <1305878365-827-8-git-send-email-s.hauer@pengutronix.de> (raw) In-Reply-To: <1305878365-827-1-git-send-email-s.hauer@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> --- arch/arm/plat-mxc/3ds_debugboard.c | 53 ++++++++++++++++++++--------------- 1 files changed, 30 insertions(+), 23 deletions(-) diff --git a/arch/arm/plat-mxc/3ds_debugboard.c b/arch/arm/plat-mxc/3ds_debugboard.c index f0ba072..e644cd9 100644 --- a/arch/arm/plat-mxc/3ds_debugboard.c +++ b/arch/arm/plat-mxc/3ds_debugboard.c @@ -46,18 +46,14 @@ /* CPU ID and Personality ID */ #define MCU_BOARD_ID_REG 0x68 -#define MXC_IRQ_TO_EXPIO(irq) ((irq) - MXC_BOARD_IRQ_START) -#define MXC_IRQ_TO_GPIO(irq) ((irq) - MXC_INTERNAL_IRQS) - -#define MXC_EXP_IO_BASE (MXC_BOARD_IRQ_START) #define MXC_MAX_EXP_IO_LINES 16 /* interrupts like external uart , external ethernet etc*/ -#define EXPIO_INT_ENET (MXC_BOARD_IRQ_START + 0) -#define EXPIO_INT_XUART_A (MXC_BOARD_IRQ_START + 1) -#define EXPIO_INT_XUART_B (MXC_BOARD_IRQ_START + 2) -#define EXPIO_INT_BUTTON_A (MXC_BOARD_IRQ_START + 3) -#define EXPIO_INT_BUTTON_B (MXC_BOARD_IRQ_START + 4) +#define EXPIO_INT_ENET 0 +#define EXPIO_INT_XUART_A 1 +#define EXPIO_INT_XUART_B 2 +#define EXPIO_INT_BUTTON_A 3 +#define EXPIO_INT_BUTTON_B 4 static void __iomem *brd_io; @@ -65,8 +61,6 @@ static struct resource smsc911x_resources[] = { { .flags = IORESOURCE_MEM, } , { - .start = EXPIO_INT_ENET, - .end = EXPIO_INT_ENET, .flags = IORESOURCE_IRQ, }, }; @@ -86,6 +80,8 @@ static struct platform_device smsc_lan9217_device = { .resource = smsc911x_resources, }; +static int mxc_expio_base_irq; + static void mxc_expio_irq_handler(u32 irq, struct irq_desc *desc) { u32 imr_val; @@ -98,7 +94,7 @@ static void mxc_expio_irq_handler(u32 irq, struct irq_desc *desc) imr_val = __raw_readw(brd_io + INTR_MASK_REG); int_valid = __raw_readw(brd_io + INTR_STATUS_REG) & ~imr_val; - expio_irq = MXC_BOARD_IRQ_START; + expio_irq = mxc_expio_base_irq; for (; int_valid != 0; int_valid >>= 1, expio_irq++) { if ((int_valid & 1) == 0) continue; @@ -116,7 +112,7 @@ static void mxc_expio_irq_handler(u32 irq, struct irq_desc *desc) static void expio_mask_irq(struct irq_data *d) { u16 reg; - u32 expio = MXC_IRQ_TO_EXPIO(d->irq); + u32 expio = d->irq - mxc_expio_base_irq; reg = __raw_readw(brd_io + INTR_MASK_REG); reg |= (1 << expio); @@ -125,7 +121,7 @@ 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); + u32 expio = d->irq - mxc_expio_base_irq; __raw_writew(1 << expio, brd_io + INTR_RESET_REG); __raw_writew(0, brd_io + INTR_RESET_REG); @@ -135,7 +131,7 @@ static void expio_ack_irq(struct irq_data *d) static void expio_unmask_irq(struct irq_data *d) { u16 reg; - u32 expio = MXC_IRQ_TO_EXPIO(d->irq); + u32 expio = d->irq - mxc_expio_base_irq; reg = __raw_readw(brd_io + INTR_MASK_REG); reg &= ~(1 << expio); @@ -150,7 +146,7 @@ static struct irq_chip expio_irq_chip = { int __init mxc_expio_init(u32 base, u32 p_irq) { - int i; + int ret, i; brd_io = ioremap(BOARD_IO_ADDR(base), SZ_4K); if (brd_io == NULL) @@ -160,9 +156,8 @@ int __init mxc_expio_init(u32 base, u32 p_irq) (__raw_readw(brd_io + MAGIC_NUMBER2_REG) != 0x5555) || (__raw_readw(brd_io + MAGIC_NUMBER3_REG) != 0xCAFE)) { pr_info("3-Stack Debug board not detected\n"); - iounmap(brd_io); - brd_io = NULL; - return -ENODEV; + ret = -ENODEV; + goto out; } pr_info("3-Stack Debug board detected, rev = 0x%04X\n", @@ -171,16 +166,23 @@ int __init mxc_expio_init(u32 base, u32 p_irq) /* * Configure INT line as GPIO input */ - gpio_request(MXC_IRQ_TO_GPIO(p_irq), "expio_pirq"); - gpio_direction_input(MXC_IRQ_TO_GPIO(p_irq)); + gpio_request(irq_to_gpio(p_irq), "expio_pirq"); + gpio_direction_input(irq_to_gpio(p_irq)); /* disable the interrupt and clear the status */ __raw_writew(0, brd_io + INTR_MASK_REG); __raw_writew(0xFFFF, brd_io + INTR_RESET_REG); __raw_writew(0, brd_io + INTR_RESET_REG); __raw_writew(0x1F, brd_io + INTR_MASK_REG); - for (i = MXC_EXP_IO_BASE; - i < (MXC_EXP_IO_BASE + MXC_MAX_EXP_IO_LINES); i++) { + + mxc_expio_base_irq = irq_alloc_descs(-1, 0, MXC_MAX_EXP_IO_LINES, 0); + if (mxc_expio_base_irq < 0) { + ret = mxc_expio_base_irq; + goto out; + } + + for (i = mxc_expio_base_irq; + i < mxc_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); } @@ -190,7 +192,12 @@ int __init mxc_expio_init(u32 base, u32 p_irq) /* Register Lan device on the debugboard */ smsc911x_resources[0].start = LAN9217_BASE_ADDR(base); smsc911x_resources[0].end = LAN9217_BASE_ADDR(base) + 0x100 - 1; + smsc911x_resources[1].start = mxc_expio_base_irq + EXPIO_INT_ENET; + smsc911x_resources[1].end = mxc_expio_base_irq + EXPIO_INT_ENET; platform_device_register(&smsc_lan9217_device); return 0; +out: + iounmap(brd_io); + return ret; } -- 1.7.4.1
next prev parent reply other threads:[~2011-05-20 7:59 UTC|newest] Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top 2011-05-20 7:59 i.MX: switch to sparse irqs Sascha Hauer 2011-05-20 7:59 ` [PATCH 1/9] ARM i.MX tzic: do not depend on MXC_INTERNAL_IRQS Sascha Hauer 2011-05-20 7:59 ` [PATCH] mfd wm8350: allocate irq descs dynamically Sascha Hauer 2011-05-20 12:52 ` Thomas Gleixner 2011-05-20 13:07 ` Sascha Hauer 2011-05-20 13:19 ` Thomas Gleixner 2011-05-21 11:29 ` Mark Brown 2011-05-23 6:25 ` Sascha Hauer 2011-05-23 10:44 ` Mark Brown 2011-05-23 14:41 ` Sascha Hauer 2011-05-23 15:22 ` Mark Brown 2011-05-23 16:46 ` Sascha Hauer 2011-05-23 22:41 ` Mark Brown 2011-05-24 7:28 ` Sascha Hauer 2011-05-24 9:46 ` Mark Brown 2011-05-24 11:52 ` Sascha Hauer 2011-05-24 15:35 ` Mark Brown 2011-05-25 8:13 ` Sascha Hauer 2011-05-25 9:23 ` Mark Brown 2011-05-25 19:10 ` Sascha Hauer 2011-05-20 7:59 ` [PATCH 2/9] ARM i.MX avic: do not depend on MXC_INTERNAL_IRQS Sascha Hauer 2011-05-20 7:59 ` [PATCH 3/9] ARM i.MX: get rid of wrong MXC_INTERNAL_IRQ usage Sascha Hauer 2011-05-20 7:59 ` [PATCH 4/9] mfd wm8350: allocate irq descs dynamically Sascha Hauer 2011-05-20 7:59 ` [PATCH 5/9] ARM i.MX mx31ads: allocate irqs for expio dynamically Sascha Hauer 2011-05-20 7:59 ` Sascha Hauer [this message] 2011-05-20 7:59 ` [PATCH 7/9] ARM i.MX: use sparse irqs Sascha Hauer 2011-05-20 7:59 ` [PATCH 8/9] dma IPU: rework irq handling Sascha Hauer 2011-05-20 13:16 ` Thomas Gleixner 2011-05-20 13:30 ` Sascha Hauer 2011-05-20 16:46 ` Thomas Gleixner 2011-05-20 22:11 ` Benjamin Herrenschmidt 2011-05-20 7:59 ` [PATCH 9/9] ARM i.MX3: remove now useless ipu platform data from boards Sascha Hauer
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1305878365-827-8-git-send-email-s.hauer@pengutronix.de \ --to=s.hauer@pengutronix.de \ --cc=linux-arm-kernel@lists.infradead.org \ --subject='Re: [PATCH 6/9] ARM i.MX 3ds debugboard: allocate irqs dynamically' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.