匹配成功后,则调用probe接口。
98static atomic_t probe_count = ATOMIC_INIT(0);
99static DECLARE_WAIT_QUEUE_HEAD(probe_waitqueue);
100
101static int really_probe(struct device *dev, struct device_driver *drv)
102{
103 int ret = 0;
104
105 atomic_inc(&probe_count);
106 pr_debug("bus: \'%s\': %s: probing driver %s with device %s/n",
107 drv->bus->name, __FUNCTION__, drv->name, dev->bus_id);
108 WARN_ON(!list_empty(&dev->devres_head));
109
110 dev->driver = drv;
111 if (driver_sysfs_add(dev)) {
112 printk(KERN_ERR "%s: driver_sysfs_add(%s) failed/n",
113 __FUNCTION__, dev->bus_id);
114 goto probe_failed;
115 }
116
117 if (dev->bus->probe) {
118 ret = dev->bus->probe(dev);
119 if (ret)
120 goto probe_failed;
121 } else if (drv->probe) {
122 ret = drv->probe(dev);
123 if (ret)
124 goto probe_failed;
125 }
126
127 driver_bound(dev);
128 ret = 1;
129 pr_debug("bus: \'%s\': %s: bound device %s to driver %s/n",
130 drv->bus->name, __FUNCTION__, dev->bus_id, drv->name);
131 goto done;
132
133probe_failed:
134 devres_release_all(dev);
135 driver_sysfs_remove(dev);
136 dev->driver = NULL;
137
138 if (ret != -ENODEV && ret != -ENXIO) {
139 /* driver matched but the probe failed */
140 printk(KERN_WARNING
141 "%s: probe of %s failed with error %d/n",
142 drv->name, dev->bus_id, ret);
143 }
144 /*
145 * Ignore errors returned by ->probe so that the next driver can try
146 * its luck.
147 */
148 ret = 0;
149done:
150 atomic_dec(&probe_count);
151 wake_up(&probe_waitqueue);
152 return ret;
153}
详解Linux2.6内核中基于platform机制的驱动模型 (经典) (10)
内容版权声明:除非注明,否则皆为本站原创文章。