i2c: i2c-dev: Create 'name' attribute automatically
The 'name' attribute is needed for all i2c-dev class devices, meaning it can be created automatically by pointing to it in the class data structure. This simplifies the code and reduces the probability for race conditions (the name attribute should exist by the time the device is announced to user space). Signed-off-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
This commit is contained in:
parent
15c03dd485
commit
45f176aea6
|
@ -102,8 +102,8 @@ static void return_i2c_dev(struct i2c_dev *i2c_dev)
|
|||
kfree(i2c_dev);
|
||||
}
|
||||
|
||||
static ssize_t show_adapter_name(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t name_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct i2c_dev *i2c_dev = i2c_dev_get_by_minor(MINOR(dev->devt));
|
||||
|
||||
|
@ -111,7 +111,13 @@ static ssize_t show_adapter_name(struct device *dev,
|
|||
return -ENODEV;
|
||||
return sprintf(buf, "%s\n", i2c_dev->adap->name);
|
||||
}
|
||||
static DEVICE_ATTR(name, S_IRUGO, show_adapter_name, NULL);
|
||||
static DEVICE_ATTR_RO(name);
|
||||
|
||||
static struct attribute *i2c_attrs[] = {
|
||||
&dev_attr_name.attr,
|
||||
NULL,
|
||||
};
|
||||
ATTRIBUTE_GROUPS(i2c);
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
|
@ -562,15 +568,10 @@ static int i2cdev_attach_adapter(struct device *dev, void *dummy)
|
|||
res = PTR_ERR(i2c_dev->dev);
|
||||
goto error;
|
||||
}
|
||||
res = device_create_file(i2c_dev->dev, &dev_attr_name);
|
||||
if (res)
|
||||
goto error_destroy;
|
||||
|
||||
pr_debug("i2c-dev: adapter [%s] registered as minor %d\n",
|
||||
adap->name, adap->nr);
|
||||
return 0;
|
||||
error_destroy:
|
||||
device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, adap->nr));
|
||||
error:
|
||||
return_i2c_dev(i2c_dev);
|
||||
return res;
|
||||
|
@ -589,7 +590,6 @@ static int i2cdev_detach_adapter(struct device *dev, void *dummy)
|
|||
if (!i2c_dev) /* attach_adapter must have failed */
|
||||
return 0;
|
||||
|
||||
device_remove_file(i2c_dev->dev, &dev_attr_name);
|
||||
return_i2c_dev(i2c_dev);
|
||||
device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, adap->nr));
|
||||
|
||||
|
@ -637,6 +637,7 @@ static int __init i2c_dev_init(void)
|
|||
res = PTR_ERR(i2c_dev_class);
|
||||
goto out_unreg_chrdev;
|
||||
}
|
||||
i2c_dev_class->dev_groups = i2c_groups;
|
||||
|
||||
/* Keep track of adapters which will be added or removed later */
|
||||
res = bus_register_notifier(&i2c_bus_type, &i2cdev_notifier);
|
||||
|
|
Loading…
Reference in New Issue