最近在移植一个驱动,启动后打印:
platform i2c@0: deferred probe pending
drivers/base/dd.c
打印是:
static void deferred_probe_timeout_work_func(struct work_struct *work)
{
struct device_private *p;
fw_devlink_drivers_done();
driver_deferred_probe_timeout = 0;
driver_deferred_probe_trigger();
flush_work(&deferred_probe_work);
mutex_lock(&deferred_probe_mutex);
list_for_each_entry(p, &deferred_probe_pending_list, deferred_probe)
dev_info(p->device, "deferred probe pending\n");
mutex_unlock(&deferred_probe_mutex);
}
static DECLARE_DELAYED_WORK(deferred_probe_timeout_work, deferred_probe_timeout_work_func);
然加到延迟的代码流程如下:
driver_probe_device()
ret = __driver_probe_device(drv, dev);
if (ret == -EPROBE_DEFER || ret == EPROBE_DEFER) {
driver_deferred_probe_add(dev);
wake_up_all(&probe_waitqueue);
static int __driver_probe_device(struct device_driver *drv, struct device *dev)
ret = really_probe(dev, drv);
static int really_probe(struct device *dev, struct device_driver *drv)
link_ret = device_links_check_suppliers(dev);
if (link_ret == -EPROBE_DEFER)
return link_ret;
drivers/base/core.c
int device_links_check_suppliers(struct device *dev)
怀疑是device_links_check_suppliers这个函数,检查依赖不满足,返回了EPROBE_DEFER。
在drivers/base/core.cd的最上面,添加
#define DEBUG
重启编译启动内核,然后发现没有打印,但是使用dmesg有打印,说明启动的时候打印等级太低了。
[ 12.254447] devices_kset: Moving i2c@0 to end of list
[ 12.254499] platform i2c@0: error -EPROBE_DEFER: supplier 80010000.gpio not ready
可以看到是gpio这个驱动没加载,依赖不满足。看dts
CAM0_gpio_sccb: gpio@80010000 {
#gpio-cells = <3>;
clock-names = "s_axi_aclk";
clocks = <&zynqmp_clk 71>;
compatible = "xlnx,axi-gpio-2.0", "xlnx,xps-gpio-1.00.a";
gpio-controller ;
reg = <0x0 0x80010000 0x0 0x10000>;
xlnx,all-inputs = <0x0>;
xlnx,all-inputs-2 = <0x0>;
xlnx,all-outputs = <0x0>;
xlnx,all-outputs-2 = <0x0>;
xlnx,dout-default = <0x00000000>;
xlnx,dout-default-2 = <0x00000000>;
xlnx,gpio-width = <0x2>;
xlnx,gpio2-width = <0x20>;
xlnx,interrupt-present = <0x0>;
xlnx,is-dual = <0x0>;
xlnx,tri-default = <0xFFFFFFFF>;
xlnx,tri-default-2 = <0xFFFFFFFF>;
};
i2c2: i2c@0 {
status = "okay";
compatible = "i2c-gpio";
#address-cells = <1>;
#size-cells = <0>;
i2c-gpio,delay-us = <2>; //100K HZ
sda-gpios = <&CAM0_gpio_sccb 1 0 GPIO_ACTIVE_HIGH>;
scl-gpios = <&CAM0_gpio_sccb 0 0 GPIO_ACTIVE_HIGH>;
ov5640_0:camera@3c {
compatible = "init-ov5640";
reg = <0x3c>;
reset-gpios = <&gpio_rstn 0 0 GPIO_ACTIVE_HIGH>;
5640,xsize = <640>;
5640,ysize = <480>;
5640,flip = <0x46>;
5640,mirror = <0x07>;
};
};
应该是CAM0_gpio_sccb 这个gpio驱动没加载成功,查看日志,果然:
[ 1.426639] devices_kset: Moving 80010000.gpio to end of list
[ 1.426645] devices_kset: Moving i2c@0 to end of list
[ 1.426697] gpio-xilinx 80010000.gpio: #gpio-cells mismatch
[ 1.432270] gpio-xilinx: probe of 80010000.gpio failed with error -22