aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio/gpiolib.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpio/gpiolib.c')
-rw-r--r--drivers/gpio/gpiolib.c78
1 files changed, 47 insertions, 31 deletions
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 4e10b10d3ddd..85f772c0b26a 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -14,6 +14,7 @@
14#include <linux/idr.h> 14#include <linux/idr.h>
15#include <linux/slab.h> 15#include <linux/slab.h>
16#include <linux/acpi.h> 16#include <linux/acpi.h>
17#include <linux/gpio/driver.h>
17 18
18#define CREATE_TRACE_POINTS 19#define CREATE_TRACE_POINTS
19#include <trace/events/gpio.h> 20#include <trace/events/gpio.h>
@@ -1308,6 +1309,18 @@ struct gpio_chip *gpiochip_find(void *data,
1308} 1309}
1309EXPORT_SYMBOL_GPL(gpiochip_find); 1310EXPORT_SYMBOL_GPL(gpiochip_find);
1310 1311
1312static int gpiochip_match_name(struct gpio_chip *chip, void *data)
1313{
1314 const char *name = data;
1315
1316 return !strcmp(chip->label, name);
1317}
1318
1319static struct gpio_chip *find_chip_by_name(const char *name)
1320{
1321 return gpiochip_find((void *)name, gpiochip_match_name);
1322}
1323
1311#ifdef CONFIG_PINCTRL 1324#ifdef CONFIG_PINCTRL
1312 1325
1313/** 1326/**
@@ -1341,8 +1354,10 @@ int gpiochip_add_pingroup_range(struct gpio_chip *chip,
1341 ret = pinctrl_get_group_pins(pctldev, pin_group, 1354 ret = pinctrl_get_group_pins(pctldev, pin_group,
1342 &pin_range->range.pins, 1355 &pin_range->range.pins,
1343 &pin_range->range.npins); 1356 &pin_range->range.npins);
1344 if (ret < 0) 1357 if (ret < 0) {
1358 kfree(pin_range);
1345 return ret; 1359 return ret;
1360 }
1346 1361
1347 pinctrl_add_gpio_range(pctldev, &pin_range->range); 1362 pinctrl_add_gpio_range(pctldev, &pin_range->range);
1348 1363
@@ -2260,26 +2275,10 @@ void gpiod_add_table(struct gpiod_lookup *table, size_t size)
2260 mutex_unlock(&gpio_lookup_lock); 2275 mutex_unlock(&gpio_lookup_lock);
2261} 2276}
2262 2277
2263/*
2264 * Caller must have a acquired gpio_lookup_lock
2265 */
2266static struct gpio_chip *find_chip_by_name(const char *name)
2267{
2268 struct gpio_chip *chip = NULL;
2269
2270 list_for_each_entry(chip, &gpio_lookup_list, list) {
2271 if (chip->label == NULL)
2272 continue;
2273 if (!strcmp(chip->label, name))
2274 break;
2275 }
2276
2277 return chip;
2278}
2279
2280#ifdef CONFIG_OF 2278#ifdef CONFIG_OF
2281static struct gpio_desc *of_find_gpio(struct device *dev, const char *con_id, 2279static struct gpio_desc *of_find_gpio(struct device *dev, const char *con_id,
2282 unsigned int idx, unsigned long *flags) 2280 unsigned int idx,
2281 enum gpio_lookup_flags *flags)
2283{ 2282{
2284 char prop_name[32]; /* 32 is max size of property name */ 2283 char prop_name[32]; /* 32 is max size of property name */
2285 enum of_gpio_flags of_flags; 2284 enum of_gpio_flags of_flags;
@@ -2297,20 +2296,22 @@ static struct gpio_desc *of_find_gpio(struct device *dev, const char *con_id,
2297 return desc; 2296 return desc;
2298 2297
2299 if (of_flags & OF_GPIO_ACTIVE_LOW) 2298 if (of_flags & OF_GPIO_ACTIVE_LOW)
2300 *flags |= GPIOF_ACTIVE_LOW; 2299 *flags |= GPIO_ACTIVE_LOW;
2301 2300
2302 return desc; 2301 return desc;
2303} 2302}
2304#else 2303#else
2305static struct gpio_desc *of_find_gpio(struct device *dev, const char *con_id, 2304static struct gpio_desc *of_find_gpio(struct device *dev, const char *con_id,
2306 unsigned int idx, unsigned long *flags) 2305 unsigned int idx,
2306 enum gpio_lookup_flags *flags)
2307{ 2307{
2308 return ERR_PTR(-ENODEV); 2308 return ERR_PTR(-ENODEV);
2309} 2309}
2310#endif 2310#endif
2311 2311
2312static struct gpio_desc *acpi_find_gpio(struct device *dev, const char *con_id, 2312static struct gpio_desc *acpi_find_gpio(struct device *dev, const char *con_id,
2313 unsigned int idx, unsigned long *flags) 2313 unsigned int idx,
2314 enum gpio_lookup_flags *flags)
2314{ 2315{
2315 struct acpi_gpio_info info; 2316 struct acpi_gpio_info info;
2316 struct gpio_desc *desc; 2317 struct gpio_desc *desc;
@@ -2320,13 +2321,14 @@ static struct gpio_desc *acpi_find_gpio(struct device *dev, const char *con_id,
2320 return desc; 2321 return desc;
2321 2322
2322 if (info.gpioint && info.active_low) 2323 if (info.gpioint && info.active_low)
2323 *flags |= GPIOF_ACTIVE_LOW; 2324 *flags |= GPIO_ACTIVE_LOW;
2324 2325
2325 return desc; 2326 return desc;
2326} 2327}
2327 2328
2328static struct gpio_desc *gpiod_find(struct device *dev, const char *con_id, 2329static struct gpio_desc *gpiod_find(struct device *dev, const char *con_id,
2329 unsigned int idx, unsigned long *flags) 2330 unsigned int idx,
2331 enum gpio_lookup_flags *flags)
2330{ 2332{
2331 const char *dev_id = dev ? dev_name(dev) : NULL; 2333 const char *dev_id = dev ? dev_name(dev) : NULL;
2332 struct gpio_desc *desc = ERR_PTR(-ENODEV); 2334 struct gpio_desc *desc = ERR_PTR(-ENODEV);
@@ -2366,7 +2368,7 @@ static struct gpio_desc *gpiod_find(struct device *dev, const char *con_id,
2366 continue; 2368 continue;
2367 } 2369 }
2368 2370
2369 if (chip->ngpio >= p->chip_hwnum) { 2371 if (chip->ngpio <= p->chip_hwnum) {
2370 dev_warn(dev, "GPIO chip %s has %d GPIOs\n", 2372 dev_warn(dev, "GPIO chip %s has %d GPIOs\n",
2371 chip->label, chip->ngpio); 2373 chip->label, chip->ngpio);
2372 continue; 2374 continue;
@@ -2416,9 +2418,9 @@ struct gpio_desc *__must_check gpiod_get_index(struct device *dev,
2416 const char *con_id, 2418 const char *con_id,
2417 unsigned int idx) 2419 unsigned int idx)
2418{ 2420{
2419 struct gpio_desc *desc; 2421 struct gpio_desc *desc = NULL;
2420 int status; 2422 int status;
2421 unsigned long flags = 0; 2423 enum gpio_lookup_flags flags = 0;
2422 2424
2423 dev_dbg(dev, "GPIO lookup for consumer %s\n", con_id); 2425 dev_dbg(dev, "GPIO lookup for consumer %s\n", con_id);
2424 2426
@@ -2429,13 +2431,23 @@ struct gpio_desc *__must_check gpiod_get_index(struct device *dev,
2429 } else if (IS_ENABLED(CONFIG_ACPI) && dev && ACPI_HANDLE(dev)) { 2431 } else if (IS_ENABLED(CONFIG_ACPI) && dev && ACPI_HANDLE(dev)) {
2430 dev_dbg(dev, "using ACPI for GPIO lookup\n"); 2432 dev_dbg(dev, "using ACPI for GPIO lookup\n");
2431 desc = acpi_find_gpio(dev, con_id, idx, &flags); 2433 desc = acpi_find_gpio(dev, con_id, idx, &flags);
2432 } else { 2434 }
2435
2436 /*
2437 * Either we are not using DT or ACPI, or their lookup did not return
2438 * a result. In that case, use platform lookup as a fallback.
2439 */
2440 if (!desc || IS_ERR(desc)) {
2441 struct gpio_desc *pdesc;
2433 dev_dbg(dev, "using lookup tables for GPIO lookup"); 2442 dev_dbg(dev, "using lookup tables for GPIO lookup");
2434 desc = gpiod_find(dev, con_id, idx, &flags); 2443 pdesc = gpiod_find(dev, con_id, idx, &flags);
2444 /* If used as fallback, do not replace the previous error */
2445 if (!IS_ERR(pdesc) || !desc)
2446 desc = pdesc;
2435 } 2447 }
2436 2448
2437 if (IS_ERR(desc)) { 2449 if (IS_ERR(desc)) {
2438 dev_warn(dev, "lookup for GPIO %s failed\n", con_id); 2450 dev_dbg(dev, "lookup for GPIO %s failed\n", con_id);
2439 return desc; 2451 return desc;
2440 } 2452 }
2441 2453
@@ -2444,8 +2456,12 @@ struct gpio_desc *__must_check gpiod_get_index(struct device *dev,
2444 if (status < 0) 2456 if (status < 0)
2445 return ERR_PTR(status); 2457 return ERR_PTR(status);
2446 2458
2447 if (flags & GPIOF_ACTIVE_LOW) 2459 if (flags & GPIO_ACTIVE_LOW)
2448 set_bit(FLAG_ACTIVE_LOW, &desc->flags); 2460 set_bit(FLAG_ACTIVE_LOW, &desc->flags);
2461 if (flags & GPIO_OPEN_DRAIN)
2462 set_bit(FLAG_OPEN_DRAIN, &desc->flags);
2463 if (flags & GPIO_OPEN_SOURCE)
2464 set_bit(FLAG_OPEN_SOURCE, &desc->flags);
2449 2465
2450 return desc; 2466 return desc;
2451} 2467}