gpio: syscon: do not report bogus error
authorEtienne Buira <etienne.buira@free.fr>
Mon, 20 May 2024 15:47:03 +0000 (17:47 +0200)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Wed, 29 May 2024 11:18:12 +0000 (13:18 +0200)
Do not issue "can't read the data register offset!" when gpio,syscon-dev
is not set albeit unneeded. gpio-syscon is used with rk3328 chip, but
this iomem region is documented in
Documentation/devicetree/bindings/gpio/rockchip,rk3328-grf-gpio.yaml and
does not require gpio,syscon-dev setting.

Signed-off-by: Etienne Buira <etienne.buira@free.fr>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/Zktwd4Y8zu6XSGaE@Z926fQmE5jqhFMgp6
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
drivers/gpio/gpio-syscon.c

index 6e1a2581e6aeb55c58cd5c720cab2fd62a6bb5f7..3a90a3a1caea1b48115bf70eaa9dafa42b1d420e 100644 (file)
@@ -208,6 +208,7 @@ static int syscon_gpio_probe(struct platform_device *pdev)
        struct syscon_gpio_priv *priv;
        struct device_node *np = dev->of_node;
        int ret;
+       bool use_parent_regmap = false;
 
        priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
        if (!priv)
@@ -216,24 +217,28 @@ static int syscon_gpio_probe(struct platform_device *pdev)
        priv->data = of_device_get_match_data(dev);
 
        priv->syscon = syscon_regmap_lookup_by_phandle(np, "gpio,syscon-dev");
-       if (IS_ERR(priv->syscon) && np->parent)
+       if (IS_ERR(priv->syscon) && np->parent) {
                priv->syscon = syscon_node_to_regmap(np->parent);
+               use_parent_regmap = true;
+       }
        if (IS_ERR(priv->syscon))
                return PTR_ERR(priv->syscon);
 
-       ret = of_property_read_u32_index(np, "gpio,syscon-dev", 1,
-                                        &priv->dreg_offset);
-       if (ret)
-               dev_err(dev, "can't read the data register offset!\n");
+       if (!use_parent_regmap) {
+               ret = of_property_read_u32_index(np, "gpio,syscon-dev", 1,
+                                                &priv->dreg_offset);
+               if (ret)
+                       dev_err(dev, "can't read the data register offset!\n");
 
-       priv->dreg_offset <<= 3;
+               priv->dreg_offset <<= 3;
 
-       ret = of_property_read_u32_index(np, "gpio,syscon-dev", 2,
-                                        &priv->dir_reg_offset);
-       if (ret)
-               dev_dbg(dev, "can't read the dir register offset!\n");
+               ret = of_property_read_u32_index(np, "gpio,syscon-dev", 2,
+                                                &priv->dir_reg_offset);
+               if (ret)
+                       dev_dbg(dev, "can't read the dir register offset!\n");
 
-       priv->dir_reg_offset <<= 3;
+               priv->dir_reg_offset <<= 3;
+       }
 
        priv->chip.parent = dev;
        priv->chip.owner = THIS_MODULE;