Commit 3ce20a71 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

misc: c2port: use dev_bin_attrs instead of hand-coding it

Classes support a list of default binary attributes, so use that in the
c2port driver, instead of hand creating and destroying the file, which
is racing with userspace.  Bonus is this removes lines of code.

Cc: Rodolfo Giometti <giometti@linux.it>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
--
 drivers/misc/c2port/core.c |   30 +++++++++++++-----------------
 1 file changed, 13 insertions(+), 17 deletions(-)
parent 3b2f64d0
...@@ -867,14 +867,17 @@ static struct device_attribute c2port_attrs[] = { ...@@ -867,14 +867,17 @@ static struct device_attribute c2port_attrs[] = {
__ATTR_NULL, __ATTR_NULL,
}; };
static struct bin_attribute c2port_bin_attrs = { static struct bin_attribute c2port_bin_attrs[] = {
.attr = { {
.name = "flash_data", .attr = {
.mode = 0644 .name = "flash_data",
.mode = 0644
},
.read = c2port_read_flash_data,
.write = c2port_write_flash_data,
/* .size is computed at run-time */
}, },
.read = c2port_read_flash_data, __ATTR_NULL
.write = c2port_write_flash_data,
/* .size is computed at run-time */
}; };
/* /*
...@@ -907,6 +910,8 @@ struct c2port_device *c2port_device_register(char *name, ...@@ -907,6 +910,8 @@ struct c2port_device *c2port_device_register(char *name,
goto error_idr_alloc; goto error_idr_alloc;
c2dev->id = ret; c2dev->id = ret;
c2port_bin_attrs[0].size = ops->blocks_num * ops->block_size;
c2dev->dev = device_create(c2port_class, NULL, 0, c2dev, c2dev->dev = device_create(c2port_class, NULL, 0, c2dev,
"c2port%d", c2dev->id); "c2port%d", c2dev->id);
if (unlikely(IS_ERR(c2dev->dev))) { if (unlikely(IS_ERR(c2dev->dev))) {
...@@ -919,12 +924,6 @@ struct c2port_device *c2port_device_register(char *name, ...@@ -919,12 +924,6 @@ struct c2port_device *c2port_device_register(char *name,
c2dev->ops = ops; c2dev->ops = ops;
mutex_init(&c2dev->mutex); mutex_init(&c2dev->mutex);
/* Create binary file */
c2port_bin_attrs.size = ops->blocks_num * ops->block_size;
ret = device_create_bin_file(c2dev->dev, &c2port_bin_attrs);
if (unlikely(ret))
goto error_device_create_bin_file;
/* By default C2 port access is off */ /* By default C2 port access is off */
c2dev->access = c2dev->flash_access = 0; c2dev->access = c2dev->flash_access = 0;
ops->access(c2dev, 0); ops->access(c2dev, 0);
...@@ -937,9 +936,6 @@ struct c2port_device *c2port_device_register(char *name, ...@@ -937,9 +936,6 @@ struct c2port_device *c2port_device_register(char *name,
return c2dev; return c2dev;
error_device_create_bin_file:
device_destroy(c2port_class, 0);
error_device_create: error_device_create:
spin_lock_irq(&c2port_idr_lock); spin_lock_irq(&c2port_idr_lock);
idr_remove(&c2port_idr, c2dev->id); idr_remove(&c2port_idr, c2dev->id);
...@@ -959,7 +955,6 @@ void c2port_device_unregister(struct c2port_device *c2dev) ...@@ -959,7 +955,6 @@ void c2port_device_unregister(struct c2port_device *c2dev)
dev_info(c2dev->dev, "C2 port %s removed\n", c2dev->name); dev_info(c2dev->dev, "C2 port %s removed\n", c2dev->name);
device_remove_bin_file(c2dev->dev, &c2port_bin_attrs);
spin_lock_irq(&c2port_idr_lock); spin_lock_irq(&c2port_idr_lock);
idr_remove(&c2port_idr, c2dev->id); idr_remove(&c2port_idr, c2dev->id);
spin_unlock_irq(&c2port_idr_lock); spin_unlock_irq(&c2port_idr_lock);
...@@ -985,6 +980,7 @@ static int __init c2port_init(void) ...@@ -985,6 +980,7 @@ static int __init c2port_init(void)
return PTR_ERR(c2port_class); return PTR_ERR(c2port_class);
} }
c2port_class->dev_attrs = c2port_attrs; c2port_class->dev_attrs = c2port_attrs;
c2port_class->dev_bin_attrs = c2port_bin_attrs;
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment