/*
 * Copyright (c) 2024 Google Inc
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/devicetree.h>
#include <zephyr/drivers/emul.h>
#include <zephyr/drivers/emul_bbram.h>

#include "npcx.h"

#define DT_DRV_COMPAT nuvoton_npcx_bbram

struct bbram_npcx_emul_config {
	const struct device *dev;
};

#define GET_CONFIG(target)                                                                         \
	((const struct bbram_npcx_config                                                           \
		  *)(((const struct bbram_npcx_emul_config *)((target)->cfg))->dev->config))

static int npcx_emul_backend_set_data(const struct emul *target, size_t offset, size_t count,
			       const uint8_t *buffer)
{
	const struct bbram_npcx_config *config = GET_CONFIG(target);

	if (offset + count > config->size) {
		return -ERANGE;
	}

	bytecpy(((uint8_t *)config->base_addr + offset), buffer, count);
	return 0;
}

static int npcx_emul_backend_get_data(const struct emul *target, size_t offset, size_t count,
			       uint8_t *buffer)
{
	const struct bbram_npcx_config *config = GET_CONFIG(target);

	if (offset + count > config->size) {
		return -ERANGE;
	}

	bytecpy(buffer, ((uint8_t *)config->base_addr + offset), count);
	return 0;
}

static const struct emul_bbram_backend_api npcx_emul_backend_api = {
	.set_data = npcx_emul_backend_set_data,
	.get_data = npcx_emul_backend_get_data,
};

#define BBRAM_EMUL_INIT(inst)                                                                      \
	static struct bbram_npcx_emul_config bbram_npcx_emul_config_##inst = {                     \
		.dev = DEVICE_DT_INST_GET(inst),                                                   \
	};                                                                                         \
	EMUL_DT_INST_DEFINE(inst, NULL, NULL, &bbram_npcx_emul_config_##inst, NULL,                \
			    &npcx_emul_backend_api)

DT_INST_FOREACH_STATUS_OKAY(BBRAM_EMUL_INIT);
