diff --git a/drivers/gpio/gpio_mcux_igpio.c b/drivers/gpio/gpio_mcux_igpio.c index 01cd0e4e2fd..e1d1b82619b 100644 --- a/drivers/gpio/gpio_mcux_igpio.c +++ b/drivers/gpio/gpio_mcux_igpio.c @@ -10,7 +10,9 @@ #include #include #include +#if __has_include("soc.h") #include +#endif #include #include @@ -18,11 +20,15 @@ #include +#define DEV_CFG(_dev) ((const struct mcux_igpio_config *)(_dev)->config) +#define DEV_DATA(_dev) ((struct mcux_igpio_data *)(_dev)->data) struct mcux_igpio_config { /* gpio_driver_config needs to be first */ struct gpio_driver_config common; - GPIO_Type *base; + + DEVICE_MMIO_NAMED_ROM(igpio_mmio); + const struct pinctrl_soc_pinmux *pin_muxes; uint8_t mux_count; }; @@ -30,15 +36,23 @@ struct mcux_igpio_config { struct mcux_igpio_data { /* gpio_driver_data needs to be first */ struct gpio_driver_data general; + + DEVICE_MMIO_NAMED_RAM(igpio_mmio); + /* port ISR callback routine address */ sys_slist_t callbacks; }; +static GPIO_Type *get_base(const struct device *dev) +{ + return (GPIO_Type *)DEVICE_MMIO_NAMED_GET(dev, igpio_mmio); +} + static int mcux_igpio_configure(const struct device *dev, gpio_pin_t pin, gpio_flags_t flags) { const struct mcux_igpio_config *config = dev->config; - GPIO_Type *base = config->base; + GPIO_Type *base = get_base(dev); struct pinctrl_soc_pin pin_cfg; int cfg_idx = pin, i; @@ -63,7 +77,7 @@ static int mcux_igpio_configure(const struct device *dev, /* Set appropriate bits in pin configuration register */ volatile uint32_t *gpio_cfg_reg = - (volatile uint32_t *)config->pin_muxes[cfg_idx].config_register; + (volatile uint32_t *)(uintptr_t)config->pin_muxes[cfg_idx].config_register; uint32_t reg = *gpio_cfg_reg; #ifdef CONFIG_SOC_SERIES_IMXRT10XX @@ -204,8 +218,7 @@ static int mcux_igpio_configure(const struct device *dev, static int mcux_igpio_port_get_raw(const struct device *dev, uint32_t *value) { - const struct mcux_igpio_config *config = dev->config; - GPIO_Type *base = config->base; + GPIO_Type *base = get_base(dev); *value = base->DR; @@ -216,8 +229,7 @@ static int mcux_igpio_port_set_masked_raw(const struct device *dev, uint32_t mask, uint32_t value) { - const struct mcux_igpio_config *config = dev->config; - GPIO_Type *base = config->base; + GPIO_Type *base = get_base(dev); base->DR = (base->DR & ~mask) | (mask & value); @@ -227,8 +239,7 @@ static int mcux_igpio_port_set_masked_raw(const struct device *dev, static int mcux_igpio_port_set_bits_raw(const struct device *dev, uint32_t mask) { - const struct mcux_igpio_config *config = dev->config; - GPIO_Type *base = config->base; + GPIO_Type *base = get_base(dev); GPIO_PortSet(base, mask); @@ -238,8 +249,7 @@ static int mcux_igpio_port_set_bits_raw(const struct device *dev, static int mcux_igpio_port_clear_bits_raw(const struct device *dev, uint32_t mask) { - const struct mcux_igpio_config *config = dev->config; - GPIO_Type *base = config->base; + GPIO_Type *base = get_base(dev); GPIO_PortClear(base, mask); @@ -249,8 +259,7 @@ static int mcux_igpio_port_clear_bits_raw(const struct device *dev, static int mcux_igpio_port_toggle_bits(const struct device *dev, uint32_t mask) { - const struct mcux_igpio_config *config = dev->config; - GPIO_Type *base = config->base; + GPIO_Type *base = get_base(dev); GPIO_PortToggle(base, mask); @@ -263,7 +272,7 @@ static int mcux_igpio_pin_interrupt_configure(const struct device *dev, enum gpio_int_trig trig) { const struct mcux_igpio_config *config = dev->config; - GPIO_Type *base = config->base; + GPIO_Type *base = get_base(dev); unsigned int key; uint8_t icr; int shift; @@ -327,9 +336,8 @@ static int mcux_igpio_manage_callback(const struct device *dev, static void mcux_igpio_port_isr(const struct device *dev) { - const struct mcux_igpio_config *config = dev->config; struct mcux_igpio_data *data = dev->data; - GPIO_Type *base = config->base; + GPIO_Type *base = get_base(dev); uint32_t int_flags; int_flags = base->ISR; @@ -375,11 +383,11 @@ static DEVICE_API(gpio, mcux_igpio_driver_api) = { static int mcux_igpio_##n##_init(const struct device *dev); \ \ static const struct mcux_igpio_config mcux_igpio_##n##_config = {\ + DEVICE_MMIO_NAMED_ROM_INIT(igpio_mmio, DT_DRV_INST(n)), \ .common = { \ .port_pin_mask = GPIO_DT_INST_PORT_PIN_MASK_NGPIOS_EXC(\ n, DT_INST_PROP(n, ngpios)),\ }, \ - .base = (GPIO_Type *)DT_INST_REG_ADDR(n), \ MCUX_IGPIO_PIN_INIT(n) \ }; \ \ @@ -402,6 +410,8 @@ static DEVICE_API(gpio, mcux_igpio_driver_api) = { IF_ENABLED(DT_INST_IRQ_HAS_IDX(n, 1), \ (MCUX_IGPIO_IRQ_INIT(n, 1);)) \ \ + DEVICE_MMIO_NAMED_MAP(dev, igpio_mmio, K_MEM_CACHE_NONE | K_MEM_DIRECT_MAP); \ + \ return 0; \ }