xref: /OK3568_Linux_fs/external/rkwifibt/drivers/infineon/dhd_custom_rockchip.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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