Browse Source

drivers: gpio: rz: improve gpio driver for Renesas RZ/A2M

- Adding support for GPIO_DISCONNECTED mode.
- Removing redundant interrupt configuration logic from the
.pin_configure API (already handled in pin_interrupt_configure).

Signed-off-by: Hoang Nguyen <hoang.nguyen.jx@bp.renesas.com>
Signed-off-by: Tien Nguyen <tien.nguyen.zg@renesas.com>
pull/91962/head
Hoang Nguyen 4 weeks ago committed by Carles Cufí
parent
commit
87177d1ac4
  1. 55
      drivers/gpio/gpio_renesas_rza2m.c
  2. 1
      drivers/gpio/gpio_renesas_rza2m.h

55
drivers/gpio/gpio_renesas_rza2m.c

@ -320,43 +320,30 @@ static int gpio_rza2m_pin_configure(const struct device *port_dev, gpio_pin_t pi
return -ENOTSUP; return -ENOTSUP;
} }
/* Configure pin direction */ if (!flags) {
if (flags & GPIO_OUTPUT) { /* Disconnected mode */
gpio_rza2m_pin_configure_as_gpio(port_dev, pin, RZA2M_PDR_OUTPUT); gpio_rza2m_pin_configure_as_gpio(port_dev, pin, RZA2M_PDR_HIZ);
} else if (flags & GPIO_INPUT) { } else if (!(flags & GPIO_OPEN_DRAIN)) {
gpio_rza2m_pin_configure_as_gpio(port_dev, pin, RZA2M_PDR_INPUT); /* Configure pin direction */
} else { if (flags & GPIO_OUTPUT) {
return -ENOTSUP; gpio_rza2m_pin_configure_as_gpio(port_dev, pin, RZA2M_PDR_OUTPUT);
} } else if (flags & GPIO_INPUT) {
gpio_rza2m_pin_configure_as_gpio(port_dev, pin, RZA2M_PDR_INPUT);
/* Configure pin drive strength */
ret = gpio_rza2m_pin_drive_set(port_dev, pin, flags);
if (ret) {
LOG_ERR("unable to set gpio drive level");
return ret;
}
/* Configure pin initial value */
if (flags & GPIO_OUTPUT_INIT_HIGH) {
ret = gpio_rza2m_port_set_bits_raw(port_dev, BIT(pin));
} else if (flags & GPIO_OUTPUT_INIT_LOW) {
ret = gpio_rza2m_port_clear_bits_raw(port_dev, BIT(pin));
}
/* Configure pin interrupt */
if (flags & GPIO_INT_ENABLE) {
if (flags & GPIO_INT_LOW_0) {
return -ENOTSUP;
} }
enum gpio_int_mode mode = /* Configure pin drive strength */
(flags & GPIO_INT_EDGE) ? GPIO_INT_MODE_EDGE : GPIO_INT_MODE_LEVEL; ret = gpio_rza2m_pin_drive_set(port_dev, pin, flags);
enum gpio_int_trig trig = GPIO_INT_TRIG_HIGH; if (ret) {
LOG_ERR("unable to set gpio drive level");
return ret;
}
ret = gpio_rza2m_pin_interrupt_configure(port_dev, pin, mode, trig); /* Configure pin initial value */
} else if (flags & GPIO_INT_DISABLE) { if (flags & GPIO_OUTPUT_INIT_HIGH) {
ret = gpio_rza2m_pin_interrupt_configure(port_dev, pin, GPIO_INT_MODE_DISABLED, ret = gpio_rza2m_port_set_bits_raw(port_dev, BIT(pin));
GPIO_INT_TRIG_HIGH); } else if (flags & GPIO_OUTPUT_INIT_LOW) {
ret = gpio_rza2m_port_clear_bits_raw(port_dev, BIT(pin));
}
} }
return ret; return ret;

1
drivers/gpio/gpio_renesas_rza2m.h

@ -31,6 +31,7 @@
#define RZA2M_GPIO_DRIVE_STRENGTH_NORMAL 0x01 #define RZA2M_GPIO_DRIVE_STRENGTH_NORMAL 0x01
#define RZA2M_DSCR_MASK 0x03 #define RZA2M_DSCR_MASK 0x03
#define RZA2M_PDR_MASK 0x03 #define RZA2M_PDR_MASK 0x03
#define RZA2M_PDR_HIZ 0x00
#define RZA2M_PDR_INPUT 0x02 #define RZA2M_PDR_INPUT 0x02
#define RZA2M_PDR_OUTPUT 0x03 #define RZA2M_PDR_OUTPUT 0x03
#define RZA2M_PWPR_PFSWE_MASK 0x40 #define RZA2M_PWPR_PFSWE_MASK 0x40

Loading…
Cancel
Save