1*4882a593Smuzhiyun #ifdef CONFIG_DHD_PLAT_ROCKCHIP
2*4882a593Smuzhiyun #include <osl.h>
3*4882a593Smuzhiyun #include <dhd_linux.h>
4*4882a593Smuzhiyun #include <linux/gpio.h>
5*4882a593Smuzhiyun #include <linux/rfkill-wlan.h>
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun static int dhd_wlan_set_power(int on);
8*4882a593Smuzhiyun static int dhd_wlan_set_reset(int onoff);
9*4882a593Smuzhiyun static int dhd_wlan_set_carddetect(int present);
10*4882a593Smuzhiyun static int dhd_wlan_get_mac_addr(unsigned char *buf);
11*4882a593Smuzhiyun static void *dhd_wlan_get_country_code(char *ccode
12*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 58)) || defined(CUSTOM_COUNTRY_CODE)
13*4882a593Smuzhiyun , u32 flags
14*4882a593Smuzhiyun #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 58)) */
15*4882a593Smuzhiyun );
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun struct wifi_platform_data dhd_wlan_control = {
18*4882a593Smuzhiyun .set_power = dhd_wlan_set_power,
19*4882a593Smuzhiyun .set_reset = dhd_wlan_set_reset,
20*4882a593Smuzhiyun .set_carddetect = dhd_wlan_set_carddetect,
21*4882a593Smuzhiyun .get_mac_addr = dhd_wlan_get_mac_addr,
22*4882a593Smuzhiyun .get_country_code = dhd_wlan_get_country_code,
23*4882a593Smuzhiyun };
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun struct resource dhd_wlan_resources = {
26*4882a593Smuzhiyun .name = "bcmdhd_wlan_irq",
27*4882a593Smuzhiyun .start = 0,
28*4882a593Smuzhiyun .end = 0,
29*4882a593Smuzhiyun .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_SHAREABLE,
30*4882a593Smuzhiyun };
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun static struct cntry_locales_custom brcm_wlan_translate_custom_table[] = {
33*4882a593Smuzhiyun /* Table should be filled out based on custom platform regulatory requirement */
34*4882a593Smuzhiyun {"", "XT", 49}, /* Universal if Country code is unknown or empty */
35*4882a593Smuzhiyun {"US", "US", 0},
36*4882a593Smuzhiyun };
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun #ifdef CUSTOM_FORCE_NODFS_FLAG
39*4882a593Smuzhiyun struct cntry_locales_custom brcm_wlan_translate_nodfs_table[] = {
40*4882a593Smuzhiyun {"", "XT", 50}, /* Universal if Country code is unknown or empty */
41*4882a593Smuzhiyun {"US", "US", 0},
42*4882a593Smuzhiyun };
43*4882a593Smuzhiyun #endif /* CUSTOM_FORCE_NODFS_FLAG */
44*4882a593Smuzhiyun
dhd_wlan_set_power(int on)45*4882a593Smuzhiyun static int dhd_wlan_set_power(int on)
46*4882a593Smuzhiyun {
47*4882a593Smuzhiyun return rockchip_wifi_power(on);
48*4882a593Smuzhiyun }
49*4882a593Smuzhiyun
dhd_wlan_set_reset(int onoff)50*4882a593Smuzhiyun static int dhd_wlan_set_reset(int onoff)
51*4882a593Smuzhiyun {
52*4882a593Smuzhiyun return 0;
53*4882a593Smuzhiyun }
54*4882a593Smuzhiyun
dhd_wlan_set_carddetect(int present)55*4882a593Smuzhiyun static int dhd_wlan_set_carddetect(int present)
56*4882a593Smuzhiyun {
57*4882a593Smuzhiyun return rockchip_wifi_set_carddetect(present);
58*4882a593Smuzhiyun }
59*4882a593Smuzhiyun
dhd_wlan_get_mac_addr(unsigned char * buf)60*4882a593Smuzhiyun static int dhd_wlan_get_mac_addr(unsigned char *buf)
61*4882a593Smuzhiyun {
62*4882a593Smuzhiyun return rockchip_wifi_mac_addr(buf);
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun
dhd_wlan_get_country_code(char * ccode,u32 flags)65*4882a593Smuzhiyun static void *dhd_wlan_get_country_code(char *ccode
66*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 58)) || defined(CUSTOM_COUNTRY_CODE)
67*4882a593Smuzhiyun , u32 flags
68*4882a593Smuzhiyun #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 58)) */
69*4882a593Smuzhiyun )
70*4882a593Smuzhiyun {
71*4882a593Smuzhiyun struct cntry_locales_custom *locales;
72*4882a593Smuzhiyun int size;
73*4882a593Smuzhiyun int i;
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun if (!ccode)
76*4882a593Smuzhiyun return NULL;
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun #ifdef CUSTOM_FORCE_NODFS_FLAG
79*4882a593Smuzhiyun if (flags & WLAN_PLAT_NODFS_FLAG) {
80*4882a593Smuzhiyun locales = brcm_wlan_translate_nodfs_table;
81*4882a593Smuzhiyun size = ARRAY_SIZE(brcm_wlan_translate_nodfs_table);
82*4882a593Smuzhiyun } else {
83*4882a593Smuzhiyun #endif
84*4882a593Smuzhiyun locales = brcm_wlan_translate_custom_table;
85*4882a593Smuzhiyun size = ARRAY_SIZE(brcm_wlan_translate_custom_table);
86*4882a593Smuzhiyun #ifdef CUSTOM_FORCE_NODFS_FLAG
87*4882a593Smuzhiyun }
88*4882a593Smuzhiyun #endif
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun for (i = 0; i < size; i++)
91*4882a593Smuzhiyun if (strcmp(ccode, locales[i].iso_abbrev) == 0)
92*4882a593Smuzhiyun return &locales[i];
93*4882a593Smuzhiyun return NULL;
94*4882a593Smuzhiyun }
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun
dhd_wlan_init_plat_data(void)97*4882a593Smuzhiyun int dhd_wlan_init_plat_data(void)
98*4882a593Smuzhiyun {
99*4882a593Smuzhiyun uint irq;
100*4882a593Smuzhiyun int irq_flags = -1;
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun printf("%s, enter", __FUNCTION__);
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun irq = rockchip_wifi_get_oob_irq();
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun printf("%s, irq = %d", __FUNCTION__, irq);
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun dhd_wlan_resources.start = irq;
109*4882a593Smuzhiyun dhd_wlan_resources.end = irq;
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun irq_flags = rockchip_wifi_get_oob_irq_flag();
112*4882a593Smuzhiyun if (irq_flags == 1) {
113*4882a593Smuzhiyun dhd_wlan_resources.flags |= IORESOURCE_IRQ_HIGHLEVEL;
114*4882a593Smuzhiyun } else if (irq_flags == 0) {
115*4882a593Smuzhiyun dhd_wlan_resources.flags |= IORESOURCE_IRQ_LOWLEVEL;
116*4882a593Smuzhiyun } else {
117*4882a593Smuzhiyun pr_warn("%s: unknown oob irqflags !\n", __func__);
118*4882a593Smuzhiyun }
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun return 0;
121*4882a593Smuzhiyun }
122*4882a593Smuzhiyun
dhd_wlan_deinit_plat_data(void)123*4882a593Smuzhiyun int dhd_wlan_deinit_plat_data(void)
124*4882a593Smuzhiyun {
125*4882a593Smuzhiyun return 0;
126*4882a593Smuzhiyun }
127*4882a593Smuzhiyun #endif /* CONFIG_DHD_PLAT_ROCKCHIP */
128