[PATCH] staging: most: do not show interface dependent attrs by default in sysfs

Christian Gromm christian.gromm at microchip.com
Fri Jun 15 11:54:02 UTC 2018


The channel attribute dbr_size is only relevant for the DIM2 interface. So
is the packets_per_xact for USB. Currently, all attrs are shown by default
in sysfs for any channel. To get a clean content of a channel directory,
this patch makes the attributes show up only on the channel they belong to.

Signed-off-by: Christian Gromm <christian.gromm at microchip.com>
---
 drivers/staging/most/core.c      | 12 +++++++++---
 drivers/staging/most/core.h      |  5 +++++
 drivers/staging/most/dim2/dim2.c |  1 +
 drivers/staging/most/usb/usb.c   |  1 +
 4 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/drivers/staging/most/core.c b/drivers/staging/most/core.c
index f4c4646..19694a1 100644
--- a/drivers/staging/most/core.c
+++ b/drivers/staging/most/core.c
@@ -25,6 +25,7 @@
 
 #define MAX_CHANNELS	64
 #define STRING_SIZE	80
+#define MAX_NUM_ATTRS	14
 
 static struct ida mdev_id;
 static int dummy_num_buffers;
@@ -459,7 +460,7 @@ static DEVICE_ATTR_RW(set_subbuffer_size);
 static DEVICE_ATTR_RW(set_packets_per_xact);
 static DEVICE_ATTR_RW(set_dbr_size);
 
-static struct attribute *channel_attrs[] = {
+static struct attribute *channel_attrs[MAX_NUM_ATTRS] = {
 	DEV_ATTR(available_directions),
 	DEV_ATTR(available_datatypes),
 	DEV_ATTR(number_of_packet_buffers),
@@ -472,8 +473,6 @@ static struct attribute *channel_attrs[] = {
 	DEV_ATTR(set_direction),
 	DEV_ATTR(set_datatype),
 	DEV_ATTR(set_subbuffer_size),
-	DEV_ATTR(set_packets_per_xact),
-	DEV_ATTR(set_dbr_size),
 	NULL,
 };
 
@@ -1416,6 +1415,13 @@ int most_register_interface(struct most_interface *iface)
 	iface->dev.init_name = iface->p->name;
 	iface->dev.bus = &mc.bus;
 	iface->dev.parent = &mc.dev;
+	if (iface->extra_attrs == XACT_ATTRS) {
+		channel_attrs[12] = DEV_ATTR(set_packets_per_xact);
+		channel_attrs[13] = NULL;
+	} else if (iface->extra_attrs == DBR_ATTRS) {
+		channel_attrs[12] = DEV_ATTR(set_dbr_size);
+		channel_attrs[13] = NULL;
+	}
 	iface->dev.groups = interface_attr_groups;
 	iface->dev.release = release_interface;
 	if (device_register(&iface->dev)) {
diff --git a/drivers/staging/most/core.h b/drivers/staging/most/core.h
index 64cc02f..6fcc42d 100644
--- a/drivers/staging/most/core.h
+++ b/drivers/staging/most/core.h
@@ -235,6 +235,11 @@ struct most_interface {
 	enum most_interface_type interface;
 	const char *description;
 	unsigned int num_channels;
+	enum {
+		NO_ATTRS = 0,
+		XACT_ATTRS,
+		DBR_ATTRS
+	} extra_attrs;
 	struct most_channel_capability *channel_vector;
 	void *(*dma_alloc)(struct mbo *mbo, u32 size);
 	void (*dma_free)(struct mbo *mbo, u32 size);
diff --git a/drivers/staging/most/dim2/dim2.c b/drivers/staging/most/dim2/dim2.c
index fe90a7c..78dd983 100644
--- a/drivers/staging/most/dim2/dim2.c
+++ b/drivers/staging/most/dim2/dim2.c
@@ -875,6 +875,7 @@ static int dim2_probe(struct platform_device *pdev)
 	dev->most_iface.poison_channel = poison_channel;
 	dev->most_iface.request_netinfo = request_netinfo;
 	dev->most_iface.driver_dev = &pdev->dev;
+	dev->most_iface.extra_attrs = DBR_ATTRS;
 	dev->dev.init_name = "dim2_state";
 	dev->dev.parent = &dev->most_iface.dev;
 
diff --git a/drivers/staging/most/usb/usb.c b/drivers/staging/most/usb/usb.c
index bc820f9..ab873b9 100644
--- a/drivers/staging/most/usb/usb.c
+++ b/drivers/staging/most/usb/usb.c
@@ -1063,6 +1063,7 @@ hdm_probe(struct usb_interface *interface, const struct usb_device_id *id)
 	mdev->iface.dma_free = hdm_dma_free;
 	mdev->iface.description = mdev->description;
 	mdev->iface.num_channels = num_endpoints;
+	mdev->iface.extra_attrs = XACT_ATTRS;
 
 	snprintf(mdev->description, sizeof(mdev->description),
 		 "usb_device %d-%s:%d.%d",
-- 
2.7.4



More information about the devel mailing list