i3c: Simplify i3c_device_match_id()
authorBoris Brezillon <boris.brezillon@collabora.com>
Thu, 27 Feb 2020 11:31:09 +0000 (12:31 +0100)
committerBoris Brezillon <boris.brezillon@collabora.com>
Fri, 28 Feb 2020 08:36:01 +0000 (09:36 +0100)
Simply match against ->match_flags instead of trying to be smart and
fix drivers inconsistent ID tables.

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/8c5d6523e1c161783db834a3447954f7fd6267e6.1582796652.git.vitor.soares@synopsys.com
drivers/i3c/device.c

index 9e2e1406f85ece3c85768ed1ec5f1493120389ff..bb8e60dff988c76874608b401454a9f8e721cdf2 100644 (file)
@@ -213,40 +213,34 @@ i3c_device_match_id(struct i3c_device *i3cdev,
 {
        struct i3c_device_info devinfo;
        const struct i3c_device_id *id;
+       u16 manuf, part, ext_info;
+       bool rndpid;
 
        i3c_device_get_info(i3cdev, &devinfo);
 
-       /*
-        * The lower 32bits of the provisional ID is just filled with a random
-        * value, try to match using DCR info.
-        */
-       if (!I3C_PID_RND_LOWER_32BITS(devinfo.pid)) {
-               u16 manuf = I3C_PID_MANUF_ID(devinfo.pid);
-               u16 part = I3C_PID_PART_ID(devinfo.pid);
-               u16 ext_info = I3C_PID_EXTRA_INFO(devinfo.pid);
-
-               /* First try to match by manufacturer/part ID. */
-               for (id = id_table; id->match_flags != 0; id++) {
-                       if ((id->match_flags & I3C_MATCH_MANUF_AND_PART) !=
-                           I3C_MATCH_MANUF_AND_PART)
-                               continue;
-
-                       if (manuf != id->manuf_id || part != id->part_id)
-                               continue;
-
-                       if ((id->match_flags & I3C_MATCH_EXTRA_INFO) &&
-                           ext_info != id->extra_info)
-                               continue;
-
-                       return id;
-               }
-       }
+       manuf = I3C_PID_MANUF_ID(devinfo.pid);
+       part = I3C_PID_PART_ID(devinfo.pid);
+       ext_info = I3C_PID_EXTRA_INFO(devinfo.pid);
+       rndpid = I3C_PID_RND_LOWER_32BITS(devinfo.pid);
 
-       /* Fallback to DCR match. */
        for (id = id_table; id->match_flags != 0; id++) {
                if ((id->match_flags & I3C_MATCH_DCR) &&
-                   id->dcr == devinfo.dcr)
-                       return id;
+                   id->dcr != devinfo.dcr)
+                       continue;
+
+               if ((id->match_flags & I3C_MATCH_MANUF) &&
+                   id->manuf_id != manuf)
+                       continue;
+
+               if ((id->match_flags & I3C_MATCH_PART) &&
+                   (rndpid || id->part_id != part))
+                       continue;
+
+               if ((id->match_flags & I3C_MATCH_EXTRA_INFO) &&
+                   (rndpid || id->extra_info != ext_info))
+                       continue;
+
+               return id;
        }
 
        return NULL;