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 }