mirror of https://github.com/hak5/openwrt-owl.git
ar71xx: add inital support for the ALFA Network AP96 board
The microSD slot and the Real Time Clock is not working yet. The miniPCIe interface is not tested due to the lack of a suitable card. SVN-Revision: 29662owl
parent
807e046193
commit
b8f0d86115
|
@ -111,6 +111,7 @@ wp543)
|
||||||
ucidef_set_interface_lan "eth0"
|
ucidef_set_interface_lan "eth0"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
alfa-ap96 |\
|
||||||
alfa-nx |\
|
alfa-nx |\
|
||||||
ap83 |\
|
ap83 |\
|
||||||
jwap003 |\
|
jwap003 |\
|
||||||
|
|
|
@ -124,6 +124,9 @@ ar71xx_board_detect() {
|
||||||
*"AirRouter")
|
*"AirRouter")
|
||||||
name="airrouter"
|
name="airrouter"
|
||||||
;;
|
;;
|
||||||
|
*"ALFA Network AP96")
|
||||||
|
name="alfa-ap96"
|
||||||
|
;;
|
||||||
*"ALFA Network N2/N5")
|
*"ALFA Network N2/N5")
|
||||||
name="alfa-nx"
|
name="alfa-nx"
|
||||||
;;
|
;;
|
||||||
|
@ -142,7 +145,7 @@ ar71xx_board_detect() {
|
||||||
*AP83)
|
*AP83)
|
||||||
name="ap83"
|
name="ap83"
|
||||||
;;
|
;;
|
||||||
*AP96)
|
*"Atheros AP96")
|
||||||
name="ap96"
|
name="ap96"
|
||||||
;;
|
;;
|
||||||
*AW-NR580)
|
*AW-NR580)
|
||||||
|
|
|
@ -77,6 +77,7 @@ platform_check_image() {
|
||||||
platform_check_image_all0258n "$1" && return 0
|
platform_check_image_all0258n "$1" && return 0
|
||||||
return 1
|
return 1
|
||||||
;;
|
;;
|
||||||
|
alfa-ap96 | \
|
||||||
alfa-nx | \
|
alfa-nx | \
|
||||||
ap121 | \
|
ap121 | \
|
||||||
ap121-mini | \
|
ap121-mini | \
|
||||||
|
|
|
@ -13,6 +13,7 @@ CONFIG_AR71XX_DEV_M25P80=y
|
||||||
CONFIG_AR71XX_DEV_PB42_PCI=y
|
CONFIG_AR71XX_DEV_PB42_PCI=y
|
||||||
CONFIG_AR71XX_DEV_PB9X_PCI=y
|
CONFIG_AR71XX_DEV_PB9X_PCI=y
|
||||||
CONFIG_AR71XX_DEV_USB=y
|
CONFIG_AR71XX_DEV_USB=y
|
||||||
|
CONFIG_AR71XX_MACH_ALFA_AP96=y
|
||||||
CONFIG_AR71XX_MACH_ALFA_NX=y
|
CONFIG_AR71XX_MACH_ALFA_NX=y
|
||||||
CONFIG_AR71XX_MACH_ALL0258N=y
|
CONFIG_AR71XX_MACH_ALL0258N=y
|
||||||
CONFIG_AR71XX_MACH_AP121=y
|
CONFIG_AR71XX_MACH_AP121=y
|
||||||
|
|
|
@ -1,6 +1,13 @@
|
||||||
if ATHEROS_AR71XX
|
if ATHEROS_AR71XX
|
||||||
|
|
||||||
menu "Atheros AR71xx machine selection"
|
menu "Atheros AR71xx machine selection"
|
||||||
|
config AR71XX_MACH_ALFA_AP96
|
||||||
|
bool "ALFA Network AP96 board support"
|
||||||
|
select SOC_AR71XX
|
||||||
|
select AR71XX_DEV_PB42_PCI if PCI
|
||||||
|
select AR71XX_DEV_GPIO_BUTTONS
|
||||||
|
select AR71XX_DEV_USB
|
||||||
|
|
||||||
config AR71XX_MACH_HORNET_UB
|
config AR71XX_MACH_HORNET_UB
|
||||||
bool "Alfa Networks Hornet-UB board support"
|
bool "Alfa Networks Hornet-UB board support"
|
||||||
select SOC_AR933X
|
select SOC_AR933X
|
||||||
|
|
|
@ -28,6 +28,7 @@ obj-$(CONFIG_AR71XX_DEV_USB) += dev-usb.o
|
||||||
obj-$(CONFIG_AR71XX_NVRAM) += nvram.o
|
obj-$(CONFIG_AR71XX_NVRAM) += nvram.o
|
||||||
obj-$(CONFIG_AR71XX_PCI_ATH9K_FIXUP) += pci-ath9k-fixup.o
|
obj-$(CONFIG_AR71XX_PCI_ATH9K_FIXUP) += pci-ath9k-fixup.o
|
||||||
|
|
||||||
|
obj-$(CONFIG_AR71XX_MACH_ALFA_AP96) += mach-alfa-ap96.o
|
||||||
obj-$(CONFIG_AR71XX_MACH_ALFA_NX) += mach-alfa-nx.o
|
obj-$(CONFIG_AR71XX_MACH_ALFA_NX) += mach-alfa-nx.o
|
||||||
obj-$(CONFIG_AR71XX_MACH_ALL0258N) += mach-all0258n.o
|
obj-$(CONFIG_AR71XX_MACH_ALL0258N) += mach-all0258n.o
|
||||||
obj-$(CONFIG_AR71XX_MACH_AP121) += mach-ap121.o
|
obj-$(CONFIG_AR71XX_MACH_AP121) += mach-ap121.o
|
||||||
|
|
|
@ -0,0 +1,156 @@
|
||||||
|
/*
|
||||||
|
* ALFA Network AP96 board support
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 Gabor Juhos <juhosg@openwrt.org>
|
||||||
|
*
|
||||||
|
* 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/init.h>
|
||||||
|
#include <linux/bitops.h>
|
||||||
|
#include <linux/gpio.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/mmc/host.h>
|
||||||
|
#include <linux/spi/spi.h>
|
||||||
|
#include <linux/spi/mmc_spi.h>
|
||||||
|
|
||||||
|
#include <asm/mach-ar71xx/ar71xx.h>
|
||||||
|
|
||||||
|
#include "machtype.h"
|
||||||
|
#include "devices.h"
|
||||||
|
#include "dev-pb42-pci.h"
|
||||||
|
#include "dev-gpio-buttons.h"
|
||||||
|
#include "dev-usb.h"
|
||||||
|
|
||||||
|
#define ALFA_AP96_GPIO_MICROSD_CS 0
|
||||||
|
#define ALFA_AP96_GPIO_RTC_CS 1
|
||||||
|
#define ALFA_AP96_GPIO_PCIE_RESET 2
|
||||||
|
#define ALFA_AP96_GPIO_SIM_DETECT 3
|
||||||
|
#define ALFA_AP96_GPIO_MICROSD_CD 4
|
||||||
|
#define ALFA_AP96_GPIO_PCIE_W_DISABLE 5
|
||||||
|
|
||||||
|
#define ALFA_AP96_GPIO_BUTTON_RESET 11
|
||||||
|
|
||||||
|
#define ALFA_AP96_KEYS_POLL_INTERVAL 20 /* msecs */
|
||||||
|
#define ALFA_AP96_KEYS_DEBOUNCE_INTERVAL (3 * ALFA_AP96_KEYS_POLL_INTERVAL)
|
||||||
|
|
||||||
|
static struct gpio_keys_button alfa_ap96_gpio_keys[] __initdata = {
|
||||||
|
{
|
||||||
|
.desc = "Reset button",
|
||||||
|
.type = EV_KEY,
|
||||||
|
.code = KEY_RESTART,
|
||||||
|
.debounce_interval = ALFA_AP96_KEYS_DEBOUNCE_INTERVAL,
|
||||||
|
.gpio = ALFA_AP96_GPIO_BUTTON_RESET,
|
||||||
|
.active_low = 1,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static int alfa_ap96_mmc_get_cd(struct device *dev)
|
||||||
|
{
|
||||||
|
return !gpio_get_value(ALFA_AP96_GPIO_MICROSD_CD);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct mmc_spi_platform_data alfa_ap96_mmc_data = {
|
||||||
|
.get_cd = alfa_ap96_mmc_get_cd,
|
||||||
|
.caps = MMC_CAP_NEEDS_POLL,
|
||||||
|
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct spi_board_info alfa_ap96_spi_info[] = {
|
||||||
|
{
|
||||||
|
.bus_num = 0,
|
||||||
|
.chip_select = 0,
|
||||||
|
.max_speed_hz = 25000000,
|
||||||
|
.modalias = "m25p80",
|
||||||
|
}, {
|
||||||
|
.bus_num = 0,
|
||||||
|
.chip_select = 1,
|
||||||
|
.max_speed_hz = 25000000,
|
||||||
|
.modalias = "mmc_spi",
|
||||||
|
.platform_data = &alfa_ap96_mmc_data,
|
||||||
|
.controller_data = (void *) ALFA_AP96_GPIO_MICROSD_CS,
|
||||||
|
}, {
|
||||||
|
.bus_num = 0,
|
||||||
|
.chip_select = 2,
|
||||||
|
.max_speed_hz = 6250000,
|
||||||
|
.modalias = "rtc-pcf2123",
|
||||||
|
.controller_data = (void *) ALFA_AP96_GPIO_RTC_CS,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource alfa_ap96_spi_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = AR71XX_SPI_BASE,
|
||||||
|
.end = AR71XX_SPI_BASE + AR71XX_SPI_SIZE - 1,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct ar71xx_spi_platform_data alfa_ap96_spi_data = {
|
||||||
|
.bus_num = 0,
|
||||||
|
.num_chipselect = 3,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device alfa_ap96_spi_device = {
|
||||||
|
.name = "pb44-spi",
|
||||||
|
.id = -1,
|
||||||
|
.resource = alfa_ap96_spi_resources,
|
||||||
|
.num_resources = ARRAY_SIZE(alfa_ap96_spi_resources),
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &alfa_ap96_spi_data,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static void __init alfa_ap96_gpio_setup(void)
|
||||||
|
{
|
||||||
|
ar71xx_gpio_function_disable(AR71XX_GPIO_FUNC_SPI_CS1_EN |
|
||||||
|
AR71XX_GPIO_FUNC_SPI_CS2_EN);
|
||||||
|
|
||||||
|
gpio_request(ALFA_AP96_GPIO_MICROSD_CD, "microSD CD");
|
||||||
|
gpio_direction_input(ALFA_AP96_GPIO_MICROSD_CD);
|
||||||
|
gpio_request(ALFA_AP96_GPIO_PCIE_RESET, "PCIe reset");
|
||||||
|
gpio_direction_output(ALFA_AP96_GPIO_PCIE_RESET, 1);
|
||||||
|
gpio_request(ALFA_AP96_GPIO_PCIE_W_DISABLE, "PCIe write disable");
|
||||||
|
gpio_direction_output(ALFA_AP96_GPIO_PCIE_W_DISABLE, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ALFA_AP96_WAN_PHYMASK BIT(4)
|
||||||
|
#define ALFA_AP96_LAN_PHYMASK BIT(5)
|
||||||
|
#define ALFA_AP96_MDIO_PHYMASK (ALFA_AP96_LAN_PHYMASK | ALFA_AP96_WAN_PHYMASK)
|
||||||
|
|
||||||
|
static void __init alfa_ap96_init(void)
|
||||||
|
{
|
||||||
|
alfa_ap96_gpio_setup();
|
||||||
|
|
||||||
|
ar71xx_add_device_mdio(0, ~ALFA_AP96_MDIO_PHYMASK);
|
||||||
|
|
||||||
|
ar71xx_init_mac(ar71xx_eth0_data.mac_addr, ar71xx_mac_base, 0);
|
||||||
|
ar71xx_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII;
|
||||||
|
ar71xx_eth0_data.phy_mask = ALFA_AP96_WAN_PHYMASK;
|
||||||
|
ar71xx_eth1_pll_data.pll_1000 = 0x110000;
|
||||||
|
|
||||||
|
ar71xx_add_device_eth(0);
|
||||||
|
|
||||||
|
ar71xx_init_mac(ar71xx_eth1_data.mac_addr, ar71xx_mac_base, 1);
|
||||||
|
ar71xx_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII;
|
||||||
|
ar71xx_eth1_data.phy_mask = ALFA_AP96_LAN_PHYMASK;
|
||||||
|
ar71xx_eth1_pll_data.pll_1000 = 0x110000;
|
||||||
|
|
||||||
|
ar71xx_add_device_eth(1);
|
||||||
|
|
||||||
|
pb42_pci_init();
|
||||||
|
|
||||||
|
spi_register_board_info(alfa_ap96_spi_info,
|
||||||
|
ARRAY_SIZE(alfa_ap96_spi_info));
|
||||||
|
platform_device_register(&alfa_ap96_spi_device);
|
||||||
|
|
||||||
|
ar71xx_register_gpio_keys_polled(-1, ALFA_AP96_KEYS_POLL_INTERVAL,
|
||||||
|
ARRAY_SIZE(alfa_ap96_gpio_keys),
|
||||||
|
alfa_ap96_gpio_keys);
|
||||||
|
ar71xx_add_device_usb();
|
||||||
|
}
|
||||||
|
|
||||||
|
MIPS_MACHINE(AR71XX_MACH_ALFA_AP96, "ALFA-AP96", "ALFA Network AP96",
|
||||||
|
alfa_ap96_init);
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
enum ar71xx_mach_type {
|
enum ar71xx_mach_type {
|
||||||
AR71XX_MACH_GENERIC = 0,
|
AR71XX_MACH_GENERIC = 0,
|
||||||
|
AR71XX_MACH_ALFA_AP96, /* ALFA Network AP96 board */
|
||||||
AR71XX_MACH_ALFA_NX, /* ALFA Network N2/N5 board */
|
AR71XX_MACH_ALFA_NX, /* ALFA Network N2/N5 board */
|
||||||
AR71XX_MACH_ALL0258N, /* Allnet ALL0258N */
|
AR71XX_MACH_ALL0258N, /* Allnet ALL0258N */
|
||||||
AR71XX_MACH_AP121, /* Atheros AP121 */
|
AR71XX_MACH_AP121, /* Atheros AP121 */
|
||||||
|
|
Loading…
Reference in New Issue