1.I2C设备与驱动的总匹配过程
我们可以通过I2C驱动的注册函数来分析I2C设备与驱动的匹配流程总调用过程:i2c_add_driver
->i2c_register_dirver
->driver_register
-> bus_add_driver
-> driver_attach
-> bus_for_each_dev
-> __driver_attach
-> driver_match_device
-> i2c_device_match
-> driver_probe_device
-> really_probe
-> i2c_device_probe
include/linux/i2c.h
#define i2c_add_driver(driver) \
i2c_register_driver(THIS_MODULE, driver)
drivers/i2c/i2c-core-base.c
int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
{
int res;
/* add the driver to the list of i2c drivers in the driver core */
driver->driver.owner = owner;
driver->driver.bus = &i2c_bus_type;
INIT_LIST_HEAD(&driver->clients);
/* When registration returns, the driver core
* will have called probe() for all matching-but-unbound devices.
*/
res = driver_register(&driver->driver);
pr_debug("driver [%s] registered\n", driver->driver.name);
/* Walk the adapters that are already present */
i2c_for_each_dev(driver, __process_new_driver);
return 0;
}
EXPORT_SYMBOL(i2c_register_driver);
该函数用来注册一个i2c驱动,实际是往i2c_driver的;链表上添加一个i2c驱动,且驱动类型为i2c_bus_type
drivers/i2c/i2c-core-base.c
struct bus_type i2c_bus_type = {
.name = "i2c",
.match = i2c_device_match,
.probe = i2c_device_probe,
.remove = i2c_device_remove,
.shutdown = i2c_device_shutdown,
.pm = &i2c_device_pm_ops,
};
由图中可知,通过比较I2C驱动中的of_match_table
和id_table
以及ACPI方式进行设备与驱动的匹配
详解我对driver_register的理解