1/* 2 * Ubiquiti UniFi AC (LITE) board support 3 * 4 * Copyright (C) 2015-2016 P. Wassi <p.wassi at gmx.at> 5 * 6 * Derived from: mach-ubnt-xm.c 7 * 8 * This program is free software; you can redistribute it and/or modify it 9 * under the terms of the GNU General Public License version 2 as published 10 * by the Free Software Foundation. 11 */ 12 13#include <linux/init.h> 14#include <linux/pci.h> 15#include <linux/platform_device.h> 16#include <linux/ath9k_platform.h> 17#include <linux/etherdevice.h> 18 19#include <asm/mach-ath79/ath79.h> 20#include <asm/mach-ath79/irq.h> 21#include <asm/mach-ath79/ar71xx_regs.h> 22 23#include <linux/platform_data/phy-at803x.h> 24#include <linux/ar8216_platform.h> 25 26#include "common.h" 27#include "dev-ap9x-pci.h" 28#include "dev-eth.h" 29#include "dev-gpio-buttons.h" 30#include "dev-leds-gpio.h" 31#include "dev-m25p80.h" 32#include "dev-wmac.h" 33#include "dev-usb.h" 34#include "machtypes.h" 35 36 37#define UNIFIAC_KEYS_POLL_INTERVAL 20 38#define UNIFIAC_KEYS_DEBOUNCE_INTERVAL (3 * UNIFIAC_KEYS_POLL_INTERVAL) 39 40#define UNIFIAC_GPIO_LED_WHITE 7 41#define UNIFIAC_GPIO_LED_BLUE 8 42 43#define UNIFIAC_GPIO_BTN_RESET 2 44 45#define UNIFIAC_MAC0_OFFSET 0x0000 46#define UNIFIAC_WMAC_CALDATA_OFFSET 0x1000 47#define UNIFIAC_PCI_CALDATA_OFFSET 0x5000 48 49 50static struct flash_platform_data ubnt_unifiac_flash_data = { 51 /* mx25l12805d and mx25l12835f have the same JEDEC ID */ 52 .type = "mx25l12805d", 53}; 54 55static struct gpio_led ubnt_unifiac_leds_gpio[] __initdata = { 56 { 57 .name = "ubnt:white:dome", 58 .gpio = UNIFIAC_GPIO_LED_WHITE, 59 .active_low = 0, 60 }, { 61 .name = "ubnt:blue:dome", 62 .gpio = UNIFIAC_GPIO_LED_BLUE, 63 .active_low = 0, 64 } 65}; 66 67static struct gpio_keys_button ubnt_unifiac_gpio_keys[] __initdata = { 68 { 69 .desc = "reset", 70 .type = EV_KEY, 71 .code = KEY_RESTART, 72 .debounce_interval = UNIFIAC_KEYS_DEBOUNCE_INTERVAL, 73 .gpio = UNIFIAC_GPIO_BTN_RESET, 74 .active_low = 1, 75 } 76}; 77 78static void __init ubnt_unifiac_lite_setup(void) 79{ 80 u8 *eeprom = (u8 *) KSEG1ADDR(0x1fff0000); 81 82 ath79_register_m25p80(&ubnt_unifiac_flash_data); 83 84 85 ath79_init_mac(ath79_eth0_data.mac_addr, 86 eeprom + UNIFIAC_MAC0_OFFSET, 0); 87 88 ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_SGMII; 89 ath79_eth0_data.mii_bus_dev = &ath79_mdio0_device.dev; 90 ath79_eth0_data.phy_mask = BIT(4); 91 ath79_eth0_pll_data.pll_10 = 0x00001313; 92 93 ath79_register_mdio(0, ~BIT(4)); 94 ath79_register_eth(0); 95 96 97 ath79_register_wmac(eeprom + UNIFIAC_WMAC_CALDATA_OFFSET, NULL); 98 99 100 ap91_pci_init(eeprom + UNIFIAC_PCI_CALDATA_OFFSET, NULL); 101 102 103 ath79_register_leds_gpio(-1, ARRAY_SIZE(ubnt_unifiac_leds_gpio), 104 ubnt_unifiac_leds_gpio); 105 106 ath79_register_gpio_keys_polled(-1, UNIFIAC_KEYS_POLL_INTERVAL, 107 ARRAY_SIZE(ubnt_unifiac_gpio_keys), 108 ubnt_unifiac_gpio_keys); 109} 110 111MIPS_MACHINE(ATH79_MACH_UBNT_UNIFIAC_LITE, "UBNT-UF-AC-LITE", "Ubiquiti UniFi-AC-LITE", 112 ubnt_unifiac_lite_setup); 113 114static struct ar8327_pad_cfg ubnt_unifiac_pro_ar8327_pad0_cfg = { 115 .mode = AR8327_PAD_MAC_SGMII, 116 .sgmii_delay_en = true, 117}; 118 119static struct ar8327_platform_data ubnt_unifiac_pro_ar8327_data = { 120 .pad0_cfg = &ubnt_unifiac_pro_ar8327_pad0_cfg, 121 .port0_cfg = { 122 .force_link = 1, 123 .speed = AR8327_PORT_SPEED_1000, 124 .duplex = 1, 125 .txpause = 1, 126 .rxpause = 1, 127 }, 128}; 129 130 131static struct mdio_board_info ubnt_unifiac_pro_mdio0_info[] = { 132 { 133 .bus_id = "ag71xx-mdio.0", 134 .phy_addr = 0, 135 .platform_data = &ubnt_unifiac_pro_ar8327_data, 136 }, 137}; 138 139static void __init ubnt_unifiac_pro_setup(void) 140{ 141 u8 *eeprom = (u8 *) KSEG1ADDR(0x1fff0000); 142 143 ath79_register_m25p80(&ubnt_unifiac_flash_data); 144 145 146 ath79_init_mac(ath79_eth0_data.mac_addr, 147 eeprom + UNIFIAC_MAC0_OFFSET, 0); 148 149 ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_SGMII; 150 ath79_eth0_data.mii_bus_dev = &ath79_mdio0_device.dev; 151 ath79_eth0_data.phy_mask = BIT(0); 152 153 mdiobus_register_board_info(ubnt_unifiac_pro_mdio0_info, 154 ARRAY_SIZE(ubnt_unifiac_pro_mdio0_info)); 155 156 ath79_register_mdio(0, 0x00); 157 ath79_register_eth(0); 158 159 160 ath79_register_usb(); 161 162 163 ath79_register_wmac(eeprom + UNIFIAC_WMAC_CALDATA_OFFSET, NULL); 164 165 166 ap91_pci_init(eeprom + UNIFIAC_PCI_CALDATA_OFFSET, NULL); 167 168 169 ath79_register_leds_gpio(-1, ARRAY_SIZE(ubnt_unifiac_leds_gpio), 170 ubnt_unifiac_leds_gpio); 171 172 ath79_register_gpio_keys_polled(-1, UNIFIAC_KEYS_POLL_INTERVAL, 173 ARRAY_SIZE(ubnt_unifiac_gpio_keys), 174 ubnt_unifiac_gpio_keys); 175} 176 177 178MIPS_MACHINE(ATH79_MACH_UBNT_UNIFIAC_PRO, "UBNT-UF-AC-PRO", "Ubiquiti UniFi-AC-PRO", 179 ubnt_unifiac_pro_setup); 180