ar71xx: add preliminary kernel support for several RB SPI NOR devices
authorThibaut VARENE <hacks@slashdirt.org>
Fri, 10 Feb 2017 19:36:50 +0000 (20:36 +0100)
committerFelix Fietkau <nbd@nbd.name>
Wed, 15 Feb 2017 10:28:59 +0000 (11:28 +0100)
The cAP 2nD, mAP 2nD and wAP 2nD apparently all share the same QCA953x/SPI-NOR
platform.

This patch adds preliminary kernel support based on init data used in
Mikrotik's linux-3.3.5 kernel patch. Since this is totally experimental and
untested, the necessary glue in base-files has not been added, the code is
provided as a starting point in case somebody with that hardware wants to help
getting it supported.

The cAP lite (cAPL 2nD) should also be supported once it is determined whether
or not it uses the same board identifier as the mAP lite.

Code has been successfully built and has no side effect (no impact on already
supported devices).

Signed-off-by: Thibaut VARENE <hacks@slashdirt.org>
target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
target/linux/ar71xx/files/arch/mips/ath79/mach-rbspi.c
target/linux/ar71xx/files/arch/mips/ath79/machtypes.h

index bc06481e3963ae3bc02cccea6c952a8e8dd09f0e..4c00ea5a95d4faac8d14003b693b472000798359 100644 (file)
@@ -931,6 +931,9 @@ config ATH79_MACH_RBSPI
          MikroTik RouterBOARD hAP
          MikroTik RouterBOARD hEX PoE lite
          MikroTik RouterBOARD hEX lite
+         MikroTik RouterBOARD cAP (EXPERIMENTAL)
+         MikroTik RouterBOARD mAP (EXPERIMENTAL)
+         MikroTik RouterBOARD wAP (EXPERIMENTAL)
 
 config ATH79_MACH_RBSXTLITE
        bool "MikroTik RouterBOARD SXT Lite"
index c0b27190fecca14b9da72e0d70954bd0c6acbd8a..b6b3338845e0ac9cc0c72dda976d62a965442246 100644 (file)
@@ -7,6 +7,14 @@
  *  - MikroTik RouterBOARD 750UP r2
  *  - MikroTik RouterBOARD 750 r2
  *
+ *  Preliminary support for the following hardware
+ *  - MikroTik RouterBOARD wAP2nD
+ *  - MikroTik RouterBOARD cAP2nD
+ *  - MikroTik RouterBOARD mAP2nD
+ *  Furthermore, the cAP lite (cAPL2nD) appears to feature the exact same
+ *  hardware as the mAP L-2nD. It is unknown if they share the same board
+ *  identifier.
+ *
  *  Copyright (C) 2017 Thibaut VARENE <varenet@parisc-linux.org>
  *
  *  This program is free software; you can redistribute it and/or modify it
@@ -189,6 +197,7 @@ static struct gpio_led rbhapl_leds[] __initdata = {
 #define RB952_GPIO_SSR_CS      11
 #define RB952_GPIO_LED_USER    4
 #define RB952_GPIO_POE_POWER   14
+#define RB952_GPIO_POE_STATUS  12
 #define RB952_GPIO_USB_POWER   RBSPI_SSR_GPIO(RB952_SSR_BIT_USB_POWER)
 #define RB952_GPIO_LED_LAN1    RBSPI_SSR_GPIO(RB952_SSR_BIT_LED_LAN1)
 #define RB952_GPIO_LED_LAN2    RBSPI_SSR_GPIO(RB952_SSR_BIT_LED_LAN2)
@@ -229,6 +238,103 @@ static struct gpio_led rb952_leds[] __initdata = {
        },
 };
 
