diff options
Diffstat (limited to 'drivers/parisc/gsc.c')
| -rw-r--r-- | drivers/parisc/gsc.c | 36 |
1 files changed, 12 insertions, 24 deletions
diff --git a/drivers/parisc/gsc.c b/drivers/parisc/gsc.c index 20a1bce1a031..e605298e3aee 100644 --- a/drivers/parisc/gsc.c +++ b/drivers/parisc/gsc.c | |||
| @@ -86,7 +86,7 @@ irqreturn_t gsc_asic_intr(int gsc_asic_irq, void *dev) | |||
| 86 | do { | 86 | do { |
| 87 | int local_irq = __ffs(irr); | 87 | int local_irq = __ffs(irr); |
| 88 | unsigned int irq = gsc_asic->global_irq[local_irq]; | 88 | unsigned int irq = gsc_asic->global_irq[local_irq]; |
| 89 | __do_IRQ(irq); | 89 | generic_handle_irq(irq); |
| 90 | irr &= ~(1 << local_irq); | 90 | irr &= ~(1 << local_irq); |
| 91 | } while (irr); | 91 | } while (irr); |
| 92 | 92 | ||
| @@ -105,10 +105,9 @@ int gsc_find_local_irq(unsigned int irq, int *global_irqs, int limit) | |||
| 105 | return NO_IRQ; | 105 | return NO_IRQ; |
| 106 | } | 106 | } |
| 107 | 107 | ||
| 108 | static void gsc_asic_disable_irq(unsigned int irq) | 108 | static void gsc_asic_mask_irq(unsigned int irq) |
| 109 | { | 109 | { |
| 110 | struct irq_desc *desc = irq_to_desc(irq); | 110 | struct gsc_asic *irq_dev = get_irq_chip_data(irq); |
| 111 | struct gsc_asic *irq_dev = desc->chip_data; | ||
| 112 | int local_irq = gsc_find_local_irq(irq, irq_dev->global_irq, 32); | 111 | int local_irq = gsc_find_local_irq(irq, irq_dev->global_irq, 32); |
| 113 | u32 imr; | 112 | u32 imr; |
| 114 | 113 | ||
| @@ -121,10 +120,9 @@ static void gsc_asic_disable_irq(unsigned int irq) | |||
| 121 | gsc_writel(imr, irq_dev->hpa + OFFSET_IMR); | 120 | gsc_writel(imr, irq_dev->hpa + OFFSET_IMR); |
| 122 | } | 121 | } |
| 123 | 122 | ||
| 124 | static void gsc_asic_enable_irq(unsigned int irq) | 123 | static void gsc_asic_unmask_irq(unsigned int irq) |
| 125 | { | 124 | { |
| 126 | struct irq_desc *desc = irq_to_desc(irq); | 125 | struct gsc_asic *irq_dev = get_irq_chip_data(irq); |
| 127 | struct gsc_asic *irq_dev = desc->chip_data; | ||
| 128 | int local_irq = gsc_find_local_irq(irq, irq_dev->global_irq, 32); | 126 | int local_irq = gsc_find_local_irq(irq, irq_dev->global_irq, 32); |
| 129 | u32 imr; | 127 | u32 imr; |
| 130 | 128 | ||
| @@ -141,33 +139,23 @@ static void gsc_asic_enable_irq(unsigned int irq) | |||
| 141 | */ | 139 | */ |
| 142 | } | 140 | } |
| 143 | 141 | ||
| 144 | static unsigned int gsc_asic_startup_irq(unsigned int irq) | ||
| 145 | { | ||
| 146 | gsc_asic_enable_irq(irq); | ||
| 147 | return 0; | ||
| 148 | } | ||
| 149 | |||
| 150 | static struct irq_chip gsc_asic_interrupt_type = { | 142 | static struct irq_chip gsc_asic_interrupt_type = { |
| 151 | .name = "GSC-ASIC", | 143 | .name = "GSC-ASIC", |
| 152 | .startup = gsc_asic_startup_irq, | 144 | .unmask = gsc_asic_unmask_irq, |
| 153 | .shutdown = gsc_asic_disable_irq, | 145 | .mask = gsc_asic_mask_irq, |
| 154 | .enable = gsc_asic_enable_irq, | 146 | .ack = no_ack_irq, |
| 155 | .disable = gsc_asic_disable_irq, | ||
| 156 | .ack = no_ack_irq, | ||
| 157 | .end = no_end_irq, | ||
| 158 | }; | 147 | }; |
| 159 | 148 | ||
| 160 | int gsc_assign_irq(struct irq_chip *type, void *data) | 149 | int gsc_assign_irq(struct irq_chip *type, void *data) |
| 161 | { | 150 | { |
| 162 | static int irq = GSC_IRQ_BASE; | 151 | static int irq = GSC_IRQ_BASE; |
| 163 | struct irq_desc *desc; | ||
| 164 | 152 | ||
| 165 | if (irq > GSC_IRQ_MAX) | 153 | if (irq > GSC_IRQ_MAX) |
| 166 | return NO_IRQ; | 154 | return NO_IRQ; |
| 167 | 155 | ||
| 168 | desc = irq_to_desc(irq); | 156 | set_irq_chip_and_handler(irq, type, handle_level_irq); |
| 169 | desc->chip = type; | 157 | set_irq_chip_data(irq, data); |
| 170 | desc->chip_data = data; | 158 | |
| 171 | return irq++; | 159 | return irq++; |
| 172 | } | 160 | } |
| 173 | 161 | ||
