/* * Copyright (c) 2022 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ #include #include #include "usbh_internal.h" #include LOG_MODULE_REGISTER(uhs_api, CONFIG_USBH_LOG_LEVEL); int usbh_init(struct usbh_contex *uhs_ctx) { int ret; k_mutex_lock(&uhs_ctx->mutex, K_FOREVER); if (!device_is_ready(uhs_ctx->dev)) { LOG_ERR("USB host controller is not ready"); ret = -ENODEV; goto init_exit; } if (uhc_is_initialized(uhs_ctx->dev)) { LOG_WRN("USB host controller is already initialized"); ret = -EALREADY; goto init_exit; } ret = usbh_init_device_intl(uhs_ctx); init_exit: k_mutex_unlock(&uhs_ctx->mutex); return ret; } int usbh_enable(struct usbh_contex *uhs_ctx) { int ret; k_mutex_lock(&uhs_ctx->mutex, K_FOREVER); if (!uhc_is_initialized(uhs_ctx->dev)) { LOG_WRN("USB host controller is not initialized"); ret = -EPERM; goto enable_exit; } if (uhc_is_enabled(uhs_ctx->dev)) { LOG_WRN("USB host controller is already enabled"); ret = -EALREADY; goto enable_exit; } ret = uhc_enable(uhs_ctx->dev); if (ret != 0) { LOG_ERR("Failed to enable controller"); goto enable_exit; } enable_exit: k_mutex_unlock(&uhs_ctx->mutex); return ret; } int usbh_disable(struct usbh_contex *uhs_ctx) { int ret; if (!uhc_is_enabled(uhs_ctx->dev)) { LOG_WRN("USB host controller is already disabled"); return 0; } k_mutex_lock(&uhs_ctx->mutex, K_FOREVER); ret = uhc_disable(uhs_ctx->dev); if (ret) { LOG_ERR("Failed to disable USB controller"); } k_mutex_unlock(&uhs_ctx->mutex); return 0; } int usbh_shutdown(struct usbh_contex *const uhs_ctx) { int ret; k_mutex_lock(&uhs_ctx->mutex, K_FOREVER); ret = uhc_shutdown(uhs_ctx->dev); if (ret) { LOG_ERR("Failed to shutdown USB device"); } k_mutex_unlock(&uhs_ctx->mutex); return ret; }