History

Merge tag 'gpio-fixes-for-v6.17' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux

Pull gpio fixes from Bartosz Golaszewski: - allow looking up GPIOs by the secondary firmware node too - fix memory leak in gpio-regmap * tag 'gpio-fixes-for-v6.17' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux: gpio: regmap: fix memory leak of gpio_regmap structure gpiolib: Extend software-node support to support secondary software-nodes

Linus Torvalds committed 1 year ago

Commit df283702 parents 3a654ee 3bd44ed2 files · +20 −3Browse files

Unified · Split

2 files
  1. drivers/gpio/gpio-regmap.c +1 −1
  2. drivers/gpio/gpiolib.c +19 −2
drivers/gpio/gpio-regmap.c+1−1
@@ -274,7 +274,7 @@ struct gpio_regmap *gpio_regmap_register(const struct gpio_regmap_config *config · 273 unmodified lines
274274 if (!chip->ngpio) {
275275 ret = gpiochip_get_ngpios(chip, chip->parent);
276276 if (ret)
277− return ERR_PTR(ret);
277+ goto err_free_gpio;
278278 }
279279
280280 /* if not set, assume there is only one register */
drivers/gpio/gpiolib.c+19−2
@@ -4604,6 +4604,23 @@ static struct gpio_desc *gpiod_find_by_fwnode(struct fwnode_handle *fwnode, · 4603 unmodified lines
46044604 return desc;
46054605 }
46064606
4607+static struct gpio_desc *gpiod_fwnode_lookup(struct fwnode_handle *fwnode,
4608+ struct device *consumer,
4609+ const char *con_id,
4610+ unsigned int idx,
4611+ enum gpiod_flags *flags,
4612+ unsigned long *lookupflags)
4613+{
4614+ struct gpio_desc *desc;
4615+
4616+ desc = gpiod_find_by_fwnode(fwnode, consumer, con_id, idx, flags, lookupflags);
4617+ if (gpiod_not_found(desc) && !IS_ERR_OR_NULL(fwnode))
4618+ desc = gpiod_find_by_fwnode(fwnode->secondary, consumer, con_id,
4619+ idx, flags, lookupflags);
4620+
4621+ return desc;
4622+}
4623+
46074624 struct gpio_desc *gpiod_find_and_request(struct device *consumer,
46084625 struct fwnode_handle *fwnode,
46094626 const char *con_id,
@@ -4622,8 +4639,8 @@ struct gpio_desc *gpiod_find_and_request(struct device *consumer, · 12 unmodified lines
46224639 int ret = 0;
46234640
46244641 scoped_guard(srcu, &gpio_devices_srcu) {
4625− desc = gpiod_find_by_fwnode(fwnode, consumer, con_id, idx,
4626− &flags, &lookupflags);
4642+ desc = gpiod_fwnode_lookup(fwnode, consumer, con_id, idx,
4643+ &flags, &lookupflags);
46274644 if (gpiod_not_found(desc) && platform_lookup_allowed) {
46284645 /*
46294646 * Either we are not using DT or ACPI, or their lookup