diff options
author | Eric Miao <eric.y.miao@gmail.com> | 2010-02-04 20:13:55 -0500 |
---|---|---|
committer | Eric Miao <eric.y.miao@gmail.com> | 2010-03-01 18:40:49 -0500 |
commit | da8065ac3ea29d1bfdb5a163be346fbe35066f8d (patch) | |
tree | 5b861839c7b61cd29eb5b04f9c68d2d040f72a1e | |
parent | efe7f8bda015b03ab1420b5bca538d18e6559863 (diff) |
[ARM] locomo: avoid unnecessary cascaded keyboard IRQ
It is not necessary and is over-complicated for IRQ_LOCOMO_KEY to
be a cascaded IRQ of IRQ_LOCOMO_KEY_BASE. Removed and introduced
locomokbd_{open,close} for masking/unmasking of the keyboard IRQ.
Signed-off-by: Eric Miao <eric.y.miao@gmail.com>
-rw-r--r-- | arch/arm/common/locomo.c | 63 | ||||
-rw-r--r-- | arch/arm/mach-pxa/include/mach/irqs.h | 3 | ||||
-rw-r--r-- | arch/arm/mach-sa1100/include/mach/irqs.h | 3 | ||||
-rw-r--r-- | drivers/input/keyboard/locomokbd.c | 32 |
4 files changed, 39 insertions, 62 deletions
diff --git a/arch/arm/common/locomo.c b/arch/arm/common/locomo.c index bd36c778c819..96cd0730167d 100644 --- a/arch/arm/common/locomo.c +++ b/arch/arm/common/locomo.c | |||
@@ -143,12 +143,10 @@ static struct locomo_dev_info locomo_devices[] = { | |||
143 | * IRQ_LOCOMO_*_BASE and those handlers generate more interrupts | 143 | * IRQ_LOCOMO_*_BASE and those handlers generate more interrupts |
144 | * | 144 | * |
145 | * hardware irq reads LOCOMO_ICR & 0x0f00 | 145 | * hardware irq reads LOCOMO_ICR & 0x0f00 |
146 | * IRQ_LOCOMO_KEY_BASE | 146 | * IRQ_LOCOMO_KEY |
147 | * IRQ_LOCOMO_GPIO_BASE | 147 | * IRQ_LOCOMO_GPIO_BASE |
148 | * IRQ_LOCOMO_LT_BASE | 148 | * IRQ_LOCOMO_LT_BASE |
149 | * IRQ_LOCOMO_SPI_BASE | 149 | * IRQ_LOCOMO_SPI_BASE |
150 | * IRQ_LOCOMO_KEY_BASE reads LOCOMO_KIC & 0x0001 | ||
151 | * IRQ_LOCOMO_KEY | ||
152 | * IRQ_LOCOMO_GPIO_BASE reads LOCOMO_GIR & LOCOMO_GPD & 0xffff | 150 | * IRQ_LOCOMO_GPIO_BASE reads LOCOMO_GIR & LOCOMO_GPD & 0xffff |
153 | * IRQ_LOCOMO_GPIO[0-15] | 151 | * IRQ_LOCOMO_GPIO[0-15] |
154 | * IRQ_LOCOMO_LT_BASE reads LOCOMO_LTINT & 0x0001 | 152 | * IRQ_LOCOMO_LT_BASE reads LOCOMO_LTINT & 0x0001 |
@@ -160,8 +158,7 @@ static struct locomo_dev_info locomo_devices[] = { | |||
160 | * IRQ_LOCOMO_SPI_TEND | 158 | * IRQ_LOCOMO_SPI_TEND |
161 | */ | 159 | */ |
162 | 160 | ||
163 | #define LOCOMO_IRQ_START (IRQ_LOCOMO_KEY_BASE) | 161 | #define LOCOMO_IRQ_START (IRQ_LOCOMO_KEY) |
164 | #define LOCOMO_IRQ_KEY_START (IRQ_LOCOMO_KEY) | ||
165 | #define LOCOMO_IRQ_GPIO_START (IRQ_LOCOMO_GPIO0) | 162 | #define LOCOMO_IRQ_GPIO_START (IRQ_LOCOMO_GPIO0) |
166 | #define LOCOMO_IRQ_LT_START (IRQ_LOCOMO_LT) | 163 | #define LOCOMO_IRQ_LT_START (IRQ_LOCOMO_LT) |
167 | #define LOCOMO_IRQ_SPI_START (IRQ_LOCOMO_SPI_RFR) | 164 | #define LOCOMO_IRQ_SPI_START (IRQ_LOCOMO_SPI_RFR) |
@@ -218,49 +215,6 @@ static struct irq_chip locomo_chip = { | |||
218 | .unmask = locomo_unmask_irq, | 215 | .unmask = locomo_unmask_irq, |
219 | }; | 216 | }; |
220 | 217 | ||
221 | static void locomo_key_handler(unsigned int irq, struct irq_desc *desc) | ||
222 | { | ||
223 | void __iomem *mapbase = get_irq_chip_data(irq); | ||
224 | |||
225 | if (locomo_readl(mapbase + LOCOMO_KEYBOARD + LOCOMO_KIC) & 0x0001) { | ||
226 | generic_handle_irq(LOCOMO_IRQ_KEY_START); | ||
227 | } | ||
228 | } | ||
229 | |||
230 | static void locomo_key_ack_irq(unsigned int irq) | ||
231 | { | ||
232 | void __iomem *mapbase = get_irq_chip_data(irq); | ||
233 | unsigned int r; | ||
234 | r = locomo_readl(mapbase + LOCOMO_KEYBOARD + LOCOMO_KIC); | ||
235 | r &= ~(0x0100 << (irq - LOCOMO_IRQ_KEY_START)); | ||
236 | locomo_writel(r, mapbase + LOCOMO_KEYBOARD + LOCOMO_KIC); | ||
237 | } | ||
238 | |||
239 | static void locomo_key_mask_irq(unsigned int irq) | ||
240 | { | ||
241 | void __iomem *mapbase = get_irq_chip_data(irq); | ||
242 | unsigned int r; | ||
243 | r = locomo_readl(mapbase + LOCOMO_KEYBOARD + LOCOMO_KIC); | ||
244 | r &= ~(0x0010 << (irq - LOCOMO_IRQ_KEY_START)); | ||
245 | locomo_writel(r, mapbase + LOCOMO_KEYBOARD + LOCOMO_KIC); | ||
246 | } | ||
247 | |||
248 | static void locomo_key_unmask_irq(unsigned int irq) | ||
249 | { | ||
250 | void __iomem *mapbase = get_irq_chip_data(irq); | ||
251 | unsigned int r; | ||
252 | r = locomo_readl(mapbase + LOCOMO_KEYBOARD + LOCOMO_KIC); | ||
253 | r |= (0x0010 << (irq - LOCOMO_IRQ_KEY_START)); | ||
254 | locomo_writel(r, mapbase + LOCOMO_KEYBOARD + LOCOMO_KIC); | ||
255 | } | ||
256 | |||
257 | static struct irq_chip locomo_key_chip = { | ||
258 | .name = "LOCOMO-key", | ||
259 | .ack = locomo_key_ack_irq, | ||
260 | .mask = locomo_key_mask_irq, | ||
261 | .unmask = locomo_key_unmask_irq, | ||
262 | }; | ||
263 | |||
264 | static void locomo_gpio_handler(unsigned int irq, struct irq_desc *desc) | 218 | static void locomo_gpio_handler(unsigned int irq, struct irq_desc *desc) |
265 | { | 219 | { |
266 | int req, i; | 220 | int req, i; |
@@ -468,9 +422,10 @@ static void locomo_setup_irq(struct locomo *lchip) | |||
468 | set_irq_chained_handler(lchip->irq, locomo_handler); | 422 | set_irq_chained_handler(lchip->irq, locomo_handler); |
469 | 423 | ||
470 | /* Install handlers for IRQ_LOCOMO_*_BASE */ | 424 | /* Install handlers for IRQ_LOCOMO_*_BASE */ |
471 | set_irq_chip(IRQ_LOCOMO_KEY_BASE, &locomo_chip); | 425 | set_irq_chip(IRQ_LOCOMO_KEY, &locomo_chip); |
472 | set_irq_chip_data(IRQ_LOCOMO_KEY_BASE, irqbase); | 426 | set_irq_chip_data(IRQ_LOCOMO_KEY, irqbase); |
473 | set_irq_chained_handler(IRQ_LOCOMO_KEY_BASE, locomo_key_handler); | 427 | set_irq_handler(IRQ_LOCOMO_KEY, handle_edge_irq); |
428 | set_irq_flags(IRQ_LOCOMO_KEY, IRQF_VALID | IRQF_PROBE); | ||
474 | 429 | ||
475 | set_irq_chip(IRQ_LOCOMO_GPIO_BASE, &locomo_chip); | 430 | set_irq_chip(IRQ_LOCOMO_GPIO_BASE, &locomo_chip); |
476 | set_irq_chip_data(IRQ_LOCOMO_GPIO_BASE, irqbase); | 431 | set_irq_chip_data(IRQ_LOCOMO_GPIO_BASE, irqbase); |
@@ -484,12 +439,6 @@ static void locomo_setup_irq(struct locomo *lchip) | |||
484 | set_irq_chip_data(IRQ_LOCOMO_SPI_BASE, irqbase); | 439 | set_irq_chip_data(IRQ_LOCOMO_SPI_BASE, irqbase); |
485 | set_irq_chained_handler(IRQ_LOCOMO_SPI_BASE, locomo_spi_handler); | 440 | set_irq_chained_handler(IRQ_LOCOMO_SPI_BASE, locomo_spi_handler); |
486 | 441 | ||
487 | /* install handlers for IRQ_LOCOMO_KEY_BASE generated interrupts */ | ||
488 | set_irq_chip(LOCOMO_IRQ_KEY_START, &locomo_key_chip); | ||
489 | set_irq_chip_data(LOCOMO_IRQ_KEY_START, irqbase); | ||
490 | set_irq_handler(LOCOMO_IRQ_KEY_START, handle_edge_irq); | ||
491 | set_irq_flags(LOCOMO_IRQ_KEY_START, IRQF_VALID | IRQF_PROBE); | ||
492 | |||
493 | /* install handlers for IRQ_LOCOMO_GPIO_BASE generated interrupts */ | 442 | /* install handlers for IRQ_LOCOMO_GPIO_BASE generated interrupts */ |
494 | for (irq = LOCOMO_IRQ_GPIO_START; irq < LOCOMO_IRQ_GPIO_START + 16; irq++) { | 443 | for (irq = LOCOMO_IRQ_GPIO_START; irq < LOCOMO_IRQ_GPIO_START + 16; irq++) { |
495 | set_irq_chip(irq, &locomo_gpio_chip); | 444 | set_irq_chip(irq, &locomo_gpio_chip); |
diff --git a/arch/arm/mach-pxa/include/mach/irqs.h b/arch/arm/mach-pxa/include/mach/irqs.h index 3677a9af9c87..33a4f33de271 100644 --- a/arch/arm/mach-pxa/include/mach/irqs.h +++ b/arch/arm/mach-pxa/include/mach/irqs.h | |||
@@ -188,7 +188,6 @@ | |||
188 | #define IRQ_S1_BVD1_STSCHG (IRQ_BOARD_END + 54) | 188 | #define IRQ_S1_BVD1_STSCHG (IRQ_BOARD_END + 54) |
189 | 189 | ||
190 | #define IRQ_LOCOMO_START (IRQ_BOARD_END) | 190 | #define IRQ_LOCOMO_START (IRQ_BOARD_END) |
191 | #define IRQ_LOCOMO_KEY (IRQ_BOARD_END + 0) | ||
192 | #define IRQ_LOCOMO_GPIO0 (IRQ_BOARD_END + 1) | 191 | #define IRQ_LOCOMO_GPIO0 (IRQ_BOARD_END + 1) |
193 | #define IRQ_LOCOMO_GPIO1 (IRQ_BOARD_END + 2) | 192 | #define IRQ_LOCOMO_GPIO1 (IRQ_BOARD_END + 2) |
194 | #define IRQ_LOCOMO_GPIO2 (IRQ_BOARD_END + 3) | 193 | #define IRQ_LOCOMO_GPIO2 (IRQ_BOARD_END + 3) |
@@ -274,7 +273,7 @@ | |||
274 | #define BALLOON3_S0_CD_IRQ IRQ_GPIO(BALLOON3_GPIO_S0_CD) | 273 | #define BALLOON3_S0_CD_IRQ IRQ_GPIO(BALLOON3_GPIO_S0_CD) |
275 | 274 | ||
276 | /* LoCoMo Interrupts (CONFIG_SHARP_LOCOMO) */ | 275 | /* LoCoMo Interrupts (CONFIG_SHARP_LOCOMO) */ |
277 | #define IRQ_LOCOMO_KEY_BASE (IRQ_BOARD_START + 0) | 276 | #define IRQ_LOCOMO_KEY (IRQ_BOARD_START + 0) |
278 | #define IRQ_LOCOMO_GPIO_BASE (IRQ_BOARD_START + 1) | 277 | #define IRQ_LOCOMO_GPIO_BASE (IRQ_BOARD_START + 1) |
279 | #define IRQ_LOCOMO_LT_BASE (IRQ_BOARD_START + 2) | 278 | #define IRQ_LOCOMO_LT_BASE (IRQ_BOARD_START + 2) |
280 | #define IRQ_LOCOMO_SPI_BASE (IRQ_BOARD_START + 3) | 279 | #define IRQ_LOCOMO_SPI_BASE (IRQ_BOARD_START + 3) |
diff --git a/arch/arm/mach-sa1100/include/mach/irqs.h b/arch/arm/mach-sa1100/include/mach/irqs.h index ae81f80b0cf9..9731c7814a32 100644 --- a/arch/arm/mach-sa1100/include/mach/irqs.h +++ b/arch/arm/mach-sa1100/include/mach/irqs.h | |||
@@ -121,7 +121,6 @@ | |||
121 | #define IRQ_S1_BVD1_STSCHG (IRQ_BOARD_END + 54) | 121 | #define IRQ_S1_BVD1_STSCHG (IRQ_BOARD_END + 54) |
122 | 122 | ||
123 | #define IRQ_LOCOMO_START (IRQ_BOARD_END) | 123 | #define IRQ_LOCOMO_START (IRQ_BOARD_END) |
124 | #define IRQ_LOCOMO_KEY (IRQ_BOARD_END + 0) | ||
125 | #define IRQ_LOCOMO_GPIO0 (IRQ_BOARD_END + 1) | 124 | #define IRQ_LOCOMO_GPIO0 (IRQ_BOARD_END + 1) |
126 | #define IRQ_LOCOMO_GPIO1 (IRQ_BOARD_END + 2) | 125 | #define IRQ_LOCOMO_GPIO1 (IRQ_BOARD_END + 2) |
127 | #define IRQ_LOCOMO_GPIO2 (IRQ_BOARD_END + 3) | 126 | #define IRQ_LOCOMO_GPIO2 (IRQ_BOARD_END + 3) |
@@ -168,7 +167,7 @@ | |||
168 | #define IRQ_NEPONSET_SA1111 (IRQ_BOARD_START + 2) | 167 | #define IRQ_NEPONSET_SA1111 (IRQ_BOARD_START + 2) |
169 | 168 | ||
170 | /* LoCoMo Interrupts (CONFIG_SHARP_LOCOMO) */ | 169 | /* LoCoMo Interrupts (CONFIG_SHARP_LOCOMO) */ |
171 | #define IRQ_LOCOMO_KEY_BASE (IRQ_BOARD_START + 0) | 170 | #define IRQ_LOCOMO_KEY (IRQ_BOARD_START + 0) |
172 | #define IRQ_LOCOMO_GPIO_BASE (IRQ_BOARD_START + 1) | 171 | #define IRQ_LOCOMO_GPIO_BASE (IRQ_BOARD_START + 1) |
173 | #define IRQ_LOCOMO_LT_BASE (IRQ_BOARD_START + 2) | 172 | #define IRQ_LOCOMO_LT_BASE (IRQ_BOARD_START + 2) |
174 | #define IRQ_LOCOMO_SPI_BASE (IRQ_BOARD_START + 3) | 173 | #define IRQ_LOCOMO_SPI_BASE (IRQ_BOARD_START + 3) |
diff --git a/drivers/input/keyboard/locomokbd.c b/drivers/input/keyboard/locomokbd.c index 9caed30f3bbb..b1ab29861e1c 100644 --- a/drivers/input/keyboard/locomokbd.c +++ b/drivers/input/keyboard/locomokbd.c | |||
@@ -192,11 +192,18 @@ static void locomokbd_scankeyboard(struct locomokbd *locomokbd) | |||
192 | static irqreturn_t locomokbd_interrupt(int irq, void *dev_id) | 192 | static irqreturn_t locomokbd_interrupt(int irq, void *dev_id) |
193 | { | 193 | { |
194 | struct locomokbd *locomokbd = dev_id; | 194 | struct locomokbd *locomokbd = dev_id; |
195 | u16 r; | ||
196 | |||
197 | r = locomo_readl(locomokbd->base + LOCOMO_KIC); | ||
198 | if ((r & 0x0001) == 0) | ||
199 | return IRQ_HANDLED; | ||
200 | |||
201 | locomo_writel(r & ~0x0100, locomokbd->base + LOCOMO_KIC); /* Ack */ | ||
202 | |||
195 | /** wait chattering delay **/ | 203 | /** wait chattering delay **/ |
196 | udelay(100); | 204 | udelay(100); |
197 | 205 | ||
198 | locomokbd_scankeyboard(locomokbd); | 206 | locomokbd_scankeyboard(locomokbd); |
199 | |||
200 | return IRQ_HANDLED; | 207 | return IRQ_HANDLED; |
201 | } | 208 | } |
202 | 209 | ||
@@ -210,6 +217,25 @@ static void locomokbd_timer_callback(unsigned long data) | |||
210 | locomokbd_scankeyboard(locomokbd); | 217 | locomokbd_scankeyboard(locomokbd); |
211 | } | 218 | } |
212 | 219 | ||
220 | static int locomokbd_open(struct input_dev *dev) | ||
221 | { | ||
222 | struct locomokbd *locomokbd = input_get_drvdata(dev); | ||
223 | u16 r; | ||
224 | |||
225 | r = locomo_readl(locomokbd->base + LOCOMO_KIC) | 0x0010; | ||
226 | locomo_writel(r, locomokbd->base + LOCOMO_KIC); | ||
227 | return 0; | ||
228 | } | ||
229 | |||
230 | static void locomokbd_close(struct input_dev *dev) | ||
231 | { | ||
232 | struct locomokbd *locomokbd = input_get_drvdata(dev); | ||
233 | u16 r; | ||
234 | |||
235 | r = locomo_readl(locomokbd->base + LOCOMO_KIC) & ~0x0010; | ||
236 | locomo_writel(r, locomokbd->base + LOCOMO_KIC); | ||
237 | } | ||
238 | |||
213 | static int __devinit locomokbd_probe(struct locomo_dev *dev) | 239 | static int __devinit locomokbd_probe(struct locomo_dev *dev) |
214 | { | 240 | { |
215 | struct locomokbd *locomokbd; | 241 | struct locomokbd *locomokbd; |
@@ -253,6 +279,8 @@ static int __devinit locomokbd_probe(struct locomo_dev *dev) | |||
253 | input_dev->id.vendor = 0x0001; | 279 | input_dev->id.vendor = 0x0001; |
254 | input_dev->id.product = 0x0001; | 280 | input_dev->id.product = 0x0001; |
255 | input_dev->id.version = 0x0100; | 281 | input_dev->id.version = 0x0100; |
282 | input_dev->open = locomokbd_open; | ||
283 | input_dev->close = locomokbd_close; | ||
256 | input_dev->dev.parent = &dev->dev; | 284 | input_dev->dev.parent = &dev->dev; |
257 | 285 | ||
258 | input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP) | | 286 | input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP) | |
@@ -261,6 +289,8 @@ static int __devinit locomokbd_probe(struct locomo_dev *dev) | |||
261 | input_dev->keycodesize = sizeof(locomokbd_keycode[0]); | 289 | input_dev->keycodesize = sizeof(locomokbd_keycode[0]); |
262 | input_dev->keycodemax = ARRAY_SIZE(locomokbd_keycode); | 290 | input_dev->keycodemax = ARRAY_SIZE(locomokbd_keycode); |
263 | 291 | ||
292 | input_set_drvdata(input_dev, locomokbd); | ||
293 | |||
264 | memcpy(locomokbd->keycode, locomokbd_keycode, sizeof(locomokbd->keycode)); | 294 | memcpy(locomokbd->keycode, locomokbd_keycode, sizeof(locomokbd->keycode)); |
265 | for (i = 0; i < LOCOMOKBD_NUMKEYS; i++) | 295 | for (i = 0; i < LOCOMOKBD_NUMKEYS; i++) |
266 | set_bit(locomokbd->keycode[i], input_dev->keybit); | 296 | set_bit(locomokbd->keycode[i], input_dev->keybit); |