Skip to content

Commit 183542b

Browse files
NeilChen93kartben
authored andcommitted
driver: gpio: update gpio_mcux.c driver
GPIO interrupts do not work on MCXA, MCXA has ICR register but feature FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT value is 0, can't only use this feature to support ICR. So adjust feature judgment. Signed-off-by: Neil Chen <[email protected]>
1 parent 09d7979 commit 183542b

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

drivers/gpio/gpio_mcux.c

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,15 @@
2323
#define PORT_Type void
2424
#endif
2525

26+
#if (defined(FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT) && \
27+
FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT)
28+
#define GPIO_MCUX_HAS_INTERRUPT_CHANNEL_SELECT
29+
#endif
30+
31+
#if (defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT)
32+
#define PORT_HAS_NO_INTERRUPT
33+
#endif
34+
2635
struct gpio_mcux_config {
2736
/* gpio_driver_config needs to be first */
2837
struct gpio_driver_config common;
@@ -255,7 +264,7 @@ static int gpio_mcux_port_toggle_bits(const struct device *dev, uint32_t mask)
255264
}
256265

257266
#if !(defined(CONFIG_PINCTRL_NXP_IOCON))
258-
#if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT)
267+
#if !(defined(PORT_HAS_NO_INTERRUPT))
259268
static uint32_t get_port_pcr_irqc_value_from_flags(const struct device *dev, uint32_t pin,
260269
enum gpio_int_mode mode, enum gpio_int_trig trig)
261270
{
@@ -289,11 +298,10 @@ static uint32_t get_port_pcr_irqc_value_from_flags(const struct device *dev, uin
289298

290299
return PORT_PCR_IRQC(port_interrupt);
291300
}
292-
#endif /* !defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT */
301+
#endif /* !(defined(PORT_HAS_NO_INTERRUPT)) */
293302
#endif /* !(defined(CONFIG_PINCTRL_NXP_IOCON)) */
294303

295-
#if (defined(FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT) && \
296-
FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT)
304+
#if (defined(GPIO_MCUX_HAS_INTERRUPT_CHANNEL_SELECT) || defined(PORT_HAS_NO_INTERRUPT))
297305

298306
#define GPIO_MCUX_INTERRUPT_DISABLED 0
299307
#define GPIO_MCUX_INTERRUPT_LOGIC_0 0x8
@@ -335,7 +343,7 @@ static uint32_t get_gpio_icr_irqc_value_from_flags(const struct device *dev, uin
335343

336344
return GPIO_ICR_IRQC(gpio_interrupt);
337345
}
338-
#endif /* (defined(FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT) */
346+
#endif /* (defined(GPIO_MCUX_HAS_INTERRUPT_CHANNEL_SELECT) */
339347

340348
static int gpio_mcux_pin_interrupt_configure(const struct device *dev, gpio_pin_t pin,
341349
enum gpio_int_mode mode, enum gpio_int_trig trig)
@@ -361,16 +369,15 @@ static int gpio_mcux_pin_interrupt_configure(const struct device *dev, gpio_pin_
361369
return -ENOTSUP;
362370
}
363371

364-
#if (defined(FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT) && \
365-
FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT)
372+
#if (defined(GPIO_MCUX_HAS_INTERRUPT_CHANNEL_SELECT) || defined(PORT_HAS_NO_INTERRUPT))
366373
uint32_t icr = get_gpio_icr_irqc_value_from_flags(dev, pin, mode, trig);
367374

368375
gpio_base->ICR[pin] = (gpio_base->ICR[pin] & ~GPIO_ICR_IRQC_MASK) | icr;
369-
#elif !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT)
376+
#elif !(defined(PORT_HAS_NO_INTERRUPT))
370377
uint32_t pcr = get_port_pcr_irqc_value_from_flags(dev, pin, mode, trig);
371378

372379
port_base->PCR[pin] = (port_base->PCR[pin] & ~PORT_PCR_IRQC_MASK) | pcr;
373-
#endif /* !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) */
380+
#endif /* defined(GPIO_MCUX_HAS_INTERRUPT_CHANNEL_SELECT) || defined(PORT_HAS_NO_INTERRUPT) */
374381

375382
return 0;
376383
}
@@ -389,21 +396,20 @@ static void gpio_mcux_port_isr(const struct device *dev)
389396
struct gpio_mcux_data *data = dev->data;
390397
uint32_t int_status;
391398

392-
#if (defined(FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT) && \
393-
FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT)
399+
#if (defined(GPIO_MCUX_HAS_INTERRUPT_CHANNEL_SELECT) || defined(PORT_HAS_NO_INTERRUPT))
394400
int_status = config->gpio_base->ISFR[0];
395401

396402
/* Clear the gpio interrupts */
397403
config->gpio_base->ISFR[0] = int_status;
398-
#elif !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT)
404+
#elif !(defined(PORT_HAS_NO_INTERRUPT))
399405
int_status = config->port_base->ISFR;
400406

401407
/* Clear the port interrupts */
402408
config->port_base->ISFR = int_status;
403409
#else
404410
int_status = 0U;
405411
ARG_UNUSED(config);
406-
#endif /* !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) */
412+
#endif /* defined(GPIO_MCUX_HAS_INTERRUPT_CHANNEL_SELECT) || defined(PORT_HAS_NO_INTERRUPT) */
407413

408414
gpio_fire_callbacks(&data->callbacks, dev, int_status);
409415
}

0 commit comments

Comments
 (0)