/*
 * Copyright (c) 2020 Intel Corporation
 * Copyright (c) 2022 Carlo Caione <ccaione@baylibre.com>
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <ztest.h>
#include <zephyr/device.h>

#define DT_DRV_COMPAT	fakedriver_multireg

/*
 * Driver with multiple MMIO regions to manage defined into DT
 */

struct foo_multireg_dev_data {
	int baz;

	DEVICE_MMIO_NAMED_RAM(chip);
	DEVICE_MMIO_NAMED_RAM(dale);
};

struct foo_multireg_dev_data foo_multireg_data;

struct foo_multireg_config_info {
	DEVICE_MMIO_NAMED_ROM(chip);
	DEVICE_MMIO_NAMED_ROM(dale);
};

const struct foo_multireg_config_info foo_multireg_config = {
	DEVICE_MMIO_NAMED_ROM_INIT_BY_NAME(chip, DT_DRV_INST(0)),
	DEVICE_MMIO_NAMED_ROM_INIT_BY_NAME(dale, DT_DRV_INST(0))
};

#define DEV_DATA(dev)	((struct foo_multireg_dev_data *)((dev)->data))
#define DEV_CFG(dev)	((struct foo_multireg_config_info *)((dev)->config))

int foo_multireg_init(const struct device *dev)
{
	DEVICE_MMIO_NAMED_MAP(dev, chip, K_MEM_CACHE_NONE);
	DEVICE_MMIO_NAMED_MAP(dev, dale, K_MEM_CACHE_NONE);

	return 0;
}

DEVICE_DEFINE(foo_multireg, "foo_multireg", foo_multireg_init, NULL,
		&foo_multireg_data, &foo_multireg_config,
		POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
		(void *)0xDEADBEEF);
/**
 * @brief Test DEVICE_MMIO_NAMED_* macros
 *
 * This is the same as the test_mmio_multiple test but in this test the
 * memory regions are created by the named DT property 'reg'.
 *
 * @see test_mmio_multiple
 *
 * @ingroup kernel_device_tests
 */
ZTEST(device, test_mmio_multireg)
{
	const struct device *dev = device_get_binding("foo_multireg");
	mm_reg_t regs_chip, regs_dale;
	const struct z_device_mmio_rom *rom_chip, *rom_dale;

	zassert_not_null(dev, "null foo_multireg");

	regs_chip = DEVICE_MMIO_NAMED_GET(dev, chip);
	regs_dale = DEVICE_MMIO_NAMED_GET(dev, dale);
	rom_chip = DEVICE_MMIO_NAMED_ROM_PTR(dev, chip);
	rom_dale = DEVICE_MMIO_NAMED_ROM_PTR(dev, dale);

	zassert_not_equal(regs_chip, 0, "bad regs_chip");
	zassert_not_equal(regs_dale, 0, "bad regs_dale");

#ifdef DEVICE_MMIO_IS_IN_RAM
	zassert_equal(rom_chip->phys_addr, DT_INST_REG_ADDR_BY_NAME(0, chip),
		      "bad phys_addr (chip)");
	zassert_equal(rom_chip->size, DT_INST_REG_SIZE_BY_NAME(0, chip),
		      "bad size (chip)");
	zassert_equal(rom_dale->phys_addr, DT_INST_REG_ADDR_BY_NAME(0, dale),
		      "bad phys_addr (dale)");
	zassert_equal(rom_dale->size, DT_INST_REG_SIZE_BY_NAME(0, dale),
		      "bad size (dale)");
#else
	zassert_equal(rom_chip->addr, DT_INST_REG_ADDR_BY_NAME(0, chip),
		      "bad addr (chip)");
	zassert_equal(regs_chip, rom_chip->addr, "bad regs (chip)");
	zassert_equal(rom_dale->addr, DT_INST_REG_ADDR_BY_NAME(0, dale),
		      "bad addr (dale)");
	zassert_equal(regs_dale, rom_dale->addr, "bad regs (dale)");
	zassert_equal(sizeof(struct foo_multireg_dev_data), sizeof(int),
		      "too big foo_multireg_dev_data");
#endif
}
