Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge patch series "gpiolib: acpi: Fix missing info filling"

Andy Shevchenko <andriy.shevchenko@linux.intel.com> says:

Kees reported that code, while being refactored, missed the point of
filling the info structure which supplies GPIO flags to the upper layer.
Indeed, without that part the GPIO expander get no IRQ on Intel Edison,
for example. Fix this in this series.

Link: https://lore.kernel.org/r/20250409132942.2550719-1-andriy.shevchenko@linux.intel.com
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

+20 -16
+20 -16
drivers/gpio/gpiolib-acpi.c
··· 743 743 } 744 744 745 745 struct acpi_gpio_lookup { 746 - struct acpi_gpio_info info; 747 746 struct acpi_gpio_params params; 747 + struct acpi_gpio_info *info; 748 748 struct gpio_desc *desc; 749 749 int n; 750 750 }; ··· 753 753 { 754 754 struct acpi_gpio_lookup *lookup = data; 755 755 struct acpi_gpio_params *params = &lookup->params; 756 + struct acpi_gpio_info *info = lookup->info; 756 757 757 758 if (ares->type != ACPI_RESOURCE_TYPE_GPIO) 758 759 return 1; ··· 764 763 struct gpio_desc *desc; 765 764 u16 pin_index; 766 765 767 - if (lookup->info.quirks & ACPI_GPIO_QUIRK_ONLY_GPIOIO && gpioint) 766 + if (info->quirks & ACPI_GPIO_QUIRK_ONLY_GPIOIO && gpioint) 768 767 params->crs_entry_index++; 769 768 770 769 if (lookup->n++ != params->crs_entry_index) ··· 774 773 if (pin_index >= agpio->pin_table_length) 775 774 return 1; 776 775 777 - if (lookup->info.quirks & ACPI_GPIO_QUIRK_ABSOLUTE_NUMBER) 776 + if (info->quirks & ACPI_GPIO_QUIRK_ABSOLUTE_NUMBER) 778 777 desc = gpio_to_desc(agpio->pin_table[pin_index]); 779 778 else 780 779 desc = acpi_get_gpiod(agpio->resource_source.string_ptr, 781 780 agpio->pin_table[pin_index]); 782 781 lookup->desc = desc; 783 - lookup->info.pin_config = agpio->pin_config; 784 - lookup->info.debounce = agpio->debounce_timeout; 785 - lookup->info.gpioint = gpioint; 786 - lookup->info.wake_capable = acpi_gpio_irq_is_wake(&lookup->info.adev->dev, agpio); 782 + info->pin_config = agpio->pin_config; 783 + info->debounce = agpio->debounce_timeout; 784 + info->gpioint = gpioint; 785 + info->wake_capable = acpi_gpio_irq_is_wake(&info->adev->dev, agpio); 787 786 788 787 /* 789 788 * Polarity and triggering are only specified for GpioInt ··· 792 791 * - ACPI_ACTIVE_LOW == GPIO_ACTIVE_LOW 793 792 * - ACPI_ACTIVE_HIGH == GPIO_ACTIVE_HIGH 794 793 */ 795 - if (lookup->info.gpioint) { 796 - lookup->info.polarity = agpio->polarity; 797 - lookup->info.triggering = agpio->triggering; 794 + if (info->gpioint) { 795 + info->polarity = agpio->polarity; 796 + info->triggering = agpio->triggering; 798 797 } else { 799 - lookup->info.polarity = params->active_low; 798 + info->polarity = params->active_low; 800 799 } 801 800 802 - lookup->info.flags = acpi_gpio_to_gpiod_flags(agpio, lookup->info.polarity); 801 + info->flags = acpi_gpio_to_gpiod_flags(agpio, info->polarity); 803 802 } 804 803 805 804 return 1; ··· 807 806 808 807 static int acpi_gpio_resource_lookup(struct acpi_gpio_lookup *lookup) 809 808 { 810 - struct acpi_device *adev = lookup->info.adev; 809 + struct acpi_gpio_info *info = lookup->info; 810 + struct acpi_device *adev = info->adev; 811 811 struct list_head res_list; 812 812 int ret; 813 813 ··· 833 831 { 834 832 struct fwnode_reference_args args; 835 833 struct acpi_gpio_params *params = &lookup->params; 834 + struct acpi_gpio_info *info = lookup->info; 836 835 unsigned int index = params->crs_entry_index; 837 836 unsigned int quirks = 0; 838 837 int ret; ··· 861 858 params->line_index = args.args[1]; 862 859 params->active_low = !!args.args[2]; 863 860 864 - lookup->info.adev = to_acpi_device_node(args.fwnode); 865 - lookup->info.quirks = quirks; 861 + info->adev = to_acpi_device_node(args.fwnode); 862 + info->quirks = quirks; 866 863 867 864 return 0; 868 865 } ··· 894 891 static int acpi_get_gpiod_by_index(struct acpi_device *adev, const char *propname, 895 892 struct acpi_gpio_lookup *lookup) 896 893 { 897 - struct acpi_gpio_info *info = &lookup->info; 898 894 struct acpi_gpio_params *params = &lookup->params; 895 + struct acpi_gpio_info *info = lookup->info; 899 896 int ret; 900 897 901 898 if (propname) { ··· 976 973 977 974 memset(&lookup, 0, sizeof(lookup)); 978 975 lookup.params.crs_entry_index = idx; 976 + lookup.info = info; 979 977 980 978 /* Try first from _DSD */ 981 979 for_each_gpio_property_name(propname, con_id) {