On Thu, Dec 14, 2017 at 04:16:05PM +0100, Boris Brezillon wrote: > +/** > + * i3c_device_match_id() - Find the I3C device ID entry matching an I3C dev > + * @i3cdev: the I3C device we're searching a match for > + * @id_table: the I3C device ID table > + * > + * Return: a pointer to the first entry matching @i3cdev, 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) > +{ > + const struct i3c_device_id *id; > + > + /* > + * 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(i3cdev->info.pid)) { > + u16 manuf = I3C_PID_MANUF_ID(i3cdev->info.pid); > + u16 part = I3C_PID_PART_ID(i3cdev->info.pid); > + u16 ext_info = I3C_PID_EXTRA_INFO(i3cdev->info.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 == i3cdev->info.dcr) > + return id; > + } > + > + return NULL; > +} > +EXPORT_SYMBOL_GPL(i3c_device_match_id); I just picked one random export here, but it feels like you are exporting a bunch of symbols you don't need to. Why would something outside of the i3c "core" need to call this function? Have you looked to see if you really have callers for everything you are exporting? Other than that, the driver core interaction looks good now, nice job. greg k-h