From 5f1d934b5547298a878575c0356d157e7fc1d3e2 Mon Sep 17 00:00:00 2001 From: Pushpal Sidhu Date: Wed, 25 Jul 2018 11:13:16 -0700 Subject: [PATCH] arch: stm32: gpio: give ability to set open-drain on pins If user wants to configure different pin drive strengths for STM32 soc's, configure the pin to be open-drain. Signed-off-by: Pushpal Sidhu --- soc/arm/st_stm32/stm32f0/soc_gpio.c | 30 +++++++++++++++++++---------- soc/arm/st_stm32/stm32f2/soc_gpio.c | 30 +++++++++++++++++++---------- soc/arm/st_stm32/stm32f3/soc_gpio.c | 29 ++++++++++++++++++---------- soc/arm/st_stm32/stm32f4/soc_gpio.c | 29 ++++++++++++++++++---------- soc/arm/st_stm32/stm32f7/soc_gpio.c | 29 ++++++++++++++++++---------- soc/arm/st_stm32/stm32l0/soc_gpio.c | 30 +++++++++++++++++++---------- soc/arm/st_stm32/stm32l4/soc_gpio.c | 29 ++++++++++++++++++---------- 7 files changed, 136 insertions(+), 70 deletions(-) diff --git a/soc/arm/st_stm32/stm32f0/soc_gpio.c b/soc/arm/st_stm32/stm32f0/soc_gpio.c index ab0a669e5f2e0..07eb8f9a19672 100644 --- a/soc/arm/st_stm32/stm32f0/soc_gpio.c +++ b/soc/arm/st_stm32/stm32f0/soc_gpio.c @@ -26,24 +26,34 @@ int stm32_gpio_flags_to_conf(int flags, int *pincfg) { int direction = flags & GPIO_DIR_MASK; int pud = flags & GPIO_PUD_MASK; + int ds_low = flags & GPIO_DS_LOW_MASK; + int ds_high = flags & GPIO_DS_HIGH_MASK; if (!pincfg) { return -EINVAL; } - if (direction == GPIO_DIR_OUT) { - *pincfg = STM32_MODER_OUTPUT_MODE; + /* pull-{up,down,float} */ + if (pud == GPIO_PUD_PULL_UP) { + *pincfg = STM32_PUPDR_PULL_UP; + } else if (pud == GPIO_PUD_PULL_DOWN) { + *pincfg = STM32_PUPDR_PULL_DOWN; } else { - /* pull-{up,down} maybe? */ - *pincfg = STM32_MODER_INPUT_MODE; - if (pud == GPIO_PUD_PULL_UP) { - *pincfg = *pincfg | STM32_PUPDR_PULL_UP; - } else if (pud == GPIO_PUD_PULL_DOWN) { - *pincfg = *pincfg | STM32_PUPDR_PULL_DOWN; + /* floating */ + *pincfg = STM32_PUPDR_NO_PULL; + } + + if (direction == GPIO_DIR_OUT) { + *pincfg = *pincfg | STM32_MODER_OUTPUT_MODE; + + if (ds_low == GPIO_DS_ALT_LOW || + ds_high == GPIO_DS_DISCONNECT_HIGH) { + *pincfg = *pincfg | STM32_OTYPER_OPEN_DRAIN; } else { - /* floating */ - *pincfg = *pincfg | STM32_PUPDR_NO_PULL; + *pincfg = *pincfg | STM32_OTYPER_PUSH_PULL; } + } else { + *pincfg = *pincfg | STM32_MODER_INPUT_MODE; } return 0; diff --git a/soc/arm/st_stm32/stm32f2/soc_gpio.c b/soc/arm/st_stm32/stm32f2/soc_gpio.c index cdd979a4309d0..1208ac1dab65e 100644 --- a/soc/arm/st_stm32/stm32f2/soc_gpio.c +++ b/soc/arm/st_stm32/stm32f2/soc_gpio.c @@ -26,24 +26,34 @@ int stm32_gpio_flags_to_conf(int flags, int *pincfg) { int direction = flags & GPIO_DIR_MASK; int pud = flags & GPIO_PUD_MASK; + int ds_low = flags & GPIO_DS_LOW_MASK; + int ds_high = flags & GPIO_DS_HIGH_MASK; if (!pincfg) { return -EINVAL; } - if (direction == GPIO_DIR_OUT) { - *pincfg = STM32_MODER_OUTPUT_MODE; + /* pull-{up,down,float} */ + if (pud == GPIO_PUD_PULL_UP) { + *pincfg = STM32_PUPDR_PULL_UP; + } else if (pud == GPIO_PUD_PULL_DOWN) { + *pincfg = STM32_PUPDR_PULL_DOWN; } else { - /* pull-{up,down} maybe? */ - *pincfg = STM32_MODER_INPUT_MODE; - if (pud == GPIO_PUD_PULL_UP) { - *pincfg = *pincfg | STM32_PUPDR_PULL_UP; - } else if (pud == GPIO_PUD_PULL_DOWN) { - *pincfg = *pincfg | STM32_PUPDR_PULL_DOWN; + /* floating */ + *pincfg = STM32_PUPDR_NO_PULL; + } + + if (direction == GPIO_DIR_OUT) { + *pincfg = *pincfg | STM32_MODER_OUTPUT_MODE; + + if (ds_low == GPIO_DS_ALT_LOW || + ds_high == GPIO_DS_DISCONNECT_HIGH) { + *pincfg = *pincfg | STM32_OTYPER_OPEN_DRAIN; } else { - /* floating */ - *pincfg = *pincfg | STM32_PUPDR_NO_PULL; + *pincfg = *pincfg | STM32_OTYPER_PUSH_PULL; } + } else { + *pincfg = *pincfg | STM32_MODER_INPUT_MODE; } return 0; diff --git a/soc/arm/st_stm32/stm32f3/soc_gpio.c b/soc/arm/st_stm32/stm32f3/soc_gpio.c index 0bbb9fed2038a..6cebfcd987a1a 100644 --- a/soc/arm/st_stm32/stm32f3/soc_gpio.c +++ b/soc/arm/st_stm32/stm32f3/soc_gpio.c @@ -27,25 +27,34 @@ int stm32_gpio_flags_to_conf(int flags, int *pincfg) { int direction = flags & GPIO_DIR_MASK; int pud = flags & GPIO_PUD_MASK; + int ds_low = flags & GPIO_DS_LOW_MASK; + int ds_high = flags & GPIO_DS_HIGH_MASK; if (!pincfg) { return -EINVAL; } - if (direction == GPIO_DIR_OUT) { - *pincfg = STM32_MODER_OUTPUT_MODE; + /* pull-{up,down,float} */ + if (pud == GPIO_PUD_PULL_UP) { + *pincfg = STM32_PUPDR_PULL_UP; + } else if (pud == GPIO_PUD_PULL_DOWN) { + *pincfg = STM32_PUPDR_PULL_DOWN; } else { - /* pull-{up,down} maybe? */ - *pincfg = STM32_MODER_INPUT_MODE; + /* floating */ + *pincfg = STM32_PUPDR_NO_PULL; + } - if (pud == GPIO_PUD_PULL_UP) { - *pincfg = *pincfg | STM32_PUPDR_PULL_UP; - } else if (pud == GPIO_PUD_PULL_DOWN) { - *pincfg = *pincfg | STM32_PUPDR_PULL_DOWN; + if (direction == GPIO_DIR_OUT) { + *pincfg = *pincfg | STM32_MODER_OUTPUT_MODE; + + if (ds_low == GPIO_DS_ALT_LOW || + ds_high == GPIO_DS_DISCONNECT_HIGH) { + *pincfg = *pincfg | STM32_OTYPER_OPEN_DRAIN; } else { - /* floating */ - *pincfg = *pincfg | STM32_PUPDR_NO_PULL; + *pincfg = *pincfg | STM32_OTYPER_PUSH_PULL; } + } else { + *pincfg = *pincfg | STM32_MODER_INPUT_MODE; } return 0; diff --git a/soc/arm/st_stm32/stm32f4/soc_gpio.c b/soc/arm/st_stm32/stm32f4/soc_gpio.c index 6134105f8701f..da68858b725f1 100644 --- a/soc/arm/st_stm32/stm32f4/soc_gpio.c +++ b/soc/arm/st_stm32/stm32f4/soc_gpio.c @@ -27,25 +27,34 @@ int stm32_gpio_flags_to_conf(int flags, int *pincfg) { int direction = flags & GPIO_DIR_MASK; int pud = flags & GPIO_PUD_MASK; + int ds_low = flags & GPIO_DS_LOW_MASK; + int ds_high = flags & GPIO_DS_HIGH_MASK; if (!pincfg) { return -EINVAL; } - if (direction == GPIO_DIR_OUT) { - *pincfg = STM32_MODER_OUTPUT_MODE; + /* pull-{up,down,float} */ + if (pud == GPIO_PUD_PULL_UP) { + *pincfg = STM32_PUPDR_PULL_UP; + } else if (pud == GPIO_PUD_PULL_DOWN) { + *pincfg = STM32_PUPDR_PULL_DOWN; } else { - /* pull-{up,down} maybe? */ - *pincfg = STM32_MODER_INPUT_MODE; + /* floating */ + *pincfg = STM32_PUPDR_NO_PULL; + } - if (pud == GPIO_PUD_PULL_UP) { - *pincfg = *pincfg | STM32_PUPDR_PULL_UP; - } else if (pud == GPIO_PUD_PULL_DOWN) { - *pincfg = *pincfg | STM32_PUPDR_PULL_DOWN; + if (direction == GPIO_DIR_OUT) { + *pincfg = *pincfg | STM32_MODER_OUTPUT_MODE; + + if (ds_low == GPIO_DS_ALT_LOW || + ds_high == GPIO_DS_DISCONNECT_HIGH) { + *pincfg = *pincfg | STM32_OTYPER_OPEN_DRAIN; } else { - /* floating */ - *pincfg = *pincfg | STM32_PUPDR_NO_PULL; + *pincfg = *pincfg | STM32_OTYPER_PUSH_PULL; } + } else { + *pincfg = *pincfg | STM32_MODER_INPUT_MODE; } return 0; diff --git a/soc/arm/st_stm32/stm32f7/soc_gpio.c b/soc/arm/st_stm32/stm32f7/soc_gpio.c index b2d690d14c09a..c75635cd25bca 100644 --- a/soc/arm/st_stm32/stm32f7/soc_gpio.c +++ b/soc/arm/st_stm32/stm32f7/soc_gpio.c @@ -27,25 +27,34 @@ int stm32_gpio_flags_to_conf(int flags, int *pincfg) { int direction = flags & GPIO_DIR_MASK; int pud = flags & GPIO_PUD_MASK; + int ds_low = flags & GPIO_DS_LOW_MASK; + int ds_high = flags & GPIO_DS_HIGH_MASK; if (!pincfg) { return -EINVAL; } - if (direction == GPIO_DIR_OUT) { - *pincfg = STM32_MODER_OUTPUT_MODE; + /* pull-{up,down,float} */ + if (pud == GPIO_PUD_PULL_UP) { + *pincfg = STM32_PUPDR_PULL_UP; + } else if (pud == GPIO_PUD_PULL_DOWN) { + *pincfg = STM32_PUPDR_PULL_DOWN; } else { - /* pull-{up,down} maybe? */ - *pincfg = STM32_MODER_INPUT_MODE; + /* floating */ + *pincfg = STM32_PUPDR_NO_PULL; + } - if (pud == GPIO_PUD_PULL_UP) { - *pincfg = *pincfg | STM32_PUPDR_PULL_UP; - } else if (pud == GPIO_PUD_PULL_DOWN) { - *pincfg = *pincfg | STM32_PUPDR_PULL_DOWN; + if (direction == GPIO_DIR_OUT) { + *pincfg = *pincfg | STM32_MODER_OUTPUT_MODE; + + if (ds_low == GPIO_DS_ALT_LOW || + ds_high == GPIO_DS_DISCONNECT_HIGH) { + *pincfg = *pincfg | STM32_OTYPER_OPEN_DRAIN; } else { - /* floating */ - *pincfg = *pincfg | STM32_PUPDR_NO_PULL; + *pincfg = *pincfg | STM32_OTYPER_PUSH_PULL; } + } else { + *pincfg = *pincfg | STM32_MODER_INPUT_MODE; } return 0; diff --git a/soc/arm/st_stm32/stm32l0/soc_gpio.c b/soc/arm/st_stm32/stm32l0/soc_gpio.c index b2812ad4d8775..a3983baa45020 100644 --- a/soc/arm/st_stm32/stm32l0/soc_gpio.c +++ b/soc/arm/st_stm32/stm32l0/soc_gpio.c @@ -26,24 +26,34 @@ int stm32_gpio_flags_to_conf(int flags, int *pincfg) { int direction = flags & GPIO_DIR_MASK; int pud = flags & GPIO_PUD_MASK; + int ds_low = flags & GPIO_DS_LOW_MASK; + int ds_high = flags & GPIO_DS_HIGH_MASK; if (!pincfg) { return -EINVAL; } - if (direction == GPIO_DIR_OUT) { - *pincfg = STM32_MODER_OUTPUT_MODE; + /* pull-{up,down,float} */ + if (pud == GPIO_PUD_PULL_UP) { + *pincfg = STM32_PUPDR_PULL_UP; + } else if (pud == GPIO_PUD_PULL_DOWN) { + *pincfg = STM32_PUPDR_PULL_DOWN; } else { - /* pull-{up,down} maybe? */ - *pincfg = STM32_MODER_INPUT_MODE; - if (pud == GPIO_PUD_PULL_UP) { - *pincfg = *pincfg | STM32_PUPDR_PULL_UP; - } else if (pud == GPIO_PUD_PULL_DOWN) { - *pincfg = *pincfg | STM32_PUPDR_PULL_DOWN; + /* floating */ + *pincfg = STM32_PUPDR_NO_PULL; + } + + if (direction == GPIO_DIR_OUT) { + *pincfg = *pincfg | STM32_MODER_OUTPUT_MODE; + + if (ds_low == GPIO_DS_ALT_LOW || + ds_high == GPIO_DS_DISCONNECT_HIGH) { + *pincfg = *pincfg | STM32_OTYPER_OPEN_DRAIN; } else { - /* floating */ - *pincfg = *pincfg | STM32_PUPDR_NO_PULL; + *pincfg = *pincfg | STM32_OTYPER_PUSH_PULL; } + } else { + *pincfg = *pincfg | STM32_MODER_INPUT_MODE; } return 0; diff --git a/soc/arm/st_stm32/stm32l4/soc_gpio.c b/soc/arm/st_stm32/stm32l4/soc_gpio.c index 60a202cace759..397e4b71b7b3e 100644 --- a/soc/arm/st_stm32/stm32l4/soc_gpio.c +++ b/soc/arm/st_stm32/stm32l4/soc_gpio.c @@ -53,25 +53,34 @@ int stm32_gpio_flags_to_conf(int flags, int *pincfg) { int direction = flags & GPIO_DIR_MASK; int pud = flags & GPIO_PUD_MASK; + int ds_low = flags & GPIO_DS_LOW_MASK; + int ds_high = flags & GPIO_DS_HIGH_MASK; if (!pincfg) { return -EINVAL; } - if (direction == GPIO_DIR_OUT) { - *pincfg = STM32_MODER_OUTPUT_MODE; + /* pull-{up,down,float} */ + if (pud == GPIO_PUD_PULL_UP) { + *pincfg = STM32_PUPDR_PULL_UP; + } else if (pud == GPIO_PUD_PULL_DOWN) { + *pincfg = STM32_PUPDR_PULL_DOWN; } else { - /* pull-{up,down} maybe? */ - *pincfg = STM32_MODER_INPUT_MODE; + /* floating */ + *pincfg = STM32_PUPDR_NO_PULL; + } - if (pud == GPIO_PUD_PULL_UP) { - *pincfg = *pincfg | STM32_PUPDR_PULL_UP; - } else if (pud == GPIO_PUD_PULL_DOWN) { - *pincfg = *pincfg | STM32_PUPDR_PULL_DOWN; + if (direction == GPIO_DIR_OUT) { + *pincfg = *pincfg | STM32_MODER_OUTPUT_MODE; + + if (ds_low == GPIO_DS_ALT_LOW || + ds_high == GPIO_DS_DISCONNECT_HIGH) { + *pincfg = *pincfg | STM32_OTYPER_OPEN_DRAIN; } else { - /* floating */ - *pincfg = *pincfg | STM32_PUPDR_NO_PULL; + *pincfg = *pincfg | STM32_OTYPER_PUSH_PULL; } + } else { + *pincfg = *pincfg | STM32_MODER_INPUT_MODE; } return 0;