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

Merge branch irq/parent_device into irq/irqchip-next

* irq/parent_device:
: .
: Move irq_chip::parent_device to irq_domain::dev to track the
: PM state of the device implementing the irqchip.
: .
genirq: Kill irq_chip::parent_device
pinctrl: starfive: Move PM device over to irq domain
pinctrl: npcm: Fix broken references to chip->parent_device
gpio: tpmx86: Move PM device over to irq domain
gpio: rcar: Move PM device over to irq domain
gpio: omap: Move PM device over to irq domain
gpio: mt7621: Kill parent_device usage
irqchip/imx-intmux: Move PM device over to irq domain
irqchip/renesas-irqc: Move PM device over to irq domain
irqchip/renesas-intc-irqpin: Move PM device over to irq domain
irqchip/gic: Move PM device over to irq domain
genirq: Allow the PM device to originate from irq domain

Signed-off-by: Marc Zyngier <maz@kernel.org>

+59 -40
-1
drivers/gpio/gpio-mt7621.c
··· 239 239 240 240 rg->chip.offset = bank * MTK_BANK_WIDTH; 241 241 rg->irq_chip.name = dev_name(dev); 242 - rg->irq_chip.parent_device = dev; 243 242 rg->irq_chip.irq_unmask = mediatek_gpio_irq_unmask; 244 243 rg->irq_chip.irq_mask = mediatek_gpio_irq_mask; 245 244 rg->irq_chip.irq_mask_ack = mediatek_gpio_irq_mask;
+4 -3
drivers/gpio/gpio-omap.c
··· 986 986 writel_relaxed(0, base + bank->regs->ctrl); 987 987 } 988 988 989 - static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc) 989 + static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc, 990 + struct device *pm_dev) 990 991 { 991 992 struct gpio_irq_chip *irq; 992 993 static int gpio; ··· 1053 1052 if (ret) 1054 1053 return dev_err_probe(bank->chip.parent, ret, "Could not register gpio chip\n"); 1055 1054 1055 + irq_domain_set_pm_device(bank->chip.irq.domain, pm_dev); 1056 1056 ret = devm_request_irq(bank->chip.parent, bank->irq, 1057 1057 omap_gpio_irq_handler, 1058 1058 0, dev_name(bank->chip.parent), bank); ··· 1404 1402 irqc->irq_bus_sync_unlock = gpio_irq_bus_sync_unlock, 1405 1403 irqc->name = dev_name(&pdev->dev); 1406 1404 irqc->flags = IRQCHIP_MASK_ON_SUSPEND; 1407 - irqc->parent_device = dev; 1408 1405 1409 1406 bank->irq = platform_get_irq(pdev, 0); 1410 1407 if (bank->irq <= 0) { ··· 1467 1466 1468 1467 omap_gpio_mod_init(bank); 1469 1468 1470 - ret = omap_gpio_chip_init(bank, irqc); 1469 + ret = omap_gpio_chip_init(bank, irqc, dev); 1471 1470 if (ret) { 1472 1471 pm_runtime_put_sync(dev); 1473 1472 pm_runtime_disable(dev);
+1 -1
drivers/gpio/gpio-rcar.c
··· 530 530 531 531 irq_chip = &p->irq_chip; 532 532 irq_chip->name = "gpio-rcar"; 533 - irq_chip->parent_device = dev; 534 533 irq_chip->irq_mask = gpio_rcar_irq_disable; 535 534 irq_chip->irq_unmask = gpio_rcar_irq_enable; 536 535 irq_chip->irq_set_type = gpio_rcar_irq_set_type; ··· 551 552 goto err0; 552 553 } 553 554 555 + irq_domain_set_pm_device(gpio_chip->irq.domain, dev); 554 556 ret = devm_request_irq(dev, p->irq_parent, gpio_rcar_irq_handler, 555 557 IRQF_SHARED, name, p); 556 558 if (ret) {
+2 -1
drivers/gpio/gpio-tqmx86.c
··· 281 281 u8 irq_status; 282 282 283 283 irq_chip->name = chip->label; 284 - irq_chip->parent_device = &pdev->dev; 285 284 irq_chip->irq_mask = tqmx86_gpio_irq_mask; 286 285 irq_chip->irq_unmask = tqmx86_gpio_irq_unmask; 287 286 irq_chip->irq_set_type = tqmx86_gpio_irq_set_type; ··· 314 315 dev_err(dev, "Could not register GPIO chip\n"); 315 316 goto out_pm_dis; 316 317 } 318 + 319 + irq_domain_set_pm_device(girq->domain, dev); 317 320 318 321 dev_info(dev, "GPIO functionality initialized with %d pins\n", 319 322 chip->ngpio);
+6 -6
drivers/irqchip/irq-gic.c
··· 1127 1127 .unmap = gic_irq_domain_unmap, 1128 1128 }; 1129 1129 1130 - static void gic_init_chip(struct gic_chip_data *gic, struct device *dev, 1131 - const char *name, bool use_eoimode1) 1130 + static void gic_init_chip(struct gic_chip_data *gic, const char *name, 1131 + bool use_eoimode1) 1132 1132 { 1133 1133 /* Initialize irq_chip */ 1134 1134 gic->chip = gic_chip; 1135 1135 gic->chip.name = name; 1136 - gic->chip.parent_device = dev; 1137 1136 1138 1137 if (use_eoimode1) { 1139 1138 gic->chip.irq_mask = gic_eoimode1_mask_irq; ··· 1267 1268 1268 1269 if (static_branch_likely(&supports_deactivate_key) && gic == &gic_data[0]) { 1269 1270 name = kasprintf(GFP_KERNEL, "GICv2"); 1270 - gic_init_chip(gic, NULL, name, true); 1271 + gic_init_chip(gic, name, true); 1271 1272 } else { 1272 1273 name = kasprintf(GFP_KERNEL, "GIC-%d", (int)(gic-&gic_data[0])); 1273 - gic_init_chip(gic, NULL, name, false); 1274 + gic_init_chip(gic, name, false); 1274 1275 } 1275 1276 1276 1277 ret = gic_init_bases(gic, handle); ··· 1459 1460 if (!*gic) 1460 1461 return -ENOMEM; 1461 1462 1462 - gic_init_chip(*gic, dev, dev->of_node->name, false); 1463 + gic_init_chip(*gic, dev->of_node->name, false); 1463 1464 1464 1465 ret = gic_of_setup(*gic, dev->of_node); 1465 1466 if (ret) ··· 1471 1472 return ret; 1472 1473 } 1473 1474 1475 + irq_domain_set_pm_device((*gic)->domain, dev); 1474 1476 irq_set_chained_handler_and_data(irq, gic_handle_cascade_irq, *gic); 1475 1477 1476 1478 return 0;
+3 -5
drivers/irqchip/irq-imx-intmux.c
··· 61 61 #define CHAN_MAX_NUM 0x8 62 62 63 63 struct intmux_irqchip_data { 64 - struct irq_chip chip; 65 64 u32 saved_reg; 66 65 int chanidx; 67 66 int irq; ··· 113 114 raw_spin_unlock_irqrestore(&data->lock, flags); 114 115 } 115 116 116 - static struct irq_chip imx_intmux_irq_chip = { 117 + static struct irq_chip imx_intmux_irq_chip __ro_after_init = { 117 118 .name = "intmux", 118 119 .irq_mask = imx_intmux_irq_mask, 119 120 .irq_unmask = imx_intmux_irq_unmask, ··· 125 126 struct intmux_irqchip_data *data = h->host_data; 126 127 127 128 irq_set_chip_data(irq, data); 128 - irq_set_chip_and_handler(irq, &data->chip, handle_level_irq); 129 + irq_set_chip_and_handler(irq, &imx_intmux_irq_chip, handle_level_irq); 129 130 130 131 return 0; 131 132 } ··· 240 241 } 241 242 242 243 for (i = 0; i < channum; i++) { 243 - data->irqchip_data[i].chip = imx_intmux_irq_chip; 244 - data->irqchip_data[i].chip.parent_device = &pdev->dev; 245 244 data->irqchip_data[i].chanidx = i; 246 245 247 246 data->irqchip_data[i].irq = irq_of_parse_and_map(np, i); ··· 257 260 goto out; 258 261 } 259 262 data->irqchip_data[i].domain = domain; 263 + irq_domain_set_pm_device(domain, &pdev->dev); 260 264 261 265 /* disable all interrupt sources of this channel firstly */ 262 266 writel_relaxed(0, data->regs + CHANIER(i));
+2 -1
drivers/irqchip/irq-renesas-intc-irqpin.c
··· 508 508 509 509 irq_chip = &p->irq_chip; 510 510 irq_chip->name = "intc-irqpin"; 511 - irq_chip->parent_device = dev; 512 511 irq_chip->irq_mask = disable_fn; 513 512 irq_chip->irq_unmask = enable_fn; 514 513 irq_chip->irq_set_type = intc_irqpin_irq_set_type; ··· 521 522 dev_err(dev, "cannot initialize irq domain\n"); 522 523 goto err0; 523 524 } 525 + 526 + irq_domain_set_pm_device(p->irq_domain, dev); 524 527 525 528 if (p->shared_irqs) { 526 529 /* request one shared interrupt */
+2 -1
drivers/irqchip/irq-renesas-irqc.c
··· 188 188 p->gc->reg_base = p->cpu_int_base; 189 189 p->gc->chip_types[0].regs.enable = IRQC_EN_SET; 190 190 p->gc->chip_types[0].regs.disable = IRQC_EN_STS; 191 - p->gc->chip_types[0].chip.parent_device = dev; 192 191 p->gc->chip_types[0].chip.irq_mask = irq_gc_mask_disable_reg; 193 192 p->gc->chip_types[0].chip.irq_unmask = irq_gc_unmask_enable_reg; 194 193 p->gc->chip_types[0].chip.irq_set_type = irqc_irq_set_type; 195 194 p->gc->chip_types[0].chip.irq_set_wake = irqc_irq_set_wake; 196 195 p->gc->chip_types[0].chip.flags = IRQCHIP_MASK_ON_SUSPEND; 196 + 197 + irq_domain_set_pm_device(p->irq_domain, dev); 197 198 198 199 /* request interrupts one by one */ 199 200 for (k = 0; k < p->number_of_irqs; k++) {
+12 -13
drivers/pinctrl/nuvoton/pinctrl-npcm7xx.c
··· 78 78 struct gpio_chip gc; 79 79 int irqbase; 80 80 int irq; 81 - void *priv; 82 81 struct irq_chip irq_chip; 83 82 u32 pinctrl_id; 84 83 int (*direction_input)(struct gpio_chip *chip, unsigned offset); ··· 225 226 chained_irq_enter(chip, desc); 226 227 sts = ioread32(bank->base + NPCM7XX_GP_N_EVST); 227 228 en = ioread32(bank->base + NPCM7XX_GP_N_EVEN); 228 - dev_dbg(chip->parent_device, "==> got irq sts %.8x %.8x\n", sts, 229 + dev_dbg(bank->gc.parent, "==> got irq sts %.8x %.8x\n", sts, 229 230 en); 230 231 231 232 sts &= en; ··· 240 241 gpiochip_get_data(irq_data_get_irq_chip_data(d)); 241 242 unsigned int gpio = BIT(d->hwirq); 242 243 243 - dev_dbg(d->chip->parent_device, "setirqtype: %u.%u = %u\n", gpio, 244 + dev_dbg(bank->gc.parent, "setirqtype: %u.%u = %u\n", gpio, 244 245 d->irq, type); 245 246 switch (type) { 246 247 case IRQ_TYPE_EDGE_RISING: 247 - dev_dbg(d->chip->parent_device, "edge.rising\n"); 248 + dev_dbg(bank->gc.parent, "edge.rising\n"); 248 249 npcm_gpio_clr(&bank->gc, bank->base + NPCM7XX_GP_N_EVBE, gpio); 249 250 npcm_gpio_clr(&bank->gc, bank->base + NPCM7XX_GP_N_POL, gpio); 250 251 break; 251 252 case IRQ_TYPE_EDGE_FALLING: 252 - dev_dbg(d->chip->parent_device, "edge.falling\n"); 253 + dev_dbg(bank->gc.parent, "edge.falling\n"); 253 254 npcm_gpio_clr(&bank->gc, bank->base + NPCM7XX_GP_N_EVBE, gpio); 254 255 npcm_gpio_set(&bank->gc, bank->base + NPCM7XX_GP_N_POL, gpio); 255 256 break; 256 257 case IRQ_TYPE_EDGE_BOTH: 257 - dev_dbg(d->chip->parent_device, "edge.both\n"); 258 + dev_dbg(bank->gc.parent, "edge.both\n"); 258 259 npcm_gpio_set(&bank->gc, bank->base + NPCM7XX_GP_N_EVBE, gpio); 259 260 break; 260 261 case IRQ_TYPE_LEVEL_LOW: 261 - dev_dbg(d->chip->parent_device, "level.low\n"); 262 + dev_dbg(bank->gc.parent, "level.low\n"); 262 263 npcm_gpio_set(&bank->gc, bank->base + NPCM7XX_GP_N_POL, gpio); 263 264 break; 264 265 case IRQ_TYPE_LEVEL_HIGH: 265 - dev_dbg(d->chip->parent_device, "level.high\n"); 266 + dev_dbg(bank->gc.parent, "level.high\n"); 266 267 npcm_gpio_clr(&bank->gc, bank->base + NPCM7XX_GP_N_POL, gpio); 267 268 break; 268 269 default: 269 - dev_dbg(d->chip->parent_device, "invalid irq type\n"); 270 + dev_dbg(bank->gc.parent, "invalid irq type\n"); 270 271 return -EINVAL; 271 272 } 272 273 ··· 288 289 gpiochip_get_data(irq_data_get_irq_chip_data(d)); 289 290 unsigned int gpio = d->hwirq; 290 291 291 - dev_dbg(d->chip->parent_device, "irq_ack: %u.%u\n", gpio, d->irq); 292 + dev_dbg(bank->gc.parent, "irq_ack: %u.%u\n", gpio, d->irq); 292 293 iowrite32(BIT(gpio), bank->base + NPCM7XX_GP_N_EVST); 293 294 } 294 295 ··· 300 301 unsigned int gpio = d->hwirq; 301 302 302 303 /* Clear events */ 303 - dev_dbg(d->chip->parent_device, "irq_mask: %u.%u\n", gpio, d->irq); 304 + dev_dbg(bank->gc.parent, "irq_mask: %u.%u\n", gpio, d->irq); 304 305 iowrite32(BIT(gpio), bank->base + NPCM7XX_GP_N_EVENC); 305 306 } 306 307 ··· 312 313 unsigned int gpio = d->hwirq; 313 314 314 315 /* Enable events */ 315 - dev_dbg(d->chip->parent_device, "irq_unmask: %u.%u\n", gpio, d->irq); 316 + dev_dbg(bank->gc.parent, "irq_unmask: %u.%u\n", gpio, d->irq); 316 317 iowrite32(BIT(gpio), bank->base + NPCM7XX_GP_N_EVENS); 317 318 } 318 319 ··· 322 323 unsigned int gpio = d->hwirq; 323 324 324 325 /* active-high, input, clear interrupt, enable interrupt */ 325 - dev_dbg(d->chip->parent_device, "startup: %u.%u\n", gpio, d->irq); 326 + dev_dbg(gc->parent, "startup: %u.%u\n", gpio, d->irq); 326 327 npcmgpio_direction_input(gc, gpio); 327 328 npcmgpio_irq_ack(d); 328 329 npcmgpio_irq_unmask(d);
+2 -1
drivers/pinctrl/pinctrl-starfive.c
··· 1307 1307 sfp->gc.base = -1; 1308 1308 sfp->gc.ngpio = NR_GPIOS; 1309 1309 1310 - starfive_irq_chip.parent_device = dev; 1311 1310 starfive_irq_chip.name = sfp->gc.label; 1312 1311 1313 1312 sfp->gc.irq.chip = &starfive_irq_chip; ··· 1328 1329 ret = devm_gpiochip_add_data(dev, &sfp->gc, sfp); 1329 1330 if (ret) 1330 1331 return dev_err_probe(dev, ret, "could not register gpiochip\n"); 1332 + 1333 + irq_domain_set_pm_device(sfp->gc.irq.domain, dev); 1331 1334 1332 1335 out_pinctrl_enable: 1333 1336 return pinctrl_enable(sfp->pctl);
-2
include/linux/irq.h
··· 456 456 /** 457 457 * struct irq_chip - hardware interrupt chip descriptor 458 458 * 459 - * @parent_device: pointer to parent device for irqchip 460 459 * @name: name for /proc/interrupts 461 460 * @irq_startup: start up the interrupt (defaults to ->enable if NULL) 462 461 * @irq_shutdown: shut down the interrupt (defaults to ->disable if NULL) ··· 502 503 * @flags: chip specific flags 503 504 */ 504 505 struct irq_chip { 505 - struct device *parent_device; 506 506 const char *name; 507 507 unsigned int (*irq_startup)(struct irq_data *data); 508 508 void (*irq_shutdown)(struct irq_data *data);
+10
include/linux/irqdomain.h
··· 151 151 * @gc: Pointer to a list of generic chips. There is a helper function for 152 152 * setting up one or more generic chips for interrupt controllers 153 153 * drivers using the generic chip library which uses this pointer. 154 + * @dev: Pointer to a device that the domain represent, and that will be 155 + * used for power management purposes. 154 156 * @parent: Pointer to parent irq_domain to support hierarchy irq_domains 155 157 * 156 158 * Revmap data, used internally by irq_domain ··· 173 171 struct fwnode_handle *fwnode; 174 172 enum irq_domain_bus_token bus_token; 175 173 struct irq_domain_chip_generic *gc; 174 + struct device *dev; 176 175 #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY 177 176 struct irq_domain *parent; 178 177 #endif ··· 227 224 static inline struct device_node *irq_domain_get_of_node(struct irq_domain *d) 228 225 { 229 226 return to_of_node(d->fwnode); 227 + } 228 + 229 + static inline void irq_domain_set_pm_device(struct irq_domain *d, 230 + struct device *dev) 231 + { 232 + if (d) 233 + d->dev = dev; 230 234 } 231 235 232 236 #ifdef CONFIG_IRQ_DOMAIN
+15 -5
kernel/irq/chip.c
··· 1558 1558 return 0; 1559 1559 } 1560 1560 1561 + static struct device *irq_get_parent_device(struct irq_data *data) 1562 + { 1563 + if (data->domain) 1564 + return data->domain->dev; 1565 + 1566 + return NULL; 1567 + } 1568 + 1561 1569 /** 1562 1570 * irq_chip_pm_get - Enable power for an IRQ chip 1563 1571 * @data: Pointer to interrupt specific data ··· 1575 1567 */ 1576 1568 int irq_chip_pm_get(struct irq_data *data) 1577 1569 { 1570 + struct device *dev = irq_get_parent_device(data); 1578 1571 int retval; 1579 1572 1580 - if (IS_ENABLED(CONFIG_PM) && data->chip->parent_device) { 1581 - retval = pm_runtime_get_sync(data->chip->parent_device); 1573 + if (IS_ENABLED(CONFIG_PM) && dev) { 1574 + retval = pm_runtime_get_sync(dev); 1582 1575 if (retval < 0) { 1583 - pm_runtime_put_noidle(data->chip->parent_device); 1576 + pm_runtime_put_noidle(dev); 1584 1577 return retval; 1585 1578 } 1586 1579 } ··· 1599 1590 */ 1600 1591 int irq_chip_pm_put(struct irq_data *data) 1601 1592 { 1593 + struct device *dev = irq_get_parent_device(data); 1602 1594 int retval = 0; 1603 1595 1604 - if (IS_ENABLED(CONFIG_PM) && data->chip->parent_device) 1605 - retval = pm_runtime_put(data->chip->parent_device); 1596 + if (IS_ENABLED(CONFIG_PM) && dev) 1597 + retval = pm_runtime_put(dev); 1606 1598 1607 1599 return (retval < 0) ? retval : 0; 1608 1600 }