Add support for kind-forced addresses to i2c_probe, like i2c_detect
has for (essentially) hardware monitoring drivers.

Note that this change will slightly increase the size of the drivers
using I2C_CLIENT_INSMOD, with no immediate benefit. This is a
requirement if we want to merge i2c_probe and i2c_detect though, and
seems a reasonable price to pay in comparison with the previous
cleanups which saved much more than that (such as the i2c-isa cleanup
or the i2c address ranges removal.)

Signed-off-by: Jean Delvare <[EMAIL PROTECTED]>

 drivers/i2c/chips/ds1374.c       |    1 -
 drivers/i2c/chips/m41t00.c       |    1 -
 drivers/i2c/chips/rtc8564.c      |    1 -
 drivers/i2c/i2c-core.c           |   38 ++++++++++++++++++++++++++++----------
 drivers/media/video/adv7170.c    |    1 -
 drivers/media/video/adv7175.c    |    1 -
 drivers/media/video/bt819.c      |    1 -
 drivers/media/video/bt856.c      |    1 -
 drivers/media/video/saa7110.c    |    1 -
 drivers/media/video/saa7111.c    |    1 -
 drivers/media/video/saa7114.c    |    1 -
 drivers/media/video/saa7185.c    |    1 -
 drivers/media/video/tuner-3036.c |    1 -
 drivers/media/video/vpx3220.c    |    1 -
 include/linux/i2c.h              |    9 ++++++---
 15 files changed, 34 insertions(+), 26 deletions(-)

--- linux-2.6.13-rc4.orig/drivers/media/video/adv7170.c 2005-07-31 
16:03:01.000000000 +0200
+++ linux-2.6.13-rc4/drivers/media/video/adv7170.c      2005-07-31 
20:56:05.000000000 +0200
@@ -391,7 +391,6 @@
        .normal_i2c             = normal_i2c,
        .probe                  = &ignore,
        .ignore                 = &ignore,
-       .force                  = &ignore,
 };
 
 static struct i2c_driver i2c_driver_adv7170;
--- linux-2.6.13-rc4.orig/drivers/media/video/adv7175.c 2005-07-31 
16:03:01.000000000 +0200
+++ linux-2.6.13-rc4/drivers/media/video/adv7175.c      2005-07-31 
20:56:05.000000000 +0200
@@ -441,7 +441,6 @@
        .normal_i2c             = normal_i2c,
        .probe                  = &ignore,
        .ignore                 = &ignore,
-       .force                  = &ignore,
 };
 
 static struct i2c_driver i2c_driver_adv7175;
--- linux-2.6.13-rc4.orig/drivers/media/video/bt819.c   2005-07-31 
16:03:01.000000000 +0200
+++ linux-2.6.13-rc4/drivers/media/video/bt819.c        2005-07-31 
20:56:05.000000000 +0200
@@ -507,7 +507,6 @@
        .normal_i2c             = normal_i2c,
        .probe                  = &ignore,
        .ignore                 = &ignore,
-       .force                  = &ignore,
 };
 
 static struct i2c_driver i2c_driver_bt819;
--- linux-2.6.13-rc4.orig/drivers/media/video/bt856.c   2005-07-31 
16:03:01.000000000 +0200
+++ linux-2.6.13-rc4/drivers/media/video/bt856.c        2005-07-31 
20:56:05.000000000 +0200
@@ -295,7 +295,6 @@
        .normal_i2c             = normal_i2c,
        .probe                  = &ignore,
        .ignore                 = &ignore,
-       .force                  = &ignore,
 };
 
 static struct i2c_driver i2c_driver_bt856;
--- linux-2.6.13-rc4.orig/drivers/media/video/saa7110.c 2005-07-31 
16:03:01.000000000 +0200
+++ linux-2.6.13-rc4/drivers/media/video/saa7110.c      2005-07-31 
20:56:05.000000000 +0200
@@ -470,7 +470,6 @@
        .normal_i2c             = normal_i2c,
        .probe                  = &ignore,
        .ignore                 = &ignore,
-       .force                  = &ignore,
 };
 
 static struct i2c_driver i2c_driver_saa7110;
--- linux-2.6.13-rc4.orig/drivers/media/video/saa7111.c 2005-07-31 
16:03:01.000000000 +0200
+++ linux-2.6.13-rc4/drivers/media/video/saa7111.c      2005-07-31 
20:56:05.000000000 +0200
@@ -489,7 +489,6 @@
        .normal_i2c             = normal_i2c,
        .probe                  = &ignore,
        .ignore                 = &ignore,
-       .force                  = &ignore,
 };
 
 static struct i2c_driver i2c_driver_saa7111;
