您的位置:首页 > 其它

协议[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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: