Skip to content

Commit 4c0e799

Browse files
committed
Merge branch 'next' into for-linus
2 parents 3fa8749 + b8d055a commit 4c0e799

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+2309
-352
lines changed

Documentation/kernel-parameters.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -796,6 +796,7 @@ and is between 256 and 4096 characters. It is defined in the file
796796
Defaults to the default architecture's huge page size
797797
if not specified.
798798

799+
i8042.debug [HW] Toggle i8042 debug mode
799800
i8042.direct [HW] Put keyboard port into non-translated mode
800801
i8042.dumbkbd [HW] Pretend that controller can only read data from
801802
keyboard and cannot control its state

MAINTAINERS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4548,7 +4548,7 @@ WM97XX TOUCHSCREEN DRIVERS
45484548
P: Mark Brown
45494549
45504550
P: Liam Girdwood
4551-
4551+
45524552
45534553
T: git git://opensource.wolfsonmicro.com/linux-2.6-touch
45544554
W: http://opensource.wolfsonmicro.com/node/7

drivers/char/keyboard.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1249,7 +1249,7 @@ static void kbd_keycode(unsigned int keycode, int down, int hw_raw)
12491249
return;
12501250
}
12511251

1252-
if (keycode > NR_KEYS)
1252+
if (keycode >= NR_KEYS)
12531253
if (keycode >= KEY_BRL_DOT1 && keycode <= KEY_BRL_DOT8)
12541254
keysym = K(KT_BRL, keycode - KEY_BRL_DOT1 + 1);
12551255
else

drivers/input/gameport/gameport.c

Lines changed: 67 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ static void gameport_find_driver(struct gameport *gameport)
231231
enum gameport_event_type {
232232
GAMEPORT_REGISTER_PORT,
233233
GAMEPORT_REGISTER_DRIVER,
234+
GAMEPORT_ATTACH_DRIVER,
234235
};
235236

236237
struct gameport_event {
@@ -245,11 +246,12 @@ static LIST_HEAD(gameport_event_list);
245246
static DECLARE_WAIT_QUEUE_HEAD(gameport_wait);
246247
static struct task_struct *gameport_task;
247248

248-
static void gameport_queue_event(void *object, struct module *owner,
249-
enum gameport_event_type event_type)
249+
static int gameport_queue_event(void *object, struct module *owner,
250+
enum gameport_event_type event_type)
250251
{
251252
unsigned long flags;
252253
struct gameport_event *event;
254+
int retval = 0;
253255

254256
spin_lock_irqsave(&gameport_event_lock, flags);
255257

@@ -268,24 +270,34 @@ static void gameport_queue_event(void *object, struct module *owner,
268270
}
269271
}
270272

271-
if ((event = kmalloc(sizeof(struct gameport_event), GFP_ATOMIC))) {
272-
if (!try_module_get(owner)) {
273-
printk(KERN_WARNING "gameport: Can't get module reference, dropping event %d\n", event_type);
274-
kfree(event);
275-
goto out;
276-
}
277-
278-
event->type = event_type;
279-
event->object = object;
280-
event->owner = owner;
273+
event = kmalloc(sizeof(struct gameport_event), GFP_ATOMIC);
274+
if (!event) {
275+
printk(KERN_ERR
276+
"gameport: Not enough memory to queue event %d\n",
277+
event_type);
278+
retval = -ENOMEM;
279+
goto out;
280+
}
281281

282-
list_add_tail(&event->node, &gameport_event_list);
283-
wake_up(&gameport_wait);
284-
} else {
285-
printk(KERN_ERR "gameport: Not enough memory to queue event %d\n", event_type);
282+
if (!try_module_get(owner)) {
283+
printk(KERN_WARNING
284+
"gameport: Can't get module reference, dropping event %d\n",
285+
event_type);
286+
kfree(event);
287+
retval = -EINVAL;
288+
goto out;
286289
}
290+
291+
event->type = event_type;
292+
event->object = object;
293+
event->owner = owner;
294+
295+
list_add_tail(&event->node, &gameport_event_list);
296+
wake_up(&gameport_wait);
297+
287298
out:
288299
spin_unlock_irqrestore(&gameport_event_lock, flags);
300+
return retval;
289301
}
290302

291303
static void gameport_free_event(struct gameport_event *event)
@@ -378,9 +390,10 @@ static void gameport_handle_event(void)
378390
}
379391

