Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

i2c-algo-pca: Add PCA9665 support

Add support for the PCA9665 I2C controller.

Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Signed-off-by: Jean Delvare <khali@linux-fr.org>

authored by

Marco Aurelio da Costa and committed by
Jean Delvare
eff9ec95 bac3e7c2

+216 -28
+166 -14
drivers/i2c/algos/i2c-algo-pca.c
··· 46 46 #define pca_wait(adap) adap->wait_for_completion(adap->data) 47 47 #define pca_reset(adap) adap->reset_chip(adap->data) 48 48 49 + static void pca9665_reset(void *pd) 50 + { 51 + struct i2c_algo_pca_data *adap = pd; 52 + pca_outw(adap, I2C_PCA_INDPTR, I2C_PCA_IPRESET); 53 + pca_outw(adap, I2C_PCA_IND, 0xA5); 54 + pca_outw(adap, I2C_PCA_IND, 0x5A); 55 + } 56 + 49 57 /* 50 58 * Generate a start condition on the i2c bus. 51 59 * ··· 341 333 .functionality = pca_func, 342 334 }; 343 335 336 + static unsigned int pca_probe_chip(struct i2c_adapter *adap) 337 + { 338 + struct i2c_algo_pca_data *pca_data = adap->algo_data; 339 + /* The trick here is to check if there is an indirect register 340 + * available. If there is one, we will read the value we first 341 + * wrote on I2C_PCA_IADR. Otherwise, we will read the last value 342 + * we wrote on I2C_PCA_ADR 343 + */ 344 + pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_IADR); 345 + pca_outw(pca_data, I2C_PCA_IND, 0xAA); 346 + pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_ITO); 347 + pca_outw(pca_data, I2C_PCA_IND, 0x00); 348 + pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_IADR); 349 + if (pca_inw(pca_data, I2C_PCA_IND) == 0xAA) { 350 + printk(KERN_INFO "%s: PCA9665 detected.\n", adap->name); 351 + return I2C_PCA_CHIP_9665; 352 + } else { 353 + printk(KERN_INFO "%s: PCA9564 detected.\n", adap->name); 354 + return I2C_PCA_CHIP_9564; 355 + } 356 + } 357 + 344 358 static int pca_init(struct i2c_adapter *adap) 345 359 { 346 - static int freqs[] = {330,288,217,146,88,59,44,36}; 347 - int clock; 348 360 struct i2c_algo_pca_data *pca_data = adap->algo_data; 349 - 350 - if (pca_data->i2c_clock > 7) { 351 - printk(KERN_WARNING "%s: Invalid I2C clock speed selected. Trying default.\n", 352 - adap->name); 353 - pca_data->i2c_clock = I2C_PCA_CON_59kHz; 354 - } 355 361 356 362 adap->algo = &pca_algo; 357 363 358 - pca_reset(pca_data); 364 + if (pca_probe_chip(adap) == I2C_PCA_CHIP_9564) { 365 + static int freqs[] = {330, 288, 217, 146, 88, 59, 44, 36}; 366 + int clock; 359 367 360 - clock = pca_clock(pca_data); 361 - printk(KERN_INFO "%s: Clock frequency is %dkHz\n", adap->name, 362 - freqs[clock]); 368 + if (pca_data->i2c_clock > 7) { 369 + switch (pca_data->i2c_clock) { 370 + case 330000: 371 + pca_data->i2c_clock = I2C_PCA_CON_330kHz; 372 + break; 373 + case 288000: 374 + pca_data->i2c_clock = I2C_PCA_CON_288kHz; 375 + break; 376 + case 217000: 377 + pca_data->i2c_clock = I2C_PCA_CON_217kHz; 378 + break; 379 + case 146000: 380 + pca_data->i2c_clock = I2C_PCA_CON_146kHz; 381 + break; 382 + case 88000: 383 + pca_data->i2c_clock = I2C_PCA_CON_88kHz; 384 + break; 385 + case 59000: 386 + pca_data->i2c_clock = I2C_PCA_CON_59kHz; 387 + break; 388 + case 44000: 389 + pca_data->i2c_clock = I2C_PCA_CON_44kHz; 390 + break; 391 + case 36000: 392 + pca_data->i2c_clock = I2C_PCA_CON_36kHz; 393 + break; 394 + default: 395 + printk(KERN_WARNING 396 + "%s: Invalid I2C clock speed selected." 397 + " Using default 59kHz.\n", adap->name); 398 + pca_data->i2c_clock = I2C_PCA_CON_59kHz; 399 + } 400 + } else { 401 + printk(KERN_WARNING "%s: " 402 + "Choosing the clock frequency based on " 403 + "index is deprecated." 404 + " Use the nominal frequency.\n", adap->name); 405 + } 363 406 364 - pca_set_con(pca_data, I2C_PCA_CON_ENSIO | clock); 407 + pca_reset(pca_data); 408 + 409 + clock = pca_clock(pca_data); 410 + printk(KERN_INFO "%s: Clock frequency is %dkHz\n", 411 + adap->name, freqs[clock]); 412 + 413 + pca_set_con(pca_data, I2C_PCA_CON_ENSIO | clock); 414 + } else { 415 + int clock; 416 + int mode; 417 + int tlow, thi; 418 + /* Values can be found on PCA9665 datasheet section 7.3.2.6 */ 419 + int min_tlow, min_thi; 420 + /* These values are the maximum raise and fall values allowed 421 + * by the I2C operation mode (Standard, Fast or Fast+) 422 + * They are used (added) below to calculate the clock dividers 423 + * of PCA9665. Note that they are slightly different of the 424 + * real maximum, to allow the change on mode exactly on the 425 + * maximum clock rate for each mode 426 + */ 427 + int raise_fall_time; 428 + 429 + struct i2c_algo_pca_data *pca_data = adap->algo_data; 430 + 431 + /* Ignore the reset function from the module, 432 + * we can use the parallel bus reset 433 + */ 434 + pca_data->reset_chip = pca9665_reset; 435 + 436 + if (pca_data->i2c_clock > 1265800) { 437 + printk(KERN_WARNING "%s: I2C clock speed too high." 438 + " Using 1265.8kHz.\n", adap->name); 439 + pca_data->i2c_clock = 1265800; 440 + } 441 + 442 + if (pca_data->i2c_clock < 60300) { 443 + printk(KERN_WARNING "%s: I2C clock speed too low." 444 + " Using 60.3kHz.\n", adap->name); 445 + pca_data->i2c_clock = 60300; 446 + } 447 + 448 + /* To avoid integer overflow, use clock/100 for calculations */ 449 + clock = pca_clock(pca_data) / 100; 450 + 451 + if (pca_data->i2c_clock > 10000) { 452 + mode = I2C_PCA_MODE_TURBO; 453 + min_tlow = 14; 454 + min_thi = 5; 455 + raise_fall_time = 22; /* Raise 11e-8s, Fall 11e-8s */ 456 + } else if (pca_data->i2c_clock > 4000) { 457 + mode = I2C_PCA_MODE_FASTP; 458 + min_tlow = 17; 459 + min_thi = 9; 460 + raise_fall_time = 22; /* Raise 11e-8s, Fall 11e-8s */ 461 + } else if (pca_data->i2c_clock > 1000) { 462 + mode = I2C_PCA_MODE_FAST; 463 + min_tlow = 44; 464 + min_thi = 20; 465 + raise_fall_time = 58; /* Raise 29e-8s, Fall 29e-8s */ 466 + } else { 467 + mode = I2C_PCA_MODE_STD; 468 + min_tlow = 157; 469 + min_thi = 134; 470 + raise_fall_time = 127; /* Raise 29e-8s, Fall 98e-8s */ 471 + } 472 + 473 + /* The minimum clock that respects the thi/tlow = 134/157 is 474 + * 64800 Hz. Below that, we have to fix the tlow to 255 and 475 + * calculate the thi factor. 476 + */ 477 + if (clock < 648) { 478 + tlow = 255; 479 + thi = 1000000 - clock * raise_fall_time; 480 + thi /= (I2C_PCA_OSC_PER * clock) - tlow; 481 + } else { 482 + tlow = (1000000 - clock * raise_fall_time) * min_tlow; 483 + tlow /= I2C_PCA_OSC_PER * clock * (min_thi + min_tlow); 484 + thi = tlow * min_thi / min_tlow; 485 + } 486 + 487 + pca_reset(pca_data); 488 + 489 + printk(KERN_INFO 490 + "%s: Clock frequency is %dHz\n", adap->name, clock * 100); 491 + 492 + pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_IMODE); 493 + pca_outw(pca_data, I2C_PCA_IND, mode); 494 + pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_ISCLL); 495 + pca_outw(pca_data, I2C_PCA_IND, tlow); 496 + pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_ISCLH); 497 + pca_outw(pca_data, I2C_PCA_IND, thi); 498 + 499 + pca_set_con(pca_data, I2C_PCA_CON_ENSIO); 500 + } 365 501 udelay(500); /* 500 us for oscilator to stabilise */ 366 502 367 503 return 0; ··· 540 388 541 389 MODULE_AUTHOR("Ian Campbell <icampbell@arcom.com>, " 542 390 "Wolfram Sang <w.sang@pengutronix.de>"); 543 - MODULE_DESCRIPTION("I2C-Bus PCA9564 algorithm"); 391 + MODULE_DESCRIPTION("I2C-Bus PCA9564/PCA9665 algorithm"); 544 392 MODULE_LICENSE("GPL"); 545 393 546 394 module_param(i2c_debug, int, 0);
+4 -4
drivers/i2c/busses/Kconfig
··· 617 617 will be called i2c-elektor. 618 618 619 619 config I2C_PCA_ISA 620 - tristate "PCA9564 on an ISA bus" 620 + tristate "PCA9564/PCA9665 on an ISA bus" 621 621 depends on ISA 622 622 select I2C_ALGOPCA 623 623 default n 624 624 help 625 - This driver supports ISA boards using the Philips PCA9564 625 + This driver supports ISA boards using the Philips PCA9564/PCA9665 626 626 parallel bus to I2C bus controller. 627 627 628 628 This driver can also be built as a module. If so, the module ··· 634 634 time). If unsure, say N. 635 635 636 636 config I2C_PCA_PLATFORM 637 - tristate "PCA9564 as platform device" 637 + tristate "PCA9564/PCA9665 as platform device" 638 638 select I2C_ALGOPCA 639 639 default n 640 640 help 641 - This driver supports a memory mapped Philips PCA9564 641 + This driver supports a memory mapped Philips PCA9564/PCA9665 642 642 parallel bus to I2C bus controller. 643 643 644 644 This driver can also be built as a module. If so, the module
+10 -4
drivers/i2c/busses/i2c-pca-isa.c
··· 41 41 42 42 /* Data sheet recommends 59kHz for 100kHz operation due to variation 43 43 * in the actual clock rate */ 44 - static int clock = I2C_PCA_CON_59kHz; 44 + static int clock = 59000; 45 45 46 46 static wait_queue_head_t pca_wait; 47 47 ··· 103 103 static struct i2c_adapter pca_isa_ops = { 104 104 .owner = THIS_MODULE, 105 105 .algo_data = &pca_isa_data, 106 - .name = "PCA9564 ISA Adapter", 106 + .name = "PCA9564/PCA9665 ISA Adapter", 107 107 .timeout = 100, 108 108 }; 109 109 ··· 196 196 } 197 197 198 198 MODULE_AUTHOR("Ian Campbell <icampbell@arcom.com>"); 199 - MODULE_DESCRIPTION("ISA base PCA9564 driver"); 199 + MODULE_DESCRIPTION("ISA base PCA9564/PCA9665 driver"); 200 200 MODULE_LICENSE("GPL"); 201 201 202 202 module_param(base, ulong, 0); ··· 205 205 module_param(irq, int, 0); 206 206 MODULE_PARM_DESC(irq, "IRQ"); 207 207 module_param(clock, int, 0); 208 - MODULE_PARM_DESC(clock, "Clock rate as described in table 1 of PCA9564 datasheet"); 208 + MODULE_PARM_DESC(clock, "Clock rate in hertz.\n\t\t" 209 + "For PCA9564: 330000,288000,217000,146000," 210 + "88000,59000,44000,36000\n" 211 + "\t\tFor PCA9665:\tStandard: 60300 - 100099\n" 212 + "\t\t\t\tFast: 100100 - 400099\n" 213 + "\t\t\t\tFast+: 400100 - 10000099\n" 214 + "\t\t\t\tTurbo: Up to 1265800"); 209 215 210 216 module_init(pca_isa_init); 211 217 module_exit(pca_isa_exit);
+5 -4
drivers/i2c/busses/i2c-pca-platform.c
··· 172 172 173 173 i2c->adap.nr = pdev->id >= 0 ? pdev->id : 0; 174 174 i2c->adap.owner = THIS_MODULE; 175 - snprintf(i2c->adap.name, sizeof(i2c->adap.name), "PCA9564 at 0x%08lx", 176 - (unsigned long) res->start); 175 + snprintf(i2c->adap.name, sizeof(i2c->adap.name), 176 + "PCA9564/PCA9665 at 0x%08lx", 177 + (unsigned long) res->start); 177 178 i2c->adap.algo_data = &i2c->algo_data; 178 179 i2c->adap.dev.parent = &pdev->dev; 179 180 i2c->adap.timeout = platform_data->timeout; ··· 247 246 e_alloc: 248 247 release_mem_region(res->start, res_len(res)); 249 248 e_print: 250 - printk(KERN_ERR "Registering PCA9564 FAILED! (%d)\n", ret); 249 + printk(KERN_ERR "Registering PCA9564/PCA9665 FAILED! (%d)\n", ret); 251 250 return ret; 252 251 } 253 252 ··· 291 290 } 292 291 293 292 MODULE_AUTHOR("Wolfram Sang <w.sang@pengutronix.de>"); 294 - MODULE_DESCRIPTION("I2C-PCA9564 platform driver"); 293 + MODULE_DESCRIPTION("I2C-PCA9564/PCA9665 platform driver"); 295 294 MODULE_LICENSE("GPL"); 296 295 297 296 module_init(i2c_pca_pf_init);
+31 -2
include/linux/i2c-algo-pca.h
··· 1 1 #ifndef _LINUX_I2C_ALGO_PCA_H 2 2 #define _LINUX_I2C_ALGO_PCA_H 3 3 4 - /* Clock speeds for the bus */ 4 + /* Chips known to the pca algo */ 5 + #define I2C_PCA_CHIP_9564 0x00 6 + #define I2C_PCA_CHIP_9665 0x01 7 + 8 + /* Internal period for PCA9665 oscilator */ 9 + #define I2C_PCA_OSC_PER 3 /* e10-8s */ 10 + 11 + /* Clock speeds for the bus for PCA9564*/ 5 12 #define I2C_PCA_CON_330kHz 0x00 6 13 #define I2C_PCA_CON_288kHz 0x01 7 14 #define I2C_PCA_CON_217kHz 0x02 ··· 25 18 #define I2C_PCA_ADR 0x02 /* OWN ADR Read/Write */ 26 19 #define I2C_PCA_CON 0x03 /* CONTROL Read/Write */ 27 20 21 + /* PCA9665 registers */ 22 + #define I2C_PCA_INDPTR 0x00 /* INDIRECT Pointer Write Only */ 23 + #define I2C_PCA_IND 0x02 /* INDIRECT Read/Write */ 24 + 25 + /* PCA9665 indirect registers */ 26 + #define I2C_PCA_ICOUNT 0x00 /* Byte Count for buffered mode */ 27 + #define I2C_PCA_IADR 0x01 /* OWN ADR */ 28 + #define I2C_PCA_ISCLL 0x02 /* SCL LOW period */ 29 + #define I2C_PCA_ISCLH 0x03 /* SCL HIGH period */ 30 + #define I2C_PCA_ITO 0x04 /* TIMEOUT */ 31 + #define I2C_PCA_IPRESET 0x05 /* Parallel bus reset */ 32 + #define I2C_PCA_IMODE 0x06 /* I2C Bus mode */ 33 + 34 + /* PCA9665 I2C bus mode */ 35 + #define I2C_PCA_MODE_STD 0x00 /* Standard mode */ 36 + #define I2C_PCA_MODE_FAST 0x01 /* Fast mode */ 37 + #define I2C_PCA_MODE_FASTP 0x02 /* Fast Plus mode */ 38 + #define I2C_PCA_MODE_TURBO 0x03 /* Turbo mode */ 39 + 40 + 28 41 #define I2C_PCA_CON_AA 0x80 /* Assert Acknowledge */ 29 42 #define I2C_PCA_CON_ENSIO 0x40 /* Enable */ 30 43 #define I2C_PCA_CON_STA 0x20 /* Start */ ··· 58 31 int (*read_byte) (void *data, int reg); 59 32 int (*wait_for_completion) (void *data); 60 33 void (*reset_chip) (void *data); 61 - /* i2c_clock values are defined in linux/i2c-algo-pca.h */ 34 + /* For PCA9564, use one of the predefined frequencies: 35 + * 330000, 288000, 217000, 146000, 88000, 59000, 44000, 36000 36 + * For PCA9665, use the frequency you want here. */ 62 37 unsigned int i2c_clock; 63 38 }; 64 39