]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
gpio: tegra186: Support multi-socket devices
authorPrathamesh Shete <pshete@nvidia.com>
Tue, 17 Feb 2026 08:14:31 +0000 (08:14 +0000)
committerBartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Mon, 23 Feb 2026 09:39:33 +0000 (10:39 +0100)
On Tegra platforms, multiple SoC instances may be present with each
defining the same GPIO name. For such devices, this results in
duplicate GPIO names.

When the device has a valid NUMA node, prepend the NUMA node ID
to the GPIO name prefix. The node ID identifies each socket,
ensuring GPIO line names remain distinct across multiple sockets.

Signed-off-by: Prathamesh Shete <pshete@nvidia.com>
Acked-by: Thierry Reding <treding@nvidia.com>
Reviewed-by: Jon Hunter <jonathanh@nvidia.com>
Link: https://patch.msgid.link/20260217081431.1208351-2-pshete@nvidia.com
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
drivers/gpio/gpio-tegra186.c

index f04cc240b5ec5ce8c8379e74bcf18017bd0c2316..fb26402b6c4737e29ff5d71d94a13b51cb2bffd9 100644 (file)
@@ -857,7 +857,7 @@ static int tegra186_gpio_probe(struct platform_device *pdev)
        struct device_node *np;
        struct resource *res;
        char **names;
-       int err;
+       int node, err;
 
        gpio = devm_kzalloc(&pdev->dev, sizeof(*gpio), GFP_KERNEL);
        if (!gpio)
@@ -937,13 +937,23 @@ static int tegra186_gpio_probe(struct platform_device *pdev)
        if (!names)
                return -ENOMEM;
 
+       node = dev_to_node(&pdev->dev);
+
        for (i = 0, offset = 0; i < gpio->soc->num_ports; i++) {
                const struct tegra_gpio_port *port = &gpio->soc->ports[i];
                char *name;
 
                for (j = 0; j < port->pins; j++) {
-                       name = devm_kasprintf(gpio->gpio.parent, GFP_KERNEL, "%sP%s.%02x",
-                                             gpio->soc->prefix ?: "", port->name, j);
+                       if (node >= 0)
+                               name = devm_kasprintf(gpio->gpio.parent, GFP_KERNEL,
+                                                     "%d-%sP%s.%02x", node,
+                                                     gpio->soc->prefix ?: "",
+                                                     port->name, j);
+                       else
+                               name = devm_kasprintf(gpio->gpio.parent, GFP_KERNEL,
+                                                     "%sP%s.%02x",
+                                                     gpio->soc->prefix ?: "",
+                                                     port->name, j);
                        if (!name)
                                return -ENOMEM;