drivers: add ifx pinctrl driver updates for kit_pse84_eval
- add drive-strength capability for kit_pse84_eval
Signed-off-by: McAtee Maxwell <maxwell.mcatee@infineon.com>
diff --git a/drivers/gpio/gpio_ifx_cat1.c b/drivers/gpio/gpio_ifx_cat1.c
index 29a3079..5cc8981 100644
--- a/drivers/gpio/gpio_ifx_cat1.c
+++ b/drivers/gpio/gpio_ifx_cat1.c
@@ -19,6 +19,7 @@
#include <zephyr/drivers/gpio/gpio_utils.h>
#include <zephyr/irq.h>
+#include <infineon_kconfig.h>
#include <cy_gpio.h>
#include <zephyr/logging/log.h>
diff --git a/drivers/pinctrl/pinctrl_ifx_cat1.c b/drivers/pinctrl/pinctrl_ifx_cat1.c
index 87370c1..fe80dc5 100644
--- a/drivers/pinctrl/pinctrl_ifx_cat1.c
+++ b/drivers/pinctrl/pinctrl_ifx_cat1.c
@@ -10,9 +10,11 @@
*/
#include <zephyr/drivers/pinctrl.h>
+
+#include <infineon_kconfig.h>
#include <cy_gpio.h>
-#define GPIO_PORT_OR_NULL(node_id) \
+#define GPIO_PORT_OR_NULL(node_id) \
COND_CODE_1(DT_NODE_EXISTS(node_id), ((GPIO_PRT_Type *)DT_REG_ADDR(node_id)), (NULL))
/* @brief Array containing pointers to each GPIO port.
@@ -40,40 +42,40 @@
static uint32_t soc_gpio_get_drv_mode(uint32_t flags)
{
uint32_t drv_mode = CY_GPIO_DM_ANALOG;
- uint32_t _flags;
+ uint32_t flags_masked;
- _flags = ((flags & SOC_GPIO_FLAGS_MASK) >> SOC_GPIO_FLAGS_POS);
+ flags_masked = ((flags & SOC_GPIO_FLAGS_MASK) >> SOC_GPIO_FLAGS_POS);
- if (_flags & SOC_GPIO_OPENDRAIN) {
+ if (flags_masked & SOC_GPIO_OPENDRAIN) {
/* drive_open_drain */
- drv_mode = (_flags & SOC_GPIO_INPUTENABLE) ? CY_GPIO_DM_OD_DRIVESLOW
+ drv_mode = (flags_masked & SOC_GPIO_INPUTENABLE) ? CY_GPIO_DM_OD_DRIVESLOW
: CY_GPIO_DM_OD_DRIVESLOW_IN_OFF;
- } else if (_flags & SOC_GPIO_OPENSOURCE) {
+ } else if (flags_masked & SOC_GPIO_OPENSOURCE) {
/* drive_open_source */
- drv_mode = (_flags & SOC_GPIO_INPUTENABLE) ? CY_GPIO_DM_OD_DRIVESHIGH
+ drv_mode = (flags_masked & SOC_GPIO_INPUTENABLE) ? CY_GPIO_DM_OD_DRIVESHIGH
: CY_GPIO_DM_OD_DRIVESHIGH_IN_OFF;
- } else if (_flags & SOC_GPIO_PUSHPULL) {
+ } else if (flags_masked & SOC_GPIO_PUSHPULL) {
/* drive_push_pull */
- drv_mode = (_flags & SOC_GPIO_INPUTENABLE) ? CY_GPIO_DM_STRONG
+ drv_mode = (flags_masked & SOC_GPIO_INPUTENABLE) ? CY_GPIO_DM_STRONG
: CY_GPIO_DM_STRONG_IN_OFF;
- } else if ((_flags & SOC_GPIO_PULLUP) && (_flags & SOC_GPIO_PULLDOWN)) {
+ } else if ((flags_masked & SOC_GPIO_PULLUP) && (flags_masked & SOC_GPIO_PULLDOWN)) {
/* bias_pull_up and bias_pull_down */
- drv_mode = (_flags & SOC_GPIO_INPUTENABLE) ? CY_GPIO_DM_PULLUP_DOWN
+ drv_mode = (flags_masked & SOC_GPIO_INPUTENABLE) ? CY_GPIO_DM_PULLUP_DOWN
: CY_GPIO_DM_PULLUP_DOWN_IN_OFF;
- } else if (_flags & SOC_GPIO_PULLUP) {
+ } else if (flags_masked & SOC_GPIO_PULLUP) {
/* bias_pull_up */
- drv_mode = (_flags & SOC_GPIO_INPUTENABLE) ? CY_GPIO_DM_PULLUP
+ drv_mode = (flags_masked & SOC_GPIO_INPUTENABLE) ? CY_GPIO_DM_PULLUP
: CY_GPIO_DM_PULLUP_IN_OFF;
- } else if (_flags & SOC_GPIO_PULLDOWN) {
+ } else if (flags_masked & SOC_GPIO_PULLDOWN) {
/* bias_pull_down */
- drv_mode = (_flags & SOC_GPIO_INPUTENABLE) ? CY_GPIO_DM_PULLDOWN
+ drv_mode = (flags_masked & SOC_GPIO_INPUTENABLE) ? CY_GPIO_DM_PULLDOWN
: CY_GPIO_DM_PULLDOWN_IN_OFF;
- } else if ((_flags & SOC_GPIO_HIGHZ) | (_flags & SOC_GPIO_INPUTENABLE)) {
+ } else if ((flags_masked & SOC_GPIO_HIGHZ) | (flags_masked & SOC_GPIO_INPUTENABLE)) {
/* bias_pull_down */
drv_mode = CY_GPIO_DM_HIGHZ;
} else {
@@ -83,6 +85,39 @@
return drv_mode;
}
+#if defined(CONFIG_SOC_SERIES_PSE84)
+static uint32_t soc_gpio_get_drv_strength(uint32_t flags)
+{
+ uint32_t drv_strength_idx = 0;
+ uint32_t drv_strength = CY_GPIO_DRIVE_1_8;
+ uint32_t flags_masked;
+
+ flags_masked = ((flags & SOC_GPIO_FLAGS_MASK) >> SOC_GPIO_FLAGS_POS);
+ drv_strength_idx = (flags_masked & SOC_GPIO_DRIVESTRENGTH) >> SOC_GPIO_DRIVESTRENGTH_POS;
+
+ switch (drv_strength_idx) {
+ case 0:
+ drv_strength = CY_GPIO_DRIVE_FULL;
+ break;
+ case 1:
+ drv_strength = CY_GPIO_DRIVE_1_2;
+ break;
+ case 2:
+ drv_strength = CY_GPIO_DRIVE_1_4;
+ break;
+ case 3:
+ drv_strength = CY_GPIO_DRIVE_1_8;
+ break;
+
+ default:
+ drv_strength = CY_GPIO_DRIVE_1_8;
+ break;
+ }
+
+ return drv_strength;
+}
+#endif
+
int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintptr_t reg)
{
ARG_UNUSED(reg);
@@ -94,7 +129,7 @@
uint32_t pin_num = CAT1_PINMUX_GET_PIN_NUM(pins[i].pinmux);
/* Initialize pin */
-#if defined(COMPONENT_SECURE_DEVICE) || defined(CY_PDL_TZ_ENABLED)
+#if defined(CY_PDL_TZ_ENABLED)
Cy_GPIO_Pin_SecFastInit(gpio_ports[port_num], pin_num, drv_mode, 1, hsiom);
#else
Cy_GPIO_Pin_FastInit(gpio_ports[port_num], pin_num, drv_mode, 1, hsiom);
@@ -109,9 +144,14 @@
Cy_GPIO_Write(gpio_ports[port_num], pin_num, 0);
break;
default:
- /* do nothing */
+ /* Do nothing */
break;
}
+
+#if defined(CONFIG_SOC_SERIES_PSE84)
+ Cy_GPIO_SetDriveSel(gpio_ports[port_num], pin_num,
+ soc_gpio_get_drv_strength(pins[i].pincfg));
+#endif
}
return 0;
diff --git a/dts/bindings/pinctrl/infineon,cat1-pinctrl.yaml b/dts/bindings/pinctrl/infineon,cat1-pinctrl.yaml
index d2345bd..3c9e896 100644
--- a/dts/bindings/pinctrl/infineon,cat1-pinctrl.yaml
+++ b/dts/bindings/pinctrl/infineon,cat1-pinctrl.yaml
@@ -120,3 +120,12 @@
Encodes port/pin and alternate function.
required: true
type: int
+ drive-strength:
+ type: string
+ enum:
+ - "full"
+ - "half"
+ - "one-fourth"
+ - "one-eighth"
+ description: |
+ Pin output drive strength.