i3c: Simplify i3c_device_match_id()
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
This commit is contained in:
parent
1ce589ad39
commit
65ec1d0ddf
@ -213,41 +213,35 @@ i3c_device_match_id(struct i3c_device *i3cdev,
|
|||||||
{
|
{
|
||||||
struct i3c_device_info devinfo;
|
struct i3c_device_info devinfo;
|
||||||
const struct i3c_device_id *id;
|
const struct i3c_device_id *id;
|
||||||
|
u16 manuf, part, ext_info;
|
||||||
|
bool rndpid;
|
||||||
|
|
||||||
i3c_device_get_info(i3cdev, &devinfo);
|
i3c_device_get_info(i3cdev, &devinfo);
|
||||||
|
|
||||||
/*
|
manuf = I3C_PID_MANUF_ID(devinfo.pid);
|
||||||
* The lower 32bits of the provisional ID is just filled with a random
|
part = I3C_PID_PART_ID(devinfo.pid);
|
||||||
* value, try to match using DCR info.
|
ext_info = I3C_PID_EXTRA_INFO(devinfo.pid);
|
||||||
*/
|
rndpid = I3C_PID_RND_LOWER_32BITS(devinfo.pid);
|
||||||
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++) {
|
for (id = id_table; id->match_flags != 0; id++) {
|
||||||
if ((id->match_flags & I3C_MATCH_MANUF_AND_PART) !=
|
if ((id->match_flags & I3C_MATCH_DCR) &&
|
||||||
I3C_MATCH_MANUF_AND_PART)
|
id->dcr != devinfo.dcr)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (manuf != id->manuf_id || part != id->part_id)
|
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;
|
continue;
|
||||||
|
|
||||||
if ((id->match_flags & I3C_MATCH_EXTRA_INFO) &&
|
if ((id->match_flags & I3C_MATCH_EXTRA_INFO) &&
|
||||||
ext_info != id->extra_info)
|
(rndpid || id->extra_info != ext_info))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
return id;
|
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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user