blob: 53b27a282b5e24d9c1a687fe29b76bb995ad4592 [file] [log] [blame]
/*
* Copyright (c) 2020 Intel Corporation
* Copyright (c) 2022 Carlo Caione <ccaione@baylibre.com>
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/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
}