ILD

driver load error, deferred probe pending
作者:Yuan Jianpeng 邮箱:yuanjp89@163.com
发布时间:2023-12-10 站点:Inside Linux Development

最近在移植一个驱动,启动后打印:

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


Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.