1/*
2 *  Redwave RW2458N support
3 *
4 *  Copyright (C) 2011-2012 Cezary Jackiewicz <cezary@eko.one.pl>
5 *
6 *  This program is free software; you can redistribute it and/or modify it
7 *  under the terms of the GNU General Public License version 2 as published
8 *  by the Free Software Foundation.
9 */
10
11#include <asm/mach-ath79/ath79.h>
12
13#include "dev-eth.h"
14#include "dev-ap9x-pci.h"
15#include "dev-gpio-buttons.h"
16#include "dev-leds-gpio.h"
17#include "dev-m25p80.h"
18#include "dev-usb.h"
19#include "machtypes.h"
20
21#define RW2458N_GPIO_LED_D3	1
22#define RW2458N_GPIO_LED_D4	0
23#define RW2458N_GPIO_LED_D5	11
24#define RW2458N_GPIO_LED_D6	7
25#define RW2458N_GPIO_BTN_RESET	12
26
27#define RW2458N_KEYS_POLL_INTERVAL	20	/* msecs */
28#define RW2458N_KEYS_DEBOUNCE_INTERVAL	(3 * RW2458N_KEYS_POLL_INTERVAL)
29
30static struct gpio_keys_button rw2458n_gpio_keys[] __initdata = {
31	{
32		.desc		= "reset",
33		.type		= EV_KEY,
34		.code		= KEY_RESTART,
35		.debounce_interval = RW2458N_KEYS_DEBOUNCE_INTERVAL,
36		.gpio		= RW2458N_GPIO_BTN_RESET,
37		.active_low	= 1,
38	}
39};
40
41#define RW2458N_WAN_PHYMASK	BIT(4)
42
43static struct gpio_led rw2458n_leds_gpio[] __initdata = {
44	{
45		.name		= "rw2458n:green:d3",
46		.gpio		= RW2458N_GPIO_LED_D3,
47		.active_low	= 1,
48	}, {
49		.name		= "rw2458n:green:d4",
50		.gpio		= RW2458N_GPIO_LED_D4,
51		.active_low	= 1,
52	}, {
53		.name		= "rw2458n:green:d5",
54		.gpio		= RW2458N_GPIO_LED_D5,
55		.active_low	= 1,
56	}, {
57		.name		= "rw2458n:green:d6",
58		.gpio		= RW2458N_GPIO_LED_D6,
59		.active_low	= 1,
60	}
61};
62
63static void __init rw2458n_setup(void)
64{
65	u8 *mac1 = (u8 *) KSEG1ADDR(0x1fff0000);
66	u8 *mac2 = (u8 *) KSEG1ADDR(0x1fff0000 + ETH_ALEN);
67	u8 *ee = (u8 *) KSEG1ADDR(0x1fff1000);
68
69	ath79_register_m25p80(NULL);
70
71	ath79_register_mdio(0, ~RW2458N_WAN_PHYMASK);
72
73	ath79_init_mac(ath79_eth0_data.mac_addr, mac1, 0);
74	ath79_init_mac(ath79_eth1_data.mac_addr, mac2, 0);
75
76	ath79_register_eth(0);
77	ath79_register_eth(1);
78
79	ap91_pci_init(ee, NULL);
80
81	ath79_register_leds_gpio(-1, ARRAY_SIZE(rw2458n_leds_gpio),
82				 rw2458n_leds_gpio);
83
84	ath79_register_gpio_keys_polled(-1, RW2458N_KEYS_POLL_INTERVAL,
85					ARRAY_SIZE(rw2458n_gpio_keys),
86					rw2458n_gpio_keys);
87	ath79_register_usb();
88}
89
90MIPS_MACHINE(ATH79_MACH_RW2458N, "RW2458N", "Redwave RW2458N",
91	    rw2458n_setup);
92