diff options
Diffstat (limited to 'drivers/input')
166 files changed, 2098 insertions, 1573 deletions
diff --git a/drivers/input/gameport/emu10k1-gp.c b/drivers/input/gameport/emu10k1-gp.c index daceafe7ee7..fa7a95c1da0 100644 --- a/drivers/input/gameport/emu10k1-gp.c +++ b/drivers/input/gameport/emu10k1-gp.c @@ -57,7 +57,7 @@ static const struct pci_device_id emu_tbl[] = {  MODULE_DEVICE_TABLE(pci, emu_tbl); -static int __devinit emu_probe(struct pci_dev *pdev, const struct pci_device_id *ent) +static int emu_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  {  	struct emu *emu;  	struct gameport *port; @@ -107,7 +107,7 @@ static int __devinit emu_probe(struct pci_dev *pdev, const struct pci_device_id  	return error;  } -static void __devexit emu_remove(struct pci_dev *pdev) +static void emu_remove(struct pci_dev *pdev)  {  	struct emu *emu = pci_get_drvdata(pdev); @@ -122,7 +122,7 @@ static struct pci_driver emu_driver = {          .name =         "Emu10k1_gameport",          .id_table =     emu_tbl,          .probe =        emu_probe, -        .remove =       __devexit_p(emu_remove), +	.remove =	emu_remove,  };  module_pci_driver(emu_driver); diff --git a/drivers/input/gameport/fm801-gp.c b/drivers/input/gameport/fm801-gp.c index 48ad3829ff2..ae912d3aee4 100644 --- a/drivers/input/gameport/fm801-gp.c +++ b/drivers/input/gameport/fm801-gp.c @@ -78,7 +78,7 @@ static int fm801_gp_open(struct gameport *gameport, int mode)  	return 0;  } -static int __devinit fm801_gp_probe(struct pci_dev *pci, const struct pci_device_id *id) +static int fm801_gp_probe(struct pci_dev *pci, const struct pci_device_id *id)  {  	struct fm801_gp *gp;  	struct gameport *port; @@ -129,7 +129,7 @@ static int __devinit fm801_gp_probe(struct pci_dev *pci, const struct pci_device  	return error;  } -static void __devexit fm801_gp_remove(struct pci_dev *pci) +static void fm801_gp_remove(struct pci_dev *pci)  {  	struct fm801_gp *gp = pci_get_drvdata(pci); @@ -150,7 +150,7 @@ static struct pci_driver fm801_gp_driver = {  	.name =		"FM801_gameport",  	.id_table =	fm801_gp_id_table,  	.probe =	fm801_gp_probe, -	.remove =	__devexit_p(fm801_gp_remove), +	.remove =	fm801_gp_remove,  };  module_pci_driver(fm801_gp_driver); diff --git a/drivers/input/input-mt.c b/drivers/input/input-mt.c index 8c4b50fd9a7..47a6009dbf4 100644 --- a/drivers/input/input-mt.c +++ b/drivers/input/input-mt.c @@ -194,7 +194,7 @@ void input_mt_report_pointer_emulation(struct input_dev *dev, bool use_count)  	if (!mt)  		return; -	oldest = 0; +	oldest = NULL;  	oldid = mt->trkid;  	count = 0; diff --git a/drivers/input/input.c b/drivers/input/input.c index 53a0ddee787..ce01332f7b3 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c @@ -534,8 +534,11 @@ EXPORT_SYMBOL(input_grab_device);  static void __input_release_device(struct input_handle *handle)  {  	struct input_dev *dev = handle->dev; +	struct input_handle *grabber; -	if (dev->grab == handle) { +	grabber = rcu_dereference_protected(dev->grab, +					    lockdep_is_held(&dev->mutex)); +	if (grabber == handle) {  		rcu_assign_pointer(dev->grab, NULL);  		/* Make sure input_pass_event() notices that grab is gone */  		synchronize_rcu(); @@ -1723,7 +1726,7 @@ EXPORT_SYMBOL_GPL(input_class);  /**   * input_allocate_device - allocate memory for new input device   * - * Returns prepared struct input_dev or NULL. + * Returns prepared struct input_dev or %NULL.   *   * NOTE: Use input_free_device() to free devices that have not been   * registered; input_unregister_device() should be used for already @@ -1750,6 +1753,70 @@ struct input_dev *input_allocate_device(void)  }  EXPORT_SYMBOL(input_allocate_device); +struct input_devres { +	struct input_dev *input; +}; + +static int devm_input_device_match(struct device *dev, void *res, void *data) +{ +	struct input_devres *devres = res; + +	return devres->input == data; +} + +static void devm_input_device_release(struct device *dev, void *res) +{ +	struct input_devres *devres = res; +	struct input_dev *input = devres->input; + +	dev_dbg(dev, "%s: dropping reference to %s\n", +		__func__, dev_name(&input->dev)); +	input_put_device(input); +} + +/** + * devm_input_allocate_device - allocate managed input device + * @dev: device owning the input device being created + * + * Returns prepared struct input_dev or %NULL. + * + * Managed input devices do not need to be explicitly unregistered or + * freed as it will be done automatically when owner device unbinds from + * its driver (or binding fails). Once managed input device is allocated, + * it is ready to be set up and registered in the same fashion as regular + * input device. There are no special devm_input_device_[un]register() + * variants, regular ones work with both managed and unmanaged devices. + * + * NOTE: the owner device is set up as parent of input device and users + * should not override it. + */ + +struct input_dev *devm_input_allocate_device(struct device *dev) +{ +	struct input_dev *input; +	struct input_devres *devres; + +	devres = devres_alloc(devm_input_device_release, +			      sizeof(struct input_devres), GFP_KERNEL); +	if (!devres) +		return NULL; + +	input = input_allocate_device(); +	if (!input) { +		devres_free(devres); +		return NULL; +	} + +	input->dev.parent = dev; +	input->devres_managed = true; + +	devres->input = input; +	devres_add(dev, devres); + +	return input; +} +EXPORT_SYMBOL(devm_input_allocate_device); +  /**   * input_free_device - free memory occupied by input_dev structure   * @dev: input device to free @@ -1766,8 +1833,14 @@ EXPORT_SYMBOL(input_allocate_device);   */  void input_free_device(struct input_dev *dev)  { -	if (dev) +	if (dev) { +		if (dev->devres_managed) +			WARN_ON(devres_destroy(dev->dev.parent, +						devm_input_device_release, +						devm_input_device_match, +						dev));  		input_put_device(dev); +	}  }  EXPORT_SYMBOL(input_free_device); @@ -1888,6 +1961,38 @@ static void input_cleanse_bitmasks(struct input_dev *dev)  	INPUT_CLEANSE_BITMASK(dev, SW, sw);  } +static void __input_unregister_device(struct input_dev *dev) +{ +	struct input_handle *handle, *next; + +	input_disconnect_device(dev); + +	mutex_lock(&input_mutex); + +	list_for_each_entry_safe(handle, next, &dev->h_list, d_node) +		handle->handler->disconnect(handle); +	WARN_ON(!list_empty(&dev->h_list)); + +	del_timer_sync(&dev->timer); +	list_del_init(&dev->node); + +	input_wakeup_procfs_readers(); + +	mutex_unlock(&input_mutex); + +	device_del(&dev->dev); +} + +static void devm_input_device_unregister(struct device *dev, void *res) +{ +	struct input_devres *devres = res; +	struct input_dev *input = devres->input; + +	dev_dbg(dev, "%s: unregistering device %s\n", +		__func__, dev_name(&input->dev)); +	__input_unregister_device(input); +} +  /**   * input_register_device - register device with input core   * @dev: device to be registered @@ -1903,11 +2008,21 @@ static void input_cleanse_bitmasks(struct input_dev *dev)  int input_register_device(struct input_dev *dev)  {  	static atomic_t input_no = ATOMIC_INIT(0); +	struct input_devres *devres = NULL;  	struct input_handler *handler;  	unsigned int packet_size;  	const char *path;  	int error; +	if (dev->devres_managed) { +		devres = devres_alloc(devm_input_device_unregister, +				      sizeof(struct input_devres), GFP_KERNEL); +		if (!devres) +			return -ENOMEM; + +		devres->input = dev; +	} +  	/* Every input device generates EV_SYN/SYN_REPORT events. */  	__set_bit(EV_SYN, dev->evbit); @@ -1923,8 +2038,10 @@ int input_register_device(struct input_dev *dev)  	dev->max_vals = max(dev->hint_events_per_packet, packet_size) + 2;  	dev->vals = kcalloc(dev->max_vals, sizeof(*dev->vals), GFP_KERNEL); -	if (!dev->vals) -		return -ENOMEM; +	if (!dev->vals) { +		error = -ENOMEM; +		goto err_devres_free; +	}  	/*  	 * If delay and period are pre-set by the driver, then autorepeating @@ -1949,7 +2066,7 @@ int input_register_device(struct input_dev *dev)  	error = device_add(&dev->dev);  	if (error) -		return error; +		goto err_free_vals;  	path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);  	pr_info("%s as %s\n", @@ -1958,10 +2075,8 @@ int input_register_device(struct input_dev *dev)  	kfree(path);  	error = mutex_lock_interruptible(&input_mutex); -	if (error) { -		device_del(&dev->dev); -		return error; -	} +	if (error) +		goto err_device_del;  	list_add_tail(&dev->node, &input_dev_list); @@ -1972,7 +2087,21 @@ int input_register_device(struct input_dev *dev)  	mutex_unlock(&input_mutex); +	if (dev->devres_managed) { +		dev_dbg(dev->dev.parent, "%s: registering %s with devres.\n", +			__func__, dev_name(&dev->dev)); +		devres_add(dev->dev.parent, devres); +	}  	return 0; + +err_device_del: +	device_del(&dev->dev); +err_free_vals: +	kfree(dev->vals); +	dev->vals = NULL; +err_devres_free: +	devres_free(devres); +	return error;  }  EXPORT_SYMBOL(input_register_device); @@ -1985,24 +2114,20 @@ EXPORT_SYMBOL(input_register_device);   */  void input_unregister_device(struct input_dev *dev)  { -	struct input_handle *handle, *next; - -	input_disconnect_device(dev); - -	mutex_lock(&input_mutex); - -	list_for_each_entry_safe(handle, next, &dev->h_list, d_node) -		handle->handler->disconnect(handle); -	WARN_ON(!list_empty(&dev->h_list)); - -	del_timer_sync(&dev->timer); -	list_del_init(&dev->node); - -	input_wakeup_procfs_readers(); - -	mutex_unlock(&input_mutex); - -	device_unregister(&dev->dev); +	if (dev->devres_managed) { +		WARN_ON(devres_destroy(dev->dev.parent, +					devm_input_device_unregister, +					devm_input_device_match, +					dev)); +		__input_unregister_device(dev); +		/* +		 * We do not do input_put_device() here because it will be done +		 * when 2nd devres fires up. +		 */ +	} else { +		__input_unregister_device(dev); +		input_put_device(dev); +	}  }  EXPORT_SYMBOL(input_unregister_device); diff --git a/drivers/input/joystick/as5011.c b/drivers/input/joystick/as5011.c index c96653b5886..121cd63d333 100644 --- a/drivers/input/joystick/as5011.c +++ b/drivers/input/joystick/as5011.c @@ -85,7 +85,10 @@ static int as5011_i2c_write(struct i2c_client *client,  {  	uint8_t data[2] = { aregaddr, avalue };  	struct i2c_msg msg = { -		client->addr, I2C_M_IGNORE_NAK, 2, (uint8_t *)data +		.addr = client->addr, +		.flags = I2C_M_IGNORE_NAK, +		.len = 2, +		.buf = (uint8_t *)data  	};  	int error; @@ -98,8 +101,18 @@ static int as5011_i2c_read(struct i2c_client *client,  {  	uint8_t data[2] = { aregaddr };  	struct i2c_msg msg_set[2] = { -		{ client->addr, I2C_M_REV_DIR_ADDR, 1, (uint8_t *)data }, -		{ client->addr, I2C_M_RD | I2C_M_NOSTART, 1, (uint8_t *)data } +		{ +			.addr = client->addr, +			.flags = I2C_M_REV_DIR_ADDR, +			.len = 1, +			.buf = (uint8_t *)data +		}, +		{ +			.addr = client->addr, +			.flags = I2C_M_RD | I2C_M_NOSTART, +			.len = 1, +			.buf = (uint8_t *)data +		}  	};  	int error; @@ -144,7 +157,7 @@ out:  	return IRQ_HANDLED;  } -static int __devinit as5011_configure_chip(struct as5011_device *as5011, +static int as5011_configure_chip(struct as5011_device *as5011,  				const struct as5011_platform_data *plat_dat)  {  	struct i2c_client *client = as5011->i2c_client; @@ -212,8 +225,8 @@ static int __devinit as5011_configure_chip(struct as5011_device *as5011,  	return 0;  } -static int __devinit as5011_probe(struct i2c_client *client, -				const struct i2c_device_id *id) +static int as5011_probe(struct i2c_client *client, +			 const struct i2c_device_id *id)  {  	const struct as5011_platform_data *plat_data;  	struct as5011_device *as5011; @@ -328,7 +341,7 @@ err_free_mem:  	return error;  } -static int __devexit as5011_remove(struct i2c_client *client) +static int as5011_remove(struct i2c_client *client)  {  	struct as5011_device *as5011 = i2c_get_clientdata(client); @@ -353,7 +366,7 @@ static struct i2c_driver as5011_driver = {  		.name = "as5011",  	},  	.probe		= as5011_probe, -	.remove		= __devexit_p(as5011_remove), +	.remove		= as5011_remove,  	.id_table	= as5011_id,  }; diff --git a/drivers/input/joystick/maplecontrol.c b/drivers/input/joystick/maplecontrol.c index 77cfde571bd..59c10ec5a2a 100644 --- a/drivers/input/joystick/maplecontrol.c +++ b/drivers/input/joystick/maplecontrol.c @@ -78,7 +78,7 @@ static void dc_pad_close(struct input_dev *dev)  }  /* allow the controller to be used */ -static int __devinit probe_maple_controller(struct device *dev) +static int probe_maple_controller(struct device *dev)  {  	static const short btn_bit[32] = {  		BTN_C, BTN_B, BTN_A, BTN_START, -1, -1, -1, -1, @@ -157,7 +157,7 @@ fail:  	return error;  } -static int __devexit remove_maple_controller(struct device *dev) +static int remove_maple_controller(struct device *dev)  {  	struct maple_device *mdev = to_maple_dev(dev);  	struct dc_pad *pad = maple_get_drvdata(mdev); @@ -175,7 +175,7 @@ static struct maple_driver dc_pad_driver = {  	.drv = {  		.name	= "Dreamcast_controller",  		.probe	= probe_maple_controller, -		.remove	= __devexit_p(remove_maple_controller), +		.remove	= remove_maple_controller,  	},  }; diff --git a/drivers/input/joystick/walkera0701.c b/drivers/input/joystick/walkera0701.c index 4dfa1eed4b7..f8f892b076e 100644 --- a/drivers/input/joystick/walkera0701.c +++ b/drivers/input/joystick/walkera0701.c @@ -196,6 +196,7 @@ static void walkera0701_close(struct input_dev *dev)  	struct walkera_dev *w = input_get_drvdata(dev);  	parport_disable_irq(w->parport); +	hrtimer_cancel(&w->timer);  }  static int walkera0701_connect(struct walkera_dev *w, int parport) @@ -224,6 +225,9 @@ static int walkera0701_connect(struct walkera_dev *w, int parport)  	if (parport_claim(w->pardevice))  		goto init_err1; +	hrtimer_init(&w->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); +	w->timer.function = timer_handler; +  	w->input_dev = input_allocate_device();  	if (!w->input_dev)  		goto init_err2; @@ -254,8 +258,6 @@ static int walkera0701_connect(struct walkera_dev *w, int parport)  	if (err)  		goto init_err3; -	hrtimer_init(&w->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); -	w->timer.function = timer_handler;  	return 0;   init_err3: @@ -271,7 +273,6 @@ static int walkera0701_connect(struct walkera_dev *w, int parport)  static void walkera0701_disconnect(struct walkera_dev *w)  { -	hrtimer_cancel(&w->timer);  	input_unregister_device(w->input_dev);  	parport_release(w->pardevice);  	parport_unregister_device(w->pardevice); diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c index 83811e45d63..d6cbfe9df21 100644 --- a/drivers/input/joystick/xpad.c +++ b/drivers/input/joystick/xpad.c @@ -118,11 +118,12 @@ static const struct xpad_device {  	u8 xtype;  } xpad_device[] = {  	{ 0x045e, 0x0202, "Microsoft X-Box pad v1 (US)", 0, XTYPE_XBOX }, -	{ 0x045e, 0x0289, "Microsoft X-Box pad v2 (US)", 0, XTYPE_XBOX },  	{ 0x045e, 0x0285, "Microsoft X-Box pad (Japan)", 0, XTYPE_XBOX },  	{ 0x045e, 0x0287, "Microsoft Xbox Controller S", 0, XTYPE_XBOX }, +	{ 0x045e, 0x0289, "Microsoft X-Box pad v2 (US)", 0, XTYPE_XBOX }, +	{ 0x045e, 0x028e, "Microsoft X-Box 360 pad", 0, XTYPE_XBOX360 }, +	{ 0x045e, 0x0291, "Xbox 360 Wireless Receiver (XBOX)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W },  	{ 0x045e, 0x0719, "Xbox 360 Wireless Receiver", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W }, -	{ 0x0c12, 0x8809, "RedOctane Xbox Dance Pad", DANCEPAD_MAP_CONFIG, XTYPE_XBOX },  	{ 0x044f, 0x0f07, "Thrustmaster, Inc. Controller", 0, XTYPE_XBOX },  	{ 0x046d, 0xc242, "Logitech Chillstream Controller", 0, XTYPE_XBOX360 },  	{ 0x046d, 0xca84, "Logitech Xbox Cordless Controller", 0, XTYPE_XBOX }, @@ -136,9 +137,12 @@ static const struct xpad_device {  	{ 0x0738, 0x4540, "Mad Catz Beat Pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },  	{ 0x0738, 0x4556, "Mad Catz Lynx Wireless Controller", 0, XTYPE_XBOX },  	{ 0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller", 0, XTYPE_XBOX360 }, +	{ 0x0738, 0x4728, "Mad Catz Street Fighter IV FightPad", XTYPE_XBOX360 },  	{ 0x0738, 0x4738, "Mad Catz Wired Xbox 360 Controller (SFIV)", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },  	{ 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, +	{ 0x0738, 0xbeef, "Mad Catz JOYTECH NEO SE Advanced GamePad", XTYPE_XBOX360 },  	{ 0x0c12, 0x8802, "Zeroplus Xbox Controller", 0, XTYPE_XBOX }, +	{ 0x0c12, 0x8809, "RedOctane Xbox Dance Pad", DANCEPAD_MAP_CONFIG, XTYPE_XBOX },  	{ 0x0c12, 0x880a, "Pelican Eclipse PL-2023", 0, XTYPE_XBOX },  	{ 0x0c12, 0x8810, "Zeroplus Xbox Controller", 0, XTYPE_XBOX },  	{ 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", 0, XTYPE_XBOX }, @@ -148,24 +152,28 @@ static const struct xpad_device {  	{ 0x0e6f, 0x0003, "Logic3 Freebird wireless Controller", 0, XTYPE_XBOX },  	{ 0x0e6f, 0x0005, "Eclipse wireless Controller", 0, XTYPE_XBOX },  	{ 0x0e6f, 0x0006, "Edge wireless Controller", 0, XTYPE_XBOX }, -	{ 0x0e6f, 0x0006, "Pelican 'TSZ' Wired Xbox 360 Controller", 0, XTYPE_XBOX360 }, +	{ 0x0e6f, 0x0105, "HSM3 Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },  	{ 0x0e6f, 0x0201, "Pelican PL-3601 'TSZ' Wired Xbox 360 Controller", 0, XTYPE_XBOX360 }, +	{ 0x0e6f, 0x0213, "Afterglow Gamepad for Xbox 360", 0, XTYPE_XBOX360 },  	{ 0x0e8f, 0x0201, "SmartJoy Frag Xpad/PS2 adaptor", 0, XTYPE_XBOX }, +	{ 0x0f0d, 0x000d, "Hori Fighting Stick EX2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, +	{ 0x0f0d, 0x0016, "Hori Real Arcade Pro.EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },  	{ 0x0f30, 0x0202, "Joytech Advanced Controller", 0, XTYPE_XBOX },  	{ 0x0f30, 0x8888, "BigBen XBMiniPad Controller", 0, XTYPE_XBOX },  	{ 0x102c, 0xff0c, "Joytech Wireless Advanced Controller", 0, XTYPE_XBOX }, -	{ 0x12ab, 0x8809, "Xbox DDR dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },  	{ 0x12ab, 0x0004, "Honey Bee Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, -	{ 0x0e6f, 0x0105, "HSM3 Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, +	{ 0x12ab, 0x8809, "Xbox DDR dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },  	{ 0x1430, 0x4748, "RedOctane Guitar Hero X-plorer", 0, XTYPE_XBOX360 },  	{ 0x1430, 0x8888, "TX6500+ Dance Pad (first generation)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },  	{ 0x146b, 0x0601, "BigBen Interactive XBOX 360 Controller", 0, XTYPE_XBOX360 }, -	{ 0x045e, 0x028e, "Microsoft X-Box 360 pad", 0, XTYPE_XBOX360 }, +	{ 0x1689, 0xfd00, "Razer Onza Tournament Edition", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },  	{ 0x1bad, 0x0002, "Harmonix Rock Band Guitar", 0, XTYPE_XBOX360 },  	{ 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, -	{ 0x0f0d, 0x0016, "Hori Real Arcade Pro.EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, -	{ 0x0f0d, 0x000d, "Hori Fighting Stick EX2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, -	{ 0x1689, 0xfd00, "Razer Onza Tournament Edition", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, +	{ 0x1bad, 0xf016, "Mad Catz Xbox 360 Controller", 0, XTYPE_XBOX360 }, +	{ 0x1bad, 0xf028, "Street Fighter IV FightPad", 0, XTYPE_XBOX360 }, +	{ 0x1bad, 0xf901, "Gamestop Xbox 360 Controller", 0, XTYPE_XBOX360 }, +	{ 0x1bad, 0xf903, "Tron Xbox 360 controller", 0, XTYPE_XBOX360 }, +	{ 0x24c6, 0x5300, "PowerA MINI PROEX Controller", 0, XTYPE_XBOX360 },  	{ 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX },  	{ 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN }  }; @@ -235,7 +243,7 @@ static const signed short xpad_abs_triggers[] = {  	{ XPAD_XBOX360_VENDOR_PROTOCOL(vend,1) }, \  	{ XPAD_XBOX360_VENDOR_PROTOCOL(vend,129) } -static struct usb_device_id xpad_table [] = { +static struct usb_device_id xpad_table[] = {  	{ USB_INTERFACE_INFO('X', 'B', 0) },	/* X-Box USB-IF not approved class */  	XPAD_XBOX360_VENDOR(0x045e),		/* Microsoft X-Box 360 controllers */  	XPAD_XBOX360_VENDOR(0x046d),		/* Logitech X-Box 360 style controllers */ @@ -248,10 +256,11 @@ static struct usb_device_id xpad_table [] = {  	XPAD_XBOX360_VENDOR(0x1bad),		/* Harminix Rock Band Guitar and Drums */  	XPAD_XBOX360_VENDOR(0x0f0d),		/* Hori Controllers */  	XPAD_XBOX360_VENDOR(0x1689),		/* Razer Onza */ +	XPAD_XBOX360_VENDOR(0x24c6),		/* PowerA Controllers */  	{ }  }; -MODULE_DEVICE_TABLE (usb, xpad_table); +MODULE_DEVICE_TABLE(usb, xpad_table);  struct usb_xpad {  	struct input_dev *dev;		/* input device interface */ @@ -783,7 +792,7 @@ static int xpad_open(struct input_dev *dev)  	struct usb_xpad *xpad = input_get_drvdata(dev);  	/* URB was submitted in probe */ -	if(xpad->xtype == XTYPE_XBOX360W) +	if (xpad->xtype == XTYPE_XBOX360W)  		return 0;  	xpad->irq_in->dev = xpad->udev; diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig index febead4bf8a..5a240c60342 100644 --- a/drivers/input/keyboard/Kconfig +++ b/drivers/input/keyboard/Kconfig @@ -134,7 +134,7 @@ config KEYBOARD_QT1070  config KEYBOARD_QT2160  	tristate "Atmel AT42QT2160 Touch Sensor Chip" -	depends on I2C && EXPERIMENTAL +	depends on I2C  	help  	  If you say yes here you get support for Atmel AT42QT2160 Touch  	  Sensor chip as a keyboard input. diff --git a/drivers/input/keyboard/adp5520-keys.c b/drivers/input/keyboard/adp5520-keys.c index e9e8674dfda..ef26b17fb15 100644 --- a/drivers/input/keyboard/adp5520-keys.c +++ b/drivers/input/keyboard/adp5520-keys.c @@ -69,7 +69,7 @@ static int adp5520_keys_notifier(struct notifier_block *nb,  	return 0;  } -static int __devinit adp5520_keys_probe(struct platform_device *pdev) +static int adp5520_keys_probe(struct platform_device *pdev)  {  	struct adp5520_keys_platform_data *pdata = pdev->dev.platform_data;  	struct input_dev *input; @@ -182,7 +182,7 @@ err:  	return ret;  } -static int __devexit adp5520_keys_remove(struct platform_device *pdev) +static int adp5520_keys_remove(struct platform_device *pdev)  {  	struct adp5520_keys *dev = platform_get_drvdata(pdev); @@ -200,7 +200,7 @@ static struct platform_driver adp5520_keys_driver = {  		.owner	= THIS_MODULE,  	},  	.probe		= adp5520_keys_probe, -	.remove		= __devexit_p(adp5520_keys_remove), +	.remove		= adp5520_keys_remove,  };  module_platform_driver(adp5520_keys_driver); diff --git a/drivers/input/keyboard/adp5588-keys.c b/drivers/input/keyboard/adp5588-keys.c index b083bf10f13..dbd2047f164 100644 --- a/drivers/input/keyboard/adp5588-keys.c +++ b/drivers/input/keyboard/adp5588-keys.c @@ -145,7 +145,7 @@ static int adp5588_gpio_direction_output(struct gpio_chip *chip,  	return ret;  } -static int __devinit adp5588_build_gpiomap(struct adp5588_kpad *kpad, +static int adp5588_build_gpiomap(struct adp5588_kpad *kpad,  				const struct adp5588_kpad_platform_data *pdata)  {  	bool pin_used[ADP5588_MAXGPIO]; @@ -170,7 +170,7 @@ static int __devinit adp5588_build_gpiomap(struct adp5588_kpad *kpad,  	return n_unused;  } -static int __devinit adp5588_gpio_add(struct adp5588_kpad *kpad) +static int adp5588_gpio_add(struct adp5588_kpad *kpad)  {  	struct device *dev = &kpad->client->dev;  	const struct adp5588_kpad_platform_data *pdata = dev->platform_data; @@ -224,7 +224,7 @@ static int __devinit adp5588_gpio_add(struct adp5588_kpad *kpad)  	return 0;  } -static void __devexit adp5588_gpio_remove(struct adp5588_kpad *kpad) +static void adp5588_gpio_remove(struct adp5588_kpad *kpad)  {  	struct device *dev = &kpad->client->dev;  	const struct adp5588_kpad_platform_data *pdata = dev->platform_data; @@ -319,7 +319,7 @@ static irqreturn_t adp5588_irq(int irq, void *handle)  	return IRQ_HANDLED;  } -static int __devinit adp5588_setup(struct i2c_client *client) +static int adp5588_setup(struct i2c_client *client)  {  	const struct adp5588_kpad_platform_data *pdata = client->dev.platform_data;  	const struct adp5588_gpio_platform_data *gpio_data = pdata->gpio_data; @@ -382,7 +382,7 @@ static int __devinit adp5588_setup(struct i2c_client *client)  	return 0;  } -static void __devinit adp5588_report_switch_state(struct adp5588_kpad *kpad) +static void adp5588_report_switch_state(struct adp5588_kpad *kpad)  {  	int gpi_stat1 = adp5588_read(kpad->client, GPIO_DAT_STAT1);  	int gpi_stat2 = adp5588_read(kpad->client, GPIO_DAT_STAT2); @@ -420,8 +420,8 @@ static void __devinit adp5588_report_switch_state(struct adp5588_kpad *kpad)  } -static int __devinit adp5588_probe(struct i2c_client *client, -					const struct i2c_device_id *id) +static int adp5588_probe(struct i2c_client *client, +			 const struct i2c_device_id *id)  {  	struct adp5588_kpad *kpad;  	const struct adp5588_kpad_platform_data *pdata = client->dev.platform_data; @@ -587,7 +587,7 @@ static int __devinit adp5588_probe(struct i2c_client *client,  	return error;  } -static int __devexit adp5588_remove(struct i2c_client *client) +static int adp5588_remove(struct i2c_client *client)  {  	struct adp5588_kpad *kpad = i2c_get_clientdata(client); @@ -650,7 +650,7 @@ static struct i2c_driver adp5588_driver = {  #endif  	},  	.probe    = adp5588_probe, -	.remove   = __devexit_p(adp5588_remove), +	.remove   = adp5588_remove,  	.id_table = adp5588_id,  }; diff --git a/drivers/input/keyboard/adp5589-keys.c b/drivers/input/keyboard/adp5589-keys.c index 74e60321338..67d12b3427c 100644 --- a/drivers/input/keyboard/adp5589-keys.c +++ b/drivers/input/keyboard/adp5589-keys.c @@ -464,7 +464,7 @@ static int adp5589_gpio_direction_output(struct gpio_chip *chip,  	return ret;  } -static int __devinit adp5589_build_gpiomap(struct adp5589_kpad *kpad, +static int adp5589_build_gpiomap(struct adp5589_kpad *kpad,  				const struct adp5589_kpad_platform_data *pdata)  {  	bool pin_used[ADP5589_MAXGPIO]; @@ -496,7 +496,7 @@ static int __devinit adp5589_build_gpiomap(struct adp5589_kpad *kpad,  	return n_unused;  } -static int __devinit adp5589_gpio_add(struct adp5589_kpad *kpad) +static int adp5589_gpio_add(struct adp5589_kpad *kpad)  {  	struct device *dev = &kpad->client->dev;  	const struct adp5589_kpad_platform_data *pdata = dev->platform_data; @@ -550,7 +550,7 @@ static int __devinit adp5589_gpio_add(struct adp5589_kpad *kpad)  	return 0;  } -static void __devexit adp5589_gpio_remove(struct adp5589_kpad *kpad) +static void adp5589_gpio_remove(struct adp5589_kpad *kpad)  {  	struct device *dev = &kpad->client->dev;  	const struct adp5589_kpad_platform_data *pdata = dev->platform_data; @@ -641,8 +641,7 @@ static irqreturn_t adp5589_irq(int irq, void *handle)  	return IRQ_HANDLED;  } -static int __devinit adp5589_get_evcode(struct adp5589_kpad *kpad, -					unsigned short key) +static int adp5589_get_evcode(struct adp5589_kpad *kpad, unsigned short key)  {  	int i; @@ -655,7 +654,7 @@ static int __devinit adp5589_get_evcode(struct adp5589_kpad *kpad,  	return -EINVAL;  } -static int __devinit adp5589_setup(struct adp5589_kpad *kpad) +static int adp5589_setup(struct adp5589_kpad *kpad)  {  	struct i2c_client *client = kpad->client;  	const struct adp5589_kpad_platform_data *pdata = @@ -820,7 +819,7 @@ static int __devinit adp5589_setup(struct adp5589_kpad *kpad)  	return 0;  } -static void __devinit adp5589_report_switch_state(struct adp5589_kpad *kpad) +static void adp5589_report_switch_state(struct adp5589_kpad *kpad)  {  	int gpi_stat_tmp, pin_loc;  	int i; @@ -860,8 +859,8 @@ static void __devinit adp5589_report_switch_state(struct adp5589_kpad *kpad)  	input_sync(kpad->input);  } -static int __devinit adp5589_probe(struct i2c_client *client, -				   const struct i2c_device_id *id) +static int adp5589_probe(struct i2c_client *client, +			 const struct i2c_device_id *id)  {  	struct adp5589_kpad *kpad;  	const struct adp5589_kpad_platform_data *pdata = @@ -1045,7 +1044,7 @@ err_free_mem:  	return error;  } -static int __devexit adp5589_remove(struct i2c_client *client) +static int adp5589_remove(struct i2c_client *client)  {  	struct adp5589_kpad *kpad = i2c_get_clientdata(client); @@ -1104,7 +1103,7 @@ static struct i2c_driver adp5589_driver = {  		.pm = &adp5589_dev_pm_ops,  	},  	.probe = adp5589_probe, -	.remove = __devexit_p(adp5589_remove), +	.remove = adp5589_remove,  	.id_table = adp5589_id,  }; diff --git a/drivers/input/keyboard/bf54x-keys.c b/drivers/input/keyboard/bf54x-keys.c index 8eb9116e0a5..20b9fa91fb9 100644 --- a/drivers/input/keyboard/bf54x-keys.c +++ b/drivers/input/keyboard/bf54x-keys.c @@ -177,7 +177,7 @@ static irqreturn_t bfin_kpad_isr(int irq, void *dev_id)  	return IRQ_HANDLED;  } -static int __devinit bfin_kpad_probe(struct platform_device *pdev) +static int bfin_kpad_probe(struct platform_device *pdev)  {  	struct bf54x_kpad *bf54x_kpad;  	struct bfin_kpad_platform_data *pdata = pdev->dev.platform_data; @@ -331,7 +331,7 @@ out:  	return error;  } -static int __devexit bfin_kpad_remove(struct platform_device *pdev) +static int bfin_kpad_remove(struct platform_device *pdev)  {  	struct bfin_kpad_platform_data *pdata = pdev->dev.platform_data;  	struct bf54x_kpad *bf54x_kpad = platform_get_drvdata(pdev); @@ -390,7 +390,7 @@ static struct platform_driver bfin_kpad_device_driver = {  		.owner	= THIS_MODULE,  	},  	.probe		= bfin_kpad_probe, -	.remove		= __devexit_p(bfin_kpad_remove), +	.remove		= bfin_kpad_remove,  	.suspend	= bfin_kpad_suspend,  	.resume		= bfin_kpad_resume,  }; diff --git a/drivers/input/keyboard/davinci_keyscan.c b/drivers/input/keyboard/davinci_keyscan.c index d5bacbb479b..4e4e453ea15 100644 --- a/drivers/input/keyboard/davinci_keyscan.c +++ b/drivers/input/keyboard/davinci_keyscan.c @@ -303,7 +303,7 @@ fail1:  	return error;  } -static int __devexit davinci_ks_remove(struct platform_device *pdev) +static int davinci_ks_remove(struct platform_device *pdev)  {  	struct davinci_ks *davinci_ks = platform_get_drvdata(pdev); @@ -326,7 +326,7 @@ static struct platform_driver davinci_ks_driver = {  		.name = "davinci_keyscan",  		.owner = THIS_MODULE,  	}, -	.remove	= __devexit_p(davinci_ks_remove), +	.remove	= davinci_ks_remove,  };  static int __init davinci_ks_init(void) diff --git a/drivers/input/keyboard/ep93xx_keypad.c b/drivers/input/keyboard/ep93xx_keypad.c index 7363402de8d..9857e8fd098 100644 --- a/drivers/input/keyboard/ep93xx_keypad.c +++ b/drivers/input/keyboard/ep93xx_keypad.c @@ -232,7 +232,7 @@ static int ep93xx_keypad_resume(struct device *dev)  static SIMPLE_DEV_PM_OPS(ep93xx_keypad_pm_ops,  			 ep93xx_keypad_suspend, ep93xx_keypad_resume); -static int __devinit ep93xx_keypad_probe(struct platform_device *pdev) +static int ep93xx_keypad_probe(struct platform_device *pdev)  {  	struct ep93xx_keypad *keypad;  	const struct matrix_keymap_data *keymap_data; @@ -346,7 +346,7 @@ failed_free:  	return err;  } -static int __devexit ep93xx_keypad_remove(struct platform_device *pdev) +static int ep93xx_keypad_remove(struct platform_device *pdev)  {  	struct ep93xx_keypad *keypad = platform_get_drvdata(pdev);  	struct resource *res; @@ -380,7 +380,7 @@ static struct platform_driver ep93xx_keypad_driver = {  		.pm	= &ep93xx_keypad_pm_ops,  	},  	.probe		= ep93xx_keypad_probe, -	.remove		= __devexit_p(ep93xx_keypad_remove), +	.remove		= ep93xx_keypad_remove,  };  module_platform_driver(ep93xx_keypad_driver); diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c index 6a68041c261..b29ca651a39 100644 --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c @@ -423,10 +423,10 @@ out:  	return IRQ_HANDLED;  } -static int __devinit gpio_keys_setup_key(struct platform_device *pdev, -					 struct input_dev *input, -					 struct gpio_button_data *bdata, -					 const struct gpio_keys_button *button) +static int gpio_keys_setup_key(struct platform_device *pdev, +				struct input_dev *input, +				struct gpio_button_data *bdata, +				const struct gpio_keys_button *button)  {  	const char *desc = button->desc ? button->desc : "gpio_keys";  	struct device *dev = &pdev->dev; @@ -440,21 +440,13 @@ static int __devinit gpio_keys_setup_key(struct platform_device *pdev,  	if (gpio_is_valid(button->gpio)) { -		error = gpio_request(button->gpio, desc); +		error = gpio_request_one(button->gpio, GPIOF_IN, desc);  		if (error < 0) {  			dev_err(dev, "Failed to request GPIO %d, error %d\n",  				button->gpio, error);  			return error;  		} -		error = gpio_direction_input(button->gpio); -		if (error < 0) { -			dev_err(dev, -				"Failed to configure direction for GPIO %d, error %d\n", -				button->gpio, error); -			goto fail; -		} -  		if (button->debounce_interval) {  			error = gpio_set_debounce(button->gpio,  					button->debounce_interval * 1000); @@ -526,12 +518,35 @@ fail:  	return error;  } +static void gpio_keys_report_state(struct gpio_keys_drvdata *ddata) +{ +	struct input_dev *input = ddata->input; +	int i; + +	for (i = 0; i < ddata->pdata->nbuttons; i++) { +		struct gpio_button_data *bdata = &ddata->data[i]; +		if (gpio_is_valid(bdata->button->gpio)) +			gpio_keys_gpio_report_event(bdata); +	} +	input_sync(input); +} +  static int gpio_keys_open(struct input_dev *input)  {  	struct gpio_keys_drvdata *ddata = input_get_drvdata(input);  	const struct gpio_keys_platform_data *pdata = ddata->pdata; +	int error; -	return pdata->enable ? pdata->enable(input->dev.parent) : 0; +	if (pdata->enable) { +		error = pdata->enable(input->dev.parent); +		if (error) +			return error; +	} + +	/* Report current state of buttons that are connected to GPIOs */ +	gpio_keys_report_state(ddata); + +	return 0;  }  static void gpio_keys_close(struct input_dev *input) @@ -551,7 +566,7 @@ static void gpio_keys_close(struct input_dev *input)  /*   * Translate OpenFirmware node properties into platform_data   */ -static struct gpio_keys_platform_data * __devinit +static struct gpio_keys_platform_data *  gpio_keys_get_devtree_pdata(struct device *dev)  {  	struct device_node *node, *pp; @@ -587,6 +602,7 @@ gpio_keys_get_devtree_pdata(struct device *dev)  	i = 0;  	for_each_child_of_node(node, pp) { +		int gpio;  		enum of_gpio_flags flags;  		if (!of_find_property(pp, "gpios", NULL)) { @@ -595,9 +611,19 @@ gpio_keys_get_devtree_pdata(struct device *dev)  			continue;  		} +		gpio = of_get_gpio_flags(pp, 0, &flags); +		if (gpio < 0) { +			error = gpio; +			if (error != -EPROBE_DEFER) +				dev_err(dev, +					"Failed to get gpio flags, error: %d\n", +					error); +			goto err_free_pdata; +		} +  		button = &pdata->buttons[i++]; -		button->gpio = of_get_gpio_flags(pp, 0, &flags); +		button->gpio = gpio;  		button->active_low = flags & OF_GPIO_ACTIVE_LOW;  		if (of_property_read_u32(pp, "linux,code", &button->code)) { @@ -658,7 +684,7 @@ static void gpio_remove_key(struct gpio_button_data *bdata)  		gpio_free(bdata->button->gpio);  } -static int __devinit gpio_keys_probe(struct platform_device *pdev) +static int gpio_keys_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev); @@ -731,14 +757,6 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)  		goto fail3;  	} -	/* get current state of buttons that are connected to GPIOs */ -	for (i = 0; i < pdata->nbuttons; i++) { -		struct gpio_button_data *bdata = &ddata->data[i]; -		if (gpio_is_valid(bdata->button->gpio)) -			gpio_keys_gpio_report_event(bdata); -	} -	input_sync(input); -  	device_init_wakeup(&pdev->dev, wakeup);  	return 0; @@ -760,7 +778,7 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)  	return error;  } -static int __devexit gpio_keys_remove(struct platform_device *pdev) +static int gpio_keys_remove(struct platform_device *pdev)  {  	struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev);  	struct input_dev *input = ddata->input; @@ -788,6 +806,7 @@ static int __devexit gpio_keys_remove(struct platform_device *pdev)  static int gpio_keys_suspend(struct device *dev)  {  	struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev); +	struct input_dev *input = ddata->input;  	int i;  	if (device_may_wakeup(dev)) { @@ -796,6 +815,11 @@ static int gpio_keys_suspend(struct device *dev)  			if (bdata->button->wakeup)  				enable_irq_wake(bdata->irq);  		} +	} else { +		mutex_lock(&input->mutex); +		if (input->users) +			gpio_keys_close(input); +		mutex_unlock(&input->mutex);  	}  	return 0; @@ -804,18 +828,27 @@ static int gpio_keys_suspend(struct device *dev)  static int gpio_keys_resume(struct device *dev)  {  	struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev); +	struct input_dev *input = ddata->input; +	int error = 0;  	int i; -	for (i = 0; i < ddata->pdata->nbuttons; i++) { -		struct gpio_button_data *bdata = &ddata->data[i]; -		if (bdata->button->wakeup && device_may_wakeup(dev)) -			disable_irq_wake(bdata->irq); - -		if (gpio_is_valid(bdata->button->gpio)) -			gpio_keys_gpio_report_event(bdata); +	if (device_may_wakeup(dev)) { +		for (i = 0; i < ddata->pdata->nbuttons; i++) { +			struct gpio_button_data *bdata = &ddata->data[i]; +			if (bdata->button->wakeup) +				disable_irq_wake(bdata->irq); +		} +	} else { +		mutex_lock(&input->mutex); +		if (input->users) +			error = gpio_keys_open(input); +		mutex_unlock(&input->mutex);  	} -	input_sync(ddata->input); +	if (error) +		return error; + +	gpio_keys_report_state(ddata);  	return 0;  }  #endif @@ -824,7 +857,7 @@ static SIMPLE_DEV_PM_OPS(gpio_keys_pm_ops, gpio_keys_suspend, gpio_keys_resume);  static struct platform_driver gpio_keys_device_driver = {  	.probe		= gpio_keys_probe, -	.remove		= __devexit_p(gpio_keys_remove), +	.remove		= gpio_keys_remove,  	.driver		= {  		.name	= "gpio-keys",  		.owner	= THIS_MODULE, diff --git a/drivers/input/keyboard/gpio_keys_polled.c b/drivers/input/keyboard/gpio_keys_polled.c index f2142de789e..21147164874 100644 --- a/drivers/input/keyboard/gpio_keys_polled.c +++ b/drivers/input/keyboard/gpio_keys_polled.c @@ -103,8 +103,7 @@ static void gpio_keys_polled_close(struct input_polled_dev *dev)  }  #ifdef CONFIG_OF -static struct gpio_keys_platform_data * __devinit -gpio_keys_polled_get_devtree_pdata(struct device *dev) +static struct gpio_keys_platform_data *gpio_keys_polled_get_devtree_pdata(struct device *dev)  {  	struct device_node *node, *pp;  	struct gpio_keys_platform_data *pdata; @@ -136,6 +135,7 @@ gpio_keys_polled_get_devtree_pdata(struct device *dev)  	i = 0;  	for_each_child_of_node(node, pp) { +		int gpio;  		enum of_gpio_flags flags;  		if (!of_find_property(pp, "gpios", NULL)) { @@ -144,9 +144,19 @@ gpio_keys_polled_get_devtree_pdata(struct device *dev)  			continue;  		} +		gpio = of_get_gpio_flags(pp, 0, &flags); +		if (gpio < 0) { +			error = gpio; +			if (error != -EPROBE_DEFER) +				dev_err(dev, +					"Failed to get gpio flags, error: %d\n", +					error); +			goto err_free_pdata; +		} +  		button = &pdata->buttons[i++]; -		button->gpio = of_get_gpio_flags(pp, 0, &flags); +		button->gpio = gpio;  		button->active_low = flags & OF_GPIO_ACTIVE_LOW;  		if (of_property_read_u32(pp, "linux,code", &button->code)) { @@ -196,7 +206,7 @@ gpio_keys_polled_get_devtree_pdata(struct device *dev)  }  #endif -static int __devinit gpio_keys_polled_probe(struct platform_device *pdev) +static int gpio_keys_polled_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev); @@ -246,7 +256,6 @@ static int __devinit gpio_keys_polled_probe(struct platform_device *pdev)  	input = poll_dev->input; -	input->evbit[0] = BIT(EV_KEY);  	input->name = pdev->name;  	input->phys = DRV_NAME"/input0";  	input->dev.parent = &pdev->dev; @@ -256,6 +265,10 @@ static int __devinit gpio_keys_polled_probe(struct platform_device *pdev)  	input->id.product = 0x0001;  	input->id.version = 0x0100; +	__set_bit(EV_KEY, input->evbit); +	if (pdata->rep) +		__set_bit(EV_REP, input->evbit); +  	for (i = 0; i < pdata->nbuttons; i++) {  		struct gpio_keys_button *button = &pdata->buttons[i];  		struct gpio_keys_button_data *bdata = &bdev->data[i]; @@ -268,22 +281,14 @@ static int __devinit gpio_keys_polled_probe(struct platform_device *pdev)  			goto err_free_gpio;  		} -		error = gpio_request(gpio, -				     button->desc ? button->desc : DRV_NAME); +		error = gpio_request_one(gpio, GPIOF_IN, +					 button->desc ?: DRV_NAME);  		if (error) {  			dev_err(dev, "unable to claim gpio %u, err=%d\n",  				gpio, error);  			goto err_free_gpio;  		} -		error = gpio_direction_input(gpio); -		if (error) { -			dev_err(dev, -				"unable to set direction on gpio %u, err=%d\n", -				gpio, error); -			goto err_free_gpio; -		} -  		bdata->can_sleep = gpio_cansleep(gpio);  		bdata->last_state = -1;  		bdata->threshold = DIV_ROUND_UP(button->debounce_interval, @@ -329,7 +334,7 @@ err_free_pdata:  	return error;  } -static int __devexit gpio_keys_polled_remove(struct platform_device *pdev) +static int gpio_keys_polled_remove(struct platform_device *pdev)  {  	struct gpio_keys_polled_dev *bdev = platform_get_drvdata(pdev);  	const struct gpio_keys_platform_data *pdata = bdev->pdata; @@ -357,7 +362,7 @@ static int __devexit gpio_keys_polled_remove(struct platform_device *pdev)  static struct platform_driver gpio_keys_polled_driver = {  	.probe	= gpio_keys_polled_probe, -	.remove	= __devexit_p(gpio_keys_polled_remove), +	.remove	= gpio_keys_polled_remove,  	.driver	= {  		.name	= DRV_NAME,  		.owner	= THIS_MODULE, diff --git a/drivers/input/keyboard/hilkbd.c b/drivers/input/keyboard/hilkbd.c index 5f72440b50c..198dc07a1be 100644 --- a/drivers/input/keyboard/hilkbd.c +++ b/drivers/input/keyboard/hilkbd.c @@ -200,7 +200,7 @@ static void hil_do(unsigned char cmd, unsigned char *data, unsigned int len)  /* initialize HIL */ -static int __devinit hil_keyb_init(void) +static int hil_keyb_init(void)  {  	unsigned char c;  	unsigned int i, kbid; @@ -286,7 +286,7 @@ err1:  	return err;  } -static void __devexit hil_keyb_exit(void) +static void hil_keyb_exit(void)  {  	if (HIL_IRQ)  		free_irq(HIL_IRQ, hil_dev.dev_id); @@ -299,7 +299,7 @@ static void __devexit hil_keyb_exit(void)  }  #if defined(CONFIG_PARISC) -static int __devinit hil_probe_chip(struct parisc_device *dev) +static int hil_probe_chip(struct parisc_device *dev)  {  	/* Only allow one HIL keyboard */  	if (hil_dev.dev) @@ -320,7 +320,7 @@ static int __devinit hil_probe_chip(struct parisc_device *dev)  	return hil_keyb_init();  } -static int __devexit hil_remove_chip(struct parisc_device *dev) +static int hil_remove_chip(struct parisc_device *dev)  {  	hil_keyb_exit(); @@ -341,7 +341,7 @@ static struct parisc_driver hil_driver = {  	.name		= "hil",  	.id_table	= hil_tbl,  	.probe		= hil_probe_chip, -	.remove		= __devexit_p(hil_remove_chip), +	.remove		= hil_remove_chip,  };  static int __init hil_init(void) diff --git a/drivers/input/keyboard/imx_keypad.c b/drivers/input/keyboard/imx_keypad.c index cdc252612c0..6d150e3e1f5 100644 --- a/drivers/input/keyboard/imx_keypad.c +++ b/drivers/input/keyboard/imx_keypad.c @@ -362,7 +362,8 @@ static void imx_keypad_inhibit(struct imx_keypad *keypad)  	writew(reg_val, keypad->mmio_base + KPSR);  	/* Colums as open drain and disable all rows */ -	writew(0xff00, keypad->mmio_base + KPCR); +	reg_val = (keypad->cols_en_mask & 0xff) << 8; +	writew(reg_val, keypad->mmio_base + KPCR);  }  static void imx_keypad_close(struct input_dev *dev) @@ -413,7 +414,7 @@ open_err:  	return -EIO;  } -static int __devinit imx_keypad_probe(struct platform_device *pdev) +static int imx_keypad_probe(struct platform_device *pdev)  {  	const struct matrix_keymap_data *keymap_data = pdev->dev.platform_data;  	struct imx_keypad *keypad; @@ -554,7 +555,7 @@ failed_rel_mem:  	return error;  } -static int __devexit imx_keypad_remove(struct platform_device *pdev) +static int imx_keypad_remove(struct platform_device *pdev)  {  	struct imx_keypad *keypad = platform_get_drvdata(pdev);  	struct resource *res; @@ -632,7 +633,7 @@ static struct platform_driver imx_keypad_driver = {  		.pm	= &imx_kbd_pm_ops,  	},  	.probe		= imx_keypad_probe, -	.remove		= __devexit_p(imx_keypad_remove), +	.remove		= imx_keypad_remove,  };  module_platform_driver(imx_keypad_driver); diff --git a/drivers/input/keyboard/jornada680_kbd.c b/drivers/input/keyboard/jornada680_kbd.c index 24f3ea01c4d..74e75a6e8de 100644 --- a/drivers/input/keyboard/jornada680_kbd.c +++ b/drivers/input/keyboard/jornada680_kbd.c @@ -179,7 +179,7 @@ static void jornadakbd680_poll(struct input_polled_dev *dev)  	memcpy(jornadakbd->old_scan, jornadakbd->new_scan, JORNADA_SCAN_SIZE);  } -static int __devinit jornada680kbd_probe(struct platform_device *pdev) +static int jornada680kbd_probe(struct platform_device *pdev)  {  	struct jornadakbd *jornadakbd;  	struct input_polled_dev *poll_dev; @@ -240,7 +240,7 @@ static int __devinit jornada680kbd_probe(struct platform_device *pdev)  } -static int __devexit jornada680kbd_remove(struct platform_device *pdev) +static int jornada680kbd_remove(struct platform_device *pdev)  {  	struct jornadakbd *jornadakbd = platform_get_drvdata(pdev); @@ -258,7 +258,7 @@ static struct platform_driver jornada680kbd_driver = {  		.owner	= THIS_MODULE,  	},  	.probe	= jornada680kbd_probe, -	.remove	= __devexit_p(jornada680kbd_remove), +	.remove	= jornada680kbd_remove,  };  module_platform_driver(jornada680kbd_driver); diff --git a/drivers/input/keyboard/jornada720_kbd.c b/drivers/input/keyboard/jornada720_kbd.c index 9d639fa1afb..5ceef636df2 100644 --- a/drivers/input/keyboard/jornada720_kbd.c +++ b/drivers/input/keyboard/jornada720_kbd.c @@ -94,7 +94,7 @@ static irqreturn_t jornada720_kbd_interrupt(int irq, void *dev_id)  	return IRQ_HANDLED;  }; -static int __devinit jornada720_kbd_probe(struct platform_device *pdev) +static int jornada720_kbd_probe(struct platform_device *pdev)  {  	struct jornadakbd *jornadakbd;  	struct input_dev *input_dev; @@ -152,7 +152,7 @@ static int __devinit jornada720_kbd_probe(struct platform_device *pdev)  	return err;  }; -static int __devexit jornada720_kbd_remove(struct platform_device *pdev) +static int jornada720_kbd_remove(struct platform_device *pdev)  {  	struct jornadakbd *jornadakbd = platform_get_drvdata(pdev); @@ -173,6 +173,6 @@ static struct platform_driver jornada720_kbd_driver = {  		.owner	= THIS_MODULE,  	 },  	.probe   = jornada720_kbd_probe, -	.remove  = __devexit_p(jornada720_kbd_remove), +	.remove  = jornada720_kbd_remove,  };  module_platform_driver(jornada720_kbd_driver); diff --git a/drivers/input/keyboard/lm8323.c b/drivers/input/keyboard/lm8323.c index 39ac2787e27..93c81266213 100644 --- a/drivers/input/keyboard/lm8323.c +++ b/drivers/input/keyboard/lm8323.c @@ -624,7 +624,7 @@ static ssize_t lm8323_set_disable(struct device *dev,  }  static DEVICE_ATTR(disable_kp, 0644, lm8323_show_disable, lm8323_set_disable); -static int __devinit lm8323_probe(struct i2c_client *client, +static int lm8323_probe(struct i2c_client *client,  				  const struct i2c_device_id *id)  {  	struct lm8323_platform_data *pdata = client->dev.platform_data; @@ -764,7 +764,7 @@ fail1:  	return err;  } -static int __devexit lm8323_remove(struct i2c_client *client) +static int lm8323_remove(struct i2c_client *client)  {  	struct lm8323_chip *lm = i2c_get_clientdata(client);  	int i; @@ -846,7 +846,7 @@ static struct i2c_driver lm8323_i2c_driver = {  		.pm	= &lm8323_pm_ops,  	},  	.probe		= lm8323_probe, -	.remove		= __devexit_p(lm8323_remove), +	.remove		= lm8323_remove,  	.id_table	= lm8323_id,  };  MODULE_DEVICE_TABLE(i2c, lm8323_id); diff --git a/drivers/input/keyboard/lm8333.c b/drivers/input/keyboard/lm8333.c index 081fd9effa8..5a8ca35dc9a 100644 --- a/drivers/input/keyboard/lm8333.c +++ b/drivers/input/keyboard/lm8333.c @@ -128,7 +128,7 @@ static irqreturn_t lm8333_irq_thread(int irq, void *data)  	return IRQ_HANDLED;  } -static int __devinit lm8333_probe(struct i2c_client *client, +static int lm8333_probe(struct i2c_client *client,  				  const struct i2c_device_id *id)  {  	const struct lm8333_platform_data *pdata = client->dev.platform_data; @@ -202,7 +202,7 @@ static int __devinit lm8333_probe(struct i2c_client *client,  	return err;  } -static int __devexit lm8333_remove(struct i2c_client *client) +static int lm8333_remove(struct i2c_client *client)  {  	struct lm8333 *lm8333 = i2c_get_clientdata(client); @@ -225,7 +225,7 @@ static struct i2c_driver lm8333_driver = {  		.owner		= THIS_MODULE,  	},  	.probe		= lm8333_probe, -	.remove		= __devexit_p(lm8333_remove), +	.remove		= lm8333_remove,  	.id_table	= lm8333_id,  };  module_i2c_driver(lm8333_driver); diff --git a/drivers/input/keyboard/locomokbd.c b/drivers/input/keyboard/locomokbd.c index b1ab29861e1..c94d610b9d7 100644 --- a/drivers/input/keyboard/locomokbd.c +++ b/drivers/input/keyboard/locomokbd.c @@ -46,7 +46,7 @@ MODULE_LICENSE("GPL");  #define KEY_CENTER		KEY_F15  static const unsigned char -locomokbd_keycode[LOCOMOKBD_NUMKEYS] __devinitconst = { +locomokbd_keycode[LOCOMOKBD_NUMKEYS] = {  	0, KEY_ESC, KEY_ACTIVITY, 0, 0, 0, 0, 0, 0, 0,				/* 0 - 9 */  	0, 0, 0, 0, 0, 0, 0, KEY_MENU, KEY_HOME, KEY_CONTACT,			/* 10 - 19 */  	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,						/* 20 - 29 */ @@ -236,7 +236,7 @@ static void locomokbd_close(struct input_dev *dev)  	locomo_writel(r, locomokbd->base + LOCOMO_KIC);  } -static int __devinit locomokbd_probe(struct locomo_dev *dev) +static int locomokbd_probe(struct locomo_dev *dev)  {  	struct locomokbd *locomokbd;  	struct input_dev *input_dev; @@ -321,7 +321,7 @@ static int __devinit locomokbd_probe(struct locomo_dev *dev)  	return err;  } -static int __devexit locomokbd_remove(struct locomo_dev *dev) +static int locomokbd_remove(struct locomo_dev *dev)  {  	struct locomokbd *locomokbd = locomo_get_drvdata(dev); @@ -345,7 +345,7 @@ static struct locomo_driver keyboard_driver = {  	},  	.devid	= LOCOMO_DEVID_KEYBOARD,  	.probe	= locomokbd_probe, -	.remove	= __devexit_p(locomokbd_remove), +	.remove	= locomokbd_remove,  };  static int __init locomokbd_init(void) diff --git a/drivers/input/keyboard/lpc32xx-keys.c b/drivers/input/keyboard/lpc32xx-keys.c index dd786c8a758..1b8add6cfb9 100644 --- a/drivers/input/keyboard/lpc32xx-keys.c +++ b/drivers/input/keyboard/lpc32xx-keys.c @@ -139,7 +139,7 @@ static void lpc32xx_kscan_close(struct input_dev *dev)  	clk_disable_unprepare(kscandat->clk);  } -static int __devinit lpc32xx_parse_dt(struct device *dev, +static int lpc32xx_parse_dt(struct device *dev,  				      struct lpc32xx_kscan_drv *kscandat)  {  	struct device_node *np = dev->of_node; @@ -166,7 +166,7 @@ static int __devinit lpc32xx_parse_dt(struct device *dev,  	return 0;  } -static int __devinit lpc32xx_kscan_probe(struct platform_device *pdev) +static int lpc32xx_kscan_probe(struct platform_device *pdev)  {  	struct lpc32xx_kscan_drv *kscandat;  	struct input_dev *input; @@ -310,7 +310,7 @@ err_free_mem:  	return error;  } -static int __devexit lpc32xx_kscan_remove(struct platform_device *pdev) +static int lpc32xx_kscan_remove(struct platform_device *pdev)  {  	struct lpc32xx_kscan_drv *kscandat = platform_get_drvdata(pdev); @@ -377,7 +377,7 @@ MODULE_DEVICE_TABLE(of, lpc32xx_kscan_match);  static struct platform_driver lpc32xx_kscan_driver = {  	.probe		= lpc32xx_kscan_probe, -	.remove		= __devexit_p(lpc32xx_kscan_remove), +	.remove		= lpc32xx_kscan_remove,  	.driver		= {  		.name	= DRV_NAME,  		.owner	= THIS_MODULE, diff --git a/drivers/input/keyboard/matrix_keypad.c b/drivers/input/keyboard/matrix_keypad.c index 18b72372028..f4ff0dda759 100644 --- a/drivers/input/keyboard/matrix_keypad.c +++ b/drivers/input/keyboard/matrix_keypad.c @@ -23,6 +23,9 @@  #include <linux/gpio.h>  #include <linux/input/matrix_keypad.h>  #include <linux/slab.h> +#include <linux/of.h> +#include <linux/of_gpio.h> +#include <linux/of_platform.h>  struct matrix_keypad {  	const struct matrix_keypad_platform_data *pdata; @@ -37,8 +40,6 @@ struct matrix_keypad {  	bool scan_pending;  	bool stopped;  	bool gpio_all_disabled; - -	unsigned short keycodes[];  };  /* @@ -118,6 +119,7 @@ static void matrix_keypad_scan(struct work_struct *work)  	struct matrix_keypad *keypad =  		container_of(work, struct matrix_keypad, work.work);  	struct input_dev *input_dev = keypad->input_dev; +	const unsigned short *keycodes = input_dev->keycode;  	const struct matrix_keypad_platform_data *pdata = keypad->pdata;  	uint32_t new_state[MATRIX_MAX_COLS];  	int row, col, code; @@ -153,7 +155,7 @@ static void matrix_keypad_scan(struct work_struct *work)  			code = MATRIX_SCAN_CODE(row, col, keypad->row_shift);  			input_event(input_dev, EV_MSC, MSC_SCAN, code);  			input_report_key(input_dev, -					 keypad->keycodes[code], +					 keycodes[code],  					 new_state[col] & (1 << row));  		}  	} @@ -299,8 +301,8 @@ static int matrix_keypad_resume(struct device *dev)  static SIMPLE_DEV_PM_OPS(matrix_keypad_pm_ops,  			 matrix_keypad_suspend, matrix_keypad_resume); -static int __devinit matrix_keypad_init_gpio(struct platform_device *pdev, -					     struct matrix_keypad *keypad) +static int matrix_keypad_init_gpio(struct platform_device *pdev, +				   struct matrix_keypad *keypad)  {  	const struct matrix_keypad_platform_data *pdata = keypad->pdata;  	int i, err; @@ -394,33 +396,95 @@ static void matrix_keypad_free_gpio(struct matrix_keypad *keypad)  		gpio_free(pdata->col_gpios[i]);  } -static int __devinit matrix_keypad_probe(struct platform_device *pdev) +#ifdef CONFIG_OF +static struct matrix_keypad_platform_data * +matrix_keypad_parse_dt(struct device *dev) +{ +	struct matrix_keypad_platform_data *pdata; +	struct device_node *np = dev->of_node; +	unsigned int *gpios; +	int i; + +	if (!np) { +		dev_err(dev, "device lacks DT data\n"); +		return ERR_PTR(-ENODEV); +	} + +	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); +	if (!pdata) { +		dev_err(dev, "could not allocate memory for platform data\n"); +		return ERR_PTR(-ENOMEM); +	} + +	pdata->num_row_gpios = of_gpio_named_count(np, "row-gpios"); +	pdata->num_col_gpios = of_gpio_named_count(np, "col-gpios"); +	if (!pdata->num_row_gpios || !pdata->num_col_gpios) { +		dev_err(dev, "number of keypad rows/columns not specified\n"); +		return ERR_PTR(-EINVAL); +	} + +	if (of_get_property(np, "linux,no-autorepeat", NULL)) +		pdata->no_autorepeat = true; +	if (of_get_property(np, "linux,wakeup", NULL)) +		pdata->wakeup = true; +	if (of_get_property(np, "gpio-activelow", NULL)) +		pdata->active_low = true; + +	of_property_read_u32(np, "debounce-delay-ms", &pdata->debounce_ms); +	of_property_read_u32(np, "col-scan-delay-us", +						&pdata->col_scan_delay_us); + +	gpios = devm_kzalloc(dev, +			     sizeof(unsigned int) * +				(pdata->num_row_gpios + pdata->num_col_gpios), +			     GFP_KERNEL); +	if (!gpios) { +		dev_err(dev, "could not allocate memory for gpios\n"); +		return ERR_PTR(-ENOMEM); +	} + +	for (i = 0; i < pdata->num_row_gpios; i++) +		gpios[i] = of_get_named_gpio(np, "row-gpios", i); + +	for (i = 0; i < pdata->num_col_gpios; i++) +		gpios[pdata->num_row_gpios + i] = +			of_get_named_gpio(np, "col-gpios", i); + +	pdata->row_gpios = gpios; +	pdata->col_gpios = &gpios[pdata->num_row_gpios]; + +	return pdata; +} +#else +static inline struct matrix_keypad_platform_data * +matrix_keypad_parse_dt(struct device *dev) +{ +	dev_err(dev, "no platform data defined\n"); + +	return ERR_PTR(-EINVAL); +} +#endif + +static int matrix_keypad_probe(struct platform_device *pdev)  {  	const struct matrix_keypad_platform_data *pdata; -	const struct matrix_keymap_data *keymap_data;  	struct matrix_keypad *keypad;  	struct input_dev *input_dev; -	unsigned int row_shift; -	size_t keymap_size;  	int err; -	pdata = pdev->dev.platform_data; +	pdata = dev_get_platdata(&pdev->dev);  	if (!pdata) { -		dev_err(&pdev->dev, "no platform data defined\n"); -		return -EINVAL; -	} - -	keymap_data = pdata->keymap_data; -	if (!keymap_data) { +		pdata = matrix_keypad_parse_dt(&pdev->dev); +		if (IS_ERR(pdata)) { +			dev_err(&pdev->dev, "no platform data defined\n"); +			return PTR_ERR(pdata); +		} +	} else if (!pdata->keymap_data) {  		dev_err(&pdev->dev, "no keymap data defined\n");  		return -EINVAL;  	} -	row_shift = get_count_order(pdata->num_col_gpios); -	keymap_size = (pdata->num_row_gpios << row_shift) * -			sizeof(keypad->keycodes[0]); -	keypad = kzalloc(sizeof(struct matrix_keypad) + keymap_size, -			 GFP_KERNEL); +	keypad = kzalloc(sizeof(struct matrix_keypad), GFP_KERNEL);  	input_dev = input_allocate_device();  	if (!keypad || !input_dev) {  		err = -ENOMEM; @@ -429,7 +493,7 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev)  	keypad->input_dev = input_dev;  	keypad->pdata = pdata; -	keypad->row_shift = row_shift; +	keypad->row_shift = get_count_order(pdata->num_col_gpios);  	keypad->stopped = true;  	INIT_DELAYED_WORK(&keypad->work, matrix_keypad_scan);  	spin_lock_init(&keypad->lock); @@ -440,12 +504,14 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev)  	input_dev->open		= matrix_keypad_start;  	input_dev->close	= matrix_keypad_stop; -	err = matrix_keypad_build_keymap(keymap_data, NULL, +	err = matrix_keypad_build_keymap(pdata->keymap_data, NULL,  					 pdata->num_row_gpios,  					 pdata->num_col_gpios, -					 keypad->keycodes, input_dev); -	if (err) +					 NULL, input_dev); +	if (err) { +		dev_err(&pdev->dev, "failed to build keymap\n");  		goto err_free_mem; +	}  	if (!pdata->no_autorepeat)  		__set_bit(EV_REP, input_dev->evbit); @@ -473,7 +539,7 @@ err_free_mem:  	return err;  } -static int __devexit matrix_keypad_remove(struct platform_device *pdev) +static int matrix_keypad_remove(struct platform_device *pdev)  {  	struct matrix_keypad *keypad = platform_get_drvdata(pdev); @@ -488,13 +554,22 @@ static int __devexit matrix_keypad_remove(struct platform_device *pdev)  	return 0;  } +#ifdef CONFIG_OF +static const struct of_device_id matrix_keypad_dt_match[] = { +	{ .compatible = "gpio-matrix-keypad" }, +	{ } +}; +MODULE_DEVICE_TABLE(of, matrix_keypad_dt_match); +#endif +  static struct platform_driver matrix_keypad_driver = {  	.probe		= matrix_keypad_probe, -	.remove		= __devexit_p(matrix_keypad_remove), +	.remove		= matrix_keypad_remove,  	.driver		= {  		.name	= "matrix-keypad",  		.owner	= THIS_MODULE,  		.pm	= &matrix_keypad_pm_ops, +		.of_match_table = of_match_ptr(matrix_keypad_dt_match),  	},  };  module_platform_driver(matrix_keypad_driver); diff --git a/drivers/input/keyboard/max7359_keypad.c b/drivers/input/keyboard/max7359_keypad.c index 8edada8ae71..7c7af2b01e6 100644 --- a/drivers/input/keyboard/max7359_keypad.c +++ b/drivers/input/keyboard/max7359_keypad.c @@ -179,7 +179,7 @@ static void max7359_initialize(struct i2c_client *client)  	max7359_fall_deepsleep(client);  } -static int __devinit max7359_probe(struct i2c_client *client, +static int max7359_probe(struct i2c_client *client,  					const struct i2c_device_id *id)  {  	const struct matrix_keymap_data *keymap_data = client->dev.platform_data; @@ -260,7 +260,7 @@ failed_free_mem:  	return error;  } -static int __devexit max7359_remove(struct i2c_client *client) +static int max7359_remove(struct i2c_client *client)  {  	struct max7359_keypad *keypad = i2c_get_clientdata(client); @@ -312,7 +312,7 @@ static struct i2c_driver max7359_i2c_driver = {  		.pm   = &max7359_pm,  	},  	.probe		= max7359_probe, -	.remove		= __devexit_p(max7359_remove), +	.remove		= max7359_remove,  	.id_table	= max7359_ids,  }; diff --git a/drivers/input/keyboard/mcs_touchkey.c b/drivers/input/keyboard/mcs_touchkey.c index 0d77f6c8495..7c236f9c6a5 100644 --- a/drivers/input/keyboard/mcs_touchkey.c +++ b/drivers/input/keyboard/mcs_touchkey.c @@ -97,7 +97,7 @@ static irqreturn_t mcs_touchkey_interrupt(int irq, void *dev_id)  	return IRQ_HANDLED;  } -static int __devinit mcs_touchkey_probe(struct i2c_client *client, +static int mcs_touchkey_probe(struct i2c_client *client,  		const struct i2c_device_id *id)  {  	const struct mcs_platform_data *pdata; @@ -200,7 +200,7 @@ err_free_mem:  	return error;  } -static int __devexit mcs_touchkey_remove(struct i2c_client *client) +static int mcs_touchkey_remove(struct i2c_client *client)  {  	struct mcs_touchkey_data *data = i2c_get_clientdata(client); @@ -270,7 +270,7 @@ static struct i2c_driver mcs_touchkey_driver = {  		.pm	= &mcs_touchkey_pm_ops,  	},  	.probe		= mcs_touchkey_probe, -	.remove		= __devexit_p(mcs_touchkey_remove), +	.remove		= mcs_touchkey_remove,  	.shutdown       = mcs_touchkey_shutdown,  	.id_table	= mcs_touchkey_id,  }; diff --git a/drivers/input/keyboard/mpr121_touchkey.c b/drivers/input/keyboard/mpr121_touchkey.c index 7613f1cac95..f7f3e9a9fd3 100644 --- a/drivers/input/keyboard/mpr121_touchkey.c +++ b/drivers/input/keyboard/mpr121_touchkey.c @@ -71,7 +71,7 @@ struct mpr121_init_register {  	u8 val;  }; -static const struct mpr121_init_register init_reg_table[] __devinitconst = { +static const struct mpr121_init_register init_reg_table[] = {  	{ MHD_RISING_ADDR,	0x1 },  	{ NHD_RISING_ADDR,	0x1 },  	{ MHD_FALLING_ADDR,	0x1 }, @@ -123,7 +123,7 @@ out:  	return IRQ_HANDLED;  } -static int __devinit mpr121_phys_init(const struct mpr121_platform_data *pdata, +static int mpr121_phys_init(const struct mpr121_platform_data *pdata,  				      struct mpr121_touchkey *mpr121,  				      struct i2c_client *client)  { @@ -185,8 +185,8 @@ err_i2c_write:  	return ret;  } -static int __devinit mpr_touchkey_probe(struct i2c_client *client, -					const struct i2c_device_id *id) +static int mpr_touchkey_probe(struct i2c_client *client, +			      const struct i2c_device_id *id)  {  	const struct mpr121_platform_data *pdata = client->dev.platform_data;  	struct mpr121_touchkey *mpr121; @@ -272,7 +272,7 @@ err_free_mem:  	return error;  } -static int __devexit mpr_touchkey_remove(struct i2c_client *client) +static int mpr_touchkey_remove(struct i2c_client *client)  {  	struct mpr121_touchkey *mpr121 = i2c_get_clientdata(client); @@ -327,7 +327,7 @@ static struct i2c_driver mpr_touchkey_driver = {  	},  	.id_table	= mpr121_id,  	.probe		= mpr_touchkey_probe, -	.remove		= __devexit_p(mpr_touchkey_remove), +	.remove		= mpr_touchkey_remove,  };  module_i2c_driver(mpr_touchkey_driver); diff --git a/drivers/input/keyboard/nomadik-ske-keypad.c b/drivers/input/keyboard/nomadik-ske-keypad.c index 49f5fa64e0b..0e6a8151fee 100644 --- a/drivers/input/keyboard/nomadik-ske-keypad.c +++ b/drivers/input/keyboard/nomadik-ske-keypad.c @@ -67,6 +67,7 @@ struct ske_keypad {  	const struct ske_keypad_platform_data *board;  	unsigned short keymap[SKE_KPD_NUM_ROWS * SKE_KPD_NUM_COLS];  	struct clk *clk; +	struct clk *pclk;  	spinlock_t ske_keypad_lock;  }; @@ -271,11 +272,18 @@ static int __init ske_keypad_probe(struct platform_device *pdev)  		goto err_free_mem_region;  	} +	keypad->pclk = clk_get(&pdev->dev, "apb_pclk"); +	if (IS_ERR(keypad->pclk)) { +		dev_err(&pdev->dev, "failed to get pclk\n"); +		error = PTR_ERR(keypad->pclk); +		goto err_iounmap; +	} +  	keypad->clk = clk_get(&pdev->dev, NULL);  	if (IS_ERR(keypad->clk)) {  		dev_err(&pdev->dev, "failed to get clk\n");  		error = PTR_ERR(keypad->clk); -		goto err_iounmap; +		goto err_pclk;  	}  	input->id.bustype = BUS_HOST; @@ -287,14 +295,25 @@ static int __init ske_keypad_probe(struct platform_device *pdev)  					   keypad->keymap, input);  	if (error) {  		dev_err(&pdev->dev, "Failed to build keymap\n"); -		goto err_iounmap; +		goto err_clk;  	}  	input_set_capability(input, EV_MSC, MSC_SCAN);  	if (!plat->no_autorepeat)  		__set_bit(EV_REP, input->evbit); -	clk_enable(keypad->clk); +	error = clk_prepare_enable(keypad->pclk); +	if (error) { +		dev_err(&pdev->dev, "Failed to prepare/enable pclk\n"); +		goto err_clk; +	} + +	error = clk_prepare_enable(keypad->clk); +	if (error) { +		dev_err(&pdev->dev, "Failed to prepare/enable clk\n"); +		goto err_pclk_disable; +	} +  	/* go through board initialization helpers */  	if (keypad->board->init) @@ -330,8 +349,13 @@ static int __init ske_keypad_probe(struct platform_device *pdev)  err_free_irq:  	free_irq(keypad->irq, keypad);  err_clk_disable: -	clk_disable(keypad->clk); +	clk_disable_unprepare(keypad->clk); +err_pclk_disable: +	clk_disable_unprepare(keypad->pclk); +err_clk:  	clk_put(keypad->clk); +err_pclk: +	clk_put(keypad->pclk);  err_iounmap:  	iounmap(keypad->reg_base);  err_free_mem_region: @@ -342,7 +366,7 @@ err_free_mem:  	return error;  } -static int __devexit ske_keypad_remove(struct platform_device *pdev) +static int ske_keypad_remove(struct platform_device *pdev)  {  	struct ske_keypad *keypad = platform_get_drvdata(pdev);  	struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@ -351,7 +375,7 @@ static int __devexit ske_keypad_remove(struct platform_device *pdev)  	input_unregister_device(keypad->input); -	clk_disable(keypad->clk); +	clk_disable_unprepare(keypad->clk);  	clk_put(keypad->clk);  	if (keypad->board->exit) @@ -403,7 +427,7 @@ static struct platform_driver ske_keypad_driver = {  		.owner  = THIS_MODULE,  		.pm = &ske_keypad_dev_pm_ops,  	}, -	.remove = __devexit_p(ske_keypad_remove), +	.remove = ske_keypad_remove,  };  static int __init ske_keypad_init(void) diff --git a/drivers/input/keyboard/omap-keypad.c b/drivers/input/keyboard/omap-keypad.c index 4a5fcc8026f..d0d5226d9cd 100644 --- a/drivers/input/keyboard/omap-keypad.c +++ b/drivers/input/keyboard/omap-keypad.c @@ -244,7 +244,7 @@ static int omap_kp_resume(struct platform_device *dev)  #define omap_kp_resume	NULL  #endif -static int __devinit omap_kp_probe(struct platform_device *pdev) +static int omap_kp_probe(struct platform_device *pdev)  {  	struct omap_kp *omap_kp;  	struct input_dev *input_dev; @@ -357,7 +357,7 @@ err2:  	return -EINVAL;  } -static int __devexit omap_kp_remove(struct platform_device *pdev) +static int omap_kp_remove(struct platform_device *pdev)  {  	struct omap_kp *omap_kp = platform_get_drvdata(pdev); @@ -379,7 +379,7 @@ static int __devexit omap_kp_remove(struct platform_device *pdev)  static struct platform_driver omap_kp_driver = {  	.probe		= omap_kp_probe, -	.remove		= __devexit_p(omap_kp_remove), +	.remove		= omap_kp_remove,  	.suspend	= omap_kp_suspend,  	.resume		= omap_kp_resume,  	.driver		= { diff --git a/drivers/input/keyboard/omap4-keypad.c b/drivers/input/keyboard/omap4-keypad.c index c05f98c4141..e25b022692c 100644 --- a/drivers/input/keyboard/omap4-keypad.c +++ b/drivers/input/keyboard/omap4-keypad.c @@ -211,8 +211,8 @@ static void omap4_keypad_close(struct input_dev *input)  }  #ifdef CONFIG_OF -static int __devinit omap4_keypad_parse_dt(struct device *dev, -					   struct omap4_keypad *keypad_data) +static int omap4_keypad_parse_dt(struct device *dev, +				 struct omap4_keypad *keypad_data)  {  	struct device_node *np = dev->of_node; @@ -241,7 +241,7 @@ static inline int omap4_keypad_parse_dt(struct device *dev,  }  #endif -static int __devinit omap4_keypad_probe(struct platform_device *pdev) +static int omap4_keypad_probe(struct platform_device *pdev)  {  	const struct omap4_keypad_platform_data *pdata =  				dev_get_platdata(&pdev->dev); @@ -406,7 +406,7 @@ err_free_keypad:  	return error;  } -static int __devexit omap4_keypad_remove(struct platform_device *pdev) +static int omap4_keypad_remove(struct platform_device *pdev)  {  	struct omap4_keypad *keypad_data = platform_get_drvdata(pdev);  	struct resource *res; @@ -440,7 +440,7 @@ MODULE_DEVICE_TABLE(of, omap_keypad_dt_match);  static struct platform_driver omap4_keypad_driver = {  	.probe		= omap4_keypad_probe, -	.remove		= __devexit_p(omap4_keypad_remove), +	.remove		= omap4_keypad_remove,  	.driver		= {  		.name	= "omap4-keypad",  		.owner	= THIS_MODULE, diff --git a/drivers/input/keyboard/opencores-kbd.c b/drivers/input/keyboard/opencores-kbd.c index abe728c7b88..7ac5f174c6f 100644 --- a/drivers/input/keyboard/opencores-kbd.c +++ b/drivers/input/keyboard/opencores-kbd.c @@ -37,7 +37,7 @@ static irqreturn_t opencores_kbd_isr(int irq, void *dev_id)  	return IRQ_HANDLED;  } -static int __devinit opencores_kbd_probe(struct platform_device *pdev) +static int opencores_kbd_probe(struct platform_device *pdev)  {  	struct input_dev *input;  	struct opencores_kbd *opencores_kbd; @@ -139,7 +139,7 @@ static int __devinit opencores_kbd_probe(struct platform_device *pdev)  	return error;  } -static int __devexit opencores_kbd_remove(struct platform_device *pdev) +static int opencores_kbd_remove(struct platform_device *pdev)  {  	struct opencores_kbd *opencores_kbd = platform_get_drvdata(pdev); @@ -158,7 +158,7 @@ static int __devexit opencores_kbd_remove(struct platform_device *pdev)  static struct platform_driver opencores_kbd_device_driver = {  	.probe    = opencores_kbd_probe, -	.remove   = __devexit_p(opencores_kbd_remove), +	.remove   = opencores_kbd_remove,  	.driver   = {  		.name = "opencores-kbd",  	}, diff --git a/drivers/input/keyboard/pmic8xxx-keypad.c b/drivers/input/keyboard/pmic8xxx-keypad.c index 52c34657d30..74339e139d4 100644 --- a/drivers/input/keyboard/pmic8xxx-keypad.c +++ b/drivers/input/keyboard/pmic8xxx-keypad.c @@ -397,7 +397,7 @@ static irqreturn_t pmic8xxx_kp_irq(int irq, void *data)  	return IRQ_HANDLED;  } -static int __devinit pmic8xxx_kpd_init(struct pmic8xxx_kp *kp) +static int pmic8xxx_kpd_init(struct pmic8xxx_kp *kp)  {  	int bits, rc, cycles;  	u8 scan_val = 0, ctrl_val = 0; @@ -447,7 +447,7 @@ static int __devinit pmic8xxx_kpd_init(struct pmic8xxx_kp *kp)  } -static int  __devinit pmic8xxx_kp_config_gpio(int gpio_start, int num_gpios, +static int  pmic8xxx_kp_config_gpio(int gpio_start, int num_gpios,  			struct pmic8xxx_kp *kp, struct pm_gpio *gpio_config)  {  	int	rc, i; @@ -518,7 +518,7 @@ static void pmic8xxx_kp_close(struct input_dev *dev)   * - set irq edge type.   * - enable the keypad controller.   */ -static int __devinit pmic8xxx_kp_probe(struct platform_device *pdev) +static int pmic8xxx_kp_probe(struct platform_device *pdev)  {  	const struct pm8xxx_keypad_platform_data *pdata =  					dev_get_platdata(&pdev->dev); @@ -712,7 +712,7 @@ err_alloc_device:  	return rc;  } -static int __devexit pmic8xxx_kp_remove(struct platform_device *pdev) +static int pmic8xxx_kp_remove(struct platform_device *pdev)  {  	struct pmic8xxx_kp *kp = platform_get_drvdata(pdev); @@ -773,7 +773,7 @@ static SIMPLE_DEV_PM_OPS(pm8xxx_kp_pm_ops,  static struct platform_driver pmic8xxx_kp_driver = {  	.probe		= pmic8xxx_kp_probe, -	.remove		= __devexit_p(pmic8xxx_kp_remove), +	.remove		= pmic8xxx_kp_remove,  	.driver		= {  		.name = PM8XXX_KEYPAD_DEV_NAME,  		.owner = THIS_MODULE, diff --git a/drivers/input/keyboard/pxa27x_keypad.c b/drivers/input/keyboard/pxa27x_keypad.c index cad9d5dd597..5330d8fbf6c 100644 --- a/drivers/input/keyboard/pxa27x_keypad.c +++ b/drivers/input/keyboard/pxa27x_keypad.c @@ -482,7 +482,7 @@ static const struct dev_pm_ops pxa27x_keypad_pm_ops = {  };  #endif -static int __devinit pxa27x_keypad_probe(struct platform_device *pdev) +static int pxa27x_keypad_probe(struct platform_device *pdev)  {  	struct pxa27x_keypad_platform_data *pdata = pdev->dev.platform_data;  	struct pxa27x_keypad *keypad; @@ -595,7 +595,7 @@ failed_free:  	return error;  } -static int __devexit pxa27x_keypad_remove(struct platform_device *pdev) +static int pxa27x_keypad_remove(struct platform_device *pdev)  {  	struct pxa27x_keypad *keypad = platform_get_drvdata(pdev);  	struct resource *res; @@ -620,7 +620,7 @@ MODULE_ALIAS("platform:pxa27x-keypad");  static struct platform_driver pxa27x_keypad_driver = {  	.probe		= pxa27x_keypad_probe, -	.remove		= __devexit_p(pxa27x_keypad_remove), +	.remove		= pxa27x_keypad_remove,  	.driver		= {  		.name	= "pxa27x-keypad",  		.owner	= THIS_MODULE, diff --git a/drivers/input/keyboard/pxa930_rotary.c b/drivers/input/keyboard/pxa930_rotary.c index 41488f9add2..bcad95be73a 100644 --- a/drivers/input/keyboard/pxa930_rotary.c +++ b/drivers/input/keyboard/pxa930_rotary.c @@ -82,7 +82,7 @@ static void pxa930_rotary_close(struct input_dev *dev)  	clear_sbcr(r);  } -static int __devinit pxa930_rotary_probe(struct platform_device *pdev) +static int pxa930_rotary_probe(struct platform_device *pdev)  {  	struct pxa930_rotary_platform_data *pdata = pdev->dev.platform_data;  	struct pxa930_rotary *r; @@ -174,7 +174,7 @@ failed_free:  	return err;  } -static int __devexit pxa930_rotary_remove(struct platform_device *pdev) +static int pxa930_rotary_remove(struct platform_device *pdev)  {  	struct pxa930_rotary *r = platform_get_drvdata(pdev); @@ -193,7 +193,7 @@ static struct platform_driver pxa930_rotary_driver = {  		.owner	= THIS_MODULE,  	},  	.probe		= pxa930_rotary_probe, -	.remove		= __devexit_p(pxa930_rotary_remove), +	.remove		= pxa930_rotary_remove,  };  module_platform_driver(pxa930_rotary_driver); diff --git a/drivers/input/keyboard/qt1070.c b/drivers/input/keyboard/qt1070.c index ca68f2992d7..42b773b3125 100644 --- a/drivers/input/keyboard/qt1070.c +++ b/drivers/input/keyboard/qt1070.c @@ -91,7 +91,7 @@ static int qt1070_write(struct i2c_client *client, u8 reg, u8 data)  	return ret;  } -static bool __devinit qt1070_identify(struct i2c_client *client) +static bool qt1070_identify(struct i2c_client *client)  {  	int id, ver; @@ -140,7 +140,7 @@ static irqreturn_t qt1070_interrupt(int irq, void *dev_id)  	return IRQ_HANDLED;  } -static int __devinit qt1070_probe(struct i2c_client *client, +static int qt1070_probe(struct i2c_client *client,  				const struct i2c_device_id *id)  {  	struct qt1070_data *data; @@ -230,7 +230,7 @@ err_free_mem:  	return err;  } -static int __devexit qt1070_remove(struct i2c_client *client) +static int qt1070_remove(struct i2c_client *client)  {  	struct qt1070_data *data = i2c_get_clientdata(client); @@ -256,7 +256,7 @@ static struct i2c_driver qt1070_driver = {  	},  	.id_table	= qt1070_id,  	.probe		= qt1070_probe, -	.remove		= __devexit_p(qt1070_remove), +	.remove		= qt1070_remove,  };  module_i2c_driver(qt1070_driver); diff --git a/drivers/input/keyboard/qt2160.c b/drivers/input/keyboard/qt2160.c index 76b7d430d03..3dc2b0f27b0 100644 --- a/drivers/input/keyboard/qt2160.c +++ b/drivers/input/keyboard/qt2160.c @@ -183,7 +183,7 @@ static void qt2160_worker(struct work_struct *work)  	qt2160_schedule_read(qt2160);  } -static int __devinit qt2160_read(struct i2c_client *client, u8 reg) +static int qt2160_read(struct i2c_client *client, u8 reg)  {  	int ret; @@ -204,29 +204,20 @@ static int __devinit qt2160_read(struct i2c_client *client, u8 reg)  	return ret;  } -static int __devinit qt2160_write(struct i2c_client *client, u8 reg, u8 data) +static int qt2160_write(struct i2c_client *client, u8 reg, u8 data)  { -	int error; - -	error = i2c_smbus_write_byte(client, reg); -	if (error) { -		dev_err(&client->dev, -			"couldn't send request. Returned %d\n", error); -		return error; -	} +	int ret; -	error = i2c_smbus_write_byte(client, data); -	if (error) { +	ret = i2c_smbus_write_byte_data(client, reg, data); +	if (ret < 0)  		dev_err(&client->dev, -			"couldn't write data. Returned %d\n", error); -		return error; -	} +			"couldn't write data. Returned %d\n", ret); -	return error; +	return ret;  } -static bool __devinit qt2160_identify(struct i2c_client *client) +static bool qt2160_identify(struct i2c_client *client)  {  	int id, ver, rev; @@ -257,7 +248,7 @@ static bool __devinit qt2160_identify(struct i2c_client *client)  	return true;  } -static int __devinit qt2160_probe(struct i2c_client *client, +static int qt2160_probe(struct i2c_client *client,  				  const struct i2c_device_id *id)  {  	struct qt2160_data *qt2160; @@ -344,7 +335,7 @@ err_free_mem:  	return error;  } -static int __devexit qt2160_remove(struct i2c_client *client) +static int qt2160_remove(struct i2c_client *client)  {  	struct qt2160_data *qt2160 = i2c_get_clientdata(client); @@ -375,7 +366,7 @@ static struct i2c_driver qt2160_driver = {  	.id_table	= qt2160_idtable,  	.probe		= qt2160_probe, -	.remove		= __devexit_p(qt2160_remove), +	.remove		= qt2160_remove,  };  module_i2c_driver(qt2160_driver); diff --git a/drivers/input/keyboard/samsung-keypad.c b/drivers/input/keyboard/samsung-keypad.c index 9d7a111486f..22e357b5102 100644 --- a/drivers/input/keyboard/samsung-keypad.c +++ b/drivers/input/keyboard/samsung-keypad.c @@ -309,7 +309,7 @@ static void samsung_keypad_parse_dt_gpio(struct device *dev,  				struct samsung_keypad *keypad)  {  	struct device_node *np = dev->of_node; -	int gpio, ret, row, col; +	int gpio, error, row, col;  	for (row = 0; row < keypad->rows; row++) {  		gpio = of_get_named_gpio(np, "row-gpios", row); @@ -320,10 +320,11 @@ static void samsung_keypad_parse_dt_gpio(struct device *dev,  			continue;  		} -		ret = gpio_request(gpio, "keypad-row"); -		if (ret) -			dev_err(dev, "keypad row[%d] gpio request failed\n", -					row); +		error = devm_gpio_request(dev, gpio, "keypad-row"); +		if (error) +			dev_err(dev, +				"keypad row[%d] gpio request failed: %d\n", +				row, error);  	}  	for (col = 0; col < keypad->cols; col++) { @@ -335,38 +336,22 @@ static void samsung_keypad_parse_dt_gpio(struct device *dev,  			continue;  		} -		ret = gpio_request(gpio, "keypad-col"); -		if (ret) -			dev_err(dev, "keypad column[%d] gpio request failed\n", -					col); +		error = devm_gpio_request(dev, gpio, "keypad-col"); +		if (error) +			dev_err(dev, +				"keypad column[%d] gpio request failed: %d\n", +				col, error);  	}  } - -static void samsung_keypad_dt_gpio_free(struct samsung_keypad *keypad) -{ -	int cnt; - -	for (cnt = 0; cnt < keypad->rows; cnt++) -		if (gpio_is_valid(keypad->row_gpios[cnt])) -			gpio_free(keypad->row_gpios[cnt]); - -	for (cnt = 0; cnt < keypad->cols; cnt++) -		if (gpio_is_valid(keypad->col_gpios[cnt])) -			gpio_free(keypad->col_gpios[cnt]); -}  #else  static  struct samsung_keypad_platdata *samsung_keypad_parse_dt(struct device *dev)  {  	return NULL;  } - -static void samsung_keypad_dt_gpio_free(struct samsung_keypad *keypad) -{ -}  #endif -static int __devinit samsung_keypad_probe(struct platform_device *pdev) +static int samsung_keypad_probe(struct platform_device *pdev)  {  	const struct samsung_keypad_platdata *pdata;  	const struct matrix_keymap_data *keymap_data; @@ -405,36 +390,30 @@ static int __devinit samsung_keypad_probe(struct platform_device *pdev)  	row_shift = get_count_order(pdata->cols);  	keymap_size = (pdata->rows << row_shift) * sizeof(keypad->keycodes[0]); -	keypad = kzalloc(sizeof(*keypad) + keymap_size, GFP_KERNEL); -	input_dev = input_allocate_device(); -	if (!keypad || !input_dev) { -		error = -ENOMEM; -		goto err_free_mem; -	} +	keypad = devm_kzalloc(&pdev->dev, sizeof(*keypad) + keymap_size, +			      GFP_KERNEL); +	input_dev = devm_input_allocate_device(&pdev->dev); +	if (!keypad || !input_dev) +		return -ENOMEM;  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (!res) { -		error = -ENODEV; -		goto err_free_mem; -	} +	if (!res) +		return -ENODEV; -	keypad->base = ioremap(res->start, resource_size(res)); -	if (!keypad->base) { -		error = -EBUSY; -		goto err_free_mem; -	} +	keypad->base = devm_ioremap(&pdev->dev, res->start, resource_size(res)); +	if (!keypad->base) +		return -EBUSY; -	keypad->clk = clk_get(&pdev->dev, "keypad"); +	keypad->clk = devm_clk_get(&pdev->dev, "keypad");  	if (IS_ERR(keypad->clk)) {  		dev_err(&pdev->dev, "failed to get keypad clk\n"); -		error = PTR_ERR(keypad->clk); -		goto err_unmap_base; +		return PTR_ERR(keypad->clk);  	}  	error = clk_prepare(keypad->clk);  	if (error) {  		dev_err(&pdev->dev, "keypad clock prepare failed\n"); -		goto err_put_clk; +		return error;  	}  	keypad->input_dev = input_dev; @@ -479,14 +458,15 @@ static int __devinit samsung_keypad_probe(struct platform_device *pdev)  	keypad->irq = platform_get_irq(pdev, 0);  	if (keypad->irq < 0) {  		error = keypad->irq; -		goto err_put_clk; +		goto err_unprepare_clk;  	} -	error = request_threaded_irq(keypad->irq, NULL, samsung_keypad_irq, -			IRQF_ONESHOT, dev_name(&pdev->dev), keypad); +	error = devm_request_threaded_irq(&pdev->dev, keypad->irq, NULL, +					  samsung_keypad_irq, IRQF_ONESHOT, +					  dev_name(&pdev->dev), keypad);  	if (error) {  		dev_err(&pdev->dev, "failed to register keypad interrupt\n"); -		goto err_put_clk; +		goto err_unprepare_clk;  	}  	device_init_wakeup(&pdev->dev, pdata->wakeup); @@ -495,7 +475,7 @@ static int __devinit samsung_keypad_probe(struct platform_device *pdev)  	error = input_register_device(keypad->input_dev);  	if (error) -		goto err_free_irq; +		goto err_disable_runtime_pm;  	if (pdev->dev.of_node) {  		devm_kfree(&pdev->dev, (void *)pdata->keymap_data->keymap); @@ -504,26 +484,16 @@ static int __devinit samsung_keypad_probe(struct platform_device *pdev)  	}  	return 0; -err_free_irq: -	free_irq(keypad->irq, keypad); +err_disable_runtime_pm:  	pm_runtime_disable(&pdev->dev);  	device_init_wakeup(&pdev->dev, 0);  	platform_set_drvdata(pdev, NULL);  err_unprepare_clk:  	clk_unprepare(keypad->clk); -err_put_clk: -	clk_put(keypad->clk); -	samsung_keypad_dt_gpio_free(keypad); -err_unmap_base: -	iounmap(keypad->base); -err_free_mem: -	input_free_device(input_dev); -	kfree(keypad); -  	return error;  } -static int __devexit samsung_keypad_remove(struct platform_device *pdev) +static int samsung_keypad_remove(struct platform_device *pdev)  {  	struct samsung_keypad *keypad = platform_get_drvdata(pdev); @@ -533,18 +503,7 @@ static int __devexit samsung_keypad_remove(struct platform_device *pdev)  	input_unregister_device(keypad->input_dev); -	/* -	 * It is safe to free IRQ after unregistering device because -	 * samsung_keypad_close will shut off interrupts. -	 */ -	free_irq(keypad->irq, keypad); -  	clk_unprepare(keypad->clk); -	clk_put(keypad->clk); -	samsung_keypad_dt_gpio_free(keypad); - -	iounmap(keypad->base); -	kfree(keypad);  	return 0;  } @@ -685,7 +644,7 @@ MODULE_DEVICE_TABLE(platform, samsung_keypad_driver_ids);  static struct platform_driver samsung_keypad_driver = {  	.probe		= samsung_keypad_probe, -	.remove		= __devexit_p(samsung_keypad_remove), +	.remove		= samsung_keypad_remove,  	.driver		= {  		.name	= "samsung-keypad",  		.owner	= THIS_MODULE, diff --git a/drivers/input/keyboard/sh_keysc.c b/drivers/input/keyboard/sh_keysc.c index da54ad5db15..fdb9eb2df38 100644 --- a/drivers/input/keyboard/sh_keysc.c +++ b/drivers/input/keyboard/sh_keysc.c @@ -162,7 +162,7 @@ static irqreturn_t sh_keysc_isr(int irq, void *dev_id)  	return IRQ_HANDLED;  } -static int __devinit sh_keysc_probe(struct platform_device *pdev) +static int sh_keysc_probe(struct platform_device *pdev)  {  	struct sh_keysc_priv *priv;  	struct sh_keysc_info *pdata; @@ -272,7 +272,7 @@ static int __devinit sh_keysc_probe(struct platform_device *pdev)  	return error;  } -static int __devexit sh_keysc_remove(struct platform_device *pdev) +static int sh_keysc_remove(struct platform_device *pdev)  {  	struct sh_keysc_priv *priv = platform_get_drvdata(pdev); @@ -331,7 +331,7 @@ static SIMPLE_DEV_PM_OPS(sh_keysc_dev_pm_ops,  static struct platform_driver sh_keysc_device_driver = {  	.probe		= sh_keysc_probe, -	.remove		= __devexit_p(sh_keysc_remove), +	.remove		= sh_keysc_remove,  	.driver		= {  		.name	= "sh_keysc",  		.pm	= &sh_keysc_dev_pm_ops, diff --git a/drivers/input/keyboard/spear-keyboard.c b/drivers/input/keyboard/spear-keyboard.c index c7ca97f44bf..695d237417d 100644 --- a/drivers/input/keyboard/spear-keyboard.c +++ b/drivers/input/keyboard/spear-keyboard.c @@ -55,15 +55,15 @@  struct spear_kbd {  	struct input_dev *input; -	struct resource *res;  	void __iomem *io_base;  	struct clk *clk;  	unsigned int irq;  	unsigned int mode; +	unsigned int suspended_rate;  	unsigned short last_key;  	unsigned short keycodes[NUM_ROWS * NUM_COLS];  	bool rep; -	unsigned int suspended_rate; +	bool irq_wake_enabled;  	u32 mode_ctl_reg;  }; @@ -146,7 +146,7 @@ static void spear_kbd_close(struct input_dev *dev)  }  #ifdef CONFIG_OF -static int __devinit spear_kbd_parse_dt(struct platform_device *pdev, +static int spear_kbd_parse_dt(struct platform_device *pdev,                                          struct spear_kbd *kbd)  {  	struct device_node *np = pdev->dev.of_node; @@ -181,7 +181,7 @@ static inline int spear_kbd_parse_dt(struct platform_device *pdev,  }  #endif -static int __devinit spear_kbd_probe(struct platform_device *pdev) +static int spear_kbd_probe(struct platform_device *pdev)  {  	struct kbd_platform_data *pdata = dev_get_platdata(&pdev->dev);  	const struct matrix_keymap_data *keymap = pdata ? pdata->keymap : NULL; @@ -203,12 +203,16 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)  		return irq;  	} -	kbd = kzalloc(sizeof(*kbd), GFP_KERNEL); -	input_dev = input_allocate_device(); -	if (!kbd || !input_dev) { -		dev_err(&pdev->dev, "out of memory\n"); -		error = -ENOMEM; -		goto err_free_mem; +	kbd = devm_kzalloc(&pdev->dev, sizeof(*kbd), GFP_KERNEL); +	if (!kbd) { +		dev_err(&pdev->dev, "not enough memory for driver data\n"); +		return -ENOMEM; +	} + +	input_dev = devm_input_allocate_device(&pdev->dev); +	if (!input_dev) { +		dev_err(&pdev->dev, "unable to allocate input device\n"); +		return -ENOMEM;  	}  	kbd->input = input_dev; @@ -217,37 +221,25 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)  	if (!pdata) {  		error = spear_kbd_parse_dt(pdev, kbd);  		if (error) -			goto err_free_mem; +			return error;  	} else {  		kbd->mode = pdata->mode;  		kbd->rep = pdata->rep;  		kbd->suspended_rate = pdata->suspended_rate;  	} -	kbd->res = request_mem_region(res->start, resource_size(res), -				      pdev->name); -	if (!kbd->res) { -		dev_err(&pdev->dev, "keyboard region already claimed\n"); -		error = -EBUSY; -		goto err_free_mem; -	} - -	kbd->io_base = ioremap(res->start, resource_size(res)); +	kbd->io_base = devm_request_and_ioremap(&pdev->dev, res);  	if (!kbd->io_base) { -		dev_err(&pdev->dev, "ioremap failed for kbd_region\n"); -		error = -ENOMEM; -		goto err_release_mem_region; +		dev_err(&pdev->dev, "request-ioremap failed for kbd_region\n"); +		return -ENOMEM;  	} -	kbd->clk = clk_get(&pdev->dev, NULL); -	if (IS_ERR(kbd->clk)) { -		error = PTR_ERR(kbd->clk); -		goto err_iounmap; -	} +	kbd->clk = devm_clk_get(&pdev->dev, NULL); +	if (IS_ERR(kbd->clk)) +		return PTR_ERR(kbd->clk);  	input_dev->name = "Spear Keyboard";  	input_dev->phys = "keyboard/input0"; -	input_dev->dev.parent = &pdev->dev;  	input_dev->id.bustype = BUS_HOST;  	input_dev->id.vendor = 0x0001;  	input_dev->id.product = 0x0001; @@ -259,7 +251,7 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)  					   kbd->keycodes, input_dev);  	if (error) {  		dev_err(&pdev->dev, "Failed to build keymap\n"); -		goto err_put_clk; +		return error;  	}  	if (kbd->rep) @@ -268,48 +260,36 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)  	input_set_drvdata(input_dev, kbd); -	error = request_irq(irq, spear_kbd_interrupt, 0, "keyboard", kbd); +	error = devm_request_irq(&pdev->dev, irq, spear_kbd_interrupt, 0, +			"keyboard", kbd);  	if (error) { -		dev_err(&pdev->dev, "request_irq fail\n"); -		goto err_put_clk; +		dev_err(&pdev->dev, "request_irq failed\n"); +		return error;  	} +	error = clk_prepare(kbd->clk); +	if (error) +		return error; +  	error = input_register_device(input_dev);  	if (error) {  		dev_err(&pdev->dev, "Unable to register keyboard device\n"); -		goto err_free_irq; +		clk_unprepare(kbd->clk); +		return error;  	}  	device_init_wakeup(&pdev->dev, 1);  	platform_set_drvdata(pdev, kbd);  	return 0; - -err_free_irq: -	free_irq(kbd->irq, kbd); -err_put_clk: -	clk_put(kbd->clk); -err_iounmap: -	iounmap(kbd->io_base); -err_release_mem_region: -	release_mem_region(res->start, resource_size(res)); -err_free_mem: -	input_free_device(input_dev); -	kfree(kbd); - -	return error;  } -static int __devexit spear_kbd_remove(struct platform_device *pdev) +static int spear_kbd_remove(struct platform_device *pdev)  {  	struct spear_kbd *kbd = platform_get_drvdata(pdev); -	free_irq(kbd->irq, kbd);  	input_unregister_device(kbd->input); -	clk_put(kbd->clk); -	iounmap(kbd->io_base); -	release_mem_region(kbd->res->start, resource_size(kbd->res)); -	kfree(kbd); +	clk_unprepare(kbd->clk);  	device_init_wakeup(&pdev->dev, 0);  	platform_set_drvdata(pdev, NULL); @@ -333,7 +313,8 @@ static int spear_kbd_suspend(struct device *dev)  	mode_ctl_reg = readl_relaxed(kbd->io_base + MODE_CTL_REG);  	if (device_may_wakeup(&pdev->dev)) { -		enable_irq_wake(kbd->irq); +		if (!enable_irq_wake(kbd->irq)) +			kbd->irq_wake_enabled = true;  		/*  		 * reprogram the keyboard operating frequency as on some @@ -379,7 +360,10 @@ static int spear_kbd_resume(struct device *dev)  	mutex_lock(&input_dev->mutex);  	if (device_may_wakeup(&pdev->dev)) { -		disable_irq_wake(kbd->irq); +		if (kbd->irq_wake_enabled) { +			kbd->irq_wake_enabled = false; +			disable_irq_wake(kbd->irq); +		}  	} else {  		if (input_dev->users)  			clk_enable(kbd->clk); @@ -407,7 +391,7 @@ MODULE_DEVICE_TABLE(of, spear_kbd_id_table);  static struct platform_driver spear_kbd_driver = {  	.probe		= spear_kbd_probe, -	.remove		= __devexit_p(spear_kbd_remove), +	.remove		= spear_kbd_remove,  	.driver		= {  		.name	= "keyboard",  		.owner	= THIS_MODULE, diff --git a/drivers/input/keyboard/stmpe-keypad.c b/drivers/input/keyboard/stmpe-keypad.c index 470a8778dec..5cbec56f772 100644 --- a/drivers/input/keyboard/stmpe-keypad.c +++ b/drivers/input/keyboard/stmpe-keypad.c @@ -166,7 +166,7 @@ static irqreturn_t stmpe_keypad_irq(int irq, void *dev)  	return IRQ_HANDLED;  } -static int __devinit stmpe_keypad_altfunc_init(struct stmpe_keypad *keypad) +static int stmpe_keypad_altfunc_init(struct stmpe_keypad *keypad)  {  	const struct stmpe_keypad_variant *variant = keypad->variant;  	unsigned int col_gpios = variant->col_gpios; @@ -207,7 +207,7 @@ static int __devinit stmpe_keypad_altfunc_init(struct stmpe_keypad *keypad)  	return stmpe_set_altfunc(stmpe, pins, STMPE_BLOCK_KEYPAD);  } -static int __devinit stmpe_keypad_chip_init(struct stmpe_keypad *keypad) +static int stmpe_keypad_chip_init(struct stmpe_keypad *keypad)  {  	const struct stmpe_keypad_platform_data *plat = keypad->plat;  	const struct stmpe_keypad_variant *variant = keypad->variant; @@ -257,105 +257,131 @@ static int __devinit stmpe_keypad_chip_init(struct stmpe_keypad *keypad)  			      (plat->debounce_ms << 1));  } -static int __devinit stmpe_keypad_probe(struct platform_device *pdev) +static void stmpe_keypad_fill_used_pins(struct stmpe_keypad *keypad)  { -	struct stmpe *stmpe = dev_get_drvdata(pdev->dev.parent); +	int row, col; + +	for (row = 0; row < STMPE_KEYPAD_MAX_ROWS; row++) { +		for (col = 0; col < STMPE_KEYPAD_MAX_COLS; col++) { +			int code = MATRIX_SCAN_CODE(row, col, +						STMPE_KEYPAD_ROW_SHIFT); +			if (keypad->keymap[code] != KEY_RESERVED) { +				keypad->rows |= 1 << row; +				keypad->cols |= 1 << col; +			} +		} +	} +} + +#ifdef CONFIG_OF +static const struct stmpe_keypad_platform_data * +stmpe_keypad_of_probe(struct device *dev) +{ +	struct device_node *np = dev->of_node;  	struct stmpe_keypad_platform_data *plat; + +	if (!np) +		return ERR_PTR(-ENODEV); + +	plat = devm_kzalloc(dev, sizeof(*plat), GFP_KERNEL); +	if (!plat) +		return ERR_PTR(-ENOMEM); + +	of_property_read_u32(np, "debounce-interval", &plat->debounce_ms); +	of_property_read_u32(np, "st,scan-count", &plat->scan_count); + +	plat->no_autorepeat = of_property_read_bool(np, "st,no-autorepeat"); + +	return plat; +} +#else +static inline const struct stmpe_keypad_platform_data * +stmpe_keypad_of_probe(struct device *dev) +{ +	return ERR_PTR(-EINVAL); +} +#endif + +static int stmpe_keypad_probe(struct platform_device *pdev) +{ +	struct stmpe *stmpe = dev_get_drvdata(pdev->dev.parent); +	const struct stmpe_keypad_platform_data *plat;  	struct stmpe_keypad *keypad;  	struct input_dev *input; -	int ret; +	int error;  	int irq; -	int i;  	plat = stmpe->pdata->keypad; -	if (!plat) -		return -ENODEV; +	if (!plat) { +		plat = stmpe_keypad_of_probe(&pdev->dev); +		if (IS_ERR(plat)) +			return PTR_ERR(plat); +	}  	irq = platform_get_irq(pdev, 0);  	if (irq < 0)  		return irq; -	keypad = kzalloc(sizeof(struct stmpe_keypad), GFP_KERNEL); +	keypad = devm_kzalloc(&pdev->dev, sizeof(struct stmpe_keypad), +			      GFP_KERNEL);  	if (!keypad)  		return -ENOMEM; -	input = input_allocate_device(); -	if (!input) { -		ret = -ENOMEM; -		goto out_freekeypad; -	} +	input = devm_input_allocate_device(&pdev->dev); +	if (!input) +		return -ENOMEM;  	input->name = "STMPE keypad";  	input->id.bustype = BUS_I2C;  	input->dev.parent = &pdev->dev; -	ret = matrix_keypad_build_keymap(plat->keymap_data, NULL, -					 STMPE_KEYPAD_MAX_ROWS, -					 STMPE_KEYPAD_MAX_COLS, -					 keypad->keymap, input); -	if (ret) -		goto out_freeinput; +	error = matrix_keypad_build_keymap(plat->keymap_data, NULL, +					   STMPE_KEYPAD_MAX_ROWS, +					   STMPE_KEYPAD_MAX_COLS, +					   keypad->keymap, input); +	if (error) +		return error;  	input_set_capability(input, EV_MSC, MSC_SCAN);  	if (!plat->no_autorepeat)  		__set_bit(EV_REP, input->evbit); -	for (i = 0; i < plat->keymap_data->keymap_size; i++) { -		unsigned int key = plat->keymap_data->keymap[i]; - -		keypad->cols |= 1 << KEY_COL(key); -		keypad->rows |= 1 << KEY_ROW(key); -	} +	stmpe_keypad_fill_used_pins(keypad);  	keypad->stmpe = stmpe;  	keypad->plat = plat;  	keypad->input = input;  	keypad->variant = &stmpe_keypad_variants[stmpe->partnum]; -	ret = stmpe_keypad_chip_init(keypad); -	if (ret < 0) -		goto out_freeinput; +	error = stmpe_keypad_chip_init(keypad); +	if (error < 0) +		return error; -	ret = input_register_device(input); -	if (ret) { -		dev_err(&pdev->dev, -			"unable to register input device: %d\n", ret); -		goto out_freeinput; +	error = devm_request_threaded_irq(&pdev->dev, irq, +					  NULL, stmpe_keypad_irq, +					  IRQF_ONESHOT, "stmpe-keypad", keypad); +	if (error) { +		dev_err(&pdev->dev, "unable to get irq: %d\n", error); +		return error;  	} -	ret = request_threaded_irq(irq, NULL, stmpe_keypad_irq, IRQF_ONESHOT, -				   "stmpe-keypad", keypad); -	if (ret) { -		dev_err(&pdev->dev, "unable to get irq: %d\n", ret); -		goto out_unregisterinput; +	error = input_register_device(input); +	if (error) { +		dev_err(&pdev->dev, +			"unable to register input device: %d\n", error); +		return error;  	}  	platform_set_drvdata(pdev, keypad);  	return 0; - -out_unregisterinput: -	input_unregister_device(input); -	input = NULL; -out_freeinput: -	input_free_device(input); -out_freekeypad: -	kfree(keypad); -	return ret;  } -static int __devexit stmpe_keypad_remove(struct platform_device *pdev) +static int stmpe_keypad_remove(struct platform_device *pdev)  {  	struct stmpe_keypad *keypad = platform_get_drvdata(pdev); -	struct stmpe *stmpe = keypad->stmpe; -	int irq = platform_get_irq(pdev, 0); - -	stmpe_disable(stmpe, STMPE_BLOCK_KEYPAD); -	free_irq(irq, keypad); -	input_unregister_device(keypad->input); -	platform_set_drvdata(pdev, NULL); -	kfree(keypad); +	stmpe_disable(keypad->stmpe, STMPE_BLOCK_KEYPAD);  	return 0;  } @@ -364,7 +390,7 @@ static struct platform_driver stmpe_keypad_driver = {  	.driver.name	= "stmpe-keypad",  	.driver.owner	= THIS_MODULE,  	.probe		= stmpe_keypad_probe, -	.remove		= __devexit_p(stmpe_keypad_remove), +	.remove		= stmpe_keypad_remove,  };  module_platform_driver(stmpe_keypad_driver); diff --git a/drivers/input/keyboard/tc3589x-keypad.c b/drivers/input/keyboard/tc3589x-keypad.c index 7d498e69850..2fb0d76a04c 100644 --- a/drivers/input/keyboard/tc3589x-keypad.c +++ b/drivers/input/keyboard/tc3589x-keypad.c @@ -299,7 +299,7 @@ static void tc3589x_keypad_close(struct input_dev *input)  	tc3589x_keypad_disable(keypad);  } -static int __devinit tc3589x_keypad_probe(struct platform_device *pdev) +static int tc3589x_keypad_probe(struct platform_device *pdev)  {  	struct tc3589x *tc3589x = dev_get_drvdata(pdev->dev.parent);  	struct tc_keypad *keypad; @@ -382,7 +382,7 @@ err_free_mem:  	return error;  } -static int __devexit tc3589x_keypad_remove(struct platform_device *pdev) +static int tc3589x_keypad_remove(struct platform_device *pdev)  {  	struct tc_keypad *keypad = platform_get_drvdata(pdev);  	int irq = platform_get_irq(pdev, 0); @@ -448,7 +448,7 @@ static struct platform_driver tc3589x_keypad_driver = {  		.pm	= &tc3589x_keypad_dev_pm_ops,  	},  	.probe	= tc3589x_keypad_probe, -	.remove	= __devexit_p(tc3589x_keypad_remove), +	.remove	= tc3589x_keypad_remove,  };  module_platform_driver(tc3589x_keypad_driver); diff --git a/drivers/input/keyboard/tca6416-keypad.c b/drivers/input/keyboard/tca6416-keypad.c index c355cdde8d2..bfc832c35a7 100644 --- a/drivers/input/keyboard/tca6416-keypad.c +++ b/drivers/input/keyboard/tca6416-keypad.c @@ -166,7 +166,7 @@ static void tca6416_keys_close(struct input_dev *dev)  		disable_irq(chip->irqnum);  } -static int __devinit tca6416_setup_registers(struct tca6416_keypad_chip *chip) +static int tca6416_setup_registers(struct tca6416_keypad_chip *chip)  {  	int error; @@ -197,7 +197,7 @@ static int __devinit tca6416_setup_registers(struct tca6416_keypad_chip *chip)  	return 0;  } -static int __devinit tca6416_keypad_probe(struct i2c_client *client, +static int tca6416_keypad_probe(struct i2c_client *client,  				   const struct i2c_device_id *id)  {  	struct tca6416_keys_platform_data *pdata; @@ -313,7 +313,7 @@ fail1:  	return error;  } -static int __devexit tca6416_keypad_remove(struct i2c_client *client) +static int tca6416_keypad_remove(struct i2c_client *client)  {  	struct tca6416_keypad_chip *chip = i2c_get_clientdata(client); @@ -361,7 +361,7 @@ static struct i2c_driver tca6416_keypad_driver = {  		.pm	= &tca6416_keypad_dev_pm_ops,  	},  	.probe		= tca6416_keypad_probe, -	.remove		= __devexit_p(tca6416_keypad_remove), +	.remove		= tca6416_keypad_remove,  	.id_table	= tca6416_id,  }; diff --git a/drivers/input/keyboard/tca8418_keypad.c b/drivers/input/keyboard/tca8418_keypad.c index 893869b29ed..a34cc6714e5 100644 --- a/drivers/input/keyboard/tca8418_keypad.c +++ b/drivers/input/keyboard/tca8418_keypad.c @@ -35,6 +35,7 @@  #include <linux/i2c.h>  #include <linux/input.h>  #include <linux/input/tca8418_keypad.h> +#include <linux/of.h>  /* TCA8418 hardware limits */  #define TCA8418_MAX_ROWS	8 @@ -109,25 +110,11 @@  #define KEY_EVENT_CODE		0x7f  #define KEY_EVENT_VALUE		0x80 - -static const struct i2c_device_id tca8418_id[] = { -	{ TCA8418_NAME, 8418, }, -	{ } -}; -MODULE_DEVICE_TABLE(i2c, tca8418_id); -  struct tca8418_keypad { -	unsigned int rows; -	unsigned int cols; -	unsigned int keypad_mask; /* Mask for keypad col/rol regs */ -	unsigned int irq; -	unsigned int row_shift; -  	struct i2c_client *client;  	struct input_dev *input; -	/* Flexible array member, must be at end of struct */ -	unsigned short keymap[]; +	unsigned int row_shift;  };  /* @@ -172,6 +159,8 @@ static int tca8418_read_byte(struct tca8418_keypad *keypad_data,  static void tca8418_read_keypad(struct tca8418_keypad *keypad_data)  { +	struct input_dev *input = keypad_data->input; +	unsigned short *keymap = input->keycode;  	int error, col, row;  	u8 reg, state, code; @@ -190,9 +179,8 @@ static void tca8418_read_keypad(struct tca8418_keypad *keypad_data)  		col = (col) ? col - 1 : TCA8418_MAX_COLS - 1;  		code = MATRIX_SCAN_CODE(row, col, keypad_data->row_shift); -		input_event(keypad_data->input, EV_MSC, MSC_SCAN, code); -		input_report_key(keypad_data->input, -				keypad_data->keymap[code], state); +		input_event(input, EV_MSC, MSC_SCAN, code); +		input_report_key(input, keymap[code], state);  		/* Read for next loop */  		error = tca8418_read_byte(keypad_data, REG_KEY_EVENT_A, ®); @@ -202,7 +190,7 @@ static void tca8418_read_keypad(struct tca8418_keypad *keypad_data)  		dev_err(&keypad_data->client->dev,  			"unable to read REG_KEY_EVENT_A\n"); -	input_sync(keypad_data->input); +	input_sync(input);  }  /* @@ -218,16 +206,18 @@ static irqreturn_t tca8418_irq_handler(int irq, void *dev_id)  	if (error) {  		dev_err(&keypad_data->client->dev,  			"unable to read REG_INT_STAT\n"); -		goto exit; +		return IRQ_NONE;  	} +	if (!reg) +		return IRQ_NONE; +  	if (reg & INT_STAT_OVR_FLOW_INT)  		dev_warn(&keypad_data->client->dev, "overflow occurred\n");  	if (reg & INT_STAT_K_INT)  		tca8418_read_keypad(keypad_data); -exit:  	/* Clear all interrupts, even IRQs we didn't check (GPI, CAD, LCK) */  	reg = 0xff;  	error = tca8418_write_byte(keypad_data, REG_INT_STAT, reg); @@ -241,7 +231,8 @@ exit:  /*   * Configure the TCA8418 for keypad operation   */ -static int __devinit tca8418_configure(struct tca8418_keypad *keypad_data) +static int tca8418_configure(struct tca8418_keypad *keypad_data, +			     u32 rows, u32 cols)  {  	int reg, error; @@ -253,9 +244,8 @@ static int __devinit tca8418_configure(struct tca8418_keypad *keypad_data)  	/* Assemble a mask for row and column registers */ -	reg  =  ~(~0 << keypad_data->rows); -	reg += (~(~0 << keypad_data->cols)) << 8; -	keypad_data->keypad_mask = reg; +	reg  =  ~(~0 << rows); +	reg += (~(~0 << cols)) << 8;  	/* Set registers to keypad mode */  	error |= tca8418_write_byte(keypad_data, REG_KP_GPIO1, reg); @@ -270,145 +260,144 @@ static int __devinit tca8418_configure(struct tca8418_keypad *keypad_data)  	return error;  } -static int __devinit tca8418_keypad_probe(struct i2c_client *client, +static int tca8418_keypad_probe(struct i2c_client *client,  					  const struct i2c_device_id *id)  { +	struct device *dev = &client->dev;  	const struct tca8418_keypad_platform_data *pdata = -						client->dev.platform_data; +						dev_get_platdata(dev);  	struct tca8418_keypad *keypad_data;  	struct input_dev *input; +	const struct matrix_keymap_data *keymap_data = NULL; +	u32 rows = 0, cols = 0; +	bool rep = false; +	bool irq_is_gpio = false; +	int irq;  	int error, row_shift, max_keys;  	/* Copy the platform data */ -	if (!pdata) { -		dev_dbg(&client->dev, "no platform data\n"); -		return -EINVAL; -	} - -	if (!pdata->keymap_data) { -		dev_err(&client->dev, "no keymap data defined\n"); -		return -EINVAL; +	if (pdata) { +		if (!pdata->keymap_data) { +			dev_err(dev, "no keymap data defined\n"); +			return -EINVAL; +		} +		keymap_data = pdata->keymap_data; +		rows = pdata->rows; +		cols = pdata->cols; +		rep  = pdata->rep; +		irq_is_gpio = pdata->irq_is_gpio; +	} else { +		struct device_node *np = dev->of_node; +		of_property_read_u32(np, "keypad,num-rows", &rows); +		of_property_read_u32(np, "keypad,num-columns", &cols); +		rep = of_property_read_bool(np, "keypad,autorepeat");  	} -	if (!pdata->rows || pdata->rows > TCA8418_MAX_ROWS) { -		dev_err(&client->dev, "invalid rows\n"); +	if (!rows || rows > TCA8418_MAX_ROWS) { +		dev_err(dev, "invalid rows\n");  		return -EINVAL;  	} -	if (!pdata->cols || pdata->cols > TCA8418_MAX_COLS) { -		dev_err(&client->dev, "invalid columns\n"); +	if (!cols || cols > TCA8418_MAX_COLS) { +		dev_err(dev, "invalid columns\n");  		return -EINVAL;  	}  	/* Check i2c driver capabilities */  	if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE)) { -		dev_err(&client->dev, "%s adapter not supported\n", +		dev_err(dev, "%s adapter not supported\n",  			dev_driver_string(&client->adapter->dev));  		return -ENODEV;  	} -	row_shift = get_count_order(pdata->cols); -	max_keys = pdata->rows << row_shift; +	row_shift = get_count_order(cols); +	max_keys = rows << row_shift; -	/* Allocate memory for keypad_data, keymap and input device */ -	keypad_data = kzalloc(sizeof(*keypad_data) + -			max_keys * sizeof(keypad_data->keymap[0]), GFP_KERNEL); +	/* Allocate memory for keypad_data and input device */ +	keypad_data = devm_kzalloc(dev, sizeof(*keypad_data), GFP_KERNEL);  	if (!keypad_data)  		return -ENOMEM; -	keypad_data->rows = pdata->rows; -	keypad_data->cols = pdata->cols;  	keypad_data->client = client;  	keypad_data->row_shift = row_shift;  	/* Initialize the chip or fail if chip isn't present */ -	error = tca8418_configure(keypad_data); +	error = tca8418_configure(keypad_data, rows, cols);  	if (error < 0) -		goto fail1; +		return error;  	/* Configure input device */ -	input = input_allocate_device(); -	if (!input) { -		error = -ENOMEM; -		goto fail1; -	} +	input = devm_input_allocate_device(dev); +	if (!input) +		return -ENOMEM; +  	keypad_data->input = input;  	input->name = client->name; -	input->dev.parent = &client->dev; -  	input->id.bustype = BUS_I2C;  	input->id.vendor  = 0x0001;  	input->id.product = 0x001;  	input->id.version = 0x0001; -	error = matrix_keypad_build_keymap(pdata->keymap_data, NULL, -					   pdata->rows, pdata->cols, -					   keypad_data->keymap, input); +	error = matrix_keypad_build_keymap(keymap_data, NULL, rows, cols, +					   NULL, input);  	if (error) { -		dev_dbg(&client->dev, "Failed to build keymap\n"); -		goto fail2; +		dev_err(dev, "Failed to build keymap\n"); +		return error;  	} -	if (pdata->rep) +	if (rep)  		__set_bit(EV_REP, input->evbit);  	input_set_capability(input, EV_MSC, MSC_SCAN);  	input_set_drvdata(input, keypad_data); -	if (pdata->irq_is_gpio) -		client->irq = gpio_to_irq(client->irq); +	irq = client->irq; +	if (irq_is_gpio) +		irq = gpio_to_irq(irq); -	error = request_threaded_irq(client->irq, NULL, tca8418_irq_handler, -				     IRQF_TRIGGER_FALLING | IRQF_ONESHOT, -				     client->name, keypad_data); +	error = devm_request_threaded_irq(dev, irq, NULL, tca8418_irq_handler, +					  IRQF_TRIGGER_FALLING | +						IRQF_SHARED | +						IRQF_ONESHOT, +					  client->name, keypad_data);  	if (error) { -		dev_dbg(&client->dev, -			"Unable to claim irq %d; error %d\n", +		dev_err(dev, "Unable to claim irq %d; error %d\n",  			client->irq, error); -		goto fail2; +		return error;  	}  	error = input_register_device(input);  	if (error) { -		dev_dbg(&client->dev, -			"Unable to register input device, error: %d\n", error); -		goto fail3; +		dev_err(dev, "Unable to register input device, error: %d\n", +			error); +		return error;  	} -	i2c_set_clientdata(client, keypad_data);  	return 0; - -fail3: -	free_irq(client->irq, keypad_data); -fail2: -	input_free_device(input); -fail1: -	kfree(keypad_data); -	return error;  } -static int __devexit tca8418_keypad_remove(struct i2c_client *client) -{ -	struct tca8418_keypad *keypad_data = i2c_get_clientdata(client); - -	free_irq(keypad_data->client->irq, keypad_data); - -	input_unregister_device(keypad_data->input); - -	kfree(keypad_data); - -	return 0; -} +static const struct i2c_device_id tca8418_id[] = { +	{ TCA8418_NAME, 8418, }, +	{ } +}; +MODULE_DEVICE_TABLE(i2c, tca8418_id); +#ifdef CONFIG_OF +static const struct of_device_id tca8418_dt_ids[] = { +	{ .compatible = "ti,tca8418", }, +	{ } +}; +MODULE_DEVICE_TABLE(of, tca8418_dt_ids); +#endif  static struct i2c_driver tca8418_keypad_driver = {  	.driver = {  		.name	= TCA8418_NAME,  		.owner	= THIS_MODULE, +		.of_match_table = of_match_ptr(tca8418_dt_ids),  	},  	.probe		= tca8418_keypad_probe, -	.remove		= __devexit_p(tca8418_keypad_remove),  	.id_table	= tca8418_id,  }; diff --git a/drivers/input/keyboard/tegra-kbc.c b/drivers/input/keyboard/tegra-kbc.c index 5faaf2553e3..c76f96872d3 100644 --- a/drivers/input/keyboard/tegra-kbc.c +++ b/drivers/input/keyboard/tegra-kbc.c @@ -87,7 +87,7 @@ struct tegra_kbc {  	struct clk *clk;  }; -static const u32 tegra_kbc_default_keymap[] __devinitdata = { +static const u32 tegra_kbc_default_keymap[] = {  	KEY(0, 2, KEY_W),  	KEY(0, 3, KEY_S),  	KEY(0, 4, KEY_A), @@ -223,7 +223,7 @@ static const u32 tegra_kbc_default_keymap[] __devinitdata = {  };  static const -struct matrix_keymap_data tegra_kbc_default_keymap_data __devinitdata = { +struct matrix_keymap_data tegra_kbc_default_keymap_data = {  	.keymap		= tegra_kbc_default_keymap,  	.keymap_size	= ARRAY_SIZE(tegra_kbc_default_keymap),  }; @@ -573,7 +573,7 @@ static void tegra_kbc_close(struct input_dev *dev)  	return tegra_kbc_stop(kbc);  } -static bool __devinit +static bool  tegra_kbc_check_pin_cfg(const struct tegra_kbc_platform_data *pdata,  			struct device *dev, unsigned int *num_rows)  { @@ -619,7 +619,7 @@ tegra_kbc_check_pin_cfg(const struct tegra_kbc_platform_data *pdata,  }  #ifdef CONFIG_OF -static struct tegra_kbc_platform_data * __devinit tegra_kbc_dt_parse_pdata( +static struct tegra_kbc_platform_data *tegra_kbc_dt_parse_pdata(  	struct platform_device *pdev)  {  	struct tegra_kbc_platform_data *pdata; @@ -670,7 +670,7 @@ static inline struct tegra_kbc_platform_data *tegra_kbc_dt_parse_pdata(  }  #endif -static int __devinit tegra_kbd_setup_keymap(struct tegra_kbc *kbc) +static int tegra_kbd_setup_keymap(struct tegra_kbc *kbc)  {  	const struct tegra_kbc_platform_data *pdata = kbc->pdata;  	const struct matrix_keymap_data *keymap_data = pdata->keymap_data; @@ -697,7 +697,7 @@ static int __devinit tegra_kbd_setup_keymap(struct tegra_kbc *kbc)  	return retval;  } -static int __devinit tegra_kbc_probe(struct platform_device *pdev) +static int tegra_kbc_probe(struct platform_device *pdev)  {  	const struct tegra_kbc_platform_data *pdata = pdev->dev.platform_data;  	struct tegra_kbc *kbc; @@ -838,7 +838,7 @@ err_free_pdata:  	return err;  } -static int __devexit tegra_kbc_remove(struct platform_device *pdev) +static int tegra_kbc_remove(struct platform_device *pdev)  {  	struct tegra_kbc *kbc = platform_get_drvdata(pdev);  	struct resource *res; @@ -954,7 +954,7 @@ MODULE_DEVICE_TABLE(of, tegra_kbc_of_match);  static struct platform_driver tegra_kbc_driver = {  	.probe		= tegra_kbc_probe, -	.remove		= __devexit_p(tegra_kbc_remove), +	.remove		= tegra_kbc_remove,  	.driver	= {  		.name	= "tegra-kbc",  		.owner  = THIS_MODULE, diff --git a/drivers/input/keyboard/tnetv107x-keypad.c b/drivers/input/keyboard/tnetv107x-keypad.c index 4c34f21fbe2..ee163501129 100644 --- a/drivers/input/keyboard/tnetv107x-keypad.c +++ b/drivers/input/keyboard/tnetv107x-keypad.c @@ -153,7 +153,7 @@ static void keypad_stop(struct input_dev *dev)  	clk_disable(kp->clk);  } -static int __devinit keypad_probe(struct platform_device *pdev) +static int keypad_probe(struct platform_device *pdev)  {  	const struct matrix_keypad_platform_data *pdata;  	const struct matrix_keymap_data *keymap_data; @@ -301,7 +301,7 @@ error_res:  	return error;  } -static int __devexit keypad_remove(struct platform_device *pdev) +static int keypad_remove(struct platform_device *pdev)  {  	struct keypad_data *kp = platform_get_drvdata(pdev); @@ -319,7 +319,7 @@ static int __devexit keypad_remove(struct platform_device *pdev)  static struct platform_driver keypad_driver = {  	.probe		= keypad_probe, -	.remove		= __devexit_p(keypad_remove), +	.remove		= keypad_remove,  	.driver.name	= "tnetv107x-keypad",  	.driver.owner	= THIS_MODULE,  }; diff --git a/drivers/input/keyboard/twl4030_keypad.c b/drivers/input/keyboard/twl4030_keypad.c index a2c6f79aa10..04f84fd5717 100644 --- a/drivers/input/keyboard/twl4030_keypad.c +++ b/drivers/input/keyboard/twl4030_keypad.c @@ -271,7 +271,7 @@ static irqreturn_t do_kp_irq(int irq, void *_kp)  	return IRQ_HANDLED;  } -static int __devinit twl4030_kp_program(struct twl4030_keypad *kp) +static int twl4030_kp_program(struct twl4030_keypad *kp)  {  	u8 reg;  	int i; @@ -328,7 +328,7 @@ static int __devinit twl4030_kp_program(struct twl4030_keypad *kp)   * Registers keypad device with input subsystem   * and configures TWL4030 keypad registers   */ -static int __devinit twl4030_kp_probe(struct platform_device *pdev) +static int twl4030_kp_probe(struct platform_device *pdev)  {  	struct twl4030_keypad_data *pdata = pdev->dev.platform_data;  	const struct matrix_keymap_data *keymap_data; @@ -432,7 +432,7 @@ err1:  	return error;  } -static int __devexit twl4030_kp_remove(struct platform_device *pdev) +static int twl4030_kp_remove(struct platform_device *pdev)  {  	struct twl4030_keypad *kp = platform_get_drvdata(pdev); @@ -452,7 +452,7 @@ static int __devexit twl4030_kp_remove(struct platform_device *pdev)  static struct platform_driver twl4030_kp_driver = {  	.probe		= twl4030_kp_probe, -	.remove		= __devexit_p(twl4030_kp_remove), +	.remove		= twl4030_kp_remove,  	.driver		= {  		.name	= "twl4030_keypad",  		.owner	= THIS_MODULE, diff --git a/drivers/input/keyboard/w90p910_keypad.c b/drivers/input/keyboard/w90p910_keypad.c index e0f6cd1ad0f..ee163bee8cc 100644 --- a/drivers/input/keyboard/w90p910_keypad.c +++ b/drivers/input/keyboard/w90p910_keypad.c @@ -118,7 +118,7 @@ static void w90p910_keypad_close(struct input_dev *dev)  	clk_disable(keypad->clk);  } -static int __devinit w90p910_keypad_probe(struct platform_device *pdev) +static int w90p910_keypad_probe(struct platform_device *pdev)  {  	const struct w90p910_keypad_platform_data *pdata =  						pdev->dev.platform_data; @@ -234,7 +234,7 @@ failed_free:  	return error;  } -static int __devexit w90p910_keypad_remove(struct platform_device *pdev) +static int w90p910_keypad_remove(struct platform_device *pdev)  {  	struct w90p910_keypad *keypad = platform_get_drvdata(pdev);  	struct resource *res; @@ -257,7 +257,7 @@ static int __devexit w90p910_keypad_remove(struct platform_device *pdev)  static struct platform_driver w90p910_keypad_driver = {  	.probe		= w90p910_keypad_probe, -	.remove		= __devexit_p(w90p910_keypad_remove), +	.remove		= w90p910_keypad_remove,  	.driver		= {  		.name	= "nuc900-kpi",  		.owner	= THIS_MODULE, diff --git a/drivers/input/matrix-keymap.c b/drivers/input/matrix-keymap.c index d88d9be1d1b..3ae496ea5fe 100644 --- a/drivers/input/matrix-keymap.c +++ b/drivers/input/matrix-keymap.c @@ -18,6 +18,7 @@   */  #include <linux/device.h> +#include <linux/gfp.h>  #include <linux/kernel.h>  #include <linux/types.h>  #include <linux/input.h> @@ -123,6 +124,11 @@ static int matrix_keypad_parse_of_keymap(const char *propname,   * it will attempt load the keymap from property specified by @keymap_name   * argument (or "linux,keymap" if @keymap_name is %NULL).   * + * If @keymap is %NULL the function will automatically allocate managed + * block of memory to store the keymap. This memory will be associated with + * the parent device and automatically freed when device unbinds from the + * driver. + *   * Callers are expected to set up input_dev->dev.parent before calling this   * function.   */ @@ -133,12 +139,27 @@ int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data,  			       struct input_dev *input_dev)  {  	unsigned int row_shift = get_count_order(cols); +	size_t max_keys = rows << row_shift;  	int i;  	int error; +	if (WARN_ON(!input_dev->dev.parent)) +		return -EINVAL; + +	if (!keymap) { +		keymap = devm_kzalloc(input_dev->dev.parent, +				      max_keys * sizeof(*keymap), +				      GFP_KERNEL); +		if (!keymap) { +			dev_err(input_dev->dev.parent, +				"Unable to allocate memory for keymap"); +			return -ENOMEM; +		} +	} +  	input_dev->keycode = keymap;  	input_dev->keycodesize = sizeof(*keymap); -	input_dev->keycodemax = rows << row_shift; +	input_dev->keycodemax = max_keys;  	__set_bit(EV_KEY, input_dev->evbit); diff --git a/drivers/input/misc/88pm80x_onkey.c b/drivers/input/misc/88pm80x_onkey.c index 7f26e7b6c22..ee43e5b7c88 100644 --- a/drivers/input/misc/88pm80x_onkey.c +++ b/drivers/input/misc/88pm80x_onkey.c @@ -62,7 +62,7 @@ static irqreturn_t pm80x_onkey_handler(int irq, void *data)  static SIMPLE_DEV_PM_OPS(pm80x_onkey_pm_ops, pm80x_dev_suspend,  			 pm80x_dev_resume); -static int __devinit pm80x_onkey_probe(struct platform_device *pdev) +static int pm80x_onkey_probe(struct platform_device *pdev)  {  	struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent); @@ -139,7 +139,7 @@ out:  	return err;  } -static int __devexit pm80x_onkey_remove(struct platform_device *pdev) +static int pm80x_onkey_remove(struct platform_device *pdev)  {  	struct pm80x_onkey_info *info = platform_get_drvdata(pdev); @@ -157,7 +157,7 @@ static struct platform_driver pm80x_onkey_driver = {  		   .pm = &pm80x_onkey_pm_ops,  		   },  	.probe = pm80x_onkey_probe, -	.remove = __devexit_p(pm80x_onkey_remove), +	.remove = pm80x_onkey_remove,  };  module_platform_driver(pm80x_onkey_driver); diff --git a/drivers/input/misc/88pm860x_onkey.c b/drivers/input/misc/88pm860x_onkey.c index f9ce1835e4d..abd8453e521 100644 --- a/drivers/input/misc/88pm860x_onkey.c +++ b/drivers/input/misc/88pm860x_onkey.c @@ -56,7 +56,7 @@ static irqreturn_t pm860x_onkey_handler(int irq, void *data)  	return IRQ_HANDLED;  } -static int __devinit pm860x_onkey_probe(struct platform_device *pdev) +static int pm860x_onkey_probe(struct platform_device *pdev)  {  	struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent);  	struct pm860x_onkey_info *info; @@ -121,7 +121,7 @@ out:  	return ret;  } -static int __devexit pm860x_onkey_remove(struct platform_device *pdev) +static int pm860x_onkey_remove(struct platform_device *pdev)  {  	struct pm860x_onkey_info *info = platform_get_drvdata(pdev); @@ -161,7 +161,7 @@ static struct platform_driver pm860x_onkey_driver = {  		.pm	= &pm860x_onkey_pm_ops,  	},  	.probe		= pm860x_onkey_probe, -	.remove		= __devexit_p(pm860x_onkey_remove), +	.remove		= pm860x_onkey_remove,  };  module_platform_driver(pm860x_onkey_driver); diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig index 104a7c3153c..259ef31abb1 100644 --- a/drivers/input/misc/Kconfig +++ b/drivers/input/misc/Kconfig @@ -300,8 +300,7 @@ config INPUT_ATI_REMOTE2  	  called ati_remote2.  config INPUT_KEYSPAN_REMOTE -	tristate "Keyspan DMR USB remote control (EXPERIMENTAL)" -	depends on EXPERIMENTAL +	tristate "Keyspan DMR USB remote control"  	depends on USB_ARCH_HAS_HCD  	select USB  	help @@ -350,7 +349,6 @@ config INPUT_POWERMATE  config INPUT_YEALINK  	tristate "Yealink usb-p1k voip phone" -	depends on EXPERIMENTAL  	depends on USB_ARCH_HAS_HCD  	select USB  	help @@ -366,7 +364,6 @@ config INPUT_YEALINK  config INPUT_CM109  	tristate "C-Media CM109 USB I/O Controller" -	depends on EXPERIMENTAL  	depends on USB_ARCH_HAS_HCD  	select USB  	help @@ -377,6 +374,16 @@ config INPUT_CM109  	  To compile this driver as a module, choose M here: the module will be  	  called cm109. +config INPUT_RETU_PWRBUTTON +	tristate "Retu Power button Driver" +	depends on MFD_RETU +	help +	  Say Y here if you want to enable power key reporting via the +	  Retu chips found in Nokia Internet Tablets (770, N800, N810). + +	  To compile this driver as a module, choose M here. The module will +	  be called retu-pwrbutton. +  config INPUT_TWL4030_PWRBUTTON  	tristate "TWL4030 Power button Driver"  	depends on TWL4030_CORE @@ -444,7 +451,7 @@ config INPUT_PCF50633_PMU  config INPUT_PCF8574  	tristate "PCF8574 Keypad input device" -	depends on I2C && EXPERIMENTAL +	depends on I2C  	help  	  Say Y here if you want to support a keypad connected via I2C  	  with a PCF8574. @@ -454,7 +461,7 @@ config INPUT_PCF8574  config INPUT_PWM_BEEPER  	tristate "PWM beeper support" -	depends on HAVE_PWM +	depends on HAVE_PWM || PWM  	help  	  Say Y here to get support for PWM based beeper devices. @@ -496,6 +503,16 @@ config INPUT_DA9052_ONKEY  	  To compile this driver as a module, choose M here: the  	  module will be called da9052_onkey. +config INPUT_DA9055_ONKEY +	tristate "Dialog Semiconductor DA9055 ONKEY" +	depends on MFD_DA9055 +	help +	  Support the ONKEY of DA9055 PMICs as an input device +	  reporting power button status. + +	  To compile this driver as a module, choose M here: the module +	  will be called da9055_onkey. +  config INPUT_DM355EVM  	tristate "TI DaVinci DM355 EVM Keypad and IR Remote"  	depends on MFD_DM355EVM_MSP diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile index 5ea769eda99..1f1e1b109d9 100644 --- a/drivers/input/misc/Makefile +++ b/drivers/input/misc/Makefile @@ -24,6 +24,7 @@ obj-$(CONFIG_INPUT_CMA3000)		+= cma3000_d0x.o  obj-$(CONFIG_INPUT_CMA3000_I2C)		+= cma3000_d0x_i2c.o  obj-$(CONFIG_INPUT_COBALT_BTNS)		+= cobalt_btns.o  obj-$(CONFIG_INPUT_DA9052_ONKEY)	+= da9052_onkey.o +obj-$(CONFIG_INPUT_DA9055_ONKEY)	+= da9055_onkey.o  obj-$(CONFIG_INPUT_DM355EVM)		+= dm355evm_keys.o  obj-$(CONFIG_INPUT_GP2A)		+= gp2ap002a00f.o  obj-$(CONFIG_INPUT_GPIO_TILT_POLLED)	+= gpio_tilt_polled.o @@ -46,6 +47,7 @@ obj-$(CONFIG_INPUT_PMIC8XXX_PWRKEY)	+= pmic8xxx-pwrkey.o  obj-$(CONFIG_INPUT_POWERMATE)		+= powermate.o  obj-$(CONFIG_INPUT_PWM_BEEPER)		+= pwm-beeper.o  obj-$(CONFIG_INPUT_RB532_BUTTON)	+= rb532_button.o +obj-$(CONFIG_INPUT_RETU_PWRBUTTON)	+= retu-pwrbutton.o  obj-$(CONFIG_INPUT_GPIO_ROTARY_ENCODER)	+= rotary_encoder.o  obj-$(CONFIG_INPUT_SGI_BTNS)		+= sgi_btns.o  obj-$(CONFIG_INPUT_SPARCSPKR)		+= sparcspkr.o diff --git a/drivers/input/misc/ab8500-ponkey.c b/drivers/input/misc/ab8500-ponkey.c index 84ec691c05a..2f090b46e71 100644 --- a/drivers/input/misc/ab8500-ponkey.c +++ b/drivers/input/misc/ab8500-ponkey.c @@ -45,7 +45,7 @@ static irqreturn_t ab8500_ponkey_handler(int irq, void *data)  	return IRQ_HANDLED;  } -static int __devinit ab8500_ponkey_probe(struct platform_device *pdev) +static int ab8500_ponkey_probe(struct platform_device *pdev)  {  	struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);  	struct ab8500_ponkey *ponkey; @@ -118,7 +118,7 @@ err_free_mem:  	return error;  } -static int __devexit ab8500_ponkey_remove(struct platform_device *pdev) +static int ab8500_ponkey_remove(struct platform_device *pdev)  {  	struct ab8500_ponkey *ponkey = platform_get_drvdata(pdev); @@ -146,7 +146,7 @@ static struct platform_driver ab8500_ponkey_driver = {  		.of_match_table = of_match_ptr(ab8500_ponkey_match),  	},  	.probe		= ab8500_ponkey_probe, -	.remove		= __devexit_p(ab8500_ponkey_remove), +	.remove		= ab8500_ponkey_remove,  };  module_platform_driver(ab8500_ponkey_driver); diff --git a/drivers/input/misc/ad714x-i2c.c b/drivers/input/misc/ad714x-i2c.c index c8a79015472..29d2064c26f 100644 --- a/drivers/input/misc/ad714x-i2c.c +++ b/drivers/input/misc/ad714x-i2c.c @@ -72,7 +72,7 @@ static int ad714x_i2c_read(struct ad714x_chip *chip,  	return 0;  } -static int __devinit ad714x_i2c_probe(struct i2c_client *client, +static int ad714x_i2c_probe(struct i2c_client *client,  					const struct i2c_device_id *id)  {  	struct ad714x_chip *chip; @@ -87,7 +87,7 @@ static int __devinit ad714x_i2c_probe(struct i2c_client *client,  	return 0;  } -static int __devexit ad714x_i2c_remove(struct i2c_client *client) +static int ad714x_i2c_remove(struct i2c_client *client)  {  	struct ad714x_chip *chip = i2c_get_clientdata(client); @@ -112,7 +112,7 @@ static struct i2c_driver ad714x_i2c_driver = {  		.pm   = &ad714x_i2c_pm,  	},  	.probe    = ad714x_i2c_probe, -	.remove   = __devexit_p(ad714x_i2c_remove), +	.remove   = ad714x_i2c_remove,  	.id_table = ad714x_id,  }; diff --git a/drivers/input/misc/ad714x-spi.c b/drivers/input/misc/ad714x-spi.c index 75f6136d608..bdccca42d13 100644 --- a/drivers/input/misc/ad714x-spi.c +++ b/drivers/input/misc/ad714x-spi.c @@ -83,7 +83,7 @@ static int ad714x_spi_write(struct ad714x_chip *chip,  	return 0;  } -static int __devinit ad714x_spi_probe(struct spi_device *spi) +static int ad714x_spi_probe(struct spi_device *spi)  {  	struct ad714x_chip *chip;  	int err; @@ -103,7 +103,7 @@ static int __devinit ad714x_spi_probe(struct spi_device *spi)  	return 0;  } -static int __devexit ad714x_spi_remove(struct spi_device *spi) +static int ad714x_spi_remove(struct spi_device *spi)  {  	struct ad714x_chip *chip = spi_get_drvdata(spi); @@ -120,7 +120,7 @@ static struct spi_driver ad714x_spi_driver = {  		.pm	= &ad714x_spi_pm,  	},  	.probe		= ad714x_spi_probe, -	.remove		= __devexit_p(ad714x_spi_remove), +	.remove		= ad714x_spi_remove,  };  module_spi_driver(ad714x_spi_driver); diff --git a/drivers/input/misc/adxl34x-i2c.c b/drivers/input/misc/adxl34x-i2c.c index dd1d1c145a7..535dda48cac 100644 --- a/drivers/input/misc/adxl34x-i2c.c +++ b/drivers/input/misc/adxl34x-i2c.c @@ -73,7 +73,7 @@ static const struct adxl34x_bus_ops adxl34x_i2c_bops = {  	.read_block	= adxl34x_i2c_read_block,  }; -static int __devinit adxl34x_i2c_probe(struct i2c_client *client, +static int adxl34x_i2c_probe(struct i2c_client *client,  				       const struct i2c_device_id *id)  {  	struct adxl34x *ac; @@ -98,7 +98,7 @@ static int __devinit adxl34x_i2c_probe(struct i2c_client *client,  	return 0;  } -static int __devexit adxl34x_i2c_remove(struct i2c_client *client) +static int adxl34x_i2c_remove(struct i2c_client *client)  {  	struct adxl34x *ac = i2c_get_clientdata(client); @@ -144,7 +144,7 @@ static struct i2c_driver adxl34x_driver = {  		.pm = &adxl34x_i2c_pm,  	},  	.probe    = adxl34x_i2c_probe, -	.remove   = __devexit_p(adxl34x_i2c_remove), +	.remove   = adxl34x_i2c_remove,  	.id_table = adxl34x_id,  }; diff --git a/drivers/input/misc/adxl34x-spi.c b/drivers/input/misc/adxl34x-spi.c index 820a802a1e6..ad5f40d37e4 100644 --- a/drivers/input/misc/adxl34x-spi.c +++ b/drivers/input/misc/adxl34x-spi.c @@ -65,7 +65,7 @@ static const struct adxl34x_bus_ops adxl34x_spi_bops = {  	.read_block	= adxl34x_spi_read_block,  }; -static int __devinit adxl34x_spi_probe(struct spi_device *spi) +static int adxl34x_spi_probe(struct spi_device *spi)  {  	struct adxl34x *ac; @@ -87,7 +87,7 @@ static int __devinit adxl34x_spi_probe(struct spi_device *spi)  	return 0;  } -static int __devexit adxl34x_spi_remove(struct spi_device *spi) +static int adxl34x_spi_remove(struct spi_device *spi)  {  	struct adxl34x *ac = dev_get_drvdata(&spi->dev); @@ -126,7 +126,7 @@ static struct spi_driver adxl34x_driver = {  		.pm = &adxl34x_spi_pm,  	},  	.probe   = adxl34x_spi_probe, -	.remove  = __devexit_p(adxl34x_spi_remove), +	.remove  = adxl34x_spi_remove,  };  module_spi_driver(adxl34x_driver); diff --git a/drivers/input/misc/bfin_rotary.c b/drivers/input/misc/bfin_rotary.c index 1c4146fccfd..a6666e142a9 100644 --- a/drivers/input/misc/bfin_rotary.c +++ b/drivers/input/misc/bfin_rotary.c @@ -90,7 +90,7 @@ static irqreturn_t bfin_rotary_isr(int irq, void *dev_id)  	return IRQ_HANDLED;  } -static int __devinit bfin_rotary_probe(struct platform_device *pdev) +static int bfin_rotary_probe(struct platform_device *pdev)  {  	struct bfin_rotary_platform_data *pdata = pdev->dev.platform_data;  	struct bfin_rot *rotary; @@ -196,7 +196,7 @@ out1:  	return error;  } -static int __devexit bfin_rotary_remove(struct platform_device *pdev) +static int bfin_rotary_remove(struct platform_device *pdev)  {  	struct bfin_rot *rotary = platform_get_drvdata(pdev); @@ -255,7 +255,7 @@ static const struct dev_pm_ops bfin_rotary_pm_ops = {  static struct platform_driver bfin_rotary_device_driver = {  	.probe		= bfin_rotary_probe, -	.remove		= __devexit_p(bfin_rotary_remove), +	.remove		= bfin_rotary_remove,  	.driver		= {  		.name	= "bfin-rotary",  		.owner	= THIS_MODULE, diff --git a/drivers/input/misc/bma150.c b/drivers/input/misc/bma150.c index e2f1e9f952b..08ffcabd722 100644 --- a/drivers/input/misc/bma150.c +++ b/drivers/input/misc/bma150.c @@ -158,7 +158,7 @@ struct bma150_data {   * are stated and verified by Bosch Sensortec where they are configured   * to provide a generic sensitivity performance.   */ -static struct bma150_cfg default_cfg __devinitdata = { +static struct bma150_cfg default_cfg = {  	.any_motion_int = 1,  	.hg_int = 1,  	.lg_int = 1, @@ -224,7 +224,7 @@ static int bma150_set_mode(struct bma150_data *bma150, u8 mode)  	return 0;  } -static int __devinit bma150_soft_reset(struct bma150_data *bma150) +static int bma150_soft_reset(struct bma150_data *bma150)  {  	int error; @@ -237,19 +237,19 @@ static int __devinit bma150_soft_reset(struct bma150_data *bma150)  	return 0;  } -static int __devinit bma150_set_range(struct bma150_data *bma150, u8 range) +static int bma150_set_range(struct bma150_data *bma150, u8 range)  {  	return bma150_set_reg_bits(bma150->client, range, BMA150_RANGE_POS,  				BMA150_RANGE_MSK, BMA150_RANGE_REG);  } -static int __devinit bma150_set_bandwidth(struct bma150_data *bma150, u8 bw) +static int bma150_set_bandwidth(struct bma150_data *bma150, u8 bw)  {  	return bma150_set_reg_bits(bma150->client, bw, BMA150_BANDWIDTH_POS,  				BMA150_BANDWIDTH_MSK, BMA150_BANDWIDTH_REG);  } -static int __devinit bma150_set_low_g_interrupt(struct bma150_data *bma150, +static int bma150_set_low_g_interrupt(struct bma150_data *bma150,  					u8 enable, u8 hyst, u8 dur, u8 thres)  {  	int error; @@ -273,7 +273,7 @@ static int __devinit bma150_set_low_g_interrupt(struct bma150_data *bma150,  				BMA150_LOW_G_EN_REG);  } -static int __devinit bma150_set_high_g_interrupt(struct bma150_data *bma150, +static int bma150_set_high_g_interrupt(struct bma150_data *bma150,  					u8 enable, u8 hyst, u8 dur, u8 thres)  {  	int error; @@ -300,7 +300,7 @@ static int __devinit bma150_set_high_g_interrupt(struct bma150_data *bma150,  } -static int __devinit bma150_set_any_motion_interrupt(struct bma150_data *bma150, +static int bma150_set_any_motion_interrupt(struct bma150_data *bma150,  						u8 enable, u8 dur, u8 thres)  {  	int error; @@ -424,7 +424,7 @@ static void bma150_poll_close(struct input_polled_dev *ipoll_dev)  	bma150_close(bma150);  } -static int __devinit bma150_initialize(struct bma150_data *bma150, +static int bma150_initialize(struct bma150_data *bma150,  				       const struct bma150_cfg *cfg)  {  	int error; @@ -465,7 +465,7 @@ static int __devinit bma150_initialize(struct bma150_data *bma150,  	return bma150_set_mode(bma150, BMA150_MODE_SLEEP);  } -static void __devinit bma150_init_input_device(struct bma150_data *bma150, +static void bma150_init_input_device(struct bma150_data *bma150,  						struct input_dev *idev)  {  	idev->name = BMA150_DRIVER; @@ -479,7 +479,7 @@ static void __devinit bma150_init_input_device(struct bma150_data *bma150,  	input_set_abs_params(idev, ABS_Z, ABSMIN_ACC_VAL, ABSMAX_ACC_VAL, 0, 0);  } -static int __devinit bma150_register_input_device(struct bma150_data *bma150) +static int bma150_register_input_device(struct bma150_data *bma150)  {  	struct input_dev *idev;  	int error; @@ -504,7 +504,7 @@ static int __devinit bma150_register_input_device(struct bma150_data *bma150)  	return 0;  } -static int __devinit bma150_register_polled_device(struct bma150_data *bma150) +static int bma150_register_polled_device(struct bma150_data *bma150)  {  	struct input_polled_dev *ipoll_dev;  	int error; @@ -535,7 +535,7 @@ static int __devinit bma150_register_polled_device(struct bma150_data *bma150)  	return 0;  } -static int __devinit bma150_probe(struct i2c_client *client, +static int bma150_probe(struct i2c_client *client,  				  const struct i2c_device_id *id)  {  	const struct bma150_platform_data *pdata = client->dev.platform_data; @@ -613,7 +613,7 @@ err_free_mem:  	return error;  } -static int __devexit bma150_remove(struct i2c_client *client) +static int bma150_remove(struct i2c_client *client)  {  	struct bma150_data *bma150 = i2c_get_clientdata(client); @@ -670,7 +670,7 @@ static struct i2c_driver bma150_driver = {  	.class		= I2C_CLASS_HWMON,  	.id_table	= bma150_id,  	.probe		= bma150_probe, -	.remove		= __devexit_p(bma150_remove), +	.remove		= bma150_remove,  };  module_i2c_driver(bma150_driver); diff --git a/drivers/input/misc/cma3000_d0x_i2c.c b/drivers/input/misc/cma3000_d0x_i2c.c index fe9b85f0779..4fdef98ceb5 100644 --- a/drivers/input/misc/cma3000_d0x_i2c.c +++ b/drivers/input/misc/cma3000_d0x_i2c.c @@ -55,7 +55,7 @@ static const struct cma3000_bus_ops cma3000_i2c_bops = {  	.write		= cma3000_i2c_set,  }; -static int __devinit cma3000_i2c_probe(struct i2c_client *client, +static int cma3000_i2c_probe(struct i2c_client *client,  					const struct i2c_device_id *id)  {  	struct cma3000_accl_data *data; @@ -69,7 +69,7 @@ static int __devinit cma3000_i2c_probe(struct i2c_client *client,  	return 0;  } -static int __devexit cma3000_i2c_remove(struct i2c_client *client) +static int cma3000_i2c_remove(struct i2c_client *client)  {  	struct cma3000_accl_data *data = i2c_get_clientdata(client); @@ -114,7 +114,7 @@ MODULE_DEVICE_TABLE(i2c, cma3000_i2c_id);  static struct i2c_driver cma3000_i2c_driver = {  	.probe		= cma3000_i2c_probe, -	.remove		= __devexit_p(cma3000_i2c_remove), +	.remove		= cma3000_i2c_remove,  	.id_table	= cma3000_i2c_id,  	.driver = {  		.name	= "cma3000_i2c_accl", diff --git a/drivers/input/misc/cobalt_btns.c b/drivers/input/misc/cobalt_btns.c index 53e43d29514..4f77f87847e 100644 --- a/drivers/input/misc/cobalt_btns.c +++ b/drivers/input/misc/cobalt_btns.c @@ -73,7 +73,7 @@ static void handle_buttons(struct input_polled_dev *dev)  	}  } -static int __devinit cobalt_buttons_probe(struct platform_device *pdev) +static int cobalt_buttons_probe(struct platform_device *pdev)  {  	struct buttons_dev *bdev;  	struct input_polled_dev *poll_dev; @@ -135,7 +135,7 @@ static int __devinit cobalt_buttons_probe(struct platform_device *pdev)  	return error;  } -static int __devexit cobalt_buttons_remove(struct platform_device *pdev) +static int cobalt_buttons_remove(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	struct buttons_dev *bdev = dev_get_drvdata(dev); @@ -157,7 +157,7 @@ MODULE_ALIAS("platform:Cobalt buttons");  static struct platform_driver cobalt_buttons_driver = {  	.probe	= cobalt_buttons_probe, -	.remove	= __devexit_p(cobalt_buttons_remove), +	.remove	= cobalt_buttons_remove,  	.driver	= {  		.name	= "Cobalt buttons",  		.owner	= THIS_MODULE, diff --git a/drivers/input/misc/da9052_onkey.c b/drivers/input/misc/da9052_onkey.c index 3be3acc3a6e..020569a499f 100644 --- a/drivers/input/misc/da9052_onkey.c +++ b/drivers/input/misc/da9052_onkey.c @@ -70,7 +70,7 @@ static irqreturn_t da9052_onkey_irq(int irq, void *data)  	return IRQ_HANDLED;  } -static int __devinit da9052_onkey_probe(struct platform_device *pdev) +static int da9052_onkey_probe(struct platform_device *pdev)  {  	struct da9052 *da9052 = dev_get_drvdata(pdev->dev.parent);  	struct da9052_onkey *onkey; @@ -129,7 +129,7 @@ err_free_mem:  	return error;  } -static int __devexit da9052_onkey_remove(struct platform_device *pdev) +static int da9052_onkey_remove(struct platform_device *pdev)  {  	struct da9052_onkey *onkey = platform_get_drvdata(pdev); @@ -144,7 +144,7 @@ static int __devexit da9052_onkey_remove(struct platform_device *pdev)  static struct platform_driver da9052_onkey_driver = {  	.probe	= da9052_onkey_probe, -	.remove	= __devexit_p(da9052_onkey_remove), +	.remove	= da9052_onkey_remove,  	.driver = {  		.name	= "da9052-onkey",  		.owner	= THIS_MODULE, diff --git a/drivers/input/misc/da9055_onkey.c b/drivers/input/misc/da9055_onkey.c new file mode 100644 index 00000000000..ee6ae3a0017 --- /dev/null +++ b/drivers/input/misc/da9055_onkey.c @@ -0,0 +1,171 @@ +/* + * ON pin driver for Dialog DA9055 PMICs + * + * Copyright(c) 2012 Dialog Semiconductor Ltd. + * + * Author: David Dajun Chen <dchen@diasemi.com> + * + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version. + */ + +#include <linux/init.h> +#include <linux/input.h> +#include <linux/module.h> +#include <linux/platform_device.h> + +#include <linux/mfd/da9055/core.h> +#include <linux/mfd/da9055/reg.h> + +struct da9055_onkey { +	struct da9055 *da9055; +	struct input_dev *input; +	struct delayed_work work; +}; + +static void da9055_onkey_query(struct da9055_onkey *onkey) +{ +	int key_stat; + +	key_stat = da9055_reg_read(onkey->da9055, DA9055_REG_STATUS_A); +	if (key_stat < 0) { +		dev_err(onkey->da9055->dev, +			"Failed to read onkey event %d\n", key_stat); +	} else { +		key_stat &= DA9055_NOKEY_STS; +		/* +		 * Onkey status bit is cleared when onkey button is relased. +		 */ +		if (!key_stat) { +			input_report_key(onkey->input, KEY_POWER, 0); +			input_sync(onkey->input); +		} +	} + +	/* +	 * Interrupt is generated only when the ONKEY pin is asserted. +	 * Hence the deassertion of the pin is simulated through work queue. +	 */ +	if (key_stat) +		schedule_delayed_work(&onkey->work, msecs_to_jiffies(10)); + +} + +static void da9055_onkey_work(struct work_struct *work) +{ +	struct da9055_onkey *onkey = container_of(work, struct da9055_onkey, +						  work.work); + +	da9055_onkey_query(onkey); +} + +static irqreturn_t da9055_onkey_irq(int irq, void *data) +{ +	struct da9055_onkey *onkey = data; + +	input_report_key(onkey->input, KEY_POWER, 1); +	input_sync(onkey->input); + +	da9055_onkey_query(onkey); + +	return IRQ_HANDLED; +} + +static int da9055_onkey_probe(struct platform_device *pdev) +{ +	struct da9055 *da9055 = dev_get_drvdata(pdev->dev.parent); +	struct da9055_onkey *onkey; +	struct input_dev *input_dev; +	int irq, err; + +	irq = platform_get_irq_byname(pdev, "ONKEY"); +	if (irq < 0) { +		dev_err(&pdev->dev, +			"Failed to get an IRQ for input device, %d\n", irq); +		return -EINVAL; +	} + +	onkey = devm_kzalloc(&pdev->dev, sizeof(*onkey), GFP_KERNEL); +	if (!onkey) { +		dev_err(&pdev->dev, "Failed to allocate memory\n"); +		return -ENOMEM; +	} + +	input_dev = input_allocate_device(); +	if (!input_dev) { +		dev_err(&pdev->dev, "Failed to allocate memory\n"); +		return -ENOMEM; +	} + +	onkey->input = input_dev; +	onkey->da9055 = da9055; +	input_dev->name = "da9055-onkey"; +	input_dev->phys = "da9055-onkey/input0"; +	input_dev->dev.parent = &pdev->dev; + +	input_dev->evbit[0] = BIT_MASK(EV_KEY); +	__set_bit(KEY_POWER, input_dev->keybit); + +	INIT_DELAYED_WORK(&onkey->work, da9055_onkey_work); + +	irq = regmap_irq_get_virq(da9055->irq_data, irq); +	err = request_threaded_irq(irq, NULL, da9055_onkey_irq, +				   IRQF_TRIGGER_HIGH | IRQF_ONESHOT, +				   "ONKEY", onkey); +	if (err < 0) { +		dev_err(&pdev->dev, +			"Failed to register ONKEY IRQ %d, error = %d\n", +			irq, err); +		goto err_free_input; +	} + +	err = input_register_device(input_dev); +	if (err) { +		dev_err(&pdev->dev, "Unable to register input device, %d\n", +			err); +		goto err_free_irq; +	} + +	platform_set_drvdata(pdev, onkey); + +	return 0; + +err_free_irq: +	free_irq(irq, onkey); +	cancel_delayed_work_sync(&onkey->work); +err_free_input: +	input_free_device(input_dev); + +	return err; +} + +static int da9055_onkey_remove(struct platform_device *pdev) +{ +	struct da9055_onkey *onkey = platform_get_drvdata(pdev); +	int irq = platform_get_irq_byname(pdev, "ONKEY"); + +	irq = regmap_irq_get_virq(onkey->da9055->irq_data, irq); +	free_irq(irq, onkey); +	cancel_delayed_work_sync(&onkey->work); +	input_unregister_device(onkey->input); + +	return 0; +} + +static struct platform_driver da9055_onkey_driver = { +	.probe	= da9055_onkey_probe, +	.remove	= da9055_onkey_remove, +	.driver = { +		.name	= "da9055-onkey", +		.owner	= THIS_MODULE, +	}, +}; + +module_platform_driver(da9055_onkey_driver); + +MODULE_AUTHOR("David Dajun Chen <dchen@diasemi.com>"); +MODULE_DESCRIPTION("Onkey driver for DA9055"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:da9055-onkey"); diff --git a/drivers/input/misc/dm355evm_keys.c b/drivers/input/misc/dm355evm_keys.c index c1313d8535c..a309a5c0899 100644 --- a/drivers/input/misc/dm355evm_keys.c +++ b/drivers/input/misc/dm355evm_keys.c @@ -173,7 +173,7 @@ static irqreturn_t dm355evm_keys_irq(int irq, void *_keys)  /*----------------------------------------------------------------------*/ -static int __devinit dm355evm_keys_probe(struct platform_device *pdev) +static int dm355evm_keys_probe(struct platform_device *pdev)  {  	struct dm355evm_keys	*keys;  	struct input_dev	*input; @@ -239,7 +239,7 @@ fail1:  	return status;  } -static int __devexit dm355evm_keys_remove(struct platform_device *pdev) +static int dm355evm_keys_remove(struct platform_device *pdev)  {  	struct dm355evm_keys	*keys = platform_get_drvdata(pdev); @@ -262,7 +262,7 @@ static int __devexit dm355evm_keys_remove(struct platform_device *pdev)   */  static struct platform_driver dm355evm_keys_driver = {  	.probe		= dm355evm_keys_probe, -	.remove		= __devexit_p(dm355evm_keys_remove), +	.remove		= dm355evm_keys_remove,  	.driver		= {  		.owner	= THIS_MODULE,  		.name	= "dm355evm_keys", diff --git a/drivers/input/misc/gp2ap002a00f.c b/drivers/input/misc/gp2ap002a00f.c index b6664cfa340..fe30bd0fe4b 100644 --- a/drivers/input/misc/gp2ap002a00f.c +++ b/drivers/input/misc/gp2ap002a00f.c @@ -98,7 +98,7 @@ static void gp2a_device_close(struct input_dev *dev)  			"unable to deactivate, err %d\n", error);  } -static int __devinit gp2a_initialize(struct gp2a_data *dt) +static int gp2a_initialize(struct gp2a_data *dt)  {  	int error; @@ -122,7 +122,7 @@ static int __devinit gp2a_initialize(struct gp2a_data *dt)  	return error;  } -static int __devinit gp2a_probe(struct i2c_client *client, +static int gp2a_probe(struct i2c_client *client,  				const struct i2c_device_id *id)  {  	const struct gp2a_platform_data *pdata = client->dev.platform_data; @@ -205,7 +205,7 @@ err_hw_shutdown:  	return error;  } -static int __devexit gp2a_remove(struct i2c_client *client) +static int gp2a_remove(struct i2c_client *client)  {  	struct gp2a_data *dt = i2c_get_clientdata(client);  	const struct gp2a_platform_data *pdata = dt->pdata; @@ -277,7 +277,7 @@ static struct i2c_driver gp2a_i2c_driver = {  		.pm	= &gp2a_pm,  	},  	.probe		= gp2a_probe, -	.remove		= __devexit_p(gp2a_remove), +	.remove		= gp2a_remove,  	.id_table	= gp2a_i2c_id,  }; diff --git a/drivers/input/misc/gpio_tilt_polled.c b/drivers/input/misc/gpio_tilt_polled.c index 277a0574c19..da05cca8b56 100644 --- a/drivers/input/misc/gpio_tilt_polled.c +++ b/drivers/input/misc/gpio_tilt_polled.c @@ -96,7 +96,7 @@ static void gpio_tilt_polled_close(struct input_polled_dev *dev)  		pdata->disable(tdev->dev);  } -static int __devinit gpio_tilt_polled_probe(struct platform_device *pdev) +static int gpio_tilt_polled_probe(struct platform_device *pdev)  {  	const struct gpio_tilt_platform_data *pdata = pdev->dev.platform_data;  	struct device *dev = &pdev->dev; @@ -179,7 +179,7 @@ err_free_tdev:  	return error;  } -static int __devexit gpio_tilt_polled_remove(struct platform_device *pdev) +static int gpio_tilt_polled_remove(struct platform_device *pdev)  {  	struct gpio_tilt_polled_dev *tdev = platform_get_drvdata(pdev);  	const struct gpio_tilt_platform_data *pdata = tdev->pdata; @@ -198,7 +198,7 @@ static int __devexit gpio_tilt_polled_remove(struct platform_device *pdev)  static struct platform_driver gpio_tilt_polled_driver = {  	.probe	= gpio_tilt_polled_probe, -	.remove	= __devexit_p(gpio_tilt_polled_remove), +	.remove	= gpio_tilt_polled_remove,  	.driver	= {  		.name	= DRV_NAME,  		.owner	= THIS_MODULE, diff --git a/drivers/input/misc/ixp4xx-beeper.c b/drivers/input/misc/ixp4xx-beeper.c index 50e28306830..6ab3decc86e 100644 --- a/drivers/input/misc/ixp4xx-beeper.c +++ b/drivers/input/misc/ixp4xx-beeper.c @@ -87,7 +87,7 @@ static irqreturn_t ixp4xx_spkr_interrupt(int irq, void *dev_id)  	return IRQ_HANDLED;  } -static int __devinit ixp4xx_spkr_probe(struct platform_device *dev) +static int ixp4xx_spkr_probe(struct platform_device *dev)  {  	struct input_dev *input_dev;  	int err; @@ -132,7 +132,7 @@ static int __devinit ixp4xx_spkr_probe(struct platform_device *dev)  	return err;  } -static int __devexit ixp4xx_spkr_remove(struct platform_device *dev) +static int ixp4xx_spkr_remove(struct platform_device *dev)  {  	struct input_dev *input_dev = platform_get_drvdata(dev);  	unsigned int pin = (unsigned int) input_get_drvdata(input_dev); @@ -165,7 +165,7 @@ static struct platform_driver ixp4xx_spkr_platform_driver = {  		.owner	= THIS_MODULE,  	},  	.probe		= ixp4xx_spkr_probe, -	.remove		= __devexit_p(ixp4xx_spkr_remove), +	.remove		= ixp4xx_spkr_remove,  	.shutdown	= ixp4xx_spkr_shutdown,  };  module_platform_driver(ixp4xx_spkr_platform_driver); diff --git a/drivers/input/misc/kxtj9.c b/drivers/input/misc/kxtj9.c index f46139f19ff..a993b67a8a5 100644 --- a/drivers/input/misc/kxtj9.c +++ b/drivers/input/misc/kxtj9.c @@ -295,7 +295,7 @@ static void kxtj9_input_close(struct input_dev *dev)  	kxtj9_disable(tj9);  } -static void __devinit kxtj9_init_input_device(struct kxtj9_data *tj9, +static void kxtj9_init_input_device(struct kxtj9_data *tj9,  					      struct input_dev *input_dev)  {  	__set_bit(EV_ABS, input_dev->evbit); @@ -308,7 +308,7 @@ static void __devinit kxtj9_init_input_device(struct kxtj9_data *tj9,  	input_dev->dev.parent = &tj9->client->dev;  } -static int __devinit kxtj9_setup_input_device(struct kxtj9_data *tj9) +static int kxtj9_setup_input_device(struct kxtj9_data *tj9)  {  	struct input_dev *input_dev;  	int err; @@ -433,7 +433,7 @@ static void kxtj9_polled_input_close(struct input_polled_dev *dev)  	kxtj9_disable(tj9);  } -static int __devinit kxtj9_setup_polled_device(struct kxtj9_data *tj9) +static int kxtj9_setup_polled_device(struct kxtj9_data *tj9)  {  	int err;  	struct input_polled_dev *poll_dev; @@ -466,7 +466,7 @@ static int __devinit kxtj9_setup_polled_device(struct kxtj9_data *tj9)  	return 0;  } -static void __devexit kxtj9_teardown_polled_device(struct kxtj9_data *tj9) +static void kxtj9_teardown_polled_device(struct kxtj9_data *tj9)  {  	input_unregister_polled_device(tj9->poll_dev);  	input_free_polled_device(tj9->poll_dev); @@ -485,7 +485,7 @@ static inline void kxtj9_teardown_polled_device(struct kxtj9_data *tj9)  #endif -static int __devinit kxtj9_verify(struct kxtj9_data *tj9) +static int kxtj9_verify(struct kxtj9_data *tj9)  {  	int retval; @@ -506,7 +506,7 @@ out:  	return retval;  } -static int __devinit kxtj9_probe(struct i2c_client *client, +static int kxtj9_probe(struct i2c_client *client,  				 const struct i2c_device_id *id)  {  	const struct kxtj9_platform_data *pdata = client->dev.platform_data; @@ -594,7 +594,7 @@ err_free_mem:  	return err;  } -static int __devexit kxtj9_remove(struct i2c_client *client) +static int kxtj9_remove(struct i2c_client *client)  {  	struct kxtj9_data *tj9 = i2c_get_clientdata(client); @@ -663,7 +663,7 @@ static struct i2c_driver kxtj9_driver = {  		.pm	= &kxtj9_pm_ops,  	},  	.probe		= kxtj9_probe, -	.remove		= __devexit_p(kxtj9_remove), +	.remove		= kxtj9_remove,  	.id_table	= kxtj9_id,  }; diff --git a/drivers/input/misc/m68kspkr.c b/drivers/input/misc/m68kspkr.c index 0c64d9bb718..b40ee4b47f4 100644 --- a/drivers/input/misc/m68kspkr.c +++ b/drivers/input/misc/m68kspkr.c @@ -48,7 +48,7 @@ static int m68kspkr_event(struct input_dev *dev, unsigned int type, unsigned int  	return 0;  } -static int __devinit m68kspkr_probe(struct platform_device *dev) +static int m68kspkr_probe(struct platform_device *dev)  {  	struct input_dev *input_dev;  	int err; @@ -80,7 +80,7 @@ static int __devinit m68kspkr_probe(struct platform_device *dev)  	return 0;  } -static int __devexit m68kspkr_remove(struct platform_device *dev) +static int m68kspkr_remove(struct platform_device *dev)  {  	struct input_dev *input_dev = platform_get_drvdata(dev); @@ -104,7 +104,7 @@ static struct platform_driver m68kspkr_platform_driver = {  		.owner	= THIS_MODULE,  	},  	.probe		= m68kspkr_probe, -	.remove		= __devexit_p(m68kspkr_remove), +	.remove		= m68kspkr_remove,  	.shutdown	= m68kspkr_shutdown,  }; diff --git a/drivers/input/misc/max8925_onkey.c b/drivers/input/misc/max8925_onkey.c index 0a12b74140d..369a39de4ff 100644 --- a/drivers/input/misc/max8925_onkey.c +++ b/drivers/input/misc/max8925_onkey.c @@ -62,7 +62,7 @@ static irqreturn_t max8925_onkey_handler(int irq, void *data)  	return IRQ_HANDLED;  } -static int __devinit max8925_onkey_probe(struct platform_device *pdev) +static int max8925_onkey_probe(struct platform_device *pdev)  {  	struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent);  	struct max8925_onkey_info *info; @@ -141,7 +141,7 @@ err_free_mem:  	return error;  } -static int __devexit max8925_onkey_remove(struct platform_device *pdev) +static int max8925_onkey_remove(struct platform_device *pdev)  {  	struct max8925_onkey_info *info = platform_get_drvdata(pdev);  	struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent); @@ -195,7 +195,7 @@ static struct platform_driver max8925_onkey_driver = {  		.pm	= &max8925_onkey_pm_ops,  	},  	.probe		= max8925_onkey_probe, -	.remove		= __devexit_p(max8925_onkey_remove), +	.remove		= max8925_onkey_remove,  };  module_platform_driver(max8925_onkey_driver); diff --git a/drivers/input/misc/max8997_haptic.c b/drivers/input/misc/max8997_haptic.c index 05b7b8bfaf0..e973133212a 100644 --- a/drivers/input/misc/max8997_haptic.c +++ b/drivers/input/misc/max8997_haptic.c @@ -241,7 +241,7 @@ static void max8997_haptic_close(struct input_dev *dev)  	max8997_haptic_disable(chip);  } -static int __devinit max8997_haptic_probe(struct platform_device *pdev) +static int max8997_haptic_probe(struct platform_device *pdev)  {  	struct max8997_dev *iodev = dev_get_drvdata(pdev->dev.parent);  	const struct max8997_platform_data *pdata = @@ -354,7 +354,7 @@ err_free_mem:  	return error;  } -static int __devexit max8997_haptic_remove(struct platform_device *pdev) +static int max8997_haptic_remove(struct platform_device *pdev)  {  	struct max8997_haptic *chip = platform_get_drvdata(pdev); @@ -396,7 +396,7 @@ static struct platform_driver max8997_haptic_driver = {  		.pm	= &max8997_haptic_pm_ops,  	},  	.probe		= max8997_haptic_probe, -	.remove		= __devexit_p(max8997_haptic_remove), +	.remove		= max8997_haptic_remove,  	.id_table	= max8997_haptic_id,  };  module_platform_driver(max8997_haptic_driver); diff --git a/drivers/input/misc/mc13783-pwrbutton.c b/drivers/input/misc/mc13783-pwrbutton.c index 8428f1e8e83..0906ca593d5 100644 --- a/drivers/input/misc/mc13783-pwrbutton.c +++ b/drivers/input/misc/mc13783-pwrbutton.c @@ -89,7 +89,7 @@ static irqreturn_t button_irq(int irq, void *_priv)  	return IRQ_HANDLED;  } -static int __devinit mc13783_pwrbutton_probe(struct platform_device *pdev) +static int mc13783_pwrbutton_probe(struct platform_device *pdev)  {  	const struct mc13xxx_buttons_platform_data *pdata;  	struct mc13xxx *mc13783 = dev_get_drvdata(pdev->dev.parent); @@ -230,7 +230,7 @@ free_input_dev:  	return err;  } -static int __devexit mc13783_pwrbutton_remove(struct platform_device *pdev) +static int mc13783_pwrbutton_remove(struct platform_device *pdev)  {  	struct mc13783_pwrb *priv = platform_get_drvdata(pdev);  	const struct mc13xxx_buttons_platform_data *pdata; @@ -257,7 +257,7 @@ static int __devexit mc13783_pwrbutton_remove(struct platform_device *pdev)  static struct platform_driver mc13783_pwrbutton_driver = {  	.probe		= mc13783_pwrbutton_probe, -	.remove		= __devexit_p(mc13783_pwrbutton_remove), +	.remove		= mc13783_pwrbutton_remove,  	.driver		= {  		.name	= "mc13783-pwrbutton",  		.owner	= THIS_MODULE, diff --git a/drivers/input/misc/mma8450.c b/drivers/input/misc/mma8450.c index 873ebced544..480557f14f2 100644 --- a/drivers/input/misc/mma8450.c +++ b/drivers/input/misc/mma8450.c @@ -167,7 +167,7 @@ static void mma8450_close(struct input_polled_dev *dev)  /*   * I2C init/probing/exit functions   */ -static int __devinit mma8450_probe(struct i2c_client *c, +static int mma8450_probe(struct i2c_client *c,  				   const struct i2c_device_id *id)  {  	struct input_polled_dev *idev; @@ -212,7 +212,7 @@ err_free_mem:  	return err;  } -static int __devexit mma8450_remove(struct i2c_client *c) +static int mma8450_remove(struct i2c_client *c)  {  	struct mma8450 *m = i2c_get_clientdata(c);  	struct input_polled_dev *idev = m->idev; @@ -243,7 +243,7 @@ static struct i2c_driver mma8450_driver = {  		.of_match_table = mma8450_dt_ids,  	},  	.probe		= mma8450_probe, -	.remove		= __devexit_p(mma8450_remove), +	.remove		= mma8450_remove,  	.id_table	= mma8450_id,  }; diff --git a/drivers/input/misc/mpu3050.c b/drivers/input/misc/mpu3050.c index 306f84c2d8f..dce0d95943c 100644 --- a/drivers/input/misc/mpu3050.c +++ b/drivers/input/misc/mpu3050.c @@ -257,7 +257,7 @@ static irqreturn_t mpu3050_interrupt_thread(int irq, void *data)   *   *	Called during device probe; configures the sampling method.   */ -static int __devinit mpu3050_hw_init(struct mpu3050_sensor *sensor) +static int mpu3050_hw_init(struct mpu3050_sensor *sensor)  {  	struct i2c_client *client = sensor->client;  	int ret; @@ -306,7 +306,7 @@ static int __devinit mpu3050_hw_init(struct mpu3050_sensor *sensor)   *   *	If present install the relevant sysfs interfaces and input device.   */ -static int __devinit mpu3050_probe(struct i2c_client *client, +static int mpu3050_probe(struct i2c_client *client,  				   const struct i2c_device_id *id)  {  	struct mpu3050_sensor *sensor; @@ -402,7 +402,7 @@ err_free_mem:   *   *	Our sensor is going away, clean up the resources.   */ -static int __devexit mpu3050_remove(struct i2c_client *client) +static int mpu3050_remove(struct i2c_client *client)  {  	struct mpu3050_sensor *sensor = i2c_get_clientdata(client); @@ -471,7 +471,7 @@ static struct i2c_driver mpu3050_i2c_driver = {  		.of_match_table = mpu3050_of_match,  	},  	.probe		= mpu3050_probe, -	.remove		= __devexit_p(mpu3050_remove), +	.remove		= mpu3050_remove,  	.id_table	= mpu3050_ids,  }; diff --git a/drivers/input/misc/pcap_keys.c b/drivers/input/misc/pcap_keys.c index e09b4fe8191..40ac9a5adf8 100644 --- a/drivers/input/misc/pcap_keys.c +++ b/drivers/input/misc/pcap_keys.c @@ -48,7 +48,7 @@ static irqreturn_t pcap_keys_handler(int irq, void *_pcap_keys)  	return IRQ_HANDLED;  } -static int __devinit pcap_keys_probe(struct platform_device *pdev) +static int pcap_keys_probe(struct platform_device *pdev)  {  	int err = -ENOMEM;  	struct pcap_keys *pcap_keys; @@ -104,7 +104,7 @@ fail:  	return err;  } -static int __devexit pcap_keys_remove(struct platform_device *pdev) +static int pcap_keys_remove(struct platform_device *pdev)  {  	struct pcap_keys *pcap_keys = platform_get_drvdata(pdev); @@ -119,7 +119,7 @@ static int __devexit pcap_keys_remove(struct platform_device *pdev)  static struct platform_driver pcap_keys_device_driver = {  	.probe		= pcap_keys_probe, -	.remove		= __devexit_p(pcap_keys_remove), +	.remove		= pcap_keys_remove,  	.driver		= {  		.name	= "pcap-keys",  		.owner	= THIS_MODULE, diff --git a/drivers/input/misc/pcf50633-input.c b/drivers/input/misc/pcf50633-input.c index 53891de80b0..73b13ebabe5 100644 --- a/drivers/input/misc/pcf50633-input.c +++ b/drivers/input/misc/pcf50633-input.c @@ -53,7 +53,7 @@ pcf50633_input_irq(int irq, void *data)  	input_sync(input->input_dev);  } -static int __devinit pcf50633_input_probe(struct platform_device *pdev) +static int pcf50633_input_probe(struct platform_device *pdev)  {  	struct pcf50633_input *input;  	struct input_dev *input_dev; @@ -93,7 +93,7 @@ static int __devinit pcf50633_input_probe(struct platform_device *pdev)  	return 0;  } -static int __devexit pcf50633_input_remove(struct platform_device *pdev) +static int pcf50633_input_remove(struct platform_device *pdev)  {  	struct pcf50633_input *input  = platform_get_drvdata(pdev); @@ -111,7 +111,7 @@ static struct platform_driver pcf50633_input_driver = {  		.name = "pcf50633-input",  	},  	.probe = pcf50633_input_probe, -	.remove = __devexit_p(pcf50633_input_remove), +	.remove = pcf50633_input_remove,  };  module_platform_driver(pcf50633_input_driver); diff --git a/drivers/input/misc/pcf8574_keypad.c b/drivers/input/misc/pcf8574_keypad.c index 544c6635abe..e37392976fd 100644 --- a/drivers/input/misc/pcf8574_keypad.c +++ b/drivers/input/misc/pcf8574_keypad.c @@ -82,7 +82,7 @@ static irqreturn_t pcf8574_kp_irq_handler(int irq, void *dev_id)  	return IRQ_HANDLED;  } -static int __devinit pcf8574_kp_probe(struct i2c_client *client, const struct i2c_device_id *id) +static int pcf8574_kp_probe(struct i2c_client *client, const struct i2c_device_id *id)  {  	int i, ret;  	struct input_dev *idev; @@ -156,7 +156,7 @@ static int __devinit pcf8574_kp_probe(struct i2c_client *client, const struct i2  	return ret;  } -static int __devexit pcf8574_kp_remove(struct i2c_client *client) +static int pcf8574_kp_remove(struct i2c_client *client)  {  	struct kp_data *lp = i2c_get_clientdata(client); @@ -212,7 +212,7 @@ static struct i2c_driver pcf8574_kp_driver = {  #endif  	},  	.probe    = pcf8574_kp_probe, -	.remove   = __devexit_p(pcf8574_kp_remove), +	.remove   = pcf8574_kp_remove,  	.id_table = pcf8574_kp_id,  }; diff --git a/drivers/input/misc/pcspkr.c b/drivers/input/misc/pcspkr.c index b2484aa07f3..199db78acc4 100644 --- a/drivers/input/misc/pcspkr.c +++ b/drivers/input/misc/pcspkr.c @@ -63,7 +63,7 @@ static int pcspkr_event(struct input_dev *dev, unsigned int type, unsigned int c  	return 0;  } -static int __devinit pcspkr_probe(struct platform_device *dev) +static int pcspkr_probe(struct platform_device *dev)  {  	struct input_dev *pcspkr_dev;  	int err; @@ -95,7 +95,7 @@ static int __devinit pcspkr_probe(struct platform_device *dev)  	return 0;  } -static int __devexit pcspkr_remove(struct platform_device *dev) +static int pcspkr_remove(struct platform_device *dev)  {  	struct input_dev *pcspkr_dev = platform_get_drvdata(dev); @@ -131,7 +131,7 @@ static struct platform_driver pcspkr_platform_driver = {  		.pm	= &pcspkr_pm_ops,  	},  	.probe		= pcspkr_probe, -	.remove		= __devexit_p(pcspkr_remove), +	.remove		= pcspkr_remove,  	.shutdown	= pcspkr_shutdown,  };  module_platform_driver(pcspkr_platform_driver); diff --git a/drivers/input/misc/pm8xxx-vibrator.c b/drivers/input/misc/pm8xxx-vibrator.c index dfbfb463ea5..a9da65e41c5 100644 --- a/drivers/input/misc/pm8xxx-vibrator.c +++ b/drivers/input/misc/pm8xxx-vibrator.c @@ -178,7 +178,7 @@ static int pm8xxx_vib_play_effect(struct input_dev *dev, void *data,  	return 0;  } -static int __devinit pm8xxx_vib_probe(struct platform_device *pdev) +static int pm8xxx_vib_probe(struct platform_device *pdev)  {  	struct pm8xxx_vib *vib; @@ -242,7 +242,7 @@ err_free_mem:  	return error;  } -static int __devexit pm8xxx_vib_remove(struct platform_device *pdev) +static int pm8xxx_vib_remove(struct platform_device *pdev)  {  	struct pm8xxx_vib *vib = platform_get_drvdata(pdev); @@ -270,7 +270,7 @@ static SIMPLE_DEV_PM_OPS(pm8xxx_vib_pm_ops, pm8xxx_vib_suspend, NULL);  static struct platform_driver pm8xxx_vib_driver = {  	.probe		= pm8xxx_vib_probe, -	.remove		= __devexit_p(pm8xxx_vib_remove), +	.remove		= pm8xxx_vib_remove,  	.driver		= {  		.name	= "pm8xxx-vib",  		.owner	= THIS_MODULE, diff --git a/drivers/input/misc/pmic8xxx-pwrkey.c b/drivers/input/misc/pmic8xxx-pwrkey.c index 0f83d0f1d01..4b811be7397 100644 --- a/drivers/input/misc/pmic8xxx-pwrkey.c +++ b/drivers/input/misc/pmic8xxx-pwrkey.c @@ -81,7 +81,7 @@ static int pmic8xxx_pwrkey_resume(struct device *dev)  static SIMPLE_DEV_PM_OPS(pm8xxx_pwr_key_pm_ops,  		pmic8xxx_pwrkey_suspend, pmic8xxx_pwrkey_resume); -static int __devinit pmic8xxx_pwrkey_probe(struct platform_device *pdev) +static int pmic8xxx_pwrkey_probe(struct platform_device *pdev)  {  	struct input_dev *pwr;  	int key_release_irq = platform_get_irq(pdev, 0); @@ -187,7 +187,7 @@ free_pwrkey:  	return err;  } -static int __devexit pmic8xxx_pwrkey_remove(struct platform_device *pdev) +static int pmic8xxx_pwrkey_remove(struct platform_device *pdev)  {  	struct pmic8xxx_pwrkey *pwrkey = platform_get_drvdata(pdev);  	int key_release_irq = platform_get_irq(pdev, 0); @@ -206,7 +206,7 @@ static int __devexit pmic8xxx_pwrkey_remove(struct platform_device *pdev)  static struct platform_driver pmic8xxx_pwrkey_driver = {  	.probe		= pmic8xxx_pwrkey_probe, -	.remove		= __devexit_p(pmic8xxx_pwrkey_remove), +	.remove		= pmic8xxx_pwrkey_remove,  	.driver		= {  		.name	= PM8XXX_PWRKEY_DEV_NAME,  		.owner	= THIS_MODULE, diff --git a/drivers/input/misc/pwm-beeper.c b/drivers/input/misc/pwm-beeper.c index fc84c8a5114..0808868461d 100644 --- a/drivers/input/misc/pwm-beeper.c +++ b/drivers/input/misc/pwm-beeper.c @@ -65,7 +65,7 @@ static int pwm_beeper_event(struct input_dev *input,  	return 0;  } -static int __devinit pwm_beeper_probe(struct platform_device *pdev) +static int pwm_beeper_probe(struct platform_device *pdev)  {  	unsigned long pwm_id = (unsigned long)pdev->dev.platform_data;  	struct pwm_beeper *beeper; @@ -75,7 +75,11 @@ static int __devinit pwm_beeper_probe(struct platform_device *pdev)  	if (!beeper)  		return -ENOMEM; -	beeper->pwm = pwm_request(pwm_id, "pwm beeper"); +	beeper->pwm = pwm_get(&pdev->dev, NULL); +	if (IS_ERR(beeper->pwm)) { +		dev_dbg(&pdev->dev, "unable to request PWM, trying legacy API\n"); +		beeper->pwm = pwm_request(pwm_id, "pwm beeper"); +	}  	if (IS_ERR(beeper->pwm)) {  		error = PTR_ERR(beeper->pwm); @@ -125,7 +129,7 @@ err_free:  	return error;  } -static int __devexit pwm_beeper_remove(struct platform_device *pdev) +static int pwm_beeper_remove(struct platform_device *pdev)  {  	struct pwm_beeper *beeper = platform_get_drvdata(pdev); @@ -171,13 +175,21 @@ static SIMPLE_DEV_PM_OPS(pwm_beeper_pm_ops,  #define PWM_BEEPER_PM_OPS NULL  #endif +#ifdef CONFIG_OF +static const struct of_device_id pwm_beeper_match[] = { +	{ .compatible = "pwm-beeper", }, +	{ }, +}; +#endif +  static struct platform_driver pwm_beeper_driver = {  	.probe	= pwm_beeper_probe, -	.remove = __devexit_p(pwm_beeper_remove), +	.remove = pwm_beeper_remove,  	.driver = {  		.name	= "pwm-beeper",  		.owner	= THIS_MODULE,  		.pm	= PWM_BEEPER_PM_OPS, +		.of_match_table = of_match_ptr(pwm_beeper_match),  	},  };  module_platform_driver(pwm_beeper_driver); diff --git a/drivers/input/misc/rb532_button.c b/drivers/input/misc/rb532_button.c index aeb02bcf723..fb4f8ac3343 100644 --- a/drivers/input/misc/rb532_button.c +++ b/drivers/input/misc/rb532_button.c @@ -51,7 +51,7 @@ static void rb532_button_poll(struct input_polled_dev *poll_dev)  	input_sync(poll_dev->input);  } -static int __devinit rb532_button_probe(struct platform_device *pdev) +static int rb532_button_probe(struct platform_device *pdev)  {  	struct input_polled_dev *poll_dev;  	int error; @@ -81,7 +81,7 @@ static int __devinit rb532_button_probe(struct platform_device *pdev)  	return 0;  } -static int __devexit rb532_button_remove(struct platform_device *pdev) +static int rb532_button_remove(struct platform_device *pdev)  {  	struct input_polled_dev *poll_dev = dev_get_drvdata(&pdev->dev); @@ -94,7 +94,7 @@ static int __devexit rb532_button_remove(struct platform_device *pdev)  static struct platform_driver rb532_button_driver = {  	.probe = rb532_button_probe, -	.remove = __devexit_p(rb532_button_remove), +	.remove = rb532_button_remove,  	.driver = {  		.name = DRV_NAME,  		.owner = THIS_MODULE, diff --git a/drivers/input/misc/retu-pwrbutton.c b/drivers/input/misc/retu-pwrbutton.c new file mode 100644 index 00000000000..7ca09baa001 --- /dev/null +++ b/drivers/input/misc/retu-pwrbutton.c @@ -0,0 +1,99 @@ +/* + * Retu power button driver. + * + * Copyright (C) 2004-2010 Nokia Corporation + * + * Original code written by Ari Saastamoinen, Juha Yrjölä and Felipe Balbi. + * Rewritten by Aaro Koskinen. + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file "COPYING" in the main directory of this + * archive for more details. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <linux/irq.h> +#include <linux/init.h> +#include <linux/slab.h> +#include <linux/errno.h> +#include <linux/input.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/mfd/retu.h> +#include <linux/interrupt.h> +#include <linux/platform_device.h> + +#define RETU_STATUS_PWRONX (1 << 5) + +static irqreturn_t retu_pwrbutton_irq(int irq, void *_pwr) +{ +	struct input_dev *idev = _pwr; +	struct retu_dev *rdev = input_get_drvdata(idev); +	bool state; + +	state = !(retu_read(rdev, RETU_REG_STATUS) & RETU_STATUS_PWRONX); +	input_report_key(idev, KEY_POWER, state); +	input_sync(idev); + +	return IRQ_HANDLED; +} + +static int retu_pwrbutton_probe(struct platform_device *pdev) +{ +	struct retu_dev *rdev = dev_get_drvdata(pdev->dev.parent); +	struct input_dev *idev; +	int irq; +	int error; + +	irq = platform_get_irq(pdev, 0); +	if (irq < 0) +		return irq; + +	idev = devm_input_allocate_device(&pdev->dev); +	if (!idev) +		return -ENOMEM; + +	idev->name = "retu-pwrbutton"; +	idev->dev.parent = &pdev->dev; + +	input_set_capability(idev, EV_KEY, KEY_POWER); +	input_set_drvdata(idev, rdev); + +	error = devm_request_threaded_irq(&pdev->dev, irq, +					  NULL, retu_pwrbutton_irq, 0, +					  "retu-pwrbutton", idev); +	if (error) +		return error; + +	error = input_register_device(idev); +	if (error) +		return error; + +	return 0; +} + +static int retu_pwrbutton_remove(struct platform_device *pdev) +{ +	return 0; +} + +static struct platform_driver retu_pwrbutton_driver = { +	.probe		= retu_pwrbutton_probe, +	.remove		= retu_pwrbutton_remove, +	.driver		= { +		.name	= "retu-pwrbutton", +		.owner	= THIS_MODULE, +	}, +}; +module_platform_driver(retu_pwrbutton_driver); + +MODULE_ALIAS("platform:retu-pwrbutton"); +MODULE_DESCRIPTION("Retu Power Button"); +MODULE_AUTHOR("Ari Saastamoinen"); +MODULE_AUTHOR("Felipe Balbi"); +MODULE_AUTHOR("Aaro Koskinen <aaro.koskinen@iki.fi>"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/rotary_encoder.c b/drivers/input/misc/rotary_encoder.c index 99a49e4968d..aff47b2c38f 100644 --- a/drivers/input/misc/rotary_encoder.c +++ b/drivers/input/misc/rotary_encoder.c @@ -149,8 +149,7 @@ static struct of_device_id rotary_encoder_of_match[] = {  };  MODULE_DEVICE_TABLE(of, rotary_encoder_of_match); -static struct rotary_encoder_platform_data * __devinit -rotary_encoder_parse_dt(struct device *dev) +static struct rotary_encoder_platform_data *rotary_encoder_parse_dt(struct device *dev)  {  	const struct of_device_id *of_id =  				of_match_device(rotary_encoder_of_match, dev); @@ -192,7 +191,7 @@ rotary_encoder_parse_dt(struct device *dev)  }  #endif -static int __devinit rotary_encoder_probe(struct platform_device *pdev) +static int rotary_encoder_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	const struct rotary_encoder_platform_data *pdata = dev_get_platdata(dev); @@ -302,7 +301,7 @@ exit_free_mem:  	return err;  } -static int __devexit rotary_encoder_remove(struct platform_device *pdev) +static int rotary_encoder_remove(struct platform_device *pdev)  {  	struct rotary_encoder *encoder = platform_get_drvdata(pdev);  	const struct rotary_encoder_platform_data *pdata = encoder->pdata; @@ -325,7 +324,7 @@ static int __devexit rotary_encoder_remove(struct platform_device *pdev)  static struct platform_driver rotary_encoder_driver = {  	.probe		= rotary_encoder_probe, -	.remove		= __devexit_p(rotary_encoder_remove), +	.remove		= rotary_encoder_remove,  	.driver		= {  		.name	= DRV_NAME,  		.owner	= THIS_MODULE, diff --git a/drivers/input/misc/sgi_btns.c b/drivers/input/misc/sgi_btns.c index 5d9fd557119..ad6415ceaf5 100644 --- a/drivers/input/misc/sgi_btns.c +++ b/drivers/input/misc/sgi_btns.c @@ -91,7 +91,7 @@ static void handle_buttons(struct input_polled_dev *dev)  	}  } -static int __devinit sgi_buttons_probe(struct platform_device *pdev) +static int sgi_buttons_probe(struct platform_device *pdev)  {  	struct buttons_dev *bdev;  	struct input_polled_dev *poll_dev; @@ -143,7 +143,7 @@ static int __devinit sgi_buttons_probe(struct platform_device *pdev)  	return error;  } -static int __devexit sgi_buttons_remove(struct platform_device *pdev) +static int sgi_buttons_remove(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	struct buttons_dev *bdev = dev_get_drvdata(dev); @@ -158,7 +158,7 @@ static int __devexit sgi_buttons_remove(struct platform_device *pdev)  static struct platform_driver sgi_buttons_driver = {  	.probe	= sgi_buttons_probe, -	.remove	= __devexit_p(sgi_buttons_remove), +	.remove	= sgi_buttons_remove,  	.driver	= {  		.name	= "sgibtns",  		.owner	= THIS_MODULE, diff --git a/drivers/input/misc/sparcspkr.c b/drivers/input/misc/sparcspkr.c index 0122f535157..a53586a7fbd 100644 --- a/drivers/input/misc/sparcspkr.c +++ b/drivers/input/misc/sparcspkr.c @@ -139,7 +139,7 @@ static int grover_spkr_event(struct input_dev *dev, unsigned int type, unsigned  	return 0;  } -static int __devinit sparcspkr_probe(struct device *dev) +static int sparcspkr_probe(struct device *dev)  {  	struct sparcspkr_state *state = dev_get_drvdata(dev);  	struct input_dev *input_dev; @@ -182,7 +182,7 @@ static void sparcspkr_shutdown(struct platform_device *dev)  	state->event(input_dev, EV_SND, SND_BELL, 0);  } -static int __devinit bbc_beep_probe(struct platform_device *op) +static int bbc_beep_probe(struct platform_device *op)  {  	struct sparcspkr_state *state;  	struct bbc_beep_info *info; @@ -229,7 +229,7 @@ out_err:  	return err;  } -static int __devexit bbc_remove(struct platform_device *op) +static int bbc_remove(struct platform_device *op)  {  	struct sparcspkr_state *state = dev_get_drvdata(&op->dev);  	struct input_dev *input_dev = state->input_dev; @@ -263,11 +263,11 @@ static struct platform_driver bbc_beep_driver = {  		.of_match_table = bbc_beep_match,  	},  	.probe		= bbc_beep_probe, -	.remove		= __devexit_p(bbc_remove), +	.remove		= bbc_remove,  	.shutdown	= sparcspkr_shutdown,  }; -static int __devinit grover_beep_probe(struct platform_device *op) +static int grover_beep_probe(struct platform_device *op)  {  	struct sparcspkr_state *state;  	struct grover_beep_info *info; @@ -310,7 +310,7 @@ out_err:  	return err;  } -static int __devexit grover_remove(struct platform_device *op) +static int grover_remove(struct platform_device *op)  {  	struct sparcspkr_state *state = dev_get_drvdata(&op->dev);  	struct grover_beep_info *info = &state->u.grover; @@ -345,7 +345,7 @@ static struct platform_driver grover_beep_driver = {  		.of_match_table = grover_beep_match,  	},  	.probe		= grover_beep_probe, -	.remove		= __devexit_p(grover_remove), +	.remove		= grover_remove,  	.shutdown	= sparcspkr_shutdown,  }; diff --git a/drivers/input/misc/twl4030-pwrbutton.c b/drivers/input/misc/twl4030-pwrbutton.c index b3dd96d6448..27c2bc8aa89 100644 --- a/drivers/input/misc/twl4030-pwrbutton.c +++ b/drivers/input/misc/twl4030-pwrbutton.c @@ -39,8 +39,7 @@ static irqreturn_t powerbutton_irq(int irq, void *_pwr)  	int err;  	u8 value; -	err = twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &value, -				STS_HW_CONDITIONS); +	err = twl_i2c_read_u8(TWL_MODULE_PM_MASTER, &value, STS_HW_CONDITIONS);  	if (!err)  {  		pm_wakeup_event(pwr->dev.parent, 0);  		input_report_key(pwr, KEY_POWER, value & PWR_PWRON_IRQ); diff --git a/drivers/input/misc/twl4030-vibra.c b/drivers/input/misc/twl4030-vibra.c index 2194a3c7236..78eb6b30580 100644 --- a/drivers/input/misc/twl4030-vibra.c +++ b/drivers/input/misc/twl4030-vibra.c @@ -207,7 +207,7 @@ static bool twl4030_vibra_check_coexist(struct twl4030_vibra_data *pdata,  	return false;  } -static int __devinit twl4030_vibra_probe(struct platform_device *pdev) +static int twl4030_vibra_probe(struct platform_device *pdev)  {  	struct twl4030_vibra_data *pdata = pdev->dev.platform_data;  	struct device_node *twl4030_core_node = pdev->dev.parent->of_node; @@ -269,7 +269,7 @@ err_kzalloc:  	return ret;  } -static int __devexit twl4030_vibra_remove(struct platform_device *pdev) +static int twl4030_vibra_remove(struct platform_device *pdev)  {  	struct vibra_info *info = platform_get_drvdata(pdev); @@ -283,7 +283,7 @@ static int __devexit twl4030_vibra_remove(struct platform_device *pdev)  static struct platform_driver twl4030_vibra_driver = {  	.probe		= twl4030_vibra_probe, -	.remove		= __devexit_p(twl4030_vibra_remove), +	.remove		= twl4030_vibra_remove,  	.driver		= {  		.name	= "twl4030-vibra",  		.owner	= THIS_MODULE, diff --git a/drivers/input/misc/twl6040-vibra.c b/drivers/input/misc/twl6040-vibra.c index c8a288ae1d5..71a28ee699f 100644 --- a/drivers/input/misc/twl6040-vibra.c +++ b/drivers/input/misc/twl6040-vibra.c @@ -255,7 +255,7 @@ static int twl6040_vibra_suspend(struct device *dev)  static SIMPLE_DEV_PM_OPS(twl6040_vibra_pm_ops, twl6040_vibra_suspend, NULL); -static int __devinit twl6040_vibra_probe(struct platform_device *pdev) +static int twl6040_vibra_probe(struct platform_device *pdev)  {  	struct twl6040_vibra_data *pdata = pdev->dev.platform_data;  	struct device *twl6040_core_dev = pdev->dev.parent; @@ -418,7 +418,7 @@ err_kzalloc:  	return ret;  } -static int __devexit twl6040_vibra_remove(struct platform_device *pdev) +static int twl6040_vibra_remove(struct platform_device *pdev)  {  	struct vibra_info *info = platform_get_drvdata(pdev); @@ -433,7 +433,7 @@ static int __devexit twl6040_vibra_remove(struct platform_device *pdev)  static struct platform_driver twl6040_vibra_driver = {  	.probe		= twl6040_vibra_probe, -	.remove		= __devexit_p(twl6040_vibra_remove), +	.remove		= twl6040_vibra_remove,  	.driver		= {  		.name	= "twl6040-vibra",  		.owner	= THIS_MODULE, diff --git a/drivers/input/misc/wistron_btns.c b/drivers/input/misc/wistron_btns.c index e2bdfd4bea7..56536f4b957 100644 --- a/drivers/input/misc/wistron_btns.c +++ b/drivers/input/misc/wistron_btns.c @@ -170,7 +170,7 @@ static u16 bios_pop_queue(void)  	return regs.eax;  } -static void __devinit bios_attach(void) +static void bios_attach(void)  {  	struct regs regs; @@ -190,7 +190,7 @@ static void bios_detach(void)  	call_bios(®s);  } -static u8 __devinit bios_get_cmos_address(void) +static u8 bios_get_cmos_address(void)  {  	struct regs regs; @@ -202,7 +202,7 @@ static u8 __devinit bios_get_cmos_address(void)  	return regs.ecx;  } -static u16 __devinit bios_get_default_setting(u8 subsys) +static u16 bios_get_default_setting(u8 subsys)  {  	struct regs regs; @@ -1052,7 +1052,7 @@ static struct led_classdev wistron_wifi_led = {  	.brightness_set		= wistron_wifi_led_set,  }; -static void __devinit wistron_led_init(struct device *parent) +static void wistron_led_init(struct device *parent)  {  	if (leds_present & FE_WIFI_LED) {  		u16 wifi = bios_get_default_setting(WIFI); @@ -1077,7 +1077,7 @@ static void __devinit wistron_led_init(struct device *parent)  	}  } -static void __devexit wistron_led_remove(void) +static void wistron_led_remove(void)  {  	if (leds_present & FE_MAIL_LED)  		led_classdev_unregister(&wistron_mail_led); @@ -1168,7 +1168,7 @@ static void wistron_poll(struct input_polled_dev *dev)  		dev->poll_interval = POLL_INTERVAL_DEFAULT;  } -static int __devinit wistron_setup_keymap(struct input_dev *dev, +static int wistron_setup_keymap(struct input_dev *dev,  					  struct key_entry *entry)  {  	switch (entry->type) { @@ -1199,7 +1199,7 @@ static int __devinit wistron_setup_keymap(struct input_dev *dev,  	return 0;  } -static int __devinit setup_input_dev(void) +static int setup_input_dev(void)  {  	struct input_dev *input_dev;  	int error; @@ -1237,7 +1237,7 @@ static int __devinit setup_input_dev(void)  /* Driver core */ -static int __devinit wistron_probe(struct platform_device *dev) +static int wistron_probe(struct platform_device *dev)  {  	int err; @@ -1277,7 +1277,7 @@ static int __devinit wistron_probe(struct platform_device *dev)  	return 0;  } -static int __devexit wistron_remove(struct platform_device *dev) +static int wistron_remove(struct platform_device *dev)  {  	wistron_led_remove();  	input_unregister_polled_device(wistron_idev); @@ -1334,7 +1334,7 @@ static struct platform_driver wistron_driver = {  #endif  	},  	.probe		= wistron_probe, -	.remove		= __devexit_p(wistron_remove), +	.remove		= wistron_remove,  };  static int __init wb_module_init(void) diff --git a/drivers/input/misc/wm831x-on.c b/drivers/input/misc/wm831x-on.c index 6790a812a1d..558767d8ebf 100644 --- a/drivers/input/misc/wm831x-on.c +++ b/drivers/input/misc/wm831x-on.c @@ -69,14 +69,15 @@ static irqreturn_t wm831x_on_irq(int irq, void *data)  	return IRQ_HANDLED;  } -static int __devinit wm831x_on_probe(struct platform_device *pdev) +static int wm831x_on_probe(struct platform_device *pdev)  {  	struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);  	struct wm831x_on *wm831x_on;  	int irq = wm831x_irq(wm831x, platform_get_irq(pdev, 0));  	int ret; -	wm831x_on = kzalloc(sizeof(struct wm831x_on), GFP_KERNEL); +	wm831x_on = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_on), +				 GFP_KERNEL);  	if (!wm831x_on) {  		dev_err(&pdev->dev, "Can't allocate data\n");  		return -ENOMEM; @@ -120,11 +121,10 @@ err_irq:  err_input_dev:  	input_free_device(wm831x_on->dev);  err: -	kfree(wm831x_on);  	return ret;  } -static int __devexit wm831x_on_remove(struct platform_device *pdev) +static int wm831x_on_remove(struct platform_device *pdev)  {  	struct wm831x_on *wm831x_on = platform_get_drvdata(pdev);  	int irq = platform_get_irq(pdev, 0); @@ -132,14 +132,13 @@ static int __devexit wm831x_on_remove(struct platform_device *pdev)  	free_irq(irq, wm831x_on);  	cancel_delayed_work_sync(&wm831x_on->work);  	input_unregister_device(wm831x_on->dev); -	kfree(wm831x_on);  	return 0;  }  static struct platform_driver wm831x_on_driver = {  	.probe		= wm831x_on_probe, -	.remove		= __devexit_p(wm831x_on_remove), +	.remove		= wm831x_on_remove,  	.driver		= {  		.name	= "wm831x-on",  		.owner	= THIS_MODULE, diff --git a/drivers/input/misc/xen-kbdfront.c b/drivers/input/misc/xen-kbdfront.c index 6f7d9901303..e21c1816a8f 100644 --- a/drivers/input/misc/xen-kbdfront.c +++ b/drivers/input/misc/xen-kbdfront.c @@ -104,7 +104,7 @@ static irqreturn_t input_handler(int rq, void *dev_id)  	return IRQ_HANDLED;  } -static int __devinit xenkbd_probe(struct xenbus_device *dev, +static int xenkbd_probe(struct xenbus_device *dev,  				  const struct xenbus_device_id *id)  {  	int ret, i, abs; diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c index cf5af1f495e..e229fa3cad9 100644 --- a/drivers/input/mouse/alps.c +++ b/drivers/input/mouse/alps.c @@ -767,9 +767,8 @@ static psmouse_ret_t alps_handle_interleaved_ps2(struct psmouse *psmouse)  		      psmouse->packet[5]) & 0x80) ||  		    (!alps_is_valid_first_byte(priv->i, psmouse->packet[6]))) {  			psmouse_dbg(psmouse, -				    "refusing packet %x %x %x %x (suspected interleaved ps/2)\n", -				    psmouse->packet[3], psmouse->packet[4], -				    psmouse->packet[5], psmouse->packet[6]); +				    "refusing packet %4ph (suspected interleaved ps/2)\n", +				    psmouse->packet + 3);  			return PSMOUSE_BAD_DATA;  		} @@ -831,9 +830,8 @@ static void alps_flush_packet(unsigned long data)  		     psmouse->packet[4] |  		     psmouse->packet[5]) & 0x80) {  			psmouse_dbg(psmouse, -				    "refusing packet %x %x %x (suspected interleaved ps/2)\n", -				    psmouse->packet[3], psmouse->packet[4], -				    psmouse->packet[5]); +				    "refusing packet %3ph (suspected interleaved ps/2)\n", +				    psmouse->packet + 3);  		} else {  			alps_process_packet(psmouse);  		} diff --git a/drivers/input/mouse/gpio_mouse.c b/drivers/input/mouse/gpio_mouse.c index 39fe9b737ca..532eaca4cc5 100644 --- a/drivers/input/mouse/gpio_mouse.c +++ b/drivers/input/mouse/gpio_mouse.c @@ -46,7 +46,7 @@ static void gpio_mouse_scan(struct input_polled_dev *dev)  	input_sync(input);  } -static int __devinit gpio_mouse_probe(struct platform_device *pdev) +static int gpio_mouse_probe(struct platform_device *pdev)  {  	struct gpio_mouse_platform_data *pdata = pdev->dev.platform_data;  	struct input_polled_dev *input_poll; @@ -150,7 +150,7 @@ static int __devinit gpio_mouse_probe(struct platform_device *pdev)  	return error;  } -static int __devexit gpio_mouse_remove(struct platform_device *pdev) +static int gpio_mouse_remove(struct platform_device *pdev)  {  	struct input_polled_dev *input = platform_get_drvdata(pdev);  	struct gpio_mouse_platform_data *pdata = input->private; @@ -172,7 +172,7 @@ static int __devexit gpio_mouse_remove(struct platform_device *pdev)  static struct platform_driver gpio_mouse_device_driver = {  	.probe		= gpio_mouse_probe, -	.remove		= __devexit_p(gpio_mouse_remove), +	.remove		= gpio_mouse_remove,  	.driver		= {  		.name	= "gpio_mouse",  		.owner	= THIS_MODULE, diff --git a/drivers/input/mouse/maplemouse.c b/drivers/input/mouse/maplemouse.c index 5f278176eb9..0a60717b91c 100644 --- a/drivers/input/mouse/maplemouse.c +++ b/drivers/input/mouse/maplemouse.c @@ -64,7 +64,7 @@ static void dc_mouse_close(struct input_dev *dev)  }  /* allow the mouse to be used */ -static int __devinit probe_maple_mouse(struct device *dev) +static int probe_maple_mouse(struct device *dev)  {  	struct maple_device *mdev = to_maple_dev(dev);  	struct maple_driver *mdrv = to_maple_driver(dev->driver); @@ -114,7 +114,7 @@ fail:  	return error;  } -static int __devexit remove_maple_mouse(struct device *dev) +static int remove_maple_mouse(struct device *dev)  {  	struct maple_device *mdev = to_maple_dev(dev);  	struct dc_mouse *mse = maple_get_drvdata(mdev); @@ -132,7 +132,7 @@ static struct maple_driver dc_mouse_driver = {  	.drv = {  		.name = "Dreamcast_mouse",  		.probe = probe_maple_mouse, -		.remove = __devexit_p(remove_maple_mouse), +		.remove = remove_maple_mouse,  	},  }; diff --git a/drivers/input/mouse/navpoint.c b/drivers/input/mouse/navpoint.c index c29ae7654d5..8e1b98ea564 100644 --- a/drivers/input/mouse/navpoint.c +++ b/drivers/input/mouse/navpoint.c @@ -206,7 +206,7 @@ static void navpoint_close(struct input_dev *input)  	navpoint_down(navpoint);  } -static int __devinit navpoint_probe(struct platform_device *pdev) +static int navpoint_probe(struct platform_device *pdev)  {  	const struct navpoint_platform_data *pdata =  					dev_get_platdata(&pdev->dev); @@ -299,7 +299,7 @@ err_free_gpio:  	return error;  } -static int __devexit navpoint_remove(struct platform_device *pdev) +static int navpoint_remove(struct platform_device *pdev)  {  	const struct navpoint_platform_data *pdata =  					dev_get_platdata(&pdev->dev); @@ -353,7 +353,7 @@ static SIMPLE_DEV_PM_OPS(navpoint_pm_ops, navpoint_suspend, navpoint_resume);  static struct platform_driver navpoint_driver = {  	.probe		= navpoint_probe, -	.remove		= __devexit_p(navpoint_remove), +	.remove		= navpoint_remove,  	.driver = {  		.name	= "navpoint",  		.owner	= THIS_MODULE, diff --git a/drivers/input/mouse/pxa930_trkball.c b/drivers/input/mouse/pxa930_trkball.c index 4fe055f2c53..0ecb9e7945e 100644 --- a/drivers/input/mouse/pxa930_trkball.c +++ b/drivers/input/mouse/pxa930_trkball.c @@ -143,7 +143,7 @@ static void pxa930_trkball_close(struct input_dev *dev)  	pxa930_trkball_disable(trkball);  } -static int __devinit pxa930_trkball_probe(struct platform_device *pdev) +static int pxa930_trkball_probe(struct platform_device *pdev)  {  	struct pxa930_trkball *trkball;  	struct input_dev *input; @@ -230,7 +230,7 @@ failed:  	return error;  } -static int __devexit pxa930_trkball_remove(struct platform_device *pdev) +static int pxa930_trkball_remove(struct platform_device *pdev)  {  	struct pxa930_trkball *trkball = platform_get_drvdata(pdev);  	int irq = platform_get_irq(pdev, 0); @@ -248,7 +248,7 @@ static struct platform_driver pxa930_trkball_driver = {  		.name	= "pxa930-trkball",  	},  	.probe		= pxa930_trkball_probe, -	.remove		= __devexit_p(pxa930_trkball_remove), +	.remove		= pxa930_trkball_remove,  };  module_platform_driver(pxa930_trkball_driver); diff --git a/drivers/input/mouse/sentelic.c b/drivers/input/mouse/sentelic.c index e582922bacf..cc7e0d4a8f9 100644 --- a/drivers/input/mouse/sentelic.c +++ b/drivers/input/mouse/sentelic.c @@ -791,7 +791,7 @@ static psmouse_ret_t fsp_process_byte(struct psmouse *psmouse)  			fsp_set_slot(dev, 0, fgrs > 0, abs_x, abs_y);  			fsp_set_slot(dev, 1, false, 0, 0);  		} -		if (fgrs > 0) { +		if (fgrs == 1 || (fgrs == 2 && !(packet[0] & FSP_PB0_MFMC_FGR2))) {  			input_report_abs(dev, ABS_X, abs_x);  			input_report_abs(dev, ABS_Y, abs_y);  		} diff --git a/drivers/input/mouse/synaptics_i2c.c b/drivers/input/mouse/synaptics_i2c.c index 063a174d3a8..ad822608f6e 100644 --- a/drivers/input/mouse/synaptics_i2c.c +++ b/drivers/input/mouse/synaptics_i2c.c @@ -535,7 +535,7 @@ static struct synaptics_i2c *synaptics_i2c_touch_create(struct i2c_client *clien  	return touch;  } -static int __devinit synaptics_i2c_probe(struct i2c_client *client, +static int synaptics_i2c_probe(struct i2c_client *client,  			       const struct i2c_device_id *dev_id)  {  	int ret; @@ -601,7 +601,7 @@ err_mem_free:  	return ret;  } -static int __devexit synaptics_i2c_remove(struct i2c_client *client) +static int synaptics_i2c_remove(struct i2c_client *client)  {  	struct synaptics_i2c *touch = i2c_get_clientdata(client); @@ -662,7 +662,7 @@ static struct i2c_driver synaptics_i2c_driver = {  	},  	.probe		= synaptics_i2c_probe, -	.remove		= __devexit_p(synaptics_i2c_remove), +	.remove		= synaptics_i2c_remove,  	.id_table	= synaptics_i2c_id_table,  }; diff --git a/drivers/input/serio/Kconfig b/drivers/input/serio/Kconfig index 55f2c2293ec..4a4e182c33e 100644 --- a/drivers/input/serio/Kconfig +++ b/drivers/input/serio/Kconfig @@ -234,4 +234,13 @@ config SERIO_PS2MULT  	  To compile this driver as a module, choose M here: the  	  module will be called ps2mult. +config SERIO_ARC_PS2 +	tristate "ARC PS/2 support" +	help +	  Say Y here if you have an ARC FPGA platform with a PS/2 +	  controller in it. + +	  To compile this driver as a module, choose M here; the module +	  will be called arc_ps2. +  endif diff --git a/drivers/input/serio/Makefile b/drivers/input/serio/Makefile index dbbe37616c9..4b0c8f84f1c 100644 --- a/drivers/input/serio/Makefile +++ b/drivers/input/serio/Makefile @@ -25,3 +25,4 @@ obj-$(CONFIG_SERIO_RAW)		+= serio_raw.o  obj-$(CONFIG_SERIO_AMS_DELTA)	+= ams_delta_serio.o  obj-$(CONFIG_SERIO_XILINX_XPS_PS2)	+= xilinx_ps2.o  obj-$(CONFIG_SERIO_ALTERA_PS2)	+= altera_ps2.o +obj-$(CONFIG_SERIO_ARC_PS2)	+= arc_ps2.o diff --git a/drivers/input/serio/altera_ps2.c b/drivers/input/serio/altera_ps2.c index cc11f4efe11..479ce5fe895 100644 --- a/drivers/input/serio/altera_ps2.c +++ b/drivers/input/serio/altera_ps2.c @@ -81,7 +81,7 @@ static void altera_ps2_close(struct serio *io)  /*   * Add one device to this driver.   */ -static int __devinit altera_ps2_probe(struct platform_device *pdev) +static int altera_ps2_probe(struct platform_device *pdev)  {  	struct ps2if *ps2if;  	struct serio *serio; @@ -159,7 +159,7 @@ static int __devinit altera_ps2_probe(struct platform_device *pdev)  /*   * Remove one device from this driver.   */ -static int __devexit altera_ps2_remove(struct platform_device *pdev) +static int altera_ps2_remove(struct platform_device *pdev)  {  	struct ps2if *ps2if = platform_get_drvdata(pdev); @@ -187,7 +187,7 @@ MODULE_DEVICE_TABLE(of, altera_ps2_match);   */  static struct platform_driver altera_ps2_driver = {  	.probe		= altera_ps2_probe, -	.remove		= __devexit_p(altera_ps2_remove), +	.remove		= altera_ps2_remove,  	.driver	= {  		.name	= DRV_NAME,  		.owner	= THIS_MODULE, diff --git a/drivers/input/serio/ambakmi.c b/drivers/input/serio/ambakmi.c index 2e77246c2e5..4e2fd44865e 100644 --- a/drivers/input/serio/ambakmi.c +++ b/drivers/input/serio/ambakmi.c @@ -107,7 +107,7 @@ static void amba_kmi_close(struct serio *io)  	clk_disable_unprepare(kmi->clk);  } -static int __devinit amba_kmi_probe(struct amba_device *dev, +static int amba_kmi_probe(struct amba_device *dev,  	const struct amba_id *id)  {  	struct amba_kmi_port *kmi; @@ -163,7 +163,7 @@ static int __devinit amba_kmi_probe(struct amba_device *dev,  	return ret;  } -static int __devexit amba_kmi_remove(struct amba_device *dev) +static int amba_kmi_remove(struct amba_device *dev)  {  	struct amba_kmi_port *kmi = amba_get_drvdata(dev); @@ -204,7 +204,7 @@ static struct amba_driver ambakmi_driver = {  	},  	.id_table	= amba_kmi_idtable,  	.probe		= amba_kmi_probe, -	.remove		= __devexit_p(amba_kmi_remove), +	.remove		= amba_kmi_remove,  	.resume		= amba_kmi_resume,  }; diff --git a/drivers/input/serio/arc_ps2.c b/drivers/input/serio/arc_ps2.c new file mode 100644 index 00000000000..b571eb3e4ef --- /dev/null +++ b/drivers/input/serio/arc_ps2.c @@ -0,0 +1,274 @@ +/* + * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Driver is originally developed by Pavel Sokolov <psokolov@synopsys.com> + */ + +#include <linux/module.h> +#include <linux/interrupt.h> +#include <linux/input.h> +#include <linux/serio.h> +#include <linux/platform_device.h> +#include <linux/io.h> +#include <linux/kernel.h> +#include <linux/slab.h> + +#define ARC_PS2_PORTS                   2 + +#define ARC_ARC_PS2_ID                  0x0001f609 + +#define STAT_TIMEOUT                    128 + +#define PS2_STAT_RX_FRM_ERR             (1) +#define PS2_STAT_RX_BUF_OVER            (1 << 1) +#define PS2_STAT_RX_INT_EN              (1 << 2) +#define PS2_STAT_RX_VAL                 (1 << 3) +#define PS2_STAT_TX_ISNOT_FUL           (1 << 4) +#define PS2_STAT_TX_INT_EN              (1 << 5) + +struct arc_ps2_port { +	void __iomem *data_addr; +	void __iomem *status_addr; +	struct serio *io; +}; + +struct arc_ps2_data { +	struct arc_ps2_port port[ARC_PS2_PORTS]; +	void __iomem *addr; +	unsigned int frame_error; +	unsigned int buf_overflow; +	unsigned int total_int; +}; + +static void arc_ps2_check_rx(struct arc_ps2_data *arc_ps2, +			     struct arc_ps2_port *port) +{ +	unsigned int timeout = 1000; +	unsigned int flag, status; +	unsigned char data; + +	do { +		status = ioread32(port->status_addr); +		if (!(status & PS2_STAT_RX_VAL)) +			return; + +		data = ioread32(port->data_addr) & 0xff; + +		flag = 0; +		arc_ps2->total_int++; +		if (status & PS2_STAT_RX_FRM_ERR) { +			arc_ps2->frame_error++; +			flag |= SERIO_PARITY; +		} else if (status & PS2_STAT_RX_BUF_OVER) { +			arc_ps2->buf_overflow++; +			flag |= SERIO_FRAME; +		} + +		serio_interrupt(port->io, data, flag); +	} while (--timeout); + +	dev_err(&port->io->dev, "PS/2 hardware stuck\n"); +} + +static irqreturn_t arc_ps2_interrupt(int irq, void *dev) +{ +	struct arc_ps2_data *arc_ps2 = dev; +	int i; + +	for (i = 0; i < ARC_PS2_PORTS; i++) +		arc_ps2_check_rx(arc_ps2, &arc_ps2->port[i]); + +	return IRQ_HANDLED; +} + +static int arc_ps2_write(struct serio *io, unsigned char val) +{ +	unsigned status; +	struct arc_ps2_port *port = io->port_data; +	int timeout = STAT_TIMEOUT; + +	do { +		status = ioread32(port->status_addr); +		cpu_relax(); + +		if (status & PS2_STAT_TX_ISNOT_FUL) { +			iowrite32(val & 0xff, port->data_addr); +			return 0; +		} + +	} while (--timeout); + +	dev_err(&io->dev, "write timeout\n"); +	return -ETIMEDOUT; +} + +static int arc_ps2_open(struct serio *io) +{ +	struct arc_ps2_port *port = io->port_data; + +	iowrite32(PS2_STAT_RX_INT_EN, port->status_addr); + +	return 0; +} + +static void arc_ps2_close(struct serio *io) +{ +	struct arc_ps2_port *port = io->port_data; + +	iowrite32(ioread32(port->status_addr) & ~PS2_STAT_RX_INT_EN, +		  port->status_addr); +} + +static void __iomem *arc_ps2_calc_addr(struct arc_ps2_data *arc_ps2, +						  int index, bool status) +{ +	void __iomem *addr; + +	addr = arc_ps2->addr + 4 + 4 * index; +	if (status) +		addr += ARC_PS2_PORTS * 4; + +	return addr; +} + +static void arc_ps2_inhibit_ports(struct arc_ps2_data *arc_ps2) +{ +	void __iomem *addr; +	u32 val; +	int i; + +	for (i = 0; i < ARC_PS2_PORTS; i++) { +		addr = arc_ps2_calc_addr(arc_ps2, i, true); +		val = ioread32(addr); +		val &= ~(PS2_STAT_RX_INT_EN | PS2_STAT_TX_INT_EN); +		iowrite32(val, addr); +	} +} + +static int arc_ps2_create_port(struct platform_device *pdev, +					 struct arc_ps2_data *arc_ps2, +					 int index) +{ +	struct arc_ps2_port *port = &arc_ps2->port[index]; +	struct serio *io; + +	io = kzalloc(sizeof(struct serio), GFP_KERNEL); +	if (!io) +		return -ENOMEM; + +	io->id.type = SERIO_8042; +	io->write = arc_ps2_write; +	io->open = arc_ps2_open; +	io->close = arc_ps2_close; +	snprintf(io->name, sizeof(io->name), "ARC PS/2 port%d", index); +	snprintf(io->phys, sizeof(io->phys), "arc/serio%d", index); +	io->port_data = port; + +	port->io = io; + +	port->data_addr = arc_ps2_calc_addr(arc_ps2, index, false); +	port->status_addr = arc_ps2_calc_addr(arc_ps2, index, true); + +	dev_dbg(&pdev->dev, "port%d is allocated (data = 0x%p, status = 0x%p)\n", +		index, port->data_addr, port->status_addr); + +	serio_register_port(port->io); +	return 0; +} + +static int arc_ps2_probe(struct platform_device *pdev) +{ +	struct arc_ps2_data *arc_ps2; +	struct resource *res; +	int irq; +	int error, id, i; + +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	if (!res) { +		dev_err(&pdev->dev, "no IO memory defined\n"); +		return -EINVAL; +	} + +	irq = platform_get_irq_byname(pdev, "arc_ps2_irq"); +	if (irq < 0) { +		dev_err(&pdev->dev, "no IRQ defined\n"); +		return -EINVAL; +	} + +	arc_ps2 = devm_kzalloc(&pdev->dev, sizeof(struct arc_ps2_data), +				GFP_KERNEL); +	if (!arc_ps2) { +		dev_err(&pdev->dev, "out of memory\n"); +		return -ENOMEM; +	} + +	arc_ps2->addr = devm_request_and_ioremap(&pdev->dev, res); +	if (!arc_ps2->addr) +		return -EBUSY; + +	dev_info(&pdev->dev, "irq = %d, address = 0x%p, ports = %i\n", +		 irq, arc_ps2->addr, ARC_PS2_PORTS); + +	id = ioread32(arc_ps2->addr); +	if (id != ARC_ARC_PS2_ID) { +		dev_err(&pdev->dev, "device id does not match\n"); +		return -ENXIO; +	} + +	arc_ps2_inhibit_ports(arc_ps2); + +	error = devm_request_irq(&pdev->dev, irq, arc_ps2_interrupt, +				 0, "arc_ps2", arc_ps2); +	if (error) { +		dev_err(&pdev->dev, "Could not allocate IRQ\n"); +		return error; +	} + +	for (i = 0; i < ARC_PS2_PORTS; i++) { +		error = arc_ps2_create_port(pdev, arc_ps2, i); +		if (error) { +			while (--i >= 0) +				serio_unregister_port(arc_ps2->port[i].io); +			return error; +		} +	} + +	platform_set_drvdata(pdev, arc_ps2); + +	return 0; +} + +static int arc_ps2_remove(struct platform_device *pdev) +{ +	struct arc_ps2_data *arc_ps2 = platform_get_drvdata(pdev); +	int i; + +	for (i = 0; i < ARC_PS2_PORTS; i++) +		serio_unregister_port(arc_ps2->port[i].io); + +	dev_dbg(&pdev->dev, "interrupt count = %i\n", arc_ps2->total_int); +	dev_dbg(&pdev->dev, "frame error count = %i\n", arc_ps2->frame_error); +	dev_dbg(&pdev->dev, "buffer overflow count = %i\n", +		arc_ps2->buf_overflow); + +	return 0; +} + +static struct platform_driver arc_ps2_driver = { +	.driver	= { +		.name	= "arc_ps2", +		.owner	= THIS_MODULE, +	}, +	.probe	= arc_ps2_probe, +	.remove	= arc_ps2_remove, +}; + +module_platform_driver(arc_ps2_driver); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Pavel Sokolov <psokolov@synopsys.com>"); +MODULE_DESCRIPTION("ARC PS/2 Driver"); diff --git a/drivers/input/serio/ct82c710.c b/drivers/input/serio/ct82c710.c index 85281656724..cfe549d4eaa 100644 --- a/drivers/input/serio/ct82c710.c +++ b/drivers/input/serio/ct82c710.c @@ -175,7 +175,7 @@ static int __init ct82c710_detect(void)  	return 0;  } -static int __devinit ct82c710_probe(struct platform_device *dev) +static int ct82c710_probe(struct platform_device *dev)  {  	ct82c710_port = kzalloc(sizeof(struct serio), GFP_KERNEL);  	if (!ct82c710_port) @@ -199,7 +199,7 @@ static int __devinit ct82c710_probe(struct platform_device *dev)  	return 0;  } -static int __devexit ct82c710_remove(struct platform_device *dev) +static int ct82c710_remove(struct platform_device *dev)  {  	serio_unregister_port(ct82c710_port); @@ -212,7 +212,7 @@ static struct platform_driver ct82c710_driver = {  		.owner	= THIS_MODULE,  	},  	.probe		= ct82c710_probe, -	.remove		= __devexit_p(ct82c710_remove), +	.remove		= ct82c710_remove,  }; diff --git a/drivers/input/serio/gscps2.c b/drivers/input/serio/gscps2.c index 4225f5d6b15..8d9ba0c3827 100644 --- a/drivers/input/serio/gscps2.c +++ b/drivers/input/serio/gscps2.c @@ -327,7 +327,7 @@ static void gscps2_close(struct serio *port)   * @return: success/error report   */ -static int __devinit gscps2_probe(struct parisc_device *dev) +static int gscps2_probe(struct parisc_device *dev)  {  	struct gscps2port *ps2port;  	struct serio *serio; @@ -414,7 +414,7 @@ fail_nomem:   * @return: success/error report   */ -static int __devexit gscps2_remove(struct parisc_device *dev) +static int gscps2_remove(struct parisc_device *dev)  {  	struct gscps2port *ps2port = dev_get_drvdata(&dev->dev); @@ -444,7 +444,7 @@ static struct parisc_driver parisc_ps2_driver = {  	.name		= "gsc_ps2",  	.id_table	= gscps2_device_tbl,  	.probe		= gscps2_probe, -	.remove		= __devexit_p(gscps2_remove), +	.remove		= gscps2_remove,  };  static int __init gscps2_init(void) diff --git a/drivers/input/serio/hil_mlc.c b/drivers/input/serio/hil_mlc.c index bfd3865d886..65605e4ef3c 100644 --- a/drivers/input/serio/hil_mlc.c +++ b/drivers/input/serio/hil_mlc.c @@ -686,13 +686,12 @@ static int hilse_donode(hil_mlc *mlc)  		write_lock_irqsave(&mlc->lock, flags);  		pack = node->object.packet;  	out: -		if (mlc->istarted) -			goto out2; -		/* Prepare to receive input */ -		if ((node + 1)->act & HILSE_IN) -			hilse_setup_input(mlc, node + 1); +		if (!mlc->istarted) { +			/* Prepare to receive input */ +			if ((node + 1)->act & HILSE_IN) +				hilse_setup_input(mlc, node + 1); +		} -	out2:  		write_unlock_irqrestore(&mlc->lock, flags);  		if (down_trylock(&mlc->osem)) { @@ -1010,8 +1009,6 @@ static int __init hil_mlc_init(void)  static void __exit hil_mlc_exit(void)  {  	del_timer_sync(&hil_mlcs_kicker); - -	tasklet_disable(&hil_mlcs_tasklet);  	tasklet_kill(&hil_mlcs_tasklet);  } diff --git a/drivers/input/serio/i8042-io.h b/drivers/input/serio/i8042-io.h index 5d48bb66aa7..a5eed2ade53 100644 --- a/drivers/input/serio/i8042-io.h +++ b/drivers/input/serio/i8042-io.h @@ -76,7 +76,7 @@ static inline int i8042_platform_init(void)  	if (check_legacy_ioport(I8042_DATA_REG))  		return -ENODEV;  #endif -#if !defined(__sh__) && !defined(__alpha__) && !defined(__mips__) +#if !defined(__sh__) && !defined(__alpha__)  	if (!request_region(I8042_DATA_REG, 16, "i8042"))  		return -EBUSY;  #endif diff --git a/drivers/input/serio/i8042-sparcio.h b/drivers/input/serio/i8042-sparcio.h index 395a9af3adc..d6aa4c67dbb 100644 --- a/drivers/input/serio/i8042-sparcio.h +++ b/drivers/input/serio/i8042-sparcio.h @@ -49,7 +49,7 @@ static inline void i8042_write_command(int val)  #define OBP_PS2MS_NAME1		"kdmouse"  #define OBP_PS2MS_NAME2		"mouse" -static int __devinit sparc_i8042_probe(struct platform_device *op) +static int sparc_i8042_probe(struct platform_device *op)  {  	struct device_node *dp = op->dev.of_node; @@ -80,7 +80,7 @@ static int __devinit sparc_i8042_probe(struct platform_device *op)  	return 0;  } -static int __devexit sparc_i8042_remove(struct platform_device *op) +static int sparc_i8042_remove(struct platform_device *op)  {  	of_iounmap(kbd_res, kbd_iobase, 8); @@ -102,7 +102,7 @@ static struct platform_driver sparc_i8042_driver = {  		.of_match_table = sparc_i8042_match,  	},  	.probe		= sparc_i8042_probe, -	.remove		= __devexit_p(sparc_i8042_remove), +	.remove		= sparc_i8042_remove,  };  static int __init i8042_platform_init(void) diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index d6cc77a53c7..5f306f79da0 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h @@ -921,6 +921,7 @@ static int __init i8042_platform_init(void)  	int retval;  #ifdef CONFIG_X86 +	u8 a20_on = 0xdf;  	/* Just return if pre-detection shows no i8042 controller exist */  	if (!x86_platform.i8042_detect())  		return -ENODEV; @@ -960,6 +961,14 @@ static int __init i8042_platform_init(void)  	if (dmi_check_system(i8042_dmi_dritek_table))  		i8042_dritek = true; + +	/* +	 * A20 was already enabled during early kernel init. But some buggy +	 * BIOSes (in MSI Laptops) require A20 to be enabled using 8042 to +	 * resume from S3. So we do it here and hope that nothing breaks. +	 */ +	i8042_command(&a20_on, 0x10d1); +	i8042_command(NULL, 0x00ff);	/* Null command for SMM firmware */  #endif /* CONFIG_X86 */  	return retval; diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c index 86564414b75..78e4de42efa 100644 --- a/drivers/input/serio/i8042.c +++ b/drivers/input/serio/i8042.c @@ -1284,7 +1284,7 @@ static void __init i8042_register_ports(void)  	}  } -static void __devexit i8042_unregister_ports(void) +static void i8042_unregister_ports(void)  {  	int i; @@ -1437,7 +1437,7 @@ static int __init i8042_probe(struct platform_device *dev)  	return error;  } -static int __devexit i8042_remove(struct platform_device *dev) +static int i8042_remove(struct platform_device *dev)  {  	i8042_unregister_ports();  	i8042_free_irqs(); @@ -1455,7 +1455,7 @@ static struct platform_driver i8042_driver = {  		.pm	= &i8042_pm_ops,  #endif  	}, -	.remove		= __devexit_p(i8042_remove), +	.remove		= i8042_remove,  	.shutdown	= i8042_shutdown,  }; diff --git a/drivers/input/serio/maceps2.c b/drivers/input/serio/maceps2.c index 61da763b120..bc85e1cc66d 100644 --- a/drivers/input/serio/maceps2.c +++ b/drivers/input/serio/maceps2.c @@ -116,7 +116,7 @@ static void maceps2_close(struct serio *dev)  } -static struct serio * __devinit maceps2_allocate_port(int idx) +static struct serio *maceps2_allocate_port(int idx)  {  	struct serio *serio; @@ -135,7 +135,7 @@ static struct serio * __devinit maceps2_allocate_port(int idx)  	return serio;  } -static int __devinit maceps2_probe(struct platform_device *dev) +static int maceps2_probe(struct platform_device *dev)  {  	maceps2_port[0] = maceps2_allocate_port(0);  	maceps2_port[1] = maceps2_allocate_port(1); @@ -151,7 +151,7 @@ static int __devinit maceps2_probe(struct platform_device *dev)  	return 0;  } -static int __devexit maceps2_remove(struct platform_device *dev) +static int maceps2_remove(struct platform_device *dev)  {  	serio_unregister_port(maceps2_port[0]);  	serio_unregister_port(maceps2_port[1]); @@ -165,7 +165,7 @@ static struct platform_driver maceps2_driver = {  		.owner	= THIS_MODULE,  	},  	.probe		= maceps2_probe, -	.remove		= __devexit_p(maceps2_remove), +	.remove		= maceps2_remove,  };  static int __init maceps2_init(void) diff --git a/drivers/input/serio/pcips2.c b/drivers/input/serio/pcips2.c index 0c42497aaaf..76f83836fd5 100644 --- a/drivers/input/serio/pcips2.c +++ b/drivers/input/serio/pcips2.c @@ -127,7 +127,7 @@ static void pcips2_close(struct serio *io)  	free_irq(ps2if->dev->irq, ps2if);  } -static int __devinit pcips2_probe(struct pci_dev *dev, const struct pci_device_id *id) +static int pcips2_probe(struct pci_dev *dev, const struct pci_device_id *id)  {  	struct pcips2_data *ps2if;  	struct serio *serio; @@ -176,7 +176,7 @@ static int __devinit pcips2_probe(struct pci_dev *dev, const struct pci_device_i  	return ret;  } -static void __devexit pcips2_remove(struct pci_dev *dev) +static void pcips2_remove(struct pci_dev *dev)  {  	struct pcips2_data *ps2if = pci_get_drvdata(dev); @@ -212,7 +212,7 @@ static struct pci_driver pcips2_driver = {  	.name			= "pcips2",  	.id_table		= pcips2_ids,  	.probe			= pcips2_probe, -	.remove			= __devexit_p(pcips2_remove), +	.remove			= pcips2_remove,  };  module_pci_driver(pcips2_driver); diff --git a/drivers/input/serio/q40kbd.c b/drivers/input/serio/q40kbd.c index 0c0df7f7380..70fe542839f 100644 --- a/drivers/input/serio/q40kbd.c +++ b/drivers/input/serio/q40kbd.c @@ -122,7 +122,7 @@ static void q40kbd_close(struct serio *port)  	q40kbd_flush(q40kbd);  } -static int __devinit q40kbd_probe(struct platform_device *pdev) +static int q40kbd_probe(struct platform_device *pdev)  {  	struct q40kbd *q40kbd;  	struct serio *port; @@ -168,7 +168,7 @@ err_free_mem:  	return error;  } -static int __devexit q40kbd_remove(struct platform_device *pdev) +static int q40kbd_remove(struct platform_device *pdev)  {  	struct q40kbd *q40kbd = platform_get_drvdata(pdev); @@ -190,7 +190,7 @@ static struct platform_driver q40kbd_driver = {  		.name	= "q40kbd",  		.owner	= THIS_MODULE,  	}, -	.remove		= __devexit_p(q40kbd_remove), +	.remove		= q40kbd_remove,  };  static int __init q40kbd_init(void) diff --git a/drivers/input/serio/rpckbd.c b/drivers/input/serio/rpckbd.c index 2af5df6a8fb..567566ae0da 100644 --- a/drivers/input/serio/rpckbd.c +++ b/drivers/input/serio/rpckbd.c @@ -114,7 +114,7 @@ static void rpckbd_close(struct serio *port)   * Allocate and initialize serio structure for subsequent registration   * with serio core.   */ -static int __devinit rpckbd_probe(struct platform_device *dev) +static int rpckbd_probe(struct platform_device *dev)  {  	struct rpckbd_data *rpckbd;  	struct serio *serio; @@ -153,7 +153,7 @@ static int __devinit rpckbd_probe(struct platform_device *dev)  	return 0;  } -static int __devexit rpckbd_remove(struct platform_device *dev) +static int rpckbd_remove(struct platform_device *dev)  {  	struct serio *serio = platform_get_drvdata(dev);  	struct rpckbd_data *rpckbd = serio->port_data; @@ -166,7 +166,7 @@ static int __devexit rpckbd_remove(struct platform_device *dev)  static struct platform_driver rpckbd_driver = {  	.probe		= rpckbd_probe, -	.remove		= __devexit_p(rpckbd_remove), +	.remove		= rpckbd_remove,  	.driver		= {  		.name	= "kart",  		.owner	= THIS_MODULE, diff --git a/drivers/input/serio/sa1111ps2.c b/drivers/input/serio/sa1111ps2.c index 38976670753..b3e688911fd 100644 --- a/drivers/input/serio/sa1111ps2.c +++ b/drivers/input/serio/sa1111ps2.c @@ -193,7 +193,7 @@ static void ps2_close(struct serio *io)  /*   * Clear the input buffer.   */ -static void __devinit ps2_clear_input(struct ps2if *ps2if) +static void ps2_clear_input(struct ps2if *ps2if)  {  	int maxread = 100; @@ -203,7 +203,7 @@ static void __devinit ps2_clear_input(struct ps2if *ps2if)  	}  } -static unsigned int __devinit ps2_test_one(struct ps2if *ps2if, +static unsigned int ps2_test_one(struct ps2if *ps2if,  					   unsigned int mask)  {  	unsigned int val; @@ -220,7 +220,7 @@ static unsigned int __devinit ps2_test_one(struct ps2if *ps2if,   * Test the keyboard interface.  We basically check to make sure that   * we can drive each line to the keyboard independently of each other.   */ -static int __devinit ps2_test(struct ps2if *ps2if) +static int ps2_test(struct ps2if *ps2if)  {  	unsigned int stat;  	int ret = 0; @@ -251,7 +251,7 @@ static int __devinit ps2_test(struct ps2if *ps2if)  /*   * Add one device to this driver.   */ -static int __devinit ps2_probe(struct sa1111_dev *dev) +static int ps2_probe(struct sa1111_dev *dev)  {  	struct ps2if *ps2if;  	struct serio *serio; @@ -334,7 +334,7 @@ static int __devinit ps2_probe(struct sa1111_dev *dev)  /*   * Remove one device from this driver.   */ -static int __devexit ps2_remove(struct sa1111_dev *dev) +static int ps2_remove(struct sa1111_dev *dev)  {  	struct ps2if *ps2if = sa1111_get_drvdata(dev); @@ -357,7 +357,7 @@ static struct sa1111_driver ps2_driver = {  	},  	.devid		= SA1111_DEVID_PS2,  	.probe		= ps2_probe, -	.remove		= __devexit_p(ps2_remove), +	.remove		= ps2_remove,  };  static int __init ps2_init(void) diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c index d0f7533dbf8..25fc5971f42 100644 --- a/drivers/input/serio/serio.c +++ b/drivers/input/serio/serio.c @@ -891,8 +891,6 @@ static int serio_bus_match(struct device *dev, struct device_driver *drv)  	return serio_match_port(serio_drv->id_table, serio);  } -#ifdef CONFIG_HOTPLUG -  #define SERIO_ADD_UEVENT_VAR(fmt, val...)				\  	do {								\  		int err = add_uevent_var(env, fmt, val);		\ @@ -920,15 +918,6 @@ static int serio_uevent(struct device *dev, struct kobj_uevent_env *env)  }  #undef SERIO_ADD_UEVENT_VAR -#else - -static int serio_uevent(struct device *dev, struct kobj_uevent_env *env) -{ -	return -ENODEV; -} - -#endif /* CONFIG_HOTPLUG */ -  #ifdef CONFIG_PM  static int serio_suspend(struct device *dev)  { diff --git a/drivers/input/serio/xilinx_ps2.c b/drivers/input/serio/xilinx_ps2.c index 1e983bec7d8..17be85948ff 100644 --- a/drivers/input/serio/xilinx_ps2.c +++ b/drivers/input/serio/xilinx_ps2.c @@ -233,7 +233,7 @@ static void sxps2_close(struct serio *pserio)   * It returns 0, if the driver is bound to the PS/2 device, or a negative   * value if there is an error.   */ -static int __devinit xps2_of_probe(struct platform_device *ofdev) +static int xps2_of_probe(struct platform_device *ofdev)  {  	struct resource r_irq; /* Interrupt resources */  	struct resource r_mem; /* IO mem resources */ @@ -333,7 +333,7 @@ failed1:   * if the driver module is being unloaded. It frees any resources allocated to   * the device.   */ -static int __devexit xps2_of_remove(struct platform_device *of_dev) +static int xps2_of_remove(struct platform_device *of_dev)  {  	struct xps2data *drvdata = platform_get_drvdata(of_dev);  	struct resource r_mem; /* IO mem resources */ @@ -355,7 +355,7 @@ static int __devexit xps2_of_remove(struct platform_device *of_dev)  }  /* Match table for of_platform binding */ -static const struct of_device_id xps2_of_match[] __devinitconst = { +static const struct of_device_id xps2_of_match[] = {  	{ .compatible = "xlnx,xps-ps2-1.00.a", },  	{ /* end of list */ },  }; @@ -368,7 +368,7 @@ static struct platform_driver xps2_of_driver = {  		.of_match_table = xps2_of_match,  	},  	.probe		= xps2_of_probe, -	.remove		= __devexit_p(xps2_of_remove), +	.remove		= xps2_of_remove,  };  module_platform_driver(xps2_of_driver); diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c index 858ad446de9..f92d34f45a1 100644 --- a/drivers/input/tablet/wacom_sys.c +++ b/drivers/input/tablet/wacom_sys.c @@ -386,23 +386,40 @@ static int wacom_parse_hid(struct usb_interface *intf,  				if (usage == WCM_DESKTOP) {  					if (finger) {  						features->device_type = BTN_TOOL_FINGER; -						if (features->type == TABLETPC2FG) { -							/* need to reset back */ + +						switch (features->type) { +						case TABLETPC2FG:  							features->pktlen = WACOM_PKGLEN_TPC2FG; -						} +							break; -						if (features->type == MTSCREEN || features->type == WACOM_24HDT) +						case MTSCREEN: +						case WACOM_24HDT:  							features->pktlen = WACOM_PKGLEN_MTOUCH; +							break; -						if (features->type == BAMBOO_PT) { -							/* need to reset back */ +						case MTTPC: +							features->pktlen = WACOM_PKGLEN_MTTPC; +							break; + +						case BAMBOO_PT:  							features->pktlen = WACOM_PKGLEN_BBTOUCH; +							break; + +						default: +							features->pktlen = WACOM_PKGLEN_GRAPHIRE; +							break; +						} + +						switch (features->type) { +						case BAMBOO_PT:  							features->x_phy =  								get_unaligned_le16(&report[i + 5]);  							features->x_max =  								get_unaligned_le16(&report[i + 8]);  							i += 15; -						} else if (features->type == WACOM_24HDT) { +							break; + +						case WACOM_24HDT:  							features->x_max =  								get_unaligned_le16(&report[i + 3]);  							features->x_phy = @@ -410,7 +427,9 @@ static int wacom_parse_hid(struct usb_interface *intf,  							features->unit = report[i - 1];  							features->unitExpo = report[i - 3];  							i += 12; -						} else { +							break; + +						default:  							features->x_max =  								get_unaligned_le16(&report[i + 3]);  							features->x_phy = @@ -418,10 +437,11 @@ static int wacom_parse_hid(struct usb_interface *intf,  							features->unit = report[i + 9];  							features->unitExpo = report[i + 11];  							i += 12; +							break;  						}  					} else if (pen) {  						/* penabled only accepts exact bytes of data */ -						if (features->type == TABLETPC2FG) +						if (features->type >= TABLETPC)  							features->pktlen = WACOM_PKGLEN_GRAPHIRE;  						features->device_type = BTN_TOOL_PEN;  						features->x_max = @@ -434,32 +454,40 @@ static int wacom_parse_hid(struct usb_interface *intf,  			case HID_USAGE_Y:  				if (usage == WCM_DESKTOP) {  					if (finger) { -						int type = features->type; - -						if (type == TABLETPC2FG || type == MTSCREEN) { +						switch (features->type) { +						case TABLETPC2FG: +						case MTSCREEN: +						case MTTPC:  							features->y_max =  								get_unaligned_le16(&report[i + 3]);  							features->y_phy =  								get_unaligned_le16(&report[i + 6]);  							i += 7; -						} else if (type == WACOM_24HDT) { +							break; + +						case WACOM_24HDT:  							features->y_max =  								get_unaligned_le16(&report[i + 3]);  							features->y_phy =  								get_unaligned_le16(&report[i - 2]);  							i += 7; -						} else if (type == BAMBOO_PT) { +							break; + +						case BAMBOO_PT:  							features->y_phy =  								get_unaligned_le16(&report[i + 3]);  							features->y_max =  								get_unaligned_le16(&report[i + 6]);  							i += 12; -						} else { +							break; + +						default:  							features->y_max =  								features->x_max;  							features->y_phy =  								get_unaligned_le16(&report[i + 3]);  							i += 4; +							break;  						}  					} else if (pen) {  						features->y_max = diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c index 0a67031ffc1..264138f3217 100644 --- a/drivers/input/tablet/wacom_wac.c +++ b/drivers/input/tablet/wacom_wac.c @@ -467,9 +467,7 @@ static void wacom_intuos_general(struct wacom_wac *wacom)  	/* general pen packet */  	if ((data[1] & 0xb8) == 0xa0) {  		t = (data[6] << 2) | ((data[7] >> 6) & 3); -		if ((features->type >= INTUOS4S && features->type <= INTUOS4L) || -                    (features->type >= INTUOS5S && features->type <= INTUOS5L) || -		    (features->type >= WACOM_21UX2 && features->type <= WACOM_24HD)) { +		if (features->type >= INTUOS4S && features->type <= WACOM_24HD) {  			t = (t << 1) | (data[1] & 1);  		}  		input_report_abs(input, ABS_PRESSURE, t); @@ -877,6 +875,11 @@ static int wacom_mt_touch(struct wacom_wac *wacom)  	int i;  	int current_num_contacts = data[2];  	int contacts_to_send = 0; +	int x_offset = 0; + +	/* MTTPC does not support Height and Width */ +	if (wacom->features.type == MTTPC) +		x_offset = -4;  	/*  	 * First packet resets the counter since only the first @@ -889,7 +892,7 @@ static int wacom_mt_touch(struct wacom_wac *wacom)  	contacts_to_send = min(5, wacom->num_contacts_left);  	for (i = 0; i < contacts_to_send; i++) { -		int offset = (WACOM_BYTES_PER_MT_PACKET * i) + 3; +		int offset = (WACOM_BYTES_PER_MT_PACKET + x_offset) * i + 3;  		bool touch = data[offset] & 0x1;  		int id = le16_to_cpup((__le16 *)&data[offset + 1]);  		int slot = find_slot_from_contactid(wacom, id); @@ -900,8 +903,8 @@ static int wacom_mt_touch(struct wacom_wac *wacom)  		input_mt_slot(input, slot);  		input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);  		if (touch) { -			int x = le16_to_cpup((__le16 *)&data[offset + 7]); -			int y = le16_to_cpup((__le16 *)&data[offset + 9]); +			int x = le16_to_cpup((__le16 *)&data[offset + x_offset + 7]); +			int y = le16_to_cpup((__le16 *)&data[offset + x_offset + 9]);  			input_report_abs(input, ABS_MT_POSITION_X, x);  			input_report_abs(input, ABS_MT_POSITION_Y, y);  		} @@ -1336,6 +1339,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)  	case TABLETPCE:  	case TABLETPC2FG:  	case MTSCREEN: +	case MTTPC:  		sync = wacom_tpc_irq(wacom_wac, len);  		break; @@ -1657,6 +1661,7 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev,  		/* fall through */  	case MTSCREEN: +	case MTTPC:  		if (features->device_type == BTN_TOOL_FINGER) {  			wacom_wac->slots = kmalloc(features->touch_max *  							sizeof(int), @@ -2018,6 +2023,15 @@ static const struct wacom_features wacom_features_0xED =  static const struct wacom_features wacom_features_0xEF =  	{ "Wacom ISDv4 EF",       WACOM_PKGLEN_GRAPHIRE,  26202, 16325,  255,  	  0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x100 = +	{ "Wacom ISDv4 100",      WACOM_PKGLEN_MTTPC,     26202, 16325,  255, +	  0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x101 = +	{ "Wacom ISDv4 101",      WACOM_PKGLEN_MTTPC,     26202, 16325,  255, +	  0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x4001 = +	{ "Wacom ISDv4 4001",      WACOM_PKGLEN_MTTPC,     26202, 16325,  255, +	  0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };  static const struct wacom_features wacom_features_0x47 =  	{ "Wacom Intuos2 6x8",    WACOM_PKGLEN_INTUOS,    20320, 16240, 1023,  	  31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; @@ -2034,7 +2048,8 @@ static const struct wacom_features wacom_features_0xD1 =  	  .touch_max = 2 };  static const struct wacom_features wacom_features_0xD2 =  	{ "Wacom Bamboo Craft",   WACOM_PKGLEN_BBFUN,     14720,  9200, 1023, -	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, +	  .touch_max = 2 };  static const struct wacom_features wacom_features_0xD3 =  	{ "Wacom Bamboo 2FG 6x8", WACOM_PKGLEN_BBFUN,     21648, 13700, 1023,  	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, @@ -2194,6 +2209,9 @@ const struct usb_device_id wacom_ids[] = {  	{ USB_DEVICE_WACOM(0xEC) },  	{ USB_DEVICE_WACOM(0xED) },  	{ USB_DEVICE_WACOM(0xEF) }, +	{ USB_DEVICE_WACOM(0x100) }, +	{ USB_DEVICE_WACOM(0x101) }, +	{ USB_DEVICE_WACOM(0x4001) },  	{ USB_DEVICE_WACOM(0x47) },  	{ USB_DEVICE_WACOM(0xF4) },  	{ USB_DEVICE_WACOM(0xF8) }, diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h index 345f1e76975..9396d7769f8 100644 --- a/drivers/input/tablet/wacom_wac.h +++ b/drivers/input/tablet/wacom_wac.h @@ -26,6 +26,7 @@  #define WACOM_PKGLEN_BBPEN	10  #define WACOM_PKGLEN_WIRELESS	32  #define WACOM_PKGLEN_MTOUCH	62 +#define WACOM_PKGLEN_MTTPC	40  /* wacom data size per MT contact */  #define WACOM_BYTES_PER_MT_PACKET	11 @@ -88,6 +89,7 @@ enum {  	TABLETPCE,  	TABLETPC2FG,  	MTSCREEN, +	MTTPC,  	MAX_TYPE  }; diff --git a/drivers/input/touchscreen/88pm860x-ts.c b/drivers/input/touchscreen/88pm860x-ts.c index 326218dbd6e..c7068942ebe 100644 --- a/drivers/input/touchscreen/88pm860x-ts.c +++ b/drivers/input/touchscreen/88pm860x-ts.c @@ -115,7 +115,7 @@ static void pm860x_touch_close(struct input_dev *dev)  }  #ifdef CONFIG_OF -static int __devinit pm860x_touch_dt_init(struct platform_device *pdev, +static int pm860x_touch_dt_init(struct platform_device *pdev,  					  struct pm860x_chip *chip,  					  int *res_x)  { @@ -169,7 +169,7 @@ static int __devinit pm860x_touch_dt_init(struct platform_device *pdev,  #define pm860x_touch_dt_init(x, y, z)	(-1)  #endif -static int __devinit pm860x_touch_probe(struct platform_device *pdev) +static int pm860x_touch_probe(struct platform_device *pdev)  {  	struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent);  	struct pm860x_touch_pdata *pdata = pdev->dev.platform_data; @@ -293,7 +293,7 @@ out:  	return ret;  } -static int __devexit pm860x_touch_remove(struct platform_device *pdev) +static int pm860x_touch_remove(struct platform_device *pdev)  {  	struct pm860x_touch *touch = platform_get_drvdata(pdev); @@ -310,7 +310,7 @@ static struct platform_driver pm860x_touch_driver = {  		.owner	= THIS_MODULE,  	},  	.probe	= pm860x_touch_probe, -	.remove	= __devexit_p(pm860x_touch_remove), +	.remove	= pm860x_touch_remove,  };  module_platform_driver(pm860x_touch_driver); diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index 0c45caddd41..515cfe79054 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig @@ -111,18 +111,6 @@ config TOUCHSCREEN_AUO_PIXCIR  	  To compile this driver as a module, choose M here: the  	  module will be called auo-pixcir-ts. -config TOUCHSCREEN_BITSY -	tristate "Compaq iPAQ H3600 (Bitsy) touchscreen" -	depends on SA1100_BITSY -	select SERIO -	help -	  Say Y here if you have the h3600 (Bitsy) touchscreen. - -	  If unsure, say N. - -	  To compile this driver as a module, choose M here: the -	  module will be called h3600_ts_input. -  config TOUCHSCREEN_BU21013  	tristate "BU21013 based touch panel controllers"  	depends on I2C diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile index 7c4c78ebe49..6bfbeab67c9 100644 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -15,7 +15,6 @@ obj-$(CONFIG_TOUCHSCREEN_ADS7846)	+= ads7846.o  obj-$(CONFIG_TOUCHSCREEN_ATMEL_MXT)	+= atmel_mxt_ts.o  obj-$(CONFIG_TOUCHSCREEN_ATMEL_TSADCC)	+= atmel_tsadcc.o  obj-$(CONFIG_TOUCHSCREEN_AUO_PIXCIR)	+= auo-pixcir-ts.o -obj-$(CONFIG_TOUCHSCREEN_BITSY)		+= h3600_ts_input.o  obj-$(CONFIG_TOUCHSCREEN_BU21013)	+= bu21013_ts.o  obj-$(CONFIG_TOUCHSCREEN_CY8CTMG110)	+= cy8ctmg110_ts.o  obj-$(CONFIG_TOUCHSCREEN_CYTTSP_CORE)	+= cyttsp_core.o diff --git a/drivers/input/touchscreen/ad7877.c b/drivers/input/touchscreen/ad7877.c index 2c7692108e6..23fa829b869 100644 --- a/drivers/input/touchscreen/ad7877.c +++ b/drivers/input/touchscreen/ad7877.c @@ -682,7 +682,7 @@ static void ad7877_setup_ts_def_msg(struct spi_device *spi, struct ad7877 *ts)  	}  } -static int __devinit ad7877_probe(struct spi_device *spi) +static int ad7877_probe(struct spi_device *spi)  {  	struct ad7877			*ts;  	struct input_dev		*input_dev; @@ -810,7 +810,7 @@ err_free_mem:  	return err;  } -static int __devexit ad7877_remove(struct spi_device *spi) +static int ad7877_remove(struct spi_device *spi)  {  	struct ad7877 *ts = dev_get_drvdata(&spi->dev); @@ -857,7 +857,7 @@ static struct spi_driver ad7877_driver = {  		.pm	= &ad7877_pm,  	},  	.probe		= ad7877_probe, -	.remove		= __devexit_p(ad7877_remove), +	.remove		= ad7877_remove,  };  module_spi_driver(ad7877_driver); diff --git a/drivers/input/touchscreen/ad7879-i2c.c b/drivers/input/touchscreen/ad7879-i2c.c index 3054354d0dd..dcf39077154 100644 --- a/drivers/input/touchscreen/ad7879-i2c.c +++ b/drivers/input/touchscreen/ad7879-i2c.c @@ -54,7 +54,7 @@ static const struct ad7879_bus_ops ad7879_i2c_bus_ops = {  	.write		= ad7879_i2c_write,  }; -static int __devinit ad7879_i2c_probe(struct i2c_client *client, +static int ad7879_i2c_probe(struct i2c_client *client,  				      const struct i2c_device_id *id)  {  	struct ad7879 *ts; @@ -75,7 +75,7 @@ static int __devinit ad7879_i2c_probe(struct i2c_client *client,  	return 0;  } -static int __devexit ad7879_i2c_remove(struct i2c_client *client) +static int ad7879_i2c_remove(struct i2c_client *client)  {  	struct ad7879 *ts = i2c_get_clientdata(client); @@ -98,7 +98,7 @@ static struct i2c_driver ad7879_i2c_driver = {  		.pm	= &ad7879_pm_ops,  	},  	.probe		= ad7879_i2c_probe, -	.remove		= __devexit_p(ad7879_i2c_remove), +	.remove		= ad7879_i2c_remove,  	.id_table	= ad7879_id,  }; diff --git a/drivers/input/touchscreen/ad7879-spi.c b/drivers/input/touchscreen/ad7879-spi.c index db49abf056b..606da5bd611 100644 --- a/drivers/input/touchscreen/ad7879-spi.c +++ b/drivers/input/touchscreen/ad7879-spi.c @@ -110,7 +110,7 @@ static const struct ad7879_bus_ops ad7879_spi_bus_ops = {  	.write		= ad7879_spi_write,  }; -static int __devinit ad7879_spi_probe(struct spi_device *spi) +static int ad7879_spi_probe(struct spi_device *spi)  {  	struct ad7879 *ts;  	int err; @@ -137,7 +137,7 @@ static int __devinit ad7879_spi_probe(struct spi_device *spi)  	return 0;  } -static int __devexit ad7879_spi_remove(struct spi_device *spi) +static int ad7879_spi_remove(struct spi_device *spi)  {  	struct ad7879 *ts = spi_get_drvdata(spi); @@ -154,7 +154,7 @@ static struct spi_driver ad7879_spi_driver = {  		.pm	= &ad7879_pm_ops,  	},  	.probe		= ad7879_spi_probe, -	.remove		= __devexit_p(ad7879_spi_remove), +	.remove		= ad7879_spi_remove,  };  module_spi_driver(ad7879_spi_driver); diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c index 78e5d9ab0ba..4f702b3ec1a 100644 --- a/drivers/input/touchscreen/ads7846.c +++ b/drivers/input/touchscreen/ads7846.c @@ -955,7 +955,7 @@ static int ads7846_resume(struct device *dev)  static SIMPLE_DEV_PM_OPS(ads7846_pm, ads7846_suspend, ads7846_resume); -static int __devinit ads7846_setup_pendown(struct spi_device *spi, +static int ads7846_setup_pendown(struct spi_device *spi,  					   struct ads7846 *ts)  {  	struct ads7846_platform_data *pdata = spi->dev.platform_data; @@ -997,7 +997,7 @@ static int __devinit ads7846_setup_pendown(struct spi_device *spi,   * Set up the transfers to read touchscreen state; this assumes we   * use formula #2 for pressure, not #3.   */ -static void __devinit ads7846_setup_spi_msg(struct ads7846 *ts, +static void ads7846_setup_spi_msg(struct ads7846 *ts,  				const struct ads7846_platform_data *pdata)  {  	struct spi_message *m = &ts->msg[0]; @@ -1196,7 +1196,7 @@ static void __devinit ads7846_setup_spi_msg(struct ads7846 *ts,  	spi_message_add_tail(x, m);  } -static int __devinit ads7846_probe(struct spi_device *spi) +static int ads7846_probe(struct spi_device *spi)  {  	struct ads7846 *ts;  	struct ads7846_packet *packet; @@ -1390,7 +1390,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)  	return err;  } -static int __devexit ads7846_remove(struct spi_device *spi) +static int ads7846_remove(struct spi_device *spi)  {  	struct ads7846 *ts = dev_get_drvdata(&spi->dev); @@ -1434,7 +1434,7 @@ static struct spi_driver ads7846_driver = {  		.pm	= &ads7846_pm,  	},  	.probe		= ads7846_probe, -	.remove		= __devexit_p(ads7846_remove), +	.remove		= ads7846_remove,  };  module_spi_driver(ads7846_driver); diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c index 1df2396af00..d04f810cb1d 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -1095,7 +1095,7 @@ static void mxt_input_close(struct input_dev *dev)  	mxt_stop(data);  } -static int __devinit mxt_probe(struct i2c_client *client, +static int mxt_probe(struct i2c_client *client,  		const struct i2c_device_id *id)  {  	const struct mxt_platform_data *pdata = client->dev.platform_data; @@ -1200,7 +1200,7 @@ err_free_mem:  	return error;  } -static int __devexit mxt_remove(struct i2c_client *client) +static int mxt_remove(struct i2c_client *client)  {  	struct mxt_data *data = i2c_get_clientdata(client); @@ -1270,7 +1270,7 @@ static struct i2c_driver mxt_driver = {  		.pm	= &mxt_pm_ops,  	},  	.probe		= mxt_probe, -	.remove		= __devexit_p(mxt_remove), +	.remove		= mxt_remove,  	.id_table	= mxt_id,  }; diff --git a/drivers/input/touchscreen/atmel_tsadcc.c b/drivers/input/touchscreen/atmel_tsadcc.c index ea392ee138e..95f6785a94b 100644 --- a/drivers/input/touchscreen/atmel_tsadcc.c +++ b/drivers/input/touchscreen/atmel_tsadcc.c @@ -177,7 +177,7 @@ static irqreturn_t atmel_tsadcc_interrupt(int irq, void *dev)   * The functions for inserting/removing us as a module.   */ -static int __devinit atmel_tsadcc_probe(struct platform_device *pdev) +static int atmel_tsadcc_probe(struct platform_device *pdev)  {  	struct atmel_tsadcc	*ts_dev;  	struct input_dev	*input_dev; @@ -323,7 +323,7 @@ err_free_mem:  	return err;  } -static int __devexit atmel_tsadcc_remove(struct platform_device *pdev) +static int atmel_tsadcc_remove(struct platform_device *pdev)  {  	struct atmel_tsadcc *ts_dev = dev_get_drvdata(&pdev->dev);  	struct resource *res; @@ -346,7 +346,7 @@ static int __devexit atmel_tsadcc_remove(struct platform_device *pdev)  static struct platform_driver atmel_tsadcc_driver = {  	.probe		= atmel_tsadcc_probe, -	.remove		= __devexit_p(atmel_tsadcc_remove), +	.remove		= atmel_tsadcc_remove,  	.driver		= {  		.name	= "atmel_tsadcc",  	}, diff --git a/drivers/input/touchscreen/auo-pixcir-ts.c b/drivers/input/touchscreen/auo-pixcir-ts.c index c7047b6bb02..c6e19a96348 100644 --- a/drivers/input/touchscreen/auo-pixcir-ts.c +++ b/drivers/input/touchscreen/auo-pixcir-ts.c @@ -286,7 +286,7 @@ static int auo_pixcir_power_mode(struct auo_pixcir_ts *ts, int mode)  	return 0;  } -static __devinit int auo_pixcir_int_config(struct auo_pixcir_ts *ts, +static int auo_pixcir_int_config(struct auo_pixcir_ts *ts,  					   int int_setting)  {  	struct i2c_client *client = ts->client; @@ -482,7 +482,7 @@ unlock:  static SIMPLE_DEV_PM_OPS(auo_pixcir_pm_ops, auo_pixcir_suspend,  			 auo_pixcir_resume); -static int __devinit auo_pixcir_probe(struct i2c_client *client, +static int auo_pixcir_probe(struct i2c_client *client,  				      const struct i2c_device_id *id)  {  	const struct auo_pixcir_ts_platdata *pdata = client->dev.platform_data; @@ -599,7 +599,7 @@ err_gpio_int:  	return ret;  } -static int __devexit auo_pixcir_remove(struct i2c_client *client) +static int auo_pixcir_remove(struct i2c_client *client)  {  	struct auo_pixcir_ts *ts = i2c_get_clientdata(client);  	const struct auo_pixcir_ts_platdata *pdata = client->dev.platform_data; @@ -631,7 +631,7 @@ static struct i2c_driver auo_pixcir_driver = {  		.pm	= &auo_pixcir_pm_ops,  	},  	.probe		= auo_pixcir_probe, -	.remove		= __devexit_p(auo_pixcir_remove), +	.remove		= auo_pixcir_remove,  	.id_table	= auo_pixcir_idtable,  }; diff --git a/drivers/input/touchscreen/bu21013_ts.c b/drivers/input/touchscreen/bu21013_ts.c index 5c487d23f11..b9b5ddad665 100644 --- a/drivers/input/touchscreen/bu21013_ts.c +++ b/drivers/input/touchscreen/bu21013_ts.c @@ -14,6 +14,9 @@  #include <linux/slab.h>  #include <linux/regulator/consumer.h>  #include <linux/module.h> +#include <linux/gpio.h> +#include <linux/of.h> +#include <linux/of_gpio.h>  #define PEN_DOWN_INTR	0  #define MAX_FINGERS	2 @@ -148,11 +151,12 @@  struct bu21013_ts_data {  	struct i2c_client *client;  	wait_queue_head_t wait; -	bool touch_stopped;  	const struct bu21013_platform_device *chip;  	struct input_dev *in_dev; -	unsigned int intr_pin;  	struct regulator *regulator; +	unsigned int irq; +	unsigned int intr_pin; +	bool touch_stopped;  };  /** @@ -262,7 +266,7 @@ static irqreturn_t bu21013_gpio_irq(int irq, void *device_data)  			return IRQ_NONE;  		} -		data->intr_pin = data->chip->irq_read_val(); +		data->intr_pin = gpio_get_value(data->chip->touch_pin);  		if (data->intr_pin == PEN_DOWN_INTR)  			wait_event_timeout(data->wait, data->touch_stopped,  					   msecs_to_jiffies(2)); @@ -418,8 +422,70 @@ static void bu21013_free_irq(struct bu21013_ts_data *bu21013_data)  {  	bu21013_data->touch_stopped = true;  	wake_up(&bu21013_data->wait); -	free_irq(bu21013_data->chip->irq, bu21013_data); +	free_irq(bu21013_data->irq, bu21013_data); +} + +/** + * bu21013_cs_disable() - deconfigures the touch panel controller + * @bu21013_data: device structure pointer + * + * This function is used to deconfigure the chip selection + * for touch panel controller. + */ +static void bu21013_cs_disable(struct bu21013_ts_data *bu21013_data) +{ +	int error; + +	error = gpio_direction_output(bu21013_data->chip->cs_pin, 0); +	if (error < 0) +		dev_warn(&bu21013_data->client->dev, +			 "%s: gpio direction failed, error: %d\n", +			 __func__, error); +	else +		gpio_set_value(bu21013_data->chip->cs_pin, 0); + +	gpio_free(bu21013_data->chip->cs_pin); +} + +#ifdef CONFIG_OF +static const struct bu21013_platform_device * +bu21013_parse_dt(struct device *dev) +{ +	struct device_node *np = dev->of_node; +	struct bu21013_platform_device *pdata; + +	if (!np) { +		dev_err(dev, "no device tree or platform data\n"); +		return ERR_PTR(-EINVAL); +	} + +	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); +	if (!pdata) +		return ERR_PTR(-ENOMEM); + +	pdata->y_flip = pdata->x_flip = false; + +	pdata->x_flip = of_property_read_bool(np, "rohm,flip-x"); +	pdata->y_flip = of_property_read_bool(np, "rohm,flip-y"); + +	of_property_read_u32(np, "rohm,touch-max-x", &pdata->touch_x_max); +	of_property_read_u32(np, "rohm,touch-max-y", &pdata->touch_y_max); + +	pdata->touch_pin = of_get_named_gpio(np, "touch-gpio", 0); +	pdata->cs_pin = of_get_named_gpio(np, "reset-gpio", 0); + +	pdata->ext_clk = false; + +	return pdata;  } +#else +static inline const struct bu21013_platform_device * +bu21013_parse_dt(struct device *dev) +{ +	dev_err(dev, "no platform data available\n"); +	return ERR_PTR(-EINVAL); +} +#endif  /**   * bu21013_probe() - initializes the i2c-client touchscreen driver @@ -429,13 +495,13 @@ static void bu21013_free_irq(struct bu21013_ts_data *bu21013_data)   * This function used to initializes the i2c-client touchscreen   * driver and returns integer.   */ -static int __devinit bu21013_probe(struct i2c_client *client, -					const struct i2c_device_id *id) +static int bu21013_probe(struct i2c_client *client, +			 const struct i2c_device_id *id)  { +	const struct bu21013_platform_device *pdata = +					dev_get_platdata(&client->dev);  	struct bu21013_ts_data *bu21013_data;  	struct input_dev *in_dev; -	const struct bu21013_platform_device *pdata = -					client->dev.platform_data;  	int error;  	if (!i2c_check_functionality(client->adapter, @@ -445,7 +511,13 @@ static int __devinit bu21013_probe(struct i2c_client *client,  	}  	if (!pdata) { -		dev_err(&client->dev, "platform data not defined\n"); +		pdata = bu21013_parse_dt(&client->dev); +		if (IS_ERR(pdata)) +			return PTR_ERR(pdata); +	} + +	if (!gpio_is_valid(pdata->touch_pin)) { +		dev_err(&client->dev, "invalid touch_pin supplied\n");  		return -EINVAL;  	} @@ -460,8 +532,9 @@ static int __devinit bu21013_probe(struct i2c_client *client,  	bu21013_data->in_dev = in_dev;  	bu21013_data->chip = pdata;  	bu21013_data->client = client; +	bu21013_data->irq = gpio_to_irq(pdata->touch_pin); -	bu21013_data->regulator = regulator_get(&client->dev, "V-TOUCH"); +	bu21013_data->regulator = regulator_get(&client->dev, "avdd");  	if (IS_ERR(bu21013_data->regulator)) {  		dev_err(&client->dev, "regulator_get failed\n");  		error = PTR_ERR(bu21013_data->regulator); @@ -478,12 +551,11 @@ static int __devinit bu21013_probe(struct i2c_client *client,  	init_waitqueue_head(&bu21013_data->wait);  	/* configure the gpio pins */ -	if (pdata->cs_en) { -		error = pdata->cs_en(pdata->cs_pin); -		if (error < 0) { -			dev_err(&client->dev, "chip init failed\n"); -			goto err_disable_regulator; -		} +	error = gpio_request_one(pdata->cs_pin, GPIOF_OUT_INIT_HIGH, +				 "touchp_reset"); +	if (error < 0) { +		dev_err(&client->dev, "Unable to request gpio reset_pin\n"); +		goto err_disable_regulator;  	}  	/* configure the touch panel controller */ @@ -508,12 +580,13 @@ static int __devinit bu21013_probe(struct i2c_client *client,  						pdata->touch_y_max, 0, 0);  	input_set_drvdata(in_dev, bu21013_data); -	error = request_threaded_irq(pdata->irq, NULL, bu21013_gpio_irq, +	error = request_threaded_irq(bu21013_data->irq, NULL, bu21013_gpio_irq,  				     IRQF_TRIGGER_FALLING | IRQF_SHARED |  					IRQF_ONESHOT,  				     DRIVER_TP, bu21013_data);  	if (error) { -		dev_err(&client->dev, "request irq %d failed\n", pdata->irq); +		dev_err(&client->dev, "request irq %d failed\n", +			bu21013_data->irq);  		goto err_cs_disable;  	} @@ -531,7 +604,7 @@ static int __devinit bu21013_probe(struct i2c_client *client,  err_free_irq:  	bu21013_free_irq(bu21013_data);  err_cs_disable: -	pdata->cs_dis(pdata->cs_pin); +	bu21013_cs_disable(bu21013_data);  err_disable_regulator:  	regulator_disable(bu21013_data->regulator);  err_put_regulator: @@ -549,13 +622,13 @@ err_free_mem:   * This function uses to remove the i2c-client   * touchscreen driver and returns integer.   */ -static int __devexit bu21013_remove(struct i2c_client *client) +static int bu21013_remove(struct i2c_client *client)  {  	struct bu21013_ts_data *bu21013_data = i2c_get_clientdata(client);  	bu21013_free_irq(bu21013_data); -	bu21013_data->chip->cs_dis(bu21013_data->chip->cs_pin); +	bu21013_cs_disable(bu21013_data);  	input_unregister_device(bu21013_data->in_dev); @@ -584,9 +657,9 @@ static int bu21013_suspend(struct device *dev)  	bu21013_data->touch_stopped = true;  	if (device_may_wakeup(&client->dev)) -		enable_irq_wake(bu21013_data->chip->irq); +		enable_irq_wake(bu21013_data->irq);  	else -		disable_irq(bu21013_data->chip->irq); +		disable_irq(bu21013_data->irq);  	regulator_disable(bu21013_data->regulator); @@ -621,9 +694,9 @@ static int bu21013_resume(struct device *dev)  	bu21013_data->touch_stopped = false;  	if (device_may_wakeup(&client->dev)) -		disable_irq_wake(bu21013_data->chip->irq); +		disable_irq_wake(bu21013_data->irq);  	else -		enable_irq(bu21013_data->chip->irq); +		enable_irq(bu21013_data->irq);  	return 0;  } @@ -649,7 +722,7 @@ static struct i2c_driver bu21013_driver = {  #endif  	},  	.probe		=	bu21013_probe, -	.remove		=	__devexit_p(bu21013_remove), +	.remove		=	bu21013_remove,  	.id_table	=	bu21013_id,  }; diff --git a/drivers/input/touchscreen/cy8ctmg110_ts.c b/drivers/input/touchscreen/cy8ctmg110_ts.c index 464f1bf4b61..96e0eedcc7e 100644 --- a/drivers/input/touchscreen/cy8ctmg110_ts.c +++ b/drivers/input/touchscreen/cy8ctmg110_ts.c @@ -99,9 +99,18 @@ static int cy8ctmg110_read_regs(struct cy8ctmg110 *tsc,  	int ret;  	struct i2c_msg msg[2] = {  		/* first write slave position to i2c devices */ -		{ client->addr, 0, 1, &cmd }, +		{ +			.addr = client->addr, +			.len = 1, +			.buf = &cmd +		},  		/* Second read data from position */ -		{ client->addr, I2C_M_RD, len, data } +		{ +			.addr = client->addr, +			.flags = I2C_M_RD, +			.len = len, +			.buf = data +		}  	};  	ret = i2c_transfer(client->adapter, msg, 2); @@ -166,7 +175,7 @@ static irqreturn_t cy8ctmg110_irq_thread(int irq, void *dev_id)  	return IRQ_HANDLED;  } -static int __devinit cy8ctmg110_probe(struct i2c_client *client, +static int cy8ctmg110_probe(struct i2c_client *client,  					const struct i2c_device_id *id)  {  	const struct cy8ctmg110_pdata *pdata = client->dev.platform_data; @@ -314,7 +323,7 @@ static int cy8ctmg110_resume(struct device *dev)  static SIMPLE_DEV_PM_OPS(cy8ctmg110_pm, cy8ctmg110_suspend, cy8ctmg110_resume);  #endif -static int __devexit cy8ctmg110_remove(struct i2c_client *client) +static int cy8ctmg110_remove(struct i2c_client *client)  {  	struct cy8ctmg110 *ts = i2c_get_clientdata(client); @@ -348,7 +357,7 @@ static struct i2c_driver cy8ctmg110_driver = {  	},  	.id_table	= cy8ctmg110_idtable,  	.probe		= cy8ctmg110_probe, -	.remove		= __devexit_p(cy8ctmg110_remove), +	.remove		= cy8ctmg110_remove,  };  module_i2c_driver(cy8ctmg110_driver); diff --git a/drivers/input/touchscreen/cyttsp_i2c.c b/drivers/input/touchscreen/cyttsp_i2c.c index 2af1d0c52bc..4dbdf44b8fc 100644 --- a/drivers/input/touchscreen/cyttsp_i2c.c +++ b/drivers/input/touchscreen/cyttsp_i2c.c @@ -81,7 +81,7 @@ static const struct cyttsp_bus_ops cyttsp_i2c_bus_ops = {  	.read           = cyttsp_i2c_read_block_data,  }; -static int __devinit cyttsp_i2c_probe(struct i2c_client *client, +static int cyttsp_i2c_probe(struct i2c_client *client,  				      const struct i2c_device_id *id)  {  	struct cyttsp *ts; @@ -102,7 +102,7 @@ static int __devinit cyttsp_i2c_probe(struct i2c_client *client,  	return 0;  } -static int __devexit cyttsp_i2c_remove(struct i2c_client *client) +static int cyttsp_i2c_remove(struct i2c_client *client)  {  	struct cyttsp *ts = i2c_get_clientdata(client); @@ -124,7 +124,7 @@ static struct i2c_driver cyttsp_i2c_driver = {  		.pm	= &cyttsp_pm_ops,  	},  	.probe		= cyttsp_i2c_probe, -	.remove		= __devexit_p(cyttsp_i2c_remove), +	.remove		= cyttsp_i2c_remove,  	.id_table	= cyttsp_i2c_id,  }; diff --git a/drivers/input/touchscreen/cyttsp_spi.c b/drivers/input/touchscreen/cyttsp_spi.c index 9f263410407..638e20310f1 100644 --- a/drivers/input/touchscreen/cyttsp_spi.c +++ b/drivers/input/touchscreen/cyttsp_spi.c @@ -147,7 +147,7 @@ static const struct cyttsp_bus_ops cyttsp_spi_bus_ops = {  	.read		= cyttsp_spi_read_block_data,  }; -static int __devinit cyttsp_spi_probe(struct spi_device *spi) +static int cyttsp_spi_probe(struct spi_device *spi)  {  	struct cyttsp *ts;  	int error; @@ -172,7 +172,7 @@ static int __devinit cyttsp_spi_probe(struct spi_device *spi)  	return 0;  } -static int __devexit cyttsp_spi_remove(struct spi_device *spi) +static int cyttsp_spi_remove(struct spi_device *spi)  {  	struct cyttsp *ts = spi_get_drvdata(spi); @@ -188,7 +188,7 @@ static struct spi_driver cyttsp_spi_driver = {  		.pm	= &cyttsp_pm_ops,  	},  	.probe  = cyttsp_spi_probe, -	.remove = __devexit_p(cyttsp_spi_remove), +	.remove = cyttsp_spi_remove,  };  module_spi_driver(cyttsp_spi_driver); diff --git a/drivers/input/touchscreen/da9034-ts.c b/drivers/input/touchscreen/da9034-ts.c index 36b65cf10d7..34ad84105e6 100644 --- a/drivers/input/touchscreen/da9034-ts.c +++ b/drivers/input/touchscreen/da9034-ts.c @@ -297,7 +297,7 @@ static void da9034_touch_close(struct input_dev *dev)  } -static int __devinit da9034_touch_probe(struct platform_device *pdev) +static int da9034_touch_probe(struct platform_device *pdev)  {  	struct da9034_touch_pdata *pdata = pdev->dev.platform_data;  	struct da9034_touch *touch; @@ -361,7 +361,7 @@ err_free_touch:  	return ret;  } -static int __devexit da9034_touch_remove(struct platform_device *pdev) +static int da9034_touch_remove(struct platform_device *pdev)  {  	struct da9034_touch *touch = platform_get_drvdata(pdev); @@ -377,7 +377,7 @@ static struct platform_driver da9034_touch_driver = {  		.owner	= THIS_MODULE,  	},  	.probe		= da9034_touch_probe, -	.remove		= __devexit_p(da9034_touch_remove), +	.remove		= da9034_touch_remove,  };  module_platform_driver(da9034_touch_driver); diff --git a/drivers/input/touchscreen/da9052_tsi.c b/drivers/input/touchscreen/da9052_tsi.c index 53133efe041..8f561e22bdd 100644 --- a/drivers/input/touchscreen/da9052_tsi.c +++ b/drivers/input/touchscreen/da9052_tsi.c @@ -141,7 +141,7 @@ static void da9052_ts_pen_work(struct work_struct *work)  	}  } -static int __devinit da9052_ts_configure_gpio(struct da9052 *da9052) +static int da9052_ts_configure_gpio(struct da9052 *da9052)  {  	int error; @@ -160,7 +160,7 @@ static int __devinit da9052_ts_configure_gpio(struct da9052 *da9052)  	return 0;  } -static int __devinit da9052_configure_tsi(struct da9052_tsi *tsi) +static int da9052_configure_tsi(struct da9052_tsi *tsi)  {  	int error; @@ -227,7 +227,7 @@ static void da9052_ts_input_close(struct input_dev *input_dev)  	da9052_reg_update(tsi->da9052, DA9052_TSI_CONT_A_REG, 1 << 1, 0);  } -static int __devinit da9052_ts_probe(struct platform_device *pdev) +static int da9052_ts_probe(struct platform_device *pdev)  {  	struct da9052 *da9052;  	struct da9052_tsi *tsi; @@ -317,7 +317,7 @@ err_free_mem:  	return error;  } -static int  __devexit da9052_ts_remove(struct platform_device *pdev) +static int  da9052_ts_remove(struct platform_device *pdev)  {  	struct da9052_tsi *tsi = platform_get_drvdata(pdev); @@ -336,7 +336,7 @@ static int  __devexit da9052_ts_remove(struct platform_device *pdev)  static struct platform_driver da9052_tsi_driver = {  	.probe	= da9052_ts_probe, -	.remove	= __devexit_p(da9052_ts_remove), +	.remove	= da9052_ts_remove,  	.driver	= {  		.name	= "da9052-tsi",  		.owner	= THIS_MODULE, diff --git a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c index 099d144ab7c..a9170157b44 100644 --- a/drivers/input/touchscreen/edt-ft5x06.c +++ b/drivers/input/touchscreen/edt-ft5x06.c @@ -491,14 +491,6 @@ static int edt_ft5x06_debugfs_mode_set(void *data, u64 mode)  DEFINE_SIMPLE_ATTRIBUTE(debugfs_mode_fops, edt_ft5x06_debugfs_mode_get,  			edt_ft5x06_debugfs_mode_set, "%llu\n"); -static int edt_ft5x06_debugfs_raw_data_open(struct inode *inode, -					    struct file *file) -{ -	file->private_data = inode->i_private; - -	return 0; -} -  static ssize_t edt_ft5x06_debugfs_raw_data_read(struct file *file,  				char __user *buf, size_t count, loff_t *off)  { @@ -579,11 +571,11 @@ out:  static const struct file_operations debugfs_raw_data_fops = { -	.open = edt_ft5x06_debugfs_raw_data_open, +	.open = simple_open,  	.read = edt_ft5x06_debugfs_raw_data_read,  }; -static void __devinit +static void  edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata,  			      const char *debugfs_name)  { @@ -600,7 +592,7 @@ edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata,  			    tsdata->debug_dir, tsdata, &debugfs_raw_data_fops);  } -static void __devexit +static void  edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata)  {  	if (tsdata->debug_dir) @@ -625,7 +617,7 @@ edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata) -static int __devinit edt_ft5x06_ts_reset(struct i2c_client *client, +static int edt_ft5x06_ts_reset(struct i2c_client *client,  					 int reset_pin)  {  	int error; @@ -649,7 +641,7 @@ static int __devinit edt_ft5x06_ts_reset(struct i2c_client *client,  	return 0;  } -static int __devinit edt_ft5x06_ts_identify(struct i2c_client *client, +static int edt_ft5x06_ts_identify(struct i2c_client *client,  					    char *model_name,  					    char *fw_version)  { @@ -683,7 +675,7 @@ static int __devinit edt_ft5x06_ts_identify(struct i2c_client *client,  	    pdata->name <= edt_ft5x06_attr_##name.limit_high)		\  		edt_ft5x06_register_write(tsdata, reg, pdata->name) -static void __devinit +static void  edt_ft5x06_ts_get_defaults(struct edt_ft5x06_ts_data *tsdata,  			   const struct edt_ft5x06_platform_data *pdata)  { @@ -697,7 +689,7 @@ edt_ft5x06_ts_get_defaults(struct edt_ft5x06_ts_data *tsdata,  	EDT_ATTR_CHECKSET(report_rate, WORK_REGISTER_REPORT_RATE);  } -static void __devinit +static void  edt_ft5x06_ts_get_parameters(struct edt_ft5x06_ts_data *tsdata)  {  	tsdata->threshold = edt_ft5x06_register_read(tsdata, @@ -710,7 +702,7 @@ edt_ft5x06_ts_get_parameters(struct edt_ft5x06_ts_data *tsdata)  	tsdata->num_y = edt_ft5x06_register_read(tsdata, WORK_REGISTER_NUM_Y);  } -static int __devinit edt_ft5x06_ts_probe(struct i2c_client *client, +static int edt_ft5x06_ts_probe(struct i2c_client *client,  					 const struct i2c_device_id *id)  {  	const struct edt_ft5x06_platform_data *pdata = @@ -830,7 +822,7 @@ err_free_mem:  	return error;  } -static int __devexit edt_ft5x06_ts_remove(struct i2c_client *client) +static int edt_ft5x06_ts_remove(struct i2c_client *client)  {  	const struct edt_ft5x06_platform_data *pdata =  						dev_get_platdata(&client->dev); @@ -891,7 +883,7 @@ static struct i2c_driver edt_ft5x06_ts_driver = {  	},  	.id_table = edt_ft5x06_ts_id,  	.probe    = edt_ft5x06_ts_probe, -	.remove   = __devexit_p(edt_ft5x06_ts_remove), +	.remove   = edt_ft5x06_ts_remove,  };  module_i2c_driver(edt_ft5x06_ts_driver); diff --git a/drivers/input/touchscreen/eeti_ts.c b/drivers/input/touchscreen/eeti_ts.c index 908407efc67..55255a94007 100644 --- a/drivers/input/touchscreen/eeti_ts.c +++ b/drivers/input/touchscreen/eeti_ts.c @@ -154,7 +154,7 @@ static void eeti_ts_close(struct input_dev *dev)  	eeti_ts_stop(priv);  } -static int __devinit eeti_ts_probe(struct i2c_client *client, +static int eeti_ts_probe(struct i2c_client *client,  				   const struct i2c_device_id *idp)  {  	struct eeti_ts_platform_data *pdata = client->dev.platform_data; @@ -248,7 +248,7 @@ err0:  	return err;  } -static int __devexit eeti_ts_remove(struct i2c_client *client) +static int eeti_ts_remove(struct i2c_client *client)  {  	struct eeti_ts_priv *priv = i2c_get_clientdata(client); @@ -321,7 +321,7 @@ static struct i2c_driver eeti_ts_driver = {  #endif  	},  	.probe = eeti_ts_probe, -	.remove = __devexit_p(eeti_ts_remove), +	.remove = eeti_ts_remove,  	.id_table = eeti_ts_id,  }; diff --git a/drivers/input/touchscreen/egalax_ts.c b/drivers/input/touchscreen/egalax_ts.c index 13fa62fdfb0..17c9097f3b5 100644 --- a/drivers/input/touchscreen/egalax_ts.c +++ b/drivers/input/touchscreen/egalax_ts.c @@ -153,7 +153,7 @@ static int egalax_wake_up_device(struct i2c_client *client)  	return 0;  } -static int __devinit egalax_firmware_version(struct i2c_client *client) +static int egalax_firmware_version(struct i2c_client *client)  {  	static const u8 cmd[MAX_I2C_DATA_LEN] = { 0x03, 0x03, 0xa, 0x01, 0x41 };  	int ret; @@ -165,7 +165,7 @@ static int __devinit egalax_firmware_version(struct i2c_client *client)  	return 0;  } -static int __devinit egalax_ts_probe(struct i2c_client *client, +static int egalax_ts_probe(struct i2c_client *client,  				       const struct i2c_device_id *id)  {  	struct egalax_ts *ts; @@ -246,7 +246,7 @@ err_free_ts:  	return error;  } -static __devexit int egalax_ts_remove(struct i2c_client *client) +static int egalax_ts_remove(struct i2c_client *client)  {  	struct egalax_ts *ts = i2c_get_clientdata(client); @@ -301,7 +301,7 @@ static struct i2c_driver egalax_ts_driver = {  	},  	.id_table	= egalax_ts_id,  	.probe		= egalax_ts_probe, -	.remove		= __devexit_p(egalax_ts_remove), +	.remove		= egalax_ts_remove,  };  module_i2c_driver(egalax_ts_driver); diff --git a/drivers/input/touchscreen/h3600_ts_input.c b/drivers/input/touchscreen/h3600_ts_input.c deleted file mode 100644 index b9e8686a6f1..00000000000 --- a/drivers/input/touchscreen/h3600_ts_input.c +++ /dev/null @@ -1,479 +0,0 @@ -/* - *  Copyright (c) 2001 "Crazy" James Simmons jsimmons@transvirtual.com - * - *  Sponsored by Transvirtual Technology. - * - *  Derived from the code in h3600_ts.[ch] by Charles Flynn - */ - -/* - * Driver for the h3600 Touch Screen and other Atmel controlled devices. - */ - -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Should you need to contact me, the author, you can do so by - * e-mail - mail your message to <jsimmons@transvirtual.com>. - */ - -#include <linux/errno.h> -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/slab.h> -#include <linux/input.h> -#include <linux/serio.h> -#include <linux/init.h> -#include <linux/delay.h> - -/* SA1100 serial defines */ -#include <mach/hardware.h> -#include <mach/irqs.h> - -#define DRIVER_DESC	"H3600 touchscreen driver" - -MODULE_AUTHOR("James Simmons <jsimmons@transvirtual.com>"); -MODULE_DESCRIPTION(DRIVER_DESC); -MODULE_LICENSE("GPL"); - -/* - * Definitions & global arrays. - */ - -/* The start and end of frame characters SOF and EOF */ -#define CHAR_SOF                0x02 -#define CHAR_EOF                0x03 -#define FRAME_OVERHEAD          3       /* CHAR_SOF,CHAR_EOF,LENGTH = 3 */ - -/* -        Atmel events and response IDs contained in frame. -        Programmer has no control over these numbers. -        TODO there are holes - specifically  1,7,0x0a -*/ -#define VERSION_ID              0       /* Get Version (request/response) */ -#define KEYBD_ID                2       /* Keyboard (event) */ -#define TOUCHS_ID               3       /* Touch Screen (event)*/ -#define EEPROM_READ_ID          4       /* (request/response) */ -#define EEPROM_WRITE_ID         5       /* (request/response) */ -#define THERMAL_ID              6       /* (request/response) */ -#define NOTIFY_LED_ID           8       /* (request/response) */ -#define BATTERY_ID              9       /* (request/response) */ -#define SPI_READ_ID             0x0b    /* ( request/response) */ -#define SPI_WRITE_ID            0x0c    /* ( request/response) */ -#define FLITE_ID                0x0d    /* backlight ( request/response) */ -#define STX_ID                  0xa1    /* extension pack status (req/resp) */ - -#define MAX_ID                  14 - -#define H3600_MAX_LENGTH 16 -#define H3600_KEY 0xf - -#define H3600_SCANCODE_RECORD	1	 /* 1 -> record button */ -#define H3600_SCANCODE_CALENDAR 2	 /* 2 -> calendar */ -#define H3600_SCANCODE_CONTACTS 3	 /* 3 -> contact */ -#define H3600_SCANCODE_Q	4	 /* 4 -> Q button */ -#define	H3600_SCANCODE_START	5	 /* 5 -> start menu */ -#define	H3600_SCANCODE_UP	6	 /* 6 -> up */ -#define H3600_SCANCODE_RIGHT	7	 /* 7 -> right */ -#define H3600_SCANCODE_LEFT	8	 /* 8 -> left */ -#define H3600_SCANCODE_DOWN	9	 /* 9 -> down */ - -/* - * Per-touchscreen data. - */ -struct h3600_dev { -	struct input_dev *dev; -	struct serio *serio; -	unsigned char event;	/* event ID from packet */ -	unsigned char chksum; -	unsigned char len; -	unsigned char idx; -	unsigned char buf[H3600_MAX_LENGTH]; -	char phys[32]; -}; - -static irqreturn_t action_button_handler(int irq, void *dev_id) -{ -	int down = (GPLR & GPIO_BITSY_ACTION_BUTTON) ? 0 : 1; -	struct input_dev *dev = dev_id; - -	input_report_key(dev, KEY_ENTER, down); -	input_sync(dev); - -	return IRQ_HANDLED; -} - -static irqreturn_t npower_button_handler(int irq, void *dev_id) -{ -	int down = (GPLR & GPIO_BITSY_NPOWER_BUTTON) ? 0 : 1; -	struct input_dev *dev = dev_id; - -	/* -	 * This interrupt is only called when we release the key. So we have -	 * to fake a key press. -	 */ -	input_report_key(dev, KEY_SUSPEND, 1); -	input_report_key(dev, KEY_SUSPEND, down); -	input_sync(dev); - -	return IRQ_HANDLED; -} - -#ifdef CONFIG_PM - -static int flite_brightness = 25; - -enum flite_pwr { -	FLITE_PWR_OFF = 0, -	FLITE_PWR_ON = 1 -}; - -/* - * h3600_flite_power: enables or disables power to frontlight, using last bright */ -unsigned int h3600_flite_power(struct input_dev *dev, enum flite_pwr pwr) -{ -	unsigned char brightness = (pwr == FLITE_PWR_OFF) ? 0 : flite_brightness; -	struct h3600_dev *ts = input_get_drvdata(dev); - -	/* Must be in this order */ -	serio_write(ts->serio, 1); -	serio_write(ts->serio, pwr); -	serio_write(ts->serio, brightness); - -	return 0; -} - -#endif - -/* - * This function translates the native event packets to linux input event - * packets. Some packets coming from serial are not touchscreen related. In - * this case we send them off to be processed elsewhere. - */ -static void h3600ts_process_packet(struct h3600_dev *ts) -{ -	struct input_dev *dev = ts->dev; -	static int touched = 0; -	int key, down = 0; - -	switch (ts->event) { -		/* -		   Buttons - returned as a single byte -			7 6 5 4 3 2 1 0 -			S x x x N N N N - -		   S       switch state ( 0=pressed 1=released) -		   x       Unused. -		   NNNN    switch number 0-15 - -		   Note: This is true for non interrupt generated key events. -		*/ -		case KEYBD_ID: -			down = (ts->buf[0] & 0x80) ? 0 : 1; - -			switch (ts->buf[0] & 0x7f) { -				case H3600_SCANCODE_RECORD: -					key = KEY_RECORD; -					break; -				case H3600_SCANCODE_CALENDAR: -					key = KEY_PROG1; -                                        break; -				case H3600_SCANCODE_CONTACTS: -					key = KEY_PROG2; -					break; -				case H3600_SCANCODE_Q: -					key = KEY_Q; -					break; -				case H3600_SCANCODE_START: -					key = KEY_PROG3; -					break; -				case H3600_SCANCODE_UP: -					key = KEY_UP; -					break; -				case H3600_SCANCODE_RIGHT: -					key = KEY_RIGHT; -					break; -				case H3600_SCANCODE_LEFT: -					key = KEY_LEFT; -					break; -				case H3600_SCANCODE_DOWN: -					key = KEY_DOWN; -					break; -				default: -					key = 0; -			} -			if (key) -				input_report_key(dev, key, down); -			break; -		/* -		 * Native touchscreen event data is formatted as shown below:- -		 * -		 *      +-------+-------+-------+-------+ -		 *      | Xmsb  | Xlsb  | Ymsb  | Ylsb  | -		 *      +-------+-------+-------+-------+ -		 *       byte 0    1       2       3 -		 */ -		case TOUCHS_ID: -			if (!touched) { -				input_report_key(dev, BTN_TOUCH, 1); -				touched = 1; -			} - -			if (ts->len) { -				unsigned short x, y; - -				x = ts->buf[0]; x <<= 8; x += ts->buf[1]; -				y = ts->buf[2]; y <<= 8; y += ts->buf[3]; - -				input_report_abs(dev, ABS_X, x); -				input_report_abs(dev, ABS_Y, y); -			} else { -				input_report_key(dev, BTN_TOUCH, 0); -				touched = 0; -			} -			break; -		default: -			/* Send a non input event elsewhere */ -			break; -	} - -	input_sync(dev); -} - -/* - * h3600ts_event() handles events from the input module. - */ -static int h3600ts_event(struct input_dev *dev, unsigned int type, -			 unsigned int code, int value) -{ -#if 0 -	struct h3600_dev *ts = input_get_drvdata(dev); - -	switch (type) { -		case EV_LED: { -		//	serio_write(ts->serio, SOME_CMD); -			return 0; -		} -	} -	return -1; -#endif -	return 0; -} - -/* -        Frame format -  byte    1       2               3              len + 4 -        +-------+---------------+---------------+--=------------+ -        |SOF    |id     |len    | len bytes     | Chksum        | -        +-------+---------------+---------------+--=------------+ -  bit   0     7  8    11 12   15 16 - -        +-------+---------------+-------+ -        |SOF    |id     |0      |Chksum | - Note Chksum does not include SOF -        +-------+---------------+-------+ -  bit   0     7  8    11 12   15 16 - -*/ - -static int state; - -/* decode States  */ -#define STATE_SOF       0       /* start of FRAME */ -#define STATE_ID        1       /* state where we decode the ID & len */ -#define STATE_DATA      2       /* state where we decode data */ -#define STATE_EOF       3       /* state where we decode checksum or EOF */ - -static irqreturn_t h3600ts_interrupt(struct serio *serio, unsigned char data, -                                     unsigned int flags) -{ -	struct h3600_dev *ts = serio_get_drvdata(serio); - -	/* -	 * We have a new frame coming in. -	 */ -	switch (state) { -		case STATE_SOF: -			if (data == CHAR_SOF) -				state = STATE_ID; -			break; -		case STATE_ID: -			ts->event = (data & 0xf0) >> 4; -			ts->len = (data & 0xf); -			ts->idx = 0; -			if (ts->event >= MAX_ID) { -				state = STATE_SOF; -				break; -			} -			ts->chksum = data; -			state = (ts->len > 0) ? STATE_DATA : STATE_EOF; -			break; -		case STATE_DATA: -			ts->chksum += data; -			ts->buf[ts->idx]= data; -			if (++ts->idx == ts->len) -				state = STATE_EOF; -			break; -		case STATE_EOF: -			state = STATE_SOF; -			if (data == CHAR_EOF || data == ts->chksum) -				h3600ts_process_packet(ts); -			break; -		default: -			printk("Error3\n"); -			break; -	} - -	return IRQ_HANDLED; -} - -/* - * h3600ts_connect() is the routine that is called when someone adds a - * new serio device that supports H3600 protocol and registers it as - * an input device. - */ -static int h3600ts_connect(struct serio *serio, struct serio_driver *drv) -{ -	struct h3600_dev *ts; -	struct input_dev *input_dev; -	int err; - -	ts = kzalloc(sizeof(struct h3600_dev), GFP_KERNEL); -	input_dev = input_allocate_device(); -	if (!ts || !input_dev) { -		err = -ENOMEM; -		goto fail1; -	} - -	ts->serio = serio; -	ts->dev = input_dev; -	snprintf(ts->phys, sizeof(ts->phys), "%s/input0", serio->phys); - -	input_dev->name = "H3600 TouchScreen"; -	input_dev->phys = ts->phys; -	input_dev->id.bustype = BUS_RS232; -	input_dev->id.vendor = SERIO_H3600; -	input_dev->id.product = 0x0666;  /* FIXME !!! We can ask the hardware */ -	input_dev->id.version = 0x0100; -	input_dev->dev.parent = &serio->dev; - -	input_set_drvdata(input_dev, ts); - -	input_dev->event = h3600ts_event; - -	input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) | -		BIT_MASK(EV_LED) | BIT_MASK(EV_PWR); -	input_dev->ledbit[0] = BIT_MASK(LED_SLEEP); -	input_set_abs_params(input_dev, ABS_X, 60, 985, 0, 0); -	input_set_abs_params(input_dev, ABS_Y, 35, 1024, 0, 0); - -	set_bit(KEY_RECORD, input_dev->keybit); -	set_bit(KEY_Q, input_dev->keybit); -	set_bit(KEY_PROG1, input_dev->keybit); -	set_bit(KEY_PROG2, input_dev->keybit); -	set_bit(KEY_PROG3, input_dev->keybit); -	set_bit(KEY_UP, input_dev->keybit); -	set_bit(KEY_RIGHT, input_dev->keybit); -	set_bit(KEY_LEFT, input_dev->keybit); -	set_bit(KEY_DOWN, input_dev->keybit); -	set_bit(KEY_ENTER, input_dev->keybit); -	set_bit(KEY_SUSPEND, input_dev->keybit); -	set_bit(BTN_TOUCH, input_dev->keybit); - -	/* Device specific stuff */ -	set_GPIO_IRQ_edge(GPIO_BITSY_ACTION_BUTTON, GPIO_BOTH_EDGES); -	set_GPIO_IRQ_edge(GPIO_BITSY_NPOWER_BUTTON, GPIO_RISING_EDGE); - -	if (request_irq(IRQ_GPIO_BITSY_ACTION_BUTTON, action_button_handler, -			IRQF_SHARED, "h3600_action", ts->dev)) { -		printk(KERN_ERR "h3600ts.c: Could not allocate Action Button IRQ!\n"); -		err = -EBUSY; -		goto fail1; -	} - -	if (request_irq(IRQ_GPIO_BITSY_NPOWER_BUTTON, npower_button_handler, -			IRQF_SHARED, "h3600_suspend", ts->dev)) { -		printk(KERN_ERR "h3600ts.c: Could not allocate Power Button IRQ!\n"); -		err = -EBUSY; -		goto fail2; -	} - -	serio_set_drvdata(serio, ts); - -	err = serio_open(serio, drv); -	if (err) -		goto fail3; - -	//h3600_flite_control(1, 25);     /* default brightness */ -	err = input_register_device(ts->dev); -	if (err) -		goto fail4; - -	return 0; - -fail4:	serio_close(serio); -fail3:	serio_set_drvdata(serio, NULL); -	free_irq(IRQ_GPIO_BITSY_NPOWER_BUTTON, ts->dev); -fail2:	free_irq(IRQ_GPIO_BITSY_ACTION_BUTTON, ts->dev); -fail1:	input_free_device(input_dev); -	kfree(ts); -	return err; -} - -/* - * h3600ts_disconnect() is the opposite of h3600ts_connect() - */ - -static void h3600ts_disconnect(struct serio *serio) -{ -	struct h3600_dev *ts = serio_get_drvdata(serio); - -	free_irq(IRQ_GPIO_BITSY_ACTION_BUTTON, ts->dev); -	free_irq(IRQ_GPIO_BITSY_NPOWER_BUTTON, ts->dev); -	input_get_device(ts->dev); -	input_unregister_device(ts->dev); -	serio_close(serio); -	serio_set_drvdata(serio, NULL); -	input_put_device(ts->dev); -	kfree(ts); -} - -/* - * The serio driver structure. - */ - -static struct serio_device_id h3600ts_serio_ids[] = { -	{ -		.type	= SERIO_RS232, -		.proto	= SERIO_H3600, -		.id	= SERIO_ANY, -		.extra	= SERIO_ANY, -	}, -	{ 0 } -}; - -MODULE_DEVICE_TABLE(serio, h3600ts_serio_ids); - -static struct serio_driver h3600ts_drv = { -	.driver		= { -		.name	= "h3600ts", -	}, -	.description	= DRIVER_DESC, -	.id_table	= h3600ts_serio_ids, -	.interrupt	= h3600ts_interrupt, -	.connect	= h3600ts_connect, -	.disconnect	= h3600ts_disconnect, -}; - -module_serio_driver(h3600ts_drv); diff --git a/drivers/input/touchscreen/htcpen.c b/drivers/input/touchscreen/htcpen.c index d13143b68b3..6c4fb843695 100644 --- a/drivers/input/touchscreen/htcpen.c +++ b/drivers/input/touchscreen/htcpen.c @@ -102,7 +102,7 @@ static void htcpen_close(struct input_dev *dev)  	synchronize_irq(HTCPEN_IRQ);  } -static int __devinit htcpen_isa_probe(struct device *dev, unsigned int id) +static int htcpen_isa_probe(struct device *dev, unsigned int id)  {  	struct input_dev *htcpen_dev;  	int err = -EBUSY; @@ -174,7 +174,7 @@ static int __devinit htcpen_isa_probe(struct device *dev, unsigned int id)  	return err;  } -static int __devexit htcpen_isa_remove(struct device *dev, unsigned int id) +static int htcpen_isa_remove(struct device *dev, unsigned int id)  {  	struct input_dev *htcpen_dev = dev_get_drvdata(dev); @@ -210,7 +210,7 @@ static int htcpen_isa_resume(struct device *dev, unsigned int n)  static struct isa_driver htcpen_isa_driver = {  	.probe		= htcpen_isa_probe, -	.remove		= __devexit_p(htcpen_isa_remove), +	.remove		= htcpen_isa_remove,  #ifdef CONFIG_PM  	.suspend	= htcpen_isa_suspend,  	.resume		= htcpen_isa_resume, diff --git a/drivers/input/touchscreen/ili210x.c b/drivers/input/touchscreen/ili210x.c index 4ac69760ec0..1418bdda61b 100644 --- a/drivers/input/touchscreen/ili210x.c +++ b/drivers/input/touchscreen/ili210x.c @@ -180,7 +180,7 @@ static const struct attribute_group ili210x_attr_group = {  	.attrs = ili210x_attributes,  }; -static int __devinit ili210x_i2c_probe(struct i2c_client *client, +static int ili210x_i2c_probe(struct i2c_client *client,  				       const struct i2c_device_id *id)  {  	struct device *dev = &client->dev; @@ -298,7 +298,7 @@ err_free_mem:  	return error;  } -static int __devexit ili210x_i2c_remove(struct i2c_client *client) +static int ili210x_i2c_remove(struct i2c_client *client)  {  	struct ili210x *priv = i2c_get_clientdata(client); @@ -350,7 +350,7 @@ static struct i2c_driver ili210x_ts_driver = {  	},  	.id_table = ili210x_i2c_id,  	.probe = ili210x_i2c_probe, -	.remove = __devexit_p(ili210x_i2c_remove), +	.remove = ili210x_i2c_remove,  };  module_i2c_driver(ili210x_ts_driver); diff --git a/drivers/input/touchscreen/intel-mid-touch.c b/drivers/input/touchscreen/intel-mid-touch.c index cf299377fc4..465db5dba8b 100644 --- a/drivers/input/touchscreen/intel-mid-touch.c +++ b/drivers/input/touchscreen/intel-mid-touch.c @@ -427,7 +427,7 @@ out:  }  /* Utility to read PMIC ID */ -static int __devinit mrstouch_read_pmic_id(uint *vendor, uint *rev) +static int mrstouch_read_pmic_id(uint *vendor, uint *rev)  {  	int err;  	u8 r; @@ -446,7 +446,7 @@ static int __devinit mrstouch_read_pmic_id(uint *vendor, uint *rev)   * Parse ADC channels to find end of the channel configured by other ADC user   * NEC and MAXIM requires 4 channels and FreeScale needs 18 channels   */ -static int __devinit mrstouch_chan_parse(struct mrstouch_dev *tsdev) +static int mrstouch_chan_parse(struct mrstouch_dev *tsdev)  {  	int found = 0;  	int err, i; @@ -478,7 +478,7 @@ static int __devinit mrstouch_chan_parse(struct mrstouch_dev *tsdev)  /*   * Writes touch screen channels to ADC address selection registers   */ -static int __devinit mrstouch_ts_chan_set(uint offset) +static int mrstouch_ts_chan_set(uint offset)  {  	u16 chan; @@ -494,7 +494,7 @@ static int __devinit mrstouch_ts_chan_set(uint offset)  }  /* Initialize ADC */ -static int __devinit mrstouch_adc_init(struct mrstouch_dev *tsdev) +static int mrstouch_adc_init(struct mrstouch_dev *tsdev)  {  	int err, start;  	u8 ra, rm; @@ -568,7 +568,7 @@ static int __devinit mrstouch_adc_init(struct mrstouch_dev *tsdev)  /* Probe function for touch screen driver */ -static int __devinit mrstouch_probe(struct platform_device *pdev) +static int mrstouch_probe(struct platform_device *pdev)  {  	struct mrstouch_dev *tsdev;  	struct input_dev *input; @@ -643,7 +643,7 @@ err_free_mem:  	return err;  } -static int __devexit mrstouch_remove(struct platform_device *pdev) +static int mrstouch_remove(struct platform_device *pdev)  {  	struct mrstouch_dev *tsdev = platform_get_drvdata(pdev); @@ -662,7 +662,7 @@ static struct platform_driver mrstouch_driver = {  		.owner	= THIS_MODULE,  	},  	.probe		= mrstouch_probe, -	.remove		= __devexit_p(mrstouch_remove), +	.remove		= mrstouch_remove,  };  module_platform_driver(mrstouch_driver); diff --git a/drivers/input/touchscreen/jornada720_ts.c b/drivers/input/touchscreen/jornada720_ts.c index 7f03d1bd916..282d7c7ad2f 100644 --- a/drivers/input/touchscreen/jornada720_ts.c +++ b/drivers/input/touchscreen/jornada720_ts.c @@ -99,7 +99,7 @@ static irqreturn_t jornada720_ts_interrupt(int irq, void *dev_id)  	return IRQ_HANDLED;  } -static int __devinit jornada720_ts_probe(struct platform_device *pdev) +static int jornada720_ts_probe(struct platform_device *pdev)  {  	struct jornada_ts *jornada_ts;  	struct input_dev *input_dev; @@ -151,7 +151,7 @@ static int __devinit jornada720_ts_probe(struct platform_device *pdev)  	return error;  } -static int __devexit jornada720_ts_remove(struct platform_device *pdev) +static int jornada720_ts_remove(struct platform_device *pdev)  {  	struct jornada_ts *jornada_ts = platform_get_drvdata(pdev); @@ -168,7 +168,7 @@ MODULE_ALIAS("platform:jornada_ts");  static struct platform_driver jornada720_ts_driver = {  	.probe		= jornada720_ts_probe, -	.remove		= __devexit_p(jornada720_ts_remove), +	.remove		= jornada720_ts_remove,  	.driver		= {  		.name	= "jornada_ts",  		.owner	= THIS_MODULE, diff --git a/drivers/input/touchscreen/lpc32xx_ts.c b/drivers/input/touchscreen/lpc32xx_ts.c index 4c2b8ed3bf1..9101ee529c9 100644 --- a/drivers/input/touchscreen/lpc32xx_ts.c +++ b/drivers/input/touchscreen/lpc32xx_ts.c @@ -203,7 +203,7 @@ static void lpc32xx_ts_close(struct input_dev *dev)  	lpc32xx_stop_tsc(tsc);  } -static int __devinit lpc32xx_ts_probe(struct platform_device *pdev) +static int lpc32xx_ts_probe(struct platform_device *pdev)  {  	struct lpc32xx_tsc *tsc;  	struct input_dev *input; @@ -309,7 +309,7 @@ err_free_mem:  	return error;  } -static int __devexit lpc32xx_ts_remove(struct platform_device *pdev) +static int lpc32xx_ts_remove(struct platform_device *pdev)  {  	struct lpc32xx_tsc *tsc = platform_get_drvdata(pdev);  	struct resource *res; @@ -394,7 +394,7 @@ MODULE_DEVICE_TABLE(of, lpc32xx_tsc_of_match);  static struct platform_driver lpc32xx_ts_driver = {  	.probe		= lpc32xx_ts_probe, -	.remove		= __devexit_p(lpc32xx_ts_remove), +	.remove		= lpc32xx_ts_remove,  	.driver		= {  		.name	= MOD_NAME,  		.owner	= THIS_MODULE, diff --git a/drivers/input/touchscreen/max11801_ts.c b/drivers/input/touchscreen/max11801_ts.c index 4eab50b856d..00bc6caa27f 100644 --- a/drivers/input/touchscreen/max11801_ts.c +++ b/drivers/input/touchscreen/max11801_ts.c @@ -156,7 +156,7 @@ out:  	return IRQ_HANDLED;  } -static void __devinit max11801_ts_phy_init(struct max11801_data *data) +static void max11801_ts_phy_init(struct max11801_data *data)  {  	struct i2c_client *client = data->client; @@ -174,7 +174,7 @@ static void __devinit max11801_ts_phy_init(struct max11801_data *data)  	max11801_write_reg(client, OP_MODE_CONF_REG, 0x36);  } -static int __devinit max11801_ts_probe(struct i2c_client *client, +static int max11801_ts_probe(struct i2c_client *client,  				       const struct i2c_device_id *id)  {  	struct max11801_data *data; @@ -228,7 +228,7 @@ err_free_mem:  	return error;  } -static __devexit int max11801_ts_remove(struct i2c_client *client) +static int max11801_ts_remove(struct i2c_client *client)  {  	struct max11801_data *data = i2c_get_clientdata(client); @@ -252,7 +252,7 @@ static struct i2c_driver max11801_ts_driver = {  	},  	.id_table	= max11801_ts_id,  	.probe		= max11801_ts_probe, -	.remove		= __devexit_p(max11801_ts_remove), +	.remove		= max11801_ts_remove,  };  module_i2c_driver(max11801_ts_driver); diff --git a/drivers/input/touchscreen/mc13783_ts.c b/drivers/input/touchscreen/mc13783_ts.c index 48dc5b0d26f..02103b6abb3 100644 --- a/drivers/input/touchscreen/mc13783_ts.c +++ b/drivers/input/touchscreen/mc13783_ts.c @@ -229,7 +229,7 @@ err_free_mem:  	return ret;  } -static int __devexit mc13783_ts_remove(struct platform_device *pdev) +static int mc13783_ts_remove(struct platform_device *pdev)  {  	struct mc13783_ts_priv *priv = platform_get_drvdata(pdev); @@ -243,7 +243,7 @@ static int __devexit mc13783_ts_remove(struct platform_device *pdev)  }  static struct platform_driver mc13783_ts_driver = { -	.remove		= __devexit_p(mc13783_ts_remove), +	.remove		= mc13783_ts_remove,  	.driver		= {  		.owner	= THIS_MODULE,  		.name	= MC13783_TS_NAME, diff --git a/drivers/input/touchscreen/mcs5000_ts.c b/drivers/input/touchscreen/mcs5000_ts.c index b528511861c..f9f4e0c56ed 100644 --- a/drivers/input/touchscreen/mcs5000_ts.c +++ b/drivers/input/touchscreen/mcs5000_ts.c @@ -187,7 +187,7 @@ static void mcs5000_ts_phys_init(struct mcs5000_ts_data *data)  			OP_MODE_ACTIVE | REPORT_RATE_80);  } -static int __devinit mcs5000_ts_probe(struct i2c_client *client, +static int mcs5000_ts_probe(struct i2c_client *client,  		const struct i2c_device_id *id)  {  	struct mcs5000_ts_data *data; @@ -249,7 +249,7 @@ err_free_mem:  	return ret;  } -static int __devexit mcs5000_ts_remove(struct i2c_client *client) +static int mcs5000_ts_remove(struct i2c_client *client)  {  	struct mcs5000_ts_data *data = i2c_get_clientdata(client); @@ -292,7 +292,7 @@ MODULE_DEVICE_TABLE(i2c, mcs5000_ts_id);  static struct i2c_driver mcs5000_ts_driver = {  	.probe		= mcs5000_ts_probe, -	.remove		= __devexit_p(mcs5000_ts_remove), +	.remove		= mcs5000_ts_remove,  	.driver = {  		.name = "mcs5000_ts",  #ifdef CONFIG_PM diff --git a/drivers/input/touchscreen/mms114.c b/drivers/input/touchscreen/mms114.c index 560cf09d1c5..98841d8aa63 100644 --- a/drivers/input/touchscreen/mms114.c +++ b/drivers/input/touchscreen/mms114.c @@ -10,6 +10,7 @@  #include <linux/module.h>  #include <linux/init.h>  #include <linux/delay.h> +#include <linux/of.h>  #include <linux/i2c.h>  #include <linux/i2c/mms114.h>  #include <linux/input/mt.h> @@ -360,14 +361,63 @@ static void mms114_input_close(struct input_dev *dev)  	mms114_stop(data);  } -static int __devinit mms114_probe(struct i2c_client *client, +#ifdef CONFIG_OF +static struct mms114_platform_data *mms114_parse_dt(struct device *dev) +{ +	struct mms114_platform_data *pdata; +	struct device_node *np = dev->of_node; + +	if (!np) +		return NULL; + +	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); +	if (!pdata) { +		dev_err(dev, "failed to allocate platform data\n"); +		return NULL; +	} + +	if (of_property_read_u32(np, "x-size", &pdata->x_size)) { +		dev_err(dev, "failed to get x-size property\n"); +		return NULL; +	}; + +	if (of_property_read_u32(np, "y-size", &pdata->y_size)) { +		dev_err(dev, "failed to get y-size property\n"); +		return NULL; +	}; + +	of_property_read_u32(np, "contact-threshold", +				&pdata->contact_threshold); +	of_property_read_u32(np, "moving-threshold", +				&pdata->moving_threshold); + +	if (of_find_property(np, "x-invert", NULL)) +		pdata->x_invert = true; +	if (of_find_property(np, "y-invert", NULL)) +		pdata->y_invert = true; + +	return pdata; +} +#else +static inline struct mms114_platform_data *mms114_parse_dt(struct device *dev) +{ +	return NULL; +} +#endif + +static int mms114_probe(struct i2c_client *client,  				  const struct i2c_device_id *id)  { +	const struct mms114_platform_data *pdata;  	struct mms114_data *data;  	struct input_dev *input_dev;  	int error; -	if (!client->dev.platform_data) { +	pdata = dev_get_platdata(&client->dev); +	if (!pdata) +		pdata = mms114_parse_dt(&client->dev); + +	if (!pdata) {  		dev_err(&client->dev, "Need platform data\n");  		return -EINVAL;  	} @@ -389,7 +439,7 @@ static int __devinit mms114_probe(struct i2c_client *client,  	data->client = client;  	data->input_dev = input_dev; -	data->pdata = client->dev.platform_data; +	data->pdata = pdata;  	input_dev->name = "MELPAS MMS114 Touchscreen";  	input_dev->id.bustype = BUS_I2C; @@ -458,7 +508,7 @@ err_free_mem:  	return error;  } -static int __devexit mms114_remove(struct i2c_client *client) +static int mms114_remove(struct i2c_client *client)  {  	struct mms114_data *data = i2c_get_clientdata(client); @@ -525,14 +575,22 @@ static const struct i2c_device_id mms114_id[] = {  };  MODULE_DEVICE_TABLE(i2c, mms114_id); +#ifdef CONFIG_OF +static struct of_device_id mms114_dt_match[] = { +	{ .compatible = "melfas,mms114" }, +	{ } +}; +#endif +  static struct i2c_driver mms114_driver = {  	.driver = {  		.name	= "mms114",  		.owner	= THIS_MODULE,  		.pm	= &mms114_pm_ops, +		.of_match_table = of_match_ptr(mms114_dt_match),  	},  	.probe		= mms114_probe, -	.remove		= __devexit_p(mms114_remove), +	.remove		= mms114_remove,  	.id_table	= mms114_id,  }; diff --git a/drivers/input/touchscreen/pcap_ts.c b/drivers/input/touchscreen/pcap_ts.c index f57aeb80f7e..f22e04dd4e1 100644 --- a/drivers/input/touchscreen/pcap_ts.c +++ b/drivers/input/touchscreen/pcap_ts.c @@ -137,7 +137,7 @@ static void pcap_ts_close(struct input_dev *dev)  				pcap_ts->read_state << PCAP_ADC_TS_M_SHIFT);  } -static int __devinit pcap_ts_probe(struct platform_device *pdev) +static int pcap_ts_probe(struct platform_device *pdev)  {  	struct input_dev *input_dev;  	struct pcap_ts *pcap_ts; @@ -202,7 +202,7 @@ fail:  	return err;  } -static int __devexit pcap_ts_remove(struct platform_device *pdev) +static int pcap_ts_remove(struct platform_device *pdev)  {  	struct pcap_ts *pcap_ts = platform_get_drvdata(pdev); @@ -245,7 +245,7 @@ static const struct dev_pm_ops pcap_ts_pm_ops = {  static struct platform_driver pcap_ts_driver = {  	.probe		= pcap_ts_probe, -	.remove		= __devexit_p(pcap_ts_remove), +	.remove		= pcap_ts_remove,  	.driver		= {  		.name	= "pcap-ts",  		.owner	= THIS_MODULE, diff --git a/drivers/input/touchscreen/pixcir_i2c_ts.c b/drivers/input/touchscreen/pixcir_i2c_ts.c index 953b4c105ca..6cc6b36663f 100644 --- a/drivers/input/touchscreen/pixcir_i2c_ts.c +++ b/drivers/input/touchscreen/pixcir_i2c_ts.c @@ -125,7 +125,7 @@ static int pixcir_i2c_ts_resume(struct device *dev)  static SIMPLE_DEV_PM_OPS(pixcir_dev_pm_ops,  			 pixcir_i2c_ts_suspend, pixcir_i2c_ts_resume); -static int __devinit pixcir_i2c_ts_probe(struct i2c_client *client, +static int pixcir_i2c_ts_probe(struct i2c_client *client,  					 const struct i2c_device_id *id)  {  	const struct pixcir_ts_platform_data *pdata = client->dev.platform_data; @@ -189,7 +189,7 @@ err_free_mem:  	return error;  } -static int __devexit pixcir_i2c_ts_remove(struct i2c_client *client) +static int pixcir_i2c_ts_remove(struct i2c_client *client)  {  	struct pixcir_i2c_ts_data *tsdata = i2c_get_clientdata(client); @@ -218,7 +218,7 @@ static struct i2c_driver pixcir_i2c_ts_driver = {  		.pm	= &pixcir_dev_pm_ops,  	},  	.probe		= pixcir_i2c_ts_probe, -	.remove		= __devexit_p(pixcir_i2c_ts_remove), +	.remove		= pixcir_i2c_ts_remove,  	.id_table	= pixcir_i2c_ts_id,  }; diff --git a/drivers/input/touchscreen/s3c2410_ts.c b/drivers/input/touchscreen/s3c2410_ts.c index 549fa29548f..b061af2c837 100644 --- a/drivers/input/touchscreen/s3c2410_ts.c +++ b/drivers/input/touchscreen/s3c2410_ts.c @@ -238,7 +238,7 @@ static void s3c24xx_ts_select(struct s3c_adc_client *client, unsigned select)   * Initialise, find and allocate any resources we need to run and then   * register with the ADC and input systems.   */ -static int __devinit s3c2410ts_probe(struct platform_device *pdev) +static int s3c2410ts_probe(struct platform_device *pdev)  {  	struct s3c2410_ts_mach_info *info;  	struct device *dev = &pdev->dev; @@ -365,7 +365,7 @@ static int __devinit s3c2410ts_probe(struct platform_device *pdev)   *   * Free up our state ready to be removed.   */ -static int __devexit s3c2410ts_remove(struct platform_device *pdev) +static int s3c2410ts_remove(struct platform_device *pdev)  {  	free_irq(ts.irq_tc, ts.input);  	del_timer_sync(&touch_timer); @@ -430,7 +430,7 @@ static struct platform_driver s3c_ts_driver = {  	},  	.id_table	= s3cts_driver_ids,  	.probe		= s3c2410ts_probe, -	.remove		= __devexit_p(s3c2410ts_remove), +	.remove		= s3c2410ts_remove,  };  module_platform_driver(s3c_ts_driver); diff --git a/drivers/input/touchscreen/st1232.c b/drivers/input/touchscreen/st1232.c index 6cb68a1981b..d9d05e22242 100644 --- a/drivers/input/touchscreen/st1232.c +++ b/drivers/input/touchscreen/st1232.c @@ -139,7 +139,7 @@ end:  	return IRQ_HANDLED;  } -static int __devinit st1232_ts_probe(struct i2c_client *client, +static int st1232_ts_probe(struct i2c_client *client,  					const struct i2c_device_id *id)  {  	struct st1232_ts_data *ts; @@ -206,7 +206,7 @@ err_free_mem:  	return error;  } -static int __devexit st1232_ts_remove(struct i2c_client *client) +static int st1232_ts_remove(struct i2c_client *client)  {  	struct st1232_ts_data *ts = i2c_get_clientdata(client); @@ -255,7 +255,7 @@ static const struct i2c_device_id st1232_ts_id[] = {  MODULE_DEVICE_TABLE(i2c, st1232_ts_id);  #ifdef CONFIG_OF -static const struct of_device_id st1232_ts_dt_ids[] __devinitconst = { +static const struct of_device_id st1232_ts_dt_ids[] = {  	{ .compatible = "sitronix,st1232", },  	{ }  }; @@ -264,7 +264,7 @@ MODULE_DEVICE_TABLE(of, st1232_ts_dt_ids);  static struct i2c_driver st1232_ts_driver = {  	.probe		= st1232_ts_probe, -	.remove		= __devexit_p(st1232_ts_remove), +	.remove		= st1232_ts_remove,  	.id_table	= st1232_ts_id,  	.driver = {  		.name	= ST1232_TS_NAME, diff --git a/drivers/input/touchscreen/stmpe-ts.c b/drivers/input/touchscreen/stmpe-ts.c index 692b685720c..84d884b4ec3 100644 --- a/drivers/input/touchscreen/stmpe-ts.c +++ b/drivers/input/touchscreen/stmpe-ts.c @@ -1,4 +1,5 @@ -/* STMicroelectronics STMPE811 Touchscreen Driver +/* + * STMicroelectronics STMPE811 Touchscreen Driver   *   * (C) 2010 Luotao Fu <l.fu@pengutronix.de>   * All rights reserved. @@ -16,6 +17,7 @@  #include <linux/interrupt.h>  #include <linux/init.h>  #include <linux/device.h> +#include <linux/of.h>  #include <linux/platform_device.h>  #include <linux/input.h>  #include <linux/slab.h> @@ -166,7 +168,7 @@ static irqreturn_t stmpe_ts_handler(int irq, void *data)  	return IRQ_HANDLED;  } -static int __devinit stmpe_init_hw(struct stmpe_touch *ts) +static int stmpe_init_hw(struct stmpe_touch *ts)  {  	int ret;  	u8 adc_ctrl1, adc_ctrl1_mask, tsc_cfg, tsc_cfg_mask; @@ -261,41 +263,18 @@ static void stmpe_ts_close(struct input_dev *dev)  			STMPE_TSC_CTRL_TSC_EN, 0);  } -static int __devinit stmpe_input_probe(struct platform_device *pdev) +static void stmpe_ts_get_platform_info(struct platform_device *pdev, +					struct stmpe_touch *ts)  {  	struct stmpe *stmpe = dev_get_drvdata(pdev->dev.parent); -	struct stmpe_platform_data *pdata = stmpe->pdata; -	struct stmpe_touch *ts; -	struct input_dev *idev; +	struct device_node *np = pdev->dev.of_node;  	struct stmpe_ts_platform_data *ts_pdata = NULL; -	int ret; -	int ts_irq; -	ts_irq = platform_get_irq_byname(pdev, "FIFO_TH"); -	if (ts_irq < 0) -		return ts_irq; - -	ts = kzalloc(sizeof(*ts), GFP_KERNEL); -	if (!ts) { -		ret = -ENOMEM; -		goto err_out; -	} - -	idev = input_allocate_device(); -	if (!idev) { -		ret = -ENOMEM; -		goto err_free_ts; -	} - -	platform_set_drvdata(pdev, ts);  	ts->stmpe = stmpe; -	ts->idev = idev; -	ts->dev = &pdev->dev; -	if (pdata) -		ts_pdata = pdata->ts; +	if (stmpe->pdata && stmpe->pdata->ts) { +		ts_pdata = stmpe->pdata->ts; -	if (ts_pdata) {  		ts->sample_time = ts_pdata->sample_time;  		ts->mod_12b = ts_pdata->mod_12b;  		ts->ref_sel = ts_pdata->ref_sel; @@ -305,22 +284,71 @@ static int __devinit stmpe_input_probe(struct platform_device *pdev)  		ts->settling = ts_pdata->settling;  		ts->fraction_z = ts_pdata->fraction_z;  		ts->i_drive = ts_pdata->i_drive; +	} else if (np) { +		u32 val; + +		if (!of_property_read_u32(np, "st,sample-time", &val)) +			ts->sample_time = val; +		if (!of_property_read_u32(np, "st,mod-12b", &val)) +			ts->mod_12b = val; +		if (!of_property_read_u32(np, "st,ref-sel", &val)) +			ts->ref_sel = val; +		if (!of_property_read_u32(np, "st,adc-freq", &val)) +			ts->adc_freq = val; +		if (!of_property_read_u32(np, "st,ave-ctrl", &val)) +			ts->ave_ctrl = val; +		if (!of_property_read_u32(np, "st,touch-det-delay", &val)) +			ts->touch_det_delay = val; +		if (!of_property_read_u32(np, "st,settling", &val)) +			ts->settling = val; +		if (!of_property_read_u32(np, "st,fraction-z", &val)) +			ts->fraction_z = val; +		if (!of_property_read_u32(np, "st,i-drive", &val)) +			ts->i_drive = val;  	} +} + +static int stmpe_input_probe(struct platform_device *pdev) +{ +	struct stmpe_touch *ts; +	struct input_dev *idev; +	int error; +	int ts_irq; + +	ts_irq = platform_get_irq_byname(pdev, "FIFO_TH"); +	if (ts_irq < 0) +		return ts_irq; + +	ts = devm_kzalloc(&pdev->dev, sizeof(*ts), GFP_KERNEL); +	if (!ts) +		return -ENOMEM; + +	idev = devm_input_allocate_device(&pdev->dev); +	if (!idev) +		return -ENOMEM; + +	platform_set_drvdata(pdev, ts); +	ts->idev = idev; +	ts->dev = &pdev->dev; + +	stmpe_ts_get_platform_info(pdev, ts);  	INIT_DELAYED_WORK(&ts->work, stmpe_work); -	ret = request_threaded_irq(ts_irq, NULL, stmpe_ts_handler, -			IRQF_ONESHOT, STMPE_TS_NAME, ts); -	if (ret) { +	error = devm_request_threaded_irq(&pdev->dev, ts_irq, +					  NULL, stmpe_ts_handler, +					  IRQF_ONESHOT, STMPE_TS_NAME, ts); +	if (error) {  		dev_err(&pdev->dev, "Failed to request IRQ %d\n", ts_irq); -		goto err_free_input; +		return error;  	} -	ret = stmpe_init_hw(ts); -	if (ret) -		goto err_free_irq; +	error = stmpe_init_hw(ts); +	if (error) +		return error;  	idev->name = STMPE_TS_NAME; +	idev->phys = STMPE_TS_NAME"/input0";  	idev->id.bustype = BUS_I2C;  	idev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);  	idev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); @@ -334,40 +362,21 @@ static int __devinit stmpe_input_probe(struct platform_device *pdev)  	input_set_abs_params(idev, ABS_Y, 0, XY_MASK, 0, 0);  	input_set_abs_params(idev, ABS_PRESSURE, 0x0, 0xff, 0, 0); -	ret = input_register_device(idev); -	if (ret) { +	error = input_register_device(idev); +	if (error) {  		dev_err(&pdev->dev, "Could not register input device\n"); -		goto err_free_irq; +		return error;  	} -	return ret; - -err_free_irq: -	free_irq(ts_irq, ts); -err_free_input: -	input_free_device(idev); -	platform_set_drvdata(pdev, NULL); -err_free_ts: -	kfree(ts); -err_out: -	return ret; +	return 0;  } -static int __devexit stmpe_ts_remove(struct platform_device *pdev) +static int stmpe_ts_remove(struct platform_device *pdev)  {  	struct stmpe_touch *ts = platform_get_drvdata(pdev); -	unsigned int ts_irq = platform_get_irq_byname(pdev, "FIFO_TH");  	stmpe_disable(ts->stmpe, STMPE_BLOCK_TOUCHSCREEN); -	free_irq(ts_irq, ts); - -	platform_set_drvdata(pdev, NULL); - -	input_unregister_device(ts->idev); - -	kfree(ts); -  	return 0;  } @@ -377,7 +386,7 @@ static struct platform_driver stmpe_ts_driver = {  		   .owner = THIS_MODULE,  		   },  	.probe = stmpe_input_probe, -	.remove = __devexit_p(stmpe_ts_remove), +	.remove = stmpe_ts_remove,  };  module_platform_driver(stmpe_ts_driver); diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c index 7a18a8a1522..51e7b87827a 100644 --- a/drivers/input/touchscreen/ti_am335x_tsc.c +++ b/drivers/input/touchscreen/ti_am335x_tsc.c @@ -258,7 +258,7 @@ static irqreturn_t titsc_irq(int irq, void *dev)   * The functions for inserting/removing driver as a module.   */ -static int __devinit titsc_probe(struct platform_device *pdev) +static int titsc_probe(struct platform_device *pdev)  {  	struct titsc *ts_dev;  	struct input_dev *input_dev; @@ -327,7 +327,7 @@ err_free_mem:  	return err;  } -static int __devexit titsc_remove(struct platform_device *pdev) +static int titsc_remove(struct platform_device *pdev)  {  	struct ti_tscadc_dev *tscadc_dev = pdev->dev.platform_data;  	struct titsc *ts_dev = tscadc_dev->tsc; @@ -384,7 +384,7 @@ static const struct dev_pm_ops titsc_pm_ops = {  static struct platform_driver ti_tsc_driver = {  	.probe	= titsc_probe, -	.remove	= __devexit_p(titsc_remove), +	.remove	= titsc_remove,  	.driver	= {  		.name   = "tsc",  		.owner	= THIS_MODULE, diff --git a/drivers/input/touchscreen/tnetv107x-ts.c b/drivers/input/touchscreen/tnetv107x-ts.c index 368d2c6cf78..acfb87607b8 100644 --- a/drivers/input/touchscreen/tnetv107x-ts.c +++ b/drivers/input/touchscreen/tnetv107x-ts.c @@ -243,7 +243,7 @@ static void tsc_stop(struct input_dev *dev)  	clk_disable(ts->clk);  } -static int __devinit tsc_probe(struct platform_device *pdev) +static int tsc_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	struct tsc_data *ts; @@ -357,7 +357,7 @@ error_res:  	return error;  } -static int __devexit tsc_remove(struct platform_device *pdev) +static int tsc_remove(struct platform_device *pdev)  {  	struct tsc_data *ts = platform_get_drvdata(pdev); @@ -374,7 +374,7 @@ static int __devexit tsc_remove(struct platform_device *pdev)  static struct platform_driver tsc_driver = {  	.probe		= tsc_probe, -	.remove		= __devexit_p(tsc_remove), +	.remove		= tsc_remove,  	.driver.name	= "tnetv107x-ts",  	.driver.owner	= THIS_MODULE,  }; diff --git a/drivers/input/touchscreen/tps6507x-ts.c b/drivers/input/touchscreen/tps6507x-ts.c index f7eda3d00fa..820a066c3b8 100644 --- a/drivers/input/touchscreen/tps6507x-ts.c +++ b/drivers/input/touchscreen/tps6507x-ts.c @@ -345,7 +345,7 @@ err0:  	return error;  } -static int __devexit tps6507x_ts_remove(struct platform_device *pdev) +static int tps6507x_ts_remove(struct platform_device *pdev)  {  	struct tps6507x_dev *tps6507x_dev = platform_get_drvdata(pdev);  	struct tps6507x_ts *tsc = tps6507x_dev->ts; @@ -367,7 +367,7 @@ static struct platform_driver tps6507x_ts_driver = {  		.owner = THIS_MODULE,  	},  	.probe = tps6507x_ts_probe, -	.remove = __devexit_p(tps6507x_ts_remove), +	.remove = tps6507x_ts_remove,  };  module_platform_driver(tps6507x_ts_driver); diff --git a/drivers/input/touchscreen/tsc2005.c b/drivers/input/touchscreen/tsc2005.c index 5ce3fa8ce64..9c0cdc7ea44 100644 --- a/drivers/input/touchscreen/tsc2005.c +++ b/drivers/input/touchscreen/tsc2005.c @@ -555,7 +555,7 @@ static void tsc2005_close(struct input_dev *input)  	mutex_unlock(&ts->mutex);  } -static void __devinit tsc2005_setup_spi_xfer(struct tsc2005 *ts) +static void tsc2005_setup_spi_xfer(struct tsc2005 *ts)  {  	tsc2005_setup_read(&ts->spi_x, TSC2005_REG_X, false);  	tsc2005_setup_read(&ts->spi_y, TSC2005_REG_Y, false); @@ -569,7 +569,7 @@ static void __devinit tsc2005_setup_spi_xfer(struct tsc2005 *ts)  	spi_message_add_tail(&ts->spi_z2.spi_xfer, &ts->spi_read_msg);  } -static int __devinit tsc2005_probe(struct spi_device *spi) +static int tsc2005_probe(struct spi_device *spi)  {  	const struct tsc2005_platform_data *pdata = spi->dev.platform_data;  	struct tsc2005 *ts; @@ -686,7 +686,7 @@ err_free_mem:  	return error;  } -static int __devexit tsc2005_remove(struct spi_device *spi) +static int tsc2005_remove(struct spi_device *spi)  {  	struct tsc2005 *ts = spi_get_drvdata(spi); @@ -745,7 +745,7 @@ static struct spi_driver tsc2005_driver = {  		.pm	= &tsc2005_pm_ops,  	},  	.probe	= tsc2005_probe, -	.remove	= __devexit_p(tsc2005_remove), +	.remove	= tsc2005_remove,  };  module_spi_driver(tsc2005_driver); diff --git a/drivers/input/touchscreen/tsc2007.c b/drivers/input/touchscreen/tsc2007.c index 1473d2382af..0b67ba476b4 100644 --- a/drivers/input/touchscreen/tsc2007.c +++ b/drivers/input/touchscreen/tsc2007.c @@ -273,7 +273,7 @@ static void tsc2007_close(struct input_dev *input_dev)  	tsc2007_stop(ts);  } -static int __devinit tsc2007_probe(struct i2c_client *client, +static int tsc2007_probe(struct i2c_client *client,  				   const struct i2c_device_id *id)  {  	struct tsc2007 *ts; @@ -366,7 +366,7 @@ static int __devinit tsc2007_probe(struct i2c_client *client,  	return err;  } -static int __devexit tsc2007_remove(struct i2c_client *client) +static int tsc2007_remove(struct i2c_client *client)  {  	struct tsc2007	*ts = i2c_get_clientdata(client);  	struct tsc2007_platform_data *pdata = client->dev.platform_data; @@ -396,7 +396,7 @@ static struct i2c_driver tsc2007_driver = {  	},  	.id_table	= tsc2007_idtable,  	.probe		= tsc2007_probe, -	.remove		= __devexit_p(tsc2007_remove), +	.remove		= tsc2007_remove,  };  module_i2c_driver(tsc2007_driver); diff --git a/drivers/input/touchscreen/ucb1400_ts.c b/drivers/input/touchscreen/ucb1400_ts.c index 46e83ad53f4..1271f97b407 100644 --- a/drivers/input/touchscreen/ucb1400_ts.c +++ b/drivers/input/touchscreen/ucb1400_ts.c @@ -274,7 +274,7 @@ static void ucb1400_ts_close(struct input_dev *idev)   * Try to probe our interrupt, rather than relying on lots of   * hard-coded machine dependencies.   */ -static int __devinit ucb1400_ts_detect_irq(struct ucb1400_ts *ucb, +static int ucb1400_ts_detect_irq(struct ucb1400_ts *ucb,  					   struct platform_device *pdev)  {  	unsigned long mask, timeout; @@ -318,7 +318,7 @@ static int __devinit ucb1400_ts_detect_irq(struct ucb1400_ts *ucb,  	return 0;  } -static int __devinit ucb1400_ts_probe(struct platform_device *pdev) +static int ucb1400_ts_probe(struct platform_device *pdev)  {  	struct ucb1400_ts *ucb = pdev->dev.platform_data;  	int error, x_res, y_res; @@ -397,7 +397,7 @@ err:  	return error;  } -static int __devexit ucb1400_ts_remove(struct platform_device *pdev) +static int ucb1400_ts_remove(struct platform_device *pdev)  {  	struct ucb1400_ts *ucb = pdev->dev.platform_data; @@ -442,7 +442,7 @@ static SIMPLE_DEV_PM_OPS(ucb1400_ts_pm_ops,  static struct platform_driver ucb1400_ts_driver = {  	.probe	= ucb1400_ts_probe, -	.remove	= __devexit_p(ucb1400_ts_remove), +	.remove	= ucb1400_ts_remove,  	.driver	= {  		.name	= "ucb1400_ts",  		.owner	= THIS_MODULE, diff --git a/drivers/input/touchscreen/w90p910_ts.c b/drivers/input/touchscreen/w90p910_ts.c index 9396b21d0e8..d2ef8f05c66 100644 --- a/drivers/input/touchscreen/w90p910_ts.c +++ b/drivers/input/touchscreen/w90p910_ts.c @@ -215,7 +215,7 @@ static void w90p910_close(struct input_dev *dev)  	clk_disable(w90p910_ts->clk);  } -static int __devinit w90x900ts_probe(struct platform_device *pdev) +static int w90x900ts_probe(struct platform_device *pdev)  {  	struct w90p910_ts *w90p910_ts;  	struct input_dev *input_dev; @@ -301,7 +301,7 @@ fail1:	input_free_device(input_dev);  	return err;  } -static int __devexit w90x900ts_remove(struct platform_device *pdev) +static int w90x900ts_remove(struct platform_device *pdev)  {  	struct w90p910_ts *w90p910_ts = platform_get_drvdata(pdev);  	struct resource *res; @@ -325,7 +325,7 @@ static int __devexit w90x900ts_remove(struct platform_device *pdev)  static struct platform_driver w90x900ts_driver = {  	.probe		= w90x900ts_probe, -	.remove		= __devexit_p(w90x900ts_remove), +	.remove		= w90x900ts_remove,  	.driver		= {  		.name	= "nuc900-ts",  		.owner	= THIS_MODULE, diff --git a/drivers/input/touchscreen/wacom_i2c.c b/drivers/input/touchscreen/wacom_i2c.c index 0c01657132f..bf0d07620ba 100644 --- a/drivers/input/touchscreen/wacom_i2c.c +++ b/drivers/input/touchscreen/wacom_i2c.c @@ -144,7 +144,7 @@ static void wacom_i2c_close(struct input_dev *dev)  	disable_irq(client->irq);  } -static int __devinit wacom_i2c_probe(struct i2c_client *client, +static int wacom_i2c_probe(struct i2c_client *client,  				     const struct i2c_device_id *id)  {  	struct wacom_i2c *wac_i2c; @@ -225,7 +225,7 @@ err_free_mem:  	return error;  } -static int __devexit wacom_i2c_remove(struct i2c_client *client) +static int wacom_i2c_remove(struct i2c_client *client)  {  	struct wacom_i2c *wac_i2c = i2c_get_clientdata(client); @@ -272,7 +272,7 @@ static struct i2c_driver wacom_i2c_driver = {  	},  	.probe		= wacom_i2c_probe, -	.remove		= __devexit_p(wacom_i2c_remove), +	.remove		= wacom_i2c_remove,  	.id_table	= wacom_i2c_id,  };  module_i2c_driver(wacom_i2c_driver); diff --git a/drivers/input/touchscreen/wm831x-ts.c b/drivers/input/touchscreen/wm831x-ts.c index 52abb98a8ae..f88fab56178 100644 --- a/drivers/input/touchscreen/wm831x-ts.c +++ b/drivers/input/touchscreen/wm831x-ts.c @@ -233,7 +233,7 @@ static void wm831x_ts_input_close(struct input_dev *idev)  	}  } -static __devinit int wm831x_ts_probe(struct platform_device *pdev) +static int wm831x_ts_probe(struct platform_device *pdev)  {  	struct wm831x_ts *wm831x_ts;  	struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent); @@ -245,7 +245,8 @@ static __devinit int wm831x_ts_probe(struct platform_device *pdev)  	if (core_pdata)  		pdata = core_pdata->touch; -	wm831x_ts = kzalloc(sizeof(struct wm831x_ts), GFP_KERNEL); +	wm831x_ts = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ts), +				 GFP_KERNEL);  	input_dev = input_allocate_device();  	if (!wm831x_ts || !input_dev) {  		error = -ENOMEM; @@ -376,21 +377,18 @@ err_data_irq:  	free_irq(wm831x_ts->data_irq, wm831x_ts);  err_alloc:  	input_free_device(input_dev); -	kfree(wm831x_ts);  	return error;  } -static __devexit int wm831x_ts_remove(struct platform_device *pdev) +static int wm831x_ts_remove(struct platform_device *pdev)  {  	struct wm831x_ts *wm831x_ts = platform_get_drvdata(pdev);  	free_irq(wm831x_ts->pd_irq, wm831x_ts);  	free_irq(wm831x_ts->data_irq, wm831x_ts);  	input_unregister_device(wm831x_ts->input_dev); -	kfree(wm831x_ts); -	platform_set_drvdata(pdev, NULL);  	return 0;  } @@ -400,7 +398,7 @@ static struct platform_driver wm831x_ts_driver = {  		.owner = THIS_MODULE,  	},  	.probe = wm831x_ts_probe, -	.remove = __devexit_p(wm831x_ts_remove), +	.remove = wm831x_ts_remove,  };  module_platform_driver(wm831x_ts_driver);  |