Loading arch/arm/mach-ixp4xx/common.c +38 −11 Original line number Diff line number Diff line Loading @@ -81,6 +81,44 @@ void __init ixp4xx_map_io(void) iotable_init(ixp4xx_io_desc, ARRAY_SIZE(ixp4xx_io_desc)); } /* * GPIO-functions */ /* * The following converted to the real HW bits the gpio_line_config */ /* GPIO pin types */ #define IXP4XX_GPIO_OUT 0x1 #define IXP4XX_GPIO_IN 0x2 /* GPIO signal types */ #define IXP4XX_GPIO_LOW 0 #define IXP4XX_GPIO_HIGH 1 /* GPIO Clocks */ #define IXP4XX_GPIO_CLK_0 14 #define IXP4XX_GPIO_CLK_1 15 static void gpio_line_config(u8 line, u32 direction) { if (direction == IXP4XX_GPIO_IN) *IXP4XX_GPIO_GPOER |= (1 << line); else *IXP4XX_GPIO_GPOER &= ~(1 << line); } static void gpio_line_get(u8 line, int *value) { *value = (*IXP4XX_GPIO_GPINR >> line) & 0x1; } static void gpio_line_set(u8 line, int value) { if (value == IXP4XX_GPIO_HIGH) *IXP4XX_GPIO_GPOUTR |= (1 << line); else if (value == IXP4XX_GPIO_LOW) *IXP4XX_GPIO_GPOUTR &= ~(1 << line); } /************************************************************************* * IXP4xx chipset IRQ handling Loading Loading @@ -117,17 +155,6 @@ static int ixp4xx_gpio_to_irq(struct gpio_chip *chip, unsigned gpio) return -EINVAL; } int irq_to_gpio(unsigned int irq) { int gpio = (irq < 32) ? irq2gpio[irq] : -EINVAL; if (gpio == -1) return -EINVAL; return gpio; } EXPORT_SYMBOL(irq_to_gpio); static int ixp4xx_set_irq_type(struct irq_data *d, unsigned int type) { int line = irq2gpio[d->irq]; Loading arch/arm/mach-ixp4xx/dsmg600-setup.c +38 −27 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ #include <linux/reboot.h> #include <linux/i2c.h> #include <linux/i2c-gpio.h> #include <linux/gpio.h> #include <mach/hardware.h> Loading Loading @@ -161,11 +162,8 @@ static struct platform_device *dsmg600_devices[] __initdata = { static void dsmg600_power_off(void) { /* enable the pwr cntl gpio */ gpio_line_config(DSMG600_PO_GPIO, IXP4XX_GPIO_OUT); /* poweroff */ gpio_line_set(DSMG600_PO_GPIO, IXP4XX_GPIO_HIGH); /* enable the pwr cntl and drive it high */ gpio_direction_output(DSMG600_PO_GPIO, 1); } /* This is used to make sure the power-button pusher is serious. The button Loading Loading @@ -202,7 +200,7 @@ static void dsmg600_power_handler(unsigned long data) ctrl_alt_del(); /* Change the state of the power LED to "blink" */ gpio_line_set(DSMG600_LED_PWR_GPIO, IXP4XX_GPIO_LOW); gpio_set_value(DSMG600_LED_PWR_GPIO, 0); } else { power_button_countdown = PBUTTON_HOLDDOWN_COUNT; } Loading @@ -228,6 +226,40 @@ static void __init dsmg600_timer_init(void) ixp4xx_timer_init(); } static int __init dsmg600_gpio_init(void) { if (!machine_is_dsmg600()) return 0; gpio_request(DSMG600_RB_GPIO, "reset button"); if (request_irq(gpio_to_irq(DSMG600_RB_GPIO), &dsmg600_reset_handler, IRQF_DISABLED | IRQF_TRIGGER_LOW, "DSM-G600 reset button", NULL) < 0) { printk(KERN_DEBUG "Reset Button IRQ %d not available\n", gpio_to_irq(DSMG600_RB_GPIO)); } /* * The power button on the D-Link DSM-G600 is on GPIO 15, but * it cannot handle interrupts on that GPIO line. So we'll * have to poll it with a kernel timer. */ /* Make sure that the power button GPIO is set up as an input */ gpio_request(DSMG600_PB_GPIO, "power button"); gpio_direction_input(DSMG600_PB_GPIO); /* Request poweroff GPIO line */ gpio_request(DSMG600_PO_GPIO, "power off button"); /* Set the initial value for the power button IRQ handler */ power_button_countdown = PBUTTON_HOLDDOWN_COUNT; mod_timer(&dsmg600_power_timer, jiffies + msecs_to_jiffies(500)); return 0; } device_initcall(dsmg600_gpio_init); static void __init dsmg600_init(void) { ixp4xx_sys_init(); Loading @@ -251,27 +283,6 @@ static void __init dsmg600_init(void) platform_add_devices(dsmg600_devices, ARRAY_SIZE(dsmg600_devices)); pm_power_off = dsmg600_power_off; if (request_irq(gpio_to_irq(DSMG600_RB_GPIO), &dsmg600_reset_handler, IRQF_DISABLED | IRQF_TRIGGER_LOW, "DSM-G600 reset button", NULL) < 0) { printk(KERN_DEBUG "Reset Button IRQ %d not available\n", gpio_to_irq(DSMG600_RB_GPIO)); } /* The power button on the D-Link DSM-G600 is on GPIO 15, but * it cannot handle interrupts on that GPIO line. So we'll * have to poll it with a kernel timer. */ /* Make sure that the power button GPIO is set up as an input */ gpio_line_config(DSMG600_PB_GPIO, IXP4XX_GPIO_IN); /* Set the initial value for the power button IRQ handler */ power_button_countdown = PBUTTON_HOLDDOWN_COUNT; mod_timer(&dsmg600_power_timer, jiffies + msecs_to_jiffies(500)); } MACHINE_START(DSMG600, "D-Link DSM-G600 RevA") Loading arch/arm/mach-ixp4xx/include/mach/platform.h +0 −39 Original line number Diff line number Diff line Loading @@ -131,44 +131,5 @@ struct pci_sys_data; extern int ixp4xx_setup(int nr, struct pci_sys_data *sys); extern struct pci_ops ixp4xx_ops; /* * GPIO-functions */ /* * The following converted to the real HW bits the gpio_line_config */ /* GPIO pin types */ #define IXP4XX_GPIO_OUT 0x1 #define IXP4XX_GPIO_IN 0x2 /* GPIO signal types */ #define IXP4XX_GPIO_LOW 0 #define IXP4XX_GPIO_HIGH 1 /* GPIO Clocks */ #define IXP4XX_GPIO_CLK_0 14 #define IXP4XX_GPIO_CLK_1 15 static inline void gpio_line_config(u8 line, u32 direction) { if (direction == IXP4XX_GPIO_IN) *IXP4XX_GPIO_GPOER |= (1 << line); else *IXP4XX_GPIO_GPOER &= ~(1 << line); } static inline void gpio_line_get(u8 line, int *value) { *value = (*IXP4XX_GPIO_GPINR >> line) & 0x1; } static inline void gpio_line_set(u8 line, int value) { if (value == IXP4XX_GPIO_HIGH) *IXP4XX_GPIO_GPOUTR |= (1 << line); else if (value == IXP4XX_GPIO_LOW) *IXP4XX_GPIO_GPOUTR &= ~(1 << line); } #endif // __ASSEMBLY__ arch/arm/mach-ixp4xx/ixdp425-setup.c +5 −3 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <linux/mtd/nand.h> #include <linux/mtd/partitions.h> #include <linux/delay.h> #include <linux/gpio.h> #include <asm/types.h> #include <asm/setup.h> #include <asm/memory.h> Loading Loading @@ -80,10 +81,10 @@ ixdp425_flash_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) if (ctrl & NAND_CTRL_CHANGE) { if (ctrl & NAND_NCE) { gpio_line_set(IXDP425_NAND_NCE_PIN, IXP4XX_GPIO_LOW); gpio_set_value(IXDP425_NAND_NCE_PIN, 0); udelay(5); } else gpio_line_set(IXDP425_NAND_NCE_PIN, IXP4XX_GPIO_HIGH); gpio_set_value(IXDP425_NAND_NCE_PIN, 1); offset = (ctrl & NAND_CLE) ? IXDP425_NAND_CMD_BYTE : 0; offset |= (ctrl & NAND_ALE) ? IXDP425_NAND_ADDR_BYTE : 0; Loading Loading @@ -227,7 +228,8 @@ static void __init ixdp425_init(void) ixdp425_flash_nand_resource.start = IXP4XX_EXP_BUS_BASE(3), ixdp425_flash_nand_resource.end = IXP4XX_EXP_BUS_BASE(3) + 0x10 - 1; gpio_line_config(IXDP425_NAND_NCE_PIN, IXP4XX_GPIO_OUT); gpio_request(IXDP425_NAND_NCE_PIN, "NAND NCE pin"); gpio_direction_output(IXDP425_NAND_NCE_PIN, 0); /* Configure expansion bus for NAND Flash */ *IXP4XX_EXP_CS3 = IXP4XX_EXP_BUS_CS_EN | Loading arch/arm/mach-ixp4xx/nas100d-setup.c +30 −19 Original line number Diff line number Diff line Loading @@ -184,11 +184,8 @@ static void nas100d_power_off(void) { /* This causes the box to drop the power and go dead. */ /* enable the pwr cntl gpio */ gpio_line_config(NAS100D_PO_GPIO, IXP4XX_GPIO_OUT); /* do the deed */ gpio_line_set(NAS100D_PO_GPIO, IXP4XX_GPIO_HIGH); /* enable the pwr cntl gpio and assert power off */ gpio_direction_output(NAS100D_PO_GPIO, 1); } /* This is used to make sure the power-button pusher is serious. The button Loading Loading @@ -225,7 +222,7 @@ static void nas100d_power_handler(unsigned long data) ctrl_alt_del(); /* Change the state of the power LED to "blink" */ gpio_line_set(NAS100D_LED_PWR_GPIO, IXP4XX_GPIO_LOW); gpio_set_value(NAS100D_LED_PWR_GPIO, 0); } else { power_button_countdown = PBUTTON_HOLDDOWN_COUNT; } Loading @@ -242,6 +239,33 @@ static irqreturn_t nas100d_reset_handler(int irq, void *dev_id) return IRQ_HANDLED; } static int __init nas100d_gpio_init(void) { if (!machine_is_nas100d()) return 0; /* * The power button on the Iomega NAS100d is on GPIO 14, but * it cannot handle interrupts on that GPIO line. So we'll * have to poll it with a kernel timer. */ /* Request the power off GPIO */ gpio_request(NAS100D_PO_GPIO, "power off"); /* Make sure that the power button GPIO is set up as an input */ gpio_request(NAS100D_PB_GPIO, "power button"); gpio_direction_input(NAS100D_PB_GPIO); /* Set the initial value for the power button IRQ handler */ power_button_countdown = PBUTTON_HOLDDOWN_COUNT; mod_timer(&nas100d_power_timer, jiffies + msecs_to_jiffies(500)); return 0; } device_initcall(nas100d_gpio_init); static void __init nas100d_init(void) { uint8_t __iomem *f; Loading Loading @@ -278,19 +302,6 @@ static void __init nas100d_init(void) gpio_to_irq(NAS100D_RB_GPIO)); } /* The power button on the Iomega NAS100d is on GPIO 14, but * it cannot handle interrupts on that GPIO line. So we'll * have to poll it with a kernel timer. */ /* Make sure that the power button GPIO is set up as an input */ gpio_line_config(NAS100D_PB_GPIO, IXP4XX_GPIO_IN); /* Set the initial value for the power button IRQ handler */ power_button_countdown = PBUTTON_HOLDDOWN_COUNT; mod_timer(&nas100d_power_timer, jiffies + msecs_to_jiffies(500)); /* * Map in a portion of the flash and read the MAC address. * Since it is stored in BE in the flash itself, we need to Loading Loading
arch/arm/mach-ixp4xx/common.c +38 −11 Original line number Diff line number Diff line Loading @@ -81,6 +81,44 @@ void __init ixp4xx_map_io(void) iotable_init(ixp4xx_io_desc, ARRAY_SIZE(ixp4xx_io_desc)); } /* * GPIO-functions */ /* * The following converted to the real HW bits the gpio_line_config */ /* GPIO pin types */ #define IXP4XX_GPIO_OUT 0x1 #define IXP4XX_GPIO_IN 0x2 /* GPIO signal types */ #define IXP4XX_GPIO_LOW 0 #define IXP4XX_GPIO_HIGH 1 /* GPIO Clocks */ #define IXP4XX_GPIO_CLK_0 14 #define IXP4XX_GPIO_CLK_1 15 static void gpio_line_config(u8 line, u32 direction) { if (direction == IXP4XX_GPIO_IN) *IXP4XX_GPIO_GPOER |= (1 << line); else *IXP4XX_GPIO_GPOER &= ~(1 << line); } static void gpio_line_get(u8 line, int *value) { *value = (*IXP4XX_GPIO_GPINR >> line) & 0x1; } static void gpio_line_set(u8 line, int value) { if (value == IXP4XX_GPIO_HIGH) *IXP4XX_GPIO_GPOUTR |= (1 << line); else if (value == IXP4XX_GPIO_LOW) *IXP4XX_GPIO_GPOUTR &= ~(1 << line); } /************************************************************************* * IXP4xx chipset IRQ handling Loading Loading @@ -117,17 +155,6 @@ static int ixp4xx_gpio_to_irq(struct gpio_chip *chip, unsigned gpio) return -EINVAL; } int irq_to_gpio(unsigned int irq) { int gpio = (irq < 32) ? irq2gpio[irq] : -EINVAL; if (gpio == -1) return -EINVAL; return gpio; } EXPORT_SYMBOL(irq_to_gpio); static int ixp4xx_set_irq_type(struct irq_data *d, unsigned int type) { int line = irq2gpio[d->irq]; Loading
arch/arm/mach-ixp4xx/dsmg600-setup.c +38 −27 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ #include <linux/reboot.h> #include <linux/i2c.h> #include <linux/i2c-gpio.h> #include <linux/gpio.h> #include <mach/hardware.h> Loading Loading @@ -161,11 +162,8 @@ static struct platform_device *dsmg600_devices[] __initdata = { static void dsmg600_power_off(void) { /* enable the pwr cntl gpio */ gpio_line_config(DSMG600_PO_GPIO, IXP4XX_GPIO_OUT); /* poweroff */ gpio_line_set(DSMG600_PO_GPIO, IXP4XX_GPIO_HIGH); /* enable the pwr cntl and drive it high */ gpio_direction_output(DSMG600_PO_GPIO, 1); } /* This is used to make sure the power-button pusher is serious. The button Loading Loading @@ -202,7 +200,7 @@ static void dsmg600_power_handler(unsigned long data) ctrl_alt_del(); /* Change the state of the power LED to "blink" */ gpio_line_set(DSMG600_LED_PWR_GPIO, IXP4XX_GPIO_LOW); gpio_set_value(DSMG600_LED_PWR_GPIO, 0); } else { power_button_countdown = PBUTTON_HOLDDOWN_COUNT; } Loading @@ -228,6 +226,40 @@ static void __init dsmg600_timer_init(void) ixp4xx_timer_init(); } static int __init dsmg600_gpio_init(void) { if (!machine_is_dsmg600()) return 0; gpio_request(DSMG600_RB_GPIO, "reset button"); if (request_irq(gpio_to_irq(DSMG600_RB_GPIO), &dsmg600_reset_handler, IRQF_DISABLED | IRQF_TRIGGER_LOW, "DSM-G600 reset button", NULL) < 0) { printk(KERN_DEBUG "Reset Button IRQ %d not available\n", gpio_to_irq(DSMG600_RB_GPIO)); } /* * The power button on the D-Link DSM-G600 is on GPIO 15, but * it cannot handle interrupts on that GPIO line. So we'll * have to poll it with a kernel timer. */ /* Make sure that the power button GPIO is set up as an input */ gpio_request(DSMG600_PB_GPIO, "power button"); gpio_direction_input(DSMG600_PB_GPIO); /* Request poweroff GPIO line */ gpio_request(DSMG600_PO_GPIO, "power off button"); /* Set the initial value for the power button IRQ handler */ power_button_countdown = PBUTTON_HOLDDOWN_COUNT; mod_timer(&dsmg600_power_timer, jiffies + msecs_to_jiffies(500)); return 0; } device_initcall(dsmg600_gpio_init); static void __init dsmg600_init(void) { ixp4xx_sys_init(); Loading @@ -251,27 +283,6 @@ static void __init dsmg600_init(void) platform_add_devices(dsmg600_devices, ARRAY_SIZE(dsmg600_devices)); pm_power_off = dsmg600_power_off; if (request_irq(gpio_to_irq(DSMG600_RB_GPIO), &dsmg600_reset_handler, IRQF_DISABLED | IRQF_TRIGGER_LOW, "DSM-G600 reset button", NULL) < 0) { printk(KERN_DEBUG "Reset Button IRQ %d not available\n", gpio_to_irq(DSMG600_RB_GPIO)); } /* The power button on the D-Link DSM-G600 is on GPIO 15, but * it cannot handle interrupts on that GPIO line. So we'll * have to poll it with a kernel timer. */ /* Make sure that the power button GPIO is set up as an input */ gpio_line_config(DSMG600_PB_GPIO, IXP4XX_GPIO_IN); /* Set the initial value for the power button IRQ handler */ power_button_countdown = PBUTTON_HOLDDOWN_COUNT; mod_timer(&dsmg600_power_timer, jiffies + msecs_to_jiffies(500)); } MACHINE_START(DSMG600, "D-Link DSM-G600 RevA") Loading
arch/arm/mach-ixp4xx/include/mach/platform.h +0 −39 Original line number Diff line number Diff line Loading @@ -131,44 +131,5 @@ struct pci_sys_data; extern int ixp4xx_setup(int nr, struct pci_sys_data *sys); extern struct pci_ops ixp4xx_ops; /* * GPIO-functions */ /* * The following converted to the real HW bits the gpio_line_config */ /* GPIO pin types */ #define IXP4XX_GPIO_OUT 0x1 #define IXP4XX_GPIO_IN 0x2 /* GPIO signal types */ #define IXP4XX_GPIO_LOW 0 #define IXP4XX_GPIO_HIGH 1 /* GPIO Clocks */ #define IXP4XX_GPIO_CLK_0 14 #define IXP4XX_GPIO_CLK_1 15 static inline void gpio_line_config(u8 line, u32 direction) { if (direction == IXP4XX_GPIO_IN) *IXP4XX_GPIO_GPOER |= (1 << line); else *IXP4XX_GPIO_GPOER &= ~(1 << line); } static inline void gpio_line_get(u8 line, int *value) { *value = (*IXP4XX_GPIO_GPINR >> line) & 0x1; } static inline void gpio_line_set(u8 line, int value) { if (value == IXP4XX_GPIO_HIGH) *IXP4XX_GPIO_GPOUTR |= (1 << line); else if (value == IXP4XX_GPIO_LOW) *IXP4XX_GPIO_GPOUTR &= ~(1 << line); } #endif // __ASSEMBLY__
arch/arm/mach-ixp4xx/ixdp425-setup.c +5 −3 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <linux/mtd/nand.h> #include <linux/mtd/partitions.h> #include <linux/delay.h> #include <linux/gpio.h> #include <asm/types.h> #include <asm/setup.h> #include <asm/memory.h> Loading Loading @@ -80,10 +81,10 @@ ixdp425_flash_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) if (ctrl & NAND_CTRL_CHANGE) { if (ctrl & NAND_NCE) { gpio_line_set(IXDP425_NAND_NCE_PIN, IXP4XX_GPIO_LOW); gpio_set_value(IXDP425_NAND_NCE_PIN, 0); udelay(5); } else gpio_line_set(IXDP425_NAND_NCE_PIN, IXP4XX_GPIO_HIGH); gpio_set_value(IXDP425_NAND_NCE_PIN, 1); offset = (ctrl & NAND_CLE) ? IXDP425_NAND_CMD_BYTE : 0; offset |= (ctrl & NAND_ALE) ? IXDP425_NAND_ADDR_BYTE : 0; Loading Loading @@ -227,7 +228,8 @@ static void __init ixdp425_init(void) ixdp425_flash_nand_resource.start = IXP4XX_EXP_BUS_BASE(3), ixdp425_flash_nand_resource.end = IXP4XX_EXP_BUS_BASE(3) + 0x10 - 1; gpio_line_config(IXDP425_NAND_NCE_PIN, IXP4XX_GPIO_OUT); gpio_request(IXDP425_NAND_NCE_PIN, "NAND NCE pin"); gpio_direction_output(IXDP425_NAND_NCE_PIN, 0); /* Configure expansion bus for NAND Flash */ *IXP4XX_EXP_CS3 = IXP4XX_EXP_BUS_CS_EN | Loading
arch/arm/mach-ixp4xx/nas100d-setup.c +30 −19 Original line number Diff line number Diff line Loading @@ -184,11 +184,8 @@ static void nas100d_power_off(void) { /* This causes the box to drop the power and go dead. */ /* enable the pwr cntl gpio */ gpio_line_config(NAS100D_PO_GPIO, IXP4XX_GPIO_OUT); /* do the deed */ gpio_line_set(NAS100D_PO_GPIO, IXP4XX_GPIO_HIGH); /* enable the pwr cntl gpio and assert power off */ gpio_direction_output(NAS100D_PO_GPIO, 1); } /* This is used to make sure the power-button pusher is serious. The button Loading Loading @@ -225,7 +222,7 @@ static void nas100d_power_handler(unsigned long data) ctrl_alt_del(); /* Change the state of the power LED to "blink" */ gpio_line_set(NAS100D_LED_PWR_GPIO, IXP4XX_GPIO_LOW); gpio_set_value(NAS100D_LED_PWR_GPIO, 0); } else { power_button_countdown = PBUTTON_HOLDDOWN_COUNT; } Loading @@ -242,6 +239,33 @@ static irqreturn_t nas100d_reset_handler(int irq, void *dev_id) return IRQ_HANDLED; } static int __init nas100d_gpio_init(void) { if (!machine_is_nas100d()) return 0; /* * The power button on the Iomega NAS100d is on GPIO 14, but * it cannot handle interrupts on that GPIO line. So we'll * have to poll it with a kernel timer. */ /* Request the power off GPIO */ gpio_request(NAS100D_PO_GPIO, "power off"); /* Make sure that the power button GPIO is set up as an input */ gpio_request(NAS100D_PB_GPIO, "power button"); gpio_direction_input(NAS100D_PB_GPIO); /* Set the initial value for the power button IRQ handler */ power_button_countdown = PBUTTON_HOLDDOWN_COUNT; mod_timer(&nas100d_power_timer, jiffies + msecs_to_jiffies(500)); return 0; } device_initcall(nas100d_gpio_init); static void __init nas100d_init(void) { uint8_t __iomem *f; Loading Loading @@ -278,19 +302,6 @@ static void __init nas100d_init(void) gpio_to_irq(NAS100D_RB_GPIO)); } /* The power button on the Iomega NAS100d is on GPIO 14, but * it cannot handle interrupts on that GPIO line. So we'll * have to poll it with a kernel timer. */ /* Make sure that the power button GPIO is set up as an input */ gpio_line_config(NAS100D_PB_GPIO, IXP4XX_GPIO_IN); /* Set the initial value for the power button IRQ handler */ power_button_countdown = PBUTTON_HOLDDOWN_COUNT; mod_timer(&nas100d_power_timer, jiffies + msecs_to_jiffies(500)); /* * Map in a portion of the flash and read the MAC address. * Since it is stored in BE in the flash itself, we need to Loading