On Tue, Dec 13, 2022 at 04:26:55PM +0800, Binbin Zhou wrote: > Add support for the ACPI-based device registration, so that the driver > can be also enabled through ACPI table. LGTM now, Reviewed-by: Andy Shevchenko <andy@xxxxxxxxxx> > Signed-off-by: Binbin Zhou <zhoubinbin@xxxxxxxxxxx> > --- > drivers/i2c/busses/i2c-gpio.c | 28 ++++++++++++++++++---------- > 1 file changed, 18 insertions(+), 10 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-gpio.c b/drivers/i2c/busses/i2c-gpio.c > index 0e4385a9bcf7..680936234ef8 100644 > --- a/drivers/i2c/busses/i2c-gpio.c > +++ b/drivers/i2c/busses/i2c-gpio.c > @@ -13,9 +13,9 @@ > #include <linux/init.h> > #include <linux/interrupt.h> > #include <linux/module.h> > -#include <linux/of.h> > #include <linux/platform_data/i2c-gpio.h> > #include <linux/platform_device.h> > +#include <linux/property.h> > #include <linux/slab.h> > > struct i2c_gpio_private_data { > @@ -300,22 +300,23 @@ static inline void i2c_gpio_fault_injector_init(struct platform_device *pdev) {} > static inline void i2c_gpio_fault_injector_exit(struct platform_device *pdev) {} > #endif /* CONFIG_I2C_GPIO_FAULT_INJECTOR*/ > > -static void of_i2c_gpio_get_props(struct device_node *np, > - struct i2c_gpio_platform_data *pdata) > +/* Get i2c-gpio properties from DT or ACPI table */ > +static void i2c_gpio_get_properties(struct device *dev, > + struct i2c_gpio_platform_data *pdata) > { > u32 reg; > > - of_property_read_u32(np, "i2c-gpio,delay-us", &pdata->udelay); > + device_property_read_u32(dev, "i2c-gpio,delay-us", &pdata->udelay); > > - if (!of_property_read_u32(np, "i2c-gpio,timeout-ms", ®)) > + if (!device_property_read_u32(dev, "i2c-gpio,timeout-ms", ®)) > pdata->timeout = msecs_to_jiffies(reg); > > pdata->sda_is_open_drain = > - of_property_read_bool(np, "i2c-gpio,sda-open-drain"); > + device_property_read_bool(dev, "i2c-gpio,sda-open-drain"); > pdata->scl_is_open_drain = > - of_property_read_bool(np, "i2c-gpio,scl-open-drain"); > + device_property_read_bool(dev, "i2c-gpio,scl-open-drain"); > pdata->scl_is_output_only = > - of_property_read_bool(np, "i2c-gpio,scl-output-only"); > + device_property_read_bool(dev, "i2c-gpio,scl-output-only"); > } > > static struct gpio_desc *i2c_gpio_get_desc(struct device *dev, > @@ -373,8 +374,8 @@ static int i2c_gpio_probe(struct platform_device *pdev) > bit_data = &priv->bit_data; > pdata = &priv->pdata; > > - if (np) { > - of_i2c_gpio_get_props(np, pdata); > + if (dev_fwnode(dev)) { > + i2c_gpio_get_properties(dev, pdata); > } else { > /* > * If all platform data settings are zero it is OK > @@ -489,10 +490,17 @@ static const struct of_device_id i2c_gpio_dt_ids[] = { > > MODULE_DEVICE_TABLE(of, i2c_gpio_dt_ids); > > +static const struct acpi_device_id i2c_gpio_acpi_match[] = { > + { "LOON0005" }, /* LoongArch */ > + { } > +}; > +MODULE_DEVICE_TABLE(acpi, i2c_gpio_acpi_match); > + > static struct platform_driver i2c_gpio_driver = { > .driver = { > .name = "i2c-gpio", > .of_match_table = i2c_gpio_dt_ids, > + .acpi_match_table = i2c_gpio_acpi_match, > }, > .probe = i2c_gpio_probe, > .remove = i2c_gpio_remove, > -- > 2.31.1 > -- With Best Regards, Andy Shevchenko