aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ar71xx/files/arch/mips/ath79/mach-r36a.c
blob: b3493e2c4278f4aef0f94390383f010a4c52d8cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*
 * ALFA Network R36A board support
 *
 * Copyright (C) 2018 Piotr Dymacz <pepe2k@gmail.com>
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 as published
 * by the Free Software Foundation.
 */

#include <linux/gpio.h>
#include <linux/platform_device.h>

#include <asm/mach-ath79/ath79.h>
#include <asm/mach-ath79/ar71xx_regs.h>

#include "common.h"
#include "dev-eth.h"
#include "dev-gpio-buttons.h"
#include "dev-leds-gpio.h"
#include "dev-m25p80.h"
#include "dev-usb.h"
#include "dev-wmac.h"
#include "machtypes.h"

#define R36A_GPIO_LED_LAN	4
#define R36A_GPIO_LED_STATUS	14
#define R36A_GPIO_LED_USB	12
#define R36A_GPIO_LED_WAN	16
#define R36A_GPIO_LED_WLAN	15

#define R36A_GPIO_WDT_EN	1
#define R36A_GPIO_WDT_IN	0
#define R36A_GPIO_USB_PWR	3

#define R36A_GPIO_BTN_RESET	2
#define R36A_GPIO_BTN_RFKILL	17

#define R36A_KEYS_POLL_INTERVAL		20
#define R36A_KEYS_DEBOUNCE_INTERVAL	(3 * R36A_KEYS_POLL_INTERVAL)

#define R36A_WMAC_CALDATA_OFFSET	0x1000

static struct gpio_led r36a_leds_gpio[] __initdata = {
	{
		.name		= "r36a:blue:lan",
		.gpio		= R36A_GPIO_LED_LAN,
		.active_low	= 1,
	}, {
		.name		= "r36a:blue:status",
		.gpio		= R36A_GPIO_LED_STATUS,
		.active_low	= 1,
	}, {
		.name		= "r36a:blue:usb",
		.gpio		= R36A_GPIO_LED_USB,
		.active_low	= 1,
	}, {
		.name		= "r36a:blue:wan",
		.gpio		= R36A_GPIO_LED_WAN,
		.active_low	= 1,
	}, {
		.name		= "r36a:blue:wlan",
		.gpio		= R36A_GPIO_LED_WLAN,
		.active_low	= 1,
	},
};

static struct gpio_keys_button r36a_gpio_keys[] __initdata = {
	{
		.desc			= "reset",
		.type			= EV_KEY,
		.code			= KEY_RESTART,
		.debounce_interval	= R36A_KEYS_DEBOUNCE_INTERVAL,
		.gpio			= R36A_GPIO_BTN_RESET,
		.active_low		= 1,
	}, {
		.desc			= "rfkill",
		.type			= EV_KEY,
		.code			= KEY_RFKILL,
		.debounce_interval	= R36A_KEYS_DEBOUNCE_INTERVAL,
		.gpio			= R36A_GPIO_BTN_RFKILL,
		.active_low		= 1,
	},
};

static void __init r36a_setup(void)
{
	u8 *art = (u8 *) KSEG1ADDR(0x1f070000);

	ath79_register_m25p80(NULL);

	ath79_setup_ar933x_phy4_switch(false, false);

	ath79_register_mdio(0, 0x0);

	ath79_switch_data.phy4_mii_en = 1;
	ath79_switch_data.phy_poll_mask = 0xf7;

	/* LAN */
	ath79_eth0_data.duplex = DUPLEX_FULL;
	ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
	ath79_eth0_data.phy_mask = BIT(4);
	ath79_eth0_data.speed = SPEED_100;
	ath79_init_mac(ath79_eth0_data.mac_addr, art, 0);
	ath79_register_eth(0);

	/* WAN */
	ath79_eth1_data.duplex = DUPLEX_FULL;
	ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII;
	ath79_init_mac(ath79_eth1_data.mac_addr, art, 1);
	ath79_register_eth(1);

	/* Disable JTAG (enables GPIO0-3) */
	ath79_gpio_function_enable(AR934X_GPIO_FUNC_JTAG_DISABLE);

	ath79_register_leds_gpio(-1, ARRAY_SIZE(r36a_leds_gpio),
				 r36a_leds_gpio);

	ath79_register_gpio_keys_polled(-1, R36A_KEYS_POLL_INTERVAL,
					ARRAY_SIZE(r36a_gpio_keys),
					r36a_gpio_keys);

	gpio_request_one(R36A_GPIO_WDT_IN,
			 GPIOF_OUT_INIT_LOW | GPIOF_EXPORT_DIR_FIXED,
			 "WDT input");

	gpio_request_one(R36A_GPIO_WDT_EN,
			 GPIOF_OUT_INIT_LOW | GPIOF_EXPORT_DIR_FIXED,
			 "WDT enable");

	gpio_request_one(R36A_GPIO_USB_PWR,
			 GPIOF_OUT_INIT_HIGH | GPIOF_EXPORT_DIR_FIXED,
			 "USB power");

	ath79_register_wmac(art + R36A_WMAC_CALDATA_OFFSET, NULL);

	ath79_register_usb();
}

MIPS_MACHINE(ATH79_MACH_R36A, "R36A", "ALFA Network R36A", r36a_setup);