diff options
| -rw-r--r-- | MAINTAINERS | 2 | ||||
| -rw-r--r-- | drivers/i2c/algos/i2c-algo-pca.c | 6 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-mxs.c | 13 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-pnx.c | 53 | ||||
| -rw-r--r-- | include/linux/i2c-pnx.h | 1 |
5 files changed, 42 insertions, 33 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index fdc0119963e7..53cc13c82cb1 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -3388,7 +3388,7 @@ M: "Wolfram Sang (embedded platforms)" <w.sang@pengutronix.de> | |||
| 3388 | L: linux-i2c@vger.kernel.org | 3388 | L: linux-i2c@vger.kernel.org |
| 3389 | W: http://i2c.wiki.kernel.org/ | 3389 | W: http://i2c.wiki.kernel.org/ |
| 3390 | T: quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-i2c/ | 3390 | T: quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-i2c/ |
| 3391 | T: git git://git.fluff.org/bjdooks/linux.git | 3391 | T: git git://git.pengutronix.de/git/wsa/linux.git |
| 3392 | S: Maintained | 3392 | S: Maintained |
| 3393 | F: Documentation/i2c/ | 3393 | F: Documentation/i2c/ |
| 3394 | F: drivers/i2c/ | 3394 | F: drivers/i2c/ |
diff --git a/drivers/i2c/algos/i2c-algo-pca.c b/drivers/i2c/algos/i2c-algo-pca.c index 73133b1063f0..6f5f98d69af7 100644 --- a/drivers/i2c/algos/i2c-algo-pca.c +++ b/drivers/i2c/algos/i2c-algo-pca.c | |||
| @@ -476,17 +476,17 @@ static int pca_init(struct i2c_adapter *adap) | |||
| 476 | /* To avoid integer overflow, use clock/100 for calculations */ | 476 | /* To avoid integer overflow, use clock/100 for calculations */ |
| 477 | clock = pca_clock(pca_data) / 100; | 477 | clock = pca_clock(pca_data) / 100; |
| 478 | 478 | ||
| 479 | if (pca_data->i2c_clock > 10000) { | 479 | if (pca_data->i2c_clock > 1000000) { |
| 480 | mode = I2C_PCA_MODE_TURBO; | 480 | mode = I2C_PCA_MODE_TURBO; |
| 481 | min_tlow = 14; | 481 | min_tlow = 14; |
| 482 | min_thi = 5; | 482 | min_thi = 5; |
| 483 | raise_fall_time = 22; /* Raise 11e-8s, Fall 11e-8s */ | 483 | raise_fall_time = 22; /* Raise 11e-8s, Fall 11e-8s */ |
| 484 | } else if (pca_data->i2c_clock > 4000) { | 484 | } else if (pca_data->i2c_clock > 400000) { |
| 485 | mode = I2C_PCA_MODE_FASTP; | 485 | mode = I2C_PCA_MODE_FASTP; |
| 486 | min_tlow = 17; | 486 | min_tlow = 17; |
| 487 | min_thi = 9; | 487 | min_thi = 9; |
| 488 | raise_fall_time = 22; /* Raise 11e-8s, Fall 11e-8s */ | 488 | raise_fall_time = 22; /* Raise 11e-8s, Fall 11e-8s */ |
| 489 | } else if (pca_data->i2c_clock > 1000) { | 489 | } else if (pca_data->i2c_clock > 100000) { |
| 490 | mode = I2C_PCA_MODE_FAST; | 490 | mode = I2C_PCA_MODE_FAST; |
| 491 | min_tlow = 44; | 491 | min_tlow = 44; |
| 492 | min_thi = 20; | 492 | min_thi = 20; |
diff --git a/drivers/i2c/busses/i2c-mxs.c b/drivers/i2c/busses/i2c-mxs.c index 088c5c1ed17d..51f05b8520ed 100644 --- a/drivers/i2c/busses/i2c-mxs.c +++ b/drivers/i2c/busses/i2c-mxs.c | |||
| @@ -365,10 +365,6 @@ static int mxs_i2c_get_ofdata(struct mxs_i2c_dev *i2c) | |||
| 365 | struct device_node *node = dev->of_node; | 365 | struct device_node *node = dev->of_node; |
| 366 | int ret; | 366 | int ret; |
| 367 | 367 | ||
| 368 | if (!node) | ||
| 369 | return -EINVAL; | ||
| 370 | |||
| 371 | i2c->speed = &mxs_i2c_95kHz_config; | ||
| 372 | ret = of_property_read_u32(node, "clock-frequency", &speed); | 368 | ret = of_property_read_u32(node, "clock-frequency", &speed); |
| 373 | if (ret) | 369 | if (ret) |
| 374 | dev_warn(dev, "No I2C speed selected, using 100kHz\n"); | 370 | dev_warn(dev, "No I2C speed selected, using 100kHz\n"); |
| @@ -419,10 +415,13 @@ static int __devinit mxs_i2c_probe(struct platform_device *pdev) | |||
| 419 | return err; | 415 | return err; |
| 420 | 416 | ||
| 421 | i2c->dev = dev; | 417 | i2c->dev = dev; |
| 418 | i2c->speed = &mxs_i2c_95kHz_config; | ||
| 422 | 419 | ||
| 423 | err = mxs_i2c_get_ofdata(i2c); | 420 | if (dev->of_node) { |
| 424 | if (err) | 421 | err = mxs_i2c_get_ofdata(i2c); |
| 425 | return err; | 422 | if (err) |
| 423 | return err; | ||
| 424 | } | ||
| 426 | 425 | ||
| 427 | platform_set_drvdata(pdev, i2c); | 426 | platform_set_drvdata(pdev, i2c); |
| 428 | 427 | ||
diff --git a/drivers/i2c/busses/i2c-pnx.c b/drivers/i2c/busses/i2c-pnx.c index 5d54416770b0..8488bddfe465 100644 --- a/drivers/i2c/busses/i2c-pnx.c +++ b/drivers/i2c/busses/i2c-pnx.c | |||
| @@ -48,8 +48,9 @@ enum { | |||
| 48 | mcntrl_afie = 0x00000002, | 48 | mcntrl_afie = 0x00000002, |
| 49 | mcntrl_naie = 0x00000004, | 49 | mcntrl_naie = 0x00000004, |
| 50 | mcntrl_drmie = 0x00000008, | 50 | mcntrl_drmie = 0x00000008, |
| 51 | mcntrl_daie = 0x00000020, | 51 | mcntrl_drsie = 0x00000010, |
| 52 | mcntrl_rffie = 0x00000040, | 52 | mcntrl_rffie = 0x00000020, |
| 53 | mcntrl_daie = 0x00000040, | ||
| 53 | mcntrl_tffie = 0x00000080, | 54 | mcntrl_tffie = 0x00000080, |
| 54 | mcntrl_reset = 0x00000100, | 55 | mcntrl_reset = 0x00000100, |
| 55 | mcntrl_cdbmode = 0x00000400, | 56 | mcntrl_cdbmode = 0x00000400, |
| @@ -290,31 +291,37 @@ static int i2c_pnx_master_rcv(struct i2c_pnx_algo_data *alg_data) | |||
| 290 | * or we didn't 'ask' for it yet. | 291 | * or we didn't 'ask' for it yet. |
| 291 | */ | 292 | */ |
| 292 | if (ioread32(I2C_REG_STS(alg_data)) & mstatus_rfe) { | 293 | if (ioread32(I2C_REG_STS(alg_data)) & mstatus_rfe) { |
| 293 | dev_dbg(&alg_data->adapter.dev, | 294 | /* 'Asking' is done asynchronously, e.g. dummy TX of several |
| 294 | "%s(): Write dummy data to fill Rx-fifo...\n", | 295 | * bytes is done before the first actual RX arrives in FIFO. |
| 295 | __func__); | 296 | * Therefore, ordered bytes (via TX) are counted separately. |
| 297 | */ | ||
| 298 | if (alg_data->mif.order) { | ||
| 299 | dev_dbg(&alg_data->adapter.dev, | ||
| 300 | "%s(): Write dummy data to fill Rx-fifo...\n", | ||
| 301 | __func__); | ||
| 296 | 302 | ||
| 297 | if (alg_data->mif.len == 1) { | 303 | if (alg_data->mif.order == 1) { |
| 298 | /* Last byte, do not acknowledge next rcv. */ | 304 | /* Last byte, do not acknowledge next rcv. */ |
| 299 | val |= stop_bit; | 305 | val |= stop_bit; |
| 306 | |||
| 307 | /* | ||
| 308 | * Enable interrupt RFDAIE (data in Rx fifo), | ||
| 309 | * and disable DRMIE (need data for Tx) | ||
| 310 | */ | ||
| 311 | ctl = ioread32(I2C_REG_CTL(alg_data)); | ||
| 312 | ctl |= mcntrl_rffie | mcntrl_daie; | ||
| 313 | ctl &= ~mcntrl_drmie; | ||
| 314 | iowrite32(ctl, I2C_REG_CTL(alg_data)); | ||
| 315 | } | ||
| 300 | 316 | ||
| 301 | /* | 317 | /* |
| 302 | * Enable interrupt RFDAIE (data in Rx fifo), | 318 | * Now we'll 'ask' for data: |
| 303 | * and disable DRMIE (need data for Tx) | 319 | * For each byte we want to receive, we must |
| 320 | * write a (dummy) byte to the Tx-FIFO. | ||
| 304 | */ | 321 | */ |
| 305 | ctl = ioread32(I2C_REG_CTL(alg_data)); | 322 | iowrite32(val, I2C_REG_TX(alg_data)); |
| 306 | ctl |= mcntrl_rffie | mcntrl_daie; | 323 | alg_data->mif.order--; |
| 307 | ctl &= ~mcntrl_drmie; | ||
| 308 | iowrite32(ctl, I2C_REG_CTL(alg_data)); | ||
| 309 | } | 324 | } |
| 310 | |||
| 311 | /* | ||
| 312 | * Now we'll 'ask' for data: | ||
| 313 | * For each byte we want to receive, we must | ||
| 314 | * write a (dummy) byte to the Tx-FIFO. | ||
| 315 | */ | ||
| 316 | iowrite32(val, I2C_REG_TX(alg_data)); | ||
| 317 | |||
| 318 | return 0; | 325 | return 0; |
| 319 | } | 326 | } |
| 320 | 327 | ||
| @@ -514,6 +521,7 @@ i2c_pnx_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) | |||
| 514 | 521 | ||
| 515 | alg_data->mif.buf = pmsg->buf; | 522 | alg_data->mif.buf = pmsg->buf; |
| 516 | alg_data->mif.len = pmsg->len; | 523 | alg_data->mif.len = pmsg->len; |
| 524 | alg_data->mif.order = pmsg->len; | ||
| 517 | alg_data->mif.mode = (pmsg->flags & I2C_M_RD) ? | 525 | alg_data->mif.mode = (pmsg->flags & I2C_M_RD) ? |
| 518 | I2C_SMBUS_READ : I2C_SMBUS_WRITE; | 526 | I2C_SMBUS_READ : I2C_SMBUS_WRITE; |
| 519 | alg_data->mif.ret = 0; | 527 | alg_data->mif.ret = 0; |
| @@ -566,6 +574,7 @@ i2c_pnx_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) | |||
| 566 | /* Cleanup to be sure... */ | 574 | /* Cleanup to be sure... */ |
| 567 | alg_data->mif.buf = NULL; | 575 | alg_data->mif.buf = NULL; |
| 568 | alg_data->mif.len = 0; | 576 | alg_data->mif.len = 0; |
| 577 | alg_data->mif.order = 0; | ||
| 569 | 578 | ||
| 570 | dev_dbg(&alg_data->adapter.dev, "%s(): exiting, stat = %x\n", | 579 | dev_dbg(&alg_data->adapter.dev, "%s(): exiting, stat = %x\n", |
| 571 | __func__, ioread32(I2C_REG_STS(alg_data))); | 580 | __func__, ioread32(I2C_REG_STS(alg_data))); |
diff --git a/include/linux/i2c-pnx.h b/include/linux/i2c-pnx.h index 1bc74afe7a35..49ed17fdf055 100644 --- a/include/linux/i2c-pnx.h +++ b/include/linux/i2c-pnx.h | |||
| @@ -22,6 +22,7 @@ struct i2c_pnx_mif { | |||
| 22 | struct timer_list timer; /* Timeout */ | 22 | struct timer_list timer; /* Timeout */ |
| 23 | u8 * buf; /* Data buffer */ | 23 | u8 * buf; /* Data buffer */ |
| 24 | int len; /* Length of data buffer */ | 24 | int len; /* Length of data buffer */ |
| 25 | int order; /* RX Bytes to order via TX */ | ||
| 25 | }; | 26 | }; |
| 26 | 27 | ||
| 27 | struct i2c_pnx_algo_data { | 28 | struct i2c_pnx_algo_data { |
