Linux 2.6.38
SDIO总线:
static struct bus_type sdio_bus_type = {
.name = "sdio",
.dev_attrs = sdio_dev_attrs,
.match = sdio_bus_match,
.uevent = sdio_bus_uevent,
.probe = sdio_bus_probe,
.remove = sdio_bus_remove,
.pm = SDIO_PM_OPS_PTR,
};
一条总线上有一个设备链表klist_devices,记录挂在此bus上的device;一个驱动链表(待查)klist_drivers,记录挂在此bus上的driver。
当注册新设备或者新驱动的时候,遍历驱动/设备链表,总线上的match回调函数得到调用进行驱动/设备的匹配。纯粹的叙述总显得空洞,那就简单看下设备/驱动的注册流程。
注册device:
int device_add(struct device *dev)
-->void bus_probe_device(struct device *dev)
---->int device_attach(struct device *dev)
------>int __device_attach(struct device_driver *drv, void *data) {
if (!driver_match_device(drv, dev)