diff options
Diffstat (limited to 'drivers/i2c/i2c-smbus.c')
| -rw-r--r-- | drivers/i2c/i2c-smbus.c | 43 | 
1 files changed, 16 insertions, 27 deletions
diff --git a/drivers/i2c/i2c-smbus.c b/drivers/i2c/i2c-smbus.c index f61ccc1e5ea..fc99f0d6b4a 100644 --- a/drivers/i2c/i2c-smbus.c +++ b/drivers/i2c/i2c-smbus.c @@ -2,7 +2,7 @@   * i2c-smbus.c - SMBus extensions to the I2C protocol   *   * Copyright (C) 2008 David Brownell - * Copyright (C) 2010 Jean Delvare <khali@linux-fr.org> + * Copyright (C) 2010 Jean Delvare <jdelvare@suse.de>   *   * 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 @@ -16,7 +16,8 @@   *   * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA.   */  #include <linux/kernel.h> @@ -45,6 +46,7 @@ static int smbus_do_alert(struct device *dev, void *addrp)  {  	struct i2c_client *client = i2c_verify_client(dev);  	struct alert_data *data = addrp; +	struct i2c_driver *driver;  	if (!client || client->addr != data->addr)  		return 0; @@ -53,12 +55,13 @@ static int smbus_do_alert(struct device *dev, void *addrp)  	/*  	 * Drivers should either disable alerts, or provide at least -	 * a minimal handler.  Lock so client->driver won't change. +	 * a minimal handler.  Lock so the driver won't change.  	 */  	device_lock(dev); -	if (client->driver) { -		if (client->driver->alert) -			client->driver->alert(client, data->flag); +	if (client->dev.driver) { +		driver = to_i2c_driver(client->dev.driver); +		if (driver->alert) +			driver->alert(client, data->flag);  		else  			dev_warn(&client->dev, "no driver alert()!\n");  	} else @@ -136,12 +139,13 @@ static irqreturn_t smbalert_irq(int irq, void *d)  static int smbalert_probe(struct i2c_client *ara,  			  const struct i2c_device_id *id)  { -	struct i2c_smbus_alert_setup *setup = ara->dev.platform_data; +	struct i2c_smbus_alert_setup *setup = dev_get_platdata(&ara->dev);  	struct i2c_smbus_alert *alert;  	struct i2c_adapter *adapter = ara->adapter;  	int res; -	alert = kzalloc(sizeof(struct i2c_smbus_alert), GFP_KERNEL); +	alert = devm_kzalloc(&ara->dev, sizeof(struct i2c_smbus_alert), +			     GFP_KERNEL);  	if (!alert)  		return -ENOMEM; @@ -153,10 +157,8 @@ static int smbalert_probe(struct i2c_client *ara,  	if (setup->irq > 0) {  		res = devm_request_irq(&ara->dev, setup->irq, smbalert_irq,  				       0, "smbus_alert", alert); -		if (res) { -			kfree(alert); +		if (res)  			return res; -		}  	}  	i2c_set_clientdata(ara, alert); @@ -166,14 +168,12 @@ static int smbalert_probe(struct i2c_client *ara,  	return 0;  } -/* IRQ resource is managed so it is freed automatically */ +/* IRQ and memory resources are managed so they are freed automatically */  static int smbalert_remove(struct i2c_client *ara)  {  	struct i2c_smbus_alert *alert = i2c_get_clientdata(ara);  	cancel_work_sync(&alert->alert); - -	kfree(alert);  	return 0;  } @@ -244,19 +244,8 @@ int i2c_handle_smbus_alert(struct i2c_client *ara)  }  EXPORT_SYMBOL_GPL(i2c_handle_smbus_alert); -static int __init i2c_smbus_init(void) -{ -	return i2c_add_driver(&smbalert_driver); -} - -static void __exit i2c_smbus_exit(void) -{ -	i2c_del_driver(&smbalert_driver); -} - -module_init(i2c_smbus_init); -module_exit(i2c_smbus_exit); +module_i2c_driver(smbalert_driver); -MODULE_AUTHOR("Jean Delvare <khali@linux-fr.org>"); +MODULE_AUTHOR("Jean Delvare <jdelvare@suse.de>");  MODULE_DESCRIPTION("SMBus protocol extensions support");  MODULE_LICENSE("GPL");  | 
