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

#define LOG_LEVEL CONFIG_EMUL_LOG_LEVEL
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(emul);

#include <zephyr/device.h>
#include <zephyr/drivers/emul.h>
#include <zephyr/sys/iterable_sections.h>
#include <string.h>

const struct emul *emul_get_binding(const char *name)
{
	STRUCT_SECTION_FOREACH(emul, emul_it) {
		if (strcmp(emul_it->dev->name, name) == 0) {
			return emul_it;
		}
	}

	return NULL;
}

int emul_init_for_bus(const struct device *dev)
{
	const struct emul_list_for_bus *cfg = dev->config;

	/*
	 * Walk the list of children, find the corresponding emulator and
	 * initialise it.
	 */
	const struct emul_link_for_bus *elp;
	const struct emul_link_for_bus *const end = cfg->children + cfg->num_children;

	LOG_INF("Registering %d emulator(s) for %s", cfg->num_children, dev->name);
	for (elp = cfg->children; elp < end; elp++) {
		const struct emul *emul = emul_get_binding(elp->dev->name);

		__ASSERT(emul, "Cannot find emulator for '%s'", elp->dev->name);

		switch (emul->bus_type) {
		case EMUL_BUS_TYPE_I2C:
			emul->bus.i2c->target = emul;
			break;
		case EMUL_BUS_TYPE_ESPI:
			emul->bus.espi->target = emul;
			break;
		case EMUL_BUS_TYPE_SPI:
			emul->bus.spi->target = emul;
			break;
		}
		int rc = emul->init(emul, dev);

		if (rc != 0) {
			LOG_WRN("Init %s emulator failed: %d",
				 elp->dev->name, rc);
		}

		switch (emul->bus_type) {
#ifdef CONFIG_I2C_EMUL
		case EMUL_BUS_TYPE_I2C:
			rc = i2c_emul_register(dev, emul->bus.i2c);
			break;
#endif /* CONFIG_I2C_EMUL */
#ifdef CONFIG_ESPI_EMUL
		case EMUL_BUS_TYPE_ESPI:
			rc = espi_emul_register(dev, emul->bus.espi);
			break;
#endif /* CONFIG_ESPI_EMUL */
#ifdef CONFIG_SPI_EMUL
		case EMUL_BUS_TYPE_SPI:
			rc = spi_emul_register(dev, emul->bus.spi);
			break;
#endif /* CONFIG_SPI_EMUL */
		default:
			rc = -EINVAL;
			LOG_WRN("Found no emulated bus enabled to register emulator %s",
				elp->dev->name);
		}

		if (rc != 0) {
			LOG_WRN("Failed to register emulator for %s: %d", elp->dev->name, rc);
		}
	}

	return 0;
}
