forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 ee930fffee469d076998274a2ca55e13dc1efb67
kernel/drivers/i2c/busses/i2c-exynos5.c
....@@ -1,11 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /**
23 * i2c-exynos5.c - Samsung Exynos5 I2C Controller Driver
34 *
45 * Copyright (C) 2013 Samsung Electronics Co., Ltd.
5
- *
6
- * This program is free software; you can redistribute it and/or modify
7
- * it under the terms of the GNU General Public License version 2 as
8
- * published by the Free Software Foundation.
96 */
107
118 #include <linux/kernel.h>
....@@ -167,13 +164,6 @@
167164 #define HSI2C_MASTER_ID(x) ((x & 0xff) << 24)
168165 #define MASTER_ID(x) ((x & 0x7) + 0x08)
169166
170
-/*
171
- * Controller operating frequency, timing values for operation
172
- * are calculated against this frequency
173
- */
174
-#define HSI2C_HS_TX_CLOCK 1000000
175
-#define HSI2C_FS_TX_CLOCK 100000
176
-
177167 #define EXYNOS5_I2C_TIMEOUT (msecs_to_jiffies(100))
178168
179169 enum i2c_type_exynos {
....@@ -183,7 +173,6 @@
183173
184174 struct exynos5_i2c {
185175 struct i2c_adapter adap;
186
- unsigned int suspended:1;
187176
188177 struct i2c_msg *msg;
189178 struct completion msg_complete;
....@@ -268,6 +257,9 @@
268257 * exynos5_i2c_set_timing: updates the registers with appropriate
269258 * timing values calculated
270259 *
260
+ * Timing values for operation are calculated against either 100kHz
261
+ * or 1MHz controller operating frequency.
262
+ *
271263 * Returns 0 on success, -EINVAL if the cycle length cannot
272264 * be calculated.
273265 */
....@@ -285,7 +277,7 @@
285277 unsigned int t_ftl_cycle;
286278 unsigned int clkin = clk_get_rate(i2c->clk);
287279 unsigned int op_clk = hs_timings ? i2c->op_clock :
288
- (i2c->op_clock >= HSI2C_HS_TX_CLOCK) ? HSI2C_FS_TX_CLOCK :
280
+ (i2c->op_clock >= I2C_MAX_FAST_MODE_PLUS_FREQ) ? I2C_MAX_STANDARD_MODE_FREQ :
289281 i2c->op_clock;
290282 int div, clk_cycle, temp;
291283
....@@ -357,7 +349,7 @@
357349 /* always set Fast Speed timings */
358350 int ret = exynos5_i2c_set_timing(i2c, false);
359351
360
- if (ret < 0 || i2c->op_clock < HSI2C_HS_TX_CLOCK)
352
+ if (ret < 0 || i2c->op_clock < I2C_MAX_FAST_MODE_PLUS_FREQ)
361353 return ret;
362354
363355 return exynos5_i2c_set_timing(i2c, true);
....@@ -380,7 +372,7 @@
380372 i2c->regs + HSI2C_CTL);
381373 writel(HSI2C_TRAILING_COUNT, i2c->regs + HSI2C_TRAILIG_CTL);
382374
383
- if (i2c->op_clock >= HSI2C_HS_TX_CLOCK) {
375
+ if (i2c->op_clock >= I2C_MAX_FAST_MODE_PLUS_FREQ) {
384376 writel(HSI2C_MASTER_ID(MASTER_ID(i2c->adap.nr)),
385377 i2c->regs + HSI2C_ADDR);
386378 i2c_conf |= HSI2C_HS_MODE;
....@@ -614,6 +606,7 @@
614606 u32 i2c_ctl;
615607 u32 int_en = 0;
616608 u32 i2c_auto_conf = 0;
609
+ u32 i2c_addr = 0;
617610 u32 fifo_ctl;
618611 unsigned long flags;
619612 unsigned short trig_lvl;
....@@ -648,7 +641,12 @@
648641 int_en |= HSI2C_INT_TX_ALMOSTEMPTY_EN;
649642 }
650643
651
- writel(HSI2C_SLV_ADDR_MAS(i2c->msg->addr), i2c->regs + HSI2C_ADDR);
644
+ i2c_addr = HSI2C_SLV_ADDR_MAS(i2c->msg->addr);
645
+
646
+ if (i2c->op_clock >= I2C_MAX_FAST_MODE_PLUS_FREQ)
647
+ i2c_addr |= HSI2C_MASTER_ID(MASTER_ID(i2c->adap.nr));
648
+
649
+ writel(i2c_addr, i2c->regs + HSI2C_ADDR);
652650
653651 writel(fifo_ctl, i2c->regs + HSI2C_FIFO_CTL);
654652 writel(i2c_ctl, i2c->regs + HSI2C_CTL);
....@@ -715,11 +713,6 @@
715713 struct exynos5_i2c *i2c = adap->algo_data;
716714 int i, ret;
717715
718
- if (i2c->suspended) {
719
- dev_err(i2c->dev, "HS-I2C is not initialized.\n");
720
- return -EIO;
721
- }
722
-
723716 ret = clk_enable(i2c->clk);
724717 if (ret)
725718 return ret;
....@@ -749,7 +742,6 @@
749742 {
750743 struct device_node *np = pdev->dev.of_node;
751744 struct exynos5_i2c *i2c;
752
- struct resource *mem;
753745 int ret;
754746
755747 i2c = devm_kzalloc(&pdev->dev, sizeof(struct exynos5_i2c), GFP_KERNEL);
....@@ -757,7 +749,7 @@
757749 return -ENOMEM;
758750
759751 if (of_property_read_u32(np, "clock-frequency", &i2c->op_clock))
760
- i2c->op_clock = HSI2C_FS_TX_CLOCK;
752
+ i2c->op_clock = I2C_MAX_STANDARD_MODE_FREQ;
761753
762754 strlcpy(i2c->adap.name, "exynos5-i2c", sizeof(i2c->adap.name));
763755 i2c->adap.owner = THIS_MODULE;
....@@ -775,8 +767,7 @@
775767 if (ret)
776768 return ret;
777769
778
- mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
779
- i2c->regs = devm_ioremap_resource(&pdev->dev, mem);
770
+ i2c->regs = devm_platform_ioremap_resource(pdev, 0);
780771 if (IS_ERR(i2c->regs)) {
781772 ret = PTR_ERR(i2c->regs);
782773 goto err_clk;
....@@ -845,8 +836,7 @@
845836 {
846837 struct exynos5_i2c *i2c = dev_get_drvdata(dev);
847838
848
- i2c->suspended = 1;
849
-
839
+ i2c_mark_adapter_suspended(&i2c->adap);
850840 clk_unprepare(i2c->clk);
851841
852842 return 0;
....@@ -869,7 +859,7 @@
869859
870860 exynos5_i2c_init(i2c);
871861 clk_disable(i2c->clk);
872
- i2c->suspended = 0;
862
+ i2c_mark_adapter_resumed(&i2c->adap);
873863
874864 return 0;
875865 }
....@@ -893,6 +883,6 @@
893883 module_platform_driver(exynos5_i2c_driver);
894884
895885 MODULE_DESCRIPTION("Exynos5 HS-I2C Bus driver");
896
-MODULE_AUTHOR("Naveen Krishna Chatradhi, <ch.naveen@samsung.com>");
897
-MODULE_AUTHOR("Taekgyun Ko, <taeggyun.ko@samsung.com>");
886
+MODULE_AUTHOR("Naveen Krishna Chatradhi <ch.naveen@samsung.com>");
887
+MODULE_AUTHOR("Taekgyun Ko <taeggyun.ko@samsung.com>");
898888 MODULE_LICENSE("GPL v2");