Merge branch 'queue/irq/arm' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip into next/cleanup
Merge "ARM: Interrupt cleanups and API change preparation" from Thomas Gleixner: The following patch series contains the following changes: - Consolidation of chained interrupt handler setup/removal - Switch to functions which avoid a redundant interrupt descriptor lookup - Preparation of interrupt flow handlers for the 'irq' argument removal * 'queue/irq/arm' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: ARM/orion/gpio: Prepare gpio_irq_handler for irq argument removal ARM/pxa: Prepare balloon3_irq_handler for irq argument removal ARM/pxa: Prepare *_irq_handler for irq argument removal ARM/dove: Prepare pmu_irq_handler for irq argument removal ARM/sa1111: Prepare sa1111_irq_handler for irq argument removal ARM/locomo: Prepare locomo_handler for irq argument removal ARM, irq: Use irq_desc_get_xxx() to avoid redundant lookup of irq_desc ARM/LPC32xx: Use irq_set_handler_locked() ARM/irq: Use access helper irq_data_get_affinity_mask() ARM/locomo: Consolidate chained IRQ handler install/remove ARM/orion: Consolidate chained IRQ handler install/remove Signed-off-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
commit
39aa437e18
@ -138,9 +138,9 @@ static struct locomo_dev_info locomo_devices[] = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static void locomo_handler(unsigned int irq, struct irq_desc *desc)
|
static void locomo_handler(unsigned int __irq, struct irq_desc *desc)
|
||||||
{
|
{
|
||||||
struct locomo *lchip = irq_get_chip_data(irq);
|
struct locomo *lchip = irq_desc_get_chip_data(desc);
|
||||||
int req, i;
|
int req, i;
|
||||||
|
|
||||||
/* Acknowledge the parent IRQ */
|
/* Acknowledge the parent IRQ */
|
||||||
@ -150,6 +150,8 @@ static void locomo_handler(unsigned int irq, struct irq_desc *desc)
|
|||||||
req = locomo_readl(lchip->base + LOCOMO_ICR) & 0x0f00;
|
req = locomo_readl(lchip->base + LOCOMO_ICR) & 0x0f00;
|
||||||
|
|
||||||
if (req) {
|
if (req) {
|
||||||
|
unsigned int irq;
|
||||||
|
|
||||||
/* generate the next interrupt(s) */
|
/* generate the next interrupt(s) */
|
||||||
irq = lchip->irq_base;
|
irq = lchip->irq_base;
|
||||||
for (i = 0; i <= 3; i++, irq++) {
|
for (i = 0; i <= 3; i++, irq++) {
|
||||||
@ -475,8 +477,7 @@ static void __locomo_remove(struct locomo *lchip)
|
|||||||
device_for_each_child(lchip->dev, NULL, locomo_remove_child);
|
device_for_each_child(lchip->dev, NULL, locomo_remove_child);
|
||||||
|
|
||||||
if (lchip->irq != NO_IRQ) {
|
if (lchip->irq != NO_IRQ) {
|
||||||
irq_set_chained_handler(lchip->irq, NULL);
|
irq_set_chained_handler_and_data(lchip->irq, NULL, NULL);
|
||||||
irq_set_handler_data(lchip->irq, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
iounmap(lchip->base);
|
iounmap(lchip->base);
|
||||||
|
@ -197,10 +197,11 @@ static struct sa1111_dev_info sa1111_devices[] = {
|
|||||||
* will call us again if there are more interrupts to process.
|
* will call us again if there are more interrupts to process.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
sa1111_irq_handler(unsigned int irq, struct irq_desc *desc)
|
sa1111_irq_handler(unsigned int __irq, struct irq_desc *desc)
|
||||||
{
|
{
|
||||||
|
unsigned int irq = irq_desc_get_irq(desc);
|
||||||
unsigned int stat0, stat1, i;
|
unsigned int stat0, stat1, i;
|
||||||
struct sa1111 *sachip = irq_get_handler_data(irq);
|
struct sa1111 *sachip = irq_desc_get_handler_data(desc);
|
||||||
void __iomem *mapbase = sachip->base + SA1111_INTC;
|
void __iomem *mapbase = sachip->base + SA1111_INTC;
|
||||||
|
|
||||||
stat0 = sa1111_readl(mapbase + SA1111_INTSTATCLR0);
|
stat0 = sa1111_readl(mapbase + SA1111_INTSTATCLR0);
|
||||||
|
@ -140,7 +140,7 @@ int __init arch_probe_nr_irqs(void)
|
|||||||
static bool migrate_one_irq(struct irq_desc *desc)
|
static bool migrate_one_irq(struct irq_desc *desc)
|
||||||
{
|
{
|
||||||
struct irq_data *d = irq_desc_get_irq_data(desc);
|
struct irq_data *d = irq_desc_get_irq_data(desc);
|
||||||
const struct cpumask *affinity = d->affinity;
|
const struct cpumask *affinity = irq_data_get_affinity_mask(d);
|
||||||
struct irq_chip *c;
|
struct irq_chip *c;
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|
||||||
@ -160,7 +160,7 @@ static bool migrate_one_irq(struct irq_desc *desc)
|
|||||||
if (!c->irq_set_affinity)
|
if (!c->irq_set_affinity)
|
||||||
pr_debug("IRQ%u: unable to set affinity\n", d->irq);
|
pr_debug("IRQ%u: unable to set affinity\n", d->irq);
|
||||||
else if (c->irq_set_affinity(d, affinity, false) == IRQ_SET_MASK_OK && ret)
|
else if (c->irq_set_affinity(d, affinity, false) == IRQ_SET_MASK_OK && ret)
|
||||||
cpumask_copy(d->affinity, affinity);
|
cpumask_copy(irq_data_get_affinity_mask(d), affinity);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -69,8 +69,9 @@ static struct irq_chip pmu_irq_chip = {
|
|||||||
.irq_ack = pmu_irq_ack,
|
.irq_ack = pmu_irq_ack,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void pmu_irq_handler(unsigned int irq, struct irq_desc *desc)
|
static void pmu_irq_handler(unsigned int __irq, struct irq_desc *desc)
|
||||||
{
|
{
|
||||||
|
unsigned int irq = irq_desc_get_irq(desc);
|
||||||
unsigned long cause = readl(PMU_INTERRUPT_CAUSE);
|
unsigned long cause = readl(PMU_INTERRUPT_CAUSE);
|
||||||
|
|
||||||
cause &= readl(PMU_INTERRUPT_MASK);
|
cause &= readl(PMU_INTERRUPT_MASK);
|
||||||
|
@ -283,25 +283,25 @@ static int lpc32xx_set_irq_type(struct irq_data *d, unsigned int type)
|
|||||||
case IRQ_TYPE_EDGE_RISING:
|
case IRQ_TYPE_EDGE_RISING:
|
||||||
/* Rising edge sensitive */
|
/* Rising edge sensitive */
|
||||||
__lpc32xx_set_irq_type(d->hwirq, 1, 1);
|
__lpc32xx_set_irq_type(d->hwirq, 1, 1);
|
||||||
__irq_set_handler_locked(d->irq, handle_edge_irq);
|
irq_set_handler_locked(d, handle_edge_irq);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IRQ_TYPE_EDGE_FALLING:
|
case IRQ_TYPE_EDGE_FALLING:
|
||||||
/* Falling edge sensitive */
|
/* Falling edge sensitive */
|
||||||
__lpc32xx_set_irq_type(d->hwirq, 0, 1);
|
__lpc32xx_set_irq_type(d->hwirq, 0, 1);
|
||||||
__irq_set_handler_locked(d->irq, handle_edge_irq);
|
irq_set_handler_locked(d, handle_edge_irq);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IRQ_TYPE_LEVEL_LOW:
|
case IRQ_TYPE_LEVEL_LOW:
|
||||||
/* Low level sensitive */
|
/* Low level sensitive */
|
||||||
__lpc32xx_set_irq_type(d->hwirq, 0, 0);
|
__lpc32xx_set_irq_type(d->hwirq, 0, 0);
|
||||||
__irq_set_handler_locked(d->irq, handle_level_irq);
|
irq_set_handler_locked(d, handle_level_irq);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IRQ_TYPE_LEVEL_HIGH:
|
case IRQ_TYPE_LEVEL_HIGH:
|
||||||
/* High level sensitive */
|
/* High level sensitive */
|
||||||
__lpc32xx_set_irq_type(d->hwirq, 1, 0);
|
__lpc32xx_set_irq_type(d->hwirq, 1, 0);
|
||||||
__irq_set_handler_locked(d->irq, handle_level_irq);
|
irq_set_handler_locked(d, handle_level_irq);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Other modes are not supported */
|
/* Other modes are not supported */
|
||||||
|
@ -496,18 +496,18 @@ static struct irq_chip balloon3_irq_chip = {
|
|||||||
.irq_unmask = balloon3_unmask_irq,
|
.irq_unmask = balloon3_unmask_irq,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void balloon3_irq_handler(unsigned int irq, struct irq_desc *desc)
|
static void balloon3_irq_handler(unsigned int __irq, struct irq_desc *desc)
|
||||||
{
|
{
|
||||||
unsigned long pending = __raw_readl(BALLOON3_INT_CONTROL_REG) &
|
unsigned long pending = __raw_readl(BALLOON3_INT_CONTROL_REG) &
|
||||||
balloon3_irq_enabled;
|
balloon3_irq_enabled;
|
||||||
do {
|
do {
|
||||||
/* clear useless edge notification */
|
struct irq_data *d = irq_desc_get_irq_data(desc);
|
||||||
if (desc->irq_data.chip->irq_ack) {
|
struct irq_chip *chip = irq_data_get_chip(d);
|
||||||
struct irq_data *d;
|
unsigned int irq;
|
||||||
|
|
||||||
d = irq_get_irq_data(BALLOON3_AUX_NIRQ);
|
/* clear useless edge notification */
|
||||||
desc->irq_data.chip->irq_ack(d);
|
if (chip->irq_ack)
|
||||||
}
|
chip->irq_ack(d);
|
||||||
|
|
||||||
while (pending) {
|
while (pending) {
|
||||||
irq = BALLOON3_IRQ(0) + __ffs(pending);
|
irq = BALLOON3_IRQ(0) + __ffs(pending);
|
||||||
|
@ -29,8 +29,9 @@
|
|||||||
void __iomem *it8152_base_address;
|
void __iomem *it8152_base_address;
|
||||||
static int cmx2xx_it8152_irq_gpio;
|
static int cmx2xx_it8152_irq_gpio;
|
||||||
|
|
||||||
static void cmx2xx_it8152_irq_demux(unsigned int irq, struct irq_desc *desc)
|
static void cmx2xx_it8152_irq_demux(unsigned int __irq, struct irq_desc *desc)
|
||||||
{
|
{
|
||||||
|
unsigned int irq = irq_desc_get_irq(desc);
|
||||||
/* clear our parent irq */
|
/* clear our parent irq */
|
||||||
desc->irq_data.chip->irq_ack(&desc->irq_data);
|
desc->irq_data.chip->irq_ack(&desc->irq_data);
|
||||||
|
|
||||||
|
@ -120,8 +120,9 @@ static struct irq_chip lpd270_irq_chip = {
|
|||||||
.irq_unmask = lpd270_unmask_irq,
|
.irq_unmask = lpd270_unmask_irq,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void lpd270_irq_handler(unsigned int irq, struct irq_desc *desc)
|
static void lpd270_irq_handler(unsigned int __irq, struct irq_desc *desc)
|
||||||
{
|
{
|
||||||
|
unsigned int irq;
|
||||||
unsigned long pending;
|
unsigned long pending;
|
||||||
|
|
||||||
pending = __raw_readw(LPD270_INT_STATUS) & lpd270_irq_enabled;
|
pending = __raw_readw(LPD270_INT_STATUS) & lpd270_irq_enabled;
|
||||||
|
@ -284,8 +284,9 @@ static struct irq_chip pcm990_irq_chip = {
|
|||||||
.irq_unmask = pcm990_unmask_irq,
|
.irq_unmask = pcm990_unmask_irq,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void pcm990_irq_handler(unsigned int irq, struct irq_desc *desc)
|
static void pcm990_irq_handler(unsigned int __irq, struct irq_desc *desc)
|
||||||
{
|
{
|
||||||
|
unsigned int irq;
|
||||||
unsigned long pending;
|
unsigned long pending;
|
||||||
|
|
||||||
pending = ~pcm990_cpld_readb(PCM990_CTRL_INTSETCLR);
|
pending = ~pcm990_cpld_readb(PCM990_CTRL_INTSETCLR);
|
||||||
|
@ -276,8 +276,9 @@ static inline unsigned long viper_irq_pending(void)
|
|||||||
viper_irq_enabled_mask;
|
viper_irq_enabled_mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void viper_irq_handler(unsigned int irq, struct irq_desc *desc)
|
static void viper_irq_handler(unsigned int __irq, struct irq_desc *desc)
|
||||||
{
|
{
|
||||||
|
unsigned int irq;
|
||||||
unsigned long pending;
|
unsigned long pending;
|
||||||
|
|
||||||
pending = viper_irq_pending();
|
pending = viper_irq_pending();
|
||||||
|
@ -105,8 +105,9 @@ static inline unsigned long zeus_irq_pending(void)
|
|||||||
return __raw_readw(ZEUS_CPLD_ISA_IRQ) & zeus_irq_enabled_mask;
|
return __raw_readw(ZEUS_CPLD_ISA_IRQ) & zeus_irq_enabled_mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void zeus_irq_handler(unsigned int irq, struct irq_desc *desc)
|
static void zeus_irq_handler(unsigned int __irq, struct irq_desc *desc)
|
||||||
{
|
{
|
||||||
|
unsigned int irq;
|
||||||
unsigned long pending;
|
unsigned long pending;
|
||||||
|
|
||||||
pending = zeus_irq_pending();
|
pending = zeus_irq_pending();
|
||||||
|
@ -407,9 +407,9 @@ static int gpio_irq_set_type(struct irq_data *d, u32 type)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gpio_irq_handler(unsigned irq, struct irq_desc *desc)
|
static void gpio_irq_handler(unsigned __irq, struct irq_desc *desc)
|
||||||
{
|
{
|
||||||
struct orion_gpio_chip *ochip = irq_get_handler_data(irq);
|
struct orion_gpio_chip *ochip = irq_desc_get_handler_data(desc);
|
||||||
u32 cause, type;
|
u32 cause, type;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -582,8 +582,9 @@ void __init orion_gpio_init(struct device_node *np,
|
|||||||
|
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
if (irqs[i]) {
|
if (irqs[i]) {
|
||||||
irq_set_handler_data(irqs[i], ochip);
|
irq_set_chained_handler_and_data(irqs[i],
|
||||||
irq_set_chained_handler(irqs[i], gpio_irq_handler);
|
gpio_irq_handler,
|
||||||
|
ochip);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user