歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> I2C子系統之adapter device和client device注冊——I2C_add_number_adapter()

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

日期:2017/3/1 10:12:43   编辑:Linux編程

如前文所述(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. if (adap->nr & ~MAX_ID_MASK)
  6. return -EINVAL;
  7. retry:
  8. if (idr_pre_get(&i2c_adapter_idr, GFP_KERNEL) == 0)
  9. return -ENOMEM;
  10. mutex_lock(&core_lock);
  11. /* "above" here means "above or equal to", sigh;
  12. * we need the "equal to" result to force the result
  13. */
  14. status = idr_get_new_above(&i2c_adapter_idr, adap, adap->nr, &id);
  15. if (status == 0 && id != adap->nr) {
  16. status = -EBUSY;
  17. idr_remove(&i2c_adapter_idr, id);
  18. }
  19. mutex_unlock(&core_lock);
  20. if (status == -EAGAIN)
  21. goto retry;
  22. if (status == 0)
  23. status = i2c_register_adapter(adap);
  24. return status;
  25. }

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

i2c_register_adapter()函數,如下:

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