const char *name,
                int bus,
                struct i2c_board_info *info,
-               const unsigned short *addrs)
+               const unsigned short *alt_addr_list)
 {
        const struct dmi_device *dmi_dev;
        const struct dmi_dev_onboard *dev_data;
        struct i2c_adapter *adapter;
-       struct i2c_client *client;
+       struct i2c_client *client = NULL;
+       const unsigned short addr_list[] = { info->addr, I2C_CLIENT_END };
 
        if (bus < 0)
                return NULL;
                return NULL;
        }
 
-       /* add the i2c device */
-       client = i2c_new_probed_device(adapter, info, addrs, NULL);
+       /*
+        * Add the i2c device. If we can't detect it at the primary
+        * address we scan secondary addresses. In any case the client
+        * structure gets assigned primary address.
+        */
+       client = i2c_new_probed_device(adapter, info, addr_list, NULL);
+       if (!client && alt_addr_list) {
+               struct i2c_board_info dummy_info = {
+                       I2C_BOARD_INFO("dummy", info->addr),
+               };
+               struct i2c_client *dummy;
+
+               dummy = i2c_new_probed_device(adapter, &dummy_info,
+                                             alt_addr_list, NULL);
+               if (dummy) {
+                       pr_debug("%s %d-%02x is probed at %02x\n",
+                                 __func__, bus, info->addr, dummy->addr);
+                       i2c_unregister_device(dummy);
+                       client = i2c_new_device(adapter, info);
+               }
+       }
+
        if (!client)
                pr_notice("%s failed to register device %d-%02x\n",
                          __func__, bus, info->addr);
                                                enum i2c_adapter_type type,
                                                struct i2c_board_info *info)
 {
-       const unsigned short addr_list[] = { info->addr, I2C_CLIENT_END };
-
        return __add_probed_i2c_device(name,
                                       find_i2c_adapter_num(type),
                                       info,
-                                      addr_list);
+                                      NULL);
 }
 
 static int setup_cyapa_tp(enum i2c_adapter_type type)
 static int setup_atmel_224s_tp(enum i2c_adapter_type type)
 {
        const unsigned short addr_list[] = { ATMEL_TP_I2C_BL_ADDR,
-                                            ATMEL_TP_I2C_ADDR,
                                             I2C_CLIENT_END };
        if (tp)
                return 0;
 static int setup_atmel_1664s_ts(enum i2c_adapter_type type)
 {
        const unsigned short addr_list[] = { ATMEL_TS_I2C_BL_ADDR,
-                                            ATMEL_TS_I2C_ADDR,
                                             I2C_CLIENT_END };
        if (ts)
                return 0;