pinctrl: stm32: Update stm32_pinctrl_get_gpio_dev()

Due to gpio holes management, stm32_pinctrl_get_gpio_dev() must
be updated.

stm32_pinctrl_get_gpio_dev() returns from a given pin selectors
the corresponding bank gpio device and the gpio_offset inside this
gpio bank.

Update also all functions which makes usage of stm32_pinctrl_get_gpio_dev.

Signed-off-by: Patrice Chotard <patrice.chotard@st.com>
This commit is contained in:
Patrice Chotard 2018-12-03 10:52:54 +01:00 committed by Tom Rini
parent 8b6d45ab64
commit 530b63c228

View file

@ -28,8 +28,6 @@ struct stm32_gpio_bank {
#ifndef CONFIG_SPL_BUILD #ifndef CONFIG_SPL_BUILD
#define MAX_PIN_PER_BANK 16
static char pin_name[PINNAME_SIZE]; static char pin_name[PINNAME_SIZE];
#define PINMUX_MODE_COUNT 5 #define PINMUX_MODE_COUNT 5
static const char * const pinmux_mode[PINMUX_MODE_COUNT] = { static const char * const pinmux_mode[PINMUX_MODE_COUNT] = {
@ -116,12 +114,13 @@ static int stm32_pinctrl_get_pins_count(struct udevice *dev)
} }
static struct udevice *stm32_pinctrl_get_gpio_dev(struct udevice *dev, static struct udevice *stm32_pinctrl_get_gpio_dev(struct udevice *dev,
unsigned int selector) unsigned int selector,
unsigned int *idx)
{ {
struct stm32_pinctrl_priv *priv = dev_get_priv(dev); struct stm32_pinctrl_priv *priv = dev_get_priv(dev);
struct stm32_gpio_bank *gpio_bank; struct stm32_gpio_bank *gpio_bank;
struct gpio_dev_priv *uc_priv; struct gpio_dev_priv *uc_priv;
int first_pin = 0; int pin_count = 0;
if (list_empty(&priv->gpio_dev)) if (list_empty(&priv->gpio_dev))
stm32_populate_gpio_dev_list(dev); stm32_populate_gpio_dev_list(dev);
@ -130,11 +129,19 @@ static struct udevice *stm32_pinctrl_get_gpio_dev(struct udevice *dev,
list_for_each_entry(gpio_bank, &priv->gpio_dev, list) { list_for_each_entry(gpio_bank, &priv->gpio_dev, list) {
uc_priv = dev_get_uclass_priv(gpio_bank->gpio_dev); uc_priv = dev_get_uclass_priv(gpio_bank->gpio_dev);
if (selector < (first_pin + uc_priv->gpio_count)) if (selector < (pin_count + uc_priv->gpio_count)) {
/* we found the bank */ /*
return gpio_bank->gpio_dev; * we found the bank, convert pin selector to
* gpio bank index
*/
*idx = stm32_offset_to_index(gpio_bank->gpio_dev,
selector - pin_count);
if (*idx < 0)
return NULL;
first_pin += uc_priv->gpio_count; return gpio_bank->gpio_dev;
}
pin_count += uc_priv->gpio_count;
} }
return NULL; return NULL;
@ -145,9 +152,10 @@ static const char *stm32_pinctrl_get_pin_name(struct udevice *dev,
{ {
struct gpio_dev_priv *uc_priv; struct gpio_dev_priv *uc_priv;
struct udevice *gpio_dev; struct udevice *gpio_dev;
unsigned int gpio_idx;
/* look up for the bank which owns the requested pin */ /* look up for the bank which owns the requested pin */
gpio_dev = stm32_pinctrl_get_gpio_dev(dev, selector); gpio_dev = stm32_pinctrl_get_gpio_dev(dev, selector, &gpio_idx);
if (!gpio_dev) { if (!gpio_dev) {
snprintf(pin_name, PINNAME_SIZE, "Error"); snprintf(pin_name, PINNAME_SIZE, "Error");
} else { } else {
@ -155,7 +163,7 @@ static const char *stm32_pinctrl_get_pin_name(struct udevice *dev,
snprintf(pin_name, PINNAME_SIZE, "%s%d", snprintf(pin_name, PINNAME_SIZE, "%s%d",
uc_priv->bank_name, uc_priv->bank_name,
selector % MAX_PIN_PER_BANK); gpio_idx);
} }
return pin_name; return pin_name;
@ -168,23 +176,21 @@ static int stm32_pinctrl_get_pin_muxing(struct udevice *dev,
{ {
struct udevice *gpio_dev; struct udevice *gpio_dev;
const char *label; const char *label;
int gpio_pin;
int mode; int mode;
int af_num; int af_num;
unsigned int gpio_idx;
/* look up for the bank which owns the requested pin */ /* look up for the bank which owns the requested pin */
gpio_dev = stm32_pinctrl_get_gpio_dev(dev, selector); gpio_dev = stm32_pinctrl_get_gpio_dev(dev, selector, &gpio_idx);
if (!gpio_dev) if (!gpio_dev)
return -ENODEV; return -ENODEV;
/* translate pin-controller pin number to gpio pin number */ mode = gpio_get_raw_function(gpio_dev, gpio_idx, &label);
gpio_pin = selector % MAX_PIN_PER_BANK;
mode = gpio_get_raw_function(gpio_dev, gpio_pin, &label); dev_dbg(dev, "selector = %d gpio_idx = %d mode = %d\n",
selector, gpio_idx, mode);
dev_dbg(dev, "selector = %d gpio_pin = %d mode = %d\n",
selector, gpio_pin, mode);
switch (mode) { switch (mode) {
case GPIOF_UNKNOWN: case GPIOF_UNKNOWN:
@ -194,7 +200,7 @@ static int stm32_pinctrl_get_pin_muxing(struct udevice *dev,
snprintf(buf, size, "%s", pinmux_mode[mode]); snprintf(buf, size, "%s", pinmux_mode[mode]);
break; break;
case GPIOF_FUNC: case GPIOF_FUNC:
af_num = stm32_pinctrl_get_af(gpio_dev, gpio_pin); af_num = stm32_pinctrl_get_af(gpio_dev, gpio_idx);
snprintf(buf, size, "%s %d", pinmux_mode[mode], af_num); snprintf(buf, size, "%s %d", pinmux_mode[mode], af_num);
break; break;
case GPIOF_OUTPUT: case GPIOF_OUTPUT: