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

Configure Feed

Select the types of activity you want to include in your feed.

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

Pull gpio fixes from Bartosz Golaszewski:

- fix a potential Kconfig issue with gpio-mlxbf2 not selecting
GPIOLIB_IRQCHIP

- another immutable irqchip conversion, this time for gpio-vf610

- fix a wakeup issue on Clevo NH5xAx

* tag 'gpio-fixes-for-v6.2' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux:
gpio: mlxbf2: select GPIOLIB_IRQCHIP
gpiolib: acpi: Add a ignore wakeup quirk for Clevo NH5xAx
gpio: vf610: make irq_chip immutable
gpiolib: acpi: remove redundant declaration

+36 -19
+1
drivers/gpio/Kconfig
··· 1531 1531 tristate "Mellanox BlueField 2 SoC GPIO" 1532 1532 depends on (MELLANOX_PLATFORM && ARM64 && ACPI) || (64BIT && COMPILE_TEST) 1533 1533 select GPIO_GENERIC 1534 + select GPIOLIB_IRQCHIP 1534 1535 help 1535 1536 Say Y here if you want GPIO support on Mellanox BlueField 2 SoC. 1536 1537
+23 -18
drivers/gpio/gpio-vf610.c
··· 30 30 31 31 struct vf610_gpio_port { 32 32 struct gpio_chip gc; 33 - struct irq_chip ic; 34 33 void __iomem *base; 35 34 void __iomem *gpio_base; 36 35 const struct fsl_gpio_soc_data *sdata; ··· 206 207 207 208 static void vf610_gpio_irq_mask(struct irq_data *d) 208 209 { 209 - struct vf610_gpio_port *port = 210 - gpiochip_get_data(irq_data_get_irq_chip_data(d)); 211 - void __iomem *pcr_base = port->base + PORT_PCR(d->hwirq); 210 + struct gpio_chip *gc = irq_data_get_irq_chip_data(d); 211 + struct vf610_gpio_port *port = gpiochip_get_data(gc); 212 + irq_hw_number_t gpio_num = irqd_to_hwirq(d); 213 + void __iomem *pcr_base = port->base + PORT_PCR(gpio_num); 212 214 213 215 vf610_gpio_writel(0, pcr_base); 216 + gpiochip_disable_irq(gc, gpio_num); 214 217 } 215 218 216 219 static void vf610_gpio_irq_unmask(struct irq_data *d) 217 220 { 218 - struct vf610_gpio_port *port = 219 - gpiochip_get_data(irq_data_get_irq_chip_data(d)); 220 - void __iomem *pcr_base = port->base + PORT_PCR(d->hwirq); 221 + struct gpio_chip *gc = irq_data_get_irq_chip_data(d); 222 + struct vf610_gpio_port *port = gpiochip_get_data(gc); 223 + irq_hw_number_t gpio_num = irqd_to_hwirq(d); 224 + void __iomem *pcr_base = port->base + PORT_PCR(gpio_num); 221 225 222 - vf610_gpio_writel(port->irqc[d->hwirq] << PORT_PCR_IRQC_OFFSET, 226 + gpiochip_enable_irq(gc, gpio_num); 227 + vf610_gpio_writel(port->irqc[gpio_num] << PORT_PCR_IRQC_OFFSET, 223 228 pcr_base); 224 229 } 225 230 ··· 240 237 return 0; 241 238 } 242 239 240 + static const struct irq_chip vf610_irqchip = { 241 + .name = "gpio-vf610", 242 + .irq_ack = vf610_gpio_irq_ack, 243 + .irq_mask = vf610_gpio_irq_mask, 244 + .irq_unmask = vf610_gpio_irq_unmask, 245 + .irq_set_type = vf610_gpio_irq_set_type, 246 + .irq_set_wake = vf610_gpio_irq_set_wake, 247 + .flags = IRQCHIP_IMMUTABLE, 248 + GPIOCHIP_IRQ_RESOURCE_HELPERS, 249 + }; 250 + 243 251 static void vf610_gpio_disable_clk(void *data) 244 252 { 245 253 clk_disable_unprepare(data); ··· 263 249 struct vf610_gpio_port *port; 264 250 struct gpio_chip *gc; 265 251 struct gpio_irq_chip *girq; 266 - struct irq_chip *ic; 267 252 int i; 268 253 int ret; 269 254 ··· 328 315 gc->direction_output = vf610_gpio_direction_output; 329 316 gc->set = vf610_gpio_set; 330 317 331 - ic = &port->ic; 332 - ic->name = "gpio-vf610"; 333 - ic->irq_ack = vf610_gpio_irq_ack; 334 - ic->irq_mask = vf610_gpio_irq_mask; 335 - ic->irq_unmask = vf610_gpio_irq_unmask; 336 - ic->irq_set_type = vf610_gpio_irq_set_type; 337 - ic->irq_set_wake = vf610_gpio_irq_set_wake; 338 - 339 318 /* Mask all GPIO interrupts */ 340 319 for (i = 0; i < gc->ngpio; i++) 341 320 vf610_gpio_writel(0, port->base + PORT_PCR(i)); ··· 336 331 vf610_gpio_writel(~0, port->base + PORT_ISFR); 337 332 338 333 girq = &gc->irq; 339 - girq->chip = ic; 334 + gpio_irq_chip_set_chip(girq, &vf610_irqchip); 340 335 girq->parent_handler = vf610_gpio_irq_handler; 341 336 girq->num_parents = 1; 342 337 girq->parents = devm_kcalloc(&pdev->dev, 1,
+12
drivers/gpio/gpiolib-acpi.c
··· 1637 1637 .ignore_wake = "ELAN0415:00@9", 1638 1638 }, 1639 1639 }, 1640 + { 1641 + /* 1642 + * Spurious wakeups from TP_ATTN# pin 1643 + * Found in BIOS 1.7.7 1644 + */ 1645 + .matches = { 1646 + DMI_MATCH(DMI_BOARD_NAME, "NH5xAx"), 1647 + }, 1648 + .driver_data = &(struct acpi_gpiolib_dmi_quirk) { 1649 + .ignore_wake = "SYNA1202:00@16", 1650 + }, 1651 + }, 1640 1652 {} /* Terminating entry */ 1641 1653 }; 1642 1654
-1
drivers/gpio/gpiolib-acpi.h
··· 14 14 15 15 #include <linux/gpio/consumer.h> 16 16 17 - struct acpi_device; 18 17 struct device; 19 18 struct fwnode_handle; 20 19