diff options
| author | Ingo Molnar <mingo@kernel.org> | 2015-02-04 01:58:29 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2015-02-04 01:58:29 -0500 |
| commit | 8f4bf4bcc4d6f70a47baec5d73bd411e572842e0 (patch) | |
| tree | 8ed86ebd19c32a629bfcfb43378bf32acd14c7d6 /drivers/i2c | |
| parent | 1ed39bac21c3c2934b18de34df9478ad7b8edf1f (diff) | |
| parent | e36f014edff70fc02b3d3d79cead1d58f289332e (diff) | |
Merge tag 'v3.19-rc7' into perf/core, to merge fixes before applying new changes
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'drivers/i2c')
| -rw-r--r-- | drivers/i2c/busses/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-s3c2410.c | 23 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-sh_mobile.c | 12 | ||||
| -rw-r--r-- | drivers/i2c/i2c-core.c | 2 | ||||
| -rw-r--r-- | drivers/i2c/i2c-slave-eeprom.c | 4 |
5 files changed, 33 insertions, 9 deletions
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index 31e8308ba899..ab838d9e28b6 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig | |||
| @@ -881,6 +881,7 @@ config I2C_XLR | |||
| 881 | config I2C_RCAR | 881 | config I2C_RCAR |
| 882 | tristate "Renesas R-Car I2C Controller" | 882 | tristate "Renesas R-Car I2C Controller" |
| 883 | depends on ARCH_SHMOBILE || COMPILE_TEST | 883 | depends on ARCH_SHMOBILE || COMPILE_TEST |
| 884 | select I2C_SLAVE | ||
| 884 | help | 885 | help |
| 885 | If you say yes to this option, support will be included for the | 886 | If you say yes to this option, support will be included for the |
| 886 | R-Car I2C controller. | 887 | R-Car I2C controller. |
diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index bff20a589621..958c8db4ec30 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c | |||
| @@ -785,14 +785,16 @@ static int s3c24xx_i2c_xfer(struct i2c_adapter *adap, | |||
| 785 | int ret; | 785 | int ret; |
| 786 | 786 | ||
| 787 | pm_runtime_get_sync(&adap->dev); | 787 | pm_runtime_get_sync(&adap->dev); |
| 788 | clk_prepare_enable(i2c->clk); | 788 | ret = clk_enable(i2c->clk); |
| 789 | if (ret) | ||
| 790 | return ret; | ||
| 789 | 791 | ||
| 790 | for (retry = 0; retry < adap->retries; retry++) { | 792 | for (retry = 0; retry < adap->retries; retry++) { |
| 791 | 793 | ||
| 792 | ret = s3c24xx_i2c_doxfer(i2c, msgs, num); | 794 | ret = s3c24xx_i2c_doxfer(i2c, msgs, num); |
| 793 | 795 | ||
| 794 | if (ret != -EAGAIN) { | 796 | if (ret != -EAGAIN) { |
| 795 | clk_disable_unprepare(i2c->clk); | 797 | clk_disable(i2c->clk); |
| 796 | pm_runtime_put(&adap->dev); | 798 | pm_runtime_put(&adap->dev); |
| 797 | return ret; | 799 | return ret; |
| 798 | } | 800 | } |
| @@ -802,7 +804,7 @@ static int s3c24xx_i2c_xfer(struct i2c_adapter *adap, | |||
| 802 | udelay(100); | 804 | udelay(100); |
| 803 | } | 805 | } |
| 804 | 806 | ||
| 805 | clk_disable_unprepare(i2c->clk); | 807 | clk_disable(i2c->clk); |
| 806 | pm_runtime_put(&adap->dev); | 808 | pm_runtime_put(&adap->dev); |
| 807 | return -EREMOTEIO; | 809 | return -EREMOTEIO; |
| 808 | } | 810 | } |
| @@ -1197,7 +1199,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) | |||
| 1197 | 1199 | ||
| 1198 | clk_prepare_enable(i2c->clk); | 1200 | clk_prepare_enable(i2c->clk); |
| 1199 | ret = s3c24xx_i2c_init(i2c); | 1201 | ret = s3c24xx_i2c_init(i2c); |
| 1200 | clk_disable_unprepare(i2c->clk); | 1202 | clk_disable(i2c->clk); |
| 1201 | if (ret != 0) { | 1203 | if (ret != 0) { |
| 1202 | dev_err(&pdev->dev, "I2C controller init failed\n"); | 1204 | dev_err(&pdev->dev, "I2C controller init failed\n"); |
| 1203 | return ret; | 1205 | return ret; |
| @@ -1210,6 +1212,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) | |||
| 1210 | i2c->irq = ret = platform_get_irq(pdev, 0); | 1212 | i2c->irq = ret = platform_get_irq(pdev, 0); |
| 1211 | if (ret <= 0) { | 1213 | if (ret <= 0) { |
| 1212 | dev_err(&pdev->dev, "cannot find IRQ\n"); | 1214 | dev_err(&pdev->dev, "cannot find IRQ\n"); |
| 1215 | clk_unprepare(i2c->clk); | ||
| 1213 | return ret; | 1216 | return ret; |
| 1214 | } | 1217 | } |
| 1215 | 1218 | ||
| @@ -1218,6 +1221,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) | |||
| 1218 | 1221 | ||
| 1219 | if (ret != 0) { | 1222 | if (ret != 0) { |
| 1220 | dev_err(&pdev->dev, "cannot claim IRQ %d\n", i2c->irq); | 1223 | dev_err(&pdev->dev, "cannot claim IRQ %d\n", i2c->irq); |
| 1224 | clk_unprepare(i2c->clk); | ||
| 1221 | return ret; | 1225 | return ret; |
| 1222 | } | 1226 | } |
| 1223 | } | 1227 | } |
| @@ -1225,6 +1229,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) | |||
| 1225 | ret = s3c24xx_i2c_register_cpufreq(i2c); | 1229 | ret = s3c24xx_i2c_register_cpufreq(i2c); |
| 1226 | if (ret < 0) { | 1230 | if (ret < 0) { |
| 1227 | dev_err(&pdev->dev, "failed to register cpufreq notifier\n"); | 1231 | dev_err(&pdev->dev, "failed to register cpufreq notifier\n"); |
| 1232 | clk_unprepare(i2c->clk); | ||
| 1228 | return ret; | 1233 | return ret; |
| 1229 | } | 1234 | } |
| 1230 | 1235 | ||
| @@ -1241,6 +1246,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) | |||
| 1241 | if (ret < 0) { | 1246 | if (ret < 0) { |
| 1242 | dev_err(&pdev->dev, "failed to add bus to i2c core\n"); | 1247 | dev_err(&pdev->dev, "failed to add bus to i2c core\n"); |
| 1243 | s3c24xx_i2c_deregister_cpufreq(i2c); | 1248 | s3c24xx_i2c_deregister_cpufreq(i2c); |
| 1249 | clk_unprepare(i2c->clk); | ||
| 1244 | return ret; | 1250 | return ret; |
| 1245 | } | 1251 | } |
| 1246 | 1252 | ||
| @@ -1262,6 +1268,8 @@ static int s3c24xx_i2c_remove(struct platform_device *pdev) | |||
| 1262 | { | 1268 | { |
| 1263 | struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev); | 1269 | struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev); |
| 1264 | 1270 | ||
| 1271 | clk_unprepare(i2c->clk); | ||
| 1272 | |||
| 1265 | pm_runtime_disable(&i2c->adap.dev); | 1273 | pm_runtime_disable(&i2c->adap.dev); |
| 1266 | pm_runtime_disable(&pdev->dev); | 1274 | pm_runtime_disable(&pdev->dev); |
| 1267 | 1275 | ||
| @@ -1293,13 +1301,16 @@ static int s3c24xx_i2c_resume_noirq(struct device *dev) | |||
| 1293 | { | 1301 | { |
| 1294 | struct platform_device *pdev = to_platform_device(dev); | 1302 | struct platform_device *pdev = to_platform_device(dev); |
| 1295 | struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev); | 1303 | struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev); |
| 1304 | int ret; | ||
| 1296 | 1305 | ||
| 1297 | if (!IS_ERR(i2c->sysreg)) | 1306 | if (!IS_ERR(i2c->sysreg)) |
| 1298 | regmap_write(i2c->sysreg, EXYNOS5_SYS_I2C_CFG, i2c->sys_i2c_cfg); | 1307 | regmap_write(i2c->sysreg, EXYNOS5_SYS_I2C_CFG, i2c->sys_i2c_cfg); |
| 1299 | 1308 | ||
| 1300 | clk_prepare_enable(i2c->clk); | 1309 | ret = clk_enable(i2c->clk); |
| 1310 | if (ret) | ||
| 1311 | return ret; | ||
| 1301 | s3c24xx_i2c_init(i2c); | 1312 | s3c24xx_i2c_init(i2c); |
| 1302 | clk_disable_unprepare(i2c->clk); | 1313 | clk_disable(i2c->clk); |
| 1303 | i2c->suspended = 0; | 1314 | i2c->suspended = 0; |
| 1304 | 1315 | ||
| 1305 | return 0; | 1316 | return 0; |
diff --git a/drivers/i2c/busses/i2c-sh_mobile.c b/drivers/i2c/busses/i2c-sh_mobile.c index 440d5dbc8b5f..007818b3e174 100644 --- a/drivers/i2c/busses/i2c-sh_mobile.c +++ b/drivers/i2c/busses/i2c-sh_mobile.c | |||
| @@ -139,6 +139,7 @@ struct sh_mobile_i2c_data { | |||
| 139 | int pos; | 139 | int pos; |
| 140 | int sr; | 140 | int sr; |
| 141 | bool send_stop; | 141 | bool send_stop; |
| 142 | bool stop_after_dma; | ||
| 142 | 143 | ||
| 143 | struct resource *res; | 144 | struct resource *res; |
| 144 | struct dma_chan *dma_tx; | 145 | struct dma_chan *dma_tx; |
| @@ -407,7 +408,7 @@ static int sh_mobile_i2c_isr_tx(struct sh_mobile_i2c_data *pd) | |||
| 407 | 408 | ||
| 408 | if (pd->pos == pd->msg->len) { | 409 | if (pd->pos == pd->msg->len) { |
| 409 | /* Send stop if we haven't yet (DMA case) */ | 410 | /* Send stop if we haven't yet (DMA case) */ |
| 410 | if (pd->send_stop && (iic_rd(pd, ICCR) & ICCR_BBSY)) | 411 | if (pd->send_stop && pd->stop_after_dma) |
| 411 | i2c_op(pd, OP_TX_STOP, 0); | 412 | i2c_op(pd, OP_TX_STOP, 0); |
| 412 | return 1; | 413 | return 1; |
| 413 | } | 414 | } |
| @@ -449,6 +450,13 @@ static int sh_mobile_i2c_isr_rx(struct sh_mobile_i2c_data *pd) | |||
| 449 | real_pos = pd->pos - 2; | 450 | real_pos = pd->pos - 2; |
| 450 | 451 | ||
| 451 | if (pd->pos == pd->msg->len) { | 452 | if (pd->pos == pd->msg->len) { |
| 453 | if (pd->stop_after_dma) { | ||
| 454 | /* Simulate PIO end condition after DMA transfer */ | ||
| 455 | i2c_op(pd, OP_RX_STOP, 0); | ||
| 456 | pd->pos++; | ||
| 457 | break; | ||
| 458 | } | ||
| 459 | |||
| 452 | if (real_pos < 0) { | 460 | if (real_pos < 0) { |
| 453 | i2c_op(pd, OP_RX_STOP, 0); | 461 | i2c_op(pd, OP_RX_STOP, 0); |
| 454 | break; | 462 | break; |
| @@ -536,6 +544,7 @@ static void sh_mobile_i2c_dma_callback(void *data) | |||
| 536 | 544 | ||
| 537 | sh_mobile_i2c_dma_unmap(pd); | 545 | sh_mobile_i2c_dma_unmap(pd); |
| 538 | pd->pos = pd->msg->len; | 546 | pd->pos = pd->msg->len; |
| 547 | pd->stop_after_dma = true; | ||
| 539 | 548 | ||
| 540 | iic_set_clr(pd, ICIC, 0, ICIC_TDMAE | ICIC_RDMAE); | 549 | iic_set_clr(pd, ICIC, 0, ICIC_TDMAE | ICIC_RDMAE); |
| 541 | } | 550 | } |
| @@ -726,6 +735,7 @@ static int sh_mobile_i2c_xfer(struct i2c_adapter *adapter, | |||
| 726 | bool do_start = pd->send_stop || !i; | 735 | bool do_start = pd->send_stop || !i; |
| 727 | msg = &msgs[i]; | 736 | msg = &msgs[i]; |
| 728 | pd->send_stop = i == num - 1 || msg->flags & I2C_M_STOP; | 737 | pd->send_stop = i == num - 1 || msg->flags & I2C_M_STOP; |
| 738 | pd->stop_after_dma = false; | ||
| 729 | 739 | ||
| 730 | err = start_ch(pd, msg, do_start); | 740 | err = start_ch(pd, msg, do_start); |
| 731 | if (err) | 741 | if (err) |
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 39d25a8cb1ad..e9eae57a2b50 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
| @@ -2972,6 +2972,7 @@ trace: | |||
| 2972 | } | 2972 | } |
| 2973 | EXPORT_SYMBOL(i2c_smbus_xfer); | 2973 | EXPORT_SYMBOL(i2c_smbus_xfer); |
| 2974 | 2974 | ||
| 2975 | #if IS_ENABLED(CONFIG_I2C_SLAVE) | ||
| 2975 | int i2c_slave_register(struct i2c_client *client, i2c_slave_cb_t slave_cb) | 2976 | int i2c_slave_register(struct i2c_client *client, i2c_slave_cb_t slave_cb) |
| 2976 | { | 2977 | { |
| 2977 | int ret; | 2978 | int ret; |
| @@ -3019,6 +3020,7 @@ int i2c_slave_unregister(struct i2c_client *client) | |||
| 3019 | return ret; | 3020 | return ret; |
| 3020 | } | 3021 | } |
| 3021 | EXPORT_SYMBOL_GPL(i2c_slave_unregister); | 3022 | EXPORT_SYMBOL_GPL(i2c_slave_unregister); |
| 3023 | #endif | ||
| 3022 | 3024 | ||
| 3023 | MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>"); | 3025 | MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>"); |
| 3024 | MODULE_DESCRIPTION("I2C-Bus main module"); | 3026 | MODULE_DESCRIPTION("I2C-Bus main module"); |
diff --git a/drivers/i2c/i2c-slave-eeprom.c b/drivers/i2c/i2c-slave-eeprom.c index 6631400b5f02..cf9b09db092f 100644 --- a/drivers/i2c/i2c-slave-eeprom.c +++ b/drivers/i2c/i2c-slave-eeprom.c | |||
| @@ -74,7 +74,7 @@ static ssize_t i2c_slave_eeprom_bin_read(struct file *filp, struct kobject *kobj | |||
| 74 | struct eeprom_data *eeprom; | 74 | struct eeprom_data *eeprom; |
| 75 | unsigned long flags; | 75 | unsigned long flags; |
| 76 | 76 | ||
| 77 | if (off + count >= attr->size) | 77 | if (off + count > attr->size) |
| 78 | return -EFBIG; | 78 | return -EFBIG; |
| 79 | 79 | ||
| 80 | eeprom = dev_get_drvdata(container_of(kobj, struct device, kobj)); | 80 | eeprom = dev_get_drvdata(container_of(kobj, struct device, kobj)); |
| @@ -92,7 +92,7 @@ static ssize_t i2c_slave_eeprom_bin_write(struct file *filp, struct kobject *kob | |||
| 92 | struct eeprom_data *eeprom; | 92 | struct eeprom_data *eeprom; |
| 93 | unsigned long flags; | 93 | unsigned long flags; |
| 94 | 94 | ||
| 95 | if (off + count >= attr->size) | 95 | if (off + count > attr->size) |
| 96 | return -EFBIG; | 96 | return -EFBIG; |
| 97 | 97 | ||
| 98 | eeprom = dev_get_drvdata(container_of(kobj, struct device, kobj)); | 98 | eeprom = dev_get_drvdata(container_of(kobj, struct device, kobj)); |