--- linux-2.6.13-rc4.orig/drivers/media/video/saa7114.c 2005-07-31 
16:03:01.000000000 +0200
+++ linux-2.6.13-rc4/drivers/media/video/saa7114.c      2005-07-31 
20:56:05.000000000 +0200
@@ -827,7 +827,6 @@
        .normal_i2c             = normal_i2c,
        .probe                  = &ignore,
        .ignore                 = &ignore,
-       .force                  = &ignore,
 };
 
 static struct i2c_driver i2c_driver_saa7114;
--- linux-2.6.13-rc4.orig/drivers/media/video/saa7185.c 2005-07-31 
16:03:01.000000000 +0200
+++ linux-2.6.13-rc4/drivers/media/video/saa7185.c      2005-07-31 
20:56:05.000000000 +0200
@@ -387,7 +387,6 @@
        .normal_i2c             = normal_i2c,
        .probe                  = &ignore,
        .ignore                 = &ignore,
-       .force                  = &ignore,
 };
 
 static struct i2c_driver i2c_driver_saa7185;
--- linux-2.6.13-rc4.orig/drivers/media/video/tuner-3036.c      2005-07-31 
16:03:01.000000000 +0200
+++ linux-2.6.13-rc4/drivers/media/video/tuner-3036.c   2005-07-31 
20:56:05.000000000 +0200
@@ -41,7 +41,6 @@
        .normal_i2c     = normal_i2c,
        .probe          = &ignore,
        .ignore         = &ignore,
-       .force          = &ignore,
 };
 
 /* ---------------------------------------------------------------------- */
--- linux-2.6.13-rc4.orig/drivers/media/video/vpx3220.c 2005-07-31 
16:03:01.000000000 +0200
+++ linux-2.6.13-rc4/drivers/media/video/vpx3220.c      2005-07-31 
20:56:05.000000000 +0200
@@ -576,7 +576,6 @@
        .normal_i2c             = normal_i2c,
        .probe                  = &ignore,
        .ignore                 = &ignore,
-       .force                  = &ignore,
 };
 
 static struct i2c_driver vpx3220_i2c_driver;
--- linux-2.6.13-rc4.orig/drivers/i2c/chips/ds1374.c    2005-07-31 
16:03:01.000000000 +0200
+++ linux-2.6.13-rc4/drivers/i2c/chips/ds1374.c 2005-07-31 20:56:05.000000000 
+0200
@@ -53,7 +53,6 @@
        .normal_i2c = normal_addr,
        .probe = ignore,
        .ignore = ignore,
-       .force = ignore,
 };
 
 static ulong ds1374_read_rtc(void)
--- linux-2.6.13-rc4.orig/drivers/i2c/chips/m41t00.c    2005-07-31 
16:03:01.000000000 +0200
+++ linux-2.6.13-rc4/drivers/i2c/chips/m41t00.c 2005-07-31 20:56:05.000000000 
+0200
@@ -42,7 +42,6 @@
        .normal_i2c             = normal_addr,
        .probe                  = ignore,
        .ignore                 = ignore,
-       .force                  = ignore,
 };
 
 ulong
--- linux-2.6.13-rc4.orig/drivers/i2c/chips/rtc8564.c   2005-07-31 
16:03:01.000000000 +0200
+++ linux-2.6.13-rc4/drivers/i2c/chips/rtc8564.c        2005-07-31 
20:56:05.000000000 +0200
@@ -67,7 +67,6 @@
        .normal_i2c             = normal_addr,
        .probe                  = ignore,
        .ignore                 = ignore,
-       .force                  = ignore,
 };
 
 static int rtc8564_read_mem(struct i2c_client *client, struct mem *mem);
--- linux-2.6.13-rc4.orig/drivers/i2c/i2c-core.c        2005-07-31 
16:03:01.000000000 +0200
+++ linux-2.6.13-rc4/drivers/i2c/i2c-core.c     2005-07-31 20:56:05.000000000 
+0200
@@ -662,6 +662,28 @@
  * 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))
@@ -683,19 +705,15 @@
                   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 */
--- linux-2.6.13-rc4.orig/include/linux/i2c.h   2005-07-31 16:03:01.000000000 
+0200
+++ linux-2.6.13-rc4/include/linux/i2c.h        2005-07-31 20:56:05.000000000 
+0200
@@ -48,7 +48,6 @@
 struct i2c_adapter;
 struct i2c_client;
 struct i2c_driver;
-struct i2c_client_address_data;
 union i2c_smbus_data;
 
 /*
@@ -301,7 +300,7 @@
        unsigned short *normal_i2c;
        unsigned short *probe;
        unsigned short *ignore;
-       unsigned short *force;
+       unsigned short **forces;
 };
 
 /* Internal numbers to terminate lists */
@@ -575,11 +574,15 @@
   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 */


-- 
Jean Delvare
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to