歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

I2C子系統之adapter device和client device注冊——I2C_add_number_adapter()

如前文所述(http://www.linuxidc.com/Linux/2012-08/68263.htm),在probe函數會調用函數i2c_add_number_adapter(),通過此函數來實現adapter device和client device的注冊

i2c_add_number_adapter()函數如下:

  1. int i2c_add_numbered_adapter(struct i2c_adapter *adap)  
  2. {  
  3.     int id;  
  4.     int status;  
  5.   
  6.     if (adap->nr & ~MAX_ID_MASK)  
  7.         return -EINVAL;  
  8.   
  9. retry:  
  10.     if (idr_pre_get(&i2c_adapter_idr, GFP_KERNEL) == 0)  
  11.         return -ENOMEM;  
  12.   
  13.     mutex_lock(&core_lock);  
  14.     /* "above" here means "above or equal to", sigh; 
  15.      * we need the "equal to" result to force the result 
  16.      */  
  17.     status = idr_get_new_above(&i2c_adapter_idr, adap, adap->nr, &id);  
  18.     if (status == 0 && id != adap->nr) {  
  19.         status = -EBUSY;  
  20.         idr_remove(&i2c_adapter_idr, id);  
  21.     }  
  22.     mutex_unlock(&core_lock);  
  23.     if (status == -EAGAIN)  
  24.         goto retry;  
  25.   
  26.     if (status == 0)  
  27.         status = i2c_register_adapter(adap);  
  28.     return status;  
  29. }  

函數前面部分應該是用來提高搜索效率相關,此處省略分析。直接分析

i2c_register_adapter()函數,如下:

  1. static int i2c_register_adapter(struct i2c_adapter *adap)  
  2. {  
  3.     int res = 0;  
  4.   
  5.     。。。 。。。  
  6.     dev_set_name(&adap->dev, "i2c-%d", adap->nr);  
  7.     adap->dev.bus = &i2c_bus_type;  
  8.     adap->dev.type = &i2c_adapter_type;  
  9.     res = device_register(&adap->dev);  
  10.         。。。 。。。  
  11.   
  12.     /* create pre-declared device nodes */  
  13.     if (adap->nr < __i2c_first_dynamic_bus_num)  
  14.         i2c_scan_static_board_info(adap);  
  15.   
  16.     /* Notify drivers */  
  17.     printk("bus_search\n");  
  18.     mutex_lock(&core_lock);  
  19.     bus_for_each_drv(&i2c_bus_type, NULL, adap, __process_new_adapter);  
  20.     mutex_unlock(&core_lock);  
  21.   
  22.     return 0;  
  23.   
  24. out_list:  
  25.     mutex_lock(&core_lock);  
  26.     idr_remove(&i2c_adapter_idr, adap->nr);  
  27.     mutex_unlock(&core_lock);  
  28.     return res;  
  29. }  
函數首先通過:
  1.        dev_set_name(&adap->dev, "i2c-%d", adap->nr);           
  2.        adap->dev.bus = &i2c_bus_type;  
  3. adap->dev.type = &i2c_adapter_type;  
  4. res = device_register(&adap->dev);  

語句,將名為i2c-0的adapter設備注冊到i2c_bus_type型的i2c總線上上,其中通過

  1. adap->dev.type = &i2c_adapter_type;  
Copyright © Linux教程網 All Rights Reserved