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 }