diff options
author | Wolfram Sang <wsa@the-dreams.de> | 2019-02-14 11:46:56 -0500 |
---|---|---|
committer | Wolfram Sang <wsa@the-dreams.de> | 2019-02-14 11:46:56 -0500 |
commit | 338618ad2a01b821a34e089a6607143fb283dee3 (patch) | |
tree | adf9aff96a5a087c820251f3eb09928b3271b007 /drivers/i2c | |
parent | 18769445ca55c2277d29e35ffda7e9a206b1758f (diff) | |
parent | d13937116f1e82bf508a6325111b322c30c85eb9 (diff) |
Merge branch 'i2c/for-current' into i2c/for-5.1
Diffstat (limited to 'drivers/i2c')
-rw-r--r-- | drivers/i2c/busses/i2c-omap.c | 13 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-tegra.c | 15 | ||||
-rw-r--r-- | drivers/i2c/i2c-dev.c | 6 |
3 files changed, 25 insertions, 9 deletions
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index b1086bfb0465..cd9c65f3d404 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c | |||
@@ -1500,8 +1500,7 @@ static int omap_i2c_remove(struct platform_device *pdev) | |||
1500 | return 0; | 1500 | return 0; |
1501 | } | 1501 | } |
1502 | 1502 | ||
1503 | #ifdef CONFIG_PM | 1503 | static int __maybe_unused omap_i2c_runtime_suspend(struct device *dev) |
1504 | static int omap_i2c_runtime_suspend(struct device *dev) | ||
1505 | { | 1504 | { |
1506 | struct omap_i2c_dev *omap = dev_get_drvdata(dev); | 1505 | struct omap_i2c_dev *omap = dev_get_drvdata(dev); |
1507 | 1506 | ||
@@ -1527,7 +1526,7 @@ static int omap_i2c_runtime_suspend(struct device *dev) | |||
1527 | return 0; | 1526 | return 0; |
1528 | } | 1527 | } |
1529 | 1528 | ||
1530 | static int omap_i2c_runtime_resume(struct device *dev) | 1529 | static int __maybe_unused omap_i2c_runtime_resume(struct device *dev) |
1531 | { | 1530 | { |
1532 | struct omap_i2c_dev *omap = dev_get_drvdata(dev); | 1531 | struct omap_i2c_dev *omap = dev_get_drvdata(dev); |
1533 | 1532 | ||
@@ -1542,20 +1541,18 @@ static int omap_i2c_runtime_resume(struct device *dev) | |||
1542 | } | 1541 | } |
1543 | 1542 | ||
1544 | static const struct dev_pm_ops omap_i2c_pm_ops = { | 1543 | static const struct dev_pm_ops omap_i2c_pm_ops = { |
1544 | SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, | ||
1545 | pm_runtime_force_resume) | ||
1545 | SET_RUNTIME_PM_OPS(omap_i2c_runtime_suspend, | 1546 | SET_RUNTIME_PM_OPS(omap_i2c_runtime_suspend, |
1546 | omap_i2c_runtime_resume, NULL) | 1547 | omap_i2c_runtime_resume, NULL) |
1547 | }; | 1548 | }; |
1548 | #define OMAP_I2C_PM_OPS (&omap_i2c_pm_ops) | ||
1549 | #else | ||
1550 | #define OMAP_I2C_PM_OPS NULL | ||
1551 | #endif /* CONFIG_PM */ | ||
1552 | 1549 | ||
1553 | static struct platform_driver omap_i2c_driver = { | 1550 | static struct platform_driver omap_i2c_driver = { |
1554 | .probe = omap_i2c_probe, | 1551 | .probe = omap_i2c_probe, |
1555 | .remove = omap_i2c_remove, | 1552 | .remove = omap_i2c_remove, |
1556 | .driver = { | 1553 | .driver = { |
1557 | .name = "omap_i2c", | 1554 | .name = "omap_i2c", |
1558 | .pm = OMAP_I2C_PM_OPS, | 1555 | .pm = &omap_i2c_pm_ops, |
1559 | .of_match_table = of_match_ptr(omap_i2c_of_match), | 1556 | .of_match_table = of_match_ptr(omap_i2c_of_match), |
1560 | }, | 1557 | }, |
1561 | }; | 1558 | }; |
diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c index e417ebf7628c..c77adbbea0c7 100644 --- a/drivers/i2c/busses/i2c-tegra.c +++ b/drivers/i2c/busses/i2c-tegra.c | |||
@@ -155,6 +155,8 @@ enum msg_end_type { | |||
155 | * @has_mst_fifo: The I2C controller contains the new MST FIFO interface that | 155 | * @has_mst_fifo: The I2C controller contains the new MST FIFO interface that |
156 | * provides additional features and allows for longer messages to | 156 | * provides additional features and allows for longer messages to |
157 | * be transferred in one go. | 157 | * be transferred in one go. |
158 | * @quirks: i2c adapter quirks for limiting write/read transfer size and not | ||
159 | * allowing 0 length transfers. | ||
158 | */ | 160 | */ |
159 | struct tegra_i2c_hw_feature { | 161 | struct tegra_i2c_hw_feature { |
160 | bool has_continue_xfer_support; | 162 | bool has_continue_xfer_support; |
@@ -167,6 +169,7 @@ struct tegra_i2c_hw_feature { | |||
167 | bool has_multi_master_mode; | 169 | bool has_multi_master_mode; |
168 | bool has_slcg_override_reg; | 170 | bool has_slcg_override_reg; |
169 | bool has_mst_fifo; | 171 | bool has_mst_fifo; |
172 | const struct i2c_adapter_quirks *quirks; | ||
170 | }; | 173 | }; |
171 | 174 | ||
172 | /** | 175 | /** |
@@ -837,6 +840,10 @@ static const struct i2c_adapter_quirks tegra_i2c_quirks = { | |||
837 | .max_write_len = 4096, | 840 | .max_write_len = 4096, |
838 | }; | 841 | }; |
839 | 842 | ||
843 | static const struct i2c_adapter_quirks tegra194_i2c_quirks = { | ||
844 | .flags = I2C_AQ_NO_ZERO_LEN, | ||
845 | }; | ||
846 | |||
840 | static const struct tegra_i2c_hw_feature tegra20_i2c_hw = { | 847 | static const struct tegra_i2c_hw_feature tegra20_i2c_hw = { |
841 | .has_continue_xfer_support = false, | 848 | .has_continue_xfer_support = false, |
842 | .has_per_pkt_xfer_complete_irq = false, | 849 | .has_per_pkt_xfer_complete_irq = false, |
@@ -848,6 +855,7 @@ static const struct tegra_i2c_hw_feature tegra20_i2c_hw = { | |||
848 | .has_multi_master_mode = false, | 855 | .has_multi_master_mode = false, |
849 | .has_slcg_override_reg = false, | 856 | .has_slcg_override_reg = false, |
850 | .has_mst_fifo = false, | 857 | .has_mst_fifo = false, |
858 | .quirks = &tegra_i2c_quirks, | ||
851 | }; | 859 | }; |
852 | 860 | ||
853 | static const struct tegra_i2c_hw_feature tegra30_i2c_hw = { | 861 | static const struct tegra_i2c_hw_feature tegra30_i2c_hw = { |
@@ -861,6 +869,7 @@ static const struct tegra_i2c_hw_feature tegra30_i2c_hw = { | |||
861 | .has_multi_master_mode = false, | 869 | .has_multi_master_mode = false, |
862 | .has_slcg_override_reg = false, | 870 | .has_slcg_override_reg = false, |
863 | .has_mst_fifo = false, | 871 | .has_mst_fifo = false, |
872 | .quirks = &tegra_i2c_quirks, | ||
864 | }; | 873 | }; |
865 | 874 | ||
866 | static const struct tegra_i2c_hw_feature tegra114_i2c_hw = { | 875 | static const struct tegra_i2c_hw_feature tegra114_i2c_hw = { |
@@ -874,6 +883,7 @@ static const struct tegra_i2c_hw_feature tegra114_i2c_hw = { | |||
874 | .has_multi_master_mode = false, | 883 | .has_multi_master_mode = false, |
875 | .has_slcg_override_reg = false, | 884 | .has_slcg_override_reg = false, |
876 | .has_mst_fifo = false, | 885 | .has_mst_fifo = false, |
886 | .quirks = &tegra_i2c_quirks, | ||
877 | }; | 887 | }; |
878 | 888 | ||
879 | static const struct tegra_i2c_hw_feature tegra124_i2c_hw = { | 889 | static const struct tegra_i2c_hw_feature tegra124_i2c_hw = { |
@@ -887,6 +897,7 @@ static const struct tegra_i2c_hw_feature tegra124_i2c_hw = { | |||
887 | .has_multi_master_mode = false, | 897 | .has_multi_master_mode = false, |
888 | .has_slcg_override_reg = true, | 898 | .has_slcg_override_reg = true, |
889 | .has_mst_fifo = false, | 899 | .has_mst_fifo = false, |
900 | .quirks = &tegra_i2c_quirks, | ||
890 | }; | 901 | }; |
891 | 902 | ||
892 | static const struct tegra_i2c_hw_feature tegra210_i2c_hw = { | 903 | static const struct tegra_i2c_hw_feature tegra210_i2c_hw = { |
@@ -900,6 +911,7 @@ static const struct tegra_i2c_hw_feature tegra210_i2c_hw = { | |||
900 | .has_multi_master_mode = true, | 911 | .has_multi_master_mode = true, |
901 | .has_slcg_override_reg = true, | 912 | .has_slcg_override_reg = true, |
902 | .has_mst_fifo = false, | 913 | .has_mst_fifo = false, |
914 | .quirks = &tegra_i2c_quirks, | ||
903 | }; | 915 | }; |
904 | 916 | ||
905 | static const struct tegra_i2c_hw_feature tegra194_i2c_hw = { | 917 | static const struct tegra_i2c_hw_feature tegra194_i2c_hw = { |
@@ -913,6 +925,7 @@ static const struct tegra_i2c_hw_feature tegra194_i2c_hw = { | |||
913 | .has_multi_master_mode = true, | 925 | .has_multi_master_mode = true, |
914 | .has_slcg_override_reg = true, | 926 | .has_slcg_override_reg = true, |
915 | .has_mst_fifo = true, | 927 | .has_mst_fifo = true, |
928 | .quirks = &tegra194_i2c_quirks, | ||
916 | }; | 929 | }; |
917 | 930 | ||
918 | /* Match table for of_platform binding */ | 931 | /* Match table for of_platform binding */ |
@@ -964,7 +977,6 @@ static int tegra_i2c_probe(struct platform_device *pdev) | |||
964 | i2c_dev->base = base; | 977 | i2c_dev->base = base; |
965 | i2c_dev->div_clk = div_clk; | 978 | i2c_dev->div_clk = div_clk; |
966 | i2c_dev->adapter.algo = &tegra_i2c_algo; | 979 | i2c_dev->adapter.algo = &tegra_i2c_algo; |
967 | i2c_dev->adapter.quirks = &tegra_i2c_quirks; | ||
968 | i2c_dev->irq = irq; | 980 | i2c_dev->irq = irq; |
969 | i2c_dev->cont_id = pdev->id; | 981 | i2c_dev->cont_id = pdev->id; |
970 | i2c_dev->dev = &pdev->dev; | 982 | i2c_dev->dev = &pdev->dev; |
@@ -980,6 +992,7 @@ static int tegra_i2c_probe(struct platform_device *pdev) | |||
980 | i2c_dev->hw = of_device_get_match_data(&pdev->dev); | 992 | i2c_dev->hw = of_device_get_match_data(&pdev->dev); |
981 | i2c_dev->is_dvc = of_device_is_compatible(pdev->dev.of_node, | 993 | i2c_dev->is_dvc = of_device_is_compatible(pdev->dev.of_node, |
982 | "nvidia,tegra20-i2c-dvc"); | 994 | "nvidia,tegra20-i2c-dvc"); |
995 | i2c_dev->adapter.quirks = i2c_dev->hw->quirks; | ||
983 | init_completion(&i2c_dev->msg_complete); | 996 | init_completion(&i2c_dev->msg_complete); |
984 | spin_lock_init(&i2c_dev->xfer_lock); | 997 | spin_lock_init(&i2c_dev->xfer_lock); |
985 | 998 | ||
diff --git a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c index 1aca742fde4a..ccd76c71af09 100644 --- a/drivers/i2c/i2c-dev.c +++ b/drivers/i2c/i2c-dev.c | |||
@@ -470,9 +470,15 @@ static long i2cdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
470 | data_arg.data); | 470 | data_arg.data); |
471 | } | 471 | } |
472 | case I2C_RETRIES: | 472 | case I2C_RETRIES: |
473 | if (arg > INT_MAX) | ||
474 | return -EINVAL; | ||
475 | |||
473 | client->adapter->retries = arg; | 476 | client->adapter->retries = arg; |
474 | break; | 477 | break; |
475 | case I2C_TIMEOUT: | 478 | case I2C_TIMEOUT: |
479 | if (arg > INT_MAX) | ||
480 | return -EINVAL; | ||
481 | |||
476 | /* For historical reasons, user-space sets the timeout | 482 | /* For historical reasons, user-space sets the timeout |
477 | * value in units of 10 ms. | 483 | * value in units of 10 ms. |
478 | */ | 484 | */ |