/*
 * Copyright (c) 2022 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <errno.h>
#include <zephyr/sys/util.h>
#include "usbh_internal.h"

#include <zephyr/logging/log.h>
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;
}
