diff options
author | blogic <blogic@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2012-10-05 10:12:53 +0000 |
---|---|---|
committer | blogic <blogic@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2012-10-05 10:12:53 +0000 |
commit | 5c105d9f3fd086aff195d3849dcf847d6b0bd927 (patch) | |
tree | 1229a11f725bfa58aa7c57a76898553bb5f6654a /target/linux/kirkwood/files/arch/arm/mach-kirkwood | |
download | openwrt-5c105d9f3fd086aff195d3849dcf847d6b0bd927.tar.gz openwrt-5c105d9f3fd086aff195d3849dcf847d6b0bd927.zip |
branch Attitude Adjustment
git-svn-id: svn://svn.openwrt.org/openwrt/branches/attitude_adjustment@33625 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/kirkwood/files/arch/arm/mach-kirkwood')
5 files changed, 952 insertions, 0 deletions
diff --git a/target/linux/kirkwood/files/arch/arm/mach-kirkwood/goflexhome-setup.c b/target/linux/kirkwood/files/arch/arm/mach-kirkwood/goflexhome-setup.c new file mode 100644 index 000000000..84daeefe6 --- /dev/null +++ b/target/linux/kirkwood/files/arch/arm/mach-kirkwood/goflexhome-setup.c @@ -0,0 +1,123 @@ +/* + * arch/arm/mach-kirkwood/goflexhome-setup.c + * + * Seagate GoFlex Home Setup + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/platform_device.h> +#include <linux/ata_platform.h> +#include <linux/mtd/partitions.h> +#include <linux/mv643xx_eth.h> +#include <linux/gpio.h> +#include <linux/leds.h> +#include <asm/mach-types.h> +#include <asm/mach/arch.h> +#include <mach/kirkwood.h> +#include "common.h" +#include "mpp.h" + +static struct mtd_partition goflexhome_nand_parts[] = { + { + .name = "u-boot", + .offset = 0, + .size = SZ_1M + }, { + .name = "uImage", + .offset = MTDPART_OFS_NXTBLK, + .size = SZ_2M + SZ_4M + }, { + .name = "root", + .offset = MTDPART_OFS_NXTBLK, + .size = MTDPART_SIZ_FULL + }, +}; + +static struct mv643xx_eth_platform_data goflexhome_ge00_data = { + .phy_addr = MV643XX_ETH_PHY_ADDR(0), +}; + +static struct mv_sata_platform_data goflexhome_sata_data = { + .n_ports = 1, +}; + +static struct gpio_led goflexhome_led_pins[] = { + { + .name = "status:green:health", + .default_trigger = "default-on", + .gpio = 46, + .active_low = 1, + }, + { + .name = "status:orange:fault", + .default_trigger = "none", + .gpio = 47, + .active_low = 1, + }, + { + .name = "status:white:misc", + .default_trigger = "none", + .gpio = 40, + .active_low = 0, + } +}; + +static struct gpio_led_platform_data goflexhome_led_data = { + .leds = goflexhome_led_pins, + .num_leds = ARRAY_SIZE(goflexhome_led_pins), +}; + +static struct platform_device goflexhome_leds = { + .name = "leds-gpio", + .id = -1, + .dev = { + .platform_data = &goflexhome_led_data, + } +}; + +static unsigned int goflexhome_mpp_config[] __initdata = { + MPP29_GPIO, /* USB Power Enable */ + MPP47_GPIO, /* LED Orange */ + MPP46_GPIO, /* LED Green */ + MPP40_GPIO, /* LED White */ + 0 +}; + +static void __init goflexhome_init(void) +{ + /* + * Basic setup. Needs to be called early. + */ + kirkwood_init(); + + /* setup gpio pin select */ + kirkwood_mpp_conf(goflexhome_mpp_config); + + kirkwood_uart0_init(); + kirkwood_nand_init(ARRAY_AND_SIZE(goflexhome_nand_parts), 40); + + if (gpio_request(29, "USB Power Enable") != 0 || + gpio_direction_output(29, 1) != 0) + printk(KERN_ERR "can't set up GPIO 29 (USB Power Enable)\n"); + kirkwood_ehci_init(); + kirkwood_ge00_init(&goflexhome_ge00_data); + kirkwood_sata_init(&goflexhome_sata_data); + + platform_device_register(&goflexhome_leds); +} + +MACHINE_START(GOFLEXHOME, "Seagate GoFlex Home") + /* Maintainer: Peter Carmichael <peterjncarm@ovi.com> */ + .atag_offset = 0x100, + .init_machine = goflexhome_init, + .map_io = kirkwood_map_io, + .init_early = kirkwood_init_early, + .init_irq = kirkwood_init_irq, + .timer = &kirkwood_timer, + .restart = kirkwood_restart, +MACHINE_END diff --git a/target/linux/kirkwood/files/arch/arm/mach-kirkwood/goflexnet-setup.c b/target/linux/kirkwood/files/arch/arm/mach-kirkwood/goflexnet-setup.c new file mode 100644 index 000000000..cd9dc9ef1 --- /dev/null +++ b/target/linux/kirkwood/files/arch/arm/mach-kirkwood/goflexnet-setup.c @@ -0,0 +1,176 @@ +/* + * arch/arm/mach-kirkwood/goflexnet-setup.c + * + * Seagate GoFlex Net Setup + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/platform_device.h> +#include <linux/ata_platform.h> +#include <linux/mtd/partitions.h> +#include <linux/mv643xx_eth.h> +#include <linux/gpio.h> +#include <linux/leds.h> +#include <asm/mach-types.h> +#include <asm/mach/arch.h> +#include <mach/kirkwood.h> +#include "common.h" +#include "mpp.h" + +static struct mtd_partition goflexnet_nand_parts[] = { + { + .name = "u-boot", + .offset = 0, + .size = SZ_1M + }, { + .name = "uImage", + .offset = MTDPART_OFS_NXTBLK, + .size = SZ_4M + }, { + .name = "rootfs", + .offset = MTDPART_OFS_NXTBLK, + .size = SZ_32M + }, { + .name = "data", + .offset = MTDPART_OFS_NXTBLK, + .size = MTDPART_SIZ_FULL + }, +}; + +static struct mv643xx_eth_platform_data goflexnet_ge00_data = { + .phy_addr = MV643XX_ETH_PHY_ADDR(0), +}; + +static struct mv_sata_platform_data goflexnet_sata_data = { + .n_ports = 2, +}; + +static struct gpio_led goflexnet_led_pins[] = { + { + .name = "status:green:health", + .default_trigger = "default-on", + .gpio = 46, // 0x4000 + .active_low = 1, + }, + { + .name = "status:orange:fault", + .default_trigger = "none", + .gpio = 47, // 0x8000 + .active_low = 1, + }, + { + .name = "status:white:left0", + .default_trigger = "none", + .gpio = 42, // 0x0400 + .active_low = 0, + }, + { + .name = "status:white:left1", + .default_trigger = "none", + .gpio = 43, // 0x0800 + .active_low = 0, + }, + { + .name = "status:white:left2", + .default_trigger = "none", + .gpio = 44, // 0x1000 + .active_low = 0, + }, + { + .name = "status:white:left3", + .default_trigger = "none", + .gpio = 45, // 0x2000 + .active_low = 0, + }, + { + .name = "status:white:right0", + .default_trigger = "none", + .gpio = 38, // 0x0040 + .active_low = 0, + }, + { + .name = "status:white:right1", + .default_trigger = "none", + .gpio = 39, // 0x0080 + .active_low = 0, + }, + { + .name = "status:white:right2", + .default_trigger = "none", + .gpio = 40, // 0x0100 + .active_low = 0, + }, + { + .name = "status:white:right3", + .default_trigger = "none", + .gpio = 41, // 0x0200 + .active_low = 0, + } +}; + +static struct gpio_led_platform_data goflexnet_led_data = { + .leds = goflexnet_led_pins, + .num_leds = ARRAY_SIZE(goflexnet_led_pins), +}; + +static struct platform_device goflexnet_leds = { + .name = "leds-gpio", + .id = -1, + .dev = { + .platform_data = &goflexnet_led_data, + } +}; + +static unsigned int goflexnet_mpp_config[] __initdata = { + MPP29_GPIO, /* USB Power Enable */ + MPP47_GPIO, /* LED Orange */ + MPP46_GPIO, /* LED Green */ + MPP45_GPIO, /* LED Left Capacity 3 */ + MPP44_GPIO, /* LED Left Capacity 2 */ + MPP43_GPIO, /* LED Left Capacity 1 */ + MPP42_GPIO, /* LED Left Capacity 0 */ + MPP41_GPIO, /* LED Right Capacity 3 */ + MPP40_GPIO, /* LED Right Capacity 2 */ + MPP39_GPIO, /* LED Right Capacity 1 */ + MPP38_GPIO, /* LED Right Capacity 0 */ + 0 +}; + +static void __init goflexnet_init(void) +{ + /* + * Basic setup. Needs to be called early. + */ + kirkwood_init(); + + /* setup gpio pin select */ + kirkwood_mpp_conf(goflexnet_mpp_config); + + kirkwood_uart0_init(); + kirkwood_nand_init(ARRAY_AND_SIZE(goflexnet_nand_parts), 40); + + if (gpio_request(29, "USB Power Enable") != 0 || + gpio_direction_output(29, 1) != 0) + printk(KERN_ERR "can't set up GPIO 29 (USB Power Enable)\n"); + kirkwood_ehci_init(); + kirkwood_ge00_init(&goflexnet_ge00_data); + kirkwood_sata_init(&goflexnet_sata_data); + + platform_device_register(&goflexnet_leds); +} + +MACHINE_START(GOFLEXNET, "Seagate GoFlex Net") + /* Maintainer: Peter Carmichael <peterjncarm@ovi.com> */ + .atag_offset = 0x100, + .init_machine = goflexnet_init, + .map_io = kirkwood_map_io, + .init_early = kirkwood_init_early, + .init_irq = kirkwood_init_irq, + .timer = &kirkwood_timer, + .restart = kirkwood_restart, +MACHINE_END diff --git a/target/linux/kirkwood/files/arch/arm/mach-kirkwood/iconnect-setup.c b/target/linux/kirkwood/files/arch/arm/mach-kirkwood/iconnect-setup.c new file mode 100644 index 000000000..4e8d192bb --- /dev/null +++ b/target/linux/kirkwood/files/arch/arm/mach-kirkwood/iconnect-setup.c @@ -0,0 +1,190 @@ +/* + * arch/arm/mach-kirkwood/iconnect-setup.c + * + * Iomega iConnect Wireless + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/platform_device.h> +#include <linux/irq.h> +#include <linux/mtd/partitions.h> +#include <linux/mv643xx_eth.h> +#include <linux/ethtool.h> +#include <linux/gpio.h> +#include <linux/gpio_keys.h> +#include <linux/input.h> +#include <linux/leds.h> +#include <asm/mach-types.h> +#include <asm/mach/arch.h> +#include <mach/kirkwood.h> +#include "common.h" +#include "mpp.h" + +static struct mtd_partition iconnect_nand_parts[] = { + { + .name = "u-boot", + .offset = 0, + .size = SZ_1M + }, { + .name = "uImage", + .offset = MTDPART_OFS_NXTBLK, + .size = SZ_1M + SZ_2M + }, { + .name = "rootfs", + .offset = MTDPART_OFS_NXTBLK, + .size = SZ_32M, + }, { + .name = "data", + .offset = MTDPART_OFS_NXTBLK, + .size = MTDPART_SIZ_FULL + }, +}; + +static struct mv643xx_eth_platform_data iconnect_ge00_data = { + .phy_addr = MV643XX_ETH_PHY_ADDR(11), +}; + +static struct gpio_led iconnect_led_pins[] = { + { + .name = "iconnect:blue:power", + .default_trigger = "default-on", + .gpio = 42, + }, + { + .name = "iconnect:red:power", + .gpio = 43, + }, + { + .name = "iconnect:blue:usb1", + .gpio = 44, + }, + { + .name = "iconnect:blue:usb2", + .gpio = 45, + }, + { + .name = "iconnect:blue:usb3", + .gpio = 46, + }, + { + .name = "iconnect:blue:usb4", + .gpio = 47, + }, + { + .name = "iconnect:blue:otb", + .gpio = 48, + }, +}; + +static struct gpio_led_platform_data iconnect_led_data = { + .leds = iconnect_led_pins, + .num_leds = ARRAY_SIZE(iconnect_led_pins), +}; + +static struct platform_device iconnect_leds = { + .name = "leds-gpio", + .id = -1, + .dev = { + .platform_data = &iconnect_led_data, + } +}; + +#define ICONNECT_GPIO_KEY_RESET 12 +#define ICONNECT_GPIO_KEY_OTB 35 + +#define ICONNECT_SW_RESET 0x00 +#define ICONNECT_SW_OTB 0x01 + +static struct gpio_keys_button iconnect_buttons[] = { + { + .type = EV_SW, + .code = ICONNECT_SW_RESET, + .gpio = ICONNECT_GPIO_KEY_RESET, + .desc = "Reset Button", + .active_low = 1, + .debounce_interval = 100, + }, + { + .type = EV_SW, + .code = ICONNECT_SW_OTB, + .gpio = ICONNECT_GPIO_KEY_OTB, + .desc = "OTB Button", + .active_low = 1, + .debounce_interval = 100, + }, +}; + +static struct gpio_keys_platform_data iconnect_button_data = { + .buttons = iconnect_buttons, + .nbuttons = ARRAY_SIZE(iconnect_buttons), +}; + +static struct platform_device iconnect_button_device = { + .name = "gpio-keys", + .id = -1, + .num_resources = 0, + .dev = { + .platform_data = &iconnect_button_data, + }, +}; + +static unsigned int iconnect_mpp_config[] __initdata = { + MPP12_GPIO, /*Input for reset button*/ + MPP35_GPIO, /*Input for OTB button*/ + MPP42_GPIO, + MPP43_GPIO, + MPP44_GPIO, + MPP45_GPIO, + MPP46_GPIO, + MPP47_GPIO, + MPP48_GPIO, + 0 +}; + +static void __init iconnect_init(void) +{ + u32 dev, rev; + + /* + * Basic setup. Needs to be called early. + */ + kirkwood_init(); + kirkwood_mpp_conf(iconnect_mpp_config); + + kirkwood_nand_init(ARRAY_AND_SIZE(iconnect_nand_parts), 25); + kirkwood_ehci_init(); + + kirkwood_ge00_init(&iconnect_ge00_data); + kirkwood_pcie_id(&dev, &rev); + + kirkwood_uart0_init(); + kirkwood_i2c_init(); + + platform_device_register(&iconnect_leds); + platform_device_register(&iconnect_button_device); +} + +static int __init iconnect_pci_init(void) +{ + if (machine_is_iconnect()) + kirkwood_pcie_init(KW_PCIE0); + + return 0; +} +subsys_initcall(iconnect_pci_init); + + +MACHINE_START(ICONNECT, "Iomega iConnect Wireless") + .atag_offset = 0x100, + .init_machine = iconnect_init, + .map_io = kirkwood_map_io, + .init_early = kirkwood_init_early, + .init_irq = kirkwood_init_irq, + .timer = &kirkwood_timer, + .restart = kirkwood_restart, +MACHINE_END diff --git a/target/linux/kirkwood/files/arch/arm/mach-kirkwood/nas6210-setup.c b/target/linux/kirkwood/files/arch/arm/mach-kirkwood/nas6210-setup.c new file mode 100644 index 000000000..00c8531bc --- /dev/null +++ b/target/linux/kirkwood/files/arch/arm/mach-kirkwood/nas6210-setup.c @@ -0,0 +1,190 @@ +/* + * arch/arm/mach-kirkwood/nas6210-setup.c + * + * Raidsonic ICYBOX NAS6210 Board Setup + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/platform_device.h> +#include <linux/ata_platform.h> +#include <linux/mtd/partitions.h> +#include <linux/mv643xx_eth.h> +#include <linux/gpio.h> +#include <linux/gpio_keys.h> +#include <linux/input.h> +#include <linux/leds.h> +#include <asm/mach-types.h> +#include <asm/mach/arch.h> +#include <mach/kirkwood.h> +#include "common.h" +#include "mpp.h" + +#define NAS6210_GPIO_POWER_OFF 24 + +static struct mtd_partition nas6210_nand_parts[] = { + { + .name = "uboot", + .offset = 0, + .size = SZ_512K + }, { + .name = "uboot_env", + .offset = MTDPART_OFS_NXTBLK, + .size = SZ_128K + }, { + .name = "kernel", + .offset = MTDPART_OFS_NXTBLK, + .size = 3 * SZ_1M + }, { + .name = "rootfs", + .offset = MTDPART_OFS_NXTBLK, + .size = MTDPART_SIZ_FULL + }, +}; + +static struct mv643xx_eth_platform_data nas6210_ge00_data = { + .phy_addr = MV643XX_ETH_PHY_ADDR(8), +}; + +static struct mv_sata_platform_data nas6210_sata_data = { + .n_ports = 2, +}; + +static struct gpio_led nas6210_led_pins[] = { + { + .name = "status:green:power", + .default_trigger = "default-on", + .gpio = 25, + .active_low = 0, + }, + { + .name = "status:red:power", + .default_trigger = "none", + .gpio = 22, + .active_low = 0, + }, + { + .name = "status:red:usb_copy", + .default_trigger = "none", + .gpio = 27, + .active_low = 0, + }, +}; + +static struct gpio_led_platform_data nas6210_led_data = { + .leds = nas6210_led_pins, + .num_leds = ARRAY_SIZE(nas6210_led_pins), +}; + +static struct platform_device nas6210_leds = { + .name = "leds-gpio", + .id = -1, + .dev = { + .platform_data = &nas6210_led_data, + } +}; + +static struct gpio_keys_button nas6210_buttons[] = { + { + .code = KEY_COPY, + .gpio = 29, + .desc = "USB Copy", + .active_low = 1, + }, + { + .code = KEY_RESTART, + .gpio = 28, + .desc = "Reset", + .active_low = 1, + }, +}; + +static struct gpio_keys_platform_data nas6210_button_data = { + .buttons = nas6210_buttons, + .nbuttons = ARRAY_SIZE(nas6210_buttons), +}; + +static struct platform_device nas6210_button_device = { + .name = "gpio-keys", + .id = -1, + .num_resources = 0, + .dev = { + .platform_data = &nas6210_button_data, + } +}; + +static unsigned int nas6210_mpp_config[] __initdata = { + MPP0_NF_IO2, + MPP1_NF_IO3, + MPP2_NF_IO4, + MPP3_NF_IO5, + MPP4_NF_IO6, + MPP5_NF_IO7, + MPP18_NF_IO0, + MPP19_NF_IO1, + MPP22_GPIO, /* Power LED red */ + MPP24_GPIO, /* Power off device */ + MPP25_GPIO, /* Power LED green */ + MPP27_GPIO, /* USB transfer LED */ + MPP28_GPIO, /* Reset button */ + MPP29_GPIO, /* USB Copy button */ + 0 +}; + +static void nas6210_power_off(void) +{ + gpio_set_value(NAS6210_GPIO_POWER_OFF, 1); +} + +static void __init nas6210_init(void) +{ + /* + * Basic setup. Needs to be called early. + */ + kirkwood_init(); + kirkwood_mpp_conf(nas6210_mpp_config); + + kirkwood_nand_init(ARRAY_AND_SIZE(nas6210_nand_parts), 25); + kirkwood_ehci_init(); + kirkwood_ge00_init(&nas6210_ge00_data); + kirkwood_sata_init(&nas6210_sata_data); + kirkwood_uart0_init(); + platform_device_register(&nas6210_leds); + platform_device_register(&nas6210_button_device); + if (gpio_request(NAS6210_GPIO_POWER_OFF, "power-off") == 0 && + gpio_direction_output(NAS6210_GPIO_POWER_OFF, 0) == 0) + pm_power_off = nas6210_power_off; + else + pr_err("nas6210: failed to configure power-off GPIO\n"); +} + +static int __init nas6210_pci_init(void) +{ + if (machine_is_nas6210()) { + u32 dev, rev; + + kirkwood_pcie_id(&dev, &rev); + if (dev == MV88F6282_DEV_ID) + kirkwood_pcie_init(KW_PCIE1 | KW_PCIE0); + else + kirkwood_pcie_init(KW_PCIE0); + } + + return 0; +} +subsys_initcall(nas6210_pci_init); + +MACHINE_START(NAS6210, "RaidSonic ICY BOX IB-NAS6210") + /* Maintainer: <gmbnomis at gmail dot com> */ + .atag_offset = 0x100, + .init_machine = nas6210_init, + .map_io = kirkwood_map_io, + .init_early = kirkwood_init_early, + .init_irq = kirkwood_init_irq, + .timer = &kirkwood_timer, + .restart = kirkwood_restart, +MACHINE_END diff --git a/target/linux/kirkwood/files/arch/arm/mach-kirkwood/nsa-310-setup.c b/target/linux/kirkwood/files/arch/arm/mach-kirkwood/nsa-310-setup.c new file mode 100644 index 000000000..15dc526a8 --- /dev/null +++ b/target/linux/kirkwood/files/arch/arm/mach-kirkwood/nsa-310-setup.c @@ -0,0 +1,273 @@ +/* + * arch/arm/mach-kirkwood/nsa-310-setup.c + * + * ZyXEL NSA-310 Setup + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/platform_device.h> +#include <linux/ata_platform.h> +#include <linux/i2c.h> +#include <linux/mtd/mtd.h> +#include <linux/mtd/partitions.h> +#include <linux/gpio.h> +#include <linux/gpio_keys.h> +#include <linux/input.h> +#include <linux/leds.h> +#include <linux/delay.h> + +#include <asm/mach-types.h> +#include <asm/mach/arch.h> +#include <mach/kirkwood.h> +#include "common.h" +#include "mpp.h" + +#define NSA310_GPIO_LED_ESATA_GREEN 12 +#define NSA310_GPIO_LED_ESATA_RED 13 +#define NSA310_GPIO_LED_USB_GREEN 15 +#define NSA310_GPIO_LED_USB_RED 16 +#define NSA310_GPIO_USB_POWER_OFF 21 +#define NSA310_GPIO_LED_SYS_GREEN 28 +#define NSA310_GPIO_LED_SYS_RED 29 +#define NSA310_GPIO_KEY_RESTART 36 +#define NSA310_GPIO_KEY_COPY 37 +#define NSA310_GPIO_LED_COPY_GREEN 39 +#define NSA310_GPIO_LED_COPY_RED 40 +#define NSA310_GPIO_LED_HDD_GREEN 41 +#define NSA310_GPIO_LED_HDD_RED 42 +#define NSA310_GPIO_BUZZER 44 +#define NSA310_GPIO_KEY_POWER 46 +#define NSA310_GPIO_POWER_OFF 48 + + +static unsigned int nsa310_mpp_config[] __initdata = { + MPP12_GPIO, + MPP13_GPIO, + MPP15_GPIO, + MPP16_GPIO, + MPP21_GPIO, + MPP28_GPIO, + MPP29_GPIO, + MPP36_GPIO, + MPP37_GPIO, + MPP39_GPIO, + MPP40_GPIO, + MPP41_GPIO, + MPP42_GPIO, + MPP44_GPIO, + MPP46_GPIO, + MPP48_GPIO, + 0 +}; + +static struct mtd_partition nsa310_mtd_parts[] = { + { + .name = "uboot", + .offset = 0, + .size = 0x100000, + .mask_flags = MTD_WRITEABLE, + }, { + .name = "uboot_env", + .offset = MTDPART_OFS_NXTBLK, + .size = 0x80000, + }, { + .name = "key_store", + .offset = MTDPART_OFS_NXTBLK, + .size = 0x80000, + }, { + .name = "info", + .offset = MTDPART_OFS_NXTBLK, + .size = 0x80000, + }, { + .name = "etc", + .offset = MTDPART_OFS_NXTBLK, + .size = 0xa00000, + }, { + .name = "kernel_1", + .offset = MTDPART_OFS_NXTBLK, + .size = 0xa00000, + }, { + .name = "rootfs1", + .offset = MTDPART_OFS_NXTBLK, + .size = 0x2fc0000, + }, { + .name = "kernel_2", + .offset = MTDPART_OFS_NXTBLK, + .size = 0xa00000, + }, { + .name = "rootfs2", + .offset = MTDPART_OFS_NXTBLK, + .size = 0x2fc0000, + }, +}; + +static struct gpio_led nsa310_leds[] = { + { + .name = "nsa310:green:sys", + .gpio = NSA310_GPIO_LED_SYS_GREEN, + }, { + .name = "nsa310:red:sys", + .gpio = NSA310_GPIO_LED_SYS_RED, + }, { + .name = "nsa310:green:hdd", + .gpio = NSA310_GPIO_LED_HDD_GREEN, + }, { + .name = "nsa310:red:hdd", + .gpio = NSA310_GPIO_LED_HDD_RED, + }, { + .name = "nsa310:green:esata", + .gpio = NSA310_GPIO_LED_ESATA_GREEN, + }, { + .name = "nsa310:red:esata", + .gpio = NSA310_GPIO_LED_ESATA_RED, + }, { + .name = "nsa310:green:usb", + .gpio = NSA310_GPIO_LED_USB_GREEN, + }, { + .name = "nsa310:red:usb", + .gpio = NSA310_GPIO_LED_USB_RED, + }, { + .name = "nsa310:green:copy", + .gpio = NSA310_GPIO_LED_COPY_GREEN, + }, { + .name = "nsa310:red:copy", + .gpio = NSA310_GPIO_LED_COPY_RED, + }, +}; + +static struct gpio_led_platform_data nsa310_leds_data = { + .leds = nsa310_leds, + .num_leds = ARRAY_SIZE(nsa310_leds), +}; + +static struct platform_device nsa310_leds_device = { + .name = "leds-gpio", + .id = -1, + .dev = { + .platform_data = &nsa310_leds_data, + } +}; + +static struct gpio_keys_button nsa310_buttons[] = { + { + .desc = "Power Button", + .code = KEY_POWER, + .type = EV_KEY, + .gpio = NSA310_GPIO_KEY_POWER, + .debounce_interval = 1000, + }, { + .desc = "Copy Button", + .code = KEY_COPY, + .type = EV_KEY, + .gpio = NSA310_GPIO_KEY_COPY, + .active_low = 1, + .debounce_interval = 1000, + }, { + .desc = "Reset Button", + .code = KEY_RESTART, + .type = EV_KEY, + .gpio = NSA310_GPIO_KEY_RESTART, + .active_low = 1, + .debounce_interval = 1000, + }, +}; + +static struct gpio_keys_platform_data nsa310_keys_data = { + .buttons = nsa310_buttons, + .nbuttons = ARRAY_SIZE(nsa310_buttons), +}; + +static struct platform_device nsa310_keys_device = { + .name = "gpio-keys", + .id = -1, + .dev = { + .platform_data = &nsa310_keys_data, + } +}; + +static struct i2c_board_info __initdata nsa310_i2c_info[] = { + { I2C_BOARD_INFO("adt7476", 0x2e) }, +}; + +static struct mv_sata_platform_data nsa310_sata_data = { + .n_ports = 2, +}; + +static void nsa310_power_off(void) +{ + gpio_set_value(NSA310_GPIO_POWER_OFF, 1); +} + +static int __init nsa310_gpio_request(unsigned int gpio, unsigned long flags, + const char *label) +{ + int err; + + err = gpio_request_one(gpio, flags, label); + if (err) + pr_err("NSA-310: can't setup GPIO%u (%s), err=%d\n", + gpio, label, err); + + return err; +} + +static void __init nsa310_gpio_init(void) +{ + int err; + + err = nsa310_gpio_request(NSA310_GPIO_POWER_OFF, GPIOF_OUT_INIT_LOW, + "Power Off"); + if (!err) + pm_power_off = nsa310_power_off; + + nsa310_gpio_request(NSA310_GPIO_USB_POWER_OFF, GPIOF_OUT_INIT_LOW, + "USB Power Off"); +} + +static void __init nsa310_init(void) +{ + u32 dev, rev; + + kirkwood_init(); + kirkwood_mpp_conf(nsa310_mpp_config); + + nsa310_gpio_init(); + + kirkwood_nand_init(ARRAY_AND_SIZE(nsa310_mtd_parts), 35); + kirkwood_ehci_init(); + + kirkwood_pcie_id(&dev, &rev); + + kirkwood_sata_init(&nsa310_sata_data); + kirkwood_uart0_init(); + + i2c_register_board_info(0, ARRAY_AND_SIZE(nsa310_i2c_info)); + kirkwood_i2c_init(); + + platform_device_register(&nsa310_leds_device); + platform_device_register(&nsa310_keys_device); +} + +static int __init nsa310_pci_init(void) +{ + if (machine_is_nsa310()) + kirkwood_pcie_init(KW_PCIE0); + + return 0; +} +subsys_initcall(nsa310_pci_init); + +MACHINE_START(NSA310, "ZyXEL NSA-310") + .atag_offset = 0x100, + .init_machine = nsa310_init, + .map_io = kirkwood_map_io, + .init_early = kirkwood_init_early, + .init_irq = kirkwood_init_irq, + .timer = &kirkwood_timer, + .restart = kirkwood_restart, +MACHINE_END |