• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
3  *
4  * HDF is dual licensed: you can use it either under the terms of
5  * the GPL, or the BSD license, at your option.
6  * See the LICENSE file in the root of this repository for complete details.
7  */
8 #include "gpio_if.h"
9 #include "osal_mem.h"
10 #include "hdf_log.h"
11 #include "wifi_module.h"
12 #include "hdf_wlan_chipdriver_manager.h"
13 #include "securec.h"
14 
15 #define HDF_LOG_TAG HDF_WIFI_CORE
16 
17 /* power manager begin */
18 enum PowerType {
19     POWER_NOT_MANAGED = 0,
20     POWER_MANAGED_BY_GPIO = 1
21 };
22 
23 enum GPIOActiveLevel {
24     ACTIVE_LOW = 0,
25     ACTIVE_HIGH
26 };
27 
28 /* powerCount=1 single power source */
29 struct DevicePowerData {
30     struct HdfConfigWlanPower power0;
31     struct HdfConfigWlanPower power1;
32 };
33 
34 struct PowerManagerImpl {
35     struct PowerManager base;
36     struct DevicePowerData powerDatas;
37 };
38 
39 /* power on method */
HdfWlanSinglePowerActive(struct HdfConfigWlanPower * powerDate)40 static int32_t HdfWlanSinglePowerActive(struct HdfConfigWlanPower* powerDate)
41 {
42     int32_t ret;
43     if (powerDate == NULL) {
44         HDF_LOGE("%s:powerDate is NULL", __func__);
45         return HDF_FAILURE;
46     }
47     if (powerDate->powerType == POWER_NOT_MANAGED) {
48         HDF_LOGI("%s:power type is always on", __func__);
49         return HDF_SUCCESS;
50     }
51     ret = GpioSetDir(powerDate->gpioId, 1);
52     if (ret != HDF_SUCCESS) {
53         HDF_LOGE("%s:set dir fail! ret=%d\n", __func__, ret);
54         return HDF_FAILURE;
55     }
56     OsalMSleep(powerDate->powerSeqDelay);
57     ret = GpioWrite(powerDate->gpioId, powerDate->activeLevel);
58     if (ret != HDF_SUCCESS) {
59         HDF_LOGE("%s:set power on fail! ret=%d\n", __func__, ret);
60         return HDF_FAILURE;
61     }
62     return HDF_SUCCESS;
63 }
HdfWlanSingleDeActive(struct HdfConfigWlanPower * powerDate)64 static int32_t HdfWlanSingleDeActive(struct HdfConfigWlanPower* powerDate)
65 {
66     int32_t ret;
67     uint8_t deActive;
68 
69     if (powerDate == NULL) {
70         HDF_LOGE("%s: powerDate is NULL", __func__);
71         return HDF_FAILURE;
72     }
73     deActive = !powerDate->activeLevel;
74     if (powerDate->powerType == POWER_NOT_MANAGED) {
75         HDF_LOGE("%s:power type is not supported in current version", __func__);
76         return HDF_FAILURE;
77     }
78     ret = GpioSetDir(powerDate->gpioId, 1);
79     if (ret != HDF_SUCCESS) {
80         HDF_LOGE("%s:set dir fail! ret:%d\n", __func__, ret);
81         return ret;
82     }
83     ret = GpioWrite(powerDate->gpioId, deActive);
84     return HDF_SUCCESS;
85 }
86 
HdfWlanChipPowerOn(struct PowerManager * powerMgr)87 static int32_t HdfWlanChipPowerOn(struct PowerManager* powerMgr)
88 {
89     int32_t ret;
90     struct PowerManagerImpl *powerMgrimpl = NULL;
91     if (powerMgr == NULL) {
92         HDF_LOGE("%s: powerMgr is NULL", __func__);
93         return HDF_FAILURE;
94     }
95     powerMgrimpl = (struct PowerManagerImpl*)powerMgr;
96     ret = HdfWlanSinglePowerActive(&powerMgrimpl->powerDatas.power0);
97     if (ret != HDF_SUCCESS) {
98         HDF_LOGE("%s: HdfWlanMainPowerOn fail! ret:%d\n", __func__, ret);
99         (void)HdfWlanSingleDeActive(&powerMgrimpl->powerDatas.power0);
100         return HDF_FAILURE;
101     }
102     ret = HdfWlanSinglePowerActive((struct HdfConfigWlanPower*)&powerMgrimpl->powerDatas.power1);
103     if (ret != HDF_SUCCESS) {
104         HDF_LOGE("%s: HdfWlanPowerActive fail! ret:%d\n", __func__, ret);
105         return HDF_FAILURE;
106     }
107     return HDF_SUCCESS;
108 }
HdfWlanChipPowerOff(struct PowerManager * powerMgr)109 static int32_t HdfWlanChipPowerOff(struct PowerManager* powerMgr)
110 {
111     int32_t ret;
112     struct PowerManagerImpl *powerMgrimpl = NULL;
113     if (powerMgr == NULL) {
114         HDF_LOGE("%s: powerMgr is NULL", __func__);
115         return HDF_FAILURE;
116     }
117     powerMgrimpl = (struct PowerManagerImpl*)powerMgr;
118     ret = HdfWlanSingleDeActive(&powerMgrimpl->powerDatas.power0);
119     if (ret != HDF_SUCCESS) {
120         HDF_LOGE("%s: the main power off fail", __func__);
121         return HDF_FAILURE;
122     }
123     ret = HdfWlanSingleDeActive((struct HdfConfigWlanPower*)&powerMgrimpl->powerDatas.power1);
124     if (ret != HDF_SUCCESS) {
125         HDF_LOGE("%s: the standby power off fail", __func__);
126         return ret;
127     }
128     return HDF_SUCCESS;
129 }
130 
HdfWlanPowerMgrRelease(struct PowerManager * powerMgr)131 int32_t HdfWlanPowerMgrRelease(struct PowerManager* powerMgr)
132 {
133     if (powerMgr == NULL) {
134         HDF_LOGW("%s: powerMgr already deinit or input para error ", __func__);
135         return HDF_SUCCESS;
136     }
137     OsalMemFree(powerMgr);
138     return HDF_SUCCESS;
139 }
140 /**
141  * @brief create powers manager according to the powers config
142  */
HdfWlanCreatePowerManager(const struct HdfConfWlanPowers * configPowers)143 struct PowerManager* HdfWlanCreatePowerManager(const struct HdfConfWlanPowers *configPowers)
144 {
145     struct PowerManagerImpl *powerMgrimpl = NULL;
146     if (configPowers == NULL) {
147         HDF_LOGE("%s: configPowers is NULL", __func__);
148         return NULL;
149     }
150     powerMgrimpl = (struct PowerManagerImpl *)OsalMemCalloc(sizeof(struct PowerManagerImpl));
151     if (powerMgrimpl == NULL) {
152         HDF_LOGE("%s: OsalMemCalloc fail! ", __func__);
153         return NULL;
154     }
155     powerMgrimpl->base.On = HdfWlanChipPowerOn;
156     powerMgrimpl->base.Off = HdfWlanChipPowerOff;
157     powerMgrimpl->base.Release = HdfWlanPowerMgrRelease;
158     powerMgrimpl->powerDatas.power0 = configPowers->power0;
159     powerMgrimpl->powerDatas.power1 = configPowers->power1;
160     return (struct PowerManager *)powerMgrimpl;
161 }