* Will not work for 10-bit addresses!
  * ----------------------------------------------------
  */
+/* Return: kind (>= 0) if force found, -1 if not found */
+static inline int i2c_probe_forces(struct i2c_adapter *adapter, int addr,
+                                  unsigned short **forces)
+{
+       unsigned short kind;
+       int j, adap_id = i2c_adapter_id(adapter);
+
+       for (kind = 0; forces[kind]; kind++) {
+               for (j = 0; forces[kind][j] != I2C_CLIENT_END; j += 2) {
+                       if ((forces[kind][j] == adap_id ||
+                            forces[kind][j] == ANY_I2C_BUS)
+                        && forces[kind][j + 1] == addr) {
+                               dev_dbg(&adapter->dev, "found force parameter, "
+                                       "addr 0x%02x, kind %u\n", addr, kind);
+                               return kind;
+                       }
+               }
+       }
+
+       return -1;
+}
+
 int i2c_probe(struct i2c_adapter *adapter,
              struct i2c_client_address_data *address_data,
              int (*found_proc) (struct i2c_adapter *, int, int))
                   at all */
                found = 0;
 
-               for (i = 0; !found && (address_data->force[i] != I2C_CLIENT_END); i += 2) {
-                       if (((adap_id == address_data->force[i]) || 
-                            (address_data->force[i] == ANY_I2C_BUS)) &&
-                            (addr == address_data->force[i+1])) {
-                               dev_dbg(&adapter->dev, "found force parameter for adapter %d, addr %04x\n",
-                                       adap_id, addr);
-                               if ((err = found_proc(adapter,addr,0)))
+               if (address_data->forces) {
+                       int kind = i2c_probe_forces(adapter, addr,
+                                                   address_data->forces);
+                       if (kind >= 0) { /* force found */
+                               if ((err = found_proc(adapter, addr, kind)))
                                        return err;
-                               found = 1;
+                               continue;
                        }
                }
-               if (found) 
-                       continue;
 
                /* If this address is in one of the ignores, we can forget about
                   it right now */
 
 struct i2c_adapter;
 struct i2c_client;
 struct i2c_driver;
-struct i2c_client_address_data;
 union i2c_smbus_data;
 
 /*
        unsigned short *normal_i2c;
        unsigned short *probe;
        unsigned short *ignore;
-       unsigned short *force;
+       unsigned short **forces;
 };
 
 /* Internal numbers to terminate lists */
   I2C_CLIENT_MODULE_PARM(force, \
                       "List of adapter,address pairs to boldly assume " \
                       "to be present"); \
+       static unsigned short *addr_forces[] = {                        \
+                       force,                                          \
+                       NULL                                            \
+               };                                                      \
        static struct i2c_client_address_data addr_data = {             \
                        .normal_i2c =           normal_i2c,             \
                        .probe =                probe,                  \
                        .ignore =               ignore,                 \
-                       .force =                force,                  \
+                       .forces =               addr_forces,            \
                }
 
 #endif /* _LINUX_I2C_H */