diff options
| author | Linus Torvalds <[email protected]> | 2017-07-03 16:50:31 -0700 | 
|---|---|---|
| committer | Linus Torvalds <[email protected]> | 2017-07-03 16:50:31 -0700 | 
| commit | 03ffbcdd7898c0b5299efeb9f18de927487ec1cf (patch) | |
| tree | 0569222e4dc9db22049d7d8d15920cc085a194f6 /kernel/irq/devres.c | |
| parent | 1b044f1cfc65a7d90b209dfabd57e16d98b58c5b (diff) | |
| parent | f9632de40ee0161e864bea8c1b017d957fd7312c (diff) | |
Merge branch 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull irq updates from Thomas Gleixner:
 "The irq department delivers:
   - Expand the generic infrastructure handling the irq migration on CPU
     hotplug and convert X86 over to it. (Thomas Gleixner)
     Aside of consolidating code this is a preparatory change for:
   - Finalizing the affinity management for multi-queue devices. The
     main change here is to shut down interrupts which are affine to a
     outgoing CPU and reenabling them when the CPU comes online again.
     That avoids moving interrupts pointlessly around and breaking and
     reestablishing affinities for no value. (Christoph Hellwig)
     Note: This contains also the BLOCK-MQ and NVME changes which depend
     on the rework of the irq core infrastructure. Jens acked them and
     agreed that they should go with the irq changes.
   - Consolidation of irq domain code (Marc Zyngier)
   - State tracking consolidation in the core code (Jeffy Chen)
   - Add debug infrastructure for hierarchical irq domains (Thomas
     Gleixner)
   - Infrastructure enhancement for managing generic interrupt chips via
     devmem (Bartosz Golaszewski)
   - Constification work all over the place (Tobias Klauser)
   - Two new interrupt controller drivers for MVEBU (Thomas Petazzoni)
   - The usual set of fixes, updates and enhancements all over the
     place"
* 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (112 commits)
  irqchip/or1k-pic: Fix interrupt acknowledgement
  irqchip/irq-mvebu-gicp: Allocate enough memory for spi_bitmap
  irqchip/gic-v3: Fix out-of-bound access in gic_set_affinity
  nvme: Allocate queues for all possible CPUs
  blk-mq: Create hctx for each present CPU
  blk-mq: Include all present CPUs in the default queue mapping
  genirq: Avoid unnecessary low level irq function calls
  genirq: Set irq masked state when initializing irq_desc
  genirq/timings: Add infrastructure for estimating the next interrupt arrival time
  genirq/timings: Add infrastructure to track the interrupt timings
  genirq/debugfs: Remove pointless NULL pointer check
  irqchip/gic-v3-its: Don't assume GICv3 hardware supports 16bit INTID
  irqchip/gic-v3-its: Add ACPI NUMA node mapping
  irqchip/gic-v3-its-platform-msi: Make of_device_ids const
  irqchip/gic-v3-its: Make of_device_ids const
  irqchip/irq-mvebu-icu: Add new driver for Marvell ICU
  irqchip/irq-mvebu-gicp: Add new driver for Marvell GICP
  dt-bindings/interrupt-controller: Add DT binding for the Marvell ICU
  genirq/irqdomain: Remove auto-recursive hierarchy support
  irqchip/MSI: Use irq_domain_update_bus_token instead of an open coded access
  ...
Diffstat (limited to 'kernel/irq/devres.c')
| -rw-r--r-- | kernel/irq/devres.c | 86 | 
1 files changed, 86 insertions, 0 deletions
| diff --git a/kernel/irq/devres.c b/kernel/irq/devres.c index 1613bfd48365..194c506d9d20 100644 --- a/kernel/irq/devres.c +++ b/kernel/irq/devres.c @@ -4,6 +4,8 @@  #include <linux/gfp.h>  #include <linux/irq.h> +#include "internals.h" +  /*   * Device resource management aware IRQ request/free implementation.   */ @@ -198,3 +200,87 @@ int __devm_irq_alloc_descs(struct device *dev, int irq, unsigned int from,  	return base;  }  EXPORT_SYMBOL_GPL(__devm_irq_alloc_descs); + +#ifdef CONFIG_GENERIC_IRQ_CHIP +/** + * devm_irq_alloc_generic_chip - Allocate and initialize a generic chip + *                               for a managed device + * @dev:	Device to allocate the generic chip for + * @name:	Name of the irq chip + * @num_ct:	Number of irq_chip_type instances associated with this + * @irq_base:	Interrupt base nr for this chip + * @reg_base:	Register base address (virtual) + * @handler:	Default flow handler associated with this chip + * + * Returns an initialized irq_chip_generic structure. The chip defaults + * to the primary (index 0) irq_chip_type and @handler + */ +struct irq_chip_generic * +devm_irq_alloc_generic_chip(struct device *dev, const char *name, int num_ct, +			    unsigned int irq_base, void __iomem *reg_base, +			    irq_flow_handler_t handler) +{ +	struct irq_chip_generic *gc; +	unsigned long sz = sizeof(*gc) + num_ct * sizeof(struct irq_chip_type); + +	gc = devm_kzalloc(dev, sz, GFP_KERNEL); +	if (gc) +		irq_init_generic_chip(gc, name, num_ct, +				      irq_base, reg_base, handler); + +	return gc; +} +EXPORT_SYMBOL_GPL(devm_irq_alloc_generic_chip); + +struct irq_generic_chip_devres { +	struct irq_chip_generic *gc; +	u32 msk; +	unsigned int clr; +	unsigned int set; +}; + +static void devm_irq_remove_generic_chip(struct device *dev, void *res) +{ +	struct irq_generic_chip_devres *this = res; + +	irq_remove_generic_chip(this->gc, this->msk, this->clr, this->set); +} + +/** + * devm_irq_setup_generic_chip - Setup a range of interrupts with a generic + *                               chip for a managed device + * + * @dev:	Device to setup the generic chip for + * @gc:		Generic irq chip holding all data + * @msk:	Bitmask holding the irqs to initialize relative to gc->irq_base + * @flags:	Flags for initialization + * @clr:	IRQ_* bits to clear + * @set:	IRQ_* bits to set + * + * Set up max. 32 interrupts starting from gc->irq_base. Note, this + * initializes all interrupts to the primary irq_chip_type and its + * associated handler. + */ +int devm_irq_setup_generic_chip(struct device *dev, struct irq_chip_generic *gc, +				u32 msk, enum irq_gc_flags flags, +				unsigned int clr, unsigned int set) +{ +	struct irq_generic_chip_devres *dr; + +	dr = devres_alloc(devm_irq_remove_generic_chip, +			  sizeof(*dr), GFP_KERNEL); +	if (!dr) +		return -ENOMEM; + +	irq_setup_generic_chip(gc, msk, flags, clr, set); + +	dr->gc = gc; +	dr->msk = msk; +	dr->clr = clr; +	dr->set = set; +	devres_add(dev, dr); + +	return 0; +} +EXPORT_SYMBOL_GPL(devm_irq_setup_generic_chip); +#endif /* CONFIG_GENERIC_IRQ_CHIP */ |