Skip to content

Commit

Permalink
pinctrl: rockchip: find gpiochip by name from gpio module
Browse files Browse the repository at this point in the history
Currently the pinctrl device acts as parent for the gpio devices for
rockchip platform, the pinctrl driver probes first and then populate the
gpio platform lastly.

This patch makes the pinctrl to populate gpio platform firstly and then
do probe after gpio probed successfully. And get gpiochips througth a
find function by the gpio label.

Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>
  • Loading branch information
jayxurockchip authored and intel-lab-lkp committed Sep 16, 2022
1 parent 875e259 commit 3b7aea2
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 7 deletions.
36 changes: 30 additions & 6 deletions drivers/pinctrl/pinctrl-rockchip.c
Expand Up @@ -2453,7 +2453,7 @@ static int rockchip_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
{
struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
struct rockchip_pin_bank *bank = pin_to_bank(info, pin);
struct gpio_chip *gpio = &bank->gpio_chip;
struct gpio_chip *gpio = bank->gpio_chip;
enum pin_config_param param;
u32 arg;
int i;
Expand Down Expand Up @@ -2559,7 +2559,7 @@ static int rockchip_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
{
struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
struct rockchip_pin_bank *bank = pin_to_bank(info, pin);
struct gpio_chip *gpio = &bank->gpio_chip;
struct gpio_chip *gpio = bank->gpio_chip;
enum pin_config_param param = pinconf_to_config_param(*config);
u16 arg;
int rc;
Expand Down Expand Up @@ -3014,6 +3014,13 @@ static int __maybe_unused rockchip_pinctrl_resume(struct device *dev)
static SIMPLE_DEV_PM_OPS(rockchip_pinctrl_dev_pm_ops, rockchip_pinctrl_suspend,
rockchip_pinctrl_resume);

static int gpiochip_match_name(struct gpio_chip *gc, void *data)
{
const char *name = data;

return !strcmp(gc->label, name);
}

static int rockchip_pinctrl_probe(struct platform_device *pdev)
{
struct rockchip_pinctrl *info;
Expand All @@ -3022,11 +3029,15 @@ static int rockchip_pinctrl_probe(struct platform_device *pdev)
struct rockchip_pin_ctrl *ctrl;
struct resource *res;
void __iomem *base;
int ret;
int ret, i;

if (!dev->of_node)
return dev_err_probe(dev, -ENODEV, "device tree node not found\n");

ret = of_platform_populate(np, NULL, NULL, NULL);
if (ret)
return dev_err_probe(dev, ret, "failed to register gpio device\n");

info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
if (!info)
return -ENOMEM;
Expand Down Expand Up @@ -3084,10 +3095,23 @@ static int rockchip_pinctrl_probe(struct platform_device *pdev)
return ret;

platform_set_drvdata(pdev, info);
for (i = 0; i < ctrl->nr_banks; i++) {
struct gpio_chip *gc;
struct rockchip_pin_bank *bank = &ctrl->pin_banks[i];

ret = of_platform_populate(np, NULL, NULL, &pdev->dev);
if (ret)
return dev_err_probe(dev, ret, "failed to register gpio device\n");
gc = gpiochip_find((void *)ctrl->pin_banks[i].name, gpiochip_match_name);
if (!gc) {
dev_err(dev, "fail to find gpiochip\n");
return ret;
}

ret = gpiochip_add_pin_range(gc, dev_name(dev), 0, gc->base, gc->ngpio);
if (ret) {
dev_err(dev, "fail to add pin range\n");
return ret;
}
bank->gpio_chip = gc;
}

return 0;
}
Expand Down
2 changes: 1 addition & 1 deletion drivers/pinctrl/pinctrl-rockchip.h
Expand Up @@ -329,7 +329,7 @@ struct rockchip_pin_bank {
struct device_node *of_node;
struct rockchip_pinctrl *drvdata;
struct irq_domain *domain;
struct gpio_chip gpio_chip;
struct gpio_chip *gpio_chip;
struct pinctrl_gpio_range grange;
raw_spinlock_t slock;
const struct rockchip_gpio_regs *gpio_regs;
Expand Down

0 comments on commit 3b7aea2

Please sign in to comment.