diff options
Diffstat (limited to 'packages/linux/linux-2.6.18/avr32-arch-neutral-gpio-api.patch')
-rw-r--r-- | packages/linux/linux-2.6.18/avr32-arch-neutral-gpio-api.patch | 598 |
1 files changed, 0 insertions, 598 deletions
diff --git a/packages/linux/linux-2.6.18/avr32-arch-neutral-gpio-api.patch b/packages/linux/linux-2.6.18/avr32-arch-neutral-gpio-api.patch deleted file mode 100644 index 049d5e3a94..0000000000 --- a/packages/linux/linux-2.6.18/avr32-arch-neutral-gpio-api.patch +++ /dev/null @@ -1,598 +0,0 @@ -From 05ac6cbfecf9e9b0ab46ba5f30eec8ea91b2987c Mon Sep 17 00:00:00 2001 -From: Haavard Skinnemoen <hskinnemoen@atmel.com> -Date: Mon, 13 Nov 2006 10:23:15 +0100 -Subject: [AVR32] Implement arch-neutral GPIO API - -AVR32 implementation of the arch-neutral GPIO API described by -Documentation/gpio.txt. - -This also contains a few related changes to the irq handling and -pin configuration code, to make this actually usable. - -Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com> ---- - arch/avr32/mach-at32ap/at32ap7000.c | 144 ++++++++++------------ - arch/avr32/mach-at32ap/pio.c | 186 +++++++++++++++++++++++++++-- - include/asm-avr32/arch-at32ap/at32ap7000.h | 26 ++++ - include/asm-avr32/arch-at32ap/gpio.h | 39 ++++++ - include/asm-avr32/arch-at32ap/irq.h | 11 + - include/asm-avr32/arch-at32ap/portmux.h | 16 -- - include/asm-avr32/gpio.h | 6 - include/asm-avr32/irq.h | 8 - - 8 files changed, 333 insertions(+), 103 deletions(-) - -Index: linux-2.6.18-avr32/arch/avr32/mach-at32ap/at32ap7000.c -=================================================================== ---- linux-2.6.18-avr32.orig/arch/avr32/mach-at32ap/at32ap7000.c 2006-11-29 16:21:12.000000000 +0100 -+++ linux-2.6.18-avr32/arch/avr32/mach-at32ap/at32ap7000.c 2006-11-29 16:22:14.000000000 +0100 -@@ -11,8 +11,9 @@ - - #include <asm/io.h> - -+#include <asm/arch/at32ap7000.h> - #include <asm/arch/board.h> --#include <asm/arch/portmux.h> -+#include <asm/arch/gpio.h> - #include <asm/arch/sm.h> - - #include "clock.h" -@@ -67,17 +68,8 @@ static struct clk devname##_##_name = { - .index = _index, \ - } - --enum { -- PIOA, -- PIOB, -- PIOC, -- PIOD, --}; -- --enum { -- FUNC_A, -- FUNC_B, --}; -+#define select_peripheral(pin, periph, pullup) \ -+ at32_select_periph(GPIO_PIN_##pin, GPIO_##periph, pullup) - - unsigned long at32ap7000_osc_rates[3] = { - [0] = 32768, -@@ -553,26 +545,26 @@ DEV_CLK(usart, usart3, pba, 6); - - static inline void configure_usart0_pins(void) - { -- portmux_set_func(PIOA, 8, FUNC_B); /* RXD */ -- portmux_set_func(PIOA, 9, FUNC_B); /* TXD */ -+ select_peripheral(PA(8), PERIPH_B, 0); /* RXD */ -+ select_peripheral(PA(9), PERIPH_B, 0); /* TXD */ - } - - static inline void configure_usart1_pins(void) - { -- portmux_set_func(PIOA, 17, FUNC_A); /* RXD */ -- portmux_set_func(PIOA, 18, FUNC_A); /* TXD */ -+ select_peripheral(PA(17), PERIPH_A, 0); /* RXD */ -+ select_peripheral(PA(18), PERIPH_A, 0); /* TXD */ - } - - static inline void configure_usart2_pins(void) - { -- portmux_set_func(PIOB, 26, FUNC_B); /* RXD */ -- portmux_set_func(PIOB, 27, FUNC_B); /* TXD */ -+ select_peripheral(PB(26), PERIPH_B, 0); /* RXD */ -+ select_peripheral(PB(27), PERIPH_B, 0); /* TXD */ - } - - static inline void configure_usart3_pins(void) - { -- portmux_set_func(PIOB, 18, FUNC_B); /* RXD */ -- portmux_set_func(PIOB, 17, FUNC_B); /* TXD */ -+ select_peripheral(PB(18), PERIPH_B, 0); /* RXD */ -+ select_peripheral(PB(17), PERIPH_B, 0); /* TXD */ - } - - static struct platform_device *setup_usart(unsigned int id) -@@ -644,27 +636,27 @@ at32_add_device_eth(unsigned int id, str - case 0: - pdev = &macb0_device; - -- portmux_set_func(PIOC, 3, FUNC_A); /* TXD0 */ -- portmux_set_func(PIOC, 4, FUNC_A); /* TXD1 */ -- portmux_set_func(PIOC, 7, FUNC_A); /* TXEN */ -- portmux_set_func(PIOC, 8, FUNC_A); /* TXCK */ -- portmux_set_func(PIOC, 9, FUNC_A); /* RXD0 */ -- portmux_set_func(PIOC, 10, FUNC_A); /* RXD1 */ -- portmux_set_func(PIOC, 13, FUNC_A); /* RXER */ -- portmux_set_func(PIOC, 15, FUNC_A); /* RXDV */ -- portmux_set_func(PIOC, 16, FUNC_A); /* MDC */ -- portmux_set_func(PIOC, 17, FUNC_A); /* MDIO */ -+ select_peripheral(PC(3), PERIPH_A, 0); /* TXD0 */ -+ select_peripheral(PC(4), PERIPH_A, 0); /* TXD1 */ -+ select_peripheral(PC(7), PERIPH_A, 0); /* TXEN */ -+ select_peripheral(PC(8), PERIPH_A, 0); /* TXCK */ -+ select_peripheral(PC(9), PERIPH_A, 0); /* RXD0 */ -+ select_peripheral(PC(10), PERIPH_A, 0); /* RXD1 */ -+ select_peripheral(PC(13), PERIPH_A, 0); /* RXER */ -+ select_peripheral(PC(15), PERIPH_A, 0); /* RXDV */ -+ select_peripheral(PC(16), PERIPH_A, 0); /* MDC */ -+ select_peripheral(PC(17), PERIPH_A, 0); /* MDIO */ - - if (!data->is_rmii) { -- portmux_set_func(PIOC, 0, FUNC_A); /* COL */ -- portmux_set_func(PIOC, 1, FUNC_A); /* CRS */ -- portmux_set_func(PIOC, 2, FUNC_A); /* TXER */ -- portmux_set_func(PIOC, 5, FUNC_A); /* TXD2 */ -- portmux_set_func(PIOC, 6, FUNC_A); /* TXD3 */ -- portmux_set_func(PIOC, 11, FUNC_A); /* RXD2 */ -- portmux_set_func(PIOC, 12, FUNC_A); /* RXD3 */ -- portmux_set_func(PIOC, 14, FUNC_A); /* RXCK */ -- portmux_set_func(PIOC, 18, FUNC_A); /* SPD */ -+ select_peripheral(PC(0), PERIPH_A, 0); /* COL */ -+ select_peripheral(PC(1), PERIPH_A, 0); /* CRS */ -+ select_peripheral(PC(2), PERIPH_A, 0); /* TXER */ -+ select_peripheral(PC(5), PERIPH_A, 0); /* TXD2 */ -+ select_peripheral(PC(6), PERIPH_A, 0); /* TXD3 */ -+ select_peripheral(PC(11), PERIPH_A, 0); /* RXD2 */ -+ select_peripheral(PC(12), PERIPH_A, 0); /* RXD3 */ -+ select_peripheral(PC(14), PERIPH_A, 0); /* RXCK */ -+ select_peripheral(PC(18), PERIPH_A, 0); /* SPD */ - } - break; - -@@ -695,12 +687,12 @@ struct platform_device *__init at32_add_ - switch (id) { - case 0: - pdev = &spi0_device; -- portmux_set_func(PIOA, 0, FUNC_A); /* MISO */ -- portmux_set_func(PIOA, 1, FUNC_A); /* MOSI */ -- portmux_set_func(PIOA, 2, FUNC_A); /* SCK */ -- portmux_set_func(PIOA, 3, FUNC_A); /* NPCS0 */ -- portmux_set_func(PIOA, 4, FUNC_A); /* NPCS1 */ -- portmux_set_func(PIOA, 5, FUNC_A); /* NPCS2 */ -+ select_peripheral(PA(0), PERIPH_A, 0); /* MISO */ -+ select_peripheral(PA(1), PERIPH_A, 0); /* MOSI */ -+ select_peripheral(PA(2), PERIPH_A, 0); /* SCK */ -+ select_peripheral(PA(3), PERIPH_A, 0); /* NPCS0 */ -+ select_peripheral(PA(4), PERIPH_A, 0); /* NPCS1 */ -+ select_peripheral(PA(5), PERIPH_A, 0); /* NPCS2 */ - break; - - default: -@@ -743,37 +735,37 @@ at32_add_device_lcdc(unsigned int id, st - switch (id) { - case 0: - pdev = &lcdc0_device; -- portmux_set_func(PIOC, 19, FUNC_A); /* CC */ -- portmux_set_func(PIOC, 20, FUNC_A); /* HSYNC */ -- portmux_set_func(PIOC, 21, FUNC_A); /* PCLK */ -- portmux_set_func(PIOC, 22, FUNC_A); /* VSYNC */ -- portmux_set_func(PIOC, 23, FUNC_A); /* DVAL */ -- portmux_set_func(PIOC, 24, FUNC_A); /* MODE */ -- portmux_set_func(PIOC, 25, FUNC_A); /* PWR */ -- portmux_set_func(PIOC, 26, FUNC_A); /* DATA0 */ -- portmux_set_func(PIOC, 27, FUNC_A); /* DATA1 */ -- portmux_set_func(PIOC, 28, FUNC_A); /* DATA2 */ -- portmux_set_func(PIOC, 29, FUNC_A); /* DATA3 */ -- portmux_set_func(PIOC, 30, FUNC_A); /* DATA4 */ -- portmux_set_func(PIOC, 31, FUNC_A); /* DATA5 */ -- portmux_set_func(PIOD, 0, FUNC_A); /* DATA6 */ -- portmux_set_func(PIOD, 1, FUNC_A); /* DATA7 */ -- portmux_set_func(PIOD, 2, FUNC_A); /* DATA8 */ -- portmux_set_func(PIOD, 3, FUNC_A); /* DATA9 */ -- portmux_set_func(PIOD, 4, FUNC_A); /* DATA10 */ -- portmux_set_func(PIOD, 5, FUNC_A); /* DATA11 */ -- portmux_set_func(PIOD, 6, FUNC_A); /* DATA12 */ -- portmux_set_func(PIOD, 7, FUNC_A); /* DATA13 */ -- portmux_set_func(PIOD, 8, FUNC_A); /* DATA14 */ -- portmux_set_func(PIOD, 9, FUNC_A); /* DATA15 */ -- portmux_set_func(PIOD, 10, FUNC_A); /* DATA16 */ -- portmux_set_func(PIOD, 11, FUNC_A); /* DATA17 */ -- portmux_set_func(PIOD, 12, FUNC_A); /* DATA18 */ -- portmux_set_func(PIOD, 13, FUNC_A); /* DATA19 */ -- portmux_set_func(PIOD, 14, FUNC_A); /* DATA20 */ -- portmux_set_func(PIOD, 15, FUNC_A); /* DATA21 */ -- portmux_set_func(PIOD, 16, FUNC_A); /* DATA22 */ -- portmux_set_func(PIOD, 17, FUNC_A); /* DATA23 */ -+ select_peripheral(PC(19), PERIPH_A, 0); /* CC */ -+ select_peripheral(PC(20), PERIPH_A, 0); /* HSYNC */ -+ select_peripheral(PC(21), PERIPH_A, 0); /* PCLK */ -+ select_peripheral(PC(22), PERIPH_A, 0); /* VSYNC */ -+ select_peripheral(PC(23), PERIPH_A, 0); /* DVAL */ -+ select_peripheral(PC(24), PERIPH_A, 0); /* MODE */ -+ select_peripheral(PC(25), PERIPH_A, 0); /* PWR */ -+ select_peripheral(PC(26), PERIPH_A, 0); /* DATA0 */ -+ select_peripheral(PC(27), PERIPH_A, 0); /* DATA1 */ -+ select_peripheral(PC(28), PERIPH_A, 0); /* DATA2 */ -+ select_peripheral(PC(29), PERIPH_A, 0); /* DATA3 */ -+ select_peripheral(PC(30), PERIPH_A, 0); /* DATA4 */ -+ select_peripheral(PC(31), PERIPH_A, 0); /* DATA5 */ -+ select_peripheral(PD(0), PERIPH_A, 0); /* DATA6 */ -+ select_peripheral(PD(1), PERIPH_A, 0); /* DATA7 */ -+ select_peripheral(PD(2), PERIPH_A, 0); /* DATA8 */ -+ select_peripheral(PD(3), PERIPH_A, 0); /* DATA9 */ -+ select_peripheral(PD(4), PERIPH_A, 0); /* DATA10 */ -+ select_peripheral(PD(5), PERIPH_A, 0); /* DATA11 */ -+ select_peripheral(PD(6), PERIPH_A, 0); /* DATA12 */ -+ select_peripheral(PD(7), PERIPH_A, 0); /* DATA13 */ -+ select_peripheral(PD(8), PERIPH_A, 0); /* DATA14 */ -+ select_peripheral(PD(9), PERIPH_A, 0); /* DATA15 */ -+ select_peripheral(PD(10), PERIPH_A, 0); /* DATA16 */ -+ select_peripheral(PD(11), PERIPH_A, 0); /* DATA17 */ -+ select_peripheral(PD(12), PERIPH_A, 0); /* DATA18 */ -+ select_peripheral(PD(13), PERIPH_A, 0); /* DATA19 */ -+ select_peripheral(PD(14), PERIPH_A, 0); /* DATA20 */ -+ select_peripheral(PD(15), PERIPH_A, 0); /* DATA21 */ -+ select_peripheral(PD(16), PERIPH_A, 0); /* DATA22 */ -+ select_peripheral(PD(17), PERIPH_A, 0); /* DATA23 */ - - clk_set_parent(&lcdc0_pixclk, &pll0); - clk_set_rate(&lcdc0_pixclk, clk_get_rate(&pll0)); -Index: linux-2.6.18-avr32/arch/avr32/mach-at32ap/pio.c -=================================================================== ---- linux-2.6.18-avr32.orig/arch/avr32/mach-at32ap/pio.c 2006-11-29 16:21:12.000000000 +0100 -+++ linux-2.6.18-avr32/arch/avr32/mach-at32ap/pio.c 2006-11-29 16:22:14.000000000 +0100 -@@ -13,10 +13,9 @@ - #include <linux/fs.h> - #include <linux/platform_device.h> - -+#include <asm/gpio.h> - #include <asm/io.h> - --#include <asm/arch/portmux.h> -- - #include "pio.h" - - #define MAX_NR_PIO_DEVICES 8 -@@ -25,28 +24,191 @@ struct pio_device { - void __iomem *regs; - const struct platform_device *pdev; - struct clk *clk; -- u32 alloc_mask; -+ u32 pinmux_mask; -+ u32 gpio_mask; - char name[32]; - }; - - static struct pio_device pio_dev[MAX_NR_PIO_DEVICES]; - --void portmux_set_func(unsigned int portmux_id, unsigned int pin_id, -- unsigned int function_id) -+static struct pio_device *gpio_to_pio(unsigned int gpio) - { - struct pio_device *pio; -- u32 mask = 1 << pin_id; -+ unsigned int index; -+ -+ index = gpio >> 5; -+ if (index >= MAX_NR_PIO_DEVICES) -+ return NULL; -+ pio = &pio_dev[index]; -+ if (!pio->regs) -+ return NULL; -+ -+ return pio; -+} -+ -+/* Pin multiplexing API */ - -- BUG_ON(portmux_id >= MAX_NR_PIO_DEVICES); -+void __init at32_select_periph(unsigned int pin, unsigned int periph, -+ int use_pullup) -+{ -+ struct pio_device *pio; -+ unsigned int pin_index = pin & 0x1f; -+ u32 mask = 1 << pin_index; -+ -+ pio = gpio_to_pio(pin); -+ if (unlikely(!pio)) { -+ printk("pio: invalid pin %u\n", pin); -+ goto fail; -+ } - -- pio = &pio_dev[portmux_id]; -+ if (unlikely(test_and_set_bit(pin_index, &pio->pinmux_mask))) { -+ printk("%s: pin %u is busy\n", pio->name, pin_index); -+ goto fail; -+ } - -- if (function_id) -+ pio_writel(pio, PUER, mask); -+ if (periph) - pio_writel(pio, BSR, mask); - else - pio_writel(pio, ASR, mask); -+ - pio_writel(pio, PDR, mask); -+ if (!use_pullup) -+ pio_writel(pio, PUDR, mask); -+ -+ return; -+ -+fail: -+ dump_stack(); -+} -+ -+void __init at32_select_gpio(unsigned int pin, int enable_output, -+ int use_pullup) -+{ -+ struct pio_device *pio; -+ unsigned int pin_index = pin & 0x1f; -+ u32 mask = 1 << pin_index; -+ -+ pio = gpio_to_pio(pin); -+ if (unlikely(!pio)) { -+ printk("pio: invalid pin %u\n", pin); -+ goto fail; -+ } -+ -+ if (unlikely(test_and_set_bit(pin_index, &pio->pinmux_mask))) { -+ printk("%s: pin %u is busy\n", pio->name, pin_index); -+ goto fail; -+ } -+ -+ pio_writel(pio, PUER, mask); -+ if (enable_output) -+ pio_writel(pio, OER, mask); -+ else -+ pio_writel(pio, ODR, mask); -+ -+ pio_writel(pio, PER, mask); -+ if (!use_pullup) -+ pio_writel(pio, PUDR, mask); -+ -+ /* It's now allowed to use request_gpio on this pin */ -+ clear_bit(pin_index, &pio->gpio_mask); -+ -+ return; -+ -+fail: -+ dump_stack(); -+} -+ -+/* GPIO API */ -+ -+int gpio_request(unsigned int gpio, const char *label) -+{ -+ struct pio_device *pio; -+ unsigned int pin; -+ -+ pio = gpio_to_pio(gpio); -+ if (!pio) -+ return -ENODEV; -+ -+ pin = gpio & 0x1f; -+ if (test_and_set_bit(pin, &pio->gpio_mask)) -+ return -EBUSY; -+ -+ return 0; - } -+EXPORT_SYMBOL(gpio_request); -+ -+void gpio_free(unsigned int gpio) -+{ -+ struct pio_device *pio; -+ unsigned int pin; -+ -+ pio = gpio_to_pio(gpio); -+ if (!pio) { -+ printk(KERN_ERR -+ "gpio: attempted to free invalid pin %u\n", gpio); -+ return; -+ } -+ -+ pin = gpio & 0x1f; -+ if (!test_and_clear_bit(pin, &pio->gpio_mask)) -+ printk(KERN_ERR "gpio: freeing already-free pin %s[%u]\n", -+ pio->name, pin); -+} -+EXPORT_SYMBOL(gpio_free); -+ -+int gpio_direction_input(unsigned int gpio) -+{ -+ struct pio_device *pio; -+ unsigned int pin; -+ -+ pio = gpio_to_pio(gpio); -+ if (!pio) -+ return -ENODEV; -+ -+ pin = gpio & 0x1f; -+ pio_writel(pio, ODR, 1 << pin); -+ -+ return 0; -+} -+EXPORT_SYMBOL(gpio_direction_input); -+ -+int gpio_direction_output(unsigned int gpio) -+{ -+ struct pio_device *pio; -+ unsigned int pin; -+ -+ pio = gpio_to_pio(gpio); -+ if (!pio) -+ return -ENODEV; -+ -+ pin = gpio & 0x1f; -+ pio_writel(pio, OER, 1 << pin); -+ -+ return 0; -+} -+EXPORT_SYMBOL(gpio_direction_output); -+ -+int gpio_get_value(unsigned int gpio) -+{ -+ struct pio_device *pio = &pio_dev[gpio >> 5]; -+ -+ return (pio_readl(pio, PDSR) >> (gpio & 0x1f)) & 1; -+} -+EXPORT_SYMBOL(gpio_get_value); -+ -+void gpio_set_value(unsigned int gpio, int value) -+{ -+ struct pio_device *pio = &pio_dev[gpio >> 5]; -+ u32 mask; -+ -+ mask = 1 << (gpio & 0x1f); -+ if (value) -+ pio_writel(pio, SODR, mask); -+ else -+ pio_writel(pio, CODR, mask); -+} -+EXPORT_SYMBOL(gpio_set_value); - - static int __init pio_probe(struct platform_device *pdev) - { -@@ -113,6 +275,12 @@ void __init at32_init_pio(struct platfor - pio->pdev = pdev; - pio->regs = ioremap(regs->start, regs->end - regs->start + 1); - -+ /* -+ * request_gpio() is only valid for pins that have been -+ * configured as GPIO. -+ */ -+ pio->gpio_mask = ~0UL; -+ - pio_writel(pio, ODR, ~0UL); - pio_writel(pio, PER, ~0UL); - } -Index: linux-2.6.18-avr32/include/asm-avr32/arch-at32ap/at32ap7000.h -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.18-avr32/include/asm-avr32/arch-at32ap/at32ap7000.h 2006-11-29 16:22:14.000000000 +0100 -@@ -0,0 +1,26 @@ -+#ifndef __ASM_ARCH_AT32AP7000_H -+#define __ASM_ARCH_AT32AP7000_H -+ -+#define GPIO_PERIPH_A 0 -+#define GPIO_PERIPH_B 1 -+ -+#define NR_GPIO_CONTROLLERS 4 -+ -+/* -+ * Pin numbers identifying specific GPIO pins on the chip. They can -+ * also be converted to IRQ numbers by passing them through -+ * gpio_to_irq(). -+ */ -+#define GPIO_PIOA_BASE (0) -+#define GPIO_PIOB_BASE (GPIO_PIOA_BASE + 32) -+#define GPIO_PIOC_BASE (GPIO_PIOB_BASE + 32) -+#define GPIO_PIOD_BASE (GPIO_PIOC_BASE + 32) -+#define GPIO_PIOE_BASE (GPIO_PIOD_BASE + 32) -+ -+#define GPIO_PIN_PA(N) (GPIO_PIOA_BASE + (N)) -+#define GPIO_PIN_PB(N) (GPIO_PIOB_BASE + (N)) -+#define GPIO_PIN_PC(N) (GPIO_PIOC_BASE + (N)) -+#define GPIO_PIN_PD(N) (GPIO_PIOD_BASE + (N)) -+#define GPIO_PIN_PE(N) (GPIO_PIOE_BASE + (N)) -+ -+#endif /* __ASM_ARCH_AT32AP7000_H */ -Index: linux-2.6.18-avr32/include/asm-avr32/arch-at32ap/gpio.h -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.18-avr32/include/asm-avr32/arch-at32ap/gpio.h 2006-11-29 16:22:14.000000000 +0100 -@@ -0,0 +1,39 @@ -+#ifndef __ASM_AVR32_GPIO_H -+#define __ASM_AVR32_GPIO_H -+ -+#include <linux/compiler.h> -+#include <asm/irq.h> -+ -+/* -+ * Set up pin multiplexing, called from board init only. -+ * -+ * The following flags determine the initial state of the pin. -+ */ -+#define AT32_GPIOF_PULLUP 0x00000001 /* Enable pull-up */ -+#define AT32_GPIOF_OUTPUT 0x00000002 /* Enable output driver */ -+#define AT32_GPIOF_HIGH 0x00000004 /* Set output high */ -+ -+void at32_select_periph(unsigned int pin, unsigned int periph, -+ unsigned long flags); -+void at32_select_gpio(unsigned int pin, unsigned long flags); -+ -+/* Arch-neutral GPIO API */ -+int __must_check gpio_request(unsigned int gpio, const char *label); -+void gpio_free(unsigned int gpio); -+ -+int gpio_direction_input(unsigned int gpio); -+int gpio_direction_output(unsigned int gpio); -+int gpio_get_value(unsigned int gpio); -+void gpio_set_value(unsigned int gpio, int value); -+ -+static inline int gpio_to_irq(unsigned int gpio) -+{ -+ return gpio + GPIO_IRQ_BASE; -+} -+ -+static inline int irq_to_gpio(unsigned int irq) -+{ -+ return irq - GPIO_IRQ_BASE; -+} -+ -+#endif /* __ASM_AVR32_GPIO_H */ -Index: linux-2.6.18-avr32/include/asm-avr32/arch-at32ap/irq.h -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.18-avr32/include/asm-avr32/arch-at32ap/irq.h 2006-11-29 16:22:14.000000000 +0100 -@@ -0,0 +1,11 @@ -+#ifndef __ASM_AVR32_ARCH_IRQ_H -+#define __ASM_AVR32_ARCH_IRQ_H -+ -+#define EIM_IRQ_BASE NR_INTERNAL_IRQS -+#define NR_EIM_IRQS 32 -+#define GPIO_IRQ_BASE (EIM_IRQ_BASE + NR_EIM_IRQS) -+#define NR_GPIO_IRQS (4 * 32) -+ -+#define NR_IRQS (GPIO_IRQ_BASE + NR_GPIO_IRQS) -+ -+#endif /* __ASM_AVR32_ARCH_IRQ_H */ -Index: linux-2.6.18-avr32/include/asm-avr32/arch-at32ap/portmux.h -=================================================================== ---- linux-2.6.18-avr32.orig/include/asm-avr32/arch-at32ap/portmux.h 2006-11-29 16:21:12.000000000 +0100 -+++ /dev/null 1970-01-01 00:00:00.000000000 +0000 -@@ -1,16 +0,0 @@ --/* -- * AT32 portmux interface. -- * -- * Copyright (C) 2006 Atmel Corporation -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License version 2 as -- * published by the Free Software Foundation. -- */ --#ifndef __ASM_AVR32_AT32_PORTMUX_H__ --#define __ASM_AVR32_AT32_PORTMUX_H__ -- --void portmux_set_func(unsigned int portmux_id, unsigned int pin_id, -- unsigned int function_id); -- --#endif /* __ASM_AVR32_AT32_PORTMUX_H__ */ -Index: linux-2.6.18-avr32/include/asm-avr32/gpio.h -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.18-avr32/include/asm-avr32/gpio.h 2006-11-29 16:22:14.000000000 +0100 -@@ -0,0 +1,6 @@ -+#ifndef __ASM_AVR32_GPIO_H -+#define __ASM_AVR32_GPIO_H -+ -+#include <asm/arch/gpio.h> -+ -+#endif /* __ASM_AVR32_GPIO_H */ -Index: linux-2.6.18-avr32/include/asm-avr32/irq.h -=================================================================== ---- linux-2.6.18-avr32.orig/include/asm-avr32/irq.h 2006-11-29 16:21:12.000000000 +0100 -+++ linux-2.6.18-avr32/include/asm-avr32/irq.h 2006-11-29 16:22:14.000000000 +0100 -@@ -2,8 +2,12 @@ - #define __ASM_AVR32_IRQ_H - - #define NR_INTERNAL_IRQS 64 --#define NR_EXTERNAL_IRQS 64 --#define NR_IRQS (NR_INTERNAL_IRQS + NR_EXTERNAL_IRQS) -+ -+#include <asm/arch/irq.h> -+ -+#ifndef NR_IRQS -+#define NR_IRQS (NR_INTERNAL_IRQS) -+#endif - - #define irq_canonicalize(i) (i) - |