协议[I2C]_I2C子系统之adapter device和client device注册——I2C_add_number_adapter()
2015-10-22 16:08
330 查看
如前文所述(http://www.linuxidc.com/Linux/2012-08/68263.htm),在probe函数会调用函数i2c_add_number_adapter(),通过此函数来实现adapter device和client device的注册
i2c_add_number_adapter()函数如下:
int i2c_add_numbered_adapter(struct i2c_adapter *adap)
{
int id;
int status;
if (adap->nr & ~MAX_ID_MASK)
return -EINVAL;
retry:
if (idr_pre_get(&i2c_adapter_idr, GFP_KERNEL) == 0)
return -ENOMEM;
mutex_lock(&core_lock);
/* "above" here means "above or equal to", sigh;
* we need the "equal to" result to force the result
*/
status = idr_get_new_above(&i2c_adapter_idr, adap, adap->nr, &id);
if (status == 0 && id != adap->nr) {
status = -EBUSY;
idr_remove(&i2c_adapter_idr, id);
}
mutex_unlock(&core_lock);
if (status == -EAGAIN)
goto retry;
if (status == 0)
status = i2c_register_adapter(adap);
return status;
}
函数前面部分应该是用来提高搜索效率相关,此处省略分析。直接分析
i2c_register_adapter()函数,如下:
static int i2c_register_adapter(struct i2c_adapter *adap)
{
int res = 0;
。。。 。。。
dev_set_name(&adap->dev, "i2c-%d", adap->nr);
adap->dev.bus = &i2c_bus_type;
adap->dev.type = &i2c_adapter_type;
res = device_register(&adap->dev);
。。。 。。。
/* create pre-declared device nodes */
if (adap->nr < __i2c_first_dynamic_bus_num)
i2c_scan_static_board_info(adap);
/* Notify drivers */
printk("bus_search\n");
mutex_lock(&core_lock);
bus_for_each_drv(&i2c_bus_type, NULL, adap, __process_new_adapter);
mutex_unlock(&core_lock);
return 0;
out_list:
mutex_lock(&core_lock);
idr_remove(&i2c_adapter_idr, adap->nr);
mutex_unlock(&core_lock);
return res;
}
函数首先通过:
dev_set_name(&adap->dev, "i2c-%d", adap->nr);
adap->dev.bus = &i2c_bus_type;
adap->dev.type = &i2c_adapter_type;
res = device_register(&adap->dev);
语句,将名为i2c-0的adapter设备注册到i2c_bus_type型的i2c总线上上,其中通过
adap->dev.type = &i2c_adapter_type;
i2c_add_number_adapter()函数如下:
int i2c_add_numbered_adapter(struct i2c_adapter *adap)
{
int id;
int status;
if (adap->nr & ~MAX_ID_MASK)
return -EINVAL;
retry:
if (idr_pre_get(&i2c_adapter_idr, GFP_KERNEL) == 0)
return -ENOMEM;
mutex_lock(&core_lock);
/* "above" here means "above or equal to", sigh;
* we need the "equal to" result to force the result
*/
status = idr_get_new_above(&i2c_adapter_idr, adap, adap->nr, &id);
if (status == 0 && id != adap->nr) {
status = -EBUSY;
idr_remove(&i2c_adapter_idr, id);
}
mutex_unlock(&core_lock);
if (status == -EAGAIN)
goto retry;
if (status == 0)
status = i2c_register_adapter(adap);
return status;
}
函数前面部分应该是用来提高搜索效率相关,此处省略分析。直接分析
i2c_register_adapter()函数,如下:
static int i2c_register_adapter(struct i2c_adapter *adap)
{
int res = 0;
。。。 。。。
dev_set_name(&adap->dev, "i2c-%d", adap->nr);
adap->dev.bus = &i2c_bus_type;
adap->dev.type = &i2c_adapter_type;
res = device_register(&adap->dev);
。。。 。。。
/* create pre-declared device nodes */
if (adap->nr < __i2c_first_dynamic_bus_num)
i2c_scan_static_board_info(adap);
/* Notify drivers */
printk("bus_search\n");
mutex_lock(&core_lock);
bus_for_each_drv(&i2c_bus_type, NULL, adap, __process_new_adapter);
mutex_unlock(&core_lock);
return 0;
out_list:
mutex_lock(&core_lock);
idr_remove(&i2c_adapter_idr, adap->nr);
mutex_unlock(&core_lock);
return res;
}
函数首先通过:
dev_set_name(&adap->dev, "i2c-%d", adap->nr);
adap->dev.bus = &i2c_bus_type;
adap->dev.type = &i2c_adapter_type;
res = device_register(&adap->dev);
语句,将名为i2c-0的adapter设备注册到i2c_bus_type型的i2c总线上上,其中通过
adap->dev.type = &i2c_adapter_type;
相关文章推荐
- java实现单向链表
- C# 设置IE浏览器代理
- How To Install WordPress on Debian 7
- jquery ui学习笔记
- ActiveRecord中andFilterWhere使用
- php安装
- Tomcat安装与使用
- cocoapods 安装报错报错
- sass学习笔记
- 完整java开发中JDBC连接数据库代码和步骤
- 快速开发框架部分视频教程汇总
- Kafka分布式环境搭建
- Two sum no map by C
- HDOJ 1096 A+B for Input-Output Practice (VIII)
- java学习路线及书籍下载
- Android实现限制EditText输入文字的数量
- log file parallel write
- C# 单ip端口扫描工具 (多线程)
- How To Install Linux, Apache, MySQL, PHP (LAMP) stack on Debian
- sass学习笔记