下面介绍 i2c 驱动相关操作函数
i2c_add_driver
kernel/include/linux/i2c.h
static inline int i2c_add_driver(struct i2c_driver *driver)
{return i2c_register_driver(THIS_MODULE, driver);
}
i2c_add_driver 添加一个i2c驱动,其就是封装了i2c_register_driver函数
kernel/driver/linux/i2c/i2c-core.c
/*
* An i2c_driver is used with one or more i2c_client (device) nodes to access
* i2c slave chips, on a bus instance associated with some i2c_adapter.
*/
int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
{
int res;
/* Can't register until after driver model init */
if (unlikely(WARN_ON(!i2c_bus_type.p)))
return -EAGAIN;
/* add the driver to the list of i2c drivers in the driver core */
driver->driver.owner = owner;
driver->driver.bus = &i2c_bus_type;
/* When registration returns, the driver core
* will have called probe() for all matching-but-unbound devices.
*/
res = driver_register(&driver->driver);
if (res)
return res;
/* Drivers should switch to dev_pm_ops instead. */
if (driver->suspend)
pr_warn("i2c-core: driver [%s] using legacy suspend method\n",
driver->driver.name);
if (driver->resume)
pr_warn("i2c-core: driver [%s] using legacy resume method\n",
driver->driver.name);
pr_debug("i2c-core: driver [%s] registered\n", driver->driver.name);
INIT_LIST_HEAD(&driver->clients);
/* Walk the adapters that are already present */
i2c_for_each_dev(driver, __process_new_driver);
return 0;
}
i2c_register_driver i2c驱动注册函数,i2c驱动和i2c适配器关联
if (unlikely(WARN_ON(!i2c_bus_type.p))) 检查驱动设备模型是否初始化好
driver->driver.owner = owner;
driver->driver.bus = &i2c_bus_type; i2c驱动的驱动模型赋值
driver_register(&driver->driver); 设备驱动模型驱动注册,建立设备驱动模型
INIT_LIST_HEAD(&driver->clients); 初始化驱动的i2c设备链表
i2c_for_each_dev(driver, __process_new_driver); 遍历i2c总线适配器,动态添加i2c设备
kernel/driver/linux/i2c/i2c-core.c
int i2c_for_each_dev(void *data, int (*fn)(struct device *, void *))
{
int res;
mutex_lock(&core_lock);
res = bus_for_each_dev