gpio: rockchip: get gpio bank from pinctrl device

Change-Id: I0dd2bc1b61bfdfe8edfd79b3a794522499eaae5c
Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>
This commit is contained in:
Jianqun Xu 2020-11-12 19:25:36 +08:00 committed by Jianhong Chen
parent e9c98b3baf
commit dbff1ed621
1 changed files with 40 additions and 19 deletions

View File

@ -10,6 +10,7 @@
#include <common.h> #include <common.h>
#include <dm.h> #include <dm.h>
#include <dm/of_access.h>
#include <syscon.h> #include <syscon.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <asm/gpio.h> #include <asm/gpio.h>
@ -18,9 +19,7 @@
#include <dm/pinctrl.h> #include <dm/pinctrl.h>
#include <dt-bindings/clock/rk3288-cru.h> #include <dt-bindings/clock/rk3288-cru.h>
enum { #include "../pinctrl/rockchip/pinctrl-rockchip.h"
ROCKCHIP_GPIOS_PER_BANK = 32,
};
#define OFFSET_TO_BIT(bit) (1UL << (bit)) #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 gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
struct rockchip_gpio_priv *priv = dev_get_priv(dev); struct rockchip_gpio_priv *priv = dev_get_priv(dev);
char *end; struct rockchip_pinctrl_priv *pctrl_priv;
int pins_num; struct rockchip_pin_bank *bank;
int ret; char *end = NULL;
static int gpio;
int id = -1, ret;
priv->regs = dev_read_addr_ptr(dev); priv->regs = dev_read_addr_ptr(dev);
ret = uclass_first_device_err(UCLASS_PINCTRL, &priv->pinctrl); 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; 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; return 0;
} }