#include "dev-ar9xxx-wmac.h"
+#define MHZ_25 (25 * 1000 * 1000)
+
static struct ath9k_platform_data ar9xxx_wmac_data = {
.led_pin = -1,
};
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)
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: