mirror of
https://github.com/torvalds/linux.git
synced 2026-09-28 03:52:02 +02:00
i3c: master: match I3C device through DT and ACPI
SETAASA-based devices cannot always be identified by PID or DCR; the standard I3C id_table matching may not be applicable. Allow such devices to match through Device Tree or ACPI. Reviewed-by: Frank Li <Frank.Li@nxp.com> Signed-off-by: Akhil R <akhilrajeev@nvidia.com> Link: https://patch.msgid.link/20260728065955.809445-7-akhilrajeev@nvidia.com Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
This commit is contained in:
parent
a1dd42fb82
commit
3456baa211
|
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
#include <linux/pm_runtime.h>
|
#include <linux/pm_runtime.h>
|
||||||
#include <linux/property.h>
|
#include <linux/property.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
|
@ -345,15 +346,32 @@ static int i3c_device_match(struct device *dev, const struct device_driver *drv)
|
||||||
{
|
{
|
||||||
struct i3c_device *i3cdev;
|
struct i3c_device *i3cdev;
|
||||||
const struct i3c_driver *i3cdrv;
|
const struct i3c_driver *i3cdrv;
|
||||||
|
u8 static_addr_method = 0;
|
||||||
|
|
||||||
if (dev->type != &i3c_device_type)
|
if (dev->type != &i3c_device_type)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
i3cdev = dev_to_i3cdev(dev);
|
i3cdev = dev_to_i3cdev(dev);
|
||||||
i3cdrv = drv_to_i3cdrv(drv);
|
i3cdrv = drv_to_i3cdrv(drv);
|
||||||
if (i3c_device_match_id(i3cdev, i3cdrv->id_table))
|
|
||||||
|
if (i3cdev->desc && i3cdev->desc->boardinfo)
|
||||||
|
static_addr_method = i3cdev->desc->boardinfo->static_addr_method;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SETAASA-based devices need not always have a matching ID since
|
||||||
|
* it is not mandatory for such devices to implement deviceinfo
|
||||||
|
* CCC commands. Allow them to register through DT or ACPI.
|
||||||
|
*/
|
||||||
|
if (i3cdrv->id_table && i3c_device_match_id(i3cdev, i3cdrv->id_table))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
if (static_addr_method & I3C_ADDR_METHOD_SETAASA) {
|
||||||
|
if (of_driver_match_device(dev, drv))
|
||||||
|
return 1;
|
||||||
|
if (acpi_driver_match_device(dev, drv))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user