ar71xx: build ALFA AP96 images with default profile as well
[oweals/openwrt.git] / target / linux / ar71xx / files / arch / mips / ar71xx / dev-ar9xxx-wmac.c
index 5bac35bdefe7c43c9382074578743c1bf6409438..90db388967b729af90ebdace10c18417a8162adb 100644 (file)
@@ -23,6 +23,8 @@
 
 #include "dev-ar9xxx-wmac.h"
 
+#define MHZ_25 (25 * 1000 * 1000)
+
 static struct ath9k_platform_data ar9xxx_wmac_data = {
        .led_pin = -1,
 };
@@ -61,11 +63,61 @@ static void ar913x_wmac_init(void)
        ar9xxx_wmac_resources[0].end = AR91XX_WMAC_BASE + AR91XX_WMAC_SIZE - 1;
 }
 
+static int ar933x_r1_get_wmac_revision(void)
+{
+       return ar71xx_soc_rev;
+}
+
+static int ar933x_wmac_reset(void)
+{
+       unsigned retries = 0;
+
+       ar71xx_device_stop(AR933X_RESET_WMAC);
+       ar71xx_device_start(AR933X_RESET_WMAC);
+
+       while (1) {
+               u32 bootstrap;
+
+               bootstrap = ar71xx_reset_rr(AR933X_RESET_REG_BOOTSTRAP);
+               if ((bootstrap & AR933X_BOOTSTRAP_EEPBUSY) == 0)
+                       return 0;
+
+               if (retries > 20)
+                       break;
+
+               udelay(10000);
+               retries++;
+       }
+
+       pr_err("ar93xx: WMAC reset timed out");
+       return -ETIMEDOUT;
+}
+
+static void ar933x_wmac_init(void)
+{
+       ar9xxx_wmac_device.name = "ar933x_wmac";
+       ar9xxx_wmac_resources[0].start = AR933X_WMAC_BASE;
+       ar9xxx_wmac_resources[0].end = AR933X_WMAC_BASE + AR933X_WMAC_SIZE - 1;
+       if (ar71xx_ref_freq == MHZ_25)
+               ar9xxx_wmac_data.is_clk_25mhz = true;
+
+       if (ar71xx_soc_rev == 1)
+               ar9xxx_wmac_data.get_mac_revision = ar933x_r1_get_wmac_revision;
+
+       ar9xxx_wmac_data.external_reset = ar933x_wmac_reset;
+
+       ar933x_wmac_reset();
+}
+
 static void ar934x_wmac_init(void)
 {
        ar9xxx_wmac_device.name = "ar934x_wmac";
        ar9xxx_wmac_resources[0].start = AR934X_WMAC_BASE;
        ar9xxx_wmac_resources[0].end = AR934X_WMAC_BASE + AR934X_WMAC_SIZE - 1;
+       ar9xxx_wmac_resources[1].start = AR934X_IP2_IRQ_WMAC;
+       ar9xxx_wmac_resources[1].start = AR934X_IP2_IRQ_WMAC;
+       if (ar71xx_ref_freq == MHZ_25)
+               ar9xxx_wmac_data.is_clk_25mhz = true;
 }
 
 void __init ar9xxx_add_device_wmac(u8 *cal_data, u8 *mac_addr)
@@ -76,6 +128,11 @@ void __init ar9xxx_add_device_wmac(u8 *cal_data, u8 *mac_addr)
                ar913x_wmac_init();
                break;
 
+       case AR71XX_SOC_AR9330:
+       case AR71XX_SOC_AR9331:
+               ar933x_wmac_init();
+               break;
+
        case AR71XX_SOC_AR9341:
        case AR71XX_SOC_AR9342:
        case AR71XX_SOC_AR9344: