[PATCH 115/141] staging: unisys: Wire up proper device attr for bus

Benjamin Romer benjamin.romer at unisys.com
Tue May 5 22:37:32 UTC 2015


From: Don Zickus <dzickus at redhat.com>

This patch moves the attributes to underneath the bus device correctly.
This will help remove a bunch of cruft from the code and let the kernel
infrastructure manage the sysfs files instead of the driver.

Signed-off-by: Don Zickus <dzickus at redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer at unisys.com>
---
 drivers/staging/unisys/visorbus/visorbus_main.c | 75 +++++++++++++++++++------
 1 file changed, 58 insertions(+), 17 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index 1266259..6204105 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -659,7 +659,7 @@ struct businst_attribute {
 #define to_businst_attr(_attr) \
 	container_of(_attr, struct businst_attribute, attr)
 #define to_visorbus_devdata(obj) \
-	container_of(obj, struct visorbus_devdata, kobj)
+	container_of(obj, struct visorbus_devdata, dev)
 
 static ssize_t
 businst_attr_show(struct kobject *kobj, struct attribute *attr,
@@ -774,8 +774,10 @@ unregister_bustype_attributes(void)
  *
  */
 
-static ssize_t businst_attr_partition_handle(struct visorbus_devdata *businst,
-					     char *buf) {
+static ssize_t partition_handle_show(struct device *dev,
+				     struct device_attribute *attr,
+				     char *buf) {
+	struct visorbus_devdata *businst = to_visorbus_devdata(dev);
 	struct visorchipset_bus_info bus_info;
 	int len = 0;
 
@@ -786,8 +788,10 @@ static ssize_t businst_attr_partition_handle(struct visorbus_devdata *businst,
 	return len;
 }
 
-static ssize_t businst_attr_partition_guid(struct visorbus_devdata *businst,
-					   char *buf) {
+static ssize_t partition_guid_show(struct device *dev,
+				   struct device_attribute *attr,
+				   char *buf) {
+	struct visorbus_devdata *businst = to_visorbus_devdata(dev);
 	struct visorchipset_bus_info bus_info;
 	int len = 0;
 
@@ -797,8 +801,10 @@ static ssize_t businst_attr_partition_guid(struct visorbus_devdata *businst,
 	return len;
 }
 
-static ssize_t businst_attr_partition_name(struct visorbus_devdata *businst,
-					   char *buf) {
+static ssize_t partition_name_show(struct device *dev,
+				   struct device_attribute *attr,
+				   char *buf) {
+	struct visorbus_devdata *businst = to_visorbus_devdata(dev);
 	struct visorchipset_bus_info bus_info;
 	int len = 0;
 
@@ -809,8 +815,10 @@ static ssize_t businst_attr_partition_name(struct visorbus_devdata *businst,
 	return len;
 }
 
-static ssize_t businst_attr_channel_addr(struct visorbus_devdata *businst,
-					 char *buf) {
+static ssize_t channel_addr_show(struct device *dev,
+				 struct device_attribute *attr,
+				 char *buf) {
+	struct visorbus_devdata *businst = to_visorbus_devdata(dev);
 	struct visorchipset_bus_info bus_info;
 	int len = 0;
 
@@ -820,8 +828,10 @@ static ssize_t businst_attr_channel_addr(struct visorbus_devdata *businst,
 	return len;
 }
 
-static ssize_t businst_attr_nchannel_bytes(struct visorbus_devdata *businst,
-					   char *buf) {
+static ssize_t channel_bytes_show(struct device *dev,
+				  struct device_attribute *attr,
+				  char *buf) {
+	struct visorbus_devdata *businst = to_visorbus_devdata(dev);
 	struct visorchipset_bus_info bus_info;
 	int len = 0;
 
@@ -831,8 +841,10 @@ static ssize_t businst_attr_nchannel_bytes(struct visorbus_devdata *businst,
 	return len;
 }
 
-static ssize_t businst_attr_channel_id(struct visorbus_devdata *businst,
-				       char *buf) {
+static ssize_t channel_id_show(struct device *dev,
+			       struct device_attribute *attr,
+			       char *buf) {
+	struct visorbus_devdata *businst = to_visorbus_devdata(dev);
 	int len = 0;
 
 	if (businst && businst->chan) {
@@ -843,8 +855,10 @@ static ssize_t businst_attr_channel_id(struct visorbus_devdata *businst,
 	return len;
 }
 
-static ssize_t businst_attr_client_bus_info(struct visorbus_devdata *businst,
-					    char *buf) {
+static ssize_t client_bus_info_show(struct device *dev,
+				    struct device_attribute *attr,
+				    char *buf) {
+	struct visorbus_devdata *businst = to_visorbus_devdata(dev);
 	struct visorchipset_bus_info bus_info;
 	int i, x, remain = PAGE_SIZE;
 	unsigned long off;
@@ -918,6 +932,34 @@ static struct businst_attribute ba_channel_id =
 static struct businst_attribute ba_client_bus_info =
 	__ATTR(client_bus_info, S_IRUGO, businst_attr_client_bus_info, NULL);
 
+static DEVICE_ATTR_RO(partition_handle);
+static DEVICE_ATTR_RO(partition_guid);
+static DEVICE_ATTR_RO(partition_name);
+static DEVICE_ATTR_RO(channel_addr);
+static DEVICE_ATTR_RO(channel_bytes);
+static DEVICE_ATTR_RO(channel_id);
+static DEVICE_ATTR_RO(client_bus_info);
+
+static struct attribute *dev_attrs[] = {
+		&dev_attr_partition_handle.attr,
+		&dev_attr_partition_guid.attr,
+		&dev_attr_partition_name.attr,
+		&dev_attr_channel_addr.attr,
+		&dev_attr_channel_bytes.attr,
+		&dev_attr_channel_id.attr,
+		&dev_attr_client_bus_info.attr,
+		NULL
+};
+
+static struct attribute_group dev_attr_grp = {
+		.attrs = dev_attrs,
+};
+
+static const struct attribute_group *visorbus_groups[] = {
+		&dev_attr_grp,
+		NULL
+};
+
 static int
 register_businst_attributes(struct visorbus_devdata *businst)
 {
@@ -1646,6 +1688,7 @@ create_bus_instance(int id)
 		goto away;
 	}
 	dev_set_name(&devdata->dev, "visorbus%d", id);
+	devdata->dev.groups = visorbus_groups;
 	devdata->dev.release = visorbus_release_busdevice;
 	if (device_register(&devdata->dev) < 0) {
 		POSTCODE_LINUX_3(DEVICE_CREATE_FAILURE_PC, id,
@@ -1692,7 +1735,6 @@ create_bus_instance(int id)
 			}
 		}
 	}
-	register_businst_attributes(devdata);
 	bus_count++;
 	list_add_tail(&devdata->list_all, &list_all_bus_instances);
 	if (id == 0)
@@ -1715,7 +1757,6 @@ remove_bus_instance(struct visorbus_devdata *devdata)
 	 * successfully been able to trace thru the code to see where/how
 	 * release() gets called.  But I know it does.
 	 */
-	unregister_businst_attributes(devdata);
 	bus_count--;
 	if (devdata->chan) {
 		visorchannel_destroy(devdata->chan);
-- 
2.1.4



More information about the devel mailing list