[PATCH 4/4] pinctrl: rockchip: register gpio driver before pinctrl driver
Jianqun Xu
jay.xu at rock-chips.com
Mon Mar 7 19:25:46 PST 2022
This patch should co-work with the gpio-rockchip driver patch, it
populates the gpio platform first and add gpio_chip after pinctrl
register.
Signed-off-by: Jianqun Xu <jay.xu at rock-chips.com>
---
drivers/pinctrl/pinctrl-rockchip.c | 29 ++++++++++++++++++++++++-----
1 file changed, 24 insertions(+), 5 deletions(-)
diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
index d8dd8415fa81..4c79df79017a 100644
--- a/drivers/pinctrl/pinctrl-rockchip.c
+++ b/drivers/pinctrl/pinctrl-rockchip.c
@@ -2666,6 +2666,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;
@@ -2674,7 +2681,7 @@ 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");
@@ -2683,6 +2690,10 @@ static int rockchip_pinctrl_probe(struct platform_device *pdev)
if (!info)
return -ENOMEM;
+ ret = of_platform_populate(np, NULL, NULL, NULL);
+ if (ret)
+ return dev_err_probe(dev, ret, "failed to register gpio device\n");
+
info->dev = dev;
ctrl = rockchip_pinctrl_get_soc_data(info, pdev);
@@ -2733,11 +2744,19 @@ static int rockchip_pinctrl_probe(struct platform_device *pdev)
if (ret)
return ret;
- platform_set_drvdata(pdev, info);
+ for (i = 0; i < ctrl->nr_banks; i++) {
+ struct gpio_chip *gc;
- 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);
+ 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;
+ }
+ }
+
+ platform_set_drvdata(pdev, info);
+ dev_info(dev, "probed %s\n", dev_name(dev));
return 0;
}
--
2.25.1
More information about the Linux-rockchip
mailing list