Skip to content
  • Jean Delvare's avatar
    i2c: Add detection capability to new-style drivers · 4735c98f
    Jean Delvare authored
    
    
    Add a mechanism to let new-style i2c drivers optionally autodetect
    devices they would support on selected buses and ask i2c-core to
    instantiate them. This is a replacement for legacy i2c drivers, much
    cleaner.
    
    Where drivers had to implement both a legacy i2c_driver and a
    new-style i2c_driver so far, this mechanism makes it possible to get
    rid of the legacy i2c_driver and implement both enumerated and
    detected device support with just one (new-style) i2c_driver.
    
    Here is a quick conversion guide for these drivers, step by step:
    
    * Delete the legacy driver definition, registration and removal.
      Delete the attach_adapter and detach_client methods of the legacy
      driver.
    
    * Change the prototype of the legacy detect function from
        static int foo_detect(struct i2c_adapter *adapter, int address, int kind);
      to
        static int foo_detect(struct i2c_client *client, int kind,
        			  struct i2c_board_info *info);
    
    * Set the new-style driver detect callback to this new function, and
      set its address_data to &addr_data (addr_data is generally provided
      by I2C_CLIENT_INSMOD.)
    
    * Add the appropriate class to the new-style driver. This is
      typically the class the legacy attach_adapter method was checking
      for. Class checking is now mandatory (done by i2c-core.) See
      <linux/i2c.h> for the list of available classes.
    
    * Remove the i2c_client allocation and freeing from the detect
      function. A pre-allocated client is now handed to you by i2c-core,
      and is freed automatically.
    
    * Make the detect function fill the type field of the i2c_board_info
      structure it was passed as a parameter, and return 0, on success. If
      the detection fails, return -ENODEV.
    
    Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
    4735c98f