Ticket #7746: dir615a1-setup.c

File dir615a1-setup.c, 5.6 KB (added by cat, 6 years ago)
Line 
1/*
2 * arch/arm/mach-orion5x/dir615a1-setup.c
3 *
4 * This file is licensed under the terms of the GNU General Public
5 * License version 2.  This program is licensed "as is" without any
6 * warranty of any kind, whether express or implied.
7 */
8
9#include <linux/kernel.h>
10#include <linux/init.h>
11#include <linux/platform_device.h>
12#include <linux/pci.h>
13#include <linux/irq.h>
14#include <linux/delay.h>
15#include <linux/mtd/physmap.h>
16#include <linux/mv643xx_eth.h>
17#include <linux/ethtool.h>
18#include <net/dsa.h>
19#include <linux/leds.h>
20#include <linux/gpio_keys.h>
21#include <linux/input.h>
22#include <asm/mach-types.h>
23#include <asm/gpio.h>
24#include <asm/mach/arch.h>
25#include <asm/mach/pci.h>
26#include <mach/orion5x.h>
27#include "common.h"
28#include "mpp.h"
29
30/*
31 * LEDs attached to GPIO
32 */
33static struct gpio_led dir615a1_led_pins[] = {
34        {
35                .name           = "dir615:green:WIRELESS_LED",
36                .gpio           = 0,
37                .active_low     = 1,
38        }, {
39                .name           = "dir615:green:STATUS_LED",
40                .gpio           = 12,
41                .active_low     = 1,
42        }, {
43                .name           = "dir615:green:USB_LED",
44                .gpio           = 14,
45                .active_low     = 1,
46        },
47};
48
49static struct gpio_led_platform_data dir615a1_led_data = {
50        .leds           = dir615a1_led_pins,
51        .num_leds       = ARRAY_SIZE(dir615a1_led_pins),
52};
53
54static struct platform_device dir615a1_leds = {
55        .name   = "leds-gpio",
56        .id     = -1,
57        .dev    = {
58                .platform_data  = &dir615a1_led_data,
59        },
60};
61
62/*
63 * Buttons attached to GPIO
64 */
65static struct gpio_keys_button dir615a1_buttons[] = {
66        {
67                .code           = KEY_RESTART,
68                .gpio           = 13,
69                .desc           = "Reset Button",
70                .active_low     = 1,
71        }
72        };
73
74static struct gpio_keys_platform_data dir615a1_button_data = {
75        .buttons        = dir615a1_buttons,
76        .nbuttons       = ARRAY_SIZE(dir615a1_buttons),
77};
78
79static struct platform_device dir615a1_button_device = {
80        .name           = "gpio-keys",
81        .id             = -1,
82        .num_resources  = 0,
83        .dev            = {
84                .platform_data  = &dir615a1_button_data,
85        },
86};
87
88
89static struct orion5x_mpp_mode dir615a1_mpp_modes[] __initdata = {
90        {  0, MPP_GPIO },               /*  WIRELESS_LED */
91        {  1, MPP_GPIO },               /* ??? */
92        {  2, MPP_GPIO },               /* ??? */
93        {  3, MPP_GPIO },               /* ??? */
94        {  4, MPP_GPIO },               /* PCI int */
95        {  5, MPP_UNUSED },             /* ??? */
96        {  6, MPP_UNUSED},              /* ??? */
97        {  7, MPP_UNUSED },             /* ??? */
98        {  8, MPP_UNUSED },             /* ??? */
99        {  9, MPP_UNUSED },             /* ??? */
100        { 10, MPP_UNUSED },             /* ??? */
101        { 11, MPP_GPIO   },             /* ??? */
102        { 12, MPP_GPIO },               /* STATUS_LED */
103        { 13, MPP_GPIO },               /* Reset Button */
104        { 14, MPP_GPIO },               /*USB_LED */
105        { 15, MPP_UNUSED },             /* ??? */
106        { 16, MPP_UNUSED },             /* ??? */
107        { 17, MPP_UNUSED },             /* ??? */
108        { 18, MPP_UNUSED },             /*??? */
109        { 19, MPP_UNUSED },             /* ??? */
110        { -1 },
111};
112
113/*
114 * 8M NOR flash Device bus boot chip select
115 */
116#define WNR854T_NOR_BOOT_BASE   0xf4000000
117#define WNR854T_NOR_BOOT_SIZE   SZ_8M
118
119static struct mtd_partition dir615a1_nor_flash_partitions[] = {
120        {
121                .name           = "kernel",
122                .offset         = 0x00000000,
123                .size           = 0x00100000,
124        }, {
125                .name           = "rootfs",
126                .offset         = 0x00100000,
127                .size           = 0x00660000,
128        }, {
129                .name           = "uboot",
130                .offset         = 0x00760000,
131                .size           = 0x000A0000,
132        }, {
133                .name           = "image",      // for sysupgrade
134                .offset         = 0x00000000,
135                .size           = 0x00760000,
136        },
137};
138
139static struct physmap_flash_data dir615a1_nor_flash_data = {
140        .width          = 1,
141        .parts          = dir615a1_nor_flash_partitions,
142        .nr_parts       = ARRAY_SIZE(dir615a1_nor_flash_partitions),
143};
144
145static struct resource dir615a1_nor_flash_resource = {
146        .flags          = IORESOURCE_MEM,
147        .start          = WNR854T_NOR_BOOT_BASE,
148        .end            = WNR854T_NOR_BOOT_BASE + WNR854T_NOR_BOOT_SIZE - 1,
149};
150
151static struct platform_device dir615a1_nor_flash = {
152        .name                   = "physmap-flash",
153        .id                     = 0,
154        .dev            = {
155                .platform_data  = &dir615a1_nor_flash_data,
156        },
157        .num_resources          = 1,
158        .resource               = &dir615a1_nor_flash_resource,
159};
160
161static struct mv643xx_eth_platform_data dir615a1_eth_data = {
162        .phy_addr       = MV643XX_ETH_PHY_NONE,
163        .speed          = SPEED_100,
164        .duplex         = DUPLEX_FULL,
165};
166
167static struct dsa_chip_data dir615a1_switch_chip_data = {
168        .port_names[0]  = "lan4",
169        .port_names[1]  = "lan3",
170        .port_names[2]  = "lan2",
171        .port_names[3]  = "lan1",
172        .port_names[4]  = "wan",
173        .port_names[5]  = "cpu",
174};
175
176
177static struct dsa_platform_data dir615a1_switch_plat_data = {
178        .nr_chips       = 1,
179        .chip           = &dir615a1_switch_chip_data,
180};
181
182static void __init dir615a1_init(void)
183{
184        /*
185         * Setup basic Orion functions. Need to be called early.
186         */
187        orion5x_init();
188
189        orion5x_mpp_conf(dir615a1_mpp_modes);
190
191        /*
192         * Configure peripherals.
193         */
194        orion5x_ehci0_init();
195        orion5x_eth_init(&dir615a1_eth_data);
196        orion5x_eth_switch_init(&dir615a1_switch_plat_data, NO_IRQ);
197        orion5x_uart0_init();
198
199        orion5x_setup_dev_boot_win(WNR854T_NOR_BOOT_BASE,
200                                  WNR854T_NOR_BOOT_SIZE);
201        platform_device_register(&dir615a1_nor_flash);
202        platform_device_register(&dir615a1_leds);
203        platform_device_register(&dir615a1_button_device);
204
205}
206
207static int __init dir615a1_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
208{
209        int irq;
210
211        /*
212         * Check for devices with hard-wired IRQs.
213         */
214        irq = orion5x_pci_map_irq(dev, slot, pin);
215        if (irq != -1)
216                return irq;
217
218        /*
219         * Mini-PCI slot.
220         */
221        if (slot == 7)
222                return gpio_to_irq(4);
223
224        return -1;
225}
226
227static struct hw_pci dir615a1_pci __initdata = {
228        .nr_controllers = 2,
229        .swizzle        = pci_std_swizzle,
230        .setup          = orion5x_pci_sys_setup,
231        .scan           = orion5x_pci_sys_scan_bus,
232        .map_irq        = dir615a1_pci_map_irq,
233};
234
235static int __init dir615a1_pci_init(void)
236{
237        if (machine_is_dir615a1())
238                pci_common_init(&dir615a1_pci);
239
240        return 0;
241}
242subsys_initcall(dir615a1_pci_init);
243
244MACHINE_START(WNR854T, "D-LINK DIR615-A1")
245        /* Maintainer: Imre Kaloz <kaloz@openwrt.org> */
246        .phys_io        = ORION5X_REGS_PHYS_BASE,
247        .io_pg_offst    = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC,
248        .boot_params    = 0x00000100,
249        .init_machine   = dir615a1_init,
250        .map_io         = orion5x_map_io,
251        .init_irq       = orion5x_init_irq,
252        .timer          = &orion5x_timer,
253        .fixup          = tag_fixup_mem32,
254MACHINE_END