Who calls the probe() of driver

前端 未结 6 612
北海茫月
北海茫月 2020-12-12 14:35

How does probe() call gets called? Who calls it? As per my understanding, __init() registers driver and then somehow probe()

6条回答
  •  醉梦人生
    2020-12-12 15:01

    @iSegFault : probe() will be called to make sure that the device exist and the functionality is fine.If device is not hot-pluggable, functionality of probe() can be put inside init() method.This will reduce driver's run time memory footprint. P.S link

    Probe() happens at the time of device boot or when device is connected.For a "platform" device the probe function is invoked when a platform device is registered and it's device name matches the name specified on the device driver. P.S link

    The i2c_detect function probes the I2C adapter, looking for the different addresses specified in the addr_data structure. If a device is found, the chip_detect function then is called. P.S link.

    One link that will surely clear your doubt. P.S link

    In kernel 2.4.29, i can show you that how does probe happen ? Please see below (File name: drivers/acorn/char/pcf8583.c)

    static struct i2c_driver pcf8583_driver = {
    name:       "PCF8583",
    id:     I2C_DRIVERID_PCF8583,
    flags:      I2C_DF_NOTIFY,
    attach_adapter: pcf8583_probe, /* This will be called from i2c-core.c P.S see below function i2c_add_driver()*/
    detach_client:  pcf8583_detach,
    command:    pcf8583_command
    };
    

    File Name: drivers/i2c/i2c-core.c

    int i2c_add_driver(struct i2c_driver *driver)
    {
        ........................
        ........................
    
        /* now look for instances of driver on our adapters
         */
        if (driver->flags& (I2C_DF_NOTIFY|I2C_DF_DUMMY)) {
            for (i=0;iattach_adapter(adapters[i]); /*This is a location from where probe is called. Pointer **driver** is of type **pcf8583_driver** which you have passed into this function*/
        }
        ADAP_UNLOCK();
        return 0;
    }
    

    Few important links:

    1. http://www.slideshare.net/varunmahajan06/i2c-subsystem-in-linux2624

    2. http://www.programering.com/a/MjNwcTMwATM.html

    3. http://www.linuxjournal.com/article/6717

    4. http://www.developermemo.com/2943157/

    5. http://free-electrons.com/doc/kernel-architecture.pdf

    6. http://www.techques.com/question/1-3014627/Probe-problem-when-writing-a-I2C-device-driver

    In PCI for kernel-2.4.29, it gets called when vendor and device id are identified. PCI bus driver do this for you. Please see below code:

    File Name: drivers/pci/pci.c

    static int pci_announce_device(struct pci_driver *drv, struct pci_dev *dev)
    {
       const struct pci_device_id *id;
       int ret = 0;
       if (drv->id_table) {
        id = pci_match_device(drv->id_table, dev); /* check for device presence*/
        if (!id) {
         ret = 0;
         goto out;
        }
       } else
      id = NULL;
      dev_probe_lock();
      if (drv->probe(dev, id) >= 0) { /* This is a location from where probe is called*/
       dev->driver = drv;
       ret = 1;
       }
       dev_probe_unlock();
      out:
      return ret;
    }
    

提交回复
热议问题