diff options
| -rw-r--r-- | drivers/irqchip/spear-shirq.c | 61 |
1 files changed, 16 insertions, 45 deletions
diff --git a/drivers/irqchip/spear-shirq.c b/drivers/irqchip/spear-shirq.c index 169ef9a385d0..9c145a7cb056 100644 --- a/drivers/irqchip/spear-shirq.c +++ b/drivers/irqchip/spear-shirq.c | |||
| @@ -27,24 +27,11 @@ | |||
| 27 | #include "irqchip.h" | 27 | #include "irqchip.h" |
| 28 | 28 | ||
| 29 | /* | 29 | /* |
| 30 | * struct shirq_regs: shared irq register configuration | ||
| 31 | * | ||
| 32 | * enb_reg: enable register offset | ||
| 33 | * reset_to_enb: val 1 indicates, we need to clear bit for enabling interrupt | ||
| 34 | * status_reg: status register offset | ||
| 35 | * status_reg_mask: status register valid mask | ||
| 36 | */ | ||
| 37 | struct shirq_regs { | ||
| 38 | u32 enb_reg; | ||
| 39 | u32 reset_to_enb; | ||
| 40 | u32 status_reg; | ||
| 41 | }; | ||
| 42 | |||
| 43 | /* | ||
| 44 | * struct spear_shirq: shared irq structure | 30 | * struct spear_shirq: shared irq structure |
| 45 | * | 31 | * |
| 46 | * base: Base register address | 32 | * base: Base register address |
| 47 | * regs: Register configuration for shared irq block | 33 | * status_reg: Status register offset for chained interrupt handler |
| 34 | * mask_reg: Mask register offset for irq chip | ||
| 48 | * mask: Mask to apply to the status register | 35 | * mask: Mask to apply to the status register |
| 49 | * virq_base: Base virtual interrupt number | 36 | * virq_base: Base virtual interrupt number |
| 50 | * nr_irqs: Number of interrupts handled by this block | 37 | * nr_irqs: Number of interrupts handled by this block |
| @@ -54,7 +41,8 @@ struct shirq_regs { | |||
| 54 | */ | 41 | */ |
| 55 | struct spear_shirq { | 42 | struct spear_shirq { |
| 56 | void __iomem *base; | 43 | void __iomem *base; |
| 57 | struct shirq_regs regs; | 44 | u32 status_reg; |
| 45 | u32 mask_reg; | ||
| 58 | u32 mask; | 46 | u32 mask; |
| 59 | u32 virq_base; | 47 | u32 virq_base; |
| 60 | u32 nr_irqs; | 48 | u32 nr_irqs; |
| @@ -72,7 +60,7 @@ static void shirq_irq_mask(struct irq_data *d) | |||
| 72 | { | 60 | { |
| 73 | struct spear_shirq *shirq = irq_data_get_irq_chip_data(d); | 61 | struct spear_shirq *shirq = irq_data_get_irq_chip_data(d); |
| 74 | u32 val, shift = d->irq - shirq->virq_base + shirq->offset; | 62 | u32 val, shift = d->irq - shirq->virq_base + shirq->offset; |
| 75 | u32 __iomem *reg = shirq->base + shirq->regs.enb_reg; | 63 | u32 __iomem *reg = shirq->base + shirq->mask_reg; |
| 76 | 64 | ||
| 77 | raw_spin_lock(&shirq_lock); | 65 | raw_spin_lock(&shirq_lock); |
| 78 | val = readl(reg) & ~(0x1 << shift); | 66 | val = readl(reg) & ~(0x1 << shift); |
| @@ -84,7 +72,7 @@ static void shirq_irq_unmask(struct irq_data *d) | |||
| 84 | { | 72 | { |
| 85 | struct spear_shirq *shirq = irq_data_get_irq_chip_data(d); | 73 | struct spear_shirq *shirq = irq_data_get_irq_chip_data(d); |
| 86 | u32 val, shift = d->irq - shirq->virq_base + shirq->offset; | 74 | u32 val, shift = d->irq - shirq->virq_base + shirq->offset; |
| 87 | u32 __iomem *reg = shirq->base + shirq->regs.enb_reg; | 75 | u32 __iomem *reg = shirq->base + shirq->mask_reg; |
| 88 | 76 | ||
| 89 | raw_spin_lock(&shirq_lock); | 77 | raw_spin_lock(&shirq_lock); |
| 90 | val = readl(reg) | (0x1 << shift); | 78 | val = readl(reg) | (0x1 << shift); |
| @@ -103,10 +91,8 @@ static struct spear_shirq spear300_shirq_ras1 = { | |||
| 103 | .nr_irqs = 9, | 91 | .nr_irqs = 9, |
| 104 | .mask = ((0x1 << 9) - 1) << 0, | 92 | .mask = ((0x1 << 9) - 1) << 0, |
| 105 | .irq_chip = &shirq_chip, | 93 | .irq_chip = &shirq_chip, |
| 106 | .regs = { | 94 | .status_reg = SPEAR300_INT_STS_MASK_REG, |
| 107 | .enb_reg = SPEAR300_INT_ENB_MASK_REG, | 95 | .mask_reg = SPEAR300_INT_ENB_MASK_REG, |
| 108 | .status_reg = SPEAR300_INT_STS_MASK_REG, | ||
| 109 | }, | ||
| 110 | }; | 96 | }; |
| 111 | 97 | ||
| 112 | static struct spear_shirq *spear300_shirq_blocks[] = { | 98 | static struct spear_shirq *spear300_shirq_blocks[] = { |
| @@ -121,9 +107,7 @@ static struct spear_shirq spear310_shirq_ras1 = { | |||
| 121 | .nr_irqs = 8, | 107 | .nr_irqs = 8, |
| 122 | .mask = ((0x1 << 8) - 1) << 0, | 108 | .mask = ((0x1 << 8) - 1) << 0, |
| 123 | .irq_chip = &dummy_irq_chip, | 109 | .irq_chip = &dummy_irq_chip, |
| 124 | .regs = { | 110 | .status_reg = SPEAR310_INT_STS_MASK_REG, |
| 125 | .status_reg = SPEAR310_INT_STS_MASK_REG, | ||
| 126 | }, | ||
| 127 | }; | 111 | }; |
| 128 | 112 | ||
| 129 | static struct spear_shirq spear310_shirq_ras2 = { | 113 | static struct spear_shirq spear310_shirq_ras2 = { |
| @@ -131,10 +115,7 @@ static struct spear_shirq spear310_shirq_ras2 = { | |||
| 131 | .nr_irqs = 5, | 115 | .nr_irqs = 5, |
| 132 | .mask = ((0x1 << 5) - 1) << 8, | 116 | .mask = ((0x1 << 5) - 1) << 8, |
| 133 | .irq_chip = &dummy_irq_chip, | 117 | .irq_chip = &dummy_irq_chip, |
| 134 | .regs = { | 118 | .status_reg = SPEAR310_INT_STS_MASK_REG, |
| 135 | .enb_reg = -1, | ||
| 136 | .status_reg = SPEAR310_INT_STS_MASK_REG, | ||
| 137 | }, | ||
| 138 | }; | 119 | }; |
| 139 | 120 | ||
| 140 | static struct spear_shirq spear310_shirq_ras3 = { | 121 | static struct spear_shirq spear310_shirq_ras3 = { |
| @@ -142,9 +123,7 @@ static struct spear_shirq spear310_shirq_ras3 = { | |||
| 142 | .nr_irqs = 1, | 123 | .nr_irqs = 1, |
| 143 | .mask = ((0x1 << 1) - 1) << 13, | 124 | .mask = ((0x1 << 1) - 1) << 13, |
| 144 | .irq_chip = &dummy_irq_chip, | 125 | .irq_chip = &dummy_irq_chip, |
| 145 | .regs = { | 126 | .status_reg = SPEAR310_INT_STS_MASK_REG, |
| 146 | .status_reg = SPEAR310_INT_STS_MASK_REG, | ||
| 147 | }, | ||
| 148 | }; | 127 | }; |
| 149 | 128 | ||
| 150 | static struct spear_shirq spear310_shirq_intrcomm_ras = { | 129 | static struct spear_shirq spear310_shirq_intrcomm_ras = { |
| @@ -152,9 +131,7 @@ static struct spear_shirq spear310_shirq_intrcomm_ras = { | |||
| 152 | .nr_irqs = 3, | 131 | .nr_irqs = 3, |
| 153 | .mask = ((0x1 << 3) - 1) << 14, | 132 | .mask = ((0x1 << 3) - 1) << 14, |
| 154 | .irq_chip = &dummy_irq_chip, | 133 | .irq_chip = &dummy_irq_chip, |
| 155 | .regs = { | 134 | .status_reg = SPEAR310_INT_STS_MASK_REG, |
| 156 | .status_reg = SPEAR310_INT_STS_MASK_REG, | ||
| 157 | }, | ||
| 158 | }; | 135 | }; |
| 159 | 136 | ||
| 160 | static struct spear_shirq *spear310_shirq_blocks[] = { | 137 | static struct spear_shirq *spear310_shirq_blocks[] = { |
| @@ -180,9 +157,7 @@ static struct spear_shirq spear320_shirq_ras1 = { | |||
| 180 | .nr_irqs = 3, | 157 | .nr_irqs = 3, |
| 181 | .mask = ((0x1 << 3) - 1) << 7, | 158 | .mask = ((0x1 << 3) - 1) << 7, |
| 182 | .irq_chip = &dummy_irq_chip, | 159 | .irq_chip = &dummy_irq_chip, |
| 183 | .regs = { | 160 | .status_reg = SPEAR320_INT_STS_MASK_REG, |
| 184 | .status_reg = SPEAR320_INT_STS_MASK_REG, | ||
| 185 | }, | ||
| 186 | }; | 161 | }; |
| 187 | 162 | ||
| 188 | static struct spear_shirq spear320_shirq_ras2 = { | 163 | static struct spear_shirq spear320_shirq_ras2 = { |
| @@ -190,9 +165,7 @@ static struct spear_shirq spear320_shirq_ras2 = { | |||
| 190 | .nr_irqs = 1, | 165 | .nr_irqs = 1, |
| 191 | .mask = ((0x1 << 1) - 1) << 10, | 166 | .mask = ((0x1 << 1) - 1) << 10, |
| 192 | .irq_chip = &dummy_irq_chip, | 167 | .irq_chip = &dummy_irq_chip, |
| 193 | .regs = { | 168 | .status_reg = SPEAR320_INT_STS_MASK_REG, |
| 194 | .status_reg = SPEAR320_INT_STS_MASK_REG, | ||
| 195 | }, | ||
| 196 | }; | 169 | }; |
| 197 | 170 | ||
| 198 | static struct spear_shirq spear320_shirq_intrcomm_ras = { | 171 | static struct spear_shirq spear320_shirq_intrcomm_ras = { |
| @@ -200,9 +173,7 @@ static struct spear_shirq spear320_shirq_intrcomm_ras = { | |||
| 200 | .nr_irqs = 11, | 173 | .nr_irqs = 11, |
| 201 | .mask = ((0x1 << 11) - 1) << 11, | 174 | .mask = ((0x1 << 11) - 1) << 11, |
| 202 | .irq_chip = &dummy_irq_chip, | 175 | .irq_chip = &dummy_irq_chip, |
| 203 | .regs = { | 176 | .status_reg = SPEAR320_INT_STS_MASK_REG, |
| 204 | .status_reg = SPEAR320_INT_STS_MASK_REG, | ||
| 205 | }, | ||
| 206 | }; | 177 | }; |
| 207 | 178 | ||
| 208 | static struct spear_shirq *spear320_shirq_blocks[] = { | 179 | static struct spear_shirq *spear320_shirq_blocks[] = { |
| @@ -217,7 +188,7 @@ static void shirq_handler(unsigned irq, struct irq_desc *desc) | |||
| 217 | struct spear_shirq *shirq = irq_get_handler_data(irq); | 188 | struct spear_shirq *shirq = irq_get_handler_data(irq); |
| 218 | u32 pend; | 189 | u32 pend; |
| 219 | 190 | ||
| 220 | pend = readl(shirq->base + shirq->regs.status_reg) & shirq->mask; | 191 | pend = readl(shirq->base + shirq->status_reg) & shirq->mask; |
| 221 | pend >>= shirq->offset; | 192 | pend >>= shirq->offset; |
| 222 | 193 | ||
| 223 | while (pend) { | 194 | while (pend) { |
