i3c: Add a modalias sysfs attribute
authorBoris Brezillon <boris.brezillon@collabora.com>
Thu, 27 Feb 2020 11:31:07 +0000 (12:31 +0100)
committerBoris Brezillon <boris.brezillon@collabora.com>
Fri, 28 Feb 2020 08:35:52 +0000 (09:35 +0100)
Create a modalias sysfs attribute for i3c devices.

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Signed-off-by: Vitor Soares <vitor.soares@synopsys.com>
Link: https://lore.kernel.org/linux-i3c/a90f64f830128cd12762153de7828b775574c156.1582796652.git.vitor.soares@synopsys.com
drivers/i3c/master.c

index b6db82862a63c19e27aeca4edf015fde9d1ecd1a..925e1ed18a2aaaae262a1200d35244d5675f7de5 100644 (file)
@@ -241,12 +241,34 @@ out:
 }
 static DEVICE_ATTR_RO(hdrcap);
 
+static ssize_t modalias_show(struct device *dev,
+                            struct device_attribute *da, char *buf)
+{
+       struct i3c_device *i3c = dev_to_i3cdev(dev);
+       struct i3c_device_info devinfo;
+       u16 manuf, part, ext;
+
+       i3c_device_get_info(i3c, &devinfo);
+       manuf = I3C_PID_MANUF_ID(devinfo.pid);
+       part = I3C_PID_PART_ID(devinfo.pid);
+       ext = I3C_PID_EXTRA_INFO(devinfo.pid);
+
+       if (I3C_PID_RND_LOWER_32BITS(devinfo.pid))
+               return sprintf(buf, "i3c:dcr%02Xmanuf%04X", devinfo.dcr,
+                              manuf);
+
+       return sprintf(buf, "i3c:dcr%02Xmanuf%04Xpart%04Xext%04X",
+                      devinfo.dcr, manuf, part, ext);
+}
+static DEVICE_ATTR_RO(modalias);
+
 static struct attribute *i3c_device_attrs[] = {
        &dev_attr_bcr.attr,
        &dev_attr_dcr.attr,
        &dev_attr_pid.attr,
        &dev_attr_dynamic_address.attr,
        &dev_attr_hdrcap.attr,
+       &dev_attr_modalias.attr,
        NULL,
 };
 ATTRIBUTE_GROUPS(i3c_device);