OSDN Git Service

i3c: move i3c_device_match_id to device.c and export it
authorVitor Soares <Vitor.Soares@synopsys.com>
Fri, 19 Jul 2019 13:30:54 +0000 (15:30 +0200)
committerBoris Brezillon <boris.brezillon@collabora.com>
Sat, 27 Jul 2019 09:22:19 +0000 (11:22 +0200)
Some I3C device drivers need to know which entry matches the
i3c_device object passed to the probe function

Let's move i3c_device_match_id() to device.c and export it so it can be
used by drivers.

Signed-off-by: Vitor Soares <vitor.soares@synopsys.com>
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
drivers/i3c/device.c
drivers/i3c/master.c
include/linux/i3c/device.h

index 69cc040..9e2e140 100644 (file)
@@ -201,6 +201,59 @@ struct i3c_device *dev_to_i3cdev(struct device *dev)
 EXPORT_SYMBOL_GPL(dev_to_i3cdev);
 
 /**
+ * i3c_device_match_id() - Returns the i3c_device_id entry matching @i3cdev
+ * @i3cdev: I3C device
+ * @id_table: I3C device match table
+ *
+ * Return: a pointer to an i3c_device_id object or NULL if there's no match.
+ */
+const struct i3c_device_id *
+i3c_device_match_id(struct i3c_device *i3cdev,
+                   const struct i3c_device_id *id_table)
+{
+       struct i3c_device_info devinfo;
+       const struct i3c_device_id *id;
+
+       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;
+               }
+       }
+
+       /* 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;
+       }
+
+       return NULL;
+}
+EXPORT_SYMBOL_GPL(i3c_device_match_id);
+
+/**
  * i3c_driver_register_with_owner() - register an I3C device driver
  *
  * @drv: driver to register
index d6f8b03..c587290 100644 (file)
@@ -276,51 +276,6 @@ static const struct device_type i3c_device_type = {
        .uevent = i3c_device_uevent,
 };
 
-static const struct i3c_device_id *
-i3c_device_match_id(struct i3c_device *i3cdev,
-                   const struct i3c_device_id *id_table)
-{
-       struct i3c_device_info devinfo;
-       const struct i3c_device_id *id;
-
-       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;
-               }
-       }
-
-       /* 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;
-       }
-
-       return NULL;
-}
-
 static int i3c_device_match(struct device *dev, struct device_driver *drv)
 {
        struct i3c_device *i3cdev;
index 5ecb055..de102e4 100644 (file)
@@ -188,6 +188,10 @@ static inline struct i3c_driver *drv_to_i3cdrv(struct device_driver *drv)
 struct device *i3cdev_to_dev(struct i3c_device *i3cdev);
 struct i3c_device *dev_to_i3cdev(struct device *dev);
 
+const struct i3c_device_id *
+i3c_device_match_id(struct i3c_device *i3cdev,
+                   const struct i3c_device_id *id_table);
+
 static inline void i3cdev_set_drvdata(struct i3c_device *i3cdev,
                                      void *data)
 {