}
 
        driver = to_i2c_driver(dev->driver);
-       if (!driver->probe)
-               return -EINVAL;
 
        /*
         * An I2C ID table is not mandatory, if and only if, a suitable Device
        if (status == -EPROBE_DEFER)
                goto err_clear_wakeup_irq;
 
-       status = driver->probe(client, i2c_match_id(driver->id_table, client));
+       /*
+        * When there are no more users of probe(),
+        * rename probe_new to probe.
+        */
+       if (driver->probe_new)
+               status = driver->probe_new(client);
+       else if (driver->probe)
+               status = driver->probe(client,
+                                      i2c_match_id(driver->id_table, client));
+       else
+               status = -EINVAL;
+
        if (status)
                goto err_detach_pm_domain;
 
 
  * struct i2c_driver - represent an I2C device driver
  * @class: What kind of i2c device we instantiate (for detect)
  * @attach_adapter: Callback for bus addition (deprecated)
- * @probe: Callback for device binding
+ * @probe: Callback for device binding - soon to be deprecated
+ * @probe_new: New callback for device binding
  * @remove: Callback for device unbinding
  * @shutdown: Callback for device shutdown
  * @alert: Alert callback, for example for the SMBus alert protocol
        int (*probe)(struct i2c_client *, const struct i2c_device_id *);
        int (*remove)(struct i2c_client *);
 
+       /* New driver model interface to aid the seamless removal of the
+        * current probe()'s, more commonly unused than used second parameter.
+        */
+       int (*probe_new)(struct i2c_client *);
+
        /* driver model interfaces that don't relate to enumeration  */
        void (*shutdown)(struct i2c_client *);