--- a/arch/arm/mach-kirkwood/Kconfig +++ b/arch/arm/mach-kirkwood/Kconfig @@ -142,6 +142,12 @@ config MACH_NAS6210 Say 'Y' here if you want your kernel to support the RaidSonic ICY BOX IB-NAS6210 device. +config MACH_NSA310 + bool "ZyXEL NSA-310" + help + Say 'Y' here if you want your kernel to support the + ZyXEL NSA-310 board. + endmenu endif --- a/arch/arm/mach-kirkwood/Makefile +++ b/arch/arm/mach-kirkwood/Makefile @@ -20,5 +20,6 @@ obj-$(CONFIG_MACH_NET2BIG_V2) += netxbi obj-$(CONFIG_MACH_NET5BIG_V2) += netxbig_v2-setup.o lacie_v2-common.o obj-$(CONFIG_MACH_T5325) += t5325-setup.o obj-$(CONFIG_MACH_NAS6210) += nas6210-setup.o +obj-$(CONFIG_MACH_NSA310) += nsa-310-setup.o obj-$(CONFIG_CPU_IDLE) += cpuidle.o --- /dev/null +++ b/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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#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