/** * devm_request_threaded_irq - allocate an interrupt line for a managed device * @dev: device to request interrupt for * @irq: Interrupt line to allocate * @handler: Function to be called when the IRQ occurs * @thread_fn: function to be called in a threaded interrupt context. NULL * for devices which handle everything in @handler * @irqflags: Interrupt type flags * @devname: An ascii name for the claiming device, dev_name(dev) if NULL * @dev_id: A cookie passed back to the handler function * * Except for the extra @dev argument, this function takes the * same arguments and performs the same function as * request_threaded_irq(). IRQs requested with this function will be * automatically freed on driver detach. * * If an IRQ allocated with this function needs to be freed * separately, devm_free_irq() must be used.
*/ int devm_request_threaded_irq(struct device *dev, unsignedint irq,
irq_handler_t handler, irq_handler_t thread_fn, unsignedlong irqflags, constchar *devname, void *dev_id)
{ struct irq_devres *dr; int rc;
dr = devres_alloc(devm_irq_release, sizeof(struct irq_devres),
GFP_KERNEL); if (!dr) return -ENOMEM;
/** * devm_request_any_context_irq - allocate an interrupt line for a managed device * @dev: device to request interrupt for * @irq: Interrupt line to allocate * @handler: Function to be called when the IRQ occurs * @irqflags: Interrupt type flags * @devname: An ascii name for the claiming device, dev_name(dev) if NULL * @dev_id: A cookie passed back to the handler function * * Except for the extra @dev argument, this function takes the * same arguments and performs the same function as * request_any_context_irq(). IRQs requested with this function will be * automatically freed on driver detach. * * If an IRQ allocated with this function needs to be freed * separately, devm_free_irq() must be used.
*/ int devm_request_any_context_irq(struct device *dev, unsignedint irq,
irq_handler_t handler, unsignedlong irqflags, constchar *devname, void *dev_id)
{ struct irq_devres *dr; int rc;
dr = devres_alloc(devm_irq_release, sizeof(struct irq_devres),
GFP_KERNEL); if (!dr) return -ENOMEM;
/** * devm_free_irq - free an interrupt * @dev: device to free interrupt for * @irq: Interrupt line to free * @dev_id: Device identity to free * * Except for the extra @dev argument, this function takes the * same arguments and performs the same function as free_irq(). * This function instead of free_irq() should be used to manually * free IRQs allocated with devm_request_irq().
*/ void devm_free_irq(struct device *dev, unsignedint irq, void *dev_id)
{ struct irq_devres match_data = { irq, dev_id };
/** * __devm_irq_alloc_descs - Allocate and initialize a range of irq descriptors * for a managed device * @dev: Device to allocate the descriptors for * @irq: Allocate for specific irq number if irq >= 0 * @from: Start the search from this irq number * @cnt: Number of consecutive irqs to allocate * @node: Preferred node on which the irq descriptor should be allocated * @owner: Owning module (can be NULL) * @affinity: Optional pointer to an irq_affinity_desc array of size @cnt * which hints where the irq descriptors should be allocated * and which default affinities to use * * Returns the first irq number or error code. * * Note: Use the provided wrappers (devm_irq_alloc_desc*) for simplicity.
*/ int __devm_irq_alloc_descs(struct device *dev, int irq, unsignedint from, unsignedint cnt, int node, struct module *owner, conststruct irq_affinity_desc *affinity)
{ struct irq_desc_devres *dr; int base;
dr = devres_alloc(devm_irq_desc_release, sizeof(*dr), GFP_KERNEL); if (!dr) return -ENOMEM;
base = __irq_alloc_descs(irq, from, cnt, node, owner, affinity); if (base < 0) {
devres_free(dr); return base;
}
#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, constchar *name, int num_ct, unsignedint irq_base, void __iomem *reg_base,
irq_flow_handler_t handler)
{ struct irq_chip_generic *gc;
/** * 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, unsignedint clr, unsignedint set)
{ struct irq_generic_chip_devres *dr;
dr = devres_alloc(devm_irq_remove_generic_chip, sizeof(*dr), GFP_KERNEL); if (!dr) return -ENOMEM;
/** * devm_irq_domain_instantiate() - Instantiate a new irq domain data for a * managed device. * @dev: Device to instantiate the domain for * @info: Domain information pointer pointing to the information for this * domain * * Return: A pointer to the instantiated irq domain or an ERR_PTR value.
*/ struct irq_domain *devm_irq_domain_instantiate(struct device *dev, conststruct irq_domain_info *info)
{ struct irq_domain *domain; struct irq_domain **dr;
dr = devres_alloc(devm_irq_domain_remove, sizeof(*dr), GFP_KERNEL); if (!dr) return ERR_PTR(-ENOMEM);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.