hc
2024-05-08 f309769f8af08599af39b6de4f675784ce76530d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/******************************************************************************
 *
 * Copyright(c) 2017 - 2018 Realtek Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 *****************************************************************************/
#include <linux/delay.h>        /* mdelay() */
#include <mach/hardware.h>        /* __io_address(), readl(), writel() */
#include "platform_hisilicon_hi3798_sdio.h"    /* HI_S32() and etc. */
 
typedef enum hi_GPIO_DIR_E {
   HI_DIR_OUT = 0,
   HI_DIR_IN  = 1,
} HI_GPIO_DIR_E;
 
#define RTL_REG_ON_GPIO        (4*8 + 3)
 
#define REG_BASE_CTRL        __io_address(0xf8a20008)
 
int gpio_wlan_reg_on = RTL_REG_ON_GPIO;
#if 0
module_param(gpio_wlan_reg_on, uint, 0644);
MODULE_PARM_DESC(gpio_wlan_reg_on, "wlan reg_on gpio num (default:gpio4_3)");
#endif
 
static int hi_gpio_set_value(u32 gpio, u32 value)
{
   HI_S32 s32Status;
 
   s32Status = HI_DRV_GPIO_SetDirBit(gpio, HI_DIR_OUT);
   if (s32Status != HI_SUCCESS) {
       pr_err("gpio(%d) HI_DRV_GPIO_SetDirBit HI_DIR_OUT failed\n",
           gpio);
       return -1;
   }
 
   s32Status = HI_DRV_GPIO_WriteBit(gpio, value);
   if (s32Status != HI_SUCCESS) {
       pr_err("gpio(%d) HI_DRV_GPIO_WriteBit value(%d) failed\n",
           gpio, value);
       return -1;
   }
 
   return 0;
}
 
static int hisi_wlan_set_carddetect(bool present)
{
   u32 regval;
   u32 mask;
 
 
#ifndef CONFIG_HISI_SDIO_ID
   return;
#endif
   pr_info("SDIO ID=%d\n", CONFIG_HISI_SDIO_ID);
#if (CONFIG_HISI_SDIO_ID == 1)
   mask = 1;
#elif (CONFIG_HISI_SDIO_ID == 0)
   mask = 2;
#endif
 
   regval = readl(REG_BASE_CTRL);
   if (present) {
       pr_info("====== Card detection to detect SDIO card! ======\n");
       /* set card_detect low to detect card */
       regval |= mask;
   } else {
       pr_info("====== Card detection to remove SDIO card! ======\n");
       /* set card_detect high to remove card */
       regval &= ~(mask);
   }
   writel(regval, REG_BASE_CTRL);
 
   return 0;
}
 
/*
 * Return:
 *    0:    power on successfully
 *    others: power on failed
 */
int platform_wifi_power_on(void)
{
   int ret = 0;
 
 
   hi_gpio_set_value(gpio_wlan_reg_on, 1);
   mdelay(100);
   hisi_wlan_set_carddetect(1);
   mdelay(2000);
   pr_info("======== set_carddetect delay 2s! ========\n");
 
   return ret;
}
 
void platform_wifi_power_off(void)
{
   hisi_wlan_set_carddetect(0);
   mdelay(100);
   hi_gpio_set_value(gpio_wlan_reg_on, 0);
}