Skip to content

Commit

Permalink
Merge branch 'next' into for-linus
Browse files Browse the repository at this point in the history
  • Loading branch information
Dmitry Torokhov committed Oct 16, 2008
2 parents 3fa8749 + b8d055a commit 4c0e799
Show file tree
Hide file tree
Showing 51 changed files with 2,309 additions and 352 deletions.
1 change: 1 addition & 0 deletions Documentation/kernel-parameters.txt
Original file line number Diff line number Diff line change
Expand Up @@ -796,6 +796,7 @@ and is between 256 and 4096 characters. It is defined in the file
Defaults to the default architecture's huge page size
if not specified.

i8042.debug [HW] Toggle i8042 debug mode
i8042.direct [HW] Put keyboard port into non-translated mode
i8042.dumbkbd [HW] Pretend that controller can only read data from
keyboard and cannot control its state
Expand Down
2 changes: 1 addition & 1 deletion MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -4548,7 +4548,7 @@ WM97XX TOUCHSCREEN DRIVERS
P: Mark Brown
M: broonie@opensource.wolfsonmicro.com
P: Liam Girdwood
M: liam.girdwood@wolfsonmicro.com
M: lrg@slimlogic.co.uk
L: linux-input@vger.kernel.org
T: git git://opensource.wolfsonmicro.com/linux-2.6-touch
W: http://opensource.wolfsonmicro.com/node/7
Expand Down
2 changes: 1 addition & 1 deletion drivers/char/keyboard.c
Original file line number Diff line number Diff line change
Expand Up @@ -1249,7 +1249,7 @@ static void kbd_keycode(unsigned int keycode, int down, int hw_raw)
return;
}

if (keycode > NR_KEYS)
if (keycode >= NR_KEYS)
if (keycode >= KEY_BRL_DOT1 && keycode <= KEY_BRL_DOT8)
keysym = K(KT_BRL, keycode - KEY_BRL_DOT1 + 1);
else
Expand Down
88 changes: 67 additions & 21 deletions drivers/input/gameport/gameport.c
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,7 @@ static void gameport_find_driver(struct gameport *gameport)
enum gameport_event_type {
GAMEPORT_REGISTER_PORT,
GAMEPORT_REGISTER_DRIVER,
GAMEPORT_ATTACH_DRIVER,
};

struct gameport_event {
Expand All @@ -245,11 +246,12 @@ static LIST_HEAD(gameport_event_list);
static DECLARE_WAIT_QUEUE_HEAD(gameport_wait);
static struct task_struct *gameport_task;

static void gameport_queue_event(void *object, struct module *owner,
enum gameport_event_type event_type)
static int gameport_queue_event(void *object, struct module *owner,
enum gameport_event_type event_type)
{
unsigned long flags;
struct gameport_event *event;
int retval = 0;

spin_lock_irqsave(&gameport_event_lock, flags);

Expand All @@ -268,24 +270,34 @@ static void gameport_queue_event(void *object, struct module *owner,
}
}

if ((event = kmalloc(sizeof(struct gameport_event), GFP_ATOMIC))) {
if (!try_module_get(owner)) {
printk(KERN_WARNING "gameport: Can't get module reference, dropping event %d\n", event_type);
kfree(event);
goto out;
}

event->type = event_type;
event->object = object;
event->owner = owner;
event = kmalloc(sizeof(struct gameport_event), GFP_ATOMIC);
if (!event) {
printk(KERN_ERR
"gameport: Not enough memory to queue event %d\n",
event_type);
retval = -ENOMEM;
goto out;
}

list_add_tail(&event->node, &gameport_event_list);
wake_up(&gameport_wait);
} else {
printk(KERN_ERR "gameport: Not enough memory to queue event %d\n", event_type);
if (!try_module_get(owner)) {
printk(KERN_WARNING
"gameport: Can't get module reference, dropping event %d\n",
event_type);
kfree(event);
retval = -EINVAL;
goto out;
}

event->type = event_type;
event->object = object;
event->owner = owner;

list_add_tail(&event->node, &gameport_event_list);
wake_up(&gameport_wait);

out:
spin_unlock_irqrestore(&gameport_event_lock, flags);
return retval;
}

static void gameport_free_event(struct gameport_event *event)
Expand Down Expand Up @@ -378,9 +390,10 @@ static void gameport_handle_event(void)
}

