/* * Copyright 2020 Google LLC * Copyright (c) 2020 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ #define LOG_LEVEL CONFIG_EMUL_LOG_LEVEL #include LOG_MODULE_REGISTER(emul); #include #include #include #include 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; }