diff options
Diffstat (limited to 'drivers/i2c/algos/i2c-algo-pca.c')
-rw-r--r-- | drivers/i2c/algos/i2c-algo-pca.c | 250 |
1 files changed, 207 insertions, 43 deletions
diff --git a/drivers/i2c/algos/i2c-algo-pca.c b/drivers/i2c/algos/i2c-algo-pca.c index d50b329a3c94..f68e5f8e23ee 100644 --- a/drivers/i2c/algos/i2c-algo-pca.c +++ b/drivers/i2c/algos/i2c-algo-pca.c | |||
@@ -22,14 +22,18 @@ | |||
22 | #include <linux/module.h> | 22 | #include <linux/module.h> |
23 | #include <linux/moduleparam.h> | 23 | #include <linux/moduleparam.h> |
24 | #include <linux/delay.h> | 24 | #include <linux/delay.h> |
25 | #include <linux/jiffies.h> | ||
25 | #include <linux/init.h> | 26 | #include <linux/init.h> |
26 | #include <linux/errno.h> | 27 | #include <linux/errno.h> |
27 | #include <linux/i2c.h> | 28 | #include <linux/i2c.h> |
28 | #include <linux/i2c-algo-pca.h> | 29 | #include <linux/i2c-algo-pca.h> |
29 | 30 | ||
30 | #define DEB1(fmt, args...) do { if (i2c_debug>=1) printk(fmt, ## args); } while(0) | 31 | #define DEB1(fmt, args...) do { if (i2c_debug >= 1) \ |
31 | #define DEB2(fmt, args...) do { if (i2c_debug>=2) printk(fmt, ## args); } while(0) | 32 | printk(KERN_DEBUG fmt, ## args); } while (0) |
32 | #define DEB3(fmt, args...) do { if (i2c_debug>=3) printk(fmt, ## args); } while(0) | 33 | #define DEB2(fmt, args...) do { if (i2c_debug >= 2) \ |
34 | printk(KERN_DEBUG fmt, ## args); } while (0) | ||
35 | #define DEB3(fmt, args...) do { if (i2c_debug >= 3) \ | ||
36 | printk(KERN_DEBUG fmt, ## args); } while (0) | ||
33 | 37 | ||
34 | static int i2c_debug; | 38 | static int i2c_debug; |
35 | 39 | ||
@@ -43,19 +47,27 @@ static int i2c_debug; | |||
43 | #define pca_wait(adap) adap->wait_for_completion(adap->data) | 47 | #define pca_wait(adap) adap->wait_for_completion(adap->data) |
44 | #define pca_reset(adap) adap->reset_chip(adap->data) | 48 | #define pca_reset(adap) adap->reset_chip(adap->data) |
45 | 49 | ||
50 | static void pca9665_reset(void *pd) | ||
51 | { | ||
52 | struct i2c_algo_pca_data *adap = pd; | ||
53 | pca_outw(adap, I2C_PCA_INDPTR, I2C_PCA_IPRESET); | ||
54 | pca_outw(adap, I2C_PCA_IND, 0xA5); | ||
55 | pca_outw(adap, I2C_PCA_IND, 0x5A); | ||
56 | } | ||
57 | |||
46 | /* | 58 | /* |
47 | * Generate a start condition on the i2c bus. | 59 | * Generate a start condition on the i2c bus. |
48 | * | 60 | * |
49 | * returns after the start condition has occurred | 61 | * returns after the start condition has occurred |
50 | */ | 62 | */ |
51 | static void pca_start(struct i2c_algo_pca_data *adap) | 63 | static int pca_start(struct i2c_algo_pca_data *adap) |
52 | { | 64 | { |
53 | int sta = pca_get_con(adap); | 65 | int sta = pca_get_con(adap); |
54 | DEB2("=== START\n"); | 66 | DEB2("=== START\n"); |
55 | sta |= I2C_PCA_CON_STA; | 67 | sta |= I2C_PCA_CON_STA; |
56 | sta &= ~(I2C_PCA_CON_STO|I2C_PCA_CON_SI); | 68 | sta &= ~(I2C_PCA_CON_STO|I2C_PCA_CON_SI); |
57 | pca_set_con(adap, sta); | 69 | pca_set_con(adap, sta); |
58 | pca_wait(adap); | 70 | return pca_wait(adap); |
59 | } | 71 | } |
60 | 72 | ||
61 | /* | 73 | /* |
@@ -63,14 +75,14 @@ static void pca_start(struct i2c_algo_pca_data *adap) | |||
63 | * | 75 | * |
64 | * return after the repeated start condition has occurred | 76 | * return after the repeated start condition has occurred |
65 | */ | 77 | */ |
66 | static void pca_repeated_start(struct i2c_algo_pca_data *adap) | 78 | static int pca_repeated_start(struct i2c_algo_pca_data *adap) |
67 | { | 79 | { |
68 | int sta = pca_get_con(adap); | 80 | int sta = pca_get_con(adap); |
69 | DEB2("=== REPEATED START\n"); | 81 | DEB2("=== REPEATED START\n"); |
70 | sta |= I2C_PCA_CON_STA; | 82 | sta |= I2C_PCA_CON_STA; |
71 | sta &= ~(I2C_PCA_CON_STO|I2C_PCA_CON_SI); | 83 | sta &= ~(I2C_PCA_CON_STO|I2C_PCA_CON_SI); |
72 | pca_set_con(adap, sta); | 84 | pca_set_con(adap, sta); |
73 | pca_wait(adap); | 85 | return pca_wait(adap); |
74 | } | 86 | } |
75 | 87 | ||
76 | /* | 88 | /* |
@@ -96,7 +108,7 @@ static void pca_stop(struct i2c_algo_pca_data *adap) | |||
96 | * | 108 | * |
97 | * returns after the address has been sent | 109 | * returns after the address has been sent |
98 | */ | 110 | */ |
99 | static void pca_address(struct i2c_algo_pca_data *adap, | 111 | static int pca_address(struct i2c_algo_pca_data *adap, |
100 | struct i2c_msg *msg) | 112 | struct i2c_msg *msg) |
101 | { | 113 | { |
102 | int sta = pca_get_con(adap); | 114 | int sta = pca_get_con(adap); |
@@ -113,7 +125,7 @@ static void pca_address(struct i2c_algo_pca_data *adap, | |||
113 | sta &= ~(I2C_PCA_CON_STO|I2C_PCA_CON_STA|I2C_PCA_CON_SI); | 125 | sta &= ~(I2C_PCA_CON_STO|I2C_PCA_CON_STA|I2C_PCA_CON_SI); |
114 | pca_set_con(adap, sta); | 126 | pca_set_con(adap, sta); |
115 | 127 | ||
116 | pca_wait(adap); | 128 | return pca_wait(adap); |
117 | } | 129 | } |
118 | 130 | ||
119 | /* | 131 | /* |
@@ -121,7 +133,7 @@ static void pca_address(struct i2c_algo_pca_data *adap, | |||
121 | * | 133 | * |
122 | * Returns after the byte has been transmitted | 134 | * Returns after the byte has been transmitted |
123 | */ | 135 | */ |
124 | static void pca_tx_byte(struct i2c_algo_pca_data *adap, | 136 | static int pca_tx_byte(struct i2c_algo_pca_data *adap, |
125 | __u8 b) | 137 | __u8 b) |
126 | { | 138 | { |
127 | int sta = pca_get_con(adap); | 139 | int sta = pca_get_con(adap); |
@@ -131,7 +143,7 @@ static void pca_tx_byte(struct i2c_algo_pca_data *adap, | |||
131 | sta &= ~(I2C_PCA_CON_STO|I2C_PCA_CON_STA|I2C_PCA_CON_SI); | 143 | sta &= ~(I2C_PCA_CON_STO|I2C_PCA_CON_STA|I2C_PCA_CON_SI); |
132 | pca_set_con(adap, sta); | 144 | pca_set_con(adap, sta); |
133 | 145 | ||
134 | pca_wait(adap); | 146 | return pca_wait(adap); |
135 | } | 147 | } |
136 | 148 | ||
137 | /* | 149 | /* |
@@ -151,7 +163,7 @@ static void pca_rx_byte(struct i2c_algo_pca_data *adap, | |||
151 | * | 163 | * |
152 | * Returns after next byte has arrived. | 164 | * Returns after next byte has arrived. |
153 | */ | 165 | */ |
154 | static void pca_rx_ack(struct i2c_algo_pca_data *adap, | 166 | static int pca_rx_ack(struct i2c_algo_pca_data *adap, |
155 | int ack) | 167 | int ack) |
156 | { | 168 | { |
157 | int sta = pca_get_con(adap); | 169 | int sta = pca_get_con(adap); |
@@ -162,7 +174,7 @@ static void pca_rx_ack(struct i2c_algo_pca_data *adap, | |||
162 | sta |= I2C_PCA_CON_AA; | 174 | sta |= I2C_PCA_CON_AA; |
163 | 175 | ||
164 | pca_set_con(adap, sta); | 176 | pca_set_con(adap, sta); |
165 | pca_wait(adap); | 177 | return pca_wait(adap); |
166 | } | 178 | } |
167 | 179 | ||
168 | static int pca_xfer(struct i2c_adapter *i2c_adap, | 180 | static int pca_xfer(struct i2c_adapter *i2c_adap, |
@@ -175,14 +187,17 @@ static int pca_xfer(struct i2c_adapter *i2c_adap, | |||
175 | int numbytes = 0; | 187 | int numbytes = 0; |
176 | int state; | 188 | int state; |
177 | int ret; | 189 | int ret; |
178 | int timeout = i2c_adap->timeout; | 190 | int completed = 1; |
179 | 191 | unsigned long timeout = jiffies + i2c_adap->timeout; | |
180 | while ((state = pca_status(adap)) != 0xf8 && timeout--) { | 192 | |
181 | msleep(10); | 193 | while (pca_status(adap) != 0xf8) { |
182 | } | 194 | if (time_before(jiffies, timeout)) { |
183 | if (state != 0xf8) { | 195 | msleep(10); |
184 | dev_dbg(&i2c_adap->dev, "bus is not idle. status is %#04x\n", state); | 196 | } else { |
185 | return -EAGAIN; | 197 | dev_dbg(&i2c_adap->dev, "bus is not idle. status is " |
198 | "%#04x\n", state); | ||
199 | return -EAGAIN; | ||
200 | } | ||
186 | } | 201 | } |
187 | 202 | ||
188 | DEB1("{{{ XFER %d messages\n", num); | 203 | DEB1("{{{ XFER %d messages\n", num); |
@@ -218,18 +233,19 @@ static int pca_xfer(struct i2c_adapter *i2c_adap, | |||
218 | 233 | ||
219 | switch (state) { | 234 | switch (state) { |
220 | case 0xf8: /* On reset or stop the bus is idle */ | 235 | case 0xf8: /* On reset or stop the bus is idle */ |
221 | pca_start(adap); | 236 | completed = pca_start(adap); |
222 | break; | 237 | break; |
223 | 238 | ||
224 | case 0x08: /* A START condition has been transmitted */ | 239 | case 0x08: /* A START condition has been transmitted */ |
225 | case 0x10: /* A repeated start condition has been transmitted */ | 240 | case 0x10: /* A repeated start condition has been transmitted */ |
226 | pca_address(adap, msg); | 241 | completed = pca_address(adap, msg); |
227 | break; | 242 | break; |
228 | 243 | ||
229 | case 0x18: /* SLA+W has been transmitted; ACK has been received */ | 244 | case 0x18: /* SLA+W has been transmitted; ACK has been received */ |
230 | case 0x28: /* Data byte in I2CDAT has been transmitted; ACK has been received */ | 245 | case 0x28: /* Data byte in I2CDAT has been transmitted; ACK has been received */ |
231 | if (numbytes < msg->len) { | 246 | if (numbytes < msg->len) { |
232 | pca_tx_byte(adap, msg->buf[numbytes]); | 247 | completed = pca_tx_byte(adap, |
248 | msg->buf[numbytes]); | ||
233 | numbytes++; | 249 | numbytes++; |
234 | break; | 250 | break; |
235 | } | 251 | } |
@@ -237,7 +253,7 @@ static int pca_xfer(struct i2c_adapter *i2c_adap, | |||
237 | if (curmsg == num) | 253 | if (curmsg == num) |
238 | pca_stop(adap); | 254 | pca_stop(adap); |
239 | else | 255 | else |
240 | pca_repeated_start(adap); | 256 | completed = pca_repeated_start(adap); |
241 | break; | 257 | break; |
242 | 258 | ||
243 | case 0x20: /* SLA+W has been transmitted; NOT ACK has been received */ | 259 | case 0x20: /* SLA+W has been transmitted; NOT ACK has been received */ |
@@ -246,21 +262,22 @@ static int pca_xfer(struct i2c_adapter *i2c_adap, | |||
246 | goto out; | 262 | goto out; |
247 | 263 | ||
248 | case 0x40: /* SLA+R has been transmitted; ACK has been received */ | 264 | case 0x40: /* SLA+R has been transmitted; ACK has been received */ |
249 | pca_rx_ack(adap, msg->len > 1); | 265 | completed = pca_rx_ack(adap, msg->len > 1); |
250 | break; | 266 | break; |
251 | 267 | ||
252 | case 0x50: /* Data bytes has been received; ACK has been returned */ | 268 | case 0x50: /* Data bytes has been received; ACK has been returned */ |
253 | if (numbytes < msg->len) { | 269 | if (numbytes < msg->len) { |
254 | pca_rx_byte(adap, &msg->buf[numbytes], 1); | 270 | pca_rx_byte(adap, &msg->buf[numbytes], 1); |
255 | numbytes++; | 271 | numbytes++; |
256 | pca_rx_ack(adap, numbytes < msg->len - 1); | 272 | completed = pca_rx_ack(adap, |
273 | numbytes < msg->len - 1); | ||
257 | break; | 274 | break; |
258 | } | 275 | } |
259 | curmsg++; numbytes = 0; | 276 | curmsg++; numbytes = 0; |
260 | if (curmsg == num) | 277 | if (curmsg == num) |
261 | pca_stop(adap); | 278 | pca_stop(adap); |
262 | else | 279 | else |
263 | pca_repeated_start(adap); | 280 | completed = pca_repeated_start(adap); |
264 | break; | 281 | break; |
265 | 282 | ||
266 | case 0x48: /* SLA+R has been transmitted; NOT ACK has been received */ | 283 | case 0x48: /* SLA+R has been transmitted; NOT ACK has been received */ |
@@ -283,7 +300,7 @@ static int pca_xfer(struct i2c_adapter *i2c_adap, | |||
283 | if (curmsg == num) | 300 | if (curmsg == num) |
284 | pca_stop(adap); | 301 | pca_stop(adap); |
285 | else | 302 | else |
286 | pca_repeated_start(adap); | 303 | completed = pca_repeated_start(adap); |
287 | } else { | 304 | } else { |
288 | DEB2("NOT ACK sent after data byte received. " | 305 | DEB2("NOT ACK sent after data byte received. " |
289 | "Not final byte. numbytes %d. len %d\n", | 306 | "Not final byte. numbytes %d. len %d\n", |
@@ -309,11 +326,13 @@ static int pca_xfer(struct i2c_adapter *i2c_adap, | |||
309 | break; | 326 | break; |
310 | } | 327 | } |
311 | 328 | ||
329 | if (!completed) | ||
330 | goto out; | ||
312 | } | 331 | } |
313 | 332 | ||
314 | ret = curmsg; | 333 | ret = curmsg; |
315 | out: | 334 | out: |
316 | DEB1(KERN_CRIT "}}} transfered %d/%d messages. " | 335 | DEB1("}}} transfered %d/%d messages. " |
317 | "status is %#04x. control is %#04x\n", | 336 | "status is %#04x. control is %#04x\n", |
318 | curmsg, num, pca_status(adap), | 337 | curmsg, num, pca_status(adap), |
319 | pca_get_con(adap)); | 338 | pca_get_con(adap)); |
@@ -330,26 +349,171 @@ static const struct i2c_algorithm pca_algo = { | |||
330 | .functionality = pca_func, | 349 | .functionality = pca_func, |
331 | }; | 350 | }; |
332 | 351 | ||
333 | static int pca_init(struct i2c_adapter *adap) | 352 | static unsigned int pca_probe_chip(struct i2c_adapter *adap) |
334 | { | 353 | { |
335 | static int freqs[] = {330,288,217,146,88,59,44,36}; | ||
336 | int clock; | ||
337 | struct i2c_algo_pca_data *pca_data = adap->algo_data; | 354 | struct i2c_algo_pca_data *pca_data = adap->algo_data; |
338 | 355 | /* The trick here is to check if there is an indirect register | |
339 | if (pca_data->i2c_clock > 7) { | 356 | * available. If there is one, we will read the value we first |
340 | printk(KERN_WARNING "%s: Invalid I2C clock speed selected. Trying default.\n", | 357 | * wrote on I2C_PCA_IADR. Otherwise, we will read the last value |
341 | adap->name); | 358 | * we wrote on I2C_PCA_ADR |
342 | pca_data->i2c_clock = I2C_PCA_CON_59kHz; | 359 | */ |
360 | pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_IADR); | ||
361 | pca_outw(pca_data, I2C_PCA_IND, 0xAA); | ||
362 | pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_ITO); | ||
363 | pca_outw(pca_data, I2C_PCA_IND, 0x00); | ||
364 | pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_IADR); | ||
365 | if (pca_inw(pca_data, I2C_PCA_IND) == 0xAA) { | ||
366 | printk(KERN_INFO "%s: PCA9665 detected.\n", adap->name); | ||
367 | return I2C_PCA_CHIP_9665; | ||
368 | } else { | ||
369 | printk(KERN_INFO "%s: PCA9564 detected.\n", adap->name); | ||
370 | return I2C_PCA_CHIP_9564; | ||
343 | } | 371 | } |
372 | } | ||
373 | |||
374 | static int pca_init(struct i2c_adapter *adap) | ||
375 | { | ||
376 | struct i2c_algo_pca_data *pca_data = adap->algo_data; | ||
344 | 377 | ||
345 | adap->algo = &pca_algo; | 378 | adap->algo = &pca_algo; |
346 | 379 | ||
347 | pca_reset(pca_data); | 380 | if (pca_probe_chip(adap) == I2C_PCA_CHIP_9564) { |
381 | static int freqs[] = {330, 288, 217, 146, 88, 59, 44, 36}; | ||
382 | int clock; | ||
383 | |||
384 | if (pca_data->i2c_clock > 7) { | ||
385 | switch (pca_data->i2c_clock) { | ||
386 | case 330000: | ||
387 | pca_data->i2c_clock = I2C_PCA_CON_330kHz; | ||
388 | break; | ||
389 | case 288000: | ||
390 | pca_data->i2c_clock = I2C_PCA_CON_288kHz; | ||
391 | break; | ||
392 | case 217000: | ||
393 | pca_data->i2c_clock = I2C_PCA_CON_217kHz; | ||
394 | break; | ||
395 | case 146000: | ||
396 | pca_data->i2c_clock = I2C_PCA_CON_146kHz; | ||
397 | break; | ||
398 | case 88000: | ||
399 | pca_data->i2c_clock = I2C_PCA_CON_88kHz; | ||
400 | break; | ||
401 | case 59000: | ||
402 | pca_data->i2c_clock = I2C_PCA_CON_59kHz; | ||
403 | break; | ||
404 | case 44000: | ||
405 | pca_data->i2c_clock = I2C_PCA_CON_44kHz; | ||
406 | break; | ||
407 | case 36000: | ||
408 | pca_data->i2c_clock = I2C_PCA_CON_36kHz; | ||
409 | break; | ||
410 | default: | ||
411 | printk(KERN_WARNING | ||
412 | "%s: Invalid I2C clock speed selected." | ||
413 | " Using default 59kHz.\n", adap->name); | ||
414 | pca_data->i2c_clock = I2C_PCA_CON_59kHz; | ||
415 | } | ||
416 | } else { | ||
417 | printk(KERN_WARNING "%s: " | ||
418 | "Choosing the clock frequency based on " | ||
419 | "index is deprecated." | ||
420 | " Use the nominal frequency.\n", adap->name); | ||
421 | } | ||
422 | |||
423 | pca_reset(pca_data); | ||
424 | |||
425 | clock = pca_clock(pca_data); | ||
426 | printk(KERN_INFO "%s: Clock frequency is %dkHz\n", | ||
427 | adap->name, freqs[clock]); | ||
428 | |||
429 | pca_set_con(pca_data, I2C_PCA_CON_ENSIO | clock); | ||
430 | } else { | ||
431 | int clock; | ||
432 | int mode; | ||
433 | int tlow, thi; | ||
434 | /* Values can be found on PCA9665 datasheet section 7.3.2.6 */ | ||
435 | int min_tlow, min_thi; | ||
436 | /* These values are the maximum raise and fall values allowed | ||
437 | * by the I2C operation mode (Standard, Fast or Fast+) | ||
438 | * They are used (added) below to calculate the clock dividers | ||
439 | * of PCA9665. Note that they are slightly different of the | ||
440 | * real maximum, to allow the change on mode exactly on the | ||
441 | * maximum clock rate for each mode | ||
442 | */ | ||
443 | int raise_fall_time; | ||
444 | |||
445 | struct i2c_algo_pca_data *pca_data = adap->algo_data; | ||
446 | |||
447 | /* Ignore the reset function from the module, | ||
448 | * we can use the parallel bus reset | ||
449 | */ | ||
450 | pca_data->reset_chip = pca9665_reset; | ||
451 | |||
452 | if (pca_data->i2c_clock > 1265800) { | ||
453 | printk(KERN_WARNING "%s: I2C clock speed too high." | ||
454 | " Using 1265.8kHz.\n", adap->name); | ||
455 | pca_data->i2c_clock = 1265800; | ||
456 | } | ||
457 | |||
458 | if (pca_data->i2c_clock < 60300) { | ||
459 | printk(KERN_WARNING "%s: I2C clock speed too low." | ||
460 | " Using 60.3kHz.\n", adap->name); | ||
461 | pca_data->i2c_clock = 60300; | ||
462 | } | ||
348 | 463 | ||
349 | clock = pca_clock(pca_data); | 464 | /* To avoid integer overflow, use clock/100 for calculations */ |
350 | DEB1(KERN_INFO "%s: Clock frequency is %dkHz\n", adap->name, freqs[clock]); | 465 | clock = pca_clock(pca_data) / 100; |
466 | |||
467 | if (pca_data->i2c_clock > 10000) { | ||
468 | mode = I2C_PCA_MODE_TURBO; | ||
469 | min_tlow = 14; | ||
470 | min_thi = 5; | ||
471 | raise_fall_time = 22; /* Raise 11e-8s, Fall 11e-8s */ | ||
472 | } else if (pca_data->i2c_clock > 4000) { | ||
473 | mode = I2C_PCA_MODE_FASTP; | ||
474 | min_tlow = 17; | ||
475 | min_thi = 9; | ||
476 | raise_fall_time = 22; /* Raise 11e-8s, Fall 11e-8s */ | ||
477 | } else if (pca_data->i2c_clock > 1000) { | ||
478 | mode = I2C_PCA_MODE_FAST; | ||
479 | min_tlow = 44; | ||
480 | min_thi = 20; | ||
481 | raise_fall_time = 58; /* Raise 29e-8s, Fall 29e-8s */ | ||
482 | } else { | ||
483 | mode = I2C_PCA_MODE_STD; | ||
484 | min_tlow = 157; | ||
485 | min_thi = 134; | ||
486 | raise_fall_time = 127; /* Raise 29e-8s, Fall 98e-8s */ | ||
487 | } | ||
488 | |||
489 | /* The minimum clock that respects the thi/tlow = 134/157 is | ||
490 | * 64800 Hz. Below that, we have to fix the tlow to 255 and | ||
491 | * calculate the thi factor. | ||
492 | */ | ||
493 | if (clock < 648) { | ||
494 | tlow = 255; | ||
495 | thi = 1000000 - clock * raise_fall_time; | ||
496 | thi /= (I2C_PCA_OSC_PER * clock) - tlow; | ||
497 | } else { | ||
498 | tlow = (1000000 - clock * raise_fall_time) * min_tlow; | ||
499 | tlow /= I2C_PCA_OSC_PER * clock * (min_thi + min_tlow); | ||
500 | thi = tlow * min_thi / min_tlow; | ||
501 | } | ||
351 | 502 | ||
352 | pca_set_con(pca_data, I2C_PCA_CON_ENSIO | clock); | 503 | pca_reset(pca_data); |
504 | |||
505 | printk(KERN_INFO | ||
506 | "%s: Clock frequency is %dHz\n", adap->name, clock * 100); | ||
507 | |||
508 | pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_IMODE); | ||
509 | pca_outw(pca_data, I2C_PCA_IND, mode); | ||
510 | pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_ISCLL); | ||
511 | pca_outw(pca_data, I2C_PCA_IND, tlow); | ||
512 | pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_ISCLH); | ||
513 | pca_outw(pca_data, I2C_PCA_IND, thi); | ||
514 | |||
515 | pca_set_con(pca_data, I2C_PCA_CON_ENSIO); | ||
516 | } | ||
353 | udelay(500); /* 500 us for oscilator to stabilise */ | 517 | udelay(500); /* 500 us for oscilator to stabilise */ |
354 | 518 | ||
355 | return 0; | 519 | return 0; |
@@ -384,7 +548,7 @@ EXPORT_SYMBOL(i2c_pca_add_numbered_bus); | |||
384 | 548 | ||
385 | MODULE_AUTHOR("Ian Campbell <icampbell@arcom.com>, " | 549 | MODULE_AUTHOR("Ian Campbell <icampbell@arcom.com>, " |
386 | "Wolfram Sang <w.sang@pengutronix.de>"); | 550 | "Wolfram Sang <w.sang@pengutronix.de>"); |
387 | MODULE_DESCRIPTION("I2C-Bus PCA9564 algorithm"); | 551 | MODULE_DESCRIPTION("I2C-Bus PCA9564/PCA9665 algorithm"); |
388 | MODULE_LICENSE("GPL"); | 552 | MODULE_LICENSE("GPL"); |
389 | 553 | ||
390 | module_param(i2c_debug, int, 0); | 554 | module_param(i2c_debug, int, 0); |