Ticket #8729: wnr854t-setup.4.c

File wnr854t-setup.4.c, 7.9 KB (added by Tanguy Pruvot <tanguy.pruvot@…>, 5 years ago)

fixed variable declaration warnings in alternative #if defined(CONFIG_KEYBOARD_GPIO)

Line 
1/*
2 * arch/arm/mach-orion5x/wnr854t-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 <linux/leds.h>
19#include <linux/gpio_keys.h>
20#include <linux/input.h>
21#include <net/dsa.h>
22#include <linux/i2c.h>
23#include <linux/reboot.h>
24#include <linux/interrupt.h>
25#include <asm/mach-types.h>
26#include <asm/gpio.h>
27#include <asm/mach/arch.h>
28#include <asm/mach/pci.h>
29#include <mach/orion5x.h>
30#include "common.h"
31#include "mpp.h"
32
33#include <asm/setup.h>
34
35/*
36 * Defines
37 */
38#define WNR854T_PIN_GPIO_RESET   1
39#define WNR854T_PCISLOT1_IRQ_PIN 4
40
41/*
42 * LEDs attached to GPIO
43 */
44static struct gpio_led wnr854t_led_pins[] = {
45        {
46                .name           = "wnr854t:green:power",
47                .gpio           = 0,
48                .active_low     = 1,
49        }, {
50                .name           = "wnr854t:blink:power",
51                .gpio           = 2,
52                .active_low     = 1,
53        }, {
54                .name           = "wnr854t:green:wan",
55                .gpio           = 3,
56                .active_low     = 1,
57        },
58};
59
60static struct gpio_led_platform_data wnr854t_led_data = {
61        .leds           = wnr854t_led_pins,
62        .num_leds       = ARRAY_SIZE(wnr854t_led_pins),
63};
64
65static struct platform_device wnr854t_leds = {
66        .name   = "leds-gpio",
67        .id     = -1,
68        .dev    = {
69                .platform_data  = &wnr854t_led_data,
70        },
71};
72
73
74/*
75 * GPIO Reset Button (gpio-keys mode)
76 */
77#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
78
79static struct gpio_keys_button wnr854t_buttons[] = {
80        {
81                .code           = KEY_RESTART,
82                .gpio           = 1,
83                .desc           = "Reset Button",
84                .active_low     = 1,
85        },
86};
87
88static struct gpio_keys_platform_data wnr854t_button_data = {
89        .buttons        = wnr854t_buttons,
90        .nbuttons       = ARRAY_SIZE(wnr854t_buttons),
91};
92
93static struct platform_device wnr854t_button_device = {
94        .name           = "gpio-keys",
95        .id             = -1,
96        .num_resources  = 0,
97        .dev            = {
98                .platform_data  = &wnr854t_button_data,
99        },
100};
101
102#else
103
104/*
105 * GPIO Reset Button (IRQ Mode)
106 */
107static irqreturn_t wnr854t_reset_handler(int irq, void *dev_id)
108{
109        /* This is the paper-clip reset which does an emergency reboot. */
110        printk(KERN_INFO "Restarting system.\n");
111        machine_restart(NULL);
112
113        /* This should never be reached. */
114        return IRQ_HANDLED;
115}
116
117#endif
118
119/*
120 * General setup
121 */
122static struct orion5x_mpp_mode wnr854t_mpp_modes[] __initdata = {
123        {  0, MPP_GPIO },               /* Power LED green (0=on) */
124        {  1, MPP_GPIO },               /* Reset Button (0=off) */
125        {  2, MPP_GPIO },               /* Power LED blink (0=off) */
126        {  3, MPP_GPIO },               /* WAN Status LED green (0=on) */
127        {  4, MPP_GPIO },               /* PCI int */
128        {  5, MPP_GPIO },               /* ??? */
129        {  6, MPP_GPIO },               /* ??? */
130        {  7, MPP_GPIO },               /* ??? */
131        {  8, MPP_UNUSED },             /* ??? */
132        {  9, MPP_GIGE },               /* GE_RXERR */
133        { 10, MPP_UNUSED },             /* ??? */
134        { 11, MPP_UNUSED },             /* ??? */
135        { 12, MPP_GIGE },               /* GE_TXD[4] */
136        { 13, MPP_GIGE },               /* GE_TXD[5] */
137        { 14, MPP_GIGE },               /* GE_TXD[6] */
138        { 15, MPP_GIGE },               /* GE_TXD[7] */
139        { 16, MPP_GIGE },               /* GE_RXD[4] */
140        { 17, MPP_GIGE },               /* GE_RXD[5] */
141        { 18, MPP_GIGE },               /* GE_RXD[6] */
142        { 19, MPP_GIGE },               /* GE_RXD[7] */
143        { -1 },
144};
145
146/*
147 * 8M NOR flash Device bus boot chip select
148 */
149#define WNR854T_NOR_BOOT_BASE   0xf4000000
150#define WNR854T_NOR_BOOT_SIZE   SZ_8M
151
152static struct mtd_partition wnr854t_nor_flash_partitions[] = {
153        {
154                .name           = "kernel",
155                .offset         = 0x00000000,
156                .size           = 0x00100000,
157        }, {
158                .name           = "rootfs",
159                .offset         = 0x00100000,
160                .size           = 0x00660000,
161        }, {
162                .name           = "uboot",
163                .offset         = 0x00760000,
164                .size           = 0x00040000,
165        }, {
166                .name           = "image",      // for sysupgrade
167                .offset         = 0x00000000,
168                .size           = 0x00760000,
169        },
170};
171
172static struct physmap_flash_data wnr854t_nor_flash_data = {
173        .width          = 2,
174        .parts          = wnr854t_nor_flash_partitions,
175        .nr_parts       = ARRAY_SIZE(wnr854t_nor_flash_partitions),
176};
177
178static struct resource wnr854t_nor_flash_resource = {
179        .flags          = IORESOURCE_MEM,
180        .start          = WNR854T_NOR_BOOT_BASE,
181        .end            = WNR854T_NOR_BOOT_BASE + WNR854T_NOR_BOOT_SIZE - 1,
182};
183
184static struct platform_device wnr854t_nor_flash = {
185        .name                   = "physmap-flash",
186        .id                     = 0,
187        .dev            = {
188                .platform_data  = &wnr854t_nor_flash_data,
189        },
190        .num_resources          = 1,
191        .resource               = &wnr854t_nor_flash_resource,
192};
193
194static struct mv643xx_eth_platform_data wnr854t_eth_data = {
195        .phy_addr       = MV643XX_ETH_PHY_NONE,
196        .speed          = SPEED_1000,
197        .duplex         = DUPLEX_FULL,
198};
199
200static struct dsa_chip_data wnr854t_switch_chip_data = {
201        .port_names[0] = "lan3",
202        .port_names[1] = "lan4",
203        .port_names[2] = "wan",
204        .port_names[3] = "cpu",
205        .port_names[5] = "lan1",
206        .port_names[7] = "lan2",
207};
208
209static struct dsa_platform_data wnr854t_switch_plat_data = {
210        .nr_chips       = 1,
211        .chip           = &wnr854t_switch_chip_data,
212};
213
214static void __init wnr854t_init(void)
215{
216#if !defined(CONFIG_KEYBOARD_GPIO) && !defined(CONFIG_KEYBOARD_GPIO_MODULE)
217        int irq, irq_ret;
218        char* input_desc;
219#endif
220
221        /*
222         * Setup basic Orion functions. Need to be called early.
223         */
224        orion5x_init();
225
226        orion5x_mpp_conf(wnr854t_mpp_modes);
227
228        /*
229         * Configure peripherals.
230         */
231        orion5x_uart0_init();
232
233        orion5x_eth_init(&wnr854t_eth_data);
234        orion5x_eth_switch_init(&wnr854t_switch_plat_data, NO_IRQ);
235
236        orion5x_i2c_init();
237        orion5x_spi_init();
238
239        //orion5x_ehci0_init();
240        //orion5x_ehci1_init();
241
242        orion5x_setup_dev_boot_win(WNR854T_NOR_BOOT_BASE,  WNR854T_NOR_BOOT_SIZE);
243        platform_device_register(&wnr854t_nor_flash);
244
245        platform_device_register(&wnr854t_leds);
246
247
248#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
249
250        printk(KERN_INFO "WNR854T: Reset Button using gpio-keys\n");
251        platform_device_register(&wnr854t_button_device);
252
253#else
254
255        input_desc = "Reset button";
256
257        irq_ret = gpio_request(WNR854T_PIN_GPIO_RESET, input_desc);
258        if (irq_ret != 0) {
259                printk(KERN_ERR "failed to request GPIO %d, error %d\n", WNR854T_PIN_GPIO_RESET, irq_ret);
260                goto button_failed;
261        }
262
263        irq_ret = gpio_direction_input(WNR854T_PIN_GPIO_RESET);
264        if (irq_ret != 0) {
265                printk(KERN_ERR "failed to configure GPIO %d, error %d\n", WNR854T_PIN_GPIO_RESET, irq_ret);
266                goto button_failed;
267        }
268
269        irq = gpio_to_irq(WNR854T_PIN_GPIO_RESET);
270        if ((irq_ret = request_irq(irq, wnr854t_reset_handler, IRQF_TRIGGER_LOW, input_desc, NULL)) < 0) {
271                printk(KERN_ERR "WNR854T: Reset Button IRQ %d not available ret=%d\n", irq, irq_ret);
272                goto button_failed;
273        } else {
274                //set_irq_type(irq, IRQ_TYPE_LEVEL_LOW);
275                printk(KERN_INFO "WNR854T: Reset Button IRQ %d enabled\n", irq);
276        }
277
278button_failed:
279#endif //CONFIG_KEYBOARD_GPIO
280
281        return;
282}
283
284static int __init parse_tag_wnr854t_uboot(const struct tag *t)
285{
286        // just trap uboot command line ignored by CONFIG_CMDLINE_FORCE
287        printk(KERN_INFO "U-Boot command line: %s\n", t->u.cmdline.cmdline);
288       
289        return -1;
290}
291__tagtable(ATAG_CMDLINE, parse_tag_wnr854t_uboot);
292
293static int __init parse_tag_wnr854t_unknown(const struct tag *t)
294{
295        // ignore silently empty tags
296        if (t->hdr.size == 4 && t->u.mem.size == 0 )
297                return 0;
298
299        return -1;
300}
301__tagtable(ATAG_NONE, parse_tag_wnr854t_unknown);
302
303static int __init wnr854t_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
304{
305        int irq;
306
307        /*
308         * Check for devices with hard-wired IRQs.
309         */
310        irq = orion5x_pci_map_irq(dev, slot, pin);
311        if (irq != -1)
312                return irq;
313
314        /*
315         * Mini-PCI slot.
316         */
317        if (slot == 7)
318                return gpio_to_irq(WNR854T_PCISLOT1_IRQ_PIN);
319
320        return -1;
321}
322
323static struct hw_pci wnr854t_pci __initdata = {
324        .nr_controllers = 2,
325        .swizzle        = pci_std_swizzle,
326        .setup          = orion5x_pci_sys_setup,
327        .scan           = orion5x_pci_sys_scan_bus,
328        .map_irq        = wnr854t_pci_map_irq,
329};
330
331static int __init wnr854t_pci_init(void)
332{
333        if (machine_is_wnr854t())
334                pci_common_init(&wnr854t_pci);
335
336        return 0;
337}
338subsys_initcall(wnr854t_pci_init);
339
340MACHINE_START(WNR854T, "Netgear WNR854T")
341        /* Maintainer: Imre Kaloz <kaloz@openwrt.org> */
342        .boot_params    = 0x00000100,
343        .init_machine   = wnr854t_init,
344        .map_io         = orion5x_map_io,
345        .init_irq       = orion5x_init_irq,
346        .timer          = &orion5x_timer,
347        .fixup          = tag_fixup_mem32,
348MACHINE_END