由于工作任务需要将i2c总线驱动以ko方式加载,这两天学习了mt2712平台的i2c总线驱动的probe和remove过程
执行rmmod i2c_mt65xx.ko,最终会调用mtk_i2c_adap_exit
module_exit(mtk_i2c_adap_exit);
platform_driver_unregister(&mtk_i2c_driver);
bus_remove_driver(drv);
driver_detach(drv);
对drv->p->klist_devices.k_list链表中的每一个device调用以下函数(这个device对应着dts中compatible = "mediatek,mt2712-i2c"的i2c总线设备)
__device_release_driver(dev);
if (dev->bus && dev->bus->remove)//对于platform_bus_type而言,没有dev->bus->remove函数
dev->bus->remove(dev);
else if (drv->remove)
drv->remove(dev);//因此调用驱动本身的remove,对于i2c_mt65xx就是mtk_i2c_remove
mtk_i2c_remove
i2c_del_adapter(&i2c->adap);
device_for_each_child(&adap->dev, NULL, __unregister_client);//对这条i2c总线上的每一个i2c设备(或者说adaptor的children链表里的每一个i2c client,i2c控制器节点下的每一个i2c设备设备子节点)
i2c_unregister_device(client);//调用__unregister_client函数
device_unregister(&client->dev);
device_del(dev);
klist_del(&dev->p->knode_parent);
bus_remove_device(dev);
klist_del(&dev->p->knode_bus);//将client从i2c_bus_type的dev链表中删除