/*
* Remove all events that have been submitted for a given gameport port.
* Remove all events that have been submitted for a given object,
* be it a gameport port or a driver.
*/
static void gameport_remove_pending_events(struct gameport *gameport)
static void gameport_remove_pending_events(void *object)
{
struct list_head *node, *next;
struct gameport_event *event;
Expand All @@ -390,7 +403,7 @@ static void gameport_remove_pending_events(struct gameport *gameport)

list_for_each_safe(node, next, &gameport_event_list) {
event = list_entry(node, struct gameport_event, node);
if (event->object == gameport) {
if (event->object == object) {
list_del_init(node);
gameport_free_event(event);
}
Expand Down Expand Up @@ -705,18 +718,50 @@ static void gameport_add_driver(struct gameport_driver *drv)
drv->driver.name, error);
}

void __gameport_register_driver(struct gameport_driver *drv, struct module *owner)
int __gameport_register_driver(struct gameport_driver *drv, struct module *owner,
const char *mod_name)
{
int error;

drv->driver.bus = &gameport_bus;
gameport_queue_event(drv, owner, GAMEPORT_REGISTER_DRIVER);
drv->driver.owner = owner;
drv->driver.mod_name = mod_name;

/*
* Temporarily disable automatic binding because probing
* takes long time and we are better off doing it in kgameportd
*/
drv->ignore = 1;

error = driver_register(&drv->driver);
if (error) {
printk(KERN_ERR
"gameport: driver_register() failed for %s, error: %d\n",
drv->driver.name, error);
return error;
}

/*
* Reset ignore flag and let kgameportd bind the driver to free ports
*/
drv->ignore = 0;
error = gameport_queue_event(drv, NULL, GAMEPORT_ATTACH_DRIVER);
if (error) {
driver_unregister(&drv->driver);
return error;
}

return 0;
}

void gameport_unregister_driver(struct gameport_driver *drv)
{
struct gameport *gameport;

mutex_lock(&gameport_mutex);

drv->ignore = 1; /* so gameport_find_driver ignores it */
gameport_remove_pending_events(drv);

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

driver_unregister(&drv->driver);

mutex_unlock(&gameport_mutex);
}

Expand Down
3 changes: 1 addition & 2 deletions drivers/input/joystick/a3d.c
Original file line number Diff line number Diff line change
Expand Up @@ -414,8 +414,7 @@ static struct gameport_driver a3d_drv = {

static int __init a3d_init(void)
{
gameport_register_driver(&a3d_drv);
return 0;
return gameport_register_driver(&a3d_drv);
}

static void __exit a3d_exit(void)
Expand Down
3 changes: 1 addition & 2 deletions drivers/input/joystick/adi.c
Original file line number Diff line number Diff line change
Expand Up @@ -572,8 +572,7 @@ static struct gameport_driver adi_drv = {

static int __init adi_init(void)
{
gameport_register_driver(&adi_drv);
return 0;
return gameport_register_driver(&adi_drv);
}

static void __exit adi_exit(void)
Expand Down
4 changes: 1 addition & 3 deletions drivers/input/joystick/analog.c
Original file line number Diff line number Diff line change
Expand Up @@ -761,9 +761,7 @@ static struct gameport_driver analog_drv = {
static int __init analog_init(void)
{
analog_parse_options();
gameport_register_driver(&analog_drv);

return 0;
return gameport_register_driver(&analog_drv);
}

static void __exit analog_exit(void)
Expand Down
3 changes: 1 addition & 2 deletions drivers/input/joystick/cobra.c
Original file line number Diff line number Diff line change
Expand Up @@ -263,8 +263,7 @@ static struct gameport_driver cobra_drv = {

static int __init cobra_init(void)
{
gameport_register_driver(&cobra_drv);
return 0;
return gameport_register_driver(&cobra_drv);
}

static void __exit cobra_exit(void)
Expand Down
3 changes: 1 addition & 2 deletions drivers/input/joystick/gf2k.c
Original file line number Diff line number Diff line change
Expand Up @@ -375,8 +375,7 @@ static struct gameport_driver gf2k_drv = {

static int __init gf2k_init(void)
{
gameport_register_driver(&gf2k_drv);
return 0;
return gameport_register_driver(&gf2k_drv);
}

static void __exit gf2k_exit(void)
Expand Down
3 changes: 1 addition & 2 deletions drivers/input/joystick/grip.c
Original file line number Diff line number Diff line change
Expand Up @@ -426,8 +426,7 @@ static struct gameport_driver grip_drv = {

static int __init grip_init(void)
{
gameport_register_driver(&grip_drv);
return 0;
return gameport_register_driver(&grip_drv);
}

static void __exit grip_exit(void)
Expand Down
3 changes: 1 addition & 2 deletions drivers/input/joystick/grip_mp.c
Original file line number Diff line number Diff line change
Expand Up @@ -689,8 +689,7 @@ static struct gameport_driver grip_drv = {

static int __init grip_init(void)
{
gameport_register_driver(&grip_drv);
return 0;
return gameport_register_driver(&grip_drv);
}

static void __exit grip_exit(void)
Expand Down
3 changes: 1 addition & 2 deletions drivers/input/joystick/guillemot.c
Original file line number Diff line number Diff line change
Expand Up @@ -283,8 +283,7 @@ static struct gameport_driver guillemot_drv = {

static int __init guillemot_init(void)
{
gameport_register_driver(&guillemot_drv);
return 0;
return gameport_register_driver(&guillemot_drv);
}

static void __exit guillemot_exit(void)
Expand Down
3 changes: 1 addition & 2 deletions drivers/input/joystick/interact.c
Original file line number Diff line number Diff line change
Expand Up @@ -317,8 +317,7 @@ static struct gameport_driver interact_drv = {

static int __init interact_init(void)
{
gameport_register_driver(&interact_drv);
return 0;
return gameport_register_driver(&interact_drv);
}

static void __exit interact_exit(void)
Expand Down
3 changes: 1 addition & 2 deletions drivers/input/joystick/joydump.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,8 +161,7 @@ static struct gameport_driver joydump_drv = {

static int __init joydump_init(void)
{
gameport_register_driver(&joydump_drv);
return 0;
return gameport_register_driver(&joydump_drv);
}

static void __exit joydump_exit(void)
Expand Down
3 changes: 1 addition & 2 deletions drivers/input/joystick/sidewinder.c
Original file line number Diff line number Diff line change
Expand Up @@ -818,8 +818,7 @@ static struct gameport_driver sw_drv = {

static int __init sw_init(void)
{
gameport_register_driver(&sw_drv);
return 0;
return gameport_register_driver(&sw_drv);
}

static void __exit sw_exit(void)
Expand Down
3 changes: 1 addition & 2 deletions drivers/input/joystick/tmdc.c
Original file line number Diff line number Diff line change
Expand Up @@ -438,8 +438,7 @@ static struct gameport_driver tmdc_drv = {

static int __init tmdc_init(void)
{
gameport_register_driver(&tmdc_drv);
return 0;
return gameport_register_driver(&tmdc_drv);
}

static void __exit tmdc_exit(void)
Expand Down
Loading

0 comments on commit 4c0e799

Please sign in to comment.