summaryrefslogtreecommitdiff
path: root/drivers/staging/greybus/interface.c
diff options
context:
space:
mode:
authorJohan Hovold <johan@hovoldconsulting.com>2016-07-19 15:24:48 +0200
committerGreg Kroah-Hartman <gregkh@google.com>2016-07-19 19:06:34 -0700
commit835642526e9310d435cc718cdb69f2fcd7a53b84 (patch)
treed2062e87d4b23cd8d5ab5db22a7fcee54b96cab7 /drivers/staging/greybus/interface.c
parent441ac1fa9ecdccf9d54803e2548464ca83ad8514 (diff)
greybus: interface: make attributes type dependent
Make most interface attributes type dependent (e.g only UniPro and Greybus interfaces should have a DDBL1 Manufacturer ID attribute). Note that the power attributes (e.g. current_now) will only be visible for UniPro- and Greybus-type interfaces (i.e. interfaces that can draw power). Signed-off-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Diffstat (limited to 'drivers/staging/greybus/interface.c')
-rw-r--r--drivers/staging/greybus/interface.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/drivers/staging/greybus/interface.c b/drivers/staging/greybus/interface.c
index 1d50bd4bbe3a..c27b18b3b50d 100644
--- a/drivers/staging/greybus/interface.c
+++ b/drivers/staging/greybus/interface.c
@@ -538,15 +538,62 @@ static struct attribute *interface_common_attrs[] = {
NULL
};
+static umode_t interface_unipro_is_visible(struct kobject *kobj,
+ struct attribute *attr, int n)
+{
+ struct device *dev = container_of(kobj, struct device, kobj);
+ struct gb_interface *intf = to_gb_interface(dev);
+
+ switch (intf->type) {
+ case GB_SVC_INTF_TYPE_UNIPRO:
+ case GB_SVC_INTF_TYPE_GREYBUS:
+ return attr->mode;
+ default:
+ return 0;
+ }
+}
+
+static umode_t interface_greybus_is_visible(struct kobject *kobj,
+ struct attribute *attr, int n)
+{
+ struct device *dev = container_of(kobj, struct device, kobj);
+ struct gb_interface *intf = to_gb_interface(dev);
+
+ switch (intf->type) {
+ case GB_SVC_INTF_TYPE_GREYBUS:
+ return attr->mode;
+ default:
+ return 0;
+ }
+}
+
+static umode_t interface_power_is_visible(struct kobject *kobj,
+ struct attribute *attr, int n)
+{
+ struct device *dev = container_of(kobj, struct device, kobj);
+ struct gb_interface *intf = to_gb_interface(dev);
+
+ switch (intf->type) {
+ case GB_SVC_INTF_TYPE_UNIPRO:
+ case GB_SVC_INTF_TYPE_GREYBUS:
+ return attr->mode;
+ default:
+ return 0;
+ }
+}
+
static const struct attribute_group interface_unipro_group = {
+ .is_visible = interface_unipro_is_visible,
.attrs = interface_unipro_attrs,
};
static const struct attribute_group interface_greybus_group = {
+ .is_visible = interface_greybus_is_visible,
.attrs = interface_greybus_attrs,
};
static const struct attribute_group interface_power_group = {
+ .is_visible = interface_power_is_visible,
.attrs = interface_power_attrs,
};