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); |