380392
/*
381-
* Remove all events that have been submitted for a given gameport port.
393+
* Remove all events that have been submitted for a given object,
394+
* be it a gameport port or a driver.
382395
*/
383-
static void gameport_remove_pending_events(struct gameport *gameport)
396+
static void gameport_remove_pending_events(void *object)
384397
{
385398
struct list_head *node, *next;
386399
struct gameport_event *event;
@@ -390,7 +403,7 @@ static void gameport_remove_pending_events(struct gameport *gameport)
390403

391404
list_for_each_safe(node, next, &gameport_event_list) {
392405
event = list_entry(node, struct gameport_event, node);
393-
if (event->object == gameport) {
406+
if (event->object == object) {
394407
list_del_init(node);
395408
gameport_free_event(event);
396409
}
@@ -705,18 +718,50 @@ static void gameport_add_driver(struct gameport_driver *drv)
705718
drv->driver.name, error);
706719
}
707720

708-
void __gameport_register_driver(struct gameport_driver *drv, struct module *owner)
721+
int __gameport_register_driver(struct gameport_driver *drv, struct module *owner,
722+
const char *mod_name)
709723
{
724+
int error;
725+
710726
drv->driver.bus = &gameport_bus;
711-
gameport_queue_event(drv, owner, GAMEPORT_REGISTER_DRIVER);
727+
drv->driver.owner = owner;
728+
drv->driver.mod_name = mod_name;
729+
730+
/*
731+
* Temporarily disable automatic binding because probing
732+
* takes long time and we are better off doing it in kgameportd
733+
*/
734+
drv->ignore = 1;
735+
736+
error = driver_register(&drv->driver);
737+
if (error) {
738+
printk(KERN_ERR
739+
"gameport: driver_register() failed for %s, error: %d\n",
740+
drv->driver.name, error);
741+
return error;
742+
}
743+
744+
/*
745+
* Reset ignore flag and let kgameportd bind the driver to free ports
746+
*/
747+
drv->ignore = 0;
748+
error = gameport_queue_event(drv, NULL, GAMEPORT_ATTACH_DRIVER);
749+
if (error) {
750+
driver_unregister(&drv->driver);
751+
return error;
752+
}
753+
754+
return 0;
712755
}
713756

714757
void gameport_unregister_driver(struct gameport_driver *drv)
715758
{
716759
struct gameport *gameport;
717760

718761
mutex_lock(&gameport_mutex);
762+
719763
drv->ignore = 1; /* so gameport_find_driver ignores it */
764+
gameport_remove_pending_events(drv);
720765

721766
start_over:
722767
list_for_each_entry(gameport, &gameport_list, node) {
@@ -729,6 +774,7 @@ void gameport_unregister_driver(struct gameport_driver *drv)
729774
}
730775

731776
driver_unregister(&drv->driver);
777+
732778
mutex_unlock(&gameport_mutex);
733779
}
734780

drivers/input/joystick/a3d.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -414,8 +414,7 @@ static struct gameport_driver a3d_drv = {
414414

415415
static int __init a3d_init(void)
416416
{
417-
gameport_register_driver(&a3d_drv);
418-
return 0;
417+
return gameport_register_driver(&a3d_drv);
419418
}
420419

421420
static void __exit a3d_exit(void)

drivers/input/joystick/adi.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -572,8 +572,7 @@ static struct gameport_driver adi_drv = {
572572

573573
static int __init adi_init(void)
574574
{
575-
gameport_register_driver(&adi_drv);
576-
return 0;
575+
return gameport_register_driver(&adi_drv);
577576
}
578577

579578
static void __exit adi_exit(void)

drivers/input/joystick/analog.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -761,9 +761,7 @@ static struct gameport_driver analog_drv = {
761761
static int __init analog_init(void)
762762
{
763763
analog_parse_options();
764-
gameport_register_driver(&analog_drv);
765-
766-
return 0;
764+
return gameport_register_driver(&analog_drv);
767765
}
768766

769767
static void __exit analog_exit(void)

drivers/input/joystick/cobra.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -263,8 +263,7 @@ static struct gameport_driver cobra_drv = {
263263

264264
static int __init cobra_init(void)
265265
{
266-
gameport_register_driver(&cobra_drv);
267-
return 0;
266+
return gameport_register_driver(&cobra_drv);
268267
}
269268

270269
static void __exit cobra_exit(void)

drivers/input/joystick/gf2k.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -375,8 +375,7 @@ static struct gameport_driver gf2k_drv = {
375375

376376
static int __init gf2k_init(void)
377377
{
378-
gameport_register_driver(&gf2k_drv);
379-
return 0;
378+
return gameport_register_driver(&gf2k_drv);
380379
}
381380

382381
static void __exit gf2k_exit(void)

drivers/input/joystick/grip.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -426,8 +426,7 @@ static struct gameport_driver grip_drv = {
426426

427427
static int __init grip_init(void)
428428
{
429-
gameport_register_driver(&grip_drv);
430-
return 0;
429+
return gameport_register_driver(&grip_drv);
431430
}
432431

433432
static void __exit grip_exit(void)

drivers/input/joystick/grip_mp.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -689,8 +689,7 @@ static struct gameport_driver grip_drv = {
689689

690690
static int __init grip_init(void)
691691
{
692-
gameport_register_driver(&grip_drv);
693-
return 0;
692+
return gameport_register_driver(&grip_drv);
694693
}
695694

696695
static void __exit grip_exit(void)

drivers/input/joystick/guillemot.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,8 +283,7 @@ static struct gameport_driver guillemot_drv = {
283283

284284
static int __init guillemot_init(void)
285285
{
286-
gameport_register_driver(&guillemot_drv);
287-
return 0;
286+
return gameport_register_driver(&guillemot_drv);
288287
}
289288

290289
static void __exit guillemot_exit(void)

drivers/input/joystick/interact.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -317,8 +317,7 @@ static struct gameport_driver interact_drv = {
317317

318318
static int __init interact_init(void)
319319
{
320-
gameport_register_driver(&interact_drv);
321-
return 0;
320+
return gameport_register_driver(&interact_drv);
322321
}
323322

324323
static void __exit interact_exit(void)

drivers/input/joystick/joydump.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,7 @@ static struct gameport_driver joydump_drv = {
161161

162162
static int __init joydump_init(void)
163163
{
164-
gameport_register_driver(&joydump_drv);
165-
return 0;
164+
return gameport_register_driver(&joydump_drv);
166165
}
167166

168167
static void __exit joydump_exit(void)

drivers/input/joystick/sidewinder.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -818,8 +818,7 @@ static struct gameport_driver sw_drv = {
818818

819819
static int __init sw_init(void)
820820
{
821-
gameport_register_driver(&sw_drv);
822-
return 0;
821+
return gameport_register_driver(&sw_drv);
823822
}
824823

825824
static void __exit sw_exit(void)

drivers/input/joystick/tmdc.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -438,8 +438,7 @@ static struct gameport_driver tmdc_drv = {
438438

439439
static int __init tmdc_init(void)
440440
{
441-
gameport_register_driver(&tmdc_drv);
442-
return 0;
441+
return gameport_register_driver(&tmdc_drv);
443442
}
444443

445444
static void __exit tmdc_exit(void)

0 commit comments

Comments
 (0)