mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-24 21:54:34 -04:00
Merge branch 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull irq updates from Thomas Gleixner: "This update provides: - Yet another two irq controller chip drivers - A few updates and fixes for GICV3 - A resource managed function for interrupt allocation - Fixes, updates and enhancements all over the place" * 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: irqchip/qcom: Fix error handling genirq: Clarify logic calculating bogus irqreturn_t values genirq/msi: Add stubs for get_cached_msi_msg/pci_write_msi_msg genirq/devres: Use dev_name(dev) as default for devname genirq: Fix /proc/interrupts output alignment irqdesc: Add a resource managed version of irq_alloc_descs() irqchip/gic-v3-its: Zero command on allocation irqchip/gic-v3-its: Fix command buffer allocation irqchip/mips-gic: Fix local interrupts irqchip: Add a driver for Cortina Gemini irqchip: DT bindings for Cortina Gemini irqchip irqchip/gic-v3: Remove duplicate definition of GICD_TYPER_LPIS irqchip/gic-v3-its: Rename MAPVI to MAPTI irqchip/gic-v3-its: Drop deprecated GITS_BASER_TYPE_CPU irqchip/gic-v3-its: Refactor command encoding irqchip/gic-v3-its: Enable cacheable attribute Read-allocate hints irqchip/qcom: Add IRQ combiner driver ACPI: Add support for ResourceSource/IRQ domain mapping ACPI: Generic GSI: Do not attempt to map non-GSI IRQs during bus scan irq/platform-msi: Fix comment about maximal MSIs
This commit is contained in:
commit
1cd4027cfe
21 changed files with 1027 additions and 149 deletions
|
|
@ -2,6 +2,7 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
/*
|
||||
* Device resource management aware IRQ request/free implementation.
|
||||
|
|
@ -33,7 +34,7 @@ static int devm_irq_match(struct device *dev, void *res, void *data)
|
|||
* @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
|
||||
* @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
|
||||
|
|
@ -57,6 +58,9 @@ int devm_request_threaded_irq(struct device *dev, unsigned int irq,
|
|||
if (!dr)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!devname)
|
||||
devname = dev_name(dev);
|
||||
|
||||
rc = request_threaded_irq(irq, handler, thread_fn, irqflags, devname,
|
||||
dev_id);
|
||||
if (rc) {
|
||||
|
|
@ -80,7 +84,7 @@ EXPORT_SYMBOL(devm_request_threaded_irq);
|
|||
* @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
|
||||
* @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
|
||||
|
|
@ -103,6 +107,9 @@ int devm_request_any_context_irq(struct device *dev, unsigned int irq,
|
|||
if (!dr)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!devname)
|
||||
devname = dev_name(dev);
|
||||
|
||||
rc = request_any_context_irq(irq, handler, irqflags, devname, dev_id);
|
||||
if (rc < 0) {
|
||||
devres_free(dr);
|
||||
|
|
@ -137,3 +144,57 @@ void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id)
|
|||
free_irq(irq, dev_id);
|
||||
}
|
||||
EXPORT_SYMBOL(devm_free_irq);
|
||||
|
||||
struct irq_desc_devres {
|
||||
unsigned int from;
|
||||
unsigned int cnt;
|
||||
};
|
||||
|
||||
static void devm_irq_desc_release(struct device *dev, void *res)
|
||||
{
|
||||
struct irq_desc_devres *this = res;
|
||||
|
||||
irq_free_descs(this->from, this->cnt);
|
||||
}
|
||||
|
||||
/**
|
||||
* __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 affinity mask 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, unsigned int from,
|
||||
unsigned int cnt, int node, struct module *owner,
|
||||
const struct cpumask *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;
|
||||
}
|
||||
|
||||
dr->from = base;
|
||||
dr->cnt = cnt;
|
||||
devres_add(dev, dr);
|
||||
|
||||
return base;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__devm_irq_alloc_descs);
|
||||
|
|
|
|||
|
|
@ -487,6 +487,8 @@ int show_interrupts(struct seq_file *p, void *v)
|
|||
}
|
||||
if (desc->irq_data.domain)
|
||||
seq_printf(p, " %*d", prec, (int) desc->irq_data.hwirq);
|
||||
else
|
||||
seq_printf(p, " %*s", prec, "");
|
||||
#ifdef CONFIG_GENERIC_IRQ_SHOW_LEVEL
|
||||
seq_printf(p, " %-8s", irqd_is_level_type(&desc->irq_data) ? "Level" : "Edge");
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -175,7 +175,9 @@ out:
|
|||
|
||||
static inline int bad_action_ret(irqreturn_t action_ret)
|
||||
{
|
||||
if (likely(action_ret <= (IRQ_HANDLED | IRQ_WAKE_THREAD)))
|
||||
unsigned int r = action_ret;
|
||||
|
||||
if (likely(r <= (IRQ_HANDLED | IRQ_WAKE_THREAD)))
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue