aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/i2c/i2c-sensor-detect.c13
-rw-r--r--include/linux/i2c-sensor.h133
2 files changed, 67 insertions, 79 deletions
diff --git a/drivers/i2c/i2c-sensor-detect.c b/drivers/i2c/i2c-sensor-detect.c
index 5aede3ca9cb0..c952926c1482 100644
--- a/drivers/i2c/i2c-sensor-detect.c
+++ b/drivers/i2c/i2c-sensor-detect.c
@@ -32,7 +32,6 @@ int i2c_detect(struct i2c_adapter *adapter,
32 int (*found_proc) (struct i2c_adapter *, int, int)) 32 int (*found_proc) (struct i2c_adapter *, int, int))
33{ 33{
34 int addr, i, found, j, err; 34 int addr, i, found, j, err;
35 struct i2c_force_data *this_force;
36 int adapter_id = i2c_adapter_id(adapter); 35 int adapter_id = i2c_adapter_id(adapter);
37 unsigned short *normal_i2c; 36 unsigned short *normal_i2c;
38 unsigned short *probe; 37 unsigned short *probe;
@@ -58,13 +57,13 @@ int i2c_detect(struct i2c_adapter *adapter,
58 /* If it is in one of the force entries, we don't do any 57 /* If it is in one of the force entries, we don't do any
59 detection at all */ 58 detection at all */
60 found = 0; 59 found = 0;
61 for (i = 0; !found && (this_force = address_data->forces + i, this_force->force); i++) { 60 for (i = 0; address_data->forces[i]; i++) {
62 for (j = 0; !found && (this_force->force[j] != I2C_CLIENT_END); j += 2) { 61 for (j = 0; !found && (address_data->forces[i][j] != I2C_CLIENT_END); j += 2) {
63 if ( ((adapter_id == this_force->force[j]) || 62 if ( ((adapter_id == address_data->forces[i][j]) ||
64 (this_force->force[j] == ANY_I2C_BUS)) && 63 (address_data->forces[i][j] == ANY_I2C_BUS)) &&
65 (addr == this_force->force[j + 1]) ) { 64 (addr == address_data->forces[i][j + 1]) ) {
66 dev_dbg(&adapter->dev, "found force parameter for adapter %d, addr %04x\n", adapter_id, addr); 65 dev_dbg(&adapter->dev, "found force parameter for adapter %d, addr %04x\n", adapter_id, addr);
67 if ((err = found_proc(adapter, addr, this_force->kind))) 66 if ((err = found_proc(adapter, addr, i)))
68 return err; 67 return err;
69 found = 1; 68 found = 1;
70 } 69 }
diff --git a/include/linux/i2c-sensor.h b/include/linux/i2c-sensor.h
index e832d3286a46..4facaa0b9054 100644
--- a/include/linux/i2c-sensor.h
+++ b/include/linux/i2c-sensor.h
@@ -22,22 +22,6 @@
22#ifndef _LINUX_I2C_SENSOR_H 22#ifndef _LINUX_I2C_SENSOR_H
23#define _LINUX_I2C_SENSOR_H 23#define _LINUX_I2C_SENSOR_H
24 24
25/* A structure containing detect information.
26 Force variables overrule all other variables; they force a detection on
27 that place. If a specific chip is given, the module blindly assumes this
28 chip type is present; if a general force (kind == 0) is given, the module
29 will still try to figure out what type of chip is present. This is useful
30 if for some reasons the detect for SMBus address space filled fails.
31 probe: insmod parameter. Initialize this list with I2C_CLIENT_END values.
32 A list of pairs. The first value is a bus number (ANY_I2C_BUS for any
33 I2C bus), the second is the address.
34 kind: The kind of chip. 0 equals any chip.
35*/
36struct i2c_force_data {
37 unsigned short *force;
38 unsigned short kind;
39};
40
41/* A structure containing the detect information. 25/* A structure containing the detect information.
42 normal_i2c: filled in by the module writer. Terminated by I2C_CLIENT_END. 26 normal_i2c: filled in by the module writer. Terminated by I2C_CLIENT_END.
43 A list of I2C addresses which should normally be examined. 27 A list of I2C addresses which should normally be examined.
@@ -50,14 +34,18 @@ struct i2c_force_data {
50 I2C bus), the second is the I2C address. These addresses are never 34 I2C bus), the second is the I2C address. These addresses are never
51 probed. This parameter overrules 'normal' and probe', but not the 35 probed. This parameter overrules 'normal' and probe', but not the
52 'force' lists. 36 'force' lists.
53 force_data: insmod parameters. A list, ending with an element of which 37 forces: insmod parameters. A list, ending with a NULL element.
54 the force field is NULL. 38 Force variables overrule all other variables; they force a detection on
39 that place. If a specific chip is given, the module blindly assumes this
40 chip type is present; if a general force (kind == 0) is given, the module
41 will still try to figure out what type of chip is present. This is useful
42 if for some reasons the detect for SMBus address space filled fails.
55*/ 43*/
56struct i2c_address_data { 44struct i2c_address_data {
57 unsigned short *normal_i2c; 45 unsigned short *normal_i2c;
58 unsigned short *probe; 46 unsigned short *probe;
59 unsigned short *ignore; 47 unsigned short *ignore;
60 struct i2c_force_data *forces; 48 unsigned short **forces;
61}; 49};
62 50
63#define SENSORS_MODULE_PARM_FORCE(name) \ 51#define SENSORS_MODULE_PARM_FORCE(name) \
@@ -88,7 +76,8 @@ struct i2c_address_data {
88 I2C_CLIENT_MODULE_PARM(force, \ 76 I2C_CLIENT_MODULE_PARM(force, \
89 "List of adapter,address pairs to boldly assume " \ 77 "List of adapter,address pairs to boldly assume " \
90 "to be present"); \ 78 "to be present"); \
91 static struct i2c_force_data forces[] = {{force,any_chip},{NULL}}; \ 79 static unsigned short *forces[] = { force, \
80 NULL }; \
92 SENSORS_INSMOD 81 SENSORS_INSMOD
93 82
94#define SENSORS_INSMOD_1(chip1) \ 83#define SENSORS_INSMOD_1(chip1) \
@@ -97,9 +86,9 @@ struct i2c_address_data {
97 "List of adapter,address pairs to boldly assume " \ 86 "List of adapter,address pairs to boldly assume " \
98 "to be present"); \ 87 "to be present"); \
99 SENSORS_MODULE_PARM_FORCE(chip1); \ 88 SENSORS_MODULE_PARM_FORCE(chip1); \
100 static struct i2c_force_data forces[] = {{force,any_chip},\ 89 static unsigned short *forces[] = { force, \
101 {force_ ## chip1,chip1}, \ 90 force_##chip1, \
102 {NULL}}; \ 91 NULL }; \
103 SENSORS_INSMOD 92 SENSORS_INSMOD
104 93
105#define SENSORS_INSMOD_2(chip1,chip2) \ 94#define SENSORS_INSMOD_2(chip1,chip2) \
@@ -109,10 +98,10 @@ struct i2c_address_data {
109 "to be present"); \ 98 "to be present"); \
110 SENSORS_MODULE_PARM_FORCE(chip1); \ 99 SENSORS_MODULE_PARM_FORCE(chip1); \
111 SENSORS_MODULE_PARM_FORCE(chip2); \ 100 SENSORS_MODULE_PARM_FORCE(chip2); \
112 static struct i2c_force_data forces[] = {{force,any_chip}, \ 101 static unsigned short *forces[] = { force, \
113 {force_ ## chip1,chip1}, \ 102 force_##chip1, \
114 {force_ ## chip2,chip2}, \ 103 force_##chip2, \
115 {NULL}}; \ 104 NULL }; \
116 SENSORS_INSMOD 105 SENSORS_INSMOD
117 106
118#define SENSORS_INSMOD_3(chip1,chip2,chip3) \ 107#define SENSORS_INSMOD_3(chip1,chip2,chip3) \
@@ -123,11 +112,11 @@ struct i2c_address_data {
123 SENSORS_MODULE_PARM_FORCE(chip1); \ 112 SENSORS_MODULE_PARM_FORCE(chip1); \
124 SENSORS_MODULE_PARM_FORCE(chip2); \ 113 SENSORS_MODULE_PARM_FORCE(chip2); \
125 SENSORS_MODULE_PARM_FORCE(chip3); \ 114 SENSORS_MODULE_PARM_FORCE(chip3); \
126 static struct i2c_force_data forces[] = {{force,any_chip}, \ 115 static unsigned short *forces[] = { force, \
127 {force_ ## chip1,chip1}, \ 116 force_##chip1, \
128 {force_ ## chip2,chip2}, \ 117 force_##chip2, \
129 {force_ ## chip3,chip3}, \ 118 force_##chip3, \
130 {NULL}}; \ 119 NULL }; \
131 SENSORS_INSMOD 120 SENSORS_INSMOD
132 121
133#define SENSORS_INSMOD_4(chip1,chip2,chip3,chip4) \ 122#define SENSORS_INSMOD_4(chip1,chip2,chip3,chip4) \
@@ -139,12 +128,12 @@ struct i2c_address_data {
139 SENSORS_MODULE_PARM_FORCE(chip2); \ 128 SENSORS_MODULE_PARM_FORCE(chip2); \
140 SENSORS_MODULE_PARM_FORCE(chip3); \ 129 SENSORS_MODULE_PARM_FORCE(chip3); \
141 SENSORS_MODULE_PARM_FORCE(chip4); \ 130 SENSORS_MODULE_PARM_FORCE(chip4); \
142 static struct i2c_force_data forces[] = {{force,any_chip}, \ 131 static unsigned short *forces[] = { force, \
143 {force_ ## chip1,chip1}, \ 132 force_##chip1, \
144 {force_ ## chip2,chip2}, \ 133 force_##chip2, \
145 {force_ ## chip3,chip3}, \ 134 force_##chip3, \
146 {force_ ## chip4,chip4}, \ 135 force_##chip4, \
147 {NULL}}; \ 136 NULL}; \
148 SENSORS_INSMOD 137 SENSORS_INSMOD
149 138
150#define SENSORS_INSMOD_5(chip1,chip2,chip3,chip4,chip5) \ 139#define SENSORS_INSMOD_5(chip1,chip2,chip3,chip4,chip5) \
@@ -157,13 +146,13 @@ struct i2c_address_data {
157 SENSORS_MODULE_PARM_FORCE(chip3); \ 146 SENSORS_MODULE_PARM_FORCE(chip3); \
158 SENSORS_MODULE_PARM_FORCE(chip4); \ 147 SENSORS_MODULE_PARM_FORCE(chip4); \
159 SENSORS_MODULE_PARM_FORCE(chip5); \ 148 SENSORS_MODULE_PARM_FORCE(chip5); \
160 static struct i2c_force_data forces[] = {{force,any_chip}, \ 149 static unsigned short *forces[] = { force, \
161 {force_ ## chip1,chip1}, \ 150 force_##chip1, \
162 {force_ ## chip2,chip2}, \ 151 force_##chip2, \
163 {force_ ## chip3,chip3}, \ 152 force_##chip3, \
164 {force_ ## chip4,chip4}, \ 153 force_##chip4, \
165 {force_ ## chip5,chip5}, \ 154 force_##chip5, \
166 {NULL}}; \ 155 NULL }; \
167 SENSORS_INSMOD 156 SENSORS_INSMOD
168 157
169#define SENSORS_INSMOD_6(chip1,chip2,chip3,chip4,chip5,chip6) \ 158#define SENSORS_INSMOD_6(chip1,chip2,chip3,chip4,chip5,chip6) \
@@ -177,14 +166,14 @@ struct i2c_address_data {
177 SENSORS_MODULE_PARM_FORCE(chip4); \ 166 SENSORS_MODULE_PARM_FORCE(chip4); \
178 SENSORS_MODULE_PARM_FORCE(chip5); \ 167 SENSORS_MODULE_PARM_FORCE(chip5); \
179 SENSORS_MODULE_PARM_FORCE(chip6); \ 168 SENSORS_MODULE_PARM_FORCE(chip6); \
180 static struct i2c_force_data forces[] = {{force,any_chip}, \ 169 static unsigned short *forces[] = { force, \
181 {force_ ## chip1,chip1}, \ 170 force_##chip1, \
182 {force_ ## chip2,chip2}, \ 171 force_##chip2, \
183 {force_ ## chip3,chip3}, \ 172 force_##chip3, \
184 {force_ ## chip4,chip4}, \ 173 force_##chip4, \
185 {force_ ## chip5,chip5}, \ 174 force_##chip5, \
186 {force_ ## chip6,chip6}, \ 175 force_##chip6, \
187 {NULL}}; \ 176 NULL }; \
188 SENSORS_INSMOD 177 SENSORS_INSMOD
189 178
190#define SENSORS_INSMOD_7(chip1,chip2,chip3,chip4,chip5,chip6,chip7) \ 179#define SENSORS_INSMOD_7(chip1,chip2,chip3,chip4,chip5,chip6,chip7) \
@@ -199,15 +188,15 @@ struct i2c_address_data {
199 SENSORS_MODULE_PARM_FORCE(chip5); \ 188 SENSORS_MODULE_PARM_FORCE(chip5); \
200 SENSORS_MODULE_PARM_FORCE(chip6); \ 189 SENSORS_MODULE_PARM_FORCE(chip6); \
201 SENSORS_MODULE_PARM_FORCE(chip7); \ 190 SENSORS_MODULE_PARM_FORCE(chip7); \
202 static struct i2c_force_data forces[] = {{force,any_chip}, \ 191 static unsigned short *forces[] = { force, \
203 {force_ ## chip1,chip1}, \ 192 force_##chip1, \
204 {force_ ## chip2,chip2}, \ 193 force_##chip2, \
205 {force_ ## chip3,chip3}, \ 194 force_##chip3, \
206 {force_ ## chip4,chip4}, \ 195 force_##chip4, \
207 {force_ ## chip5,chip5}, \ 196 force_##chip5, \
208 {force_ ## chip6,chip6}, \ 197 force_##chip6, \
209 {force_ ## chip7,chip7}, \ 198 force_##chip7, \
210 {NULL}}; \ 199 NULL }; \
211 SENSORS_INSMOD 200 SENSORS_INSMOD
212 201
213#define SENSORS_INSMOD_8(chip1,chip2,chip3,chip4,chip5,chip6,chip7,chip8) \ 202#define SENSORS_INSMOD_8(chip1,chip2,chip3,chip4,chip5,chip6,chip7,chip8) \
@@ -223,16 +212,16 @@ struct i2c_address_data {
223 SENSORS_MODULE_PARM_FORCE(chip6); \ 212 SENSORS_MODULE_PARM_FORCE(chip6); \
224 SENSORS_MODULE_PARM_FORCE(chip7); \ 213 SENSORS_MODULE_PARM_FORCE(chip7); \
225 SENSORS_MODULE_PARM_FORCE(chip8); \ 214 SENSORS_MODULE_PARM_FORCE(chip8); \
226 static struct i2c_force_data forces[] = {{force,any_chip}, \ 215 static unsigned short *forces[] = { force, \
227 {force_ ## chip1,chip1}, \ 216 force_##chip1, \
228 {force_ ## chip2,chip2}, \ 217 force_##chip2, \
229 {force_ ## chip3,chip3}, \ 218 force_##chip3, \
230 {force_ ## chip4,chip4}, \ 219 force_##chip4, \
231 {force_ ## chip5,chip5}, \ 220 force_##chip5, \
232 {force_ ## chip6,chip6}, \ 221 force_##chip6, \
233 {force_ ## chip7,chip7}, \ 222 force_##chip7, \
234 {force_ ## chip8,chip8}, \ 223 force_##chip8, \
235 {NULL}}; \ 224 NULL }; \
236 SENSORS_INSMOD 225 SENSORS_INSMOD
237 226
238/* Detect function. It iterates over all possible addresses itself. For 227/* Detect function. It iterates over all possible addresses itself. For