+/* RB wAP-2nD gpios */
+#define RBWAP_GPIO_LED_USER    14
+#define RBWAP_GPIO_LED_WLAN    11
+
+static struct gpio_led rbwap_leds[] __initdata = {
+       {
+               .name = "rb:green:user",
+               .gpio = RBWAP_GPIO_LED_USER,
+               .active_low = 1,
+       }, {
+               .name = "rb:green:wlan",
+               .gpio = RBWAP_GPIO_LED_WLAN,
+               .active_low = 1,
+       },
+};
+
+/* RB cAP-2nD gpios */
+#define RBCAP_GPIO_LED_1       14
+#define RBCAP_GPIO_LED_2       12
+#define RBCAP_GPIO_LED_3       11
+#define RBCAP_GPIO_LED_4       4
+#define RBCAP_GPIO_LED_ALL     13
+
+static struct gpio_led rbcap_leds[] __initdata = {
+       {
+               .name = "rb:green:rssi1",
+               .gpio = RBCAP_GPIO_LED_1,
+               .active_low = 1,
+       }, {
+               .name = "rb:green:rssi2",
+               .gpio = RBCAP_GPIO_LED_2,
+               .active_low = 1,
+       }, {
+               .name = "rb:green:rssi3",
+               .gpio = RBCAP_GPIO_LED_3,
+               .active_low = 1,
+       }, {
+               .name = "rb:green:rssi4",
+               .gpio = RBCAP_GPIO_LED_4,
+               .active_low = 1,
+       },
+};
+
+/* RB mAP-2nD gpios */
+#define RBMAP_SSR_BIT_LED_LAN1 0
+#define RBMAP_SSR_BIT_LED_LAN2 1
+#define RBMAP_SSR_BIT_LED_POEO 2
+#define RBMAP_SSR_BIT_LED_USER 3
+#define RBMAP_SSR_BIT_LED_WLAN 4
+#define RBMAP_SSR_BIT_USB_POWER        5
+#define RBMAP_SSR_BIT_LED_APCAP        6
+#define RBMAP_GPIO_SSR_CS      11
+#define RBMAP_GPIO_LED_POWER   4
+#define RBMAP_GPIO_POE_POWER   14
+#define RBMAP_GPIO_POE_STATUS  12
+#define RBMAP_GPIO_USB_POWER   RBSPI_SSR_GPIO(RBMAP_SSR_BIT_USB_POWER)
+#define RBMAP_GPIO_LED_LAN1    RBSPI_SSR_GPIO(RBMAP_SSR_BIT_LED_LAN1)
+#define RBMAP_GPIO_LED_LAN2    RBSPI_SSR_GPIO(RBMAP_SSR_BIT_LED_LAN2)
+#define RBMAP_GPIO_LED_POEO    RBSPI_SSR_GPIO(RBMAP_SSR_BIT_LED_POEO)
+#define RBMAP_GPIO_LED_USER    RBSPI_SSR_GPIO(RBMAP_SSR_BIT_LED_USER)
+#define RBMAP_GPIO_LED_WLAN    RBSPI_SSR_GPIO(RBMAP_SSR_BIT_LED_WLAN)
+#define RBMAP_GPIO_LED_APCAP   RBSPI_SSR_GPIO(RBMAP_SSR_BIT_LED_APCAP)
+
+static struct gpio_led rbmap_leds[] __initdata = {
+       {
+               .name = "rb:green:power",
+               .gpio = RBMAP_GPIO_LED_POWER,
+               .active_low = 1,
+               .default_state = LEDS_GPIO_DEFSTATE_ON,
+       }, {
+               .name = "rb:green:eth1",
+               .gpio = RBMAP_GPIO_LED_LAN1,
+               .active_low = 1,
+       }, {
+               .name = "rb:green:eth2",
+               .gpio = RBMAP_GPIO_LED_WLAN,
+               .active_low = 1,
+       }, {
+               .name = "rb:red:poe_out",
+               .gpio = RBMAP_GPIO_LED_POEO,
+               .active_low = 1,
+       }, {
+               .name = "rb:green:user",
+               .gpio = RBMAP_GPIO_LED_USER,
+               .active_low = 1,
+       }, {
+               .name = "rb:green:wlan",
+               .gpio = RBMAP_GPIO_LED_WLAN,
+               .active_low = 1,
+       }, {
+               .name = "rb:green:ap_cap",
+               .gpio = RBMAP_GPIO_LED_APCAP,
+               .active_low = 1,
+       },
+};
+
+
 static struct gen_74x164_chip_platform_data rbspi_ssr_data = {
        .base = RBSPI_SSR_GPIO_BASE,
 };
@@ -492,7 +598,79 @@ static void __init rb750upr2_setup(void)
        rbspi_952_750r2_setup(flags);
 }
 
