[RFC PATCH v2 6/6] driver core: add compatible string in sysfs for platform devices

From: Nipun Gupta
Date: Wed Aug 17 2022 - 11:07:11 EST


This change adds compatible string for the platform based
devices.

Signed-off-by: Nipun Gupta <nipun.gupta@xxxxxxx>
---
Documentation/ABI/testing/sysfs-bus-platform | 8 +++++++
drivers/base/platform.c | 23 ++++++++++++++++++++
2 files changed, 31 insertions(+)

diff --git a/Documentation/ABI/testing/sysfs-bus-platform b/Documentation/ABI/testing/sysfs-bus-platform
index c4dfe7355c2d..d95ff83d768c 100644
--- a/Documentation/ABI/testing/sysfs-bus-platform
+++ b/Documentation/ABI/testing/sysfs-bus-platform
@@ -54,3 +54,11 @@ Description:
Other platform devices use, instead:

- platform:`driver name`
+
+What: /sys/bus/platform/devices/.../compatible
+Date: August 2022
+Contact: Nipun Gupta <nipun.gupta@xxxxxxx>
+Description:
+ compatible string associated with the device. This is
+ a read only and is visible if the device have "compatible"
+ property associated with it.
diff --git a/drivers/base/platform.c b/drivers/base/platform.c
index 51bb2289865c..94c33efaa9b8 100644
--- a/drivers/base/platform.c
+++ b/drivers/base/platform.c
@@ -1289,10 +1289,25 @@ static ssize_t driver_override_store(struct device *dev,
}
static DEVICE_ATTR_RW(driver_override);

+static ssize_t compatible_show(struct device *dev, struct device_attribute *attr,
+ char *buf)
+{
+ const char *compat;
+ int ret;
+
+ ret = device_property_read_string(dev, "compatible", &compat);
+ if (ret != 0)
+ return 0;
+
+ return sysfs_emit(buf, "%s", compat);
+}
+static DEVICE_ATTR_RO(compatible);
+
static struct attribute *platform_dev_attrs[] = {
&dev_attr_modalias.attr,
&dev_attr_numa_node.attr,
&dev_attr_driver_override.attr,
+ &dev_attr_compatible.attr,
NULL,
};

@@ -1300,11 +1315,19 @@ static umode_t platform_dev_attrs_visible(struct kobject *kobj, struct attribute
int n)
{
struct device *dev = container_of(kobj, typeof(*dev), kobj);
+ const char *compat;
+ int ret;

if (a == &dev_attr_numa_node.attr &&
dev_to_node(dev) == NUMA_NO_NODE)
return 0;

+ if (a == &dev_attr_compatible.attr) {
+ ret = device_property_read_string(dev, "compatible", &compat);
+ if (ret != 0)
+ return 0;
+ }
+
return a->mode;
}

--
2.25.1