[PATCH] f75375s: Add new style bindings

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi:

This is really nice.  I only found a couple nits, so I just made the changes
(inline below) and applied it to hwmon-2.6.git/testing; thanks.

* Riku Voipio <riku.voipio at movial.fi> [2007-10-16 12:46:49 +0300]:
> Unsuprisingly, the first version was plain ignored. So this patch had to be
> refreshed against 2.6.23...
> 
> Following the example of David Brownell's work on lm75:
> 
>  - Create a second driver struct, using new-style driver binding methods.
> 
>  - Rename the old driver struct as f75375_legacy_driver.
> 
>  - Make the legacy bind/unbind logic delegate all its work.
> 
> Signed-off-by: Riku Voipio <riku.voipio at movial.fi>
> ---
>  drivers/hwmon/f75375s.c |  112 +++++++++++++++++++++++++++++++++++-----------
>  1 files changed, 85 insertions(+), 27 deletions(-)
> 
> diff --git a/drivers/hwmon/f75375s.c b/drivers/hwmon/f75375s.c
> index 13a0413..0ac3fc2 100644
> --- a/drivers/hwmon/f75375s.c
> +++ b/drivers/hwmon/f75375s.c
> @@ -86,7 +86,7 @@ I2C_CLIENT_INSMOD_2(f75373, f75375);
>  
>  struct f75375_data {
>  	unsigned short addr;
> -	struct i2c_client client;
> +	struct i2c_client *client;
>  	struct device *hwmon_dev;
>  
>  	const char *name;
> @@ -116,15 +116,26 @@ struct f75375_data {
>  static int f75375_attach_adapter(struct i2c_adapter *adapter);
>  static int f75375_detect(struct i2c_adapter *adapter, int address, int kind);
>  static int f75375_detach_client(struct i2c_client *client);
> +static int f75375_probe(struct i2c_client *client);
> +static int f75375_remove(struct i2c_client *client);
>  
> -static struct i2c_driver f75375_driver = {
> +static struct i2c_driver f75375_legacy_driver = {
>  	.driver = {
> -		.name = "f75375",
> +		.name = "f75375_legacy",
>  	},
>  	.attach_adapter = f75375_attach_adapter,
>  	.detach_client = f75375_detach_client,
>  };
>  
> +static struct i2c_driver f75375_driver = {
> +	.driver = {
> +		.name = "f75375",
> +	},
> +	.probe = f75375_probe,
> +	.remove = f75375_remove,
> +};
> +
> +

extra newline

>  static inline int f75375_read8(struct i2c_client *client, u8 reg)
>  {
>  	return i2c_smbus_read_byte_data(client, reg);
> @@ -580,12 +591,8 @@ static const struct attribute_group f75375_group = {
>  
>  static int f75375_detach_client(struct i2c_client *client)
>  {
> -	struct f75375_data *data = i2c_get_clientdata(client);
>  	int err;
> -
> -	hwmon_device_unregister(data->hwmon_dev);
> -	sysfs_remove_group(&client->dev.kobj, &f75375_group);
> -

added a newline here

> +	f75375_remove(client);
>  	err = i2c_detach_client(client);
>  	if (err) {
>  		dev_err(&client->dev,
> @@ -593,10 +600,64 @@ static int f75375_detach_client(struct i2c_client *client)
>  			"client not detached.\n");
>  		return err;
>  	}
> +	kfree(client);
> +	return 0;
> +}
> +
> +static int f75375_probe(struct i2c_client *client)
> +{
> +	struct f75375_data *data = i2c_get_clientdata(client);
> +	int err;
> +
> +	if (!i2c_check_functionality(client->adapter,
> +				I2C_FUNC_SMBUS_BYTE_DATA))
> +		return -EIO;
> +	if (!(data = kzalloc(sizeof(struct f75375_data), GFP_KERNEL)))
> +		return -ENOMEM;
> +
> +	i2c_set_clientdata(client, data);
> +	data->client = client;
> +	mutex_init(&data->update_lock);
> +
> +	if (strcmp(client->name, "f75375") == 0)
> +		data->kind = f75375;
> +	else if (strcmp(client->name, "f75373") == 0)
> +		data->kind = f75373;
> +	else {
> +		dev_err(&client->dev, "Unsupported device: %s\n", client->name);
> +		return -ENODEV;
> +	}
> +
> +	if ((err = sysfs_create_group(&client->dev.kobj, &f75375_group)))
> +		goto exit_free;
> +
> +	data->hwmon_dev = hwmon_device_register(&client->dev);
> +	if (IS_ERR(data->hwmon_dev)) {
> +		err = PTR_ERR(data->hwmon_dev);
> +		goto exit_remove;
> +	}
> +
> +	return 0;
> +
> +exit_remove:
> +	sysfs_remove_group(&client->dev.kobj, &f75375_group);
> +exit_free:
>  	kfree(data);
> +	i2c_set_clientdata(client, NULL);
> +	return err;
> +}
> +
> +static int f75375_remove(struct i2c_client *client)
> +{
> +	struct f75375_data *data = i2c_get_clientdata(client);
> +	hwmon_device_unregister(data->hwmon_dev);
> +	sysfs_remove_group(&client->dev.kobj, &f75375_group);
> +	kfree(data);
> +	i2c_set_clientdata(client, NULL);
>  	return 0;
>  }
>  
> +

extra newline

>  static int f75375_attach_adapter(struct i2c_adapter *adapter)
>  {
>  	if (!(adapter->class & I2C_CLASS_HWMON))
> @@ -608,20 +669,17 @@ static int f75375_attach_adapter(struct i2c_adapter *adapter)
>  static int f75375_detect(struct i2c_adapter *adapter, int address, int kind)
>  {
>  	struct i2c_client *client;
> -	struct f75375_data *data;
>  	u8 version = 0;
>  	int err = 0;
>  	const char *name = "";
>  
> -	if (!(data = kzalloc(sizeof(struct f75375_data), GFP_KERNEL))) {
> +	if (!(client = kzalloc(sizeof(*client), GFP_KERNEL))) {
>  		err = -ENOMEM;
>  		goto exit;
>  	}
> -	client = &data->client;
> -	i2c_set_clientdata(client, data);
>  	client->addr = address;
>  	client->adapter = adapter;
> -	client->driver = &f75375_driver;
> +	client->driver = &f75375_legacy_driver;
>  
>  	if (kind < 0) {
>  		u16 vendid = f75375_read16(client, F75375_REG_VENDOR);
> @@ -644,42 +702,42 @@ static int f75375_detect(struct i2c_adapter *adapter, int address, int kind)
>  	} else if (kind == f75373) {
>  		name = "f75373";
>  	}
> -
>  	dev_info(&adapter->dev, "found %s version: %02X\n", name, version);
>  	strlcpy(client->name, name, I2C_NAME_SIZE);
> -	data->kind = kind;
> -	mutex_init(&data->update_lock);
> +
>  	if ((err = i2c_attach_client(client)))
>  		goto exit_free;
>  
> -	if ((err = sysfs_create_group(&client->dev.kobj, &f75375_group)))
> +	if ((err = f75375_probe(client)) < 0)
>  		goto exit_detach;
>  
> -	data->hwmon_dev = hwmon_device_register(&client->dev);
> -	if (IS_ERR(data->hwmon_dev)) {
> -		err = PTR_ERR(data->hwmon_dev);
> -		goto exit_remove;
> -	}
> -
>  	return 0;
>  
> -exit_remove:
> -	sysfs_remove_group(&client->dev.kobj, &f75375_group);
>  exit_detach:
>  	i2c_detach_client(client);
>  exit_free:
> -	kfree(data);
> +	kfree(client);
>  exit:
>  	return err;
>  }
>  
>  static int __init sensors_f75375_init(void)
>  {
> -	return i2c_add_driver(&f75375_driver);
> +	int status;
> +	status = i2c_add_driver(&f75375_driver);
> +	if (status < 0)

if (status)

> +		return status;
> +
> +	status = i2c_add_driver(&f75375_legacy_driver);
> +	if (status < 0)

ditto

> +		i2c_del_driver(&f75375_driver);
> +
> +	return status;
>  }
>  
>  static void __exit sensors_f75375_exit(void)
>  {
> +	i2c_del_driver(&f75375_legacy_driver);
>  	i2c_del_driver(&f75375_driver);
>  }
>  
> -- 
> 1.5.3.1

-- 
Mark M. Hoffman
mhoffman at lightlink.com





[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux