* Copyright (c) 2021 Huawei Device Co., Ltd.
*
* HDF is dual licensed: you can use it either under the terms of
* the GPL, or the BSD license, at your option.
* See the LICENSE file in the root of this repository for complete details.
*/
#include "hdf_reset.h"
#include "gpio_if.h"
#include "hdf_base.h"
struct GpioBasedReset {
struct HdfReset base;
uint8_t resetHoldTime;
uint16_t gpioId;
uint8_t activeLevel;
};
int32_t ResetNoManagableReset(struct HdfReset *reset) {
(void)reset;
return HDF_FAILURE;
}
void ReleaseNoManagableReset(struct HdfReset *reset) {
if (reset != NULL) {
OsalMemFree(reset);
}
}
int32_t ResetGpioBasedReset(struct HdfReset *reset) {
int ret;
struct GpioBasedReset *gpioBasedReset = (struct GpioBasedReset *)reset;
if (reset == NULL) {
HDF_LOGE("%s:nullptr", __func__);
return HDF_FAILURE;
}
ret = GpioSetDir(gpioBasedReset->gpioId, GPIO_DIR_OUT);
if (ret != HDF_SUCCESS) {
HDF_LOGE("%s: set dir fail!", __func__);
return ret;
}
ret = GpioWrite(gpioBasedReset->gpioId, gpioBasedReset->activeLevel);
if (ret != HDF_SUCCESS) {
HDF_LOGE("%s: write active fail! ret=%d", __func__, ret);
return ret;
}
OsalMSleep(gpioBasedReset->resetHoldTime);
ret = GpioWrite(gpioBasedReset->gpioId, !gpioBasedReset->activeLevel);
if (ret != HDF_SUCCESS) {
HDF_LOGE("%s: write deactivate fail! ret=%d", __func__, ret);
return ret;
}
return ret;
}
void ReleaseGpioBasedReset(struct HdfReset *reset) {
if (reset != NULL) {
OsalMemFree(reset);
}
}
struct HdfReset *CreateVirtualReset(const struct HdfResetConfig *resetConfig) {
struct HdfReset *result = NULL;
if (resetConfig == NULL) {
HDF_LOGE("%s:nullptr", __func__);
return NULL;
}
if (resetConfig->resetType == RESET_TYPE_NOT_MANAGEABLE) {
const static struct HdfResetOps noManagableResetOps = {.Reset = ResetNoManagableReset,
.Release = ReleaseNoManagableReset};
result = (struct HdfReset *)OsalMemCalloc(sizeof(struct HdfReset));
result->ops = &noManagableResetOps;
} else if (resetConfig->resetType == RESET_TYPE_GPIO) {
const static struct HdfResetOps gpioBasedResetOps = {.Reset = ResetGpioBasedReset,
.Release = ReleaseGpioBasedReset};
struct GpioBasedReset *reset = (struct GpioBasedReset *)OsalMemCalloc(sizeof(struct GpioBasedReset));
reset->resetHoldTime = resetConfig->resetHoldTime;
reset->gpioId = resetConfig->gpio.gpioId;
reset->activeLevel = resetConfig->gpio.activeLevel;
reset->base.ops = &gpioBasedResetOps;
result = (struct HdfReset *)reset;
}
return result;
}