diff --git a/doc/releases/migration-guide-4.0.rst b/doc/releases/migration-guide-4.0.rst
index e8c09adbb3b..d23b208ed9c 100644
--- a/doc/releases/migration-guide-4.0.rst
+++ b/doc/releases/migration-guide-4.0.rst
@@ -37,6 +37,13 @@ Boards
* Board ``qemu_xtensa`` is deprecated. Use ``qemu_xtensa/dc233c`` instead.
+Devicetree
+**********
+
+* The :c:macro:`DT_REG_ADDR` macro and its variants are now expanding into an
+ unsigned literals (i.e. with a ``U`` suffix). To use addresses as devicetree
+ indexes use the :c:macro:`DT_REG_ADDR_RAW` variants.
+
STM32
=====
diff --git a/drivers/w1/w1_ds2482-800_channel.c b/drivers/w1/w1_ds2482-800_channel.c
index 501a8c70132..19363232116 100644
--- a/drivers/w1/w1_ds2482-800_channel.c
+++ b/drivers/w1/w1_ds2482-800_channel.c
@@ -164,8 +164,8 @@ static const struct w1_driver_api ds2482_driver_api = {
.w1_config.slave_count = W1_INST_SLAVE_COUNT(inst), \
.parent = DEVICE_DT_GET(DT_INST_PARENT(inst)), \
.i2c_spec = I2C_DT_SPEC_GET(DT_INST_PARENT(inst)), \
- .reg_channel = UTIL_CAT(CHSL_IO, DT_INST_REG_ADDR(inst)), \
- .reg_channel_rb = UTIL_CAT(CHSL_RB_IO, DT_INST_REG_ADDR(inst)), \
+ .reg_channel = UTIL_CAT(CHSL_IO, DT_INST_REG_ADDR_RAW(inst)), \
+ .reg_channel_rb = UTIL_CAT(CHSL_RB_IO, DT_INST_REG_ADDR_RAW(inst)), \
.reg_config = DT_INST_PROP(inst, active_pullup) << DEVICE_APU_pos, \
}; \
static struct ds2482_data inst_##inst##_data = {0}; \
diff --git a/include/zephyr/devicetree.h b/include/zephyr/devicetree.h
index b675b42ec7a..a93ffd52754 100644
--- a/include/zephyr/devicetree.h
+++ b/include/zephyr/devicetree.h
@@ -2243,6 +2243,34 @@
#define DT_REG_HAS_NAME(node_id, name) \
IS_ENABLED(DT_CAT4(node_id, _REG_NAME_, name, _EXISTS))
+/**
+ * @brief Get the base raw address of the register block at index @p idx
+ *
+ * Get the base address of the register block at index @p idx without any
+ * type suffix. This can be used to index other devicetree properties, use the
+ * non _RAW macros for assigning values in actual code.
+ *
+ * @param node_id node identifier
+ * @param idx index of the register whose address to return
+ * @return address of the idx-th register block
+ */
+#define DT_REG_ADDR_BY_IDX_RAW(node_id, idx) \
+ DT_CAT4(node_id, _REG_IDX_, idx, _VAL_ADDRESS)
+
+/**
+ * @brief Get a node's (only) register block raw address
+ *
+ * Get a node's only register block address without any type suffix. This can
+ * be used to index other devicetree properties, use the non _RAW macros for
+ * assigning values in actual code.
+ *
+ * Equivalent to DT_REG_ADDR_BY_IDX_RAW(node_id, 0).
+ * @param node_id node identifier
+ * @return node's register block address
+ */
+#define DT_REG_ADDR_RAW(node_id) \
+ DT_REG_ADDR_BY_IDX_RAW(node_id, 0)
+
/**
* @brief Get the base address of the register block at index @p idx
* @param node_id node identifier
@@ -2250,7 +2278,7 @@
* @return address of the idx-th register block
*/
#define DT_REG_ADDR_BY_IDX(node_id, idx) \
- DT_CAT4(node_id, _REG_IDX_, idx, _VAL_ADDRESS)
+ DT_U32_C(DT_REG_ADDR_BY_IDX_RAW(node_id, idx))
/**
* @brief Get the size of the register block at index @p idx
@@ -2285,7 +2313,7 @@
* @param node_id node identifier
* @return node's register block address
*/
-#define DT_REG_ADDR_U64(node_id) DT_U64_C(DT_REG_ADDR(node_id))
+#define DT_REG_ADDR_U64(node_id) DT_U64_C(DT_REG_ADDR_BY_IDX_RAW(node_id, 0))
/**
* @brief Get a node's (only) register block size
@@ -2303,7 +2331,7 @@
* @return address of the register block specified by name
*/
#define DT_REG_ADDR_BY_NAME(node_id, name) \
- DT_CAT4(node_id, _REG_NAME_, name, _VAL_ADDRESS)
+ DT_U32_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_ADDRESS))
/**
* @brief Like DT_REG_ADDR_BY_NAME(), but with a fallback to @p default_value
@@ -2330,7 +2358,7 @@
* @return address of the register block specified by name
*/
#define DT_REG_ADDR_BY_NAME_U64(node_id, name) \
- DT_U64_C(DT_REG_ADDR_BY_NAME(node_id, name))
+ DT_U64_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_ADDRESS))
/**
* @brief Get a register block's size by name
@@ -4135,6 +4163,14 @@
*/
#define DT_INST_REG_HAS_NAME(inst, name) DT_REG_HAS_NAME(DT_DRV_INST(inst), name)
+/**
+ * @brief Get a `DT_DRV_COMPAT` instance's idx-th register block's raw address
+ * @param inst instance number
+ * @param idx index of the register whose address to return
+ * @return address of the instance's idx-th register block
+ */
+#define DT_INST_REG_ADDR_BY_IDX_RAW(inst, idx) DT_REG_ADDR_BY_IDX_RAW(DT_DRV_INST(inst), idx)
+
/**
* @brief Get a `DT_DRV_COMPAT` instance's idx-th register block's address
* @param inst instance number
@@ -4185,7 +4221,7 @@
* @return address of the register block with the given @p name
*/
#define DT_INST_REG_ADDR_BY_NAME_U64(inst, name) \
- DT_U64_C(DT_INST_REG_ADDR_BY_NAME(inst, name))
+ DT_REG_ADDR_BY_NAME_U64(DT_DRV_INST(inst), name)
/**
* @brief Get a `DT_DRV_COMPAT`'s register block size by name
@@ -4207,6 +4243,13 @@
#define DT_INST_REG_SIZE_BY_NAME_OR(inst, name, default_value) \
DT_REG_SIZE_BY_NAME_OR(DT_DRV_INST(inst), name, default_value)
+/**
+ * @brief Get a `DT_DRV_COMPAT`'s (only) register block raw address
+ * @param inst instance number
+ * @return instance's register block address
+ */
+#define DT_INST_REG_ADDR_RAW(inst) DT_INST_REG_ADDR_BY_IDX_RAW(inst, 0)
+
/**
* @brief Get a `DT_DRV_COMPAT`'s (only) register block address
* @param inst instance number
@@ -4225,7 +4268,7 @@
* @param inst instance number
* @return instance's register block address
*/
-#define DT_INST_REG_ADDR_U64(inst) DT_U64_C(DT_INST_REG_ADDR(inst))
+#define DT_INST_REG_ADDR_U64(inst) DT_REG_ADDR_U64(DT_DRV_INST(inst))
/**
* @brief Get a `DT_DRV_COMPAT`'s (only) register block size
@@ -4887,6 +4930,16 @@
#define DT_COMPAT_NODE_HAS_PROP_AND_OR(inst, compat, prop) \
DT_NODE_HAS_PROP(DT_INST(inst, compat), prop) ||
+/**
+ * @def DT_U32_C
+ * @brief Macro to add 32bit unsigned postfix to the devicetree address constants
+ */
+#if defined(_LINKER) || defined(_ASMLANGUAGE)
+#define DT_U32_C(_v) (_v)
+#else
+#define DT_U32_C(_v) UINT32_C(_v)
+#endif
+
/**
* @def DT_U64_C
* @brief Macro to add ULL postfix to the devicetree address constants
diff --git a/include/zephyr/devicetree/spi.h b/include/zephyr/devicetree/spi.h
index d1f916c3df9..db1b4996f64 100644
--- a/include/zephyr/devicetree/spi.h
+++ b/include/zephyr/devicetree/spi.h
@@ -148,7 +148,7 @@ extern "C" {
* @return node identifier for spi_dev's chip select GPIO controller
*/
#define DT_SPI_DEV_CS_GPIOS_CTLR(spi_dev) \
- DT_GPIO_CTLR_BY_IDX(DT_BUS(spi_dev), cs_gpios, DT_REG_ADDR(spi_dev))
+ DT_GPIO_CTLR_BY_IDX(DT_BUS(spi_dev), cs_gpios, DT_REG_ADDR_RAW(spi_dev))
/**
* @brief Get a SPI device's chip select GPIO pin number
@@ -181,7 +181,7 @@ extern "C" {
* @return pin number of spi_dev's chip select GPIO
*/
#define DT_SPI_DEV_CS_GPIOS_PIN(spi_dev) \
- DT_GPIO_PIN_BY_IDX(DT_BUS(spi_dev), cs_gpios, DT_REG_ADDR(spi_dev))
+ DT_GPIO_PIN_BY_IDX(DT_BUS(spi_dev), cs_gpios, DT_REG_ADDR_RAW(spi_dev))
/**
* @brief Get a SPI device's chip select GPIO flags
@@ -209,7 +209,7 @@ extern "C" {
* zero if there is none
*/
#define DT_SPI_DEV_CS_GPIOS_FLAGS(spi_dev) \
- DT_GPIO_FLAGS_BY_IDX(DT_BUS(spi_dev), cs_gpios, DT_REG_ADDR(spi_dev))
+ DT_GPIO_FLAGS_BY_IDX(DT_BUS(spi_dev), cs_gpios, DT_REG_ADDR_RAW(spi_dev))
/**
* @brief Equivalent to DT_SPI_DEV_HAS_CS_GPIOS(DT_DRV_INST(inst)).
diff --git a/include/zephyr/drivers/adc.h b/include/zephyr/drivers/adc.h
index dc7d975ae45..583c04cd0e7 100644
--- a/include/zephyr/drivers/adc.h
+++ b/include/zephyr/drivers/adc.h
@@ -321,7 +321,7 @@ struct adc_dt_spec {
DT_FOREACH_CHILD_VARGS(ctlr, ADC_FOREACH_INPUT, input)
#define ADC_FOREACH_INPUT(node, input) \
- IF_ENABLED(IS_EQ(DT_REG_ADDR(node), input), (node))
+ IF_ENABLED(IS_EQ(DT_REG_ADDR_RAW(node), input), (node))
#define ADC_CHANNEL_CFG_FROM_DT_NODE(node_id) \
IF_ENABLED(DT_NODE_EXISTS(node_id), \
diff --git a/include/zephyr/drivers/firmware/scmi/util.h b/include/zephyr/drivers/firmware/scmi/util.h
index 93900a109b8..cd05f984ac2 100644
--- a/include/zephyr/drivers/firmware/scmi/util.h
+++ b/include/zephyr/drivers/firmware/scmi/util.h
@@ -66,7 +66,7 @@
#define DT_SCMI_TRANSPORT_TX_CHAN_DECLARE(node_id) \
COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_HAS_CHAN(node_id, 0), \
(extern struct scmi_channel \
- SCMI_TRANSPORT_CHAN_NAME(DT_REG_ADDR(node_id), 0);), \
+ SCMI_TRANSPORT_CHAN_NAME(DT_REG_ADDR_RAW(node_id), 0);), \
(extern struct scmi_channel \
SCMI_TRANSPORT_CHAN_NAME(SCMI_PROTOCOL_BASE, 0);)) \
@@ -110,7 +110,7 @@
*/
#define DT_SCMI_TRANSPORT_TX_CHAN(node_id) \
COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_HAS_CHAN(node_id, 0), \
- (&SCMI_TRANSPORT_CHAN_NAME(DT_REG_ADDR(node_id), 0)), \
+ (&SCMI_TRANSPORT_CHAN_NAME(DT_REG_ADDR_RAW(node_id), 0)), \
(&SCMI_TRANSPORT_CHAN_NAME(SCMI_PROTOCOL_BASE, 0)))
/**
@@ -211,9 +211,9 @@
#define DT_SCMI_PROTOCOL_DEFINE(node_id, init_fn, pm, data, config, \
level, prio, api) \
DT_SCMI_TRANSPORT_CHANNELS_DECLARE(node_id) \
- DT_SCMI_PROTOCOL_DATA_DEFINE(node_id, DT_REG_ADDR(node_id), data); \
+ DT_SCMI_PROTOCOL_DATA_DEFINE(node_id, DT_REG_ADDR_RAW(node_id), data); \
DEVICE_DT_DEFINE(node_id, init_fn, pm, \
- &SCMI_PROTOCOL_NAME(DT_REG_ADDR(node_id)), \
+ &SCMI_PROTOCOL_NAME(DT_REG_ADDR_RAW(node_id)), \
config, level, prio, api)
/**
@@ -247,7 +247,7 @@
*/
#define DT_SCMI_PROTOCOL_DEFINE_NODEV(node_id, data) \
DT_SCMI_TRANSPORT_CHANNELS_DECLARE(node_id) \
- DT_SCMI_PROTOCOL_DATA_DEFINE(node_id, DT_REG_ADDR(node_id), data)
+ DT_SCMI_PROTOCOL_DATA_DEFINE(node_id, DT_REG_ADDR_RAW(node_id), data)
/**
* @brief Create an SCMI message field
diff --git a/include/zephyr/drivers/mipi_dbi.h b/include/zephyr/drivers/mipi_dbi.h
index c2d52c77e0e..5dbbfce90aa 100644
--- a/include/zephyr/drivers/mipi_dbi.h
+++ b/include/zephyr/drivers/mipi_dbi.h
@@ -63,7 +63,7 @@ extern "C" {
.cs = { \
.gpio = GPIO_DT_SPEC_GET_BY_IDX_OR(DT_PHANDLE(DT_PARENT(node_id), \
spi_dev), cs_gpios, \
- DT_REG_ADDR(node_id), \
+ DT_REG_ADDR_RAW(node_id), \
{}), \
.delay = (delay_), \
}, \
diff --git a/include/zephyr/drivers/mspi/devicetree.h b/include/zephyr/drivers/mspi/devicetree.h
index c720071c52f..a3e5b65319e 100644
--- a/include/zephyr/drivers/mspi/devicetree.h
+++ b/include/zephyr/drivers/mspi/devicetree.h
@@ -212,7 +212,8 @@ extern "C" {
* @return #gpio_dt_spec struct corresponding with mspi_dev's chip enable
*/
#define MSPI_DEV_CE_GPIOS_DT_SPEC_GET(mspi_dev) \
- GPIO_DT_SPEC_GET_BY_IDX_OR(DT_BUS(mspi_dev), ce_gpios, DT_REG_ADDR(mspi_dev), {})
+ GPIO_DT_SPEC_GET_BY_IDX_OR(DT_BUS(mspi_dev), ce_gpios, \
+ DT_REG_ADDR_RAW(mspi_dev), {})
/**
* @brief Get a struct gpio_dt_spec for a MSPI device's chip enable pin
diff --git a/include/zephyr/drivers/spi.h b/include/zephyr/drivers/spi.h
index 958211e8294..d344a73c562 100644
--- a/include/zephyr/drivers/spi.h
+++ b/include/zephyr/drivers/spi.h
@@ -211,7 +211,7 @@ struct spi_cs_control {
*/
#define SPI_CS_GPIOS_DT_SPEC_GET(spi_dev) \
GPIO_DT_SPEC_GET_BY_IDX_OR(DT_BUS(spi_dev), cs_gpios, \
- DT_REG_ADDR(spi_dev), {})
+ DT_REG_ADDR_RAW(spi_dev), {})
/**
* @brief Get a struct gpio_dt_spec for a SPI device's chip select pin
diff --git a/include/zephyr/sys/device_mmio.h b/include/zephyr/sys/device_mmio.h
index 2d1874a3585..e6971c96ebe 100644
--- a/include/zephyr/sys/device_mmio.h
+++ b/include/zephyr/sys/device_mmio.h
@@ -63,13 +63,13 @@ struct z_device_mmio_rom {
#define Z_DEVICE_MMIO_ROM_INITIALIZER(node_id) \
{ \
- .phys_addr = UINT32_C(DT_REG_ADDR(node_id)), \
+ .phys_addr = DT_REG_ADDR(node_id), \
.size = DT_REG_SIZE(node_id) \
}
#define Z_DEVICE_MMIO_NAMED_ROM_INITIALIZER(name, node_id) \
{ \
- .phys_addr = UINT32_C(DT_REG_ADDR_BY_NAME(node_id, name)), \
+ .phys_addr = DT_REG_ADDR_BY_NAME(node_id, name), \
.size = DT_REG_SIZE_BY_NAME(node_id, name) \
}
diff --git a/tests/lib/devicetree/api/src/main.c b/tests/lib/devicetree/api/src/main.c
index 9de03524d8a..60a79d68f39 100644
--- a/tests/lib/devicetree/api/src/main.c
+++ b/tests/lib/devicetree/api/src/main.c
@@ -2948,7 +2948,7 @@ ZTEST(devicetree_api, test_fixed_partitions)
* Test this by way of string comparison.
*/
zassert_true(!strcmp(TO_STRING(DT_FIXED_PARTITION_ADDR(TEST_PARTITION_2)),
- "(__REG_IDX_0_VAL_ADDRESS + 458624)"));
+ "(__REG_IDX_0_VAL_ADDRESSU + 458624U)"));
zassert_equal(DT_REG_ADDR(TEST_PARTITION_2), 458624);
/* Test that all DT_FIXED_PARTITION_ID are defined and unique. */