From dbff1ed621b616f4155d1f2bf4881a86dcd51e4a Mon Sep 17 00:00:00 2001 From: Jianqun Xu Date: Thu, 12 Nov 2020 19:25:36 +0800 Subject: [PATCH] gpio: rockchip: get gpio bank from pinctrl device Change-Id: I0dd2bc1b61bfdfe8edfd79b3a794522499eaae5c Signed-off-by: Jianqun Xu --- drivers/gpio/rk_gpio.c | 59 ++++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/drivers/gpio/rk_gpio.c b/drivers/gpio/rk_gpio.c index 1b1de01f19..e889f0bf7b 100644 --- a/drivers/gpio/rk_gpio.c +++ b/drivers/gpio/rk_gpio.c @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -18,9 +19,7 @@ #include #include -enum { - ROCKCHIP_GPIOS_PER_BANK = 32, -}; +#include "../pinctrl/rockchip/pinctrl-rockchip.h" #define OFFSET_TO_BIT(bit) (1UL << (bit)) @@ -128,28 +127,50 @@ static int rockchip_gpio_probe(struct udevice *dev) { struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev); struct rockchip_gpio_priv *priv = dev_get_priv(dev); - char *end; - int pins_num; - int ret; + struct rockchip_pinctrl_priv *pctrl_priv; + struct rockchip_pin_bank *bank; + char *end = NULL; + static int gpio; + int id = -1, ret; priv->regs = dev_read_addr_ptr(dev); ret = uclass_first_device_err(UCLASS_PINCTRL, &priv->pinctrl); - if (ret) + if (ret) { + dev_err(dev, "failed to get pinctrl device %d\n", ret); return ret; - - uc_priv->gpio_count = ROCKCHIP_GPIOS_PER_BANK; - end = strrchr(dev->name, '@'); - priv->bank = trailing_strtoln(dev->name, end); - priv->name[0] = 'A' + priv->bank; - uc_priv->bank_name = priv->name; - - pins_num = pinctrl_get_pins_count(priv->pinctrl); - if (pins_num <= 0) { - printf("%s: fail to get pins from pinctrl\n", __func__); - } else if ((priv->bank + 1) * ROCKCHIP_GPIOS_PER_BANK >= pins_num) { - uc_priv->gpio_count = pins_num - priv->bank * ROCKCHIP_GPIOS_PER_BANK; } + pctrl_priv = dev_get_priv(priv->pinctrl); + if (!pctrl_priv) { + dev_err(dev, "failed to get pinctrl priv\n"); + return -EINVAL; + } + + end = strrchr(dev->name, '@'); + if (end) + id = trailing_strtoln(dev->name, end); + else + dev_read_alias_seq(dev, &id); + + if (id < 0) + id = gpio++; + + if (id >= pctrl_priv->ctrl->nr_banks) { + dev_err(dev, "bank id invalid\n"); + return -EINVAL; + } + + bank = &pctrl_priv->ctrl->pin_banks[id]; + if (bank->bank_num != id) { + dev_err(dev, "bank id mismatch with pinctrl\n"); + return -EINVAL; + } + + priv->bank = bank->bank_num; + uc_priv->gpio_count = bank->nr_pins; + uc_priv->gpio_base = bank->pin_base; + uc_priv->bank_name = bank->name; + return 0; }