Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 81191
b: refs/heads/master
c: 5aac48d
h: refs/heads/master
i:
  81189: a848511
  81187: 910b837
  81183: 551b873
v: v3
  • Loading branch information
Valentine Barshak authored and Josh Boyer committed Dec 23, 2007
1 parent 89af7fc commit 5875611
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 18 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c80905637efb4af6e58da91fae89ffcb2cf8f1aa
refs/heads/master: 5aac48dc1a7bf0e8c5d01a2d6b16f8063d157649
36 changes: 19 additions & 17 deletions trunk/arch/powerpc/sysdev/uic.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,6 @@ struct uic {

/* The remapper for this UIC */
struct irq_host *irqhost;

/* For secondary UICs, the cascade interrupt's irqaction */
struct irqaction cascade;
};

static void uic_unmask_irq(unsigned int virq)
Expand Down Expand Up @@ -221,23 +218,36 @@ static struct irq_host_ops uic_host_ops = {
.xlate = uic_host_xlate,
};

irqreturn_t uic_cascade(int virq, void *data)
void uic_irq_cascade(unsigned int virq, struct irq_desc *desc)
{
struct uic *uic = data;
struct uic *uic = get_irq_data(virq);
u32 msr;
int src;
int subvirq;

spin_lock(&desc->lock);
if (desc->status & IRQ_LEVEL)
desc->chip->mask(virq);
else
desc->chip->mask_ack(virq);
spin_unlock(&desc->lock);

msr = mfdcr(uic->dcrbase + UIC_MSR);
if (!msr) /* spurious interrupt */
return IRQ_HANDLED;
goto uic_irq_ret;

src = 32 - ffs(msr);

subvirq = irq_linear_revmap(uic->irqhost, src);
generic_handle_irq(subvirq);

return IRQ_HANDLED;
uic_irq_ret:
spin_lock(&desc->lock);
if (desc->status & IRQ_LEVEL)
desc->chip->ack(virq);
if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask)
desc->chip->unmask(virq);
spin_unlock(&desc->lock);
}

static struct uic * __init uic_init_one(struct device_node *node)
Expand Down Expand Up @@ -325,7 +335,6 @@ void __init uic_init_tree(void)
if (interrupts) {
/* Secondary UIC */
int cascade_virq;
int ret;

uic = uic_init_one(np);
if (! uic)
Expand All @@ -334,15 +343,8 @@ void __init uic_init_tree(void)

cascade_virq = irq_of_parse_and_map(np, 0);

uic->cascade.handler = uic_cascade;
uic->cascade.name = "UIC cascade";
uic->cascade.dev_id = uic;

ret = setup_irq(cascade_virq, &uic->cascade);
if (ret)
printk(KERN_ERR "Failed to setup_irq(%d) for "
"UIC%d cascade\n", cascade_virq,
uic->index);
set_irq_data(cascade_virq, uic);
set_irq_chained_handler(cascade_virq, uic_irq_cascade);

/* FIXME: setup critical cascade?? */
}
Expand Down

0 comments on commit 5875611

Please sign in to comment.