···4646#define pca_wait(adap) adap->wait_for_completion(adap->data)4747#define pca_reset(adap) adap->reset_chip(adap->data)48484949+static void pca9665_reset(void *pd)5050+{5151+ struct i2c_algo_pca_data *adap = pd;5252+ pca_outw(adap, I2C_PCA_INDPTR, I2C_PCA_IPRESET);5353+ pca_outw(adap, I2C_PCA_IND, 0xA5);5454+ pca_outw(adap, I2C_PCA_IND, 0x5A);5555+}5656+4957/*5058 * Generate a start condition on the i2c bus.5159 *···341333 .functionality = pca_func,342334};343335336336+static unsigned int pca_probe_chip(struct i2c_adapter *adap)337337+{338338+ struct i2c_algo_pca_data *pca_data = adap->algo_data;339339+ /* The trick here is to check if there is an indirect register340340+ * available. If there is one, we will read the value we first341341+ * wrote on I2C_PCA_IADR. Otherwise, we will read the last value342342+ * we wrote on I2C_PCA_ADR343343+ */344344+ pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_IADR);345345+ pca_outw(pca_data, I2C_PCA_IND, 0xAA);346346+ pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_ITO);347347+ pca_outw(pca_data, I2C_PCA_IND, 0x00);348348+ pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_IADR);349349+ if (pca_inw(pca_data, I2C_PCA_IND) == 0xAA) {350350+ printk(KERN_INFO "%s: PCA9665 detected.\n", adap->name);351351+ return I2C_PCA_CHIP_9665;352352+ } else {353353+ printk(KERN_INFO "%s: PCA9564 detected.\n", adap->name);354354+ return I2C_PCA_CHIP_9564;355355+ }356356+}357357+344358static int pca_init(struct i2c_adapter *adap)345359{346346- static int freqs[] = {330,288,217,146,88,59,44,36};347347- int clock;348360 struct i2c_algo_pca_data *pca_data = adap->algo_data;349349-350350- if (pca_data->i2c_clock > 7) {351351- printk(KERN_WARNING "%s: Invalid I2C clock speed selected. Trying default.\n",352352- adap->name);353353- pca_data->i2c_clock = I2C_PCA_CON_59kHz;354354- }355361356362 adap->algo = &pca_algo;357363358358- pca_reset(pca_data);364364+ if (pca_probe_chip(adap) == I2C_PCA_CHIP_9564) {365365+ static int freqs[] = {330, 288, 217, 146, 88, 59, 44, 36};366366+ int clock;359367360360- clock = pca_clock(pca_data);361361- printk(KERN_INFO "%s: Clock frequency is %dkHz\n", adap->name,362362- freqs[clock]);368368+ if (pca_data->i2c_clock > 7) {369369+ switch (pca_data->i2c_clock) {370370+ case 330000:371371+ pca_data->i2c_clock = I2C_PCA_CON_330kHz;372372+ break;373373+ case 288000:374374+ pca_data->i2c_clock = I2C_PCA_CON_288kHz;375375+ break;376376+ case 217000:377377+ pca_data->i2c_clock = I2C_PCA_CON_217kHz;378378+ break;379379+ case 146000:380380+ pca_data->i2c_clock = I2C_PCA_CON_146kHz;381381+ break;382382+ case 88000:383383+ pca_data->i2c_clock = I2C_PCA_CON_88kHz;384384+ break;385385+ case 59000:386386+ pca_data->i2c_clock = I2C_PCA_CON_59kHz;387387+ break;388388+ case 44000:389389+ pca_data->i2c_clock = I2C_PCA_CON_44kHz;390390+ break;391391+ case 36000:392392+ pca_data->i2c_clock = I2C_PCA_CON_36kHz;393393+ break;394394+ default:395395+ printk(KERN_WARNING396396+ "%s: Invalid I2C clock speed selected."397397+ " Using default 59kHz.\n", adap->name);398398+ pca_data->i2c_clock = I2C_PCA_CON_59kHz;399399+ }400400+ } else {401401+ printk(KERN_WARNING "%s: "402402+ "Choosing the clock frequency based on "403403+ "index is deprecated."404404+ " Use the nominal frequency.\n", adap->name);405405+ }363406364364- pca_set_con(pca_data, I2C_PCA_CON_ENSIO | clock);407407+ pca_reset(pca_data);408408+409409+ clock = pca_clock(pca_data);410410+ printk(KERN_INFO "%s: Clock frequency is %dkHz\n",411411+ adap->name, freqs[clock]);412412+413413+ pca_set_con(pca_data, I2C_PCA_CON_ENSIO | clock);414414+ } else {415415+ int clock;416416+ int mode;417417+ int tlow, thi;418418+ /* Values can be found on PCA9665 datasheet section 7.3.2.6 */419419+ int min_tlow, min_thi;420420+ /* These values are the maximum raise and fall values allowed421421+ * by the I2C operation mode (Standard, Fast or Fast+)422422+ * They are used (added) below to calculate the clock dividers423423+ * of PCA9665. Note that they are slightly different of the424424+ * real maximum, to allow the change on mode exactly on the425425+ * maximum clock rate for each mode426426+ */427427+ int raise_fall_time;428428+429429+ struct i2c_algo_pca_data *pca_data = adap->algo_data;430430+431431+ /* Ignore the reset function from the module,432432+ * we can use the parallel bus reset433433+ */434434+ pca_data->reset_chip = pca9665_reset;435435+436436+ if (pca_data->i2c_clock > 1265800) {437437+ printk(KERN_WARNING "%s: I2C clock speed too high."438438+ " Using 1265.8kHz.\n", adap->name);439439+ pca_data->i2c_clock = 1265800;440440+ }441441+442442+ if (pca_data->i2c_clock < 60300) {443443+ printk(KERN_WARNING "%s: I2C clock speed too low."444444+ " Using 60.3kHz.\n", adap->name);445445+ pca_data->i2c_clock = 60300;446446+ }447447+448448+ /* To avoid integer overflow, use clock/100 for calculations */449449+ clock = pca_clock(pca_data) / 100;450450+451451+ if (pca_data->i2c_clock > 10000) {452452+ mode = I2C_PCA_MODE_TURBO;453453+ min_tlow = 14;454454+ min_thi = 5;455455+ raise_fall_time = 22; /* Raise 11e-8s, Fall 11e-8s */456456+ } else if (pca_data->i2c_clock > 4000) {457457+ mode = I2C_PCA_MODE_FASTP;458458+ min_tlow = 17;459459+ min_thi = 9;460460+ raise_fall_time = 22; /* Raise 11e-8s, Fall 11e-8s */461461+ } else if (pca_data->i2c_clock > 1000) {462462+ mode = I2C_PCA_MODE_FAST;463463+ min_tlow = 44;464464+ min_thi = 20;465465+ raise_fall_time = 58; /* Raise 29e-8s, Fall 29e-8s */466466+ } else {467467+ mode = I2C_PCA_MODE_STD;468468+ min_tlow = 157;469469+ min_thi = 134;470470+ raise_fall_time = 127; /* Raise 29e-8s, Fall 98e-8s */471471+ }472472+473473+ /* The minimum clock that respects the thi/tlow = 134/157 is474474+ * 64800 Hz. Below that, we have to fix the tlow to 255 and475475+ * calculate the thi factor.476476+ */477477+ if (clock < 648) {478478+ tlow = 255;479479+ thi = 1000000 - clock * raise_fall_time;480480+ thi /= (I2C_PCA_OSC_PER * clock) - tlow;481481+ } else {482482+ tlow = (1000000 - clock * raise_fall_time) * min_tlow;483483+ tlow /= I2C_PCA_OSC_PER * clock * (min_thi + min_tlow);484484+ thi = tlow * min_thi / min_tlow;485485+ }486486+487487+ pca_reset(pca_data);488488+489489+ printk(KERN_INFO490490+ "%s: Clock frequency is %dHz\n", adap->name, clock * 100);491491+492492+ pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_IMODE);493493+ pca_outw(pca_data, I2C_PCA_IND, mode);494494+ pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_ISCLL);495495+ pca_outw(pca_data, I2C_PCA_IND, tlow);496496+ pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_ISCLH);497497+ pca_outw(pca_data, I2C_PCA_IND, thi);498498+499499+ pca_set_con(pca_data, I2C_PCA_CON_ENSIO);500500+ }365501 udelay(500); /* 500 us for oscilator to stabilise */366502367503 return 0;···540388541389MODULE_AUTHOR("Ian Campbell <icampbell@arcom.com>, "542390 "Wolfram Sang <w.sang@pengutronix.de>");543543-MODULE_DESCRIPTION("I2C-Bus PCA9564 algorithm");391391+MODULE_DESCRIPTION("I2C-Bus PCA9564/PCA9665 algorithm");544392MODULE_LICENSE("GPL");545393546394module_param(i2c_debug, int, 0);
+4-4
drivers/i2c/busses/Kconfig
···617617 will be called i2c-elektor.618618619619config I2C_PCA_ISA620620- tristate "PCA9564 on an ISA bus"620620+ tristate "PCA9564/PCA9665 on an ISA bus"621621 depends on ISA622622 select I2C_ALGOPCA623623 default n624624 help625625- This driver supports ISA boards using the Philips PCA9564625625+ This driver supports ISA boards using the Philips PCA9564/PCA9665626626 parallel bus to I2C bus controller.627627628628 This driver can also be built as a module. If so, the module···634634 time). If unsure, say N.635635636636config I2C_PCA_PLATFORM637637- tristate "PCA9564 as platform device"637637+ tristate "PCA9564/PCA9665 as platform device"638638 select I2C_ALGOPCA639639 default n640640 help641641- This driver supports a memory mapped Philips PCA9564641641+ This driver supports a memory mapped Philips PCA9564/PCA9665642642 parallel bus to I2C bus controller.643643644644 This driver can also be built as a module. If so, the module
+10-4
drivers/i2c/busses/i2c-pca-isa.c
···41414242/* Data sheet recommends 59kHz for 100kHz operation due to variation4343 * in the actual clock rate */4444-static int clock = I2C_PCA_CON_59kHz;4444+static int clock = 59000;45454646static wait_queue_head_t pca_wait;4747···103103static struct i2c_adapter pca_isa_ops = {104104 .owner = THIS_MODULE,105105 .algo_data = &pca_isa_data,106106- .name = "PCA9564 ISA Adapter",106106+ .name = "PCA9564/PCA9665 ISA Adapter",107107 .timeout = 100,108108};109109···196196}197197198198MODULE_AUTHOR("Ian Campbell <icampbell@arcom.com>");199199-MODULE_DESCRIPTION("ISA base PCA9564 driver");199199+MODULE_DESCRIPTION("ISA base PCA9564/PCA9665 driver");200200MODULE_LICENSE("GPL");201201202202module_param(base, ulong, 0);···205205module_param(irq, int, 0);206206MODULE_PARM_DESC(irq, "IRQ");207207module_param(clock, int, 0);208208-MODULE_PARM_DESC(clock, "Clock rate as described in table 1 of PCA9564 datasheet");208208+MODULE_PARM_DESC(clock, "Clock rate in hertz.\n\t\t"209209+ "For PCA9564: 330000,288000,217000,146000,"210210+ "88000,59000,44000,36000\n"211211+ "\t\tFor PCA9665:\tStandard: 60300 - 100099\n"212212+ "\t\t\t\tFast: 100100 - 400099\n"213213+ "\t\t\t\tFast+: 400100 - 10000099\n"214214+ "\t\t\t\tTurbo: Up to 1265800");209215210216module_init(pca_isa_init);211217module_exit(pca_isa_exit);