gpiolib: put gpio_suffixes in a single compilation unit
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Wed, 12 Jun 2024 18:48:21 +0000 (20:48 +0200)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Fri, 14 Jun 2024 07:14:58 +0000 (09:14 +0200)
The gpio_suffixes array is defined in the gpiolib.h header. This means
the array is stored in .rodata of every compilation unit that includes
it. Put the definition for the array in gpiolib.c and export just the
symbol in the header. We need the size of the array so expose it too.

Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Link: https://lore.kernel.org/r/20240612184821.58053-1-brgl@bgdev.pl
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
drivers/gpio/gpiolib-acpi.c
drivers/gpio/gpiolib-of.c
drivers/gpio/gpiolib.c
drivers/gpio/gpiolib.h

index bb063b81cee6d0c79003649d773e7514f50173a0..69cd2be9c7f3b3a1e6cba8dd0c32985720f3ffd2 100644 (file)
@@ -976,7 +976,7 @@ __acpi_find_gpio(struct fwnode_handle *fwnode, const char *con_id, unsigned int
        int i;
 
        /* Try first from _DSD */
-       for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) {
+       for (i = 0; i < gpio_suffix_count; i++) {
                if (con_id) {
                        snprintf(propname, sizeof(propname), "%s-%s",
                                 con_id, gpio_suffixes[i]);
@@ -1453,7 +1453,7 @@ int acpi_gpio_count(const struct fwnode_handle *fwnode, const char *con_id)
        unsigned int i;
 
        /* Try first from _DSD */
-       for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) {
+       for (i = 0; i < gpio_suffix_count; i++) {
                if (con_id)
                        snprintf(propname, sizeof(propname), "%s-%s",
                                 con_id, gpio_suffixes[i]);
index d75f6ee370282eb3017993ec561ca35c85ff90a9..49d533df2cd9dbf394c6f3f07496300c4f54a37c 100644 (file)
@@ -103,7 +103,7 @@ int of_gpio_count(const struct fwnode_handle *fwnode, const char *con_id)
        if (ret > 0)
                return ret;
 
-       for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) {
+       for (i = 0; i < gpio_suffix_count; i++) {
                if (con_id)
                        snprintf(propname, sizeof(propname), "%s-%s",
                                 con_id, gpio_suffixes[i]);
@@ -676,7 +676,7 @@ struct gpio_desc *of_find_gpio(struct device_node *np, const char *con_id,
        unsigned int i;
 
        /* Try GPIO property "foo-gpios" and "foo-gpio" */
-       for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) {
+       for (i = 0; i < gpio_suffix_count; i++) {
                if (con_id)
                        snprintf(prop_name, sizeof(prop_name), "%s-%s", con_id,
                                 gpio_suffixes[i]);
index 0ec82ac7f0f489c21d33f09ccccd5d3c861a3b03..ed620442f32c4948d381241abdfcf37f49760e1b 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0
 
 #include <linux/acpi.h>
+#include <linux/array_size.h>
 #include <linux/bitmap.h>
 #include <linux/cleanup.h>
 #include <linux/compat.h>
@@ -89,6 +90,9 @@ DEFINE_STATIC_SRCU(gpio_devices_srcu);
 static DEFINE_MUTEX(gpio_machine_hogs_mutex);
 static LIST_HEAD(gpio_machine_hogs);
 
+const char *const gpio_suffixes[] = { "gpios", "gpio" };
+const size_t gpio_suffix_count = ARRAY_SIZE(gpio_suffixes);
+
 static void gpiochip_free_hogs(struct gpio_chip *gc);
 static int gpiochip_add_irqchip(struct gpio_chip *gc,
                                struct lock_class_key *lock_key,
index 48e086c2f4169dc8010f863237743ae82fe8a2fc..a75635891c6fe4a9e2d0d3cc4ed6e76da9dfc2da 100644 (file)
@@ -90,7 +90,8 @@ static inline struct gpio_device *to_gpio_device(struct device *dev)
 }
 
 /* gpio suffixes used for ACPI and device tree lookup */
-static __maybe_unused const char * const gpio_suffixes[] = { "gpios", "gpio" };
+extern const char *const gpio_suffixes[];
+extern const size_t gpio_suffix_count;
 
 /**
  * struct gpio_array - Opaque descriptor for a structure of GPIO array attributes