+/*
+ * Init the wAP hardware (EXPERIMENTAL).
+ * The wAP 2nD has a single ethernet port.
+ */
+static void __init rbwap_setup(void)
+{
+       u32 flags = RBSPI_HAS_WLAN;
+
+       if (rbspi_platform_setup())
+               return;
+
+       rbspi_peripherals_setup(flags);
+
+       /* GMAC1 is HW MAC, WLAN MAC is HW MAC + 1 */
+       rbspi_network_setup(flags, 0, 1);
+
+       ath79_register_leds_gpio(-1, ARRAY_SIZE(rbwap_leds), rbwap_leds);
+}
+
+/*
+ * Init the cAP hardware (EXPERIMENTAL).
+ * The cAP 2nD has a single ethernet port, and a global LED switch.
+ */
+static void __init rbcap_setup(void)
+{
+       u32 flags = RBSPI_HAS_WLAN;
+
+       if (rbspi_platform_setup())
+               return;
+
+       rbspi_peripherals_setup(flags);
+
+       /* GMAC1 is HW MAC, WLAN MAC is HW MAC + 1 */
+       rbspi_network_setup(flags, 0, 1);
+
+       gpio_request_one(RBCAP_GPIO_LED_ALL,
+                        GPIOF_OUT_INIT_HIGH | GPIOF_EXPORT_DIR_FIXED,
+                        "LEDs enable");
+
+       ath79_register_leds_gpio(-1, ARRAY_SIZE(rbcap_leds), rbcap_leds);
+}
+
+/*
+ * Init the mAP hardware (EXPERIMENTAL).
+ * The mAP 2nD has two ethernet ports, PoE output and an SSR for LED
+ * multiplexing.
+ */
+static void __init rbmap_setup(void)
+{
+       u32 flags = RBSPI_HAS_WLAN | RBSPI_HAS_SSR | RBSPI_HAS_POE;
+
+       if (rbspi_platform_setup())
+               return;
+
+       rbspi_spi_cs_gpios[1] = RBMAP_GPIO_SSR_CS;
+       rbspi_peripherals_setup(flags);
+
+       /* GMAC1 is HW MAC, WLAN MAC is HW MAC + 2 */
+       rbspi_network_setup(flags, 0, 2);
+
+       if (flags & RBSPI_HAS_POE)
+               gpio_request_one(RBMAP_GPIO_POE_POWER,
+                               GPIOF_OUT_INIT_HIGH | GPIOF_EXPORT_DIR_FIXED,
+                               "POE power");
+
+       ath79_register_leds_gpio(-1, ARRAY_SIZE(rbmap_leds), rbmap_leds);
+}
+
+
 MIPS_MACHINE_NONAME(ATH79_MACH_RB_MAPL, "map-hb", rbmapl_setup);
 MIPS_MACHINE_NONAME(ATH79_MACH_RB_941, "H951L", rbhapl_setup);
 MIPS_MACHINE_NONAME(ATH79_MACH_RB_952, "952-hb", rb952_setup);
 MIPS_MACHINE_NONAME(ATH79_MACH_RB_750UPR2, "750-hb", rb750upr2_setup);
+MIPS_MACHINE_NONAME(ATH79_MACH_RB_WAP, "wap-hb", rbwap_setup);
+MIPS_MACHINE_NONAME(ATH79_MACH_RB_CAP, "cap-hb", rbcap_setup);
+MIPS_MACHINE_NONAME(ATH79_MACH_RB_MAP, "map2-hb", rbmap_setup);
index a8fc07a1c3effc7b686af0e6fd5d1d4dd134e042..69c848ef3d73faf032a599ed2299e9f115f5326a 100644 (file)
@@ -175,7 +175,10 @@ enum ath79_mach_type {
        ATH79_MACH_RB_951G,                     /* Mikrotik RouterBOARD 951G */
        ATH79_MACH_RB_951U,                     /* Mikrotik RouterBOARD 951Ui-2HnD */
        ATH79_MACH_RB_952,                      /* MikroTik RouterBOARD 951Ui-2nD */
+       ATH79_MACH_RB_CAP,                      /* Mikrotik RouterBOARD cAP2nD */
+       ATH79_MACH_RB_MAP,                      /* Mikrotik RouterBOARD mAP2nD */
        ATH79_MACH_RB_MAPL,                     /* Mikrotik RouterBOARD mAP L-2nD */
+       ATH79_MACH_RB_WAP,                      /* Mikrotik RouterBOARD wAP2nD */
        ATH79_MACH_RB_SXTLITE2ND,               /* Mikrotik RouterBOARD SXT Lite 2nD */
        ATH79_MACH_RB_SXTLITE5ND,               /* Mikrotik RouterBOARD SXT Lite 5nD */
        ATH79_MACH_RE450,                       /* TP-LINK RE450 */