Signed-off-by: Miaoqing Pan <miaoqing@codeaurora.org> SVN-Revision: 46208master
parent
c9e433206f
commit
b26077026f
@ -0,0 +1,142 @@ |
||||
/*
|
||||
* Atheros AP143 reference board support |
||||
* |
||||
* Copyright (c) 2013-2015 The Linux Foundation. All rights reserved. |
||||
* Copyright (c) 2012 Gabor Juhos <juhosg@openwrt.org> |
||||
* |
||||
* Permission to use, copy, modify, and/or distribute this software for any |
||||
* purpose with or without fee is hereby granted, provided that the above |
||||
* copyright notice and this permission notice appear in all copies. |
||||
* |
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
||||
* |
||||
*/ |
||||
|
||||
#include <linux/platform_device.h> |
||||
#include <linux/ath9k_platform.h> |
||||
#include <linux/ar8216_platform.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-spi.h" |
||||
#include "dev-usb.h" |
||||
#include "dev-wmac.h" |
||||
#include "machtypes.h" |
||||
|
||||
#define AP143_GPIO_LED_WLAN 12 |
||||
#define AP143_GPIO_LED_WPS 13 |
||||
#define AP143_GPIO_LED_STATUS 13 |
||||
|
||||
#define AP143_GPIO_LED_WAN 4 |
||||
#define AP143_GPIO_LED_LAN1 16 |
||||
#define AP143_GPIO_LED_LAN2 15 |
||||
#define AP143_GPIO_LED_LAN3 14 |
||||
#define AP143_GPIO_LED_LAN4 11 |
||||
|
||||
#define AP143_GPIO_BTN_WPS 17 |
||||
|
||||
#define AP143_KEYS_POLL_INTERVAL 20 /* msecs */ |
||||
#define AP143_KEYS_DEBOUNCE_INTERVAL (3 * AP143_KEYS_POLL_INTERVAL) |
||||
|
||||
#define AP143_MAC0_OFFSET 0 |
||||
#define AP143_MAC1_OFFSET 6 |
||||
#define AP143_WMAC_CALDATA_OFFSET 0x1000 |
||||
|
||||
static struct gpio_led ap143_leds_gpio[] __initdata = { |
||||
{ |
||||
.name = "ap143:green:status", |
||||
.gpio = AP143_GPIO_LED_STATUS, |
||||
.active_low = 1, |
||||
}, |
||||
{ |
||||
.name = "ap143:green:wlan", |
||||
.gpio = AP143_GPIO_LED_WLAN, |
||||
.active_low = 1, |
||||
} |
||||
}; |
||||
|
||||
static struct gpio_keys_button ap143_gpio_keys[] __initdata = { |
||||
{ |
||||
.desc = "WPS button", |
||||
.type = EV_KEY, |
||||
.code = KEY_WPS_BUTTON, |
||||
.debounce_interval = AP143_KEYS_DEBOUNCE_INTERVAL, |
||||
.gpio = AP143_GPIO_BTN_WPS, |
||||
.active_low = 1, |
||||
}, |
||||
}; |
||||
|
||||
static void __init ap143_gpio_led_setup(void) |
||||
{ |
||||
ath79_gpio_direction_select(AP143_GPIO_LED_WAN, true); |
||||
ath79_gpio_direction_select(AP143_GPIO_LED_LAN1, true); |
||||
ath79_gpio_direction_select(AP143_GPIO_LED_LAN2, true); |
||||
ath79_gpio_direction_select(AP143_GPIO_LED_LAN3, true); |
||||
ath79_gpio_direction_select(AP143_GPIO_LED_LAN4, true); |
||||
|
||||
ath79_gpio_output_select(AP143_GPIO_LED_WAN, |
||||
QCA953X_GPIO_OUT_MUX_LED_LINK5); |
||||
ath79_gpio_output_select(AP143_GPIO_LED_LAN1, |
||||
QCA953X_GPIO_OUT_MUX_LED_LINK1); |
||||
ath79_gpio_output_select(AP143_GPIO_LED_LAN2, |
||||
QCA953X_GPIO_OUT_MUX_LED_LINK2); |
||||
ath79_gpio_output_select(AP143_GPIO_LED_LAN3, |
||||
QCA953X_GPIO_OUT_MUX_LED_LINK3); |
||||
ath79_gpio_output_select(AP143_GPIO_LED_LAN4, |
||||
QCA953X_GPIO_OUT_MUX_LED_LINK4); |
||||
|
||||
ath79_register_leds_gpio(-1, ARRAY_SIZE(ap143_leds_gpio), |
||||
ap143_leds_gpio); |
||||
ath79_register_gpio_keys_polled(-1, AP143_KEYS_POLL_INTERVAL, |
||||
ARRAY_SIZE(ap143_gpio_keys), |
||||
ap143_gpio_keys); |
||||
} |
||||
|
||||
static void __init ap143_setup(void) |
||||
{ |
||||
u8 *art = (u8 *) KSEG1ADDR(0x1fff0000); |
||||
|
||||
ath79_register_m25p80(NULL); |
||||
|
||||
ap143_gpio_led_setup(); |
||||
|
||||
ath79_register_usb(); |
||||
|
||||
ath79_wmac_set_led_pin(AP143_GPIO_LED_WLAN); |
||||
ath79_register_wmac(art + AP143_WMAC_CALDATA_OFFSET, NULL); |
||||
|
||||
ath79_register_mdio(0, 0x0); |
||||
ath79_register_mdio(1, 0x0); |
||||
|
||||
ath79_init_mac(ath79_eth0_data.mac_addr, art + AP143_MAC0_OFFSET, 0); |
||||
ath79_init_mac(ath79_eth1_data.mac_addr, art + AP143_MAC1_OFFSET, 0); |
||||
|
||||
/* WAN port */ |
||||
ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII; |
||||
ath79_eth0_data.speed = SPEED_100; |
||||
ath79_eth0_data.duplex = DUPLEX_FULL; |
||||
ath79_eth0_data.phy_mask = BIT(4); |
||||
ath79_register_eth(0); |
||||
|
||||
/* LAN ports */ |
||||
ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII; |
||||
ath79_eth1_data.speed = SPEED_1000; |
||||
ath79_eth1_data.duplex = DUPLEX_FULL; |
||||
ath79_switch_data.phy_poll_mask |= BIT(4); |
||||
ath79_switch_data.phy4_mii_en = 1; |
||||
ath79_register_eth(1); |
||||
} |
||||
|
||||
MIPS_MACHINE(ATH79_MACH_AP143, "AP143", "Qualcomm Atheros AP143 reference board", |
||||
ap143_setup); |
@ -0,0 +1,24 @@ |
||||
--- a/arch/mips/ath79/dev-wmac.c
|
||||
+++ b/arch/mips/ath79/dev-wmac.c
|
||||
@@ -398,6 +398,11 @@ void __init ath79_wmac_set_ext_lna_gpio(unsigned chain, int gpio)
|
||||
ar934x_set_ext_lna_gpio(chain, gpio);
|
||||
}
|
||||
|
||||
+void __init ath79_wmac_set_led_pin(int gpio)
|
||||
+{
|
||||
+ ath79_wmac_data.led_pin = gpio;
|
||||
+}
|
||||
+
|
||||
void __init ath79_register_wmac(u8 *cal_data, u8 *mac_addr)
|
||||
{
|
||||
if (soc_is_ar913x())
|
||||
--- a/arch/mips/ath79/dev-wmac.h
|
||||
+++ b/arch/mips/ath79/dev-wmac.h
|
||||
@@ -18,6 +18,7 @@ void ath79_wmac_disable_2ghz(void);
|
||||
void ath79_wmac_disable_5ghz(void);
|
||||
void ath79_wmac_set_tx_gain_buffalo(void);
|
||||
void ath79_wmac_set_ext_lna_gpio(unsigned chain, int gpio);
|
||||
+void ath79_wmac_set_led_pin(int gpio);
|
||||
|
||||
bool ar93xx_wmac_read_mac_address(u8 *dest);
|
||||
|
@ -0,0 +1,43 @@ |
||||
--- a/arch/mips/ath79/common.h
|
||||
+++ b/arch/mips/ath79/common.h
|
||||
@@ -28,6 +28,7 @@ void ath79_gpio_function_enable(u32 mask);
|
||||
void ath79_gpio_function_disable(u32 mask);
|
||||
void ath79_gpio_function_setup(u32 set, u32 clear);
|
||||
void ath79_gpio_output_select(unsigned gpio, u8 val);
|
||||
+int ath79_gpio_direction_select(unsigned gpio, bool oe);
|
||||
void ath79_gpio_init(void);
|
||||
|
||||
#endif /* __ATH79_COMMON_H */
|
||||
--- a/arch/mips/ath79/gpio.c
|
||||
+++ b/arch/mips/ath79/gpio.c
|
||||
@@ -130,6 +130,30 @@ static int ar934x_gpio_direction_output(struct gpio_chip *chip, unsigned offset,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+int ath79_gpio_direction_select(unsigned gpio, bool oe)
|
||||
+{
|
||||
+ void __iomem *base = ath79_gpio_base;
|
||||
+ unsigned long flags;
|
||||
+ bool ieq_1 = (soc_is_ar934x() ||
|
||||
+ soc_is_qca953x());
|
||||
+
|
||||
+ if (gpio >= ath79_gpio_count)
|
||||
+ return -1;
|
||||
+
|
||||
+ spin_lock_irqsave(&ath79_gpio_lock, flags);
|
||||
+
|
||||
+ if ((ieq_1 && oe) || (!ieq_1 && !oe))
|
||||
+ __raw_writel(__raw_readl(base + AR71XX_GPIO_REG_OE) & ~(1 << gpio),
|
||||
+ base + AR71XX_GPIO_REG_OE);
|
||||
+ else
|
||||
+ __raw_writel(__raw_readl(base + AR71XX_GPIO_REG_OE) | (1 << gpio),
|
||||
+ base + AR71XX_GPIO_REG_OE);
|
||||
+
|
||||
+ spin_unlock_irqrestore(&ath79_gpio_lock, flags);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static struct gpio_chip ath79_gpio_chip = {
|
||||
.label = "ath79",
|
||||
.get = ath79_gpio_get_value,
|
@ -0,0 +1,43 @@ |
||||
--- a/arch/mips/ath79/Kconfig
|
||||
+++ b/arch/mips/ath79/Kconfig
|
||||
@@ -114,6 +114,20 @@ config ATH79_MACH_AP136
|
||||
Say 'Y' here if you want your kernel to support the
|
||||
Atheros AP136 or AP135 reference boards.
|
||||
|
||||
+config ATH79_MACH_AP143
|
||||
+ bool "Atheros AP143 reference board"
|
||||
+ select SOC_QCA953X
|
||||
+ select ATH79_DEV_GPIO_BUTTONS
|
||||
+ select ATH79_DEV_LEDS_GPIO
|
||||
+ select ATH79_DEV_SPI
|
||||
+ select ATH79_DEV_USB
|
||||
+ select ATH79_DEV_WMAC
|
||||
+ select ATH79_DEV_ETH
|
||||
+ select ATH79_DEV_M25P80
|
||||
+ help
|
||||
+ Say 'Y' here if you want your kernel to support the
|
||||
+ Atheros AP143 reference board.
|
||||
+
|
||||
config ATH79_MACH_AP81
|
||||
bool "Atheros AP81 reference board"
|
||||
select SOC_AR913X
|
||||
--- a/arch/mips/ath79/Makefile
|
||||
+++ b/arch/mips/ath79/Makefile
|
||||
@@ -47,6 +47,7 @@ obj-$(CONFIG_ATH79_MACH_AP113) += mach-ap113.o
|
||||
obj-$(CONFIG_ATH79_MACH_AP121) += mach-ap121.o
|
||||
obj-$(CONFIG_ATH79_MACH_AP132) += mach-ap132.o
|
||||
obj-$(CONFIG_ATH79_MACH_AP136) += mach-ap136.o
|
||||
+obj-$(CONFIG_ATH79_MACH_AP143) += mach-ap143.o
|
||||
obj-$(CONFIG_ATH79_MACH_AP81) += mach-ap81.o
|
||||
obj-$(CONFIG_ATH79_MACH_AP83) += mach-ap83.o
|
||||
obj-$(CONFIG_ATH79_MACH_AP96) += mach-ap96.o
|
||||
--- a/arch/mips/ath79/machtypes.h
|
||||
+++ b/arch/mips/ath79/machtypes.h
|
||||
@@ -29,6 +29,7 @@ enum ath79_mach_type {
|
||||
ATH79_MACH_AP135_020, /* Atheros AP135-020 reference board */
|
||||
ATH79_MACH_AP136_010, /* Atheros AP136-010 reference board */
|
||||
ATH79_MACH_AP136_020, /* Atheros AP136-020 reference board */
|
||||
+ ATH79_MACH_AP143, /* Atheros AP143 reference board */
|
||||
ATH79_MACH_AP81, /* Atheros AP81 reference board */
|
||||
ATH79_MACH_AP83, /* Atheros AP83 */
|
||||
ATH79_MACH_AP96, /* Atheros AP96 */
|
Loading…
Reference in new issue