Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4c0e799a authored by Dmitry Torokhov's avatar Dmitry Torokhov
Browse files

Merge branch 'next' into for-linus

parents 3fa8749e b8d055a8
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -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
			Defaults to the default architecture's huge page size
			if not specified.
			if not specified.


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


	if (keycode > NR_KEYS)
	if (keycode >= NR_KEYS)
		if (keycode >= KEY_BRL_DOT1 && keycode <= KEY_BRL_DOT8)
		if (keycode >= KEY_BRL_DOT1 && keycode <= KEY_BRL_DOT8)
			keysym = K(KT_BRL, keycode - KEY_BRL_DOT1 + 1);
			keysym = K(KT_BRL, keycode - KEY_BRL_DOT1 + 1);
		else
		else
+67 −21
Original line number Original line Diff line number Diff line
@@ -231,6 +231,7 @@ static void gameport_find_driver(struct gameport *gameport)
enum gameport_event_type {
enum gameport_event_type {
	GAMEPORT_REGISTER_PORT,
	GAMEPORT_REGISTER_PORT,
	GAMEPORT_REGISTER_DRIVER,
	GAMEPORT_REGISTER_DRIVER,
	GAMEPORT_ATTACH_DRIVER,
};
};


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


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


	spin_lock_irqsave(&gameport_event_lock, flags);
	spin_lock_irqsave(&gameport_event_lock, flags);


@@ -268,10 +270,21 @@ static void gameport_queue_event(void *object, struct module *owner,
		}
		}
	}
	}


	if ((event = kmalloc(sizeof(struct gameport_event), GFP_ATOMIC))) {
	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;
	}

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


@@ -281,11 +294,10 @@ static void gameport_queue_event(void *object, struct module *owner,


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

		printk(KERN_ERR "gameport: Not enough memory to queue event %d\n", event_type);
	}
out:
out:
	spin_unlock_irqrestore(&gameport_event_lock, flags);
	spin_unlock_irqrestore(&gameport_event_lock, flags);
	return retval;
}
}


static void gameport_free_event(struct gameport_event *event)
static void gameport_free_event(struct gameport_event *event)
@@ -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 list_head *node, *next;
	struct gameport_event *event;
	struct gameport_event *event;
@@ -390,7 +403,7 @@ static void gameport_remove_pending_events(struct gameport *gameport)


	list_for_each_safe(node, next, &gameport_event_list) {
	list_for_each_safe(node, next, &gameport_event_list) {
		event = list_entry(node, struct gameport_event, node);
		event = list_entry(node, struct gameport_event, node);
		if (event->object == gameport) {
		if (event->object == object) {
			list_del_init(node);
			list_del_init(node);
			gameport_free_event(event);
			gameport_free_event(event);
		}
		}
@@ -705,10 +718,40 @@ static void gameport_add_driver(struct gameport_driver *drv)
			drv->driver.name, error);
			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;
	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)
void gameport_unregister_driver(struct gameport_driver *drv)
@@ -716,7 +759,9 @@ void gameport_unregister_driver(struct gameport_driver *drv)
	struct gameport *gameport;
	struct gameport *gameport;


	mutex_lock(&gameport_mutex);
	mutex_lock(&gameport_mutex);

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


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


	driver_unregister(&drv->driver);
	driver_unregister(&drv->driver);

	mutex_unlock(&gameport_mutex);
	mutex_unlock(&gameport_mutex);
}
}


+1 −2
Original line number Original line Diff line number Diff line
@@ -414,8 +414,7 @@ static struct gameport_driver a3d_drv = {


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


static void __exit a3d_exit(void)
static void __exit a3d_exit(void)
Loading