diff options
author | Dmitry Torokhov <dtor_core@ameritech.net> | 2005-09-09 21:14:47 -0400 |
---|---|---|
committer | Dmitry Torokhov <dtor_core@ameritech.net> | 2005-09-09 21:14:47 -0400 |
commit | d344c5e0856ad03278d8700b503762dbc8b86e12 (patch) | |
tree | a6d893a643470a3c2580a58f3228a55fa1fd1d82 /drivers/input | |
parent | 010988e888a0abbe7118635c1b33d049caae6b29 (diff) | |
parent | 87fc767b832ef5a681a0ff9d203c3289bc3be2bf (diff) |
Manual merge with Linus
Diffstat (limited to 'drivers/input')
-rw-r--r-- | drivers/input/evdev.c | 12 | ||||
-rw-r--r-- | drivers/input/gameport/emu10k1-gp.c | 2 | ||||
-rw-r--r-- | drivers/input/gameport/fm801-gp.c | 2 | ||||
-rw-r--r-- | drivers/input/gameport/ns558.c | 4 | ||||
-rw-r--r-- | drivers/input/input.c | 11 | ||||
-rw-r--r-- | drivers/input/joystick/a3d.c | 2 | ||||
-rw-r--r-- | drivers/input/joystick/adi.c | 2 | ||||
-rw-r--r-- | drivers/input/joystick/analog.c | 2 | ||||
-rw-r--r-- | drivers/input/joystick/cobra.c | 2 | ||||
-rw-r--r-- | drivers/input/joystick/db9.c | 2 | ||||
-rw-r--r-- | drivers/input/joystick/gamecon.c | 2 | ||||
-rw-r--r-- | drivers/input/joystick/gf2k.c | 2 | ||||
-rw-r--r-- | drivers/input/joystick/grip.c | 2 | ||||
-rw-r--r-- | drivers/input/joystick/grip_mp.c | 2 | ||||
-rw-r--r-- | drivers/input/joystick/guillemot.c | 2 | ||||
-rw-r--r-- | drivers/input/joystick/interact.c | 2 | ||||
-rw-r--r-- | drivers/input/joystick/sidewinder.c | 2 | ||||
-rw-r--r-- | drivers/input/joystick/tmdc.c | 2 | ||||
-rw-r--r-- | drivers/input/joystick/turbografx.c | 2 | ||||
-rw-r--r-- | drivers/input/keyboard/corgikbd.c | 104 | ||||
-rw-r--r-- | drivers/input/mouse/psmouse-base.c | 2 | ||||
-rw-r--r-- | drivers/input/serio/serport.c | 4 | ||||
-rw-r--r-- | drivers/input/touchscreen/corgi_ts.c | 51 |
23 files changed, 131 insertions, 89 deletions
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index 3a8314bb7902..3738d173f9a6 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c | |||
@@ -160,6 +160,8 @@ struct input_event_compat { | |||
160 | # define COMPAT_TEST IS_IA32_PROCESS(ia64_task_regs(current)) | 160 | # define COMPAT_TEST IS_IA32_PROCESS(ia64_task_regs(current)) |
161 | #elif defined(CONFIG_ARCH_S390) | 161 | #elif defined(CONFIG_ARCH_S390) |
162 | # define COMPAT_TEST test_thread_flag(TIF_31BIT) | 162 | # define COMPAT_TEST test_thread_flag(TIF_31BIT) |
163 | #elif defined(CONFIG_MIPS) | ||
164 | # define COMPAT_TEST (current->thread.mflags & MF_32BIT_ADDR) | ||
163 | #else | 165 | #else |
164 | # define COMPAT_TEST test_thread_flag(TIF_32BIT) | 166 | # define COMPAT_TEST test_thread_flag(TIF_32BIT) |
165 | #endif | 167 | #endif |
@@ -391,6 +393,7 @@ static long evdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
391 | case EV_LED: bits = dev->ledbit; len = LED_MAX; break; | 393 | case EV_LED: bits = dev->ledbit; len = LED_MAX; break; |
392 | case EV_SND: bits = dev->sndbit; len = SND_MAX; break; | 394 | case EV_SND: bits = dev->sndbit; len = SND_MAX; break; |
393 | case EV_FF: bits = dev->ffbit; len = FF_MAX; break; | 395 | case EV_FF: bits = dev->ffbit; len = FF_MAX; break; |
396 | case EV_SW: bits = dev->swbit; len = SW_MAX; break; | ||
394 | default: return -EINVAL; | 397 | default: return -EINVAL; |
395 | } | 398 | } |
396 | len = NBITS(len) * sizeof(long); | 399 | len = NBITS(len) * sizeof(long); |
@@ -419,6 +422,13 @@ static long evdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
419 | return copy_to_user(p, dev->snd, len) ? -EFAULT : len; | 422 | return copy_to_user(p, dev->snd, len) ? -EFAULT : len; |
420 | } | 423 | } |
421 | 424 | ||
425 | if (_IOC_NR(cmd) == _IOC_NR(EVIOCGSW(0))) { | ||
426 | int len; | ||
427 | len = NBITS(SW_MAX) * sizeof(long); | ||
428 | if (len > _IOC_SIZE(cmd)) len = _IOC_SIZE(cmd); | ||
429 | return copy_to_user(p, dev->sw, len) ? -EFAULT : len; | ||
430 | } | ||
431 | |||
422 | if (_IOC_NR(cmd) == _IOC_NR(EVIOCGNAME(0))) { | 432 | if (_IOC_NR(cmd) == _IOC_NR(EVIOCGNAME(0))) { |
423 | int len; | 433 | int len; |
424 | if (!dev->name) return -ENOENT; | 434 | if (!dev->name) return -ENOENT; |
@@ -499,7 +509,7 @@ do { \ | |||
499 | int len = NBITS_COMPAT((max)) * sizeof(compat_long_t); \ | 509 | int len = NBITS_COMPAT((max)) * sizeof(compat_long_t); \ |
500 | if (len > _IOC_SIZE(cmd)) len = _IOC_SIZE(cmd); \ | 510 | if (len > _IOC_SIZE(cmd)) len = _IOC_SIZE(cmd); \ |
501 | for (i = 0; i < len / sizeof(compat_long_t); i++) \ | 511 | for (i = 0; i < len / sizeof(compat_long_t); i++) \ |
502 | if (copy_to_user((compat_long_t*) p + i, \ | 512 | if (copy_to_user((compat_long_t __user *) p + i, \ |
503 | (compat_long_t*) (bit) + i + 1 - ((i % 2) << 1), \ | 513 | (compat_long_t*) (bit) + i + 1 - ((i % 2) << 1), \ |
504 | sizeof(compat_long_t))) \ | 514 | sizeof(compat_long_t))) \ |
505 | return -EFAULT; \ | 515 | return -EFAULT; \ |
diff --git a/drivers/input/gameport/emu10k1-gp.c b/drivers/input/gameport/emu10k1-gp.c index a0118038330a..462f8d300aae 100644 --- a/drivers/input/gameport/emu10k1-gp.c +++ b/drivers/input/gameport/emu10k1-gp.c | |||
@@ -75,7 +75,7 @@ static int __devinit emu_probe(struct pci_dev *pdev, const struct pci_device_id | |||
75 | if (!request_region(ioport, iolen, "emu10k1-gp")) | 75 | if (!request_region(ioport, iolen, "emu10k1-gp")) |
76 | return -EBUSY; | 76 | return -EBUSY; |
77 | 77 | ||
78 | emu = kcalloc(1, sizeof(struct emu), GFP_KERNEL); | 78 | emu = kzalloc(sizeof(struct emu), GFP_KERNEL); |
79 | port = gameport_allocate_port(); | 79 | port = gameport_allocate_port(); |
80 | if (!emu || !port) { | 80 | if (!emu || !port) { |
81 | printk(KERN_ERR "emu10k1-gp: Memory allocation failed\n"); | 81 | printk(KERN_ERR "emu10k1-gp: Memory allocation failed\n"); |
diff --git a/drivers/input/gameport/fm801-gp.c b/drivers/input/gameport/fm801-gp.c index 57615bc63906..47e93daa0fa7 100644 --- a/drivers/input/gameport/fm801-gp.c +++ b/drivers/input/gameport/fm801-gp.c | |||
@@ -83,7 +83,7 @@ static int __devinit fm801_gp_probe(struct pci_dev *pci, const struct pci_device | |||
83 | struct fm801_gp *gp; | 83 | struct fm801_gp *gp; |
84 | struct gameport *port; | 84 | struct gameport *port; |
85 | 85 | ||
86 | gp = kcalloc(1, sizeof(struct fm801_gp), GFP_KERNEL); | 86 | gp = kzalloc(sizeof(struct fm801_gp), GFP_KERNEL); |
87 | port = gameport_allocate_port(); | 87 | port = gameport_allocate_port(); |
88 | if (!gp || !port) { | 88 | if (!gp || !port) { |
89 | printk(KERN_ERR "fm801-gp: Memory allocation failed\n"); | 89 | printk(KERN_ERR "fm801-gp: Memory allocation failed\n"); |
diff --git a/drivers/input/gameport/ns558.c b/drivers/input/gameport/ns558.c index 70f051894a3c..d2e55dc956ba 100644 --- a/drivers/input/gameport/ns558.c +++ b/drivers/input/gameport/ns558.c | |||
@@ -142,7 +142,7 @@ static int ns558_isa_probe(int io) | |||
142 | return -EBUSY; | 142 | return -EBUSY; |
143 | } | 143 | } |
144 | 144 | ||
145 | ns558 = kcalloc(1, sizeof(struct ns558), GFP_KERNEL); | 145 | ns558 = kzalloc(sizeof(struct ns558), GFP_KERNEL); |
146 | port = gameport_allocate_port(); | 146 | port = gameport_allocate_port(); |
147 | if (!ns558 || !port) { | 147 | if (!ns558 || !port) { |
148 | printk(KERN_ERR "ns558: Memory allocation failed.\n"); | 148 | printk(KERN_ERR "ns558: Memory allocation failed.\n"); |
@@ -215,7 +215,7 @@ static int ns558_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *did) | |||
215 | if (!request_region(ioport, iolen, "ns558-pnp")) | 215 | if (!request_region(ioport, iolen, "ns558-pnp")) |
216 | return -EBUSY; | 216 | return -EBUSY; |
217 | 217 | ||
218 | ns558 = kcalloc(1, sizeof(struct ns558), GFP_KERNEL); | 218 | ns558 = kzalloc(sizeof(struct ns558), GFP_KERNEL); |
219 | port = gameport_allocate_port(); | 219 | port = gameport_allocate_port(); |
220 | if (!ns558 || !port) { | 220 | if (!ns558 || !port) { |
221 | printk(KERN_ERR "ns558: Memory allocation failed\n"); | 221 | printk(KERN_ERR "ns558: Memory allocation failed\n"); |
diff --git a/drivers/input/input.c b/drivers/input/input.c index a275211c8e1e..88636a204525 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c | |||
@@ -89,6 +89,15 @@ void input_event(struct input_dev *dev, unsigned int type, unsigned int code, in | |||
89 | 89 | ||
90 | break; | 90 | break; |
91 | 91 | ||
92 | case EV_SW: | ||
93 | |||
94 | if (code > SW_MAX || !test_bit(code, dev->swbit) || !!test_bit(code, dev->sw) == value) | ||
95 | return; | ||
96 | |||
97 | change_bit(code, dev->sw); | ||
98 | |||
99 | break; | ||
100 | |||
92 | case EV_ABS: | 101 | case EV_ABS: |
93 | 102 | ||
94 | if (code > ABS_MAX || !test_bit(code, dev->absbit)) | 103 | if (code > ABS_MAX || !test_bit(code, dev->absbit)) |
@@ -402,6 +411,7 @@ static void input_call_hotplug(char *verb, struct input_dev *dev) | |||
402 | SPRINTF_BIT_A2(ledbit, "LED=", LED_MAX, EV_LED); | 411 | SPRINTF_BIT_A2(ledbit, "LED=", LED_MAX, EV_LED); |
403 | SPRINTF_BIT_A2(sndbit, "SND=", SND_MAX, EV_SND); | 412 | SPRINTF_BIT_A2(sndbit, "SND=", SND_MAX, EV_SND); |
404 | SPRINTF_BIT_A2(ffbit, "FF=", FF_MAX, EV_FF); | 413 | SPRINTF_BIT_A2(ffbit, "FF=", FF_MAX, EV_FF); |
414 | SPRINTF_BIT_A2(swbit, "SW=", SW_MAX, EV_SW); | ||
405 | 415 | ||
406 | envp[i++] = NULL; | 416 | envp[i++] = NULL; |
407 | 417 | ||
@@ -490,6 +500,7 @@ static int input_devices_read(char *buf, char **start, off_t pos, int count, int | |||
490 | SPRINTF_BIT_B2(ledbit, "LED=", LED_MAX, EV_LED); | 500 | SPRINTF_BIT_B2(ledbit, "LED=", LED_MAX, EV_LED); |
491 | SPRINTF_BIT_B2(sndbit, "SND=", SND_MAX, EV_SND); | 501 | SPRINTF_BIT_B2(sndbit, "SND=", SND_MAX, EV_SND); |
492 | SPRINTF_BIT_B2(ffbit, "FF=", FF_MAX, EV_FF); | 502 | SPRINTF_BIT_B2(ffbit, "FF=", FF_MAX, EV_FF); |
503 | SPRINTF_BIT_B2(swbit, "SW=", SW_MAX, EV_SW); | ||
493 | 504 | ||
494 | len += sprintf(buf + len, "\n"); | 505 | len += sprintf(buf + len, "\n"); |
495 | 506 | ||
diff --git a/drivers/input/joystick/a3d.c b/drivers/input/joystick/a3d.c index bf34f75b9467..bf65430181fa 100644 --- a/drivers/input/joystick/a3d.c +++ b/drivers/input/joystick/a3d.c | |||
@@ -269,7 +269,7 @@ static int a3d_connect(struct gameport *gameport, struct gameport_driver *drv) | |||
269 | int i; | 269 | int i; |
270 | int err; | 270 | int err; |
271 | 271 | ||
272 | if (!(a3d = kcalloc(1, sizeof(struct a3d), GFP_KERNEL))) | 272 | if (!(a3d = kzalloc(sizeof(struct a3d), GFP_KERNEL))) |
273 | return -ENOMEM; | 273 | return -ENOMEM; |
274 | 274 | ||
275 | a3d->gameport = gameport; | 275 | a3d->gameport = gameport; |
diff --git a/drivers/input/joystick/adi.c b/drivers/input/joystick/adi.c index 265962956c63..cf35ae638a0d 100644 --- a/drivers/input/joystick/adi.c +++ b/drivers/input/joystick/adi.c | |||
@@ -469,7 +469,7 @@ static int adi_connect(struct gameport *gameport, struct gameport_driver *drv) | |||
469 | int i; | 469 | int i; |
470 | int err; | 470 | int err; |
471 | 471 | ||
472 | if (!(port = kcalloc(1, sizeof(struct adi_port), GFP_KERNEL))) | 472 | if (!(port = kzalloc(sizeof(struct adi_port), GFP_KERNEL))) |
473 | return -ENOMEM; | 473 | return -ENOMEM; |
474 | 474 | ||
475 | port->gameport = gameport; | 475 | port->gameport = gameport; |
diff --git a/drivers/input/joystick/analog.c b/drivers/input/joystick/analog.c index c3a5739030c3..64b1313a3c66 100644 --- a/drivers/input/joystick/analog.c +++ b/drivers/input/joystick/analog.c | |||
@@ -655,7 +655,7 @@ static int analog_connect(struct gameport *gameport, struct gameport_driver *drv | |||
655 | int i; | 655 | int i; |
656 | int err; | 656 | int err; |
657 | 657 | ||
658 | if (!(port = kcalloc(1, sizeof(struct analog_port), GFP_KERNEL))) | 658 | if (!(port = kzalloc(sizeof(struct analog_port), GFP_KERNEL))) |
659 | return - ENOMEM; | 659 | return - ENOMEM; |
660 | 660 | ||
661 | err = analog_init_port(gameport, drv, port); | 661 | err = analog_init_port(gameport, drv, port); |
diff --git a/drivers/input/joystick/cobra.c b/drivers/input/joystick/cobra.c index a6002205328f..0b2e9fa26579 100644 --- a/drivers/input/joystick/cobra.c +++ b/drivers/input/joystick/cobra.c | |||
@@ -163,7 +163,7 @@ static int cobra_connect(struct gameport *gameport, struct gameport_driver *drv) | |||
163 | int i, j; | 163 | int i, j; |
164 | int err; | 164 | int err; |
165 | 165 | ||
166 | if (!(cobra = kcalloc(1, sizeof(struct cobra), GFP_KERNEL))) | 166 | if (!(cobra = kzalloc(sizeof(struct cobra), GFP_KERNEL))) |
167 | return -ENOMEM; | 167 | return -ENOMEM; |
168 | 168 | ||
169 | cobra->gameport = gameport; | 169 | cobra->gameport = gameport; |
diff --git a/drivers/input/joystick/db9.c b/drivers/input/joystick/db9.c index fbd3eed07f90..2a3e4bb2da50 100644 --- a/drivers/input/joystick/db9.c +++ b/drivers/input/joystick/db9.c | |||
@@ -572,7 +572,7 @@ static struct db9 __init *db9_probe(int *config, int nargs) | |||
572 | } | 572 | } |
573 | } | 573 | } |
574 | 574 | ||
575 | if (!(db9 = kcalloc(1, sizeof(struct db9), GFP_KERNEL))) { | 575 | if (!(db9 = kzalloc(sizeof(struct db9), GFP_KERNEL))) { |
576 | parport_put_port(pp); | 576 | parport_put_port(pp); |
577 | return NULL; | 577 | return NULL; |
578 | } | 578 | } |
diff --git a/drivers/input/joystick/gamecon.c b/drivers/input/joystick/gamecon.c index 95bbdd302aad..5427bf9fc862 100644 --- a/drivers/input/joystick/gamecon.c +++ b/drivers/input/joystick/gamecon.c | |||
@@ -554,7 +554,7 @@ static struct gc __init *gc_probe(int *config, int nargs) | |||
554 | return NULL; | 554 | return NULL; |
555 | } | 555 | } |
556 | 556 | ||
557 | if (!(gc = kcalloc(1, sizeof(struct gc), GFP_KERNEL))) { | 557 | if (!(gc = kzalloc(sizeof(struct gc), GFP_KERNEL))) { |
558 | parport_put_port(pp); | 558 | parport_put_port(pp); |
559 | return NULL; | 559 | return NULL; |
560 | } | 560 | } |
diff --git a/drivers/input/joystick/gf2k.c b/drivers/input/joystick/gf2k.c index 7d969420066c..8e4f92b115e6 100644 --- a/drivers/input/joystick/gf2k.c +++ b/drivers/input/joystick/gf2k.c | |||
@@ -242,7 +242,7 @@ static int gf2k_connect(struct gameport *gameport, struct gameport_driver *drv) | |||
242 | unsigned char data[GF2K_LENGTH]; | 242 | unsigned char data[GF2K_LENGTH]; |
243 | int i, err; | 243 | int i, err; |
244 | 244 | ||
245 | if (!(gf2k = kcalloc(1, sizeof(struct gf2k), GFP_KERNEL))) | 245 | if (!(gf2k = kzalloc(sizeof(struct gf2k), GFP_KERNEL))) |
246 | return -ENOMEM; | 246 | return -ENOMEM; |
247 | 247 | ||
248 | gf2k->gameport = gameport; | 248 | gf2k->gameport = gameport; |
diff --git a/drivers/input/joystick/grip.c b/drivers/input/joystick/grip.c index d1500d2562d6..9d3f910dd568 100644 --- a/drivers/input/joystick/grip.c +++ b/drivers/input/joystick/grip.c | |||
@@ -301,7 +301,7 @@ static int grip_connect(struct gameport *gameport, struct gameport_driver *drv) | |||
301 | int i, j, t; | 301 | int i, j, t; |
302 | int err; | 302 | int err; |
303 | 303 | ||
304 | if (!(grip = kcalloc(1, sizeof(struct grip), GFP_KERNEL))) | 304 | if (!(grip = kzalloc(sizeof(struct grip), GFP_KERNEL))) |
305 | return -ENOMEM; | 305 | return -ENOMEM; |
306 | 306 | ||
307 | grip->gameport = gameport; | 307 | grip->gameport = gameport; |
diff --git a/drivers/input/joystick/grip_mp.c b/drivers/input/joystick/grip_mp.c index 0da7bd133ccf..da17eee6f574 100644 --- a/drivers/input/joystick/grip_mp.c +++ b/drivers/input/joystick/grip_mp.c | |||
@@ -607,7 +607,7 @@ static int grip_connect(struct gameport *gameport, struct gameport_driver *drv) | |||
607 | struct grip_mp *grip; | 607 | struct grip_mp *grip; |
608 | int err; | 608 | int err; |
609 | 609 | ||
610 | if (!(grip = kcalloc(1, sizeof(struct grip_mp), GFP_KERNEL))) | 610 | if (!(grip = kzalloc(sizeof(struct grip_mp), GFP_KERNEL))) |
611 | return -ENOMEM; | 611 | return -ENOMEM; |
612 | 612 | ||
613 | grip->gameport = gameport; | 613 | grip->gameport = gameport; |
diff --git a/drivers/input/joystick/guillemot.c b/drivers/input/joystick/guillemot.c index f93da7bc082d..6a70ec429f06 100644 --- a/drivers/input/joystick/guillemot.c +++ b/drivers/input/joystick/guillemot.c | |||
@@ -183,7 +183,7 @@ static int guillemot_connect(struct gameport *gameport, struct gameport_driver * | |||
183 | int i, t; | 183 | int i, t; |
184 | int err; | 184 | int err; |
185 | 185 | ||
186 | if (!(guillemot = kcalloc(1, sizeof(struct guillemot), GFP_KERNEL))) | 186 | if (!(guillemot = kzalloc(sizeof(struct guillemot), GFP_KERNEL))) |
187 | return -ENOMEM; | 187 | return -ENOMEM; |
188 | 188 | ||
189 | guillemot->gameport = gameport; | 189 | guillemot->gameport = gameport; |
diff --git a/drivers/input/joystick/interact.c b/drivers/input/joystick/interact.c index 9d3f8c38cb09..d7b3472bd686 100644 --- a/drivers/input/joystick/interact.c +++ b/drivers/input/joystick/interact.c | |||
@@ -212,7 +212,7 @@ static int interact_connect(struct gameport *gameport, struct gameport_driver *d | |||
212 | int i, t; | 212 | int i, t; |
213 | int err; | 213 | int err; |
214 | 214 | ||
215 | if (!(interact = kcalloc(1, sizeof(struct interact), GFP_KERNEL))) | 215 | if (!(interact = kzalloc(sizeof(struct interact), GFP_KERNEL))) |
216 | return -ENOMEM; | 216 | return -ENOMEM; |
217 | 217 | ||
218 | interact->gameport = gameport; | 218 | interact->gameport = gameport; |
diff --git a/drivers/input/joystick/sidewinder.c b/drivers/input/joystick/sidewinder.c index 47144a7ed9e7..9e0353721a35 100644 --- a/drivers/input/joystick/sidewinder.c +++ b/drivers/input/joystick/sidewinder.c | |||
@@ -590,7 +590,7 @@ static int sw_connect(struct gameport *gameport, struct gameport_driver *drv) | |||
590 | 590 | ||
591 | comment[0] = 0; | 591 | comment[0] = 0; |
592 | 592 | ||
593 | sw = kcalloc(1, sizeof(struct sw), GFP_KERNEL); | 593 | sw = kzalloc(sizeof(struct sw), GFP_KERNEL); |
594 | buf = kmalloc(SW_LENGTH, GFP_KERNEL); | 594 | buf = kmalloc(SW_LENGTH, GFP_KERNEL); |
595 | idbuf = kmalloc(SW_LENGTH, GFP_KERNEL); | 595 | idbuf = kmalloc(SW_LENGTH, GFP_KERNEL); |
596 | if (!sw || !buf || !idbuf) { | 596 | if (!sw || !buf || !idbuf) { |
diff --git a/drivers/input/joystick/tmdc.c b/drivers/input/joystick/tmdc.c index 9eb9954cac6e..7431efc4330e 100644 --- a/drivers/input/joystick/tmdc.c +++ b/drivers/input/joystick/tmdc.c | |||
@@ -262,7 +262,7 @@ static int tmdc_connect(struct gameport *gameport, struct gameport_driver *drv) | |||
262 | int i, j, k, l, m; | 262 | int i, j, k, l, m; |
263 | int err; | 263 | int err; |
264 | 264 | ||
265 | if (!(tmdc = kcalloc(1, sizeof(struct tmdc), GFP_KERNEL))) | 265 | if (!(tmdc = kzalloc(sizeof(struct tmdc), GFP_KERNEL))) |
266 | return -ENOMEM; | 266 | return -ENOMEM; |
267 | 267 | ||
268 | tmdc->gameport = gameport; | 268 | tmdc->gameport = gameport; |
diff --git a/drivers/input/joystick/turbografx.c b/drivers/input/joystick/turbografx.c index 28100d461cb7..0c5b9c8297cd 100644 --- a/drivers/input/joystick/turbografx.c +++ b/drivers/input/joystick/turbografx.c | |||
@@ -178,7 +178,7 @@ static struct tgfx __init *tgfx_probe(int *config, int nargs) | |||
178 | return NULL; | 178 | return NULL; |
179 | } | 179 | } |
180 | 180 | ||
181 | if (!(tgfx = kcalloc(1, sizeof(struct tgfx), GFP_KERNEL))) { | 181 | if (!(tgfx = kzalloc(sizeof(struct tgfx), GFP_KERNEL))) { |
182 | parport_put_port(pp); | 182 | parport_put_port(pp); |
183 | return NULL; | 183 | return NULL; |
184 | } | 184 | } |
diff --git a/drivers/input/keyboard/corgikbd.c b/drivers/input/keyboard/corgikbd.c index a8551711e8d6..cd4b6e795013 100644 --- a/drivers/input/keyboard/corgikbd.c +++ b/drivers/input/keyboard/corgikbd.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
17 | #include <linux/input.h> | 17 | #include <linux/input.h> |
18 | #include <linux/interrupt.h> | 18 | #include <linux/interrupt.h> |
19 | #include <linux/jiffies.h> | ||
19 | #include <linux/module.h> | 20 | #include <linux/module.h> |
20 | #include <linux/slab.h> | 21 | #include <linux/slab.h> |
21 | #include <asm/irq.h> | 22 | #include <asm/irq.h> |
@@ -32,7 +33,6 @@ | |||
32 | /* zero code, 124 scancodes + 3 hinge combinations */ | 33 | /* zero code, 124 scancodes + 3 hinge combinations */ |
33 | #define NR_SCANCODES ( SCANCODE(KB_ROWS-1,KB_COLS-1) +1 +1 +3 ) | 34 | #define NR_SCANCODES ( SCANCODE(KB_ROWS-1,KB_COLS-1) +1 +1 +3 ) |
34 | #define SCAN_INTERVAL (HZ/10) | 35 | #define SCAN_INTERVAL (HZ/10) |
35 | #define CORGIKBD_PRESSED 1 | ||
36 | 36 | ||
37 | #define HINGE_SCAN_INTERVAL (HZ/4) | 37 | #define HINGE_SCAN_INTERVAL (HZ/4) |
38 | 38 | ||
@@ -73,25 +73,13 @@ struct corgikbd { | |||
73 | struct input_dev input; | 73 | struct input_dev input; |
74 | char phys[32]; | 74 | char phys[32]; |
75 | 75 | ||
76 | unsigned char state[ARRAY_SIZE(corgikbd_keycode)]; | ||
77 | spinlock_t lock; | 76 | spinlock_t lock; |
78 | |||
79 | struct timer_list timer; | 77 | struct timer_list timer; |
80 | struct timer_list htimer; | 78 | struct timer_list htimer; |
81 | }; | ||
82 | 79 | ||
83 | static void handle_scancode(unsigned int pressed,unsigned int scancode, struct corgikbd *corgikbd_data) | 80 | unsigned int suspended; |
84 | { | 81 | unsigned long suspend_jiffies; |
85 | if (pressed && !(corgikbd_data->state[scancode] & CORGIKBD_PRESSED)) { | 82 | }; |
86 | corgikbd_data->state[scancode] |= CORGIKBD_PRESSED; | ||
87 | input_report_key(&corgikbd_data->input, corgikbd_data->keycode[scancode], 1); | ||
88 | if (corgikbd_data->keycode[scancode] == CORGI_KEY_OFF) | ||
89 | input_event(&corgikbd_data->input, EV_PWR, CORGI_KEY_OFF, 1); | ||
90 | } else if (!pressed && corgikbd_data->state[scancode] & CORGIKBD_PRESSED) { | ||
91 | corgikbd_data->state[scancode] &= ~CORGIKBD_PRESSED; | ||
92 | input_report_key(&corgikbd_data->input, corgikbd_data->keycode[scancode], 0); | ||
93 | } | ||
94 | } | ||
95 | 83 | ||
96 | #define KB_DISCHARGE_DELAY 10 | 84 | #define KB_DISCHARGE_DELAY 10 |
97 | #define KB_ACTIVATE_DELAY 10 | 85 | #define KB_ACTIVATE_DELAY 10 |
@@ -105,36 +93,36 @@ static void handle_scancode(unsigned int pressed,unsigned int scancode, struct c | |||
105 | */ | 93 | */ |
106 | static inline void corgikbd_discharge_all(void) | 94 | static inline void corgikbd_discharge_all(void) |
107 | { | 95 | { |
108 | // STROBE All HiZ | 96 | /* STROBE All HiZ */ |
109 | GPCR2 = CORGI_GPIO_ALL_STROBE_BIT; | 97 | GPCR2 = CORGI_GPIO_ALL_STROBE_BIT; |
110 | GPDR2 &= ~CORGI_GPIO_ALL_STROBE_BIT; | 98 | GPDR2 &= ~CORGI_GPIO_ALL_STROBE_BIT; |
111 | } | 99 | } |
112 | 100 | ||
113 | static inline void corgikbd_activate_all(void) | 101 | static inline void corgikbd_activate_all(void) |
114 | { | 102 | { |
115 | // STROBE ALL -> High | 103 | /* STROBE ALL -> High */ |
116 | GPSR2 = CORGI_GPIO_ALL_STROBE_BIT; | 104 | GPSR2 = CORGI_GPIO_ALL_STROBE_BIT; |
117 | GPDR2 |= CORGI_GPIO_ALL_STROBE_BIT; | 105 | GPDR2 |= CORGI_GPIO_ALL_STROBE_BIT; |
118 | 106 | ||
119 | udelay(KB_DISCHARGE_DELAY); | 107 | udelay(KB_DISCHARGE_DELAY); |
120 | 108 | ||
121 | // Clear any interrupts we may have triggered when altering the GPIO lines | 109 | /* Clear any interrupts we may have triggered when altering the GPIO lines */ |
122 | GEDR1 = CORGI_GPIO_HIGH_SENSE_BIT; | 110 | GEDR1 = CORGI_GPIO_HIGH_SENSE_BIT; |
123 | GEDR2 = CORGI_GPIO_LOW_SENSE_BIT; | 111 | GEDR2 = CORGI_GPIO_LOW_SENSE_BIT; |
124 | } | 112 | } |
125 | 113 | ||
126 | static inline void corgikbd_activate_col(int col) | 114 | static inline void corgikbd_activate_col(int col) |
127 | { | 115 | { |
128 | // STROBE col -> High, not col -> HiZ | 116 | /* STROBE col -> High, not col -> HiZ */ |
129 | GPSR2 = CORGI_GPIO_STROBE_BIT(col); | 117 | GPSR2 = CORGI_GPIO_STROBE_BIT(col); |
130 | GPDR2 = (GPDR2 & ~CORGI_GPIO_ALL_STROBE_BIT) | CORGI_GPIO_STROBE_BIT(col); | 118 | GPDR2 = (GPDR2 & ~CORGI_GPIO_ALL_STROBE_BIT) | CORGI_GPIO_STROBE_BIT(col); |
131 | } | 119 | } |
132 | 120 | ||
133 | static inline void corgikbd_reset_col(int col) | 121 | static inline void corgikbd_reset_col(int col) |
134 | { | 122 | { |
135 | // STROBE col -> Low | 123 | /* STROBE col -> Low */ |
136 | GPCR2 = CORGI_GPIO_STROBE_BIT(col); | 124 | GPCR2 = CORGI_GPIO_STROBE_BIT(col); |
137 | // STROBE col -> out, not col -> HiZ | 125 | /* STROBE col -> out, not col -> HiZ */ |
138 | GPDR2 = (GPDR2 & ~CORGI_GPIO_ALL_STROBE_BIT) | CORGI_GPIO_STROBE_BIT(col); | 126 | GPDR2 = (GPDR2 & ~CORGI_GPIO_ALL_STROBE_BIT) | CORGI_GPIO_STROBE_BIT(col); |
139 | } | 127 | } |
140 | 128 | ||
@@ -149,10 +137,13 @@ static inline void corgikbd_reset_col(int col) | |||
149 | /* Scan the hardware keyboard and push any changes up through the input layer */ | 137 | /* Scan the hardware keyboard and push any changes up through the input layer */ |
150 | static void corgikbd_scankeyboard(struct corgikbd *corgikbd_data, struct pt_regs *regs) | 138 | static void corgikbd_scankeyboard(struct corgikbd *corgikbd_data, struct pt_regs *regs) |
151 | { | 139 | { |
152 | unsigned int row, col, rowd, scancode; | 140 | unsigned int row, col, rowd; |
153 | unsigned long flags; | 141 | unsigned long flags; |
154 | unsigned int num_pressed; | 142 | unsigned int num_pressed; |
155 | 143 | ||
144 | if (corgikbd_data->suspended) | ||
145 | return; | ||
146 | |||
156 | spin_lock_irqsave(&corgikbd_data->lock, flags); | 147 | spin_lock_irqsave(&corgikbd_data->lock, flags); |
157 | 148 | ||
158 | if (regs) | 149 | if (regs) |
@@ -173,10 +164,21 @@ static void corgikbd_scankeyboard(struct corgikbd *corgikbd_data, struct pt_regs | |||
173 | 164 | ||
174 | rowd = GET_ROWS_STATUS(col); | 165 | rowd = GET_ROWS_STATUS(col); |
175 | for (row = 0; row < KB_ROWS; row++) { | 166 | for (row = 0; row < KB_ROWS; row++) { |
167 | unsigned int scancode, pressed; | ||
168 | |||
176 | scancode = SCANCODE(row, col); | 169 | scancode = SCANCODE(row, col); |
177 | handle_scancode((rowd & KB_ROWMASK(row)), scancode, corgikbd_data); | 170 | pressed = rowd & KB_ROWMASK(row); |
178 | if (rowd & KB_ROWMASK(row)) | 171 | |
172 | input_report_key(&corgikbd_data->input, corgikbd_data->keycode[scancode], pressed); | ||
173 | |||
174 | if (pressed) | ||
179 | num_pressed++; | 175 | num_pressed++; |
176 | |||
177 | if (pressed && (corgikbd_data->keycode[scancode] == CORGI_KEY_OFF) | ||
178 | && time_after(jiffies, corgikbd_data->suspend_jiffies + HZ)) { | ||
179 | input_event(&corgikbd_data->input, EV_PWR, CORGI_KEY_OFF, 1); | ||
180 | corgikbd_data->suspend_jiffies=jiffies; | ||
181 | } | ||
180 | } | 182 | } |
181 | corgikbd_reset_col(col); | 183 | corgikbd_reset_col(col); |
182 | } | 184 | } |
@@ -221,8 +223,11 @@ static void corgikbd_timer_callback(unsigned long data) | |||
221 | * The hinge switches generate no interrupt so they need to be | 223 | * The hinge switches generate no interrupt so they need to be |
222 | * monitored by a timer. | 224 | * monitored by a timer. |
223 | * | 225 | * |
224 | * When we detect changes, we debounce it and then pass the three | 226 | * We debounce the switches and pass them to the input system. |
225 | * positions the system can take as keypresses to the input system. | 227 | * |
228 | * gprr == 0x00 - Keyboard with Landscape Screen | ||
229 | * 0x08 - No Keyboard with Portrait Screen | ||
230 | * 0x0c - Keyboard and Screen Closed | ||
226 | */ | 231 | */ |
227 | 232 | ||
228 | #define HINGE_STABLE_COUNT 2 | 233 | #define HINGE_STABLE_COUNT 2 |
@@ -235,7 +240,7 @@ static void corgikbd_hinge_timer(unsigned long data) | |||
235 | unsigned long gprr; | 240 | unsigned long gprr; |
236 | unsigned long flags; | 241 | unsigned long flags; |
237 | 242 | ||
238 | gprr = read_scoop_reg(SCOOP_GPRR) & (CORGI_SCP_SWA | CORGI_SCP_SWB); | 243 | gprr = read_scoop_reg(&corgiscoop_device.dev, SCOOP_GPRR) & (CORGI_SCP_SWA | CORGI_SCP_SWB); |
239 | if (gprr != sharpsl_hinge_state) { | 244 | if (gprr != sharpsl_hinge_state) { |
240 | hinge_count = 0; | 245 | hinge_count = 0; |
241 | sharpsl_hinge_state = gprr; | 246 | sharpsl_hinge_state = gprr; |
@@ -244,9 +249,8 @@ static void corgikbd_hinge_timer(unsigned long data) | |||
244 | if (hinge_count >= HINGE_STABLE_COUNT) { | 249 | if (hinge_count >= HINGE_STABLE_COUNT) { |
245 | spin_lock_irqsave(&corgikbd_data->lock, flags); | 250 | spin_lock_irqsave(&corgikbd_data->lock, flags); |
246 | 251 | ||
247 | handle_scancode((sharpsl_hinge_state == 0x00), 125, corgikbd_data); /* Keyboard with Landscape Screen */ | 252 | input_report_switch(&corgikbd_data->input, SW_0, ((sharpsl_hinge_state & CORGI_SCP_SWA) != 0)); |
248 | handle_scancode((sharpsl_hinge_state == 0x08), 126, corgikbd_data); /* No Keyboard with Portrait Screen */ | 253 | input_report_switch(&corgikbd_data->input, SW_1, ((sharpsl_hinge_state & CORGI_SCP_SWB) != 0)); |
249 | handle_scancode((sharpsl_hinge_state == 0x0c), 127, corgikbd_data); /* Keyboard and Screen Closed */ | ||
250 | input_sync(&corgikbd_data->input); | 254 | input_sync(&corgikbd_data->input); |
251 | 255 | ||
252 | spin_unlock_irqrestore(&corgikbd_data->lock, flags); | 256 | spin_unlock_irqrestore(&corgikbd_data->lock, flags); |
@@ -255,19 +259,45 @@ static void corgikbd_hinge_timer(unsigned long data) | |||
255 | mod_timer(&corgikbd_data->htimer, jiffies + HINGE_SCAN_INTERVAL); | 259 | mod_timer(&corgikbd_data->htimer, jiffies + HINGE_SCAN_INTERVAL); |
256 | } | 260 | } |
257 | 261 | ||
262 | #ifdef CONFIG_PM | ||
263 | static int corgikbd_suspend(struct device *dev, pm_message_t state, uint32_t level) | ||
264 | { | ||
265 | if (level == SUSPEND_POWER_DOWN) { | ||
266 | struct corgikbd *corgikbd = dev_get_drvdata(dev); | ||
267 | corgikbd->suspended = 1; | ||
268 | } | ||
269 | return 0; | ||
270 | } | ||
271 | |||
272 | static int corgikbd_resume(struct device *dev, uint32_t level) | ||
273 | { | ||
274 | if (level == RESUME_POWER_ON) { | ||
275 | struct corgikbd *corgikbd = dev_get_drvdata(dev); | ||
276 | |||
277 | /* Upon resume, ignore the suspend key for a short while */ | ||
278 | corgikbd->suspend_jiffies=jiffies; | ||
279 | corgikbd->suspended = 0; | ||
280 | } | ||
281 | return 0; | ||
282 | } | ||
283 | #else | ||
284 | #define corgikbd_suspend NULL | ||
285 | #define corgikbd_resume NULL | ||
286 | #endif | ||
287 | |||
258 | static int __init corgikbd_probe(struct device *dev) | 288 | static int __init corgikbd_probe(struct device *dev) |
259 | { | 289 | { |
260 | int i; | 290 | int i; |
261 | struct corgikbd *corgikbd; | 291 | struct corgikbd *corgikbd; |
262 | 292 | ||
263 | corgikbd = kcalloc(1, sizeof(struct corgikbd), GFP_KERNEL); | 293 | corgikbd = kzalloc(sizeof(struct corgikbd), GFP_KERNEL); |
264 | if (!corgikbd) | 294 | if (!corgikbd) |
265 | return -ENOMEM; | 295 | return -ENOMEM; |
266 | 296 | ||
267 | dev_set_drvdata(dev,corgikbd); | 297 | dev_set_drvdata(dev,corgikbd); |
268 | strcpy(corgikbd->phys, "corgikbd/input0"); | 298 | strcpy(corgikbd->phys, "corgikbd/input0"); |
269 | 299 | ||
270 | spin_lock_init(corgikbd->lock); | 300 | spin_lock_init(&corgikbd->lock); |
271 | 301 | ||
272 | /* Init Keyboard rescan timer */ | 302 | /* Init Keyboard rescan timer */ |
273 | init_timer(&corgikbd->timer); | 303 | init_timer(&corgikbd->timer); |
@@ -279,6 +309,8 @@ static int __init corgikbd_probe(struct device *dev) | |||
279 | corgikbd->htimer.function = corgikbd_hinge_timer; | 309 | corgikbd->htimer.function = corgikbd_hinge_timer; |
280 | corgikbd->htimer.data = (unsigned long) corgikbd; | 310 | corgikbd->htimer.data = (unsigned long) corgikbd; |
281 | 311 | ||
312 | corgikbd->suspend_jiffies=jiffies; | ||
313 | |||
282 | init_input_dev(&corgikbd->input); | 314 | init_input_dev(&corgikbd->input); |
283 | corgikbd->input.private = corgikbd; | 315 | corgikbd->input.private = corgikbd; |
284 | corgikbd->input.name = "Corgi Keyboard"; | 316 | corgikbd->input.name = "Corgi Keyboard"; |
@@ -288,7 +320,7 @@ static int __init corgikbd_probe(struct device *dev) | |||
288 | corgikbd->input.id.vendor = 0x0001; | 320 | corgikbd->input.id.vendor = 0x0001; |
289 | corgikbd->input.id.product = 0x0001; | 321 | corgikbd->input.id.product = 0x0001; |
290 | corgikbd->input.id.version = 0x0100; | 322 | corgikbd->input.id.version = 0x0100; |
291 | corgikbd->input.evbit[0] = BIT(EV_KEY) | BIT(EV_REP) | BIT(EV_PWR); | 323 | corgikbd->input.evbit[0] = BIT(EV_KEY) | BIT(EV_REP) | BIT(EV_PWR) | BIT(EV_SW); |
292 | corgikbd->input.keycode = corgikbd->keycode; | 324 | corgikbd->input.keycode = corgikbd->keycode; |
293 | corgikbd->input.keycodesize = sizeof(unsigned char); | 325 | corgikbd->input.keycodesize = sizeof(unsigned char); |
294 | corgikbd->input.keycodemax = ARRAY_SIZE(corgikbd_keycode); | 326 | corgikbd->input.keycodemax = ARRAY_SIZE(corgikbd_keycode); |
@@ -297,6 +329,8 @@ static int __init corgikbd_probe(struct device *dev) | |||
297 | for (i = 0; i < ARRAY_SIZE(corgikbd_keycode); i++) | 329 | for (i = 0; i < ARRAY_SIZE(corgikbd_keycode); i++) |
298 | set_bit(corgikbd->keycode[i], corgikbd->input.keybit); | 330 | set_bit(corgikbd->keycode[i], corgikbd->input.keybit); |
299 | clear_bit(0, corgikbd->input.keybit); | 331 | clear_bit(0, corgikbd->input.keybit); |
332 | set_bit(SW_0, corgikbd->input.swbit); | ||
333 | set_bit(SW_1, corgikbd->input.swbit); | ||
300 | 334 | ||
301 | input_register_device(&corgikbd->input); | 335 | input_register_device(&corgikbd->input); |
302 | mod_timer(&corgikbd->htimer, jiffies + HINGE_SCAN_INTERVAL); | 336 | mod_timer(&corgikbd->htimer, jiffies + HINGE_SCAN_INTERVAL); |
@@ -343,6 +377,8 @@ static struct device_driver corgikbd_driver = { | |||
343 | .bus = &platform_bus_type, | 377 | .bus = &platform_bus_type, |
344 | .probe = corgikbd_probe, | 378 | .probe = corgikbd_probe, |
345 | .remove = corgikbd_remove, | 379 | .remove = corgikbd_remove, |
380 | .suspend = corgikbd_suspend, | ||
381 | .resume = corgikbd_resume, | ||
346 | }; | 382 | }; |
347 | 383 | ||
348 | static int __devinit corgikbd_init(void) | 384 | static int __devinit corgikbd_init(void) |
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c index 0830c6e13ef6..af24313ff5bb 100644 --- a/drivers/input/mouse/psmouse-base.c +++ b/drivers/input/mouse/psmouse-base.c | |||
@@ -913,7 +913,7 @@ static int psmouse_connect(struct serio *serio, struct serio_driver *drv) | |||
913 | psmouse_deactivate(parent); | 913 | psmouse_deactivate(parent); |
914 | } | 914 | } |
915 | 915 | ||
916 | if (!(psmouse = kcalloc(1, sizeof(struct psmouse), GFP_KERNEL))) { | 916 | if (!(psmouse = kzalloc(sizeof(struct psmouse), GFP_KERNEL))) { |
917 | retval = -ENOMEM; | 917 | retval = -ENOMEM; |
918 | goto out; | 918 | goto out; |
919 | } | 919 | } |
diff --git a/drivers/input/serio/serport.c b/drivers/input/serio/serport.c index 79ca38469159..1bd88fca0542 100644 --- a/drivers/input/serio/serport.c +++ b/drivers/input/serio/serport.c | |||
@@ -87,7 +87,7 @@ static int serport_ldisc_open(struct tty_struct *tty) | |||
87 | if (!capable(CAP_SYS_ADMIN)) | 87 | if (!capable(CAP_SYS_ADMIN)) |
88 | return -EPERM; | 88 | return -EPERM; |
89 | 89 | ||
90 | serport = kcalloc(1, sizeof(struct serport), GFP_KERNEL); | 90 | serport = kzalloc(sizeof(struct serport), GFP_KERNEL); |
91 | if (!serport) | 91 | if (!serport) |
92 | return -ENOMEM; | 92 | return -ENOMEM; |
93 | 93 | ||
@@ -165,7 +165,7 @@ static ssize_t serport_ldisc_read(struct tty_struct * tty, struct file * file, u | |||
165 | if (test_and_set_bit(SERPORT_BUSY, &serport->flags)) | 165 | if (test_and_set_bit(SERPORT_BUSY, &serport->flags)) |
166 | return -EBUSY; | 166 | return -EBUSY; |
167 | 167 | ||
168 | serport->serio = serio = kcalloc(1, sizeof(struct serio), GFP_KERNEL); | 168 | serport->serio = serio = kzalloc(sizeof(struct serio), GFP_KERNEL); |
169 | if (!serio) | 169 | if (!serio) |
170 | return -ENOMEM; | 170 | return -ENOMEM; |
171 | 171 | ||
diff --git a/drivers/input/touchscreen/corgi_ts.c b/drivers/input/touchscreen/corgi_ts.c index 3f8b61cfbc37..5d19261b884f 100644 --- a/drivers/input/touchscreen/corgi_ts.c +++ b/drivers/input/touchscreen/corgi_ts.c | |||
@@ -53,11 +53,8 @@ struct corgi_ts { | |||
53 | 53 | ||
54 | #define SyncHS() while((STATUS_HSYNC) == 0); while((STATUS_HSYNC) != 0); | 54 | #define SyncHS() while((STATUS_HSYNC) == 0); while((STATUS_HSYNC) != 0); |
55 | #define CCNT(a) asm volatile ("mrc p14, 0, %0, C1, C0, 0" : "=r"(a)) | 55 | #define CCNT(a) asm volatile ("mrc p14, 0, %0, C1, C0, 0" : "=r"(a)) |
56 | #define CCNT_ON() {int pmnc = 1; asm volatile ("mcr p14, 0, %0, C0, C0, 0" : : "r"(pmnc));} | 56 | #define PMNC_GET(x) asm volatile ("mrc p14, 0, %0, C0, C0, 0" : "=r"(x)) |
57 | #define CCNT_OFF() {int pmnc = 0; asm volatile ("mcr p14, 0, %0, C0, C0, 0" : : "r"(pmnc));} | 57 | #define PMNC_SET(x) asm volatile ("mcr p14, 0, %0, C0, C0, 0" : : "r"(x)) |
58 | |||
59 | #define WAIT_HS_400_VGA 7013U // 17.615us | ||
60 | #define WAIT_HS_400_QVGA 16622U // 41.750us | ||
61 | 58 | ||
62 | 59 | ||
63 | /* ADS7846 Touch Screen Controller bit definitions */ | 60 | /* ADS7846 Touch Screen Controller bit definitions */ |
@@ -69,41 +66,29 @@ struct corgi_ts { | |||
69 | #define ADSCTRL_STS (1u << 7) /* Start Bit */ | 66 | #define ADSCTRL_STS (1u << 7) /* Start Bit */ |
70 | 67 | ||
71 | /* External Functions */ | 68 | /* External Functions */ |
72 | extern int w100fb_get_xres(void); | 69 | extern unsigned long w100fb_get_hsynclen(struct device *dev); |
73 | extern int w100fb_get_blanking(void); | ||
74 | extern int w100fb_get_fastsysclk(void); | ||
75 | extern unsigned int get_clk_frequency_khz(int info); | 70 | extern unsigned int get_clk_frequency_khz(int info); |
76 | 71 | ||
77 | static unsigned long calc_waittime(void) | 72 | static unsigned long calc_waittime(void) |
78 | { | 73 | { |
79 | int w100fb_xres = w100fb_get_xres(); | 74 | unsigned long hsync_len = w100fb_get_hsynclen(&corgifb_device.dev); |
80 | unsigned int waittime = 0; | ||
81 | |||
82 | if (w100fb_xres == 480 || w100fb_xres == 640) { | ||
83 | waittime = WAIT_HS_400_VGA * get_clk_frequency_khz(0) / 398131U; | ||
84 | |||
85 | if (w100fb_get_fastsysclk() == 100) | ||
86 | waittime = waittime * 75 / 100; | ||
87 | |||
88 | if (w100fb_xres == 640) | ||
89 | waittime *= 3; | ||
90 | 75 | ||
91 | return waittime; | 76 | if (hsync_len) |
92 | } | 77 | return get_clk_frequency_khz(0)*1000/hsync_len; |
93 | 78 | else | |
94 | return WAIT_HS_400_QVGA * get_clk_frequency_khz(0) / 398131U; | 79 | return 0; |
95 | } | 80 | } |
96 | 81 | ||
97 | static int sync_receive_data_send_cmd(int doRecive, int doSend, unsigned int address, unsigned long wait_time) | 82 | static int sync_receive_data_send_cmd(int doRecive, int doSend, unsigned int address, unsigned long wait_time) |
98 | { | 83 | { |
84 | unsigned long timer1 = 0, timer2, pmnc = 0; | ||
99 | int pos = 0; | 85 | int pos = 0; |
100 | unsigned long timer1 = 0, timer2; | ||
101 | int dosleep; | ||
102 | 86 | ||
103 | dosleep = !w100fb_get_blanking(); | 87 | if (wait_time && doSend) { |
88 | PMNC_GET(pmnc); | ||
89 | if (!(pmnc & 0x01)) | ||
90 | PMNC_SET(0x01); | ||
104 | 91 | ||
105 | if (dosleep && doSend) { | ||
106 | CCNT_ON(); | ||
107 | /* polling HSync */ | 92 | /* polling HSync */ |
108 | SyncHS(); | 93 | SyncHS(); |
109 | /* get CCNT */ | 94 | /* get CCNT */ |
@@ -119,11 +104,11 @@ static int sync_receive_data_send_cmd(int doRecive, int doSend, unsigned int add | |||
119 | corgi_ssp_ads7846_put(cmd); | 104 | corgi_ssp_ads7846_put(cmd); |
120 | corgi_ssp_ads7846_get(); | 105 | corgi_ssp_ads7846_get(); |
121 | 106 | ||
122 | if (dosleep) { | 107 | if (wait_time) { |
123 | /* Wait after HSync */ | 108 | /* Wait after HSync */ |
124 | CCNT(timer2); | 109 | CCNT(timer2); |
125 | if (timer2-timer1 > wait_time) { | 110 | if (timer2-timer1 > wait_time) { |
126 | /* timeout */ | 111 | /* too slow - timeout, try again */ |
127 | SyncHS(); | 112 | SyncHS(); |
128 | /* get OSCR */ | 113 | /* get OSCR */ |
129 | CCNT(timer1); | 114 | CCNT(timer1); |
@@ -134,8 +119,8 @@ static int sync_receive_data_send_cmd(int doRecive, int doSend, unsigned int add | |||
134 | CCNT(timer2); | 119 | CCNT(timer2); |
135 | } | 120 | } |
136 | corgi_ssp_ads7846_put(cmd); | 121 | corgi_ssp_ads7846_put(cmd); |
137 | if (dosleep) | 122 | if (wait_time && !(pmnc & 0x01)) |
138 | CCNT_OFF(); | 123 | PMNC_SET(pmnc); |
139 | } | 124 | } |
140 | return pos; | 125 | return pos; |
141 | } | 126 | } |
@@ -244,7 +229,7 @@ static irqreturn_t ts_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
244 | } | 229 | } |
245 | 230 | ||
246 | #ifdef CONFIG_PM | 231 | #ifdef CONFIG_PM |
247 | static int corgits_suspend(struct device *dev, uint32_t state, uint32_t level) | 232 | static int corgits_suspend(struct device *dev, pm_message_t state, uint32_t level) |
248 | { | 233 | { |
249 | if (level == SUSPEND_POWER_DOWN) { | 234 | if (level == SUSPEND_POWER_DOWN) { |
250 | struct corgi_ts *corgi_ts = dev_get_drvdata(dev); | 235 | struct corgi_ts *corgi_ts = dev_get_drvdata(dev); |