1 /*
2 * Copyright (c) 2020-2022 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 HDF_LOGD("%s: HdfWlanSinglePowerActive successful!", __func__);
63 return HDF_SUCCESS;
64 }
HdfWlanSingleDeActive(struct HdfConfigWlanPower * powerDate)65 static int32_t HdfWlanSingleDeActive(struct HdfConfigWlanPower* powerDate)
66 {
67 int32_t ret;
68 uint8_t deActive;
69
70 if (powerDate == NULL) {
71 HDF_LOGE("%s: powerDate is NULL", __func__);
72 return HDF_FAILURE;
73 }
74 deActive = !powerDate->activeLevel;
75 if (powerDate->powerType == POWER_NOT_MANAGED) {
76 HDF_LOGE("%s:power type is not supported in current version", __func__);
77 return HDF_FAILURE;
78 }
79 ret = GpioSetDir(powerDate->gpioId, 1);
80 if (ret != HDF_SUCCESS) {
81 HDF_LOGE("%s:set dir fail! ret:%d\n", __func__, ret);
82 return ret;
83 }
84 ret = GpioWrite(powerDate->gpioId, deActive);
85 HDF_LOGD("%s: HdfWlanSingleDeActive successful! ret=%d", __func__, ret);
86 return HDF_SUCCESS;
87 }
88
HdfWlanChipPowerOn(struct PowerManager * powerMgr)89 static int32_t HdfWlanChipPowerOn(struct PowerManager* powerMgr)
90 {
91 int32_t ret;
92 struct PowerManagerImpl *powerMgrimpl = NULL;
93 if (powerMgr == NULL) {
94 HDF_LOGE("%s: powerMgr is NULL", __func__);
95 return HDF_FAILURE;
96 }
97 powerMgrimpl = (struct PowerManagerImpl*)powerMgr;
98 ret = HdfWlanSinglePowerActive(&powerMgrimpl->powerDatas.power0);
99 if (ret != HDF_SUCCESS) {
100 HDF_LOGE("%s: HdfWlanMainPowerOn fail! ret:%d\n", __func__, ret);
101 return HDF_FAILURE;
102 }
103 ret = HdfWlanSinglePowerActive(&powerMgrimpl->powerDatas.power1);
104 if (ret != HDF_SUCCESS) {
105 HDF_LOGE("%s: HdfWlanPowerActive fail! ret:%d\n", __func__, ret);
106 (void)HdfWlanSingleDeActive(&powerMgrimpl->powerDatas.power0);
107 return HDF_FAILURE;
108 }
109 HDF_LOGI("%s: HdfWlanChipPowerOn successful!", __func__);
110 return HDF_SUCCESS;
111 }
112
HdfWlanChipPowerOff(struct PowerManager * powerMgr)113 static int32_t HdfWlanChipPowerOff(struct PowerManager* powerMgr)
114 {
115 int32_t ret;
116 struct PowerManagerImpl *powerMgrimpl = NULL;
117 if (powerMgr == NULL) {
118 HDF_LOGE("%s: powerMgr is NULL", __func__);
119 return HDF_FAILURE;
120 }
121 powerMgrimpl = (struct PowerManagerImpl*)powerMgr;
122 ret = HdfWlanSingleDeActive(&powerMgrimpl->powerDatas.power0);
123 if (ret != HDF_SUCCESS) {
124 HDF_LOGE("%s: the main power off fail", __func__);
125 return HDF_FAILURE;
126 }
127 ret = HdfWlanSingleDeActive(&powerMgrimpl->powerDatas.power1);
128 if (ret != HDF_SUCCESS) {
129 HDF_LOGE("%s: the standby power off fail", __func__);
130 return ret;
131 }
132 HDF_LOGI("%s: HdfWlanChipPowerOff successful!", __func__);
133 return HDF_SUCCESS;
134 }
135
HdfWlanPowerMgrRelease(struct PowerManager * powerMgr)136 static int32_t HdfWlanPowerMgrRelease(struct PowerManager* powerMgr)
137 {
138 if (powerMgr == NULL) {
139 HDF_LOGW("%s: powerMgr already deinit or input para error ", __func__);
140 return HDF_SUCCESS;
141 }
142 OsalMemFree(powerMgr);
143 return HDF_SUCCESS;
144 }
145 /**
146 * @brief create powers manager according to the powers config
147 */
HdfWlanCreatePowerManager(const struct HdfConfWlanPowers * configPowers)148 struct PowerManager* HdfWlanCreatePowerManager(const struct HdfConfWlanPowers *configPowers)
149 {
150 struct PowerManagerImpl *powerMgrimpl = NULL;
151 if (configPowers == NULL) {
152 HDF_LOGE("%s: configPowers is NULL", __func__);
153 return NULL;
154 }
155 powerMgrimpl = (struct PowerManagerImpl *)OsalMemCalloc(sizeof(struct PowerManagerImpl));
156 if (powerMgrimpl == NULL) {
157 HDF_LOGE("%s: OsalMemCalloc fail! ", __func__);
158 return NULL;
159 }
160 powerMgrimpl->base.On = HdfWlanChipPowerOn;
161 powerMgrimpl->base.Off = HdfWlanChipPowerOff;
162 powerMgrimpl->base.Release = HdfWlanPowerMgrRelease;
163 powerMgrimpl->powerDatas.power0 = configPowers->power0;
164 powerMgrimpl->powerDatas.power1 = configPowers->power1;
165 HDF_LOGD("%s: HdfWlanCreatePowerManager finished!", __func__);
166 return (struct PowerManager *)powerMgrimpl;
167 }