mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 20:54:03 +02:00
gpio fixes for v7.3-rc4
- fix fwnode reference leak on failure in shared GPIO handling - fix regression in OF_POPULATED logic after the unification of GPIO hog handling between OF, ACPI and machine variants - don't call free_irq() if no IRQ is installed in gpio-virtuser -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEkeUTLeW1Rh17omX8BZ0uy/82hMMFAmqrs8YACgkQBZ0uy/82 hMPTsw/+Jm+8Z0tuCuryhBsDwMiqS4Gnr8TahCO3aB3UyMqApkiTS+hlqWGMRWbF Np07I4uu3ca6ohutKN/RN6K5hrjlJz6FhU1kliJ9RrK1a3bjLH4rbYoXBVsYeIpC mjLx9lyt6RmS4RaHPV75xPEmsAdxWbMyar6SQfiZT2t96Czsrph/VggX9kMbnXt3 SgKTM5SyHrKmw4DgnQmZ4OcWt8p2edW+5DO+jxRmPlWUvYE/q91yemaedw5wBEoz ftrvbuIr+JRKKOSugjbswwBbJ0pVUkMm+hwkyAfWSPp83aF+sm2rUB46Gkr6tfQ7 oJVqVewAV6vqW/XoAnB8vr2KO3As5HFEx8xLYZpEf9RlOIDsu8R3HOooFkvO0flP EsQSFccdX4WEHZoSc81iJl/TJjoM2gJtBZqqOvkHr2RZ7zdKPcnW81VHJGkSyZiW o70PMzcQ+FAu7I/o5Q+cqsw1eG68wHhRYZG0q38mJCRznjlEop9yBqCAx3yi+1mF cIhB37FlfRkFYGXByrqUFhi9V8gHWdDTChIQFJBMx1c99mBpT/eHD2hbGmac42LP QI4sbywoN6L3m+UJpuJwS7KoO4NtJaVN444nqnS5C8bxBGRdXV3JQHelzwhSSED9 cq+MyMQm5hjS+i6SrADGGg+PytUF9w5Z7yRq2LFNUFwcS0TaHpk= =NiRo -----END PGP SIGNATURE----- Merge tag 'gpio-fixes-for-v7.3-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux Pull gpio fixes from Bartosz Golaszewski: - fix fwnode reference leak on failure in shared GPIO handling - fix regression in OF_POPULATED logic after the unification of GPIO hog handling between OF, ACPI and machine variants - don't call free_irq() if no IRQ is installed in gpio-virtuser * tag 'gpio-fixes-for-v7.3-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux: gpio: virtuser: skip free_irq when no IRQ is installed gpiolib: of: don't mark hog nodes OF_POPULATED before a chip is found gpiolib: Put fwnode reference on failure
This commit is contained in:
commit
61cc777ca7
|
|
@ -692,7 +692,8 @@ static int gpio_virtuser_interrupts_set(void *data, u64 val)
|
|||
atomic_set(&ld->irq, irq);
|
||||
} else {
|
||||
irq = atomic_xchg(&ld->irq, 0);
|
||||
free_irq(irq, ld);
|
||||
if (irq)
|
||||
free_irq(irq, ld);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -788,13 +788,13 @@ static int of_gpio_notify(struct notifier_block *nb, unsigned long action,
|
|||
if (!of_property_read_bool(rd->dn, "gpio-hog"))
|
||||
return NOTIFY_DONE; /* not for us */
|
||||
|
||||
if (of_node_test_and_set_flag(rd->dn, OF_POPULATED))
|
||||
return NOTIFY_DONE;
|
||||
|
||||
gdev = of_find_gpio_device_by_node(rd->dn->parent);
|
||||
if (!gdev)
|
||||
return NOTIFY_DONE; /* not for us */
|
||||
|
||||
if (of_node_test_and_set_flag(rd->dn, OF_POPULATED))
|
||||
return NOTIFY_DONE;
|
||||
|
||||
ret = gpiochip_add_hog(gpio_device_get_chip(gdev), of_fwnode_handle(rd->dn));
|
||||
if (ret < 0) {
|
||||
pr_err("%s: failed to add hogs for %pOF\n", __func__,
|
||||
|
|
|
|||
|
|
@ -261,10 +261,13 @@ static int gpio_shared_of_traverse(struct device_node *curr)
|
|||
con_id[con_id_len - suffix_len] = '\0';
|
||||
}
|
||||
|
||||
ref = gpio_shared_make_ref(fwnode_handle_get(of_fwnode_handle(curr)),
|
||||
con_id, args.args[1]);
|
||||
if (!ref)
|
||||
struct fwnode_handle *curr_fwnode =
|
||||
fwnode_handle_get(of_fwnode_handle(curr));
|
||||
ref = gpio_shared_make_ref(curr_fwnode, con_id, args.args[1]);
|
||||
if (!ref) {
|
||||
fwnode_handle_put(curr_fwnode);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (!list_empty(&entry->refs))
|
||||
pr_debug("GPIO %u at %s is shared by multiple firmware nodes\n",
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user