2 * Atheros AR913X/AR933X SoC built-in WMAC device support
4 * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
5 * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License version 2 as published
9 * by the Free Software Foundation.
12 #include <linux/init.h>
13 #include <linux/delay.h>
14 #include <linux/irq.h>
15 #include <linux/platform_device.h>
16 #include <linux/ath9k_platform.h>
18 #include <asm/mach-ath79/ath79.h>
19 #include <asm/mach-ath79/ar71xx_regs.h>
22 static struct ath9k_platform_data ath79_wmac_data
;
24 static struct resource ath79_wmac_resources
[] = {
26 /* .start and .end fields are filled dynamically */
27 .flags
= IORESOURCE_MEM
,
29 .start
= ATH79_CPU_IRQ_IP2
,
30 .end
= ATH79_CPU_IRQ_IP2
,
31 .flags
= IORESOURCE_IRQ
,
35 static struct platform_device ath79_wmac_device
= {
38 .resource
= ath79_wmac_resources
,
39 .num_resources
= ARRAY_SIZE(ath79_wmac_resources
),
41 .platform_data
= &ath79_wmac_data
,
45 static void __init
ar913x_wmac_setup(void)
48 ath79_device_reset_set(AR913X_RESET_AMBA2WMAC
);
51 ath79_device_reset_clear(AR913X_RESET_AMBA2WMAC
);
54 ath79_wmac_resources
[0].start
= AR913X_WMAC_BASE
;
55 ath79_wmac_resources
[0].end
= AR913X_WMAC_BASE
+ AR913X_WMAC_SIZE
- 1;
59 static int ar933x_wmac_reset(void)
61 ath79_device_reset_set(AR933X_RESET_WMAC
);
62 ath79_device_reset_clear(AR933X_RESET_WMAC
);
67 static int ar933x_r1_get_wmac_revision(void)
72 static void __init
ar933x_wmac_setup(void)
78 ath79_wmac_device
.name
= "ar933x_wmac";
80 ath79_wmac_resources
[0].start
= AR933X_WMAC_BASE
;
81 ath79_wmac_resources
[0].end
= AR933X_WMAC_BASE
+ AR933X_WMAC_SIZE
- 1;
83 t
= ath79_reset_rr(AR933X_RESET_REG_BOOTSTRAP
);
84 if (t
& AR933X_BOOTSTRAP_REF_CLK_40
)
85 ath79_wmac_data
.is_clk_25mhz
= false;
87 ath79_wmac_data
.is_clk_25mhz
= true;
89 if (ath79_soc_rev
== 1)
90 ath79_wmac_data
.get_mac_revision
= ar933x_r1_get_wmac_revision
;
92 ath79_wmac_data
.external_reset
= ar933x_wmac_reset
;
95 void __init
ath79_register_wmac(u8
*cal_data
)
99 else if (soc_is_ar933x())
105 memcpy(ath79_wmac_data
.eeprom_data
, cal_data
,
106 sizeof(ath79_wmac_data
.eeprom_data
));
108 platform_device_register(&ath79_wmac_device
);