| 1 | /* |
| 2 | * EB-214A board support |
| 3 | * |
| 4 | * Copyright (C) 2007-2008 Gabor Juhos <juhosg@openwrt.org> |
| 5 | * Copyright (C) 2010 Cezary Jackiewicz <cezary@eko.one.pl> |
| 6 | * |
| 7 | * This program is free software; you can redistribute it and/or modify it |
| 8 | * under the terms of the GNU General Public License version 2 as published |
| 9 | * by the Free Software Foundation. |
| 10 | * |
| 11 | */ |
| 12 | |
| 13 | #include <asm/addrspace.h> |
| 14 | #include <asm/byteorder.h> |
| 15 | #include <linux/kernel.h> |
| 16 | #include <linux/init.h> |
| 17 | #include <linux/gpio.h> |
| 18 | #include <linux/irq.h> |
| 19 | #include <linux/etherdevice.h> |
| 20 | |
| 21 | #include <asm/mips_machine.h> |
| 22 | |
| 23 | #include <asm/mach-adm5120/adm5120_info.h> |
| 24 | #include <asm/mach-adm5120/adm5120_platform.h> |
| 25 | #include <asm/mach-adm5120/adm5120_defs.h> |
| 26 | |
| 27 | |
| 28 | #define EB214A_GPIO_DEV_MASK 0 |
| 29 | #define EB214A_CONFIG_OFFSET 0x4000 |
| 30 | |
| 31 | #ifdef CONFIG_MTD_PARTITIONS |
| 32 | static struct mtd_partition eb214a_partitions[] = { |
| 33 | { |
| 34 | .name = "bootloader", |
| 35 | .offset = 0, |
| 36 | .size = 32*1024, |
| 37 | .mask_flags = MTD_WRITEABLE, |
| 38 | } , { |
| 39 | .name = "config", |
| 40 | .offset = MTDPART_OFS_APPEND, |
| 41 | .size = 32*1024, |
| 42 | } , { |
| 43 | .name = "firmware", |
| 44 | .offset = MTDPART_OFS_APPEND, |
| 45 | .size = MTDPART_SIZ_FULL, |
| 46 | } |
| 47 | }; |
| 48 | #endif /* CONFIG_MTD_PARTITIONS */ |
| 49 | |
| 50 | static struct adm5120_pci_irq eb214a_pci_irqs[] __initdata = { |
| 51 | PCIIRQ(4, 0, 1, ADM5120_IRQ_PCI0), |
| 52 | PCIIRQ(4, 1, 2, ADM5120_IRQ_PCI0), |
| 53 | PCIIRQ(4, 2, 3, ADM5120_IRQ_PCI0), |
| 54 | }; |
| 55 | |
| 56 | static struct gpio_led eb214a_gpio_leds[] __initdata = { |
| 57 | GPIO_LED_INV(ADM5120_GPIO_PIN7, "power", NULL), |
| 58 | GPIO_LED_INV(ADM5120_GPIO_P0L0, "lan", NULL), |
| 59 | GPIO_LED_INV(ADM5120_GPIO_P4L0, "usb1", NULL), |
| 60 | GPIO_LED_INV(ADM5120_GPIO_P4L1, "usb2", NULL), |
| 61 | GPIO_LED_INV(ADM5120_GPIO_P4L2, "usb3", NULL), |
| 62 | GPIO_LED_INV(ADM5120_GPIO_P3L0, "usb4", NULL), |
| 63 | }; |
| 64 | |
| 65 | static struct gpio_button eb214a_gpio_buttons[] __initdata = { |
| 66 | { |
| 67 | .desc = "reset", |
| 68 | .type = EV_KEY, |
| 69 | .code = BTN_0, |
| 70 | .threshold = 5, |
| 71 | .gpio = ADM5120_GPIO_PIN1, |
| 72 | } |
| 73 | }; |
| 74 | |
| 75 | static u8 eb214a_vlans[6] __initdata = { |
| 76 | 0x41, 0x42, 0x44, 0x48, 0x50, 0x00 |
| 77 | }; |
| 78 | |
| 79 | static void __init eb214a_mac_setup(void) |
| 80 | { |
| 81 | u8 mac_base[6]; |
| 82 | u8 *cfg; |
| 83 | int i; |
| 84 | |
| 85 | cfg = (u8 *) KSEG1ADDR(ADM5120_SRAM0_BASE + EB214A_CONFIG_OFFSET); |
| 86 | for (i = 0; i < 6; i++) |
| 87 | mac_base[i] = cfg[i]; |
| 88 | |
| 89 | if (!is_valid_ether_addr(mac_base)) |
| 90 | random_ether_addr(mac_base); |
| 91 | |
| 92 | adm5120_setup_eth_macs(mac_base); |
| 93 | } |
| 94 | |
| 95 | static void __init eb214a_setup(void) |
| 96 | { |
| 97 | #ifdef CONFIG_MTD_PARTITIONS |
| 98 | adm5120_flash0_data.nr_parts = ARRAY_SIZE(eb214a_partitions); |
| 99 | adm5120_flash0_data.parts = eb214a_partitions; |
| 100 | #endif /* CONFIG_MTD_PARTITIONS */ |
| 101 | adm5120_add_device_flash(0); |
| 102 | |
| 103 | adm5120_add_device_gpio(EB214A_GPIO_DEV_MASK); |
| 104 | |
| 105 | adm5120_add_device_uart(0); |
| 106 | /* adm5120_add_device_uart(1); */ |
| 107 | |
| 108 | adm5120_add_device_switch(5, eb214a_vlans); |
| 109 | |
| 110 | eb214a_mac_setup(); |
| 111 | |
| 112 | adm5120_add_device_gpio_buttons(ARRAY_SIZE(eb214a_gpio_buttons), |
| 113 | eb214a_gpio_buttons); |
| 114 | |
| 115 | adm5120_add_device_gpio_leds(ARRAY_SIZE(eb214a_gpio_leds), |
| 116 | eb214a_gpio_leds); |
| 117 | |
| 118 | adm5120_pci_set_irq_map(ARRAY_SIZE(eb214a_pci_irqs), |
| 119 | eb214a_pci_irqs); |
| 120 | /* adm5120_add_device_usb(); */ |
| 121 | } |
| 122 | |
| 123 | MIPS_MACHINE(MACH_ADM5120_EB_214A, "EB-214A", "Generic EB-214A", eb214a_setup); |
| 124 | |