diff options
author | Ingo Molnar <mingo@kernel.org> | 2014-07-16 09:10:07 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2014-07-16 09:10:07 -0400 |
commit | d26fad5b38e1c4667d4f2604936e59c837caa54d (patch) | |
tree | 04b524a69a0129c181567445bff18847a1b44721 /drivers/i2c | |
parent | e720fff6341fe4b95e5a93c939bd3c77fa55ced4 (diff) | |
parent | 1795cd9b3a91d4b5473c97f491d63892442212ab (diff) |
Merge tag 'v3.16-rc5' into sched/core, to refresh the branch before applying bigger tree-wide changes
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'drivers/i2c')
-rw-r--r-- | drivers/i2c/busses/Kconfig | 23 | ||||
-rw-r--r-- | drivers/i2c/busses/Makefile | 2 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-rk3x.c | 763 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-sun6i-p2wi.c | 344 | ||||
-rw-r--r-- | drivers/i2c/muxes/Kconfig | 1 |
5 files changed, 1133 insertions, 0 deletions
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index 620d1004a1e7..9f7d5859cf65 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig | |||
@@ -676,6 +676,16 @@ config I2C_RIIC | |||
676 | This driver can also be built as a module. If so, the module | 676 | This driver can also be built as a module. If so, the module |
677 | will be called i2c-riic. | 677 | will be called i2c-riic. |
678 | 678 | ||
679 | config I2C_RK3X | ||
680 | tristate "Rockchip RK3xxx I2C adapter" | ||
681 | depends on OF | ||
682 | help | ||
683 | Say Y here to include support for the I2C adapter in Rockchip RK3xxx | ||
684 | SoCs. | ||
685 | |||
686 | This driver can also be built as a module. If so, the module will | ||
687 | be called i2c-rk3x. | ||
688 | |||
679 | config HAVE_S3C2410_I2C | 689 | config HAVE_S3C2410_I2C |
680 | bool | 690 | bool |
681 | help | 691 | help |
@@ -764,6 +774,19 @@ config I2C_STU300 | |||
764 | This driver can also be built as a module. If so, the module | 774 | This driver can also be built as a module. If so, the module |
765 | will be called i2c-stu300. | 775 | will be called i2c-stu300. |
766 | 776 | ||
777 | config I2C_SUN6I_P2WI | ||
778 | tristate "Allwinner sun6i internal P2WI controller" | ||
779 | depends on RESET_CONTROLLER | ||
780 | depends on MACH_SUN6I || COMPILE_TEST | ||
781 | help | ||
782 | If you say yes to this option, support will be included for the | ||
783 | P2WI (Push/Pull 2 Wire Interface) controller embedded in some sunxi | ||
784 | SOCs. | ||
785 | The P2WI looks like an SMBus controller (which supports only byte | ||
786 | accesses), except that it only supports one slave device. | ||
787 | This interface is used to connect to specific PMIC devices (like the | ||
788 | AXP221). | ||
789 | |||
767 | config I2C_TEGRA | 790 | config I2C_TEGRA |
768 | tristate "NVIDIA Tegra internal I2C controller" | 791 | tristate "NVIDIA Tegra internal I2C controller" |
769 | depends on ARCH_TEGRA | 792 | depends on ARCH_TEGRA |
diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile index 298692cc6000..dd9a7f8e873f 100644 --- a/drivers/i2c/busses/Makefile +++ b/drivers/i2c/busses/Makefile | |||
@@ -66,6 +66,7 @@ obj-$(CONFIG_I2C_PXA) += i2c-pxa.o | |||
66 | obj-$(CONFIG_I2C_PXA_PCI) += i2c-pxa-pci.o | 66 | obj-$(CONFIG_I2C_PXA_PCI) += i2c-pxa-pci.o |
67 | obj-$(CONFIG_I2C_QUP) += i2c-qup.o | 67 | obj-$(CONFIG_I2C_QUP) += i2c-qup.o |
68 | obj-$(CONFIG_I2C_RIIC) += i2c-riic.o | 68 | obj-$(CONFIG_I2C_RIIC) += i2c-riic.o |
69 | obj-$(CONFIG_I2C_RK3X) += i2c-rk3x.o | ||
69 | obj-$(CONFIG_I2C_S3C2410) += i2c-s3c2410.o | 70 | obj-$(CONFIG_I2C_S3C2410) += i2c-s3c2410.o |
70 | obj-$(CONFIG_I2C_S6000) += i2c-s6000.o | 71 | obj-$(CONFIG_I2C_S6000) += i2c-s6000.o |
71 | obj-$(CONFIG_I2C_SH7760) += i2c-sh7760.o | 72 | obj-$(CONFIG_I2C_SH7760) += i2c-sh7760.o |
@@ -74,6 +75,7 @@ obj-$(CONFIG_I2C_SIMTEC) += i2c-simtec.o | |||
74 | obj-$(CONFIG_I2C_SIRF) += i2c-sirf.o | 75 | obj-$(CONFIG_I2C_SIRF) += i2c-sirf.o |
75 | obj-$(CONFIG_I2C_ST) += i2c-st.o | 76 | obj-$(CONFIG_I2C_ST) += i2c-st.o |
76 | obj-$(CONFIG_I2C_STU300) += i2c-stu300.o | 77 | obj-$(CONFIG_I2C_STU300) += i2c-stu300.o |
78 | obj-$(CONFIG_I2C_SUN6I_P2WI) += i2c-sun6i-p2wi.o | ||
77 | obj-$(CONFIG_I2C_TEGRA) += i2c-tegra.o | 79 | obj-$(CONFIG_I2C_TEGRA) += i2c-tegra.o |
78 | obj-$(CONFIG_I2C_VERSATILE) += i2c-versatile.o | 80 | obj-$(CONFIG_I2C_VERSATILE) += i2c-versatile.o |
79 | obj-$(CONFIG_I2C_WMT) += i2c-wmt.o | 81 | obj-$(CONFIG_I2C_WMT) += i2c-wmt.o |
diff --git a/drivers/i2c/busses/i2c-rk3x.c b/drivers/i2c/busses/i2c-rk3x.c new file mode 100644 index 000000000000..a9791509966a --- /dev/null +++ b/drivers/i2c/busses/i2c-rk3x.c | |||
@@ -0,0 +1,763 @@ | |||
1 | /* | ||
2 | * Driver for I2C adapter in Rockchip RK3xxx SoC | ||
3 | * | ||
4 | * Max Schwarz <max.schwarz@online.de> | ||
5 | * based on the patches by Rockchip Inc. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/module.h> | ||
14 | #include <linux/i2c.h> | ||
15 | #include <linux/interrupt.h> | ||
16 | #include <linux/errno.h> | ||
17 | #include <linux/err.h> | ||
18 | #include <linux/platform_device.h> | ||
19 | #include <linux/io.h> | ||
20 | #include <linux/of_address.h> | ||
21 | #include <linux/of_irq.h> | ||
22 | #include <linux/spinlock.h> | ||
23 | #include <linux/clk.h> | ||
24 | #include <linux/wait.h> | ||
25 | #include <linux/mfd/syscon.h> | ||
26 | #include <linux/regmap.h> | ||
27 | |||
28 | |||
29 | /* Register Map */ | ||
30 | #define REG_CON 0x00 /* control register */ | ||
31 | #define REG_CLKDIV 0x04 /* clock divisor register */ | ||
32 | #define REG_MRXADDR 0x08 /* slave address for REGISTER_TX */ | ||
33 | #define REG_MRXRADDR 0x0c /* slave register address for REGISTER_TX */ | ||
34 | #define REG_MTXCNT 0x10 /* number of bytes to be transmitted */ | ||
35 | #define REG_MRXCNT 0x14 /* number of bytes to be received */ | ||
36 | #define REG_IEN 0x18 /* interrupt enable */ | ||
37 | #define REG_IPD 0x1c /* interrupt pending */ | ||
38 | #define REG_FCNT 0x20 /* finished count */ | ||
39 | |||
40 | /* Data buffer offsets */ | ||
41 | #define TXBUFFER_BASE 0x100 | ||
42 | #define RXBUFFER_BASE 0x200 | ||
43 | |||
44 | /* REG_CON bits */ | ||
45 | #define REG_CON_EN BIT(0) | ||
46 | enum { | ||
47 | REG_CON_MOD_TX = 0, /* transmit data */ | ||
48 | REG_CON_MOD_REGISTER_TX, /* select register and restart */ | ||
49 | REG_CON_MOD_RX, /* receive data */ | ||
50 | REG_CON_MOD_REGISTER_RX, /* broken: transmits read addr AND writes | ||
51 | * register addr */ | ||
52 | }; | ||
53 | #define REG_CON_MOD(mod) ((mod) << 1) | ||
54 | #define REG_CON_MOD_MASK (BIT(1) | BIT(2)) | ||
55 | #define REG_CON_START BIT(3) | ||
56 | #define REG_CON_STOP BIT(4) | ||
57 | #define REG_CON_LASTACK BIT(5) /* 1: send NACK after last received byte */ | ||
58 | #define REG_CON_ACTACK BIT(6) /* 1: stop if NACK is received */ | ||
59 | |||
60 | /* REG_MRXADDR bits */ | ||
61 | #define REG_MRXADDR_VALID(x) BIT(24 + (x)) /* [x*8+7:x*8] of MRX[R]ADDR valid */ | ||
62 | |||
63 | /* REG_IEN/REG_IPD bits */ | ||
64 | #define REG_INT_BTF BIT(0) /* a byte was transmitted */ | ||
65 | #define REG_INT_BRF BIT(1) /* a byte was received */ | ||
66 | #define REG_INT_MBTF BIT(2) /* master data transmit finished */ | ||
67 | #define REG_INT_MBRF BIT(3) /* master data receive finished */ | ||
68 | #define REG_INT_START BIT(4) /* START condition generated */ | ||
69 | #define REG_INT_STOP BIT(5) /* STOP condition generated */ | ||
70 | #define REG_INT_NAKRCV BIT(6) /* NACK received */ | ||
71 | #define REG_INT_ALL 0x7f | ||
72 | |||
73 | /* Constants */ | ||
74 | #define WAIT_TIMEOUT 200 /* ms */ | ||
75 | #define DEFAULT_SCL_RATE (100 * 1000) /* Hz */ | ||
76 | |||
77 | enum rk3x_i2c_state { | ||
78 | STATE_IDLE, | ||
79 | STATE_START, | ||
80 | STATE_READ, | ||
81 | STATE_WRITE, | ||
82 | STATE_STOP | ||
83 | }; | ||
84 | |||
85 | /** | ||
86 | * @grf_offset: offset inside the grf regmap for setting the i2c type | ||
87 | */ | ||
88 | struct rk3x_i2c_soc_data { | ||
89 | int grf_offset; | ||
90 | }; | ||
91 | |||
92 | struct rk3x_i2c { | ||
93 | struct i2c_adapter adap; | ||
94 | struct device *dev; | ||
95 | struct rk3x_i2c_soc_data *soc_data; | ||
96 | |||
97 | /* Hardware resources */ | ||
98 | void __iomem *regs; | ||
99 | struct clk *clk; | ||
100 | |||
101 | /* Settings */ | ||
102 | unsigned int scl_frequency; | ||
103 | |||
104 | /* Synchronization & notification */ | ||
105 | spinlock_t lock; | ||
106 | wait_queue_head_t wait; | ||
107 | bool busy; | ||
108 | |||
109 | /* Current message */ | ||
110 | struct i2c_msg *msg; | ||
111 | u8 addr; | ||
112 | unsigned int mode; | ||
113 | bool is_last_msg; | ||
114 | |||
115 | /* I2C state machine */ | ||
116 | enum rk3x_i2c_state state; | ||
117 | unsigned int processed; /* sent/received bytes */ | ||
118 | int error; | ||
119 | }; | ||
120 | |||
121 | static inline void i2c_writel(struct rk3x_i2c *i2c, u32 value, | ||
122 | unsigned int offset) | ||
123 | { | ||
124 | writel(value, i2c->regs + offset); | ||
125 | } | ||
126 | |||
127 | static inline u32 i2c_readl(struct rk3x_i2c *i2c, unsigned int offset) | ||
128 | { | ||
129 | return readl(i2c->regs + offset); | ||
130 | } | ||
131 | |||
132 | /* Reset all interrupt pending bits */ | ||
133 | static inline void rk3x_i2c_clean_ipd(struct rk3x_i2c *i2c) | ||
134 | { | ||
135 | i2c_writel(i2c, REG_INT_ALL, REG_IPD); | ||
136 | } | ||
137 | |||
138 | /** | ||
139 | * Generate a START condition, which triggers a REG_INT_START interrupt. | ||
140 | */ | ||
141 | static void rk3x_i2c_start(struct rk3x_i2c *i2c) | ||
142 | { | ||
143 | u32 val; | ||
144 | |||
145 | rk3x_i2c_clean_ipd(i2c); | ||
146 | i2c_writel(i2c, REG_INT_START, REG_IEN); | ||
147 | |||
148 | /* enable adapter with correct mode, send START condition */ | ||
149 | val = REG_CON_EN | REG_CON_MOD(i2c->mode) | REG_CON_START; | ||
150 | |||
151 | /* if we want to react to NACK, set ACTACK bit */ | ||
152 | if (!(i2c->msg->flags & I2C_M_IGNORE_NAK)) | ||
153 | val |= REG_CON_ACTACK; | ||
154 | |||
155 | i2c_writel(i2c, val, REG_CON); | ||
156 | } | ||
157 | |||
158 | /** | ||
159 | * Generate a STOP condition, which triggers a REG_INT_STOP interrupt. | ||
160 | * | ||
161 | * @error: Error code to return in rk3x_i2c_xfer | ||
162 | */ | ||
163 | static void rk3x_i2c_stop(struct rk3x_i2c *i2c, int error) | ||
164 | { | ||
165 | unsigned int ctrl; | ||
166 | |||
167 | i2c->processed = 0; | ||
168 | i2c->msg = NULL; | ||
169 | i2c->error = error; | ||
170 | |||
171 | if (i2c->is_last_msg) { | ||
172 | /* Enable stop interrupt */ | ||
173 | i2c_writel(i2c, REG_INT_STOP, REG_IEN); | ||
174 | |||
175 | i2c->state = STATE_STOP; | ||
176 | |||
177 | ctrl = i2c_readl(i2c, REG_CON); | ||
178 | ctrl |= REG_CON_STOP; | ||
179 | i2c_writel(i2c, ctrl, REG_CON); | ||
180 | } else { | ||
181 | /* Signal rk3x_i2c_xfer to start the next message. */ | ||
182 | i2c->busy = false; | ||
183 | i2c->state = STATE_IDLE; | ||
184 | |||
185 | /* | ||
186 | * The HW is actually not capable of REPEATED START. But we can | ||
187 | * get the intended effect by resetting its internal state | ||
188 | * and issuing an ordinary START. | ||
189 | */ | ||
190 | i2c_writel(i2c, 0, REG_CON); | ||
191 | |||
192 | /* signal that we are finished with the current msg */ | ||
193 | wake_up(&i2c->wait); | ||
194 | } | ||
195 | } | ||
196 | |||
197 | /** | ||
198 | * Setup a read according to i2c->msg | ||
199 | */ | ||
200 | static void rk3x_i2c_prepare_read(struct rk3x_i2c *i2c) | ||
201 | { | ||
202 | unsigned int len = i2c->msg->len - i2c->processed; | ||
203 | u32 con; | ||
204 | |||
205 | con = i2c_readl(i2c, REG_CON); | ||
206 | |||
207 | /* | ||
208 | * The hw can read up to 32 bytes at a time. If we need more than one | ||
209 | * chunk, send an ACK after the last byte of the current chunk. | ||
210 | */ | ||
211 | if (unlikely(len > 32)) { | ||
212 | len = 32; | ||
213 | con &= ~REG_CON_LASTACK; | ||
214 | } else { | ||
215 | con |= REG_CON_LASTACK; | ||
216 | } | ||
217 | |||
218 | /* make sure we are in plain RX mode if we read a second chunk */ | ||
219 | if (i2c->processed != 0) { | ||
220 | con &= ~REG_CON_MOD_MASK; | ||
221 | con |= REG_CON_MOD(REG_CON_MOD_RX); | ||
222 | } | ||
223 | |||
224 | i2c_writel(i2c, con, REG_CON); | ||
225 | i2c_writel(i2c, len, REG_MRXCNT); | ||
226 | } | ||
227 | |||
228 | /** | ||
229 | * Fill the transmit buffer with data from i2c->msg | ||
230 | */ | ||
231 | static void rk3x_i2c_fill_transmit_buf(struct rk3x_i2c *i2c) | ||
232 | { | ||
233 | unsigned int i, j; | ||
234 | u32 cnt = 0; | ||
235 | u32 val; | ||
236 | u8 byte; | ||
237 | |||
238 | for (i = 0; i < 8; ++i) { | ||
239 | val = 0; | ||
240 | for (j = 0; j < 4; ++j) { | ||
241 | if (i2c->processed == i2c->msg->len) | ||
242 | break; | ||
243 | |||
244 | if (i2c->processed == 0 && cnt == 0) | ||
245 | byte = (i2c->addr & 0x7f) << 1; | ||
246 | else | ||
247 | byte = i2c->msg->buf[i2c->processed++]; | ||
248 | |||
249 | val |= byte << (j * 8); | ||
250 | cnt++; | ||
251 | } | ||
252 | |||
253 | i2c_writel(i2c, val, TXBUFFER_BASE + 4 * i); | ||
254 | |||
255 | if (i2c->processed == i2c->msg->len) | ||
256 | break; | ||
257 | } | ||
258 | |||
259 | i2c_writel(i2c, cnt, REG_MTXCNT); | ||
260 | } | ||
261 | |||
262 | |||
263 | /* IRQ handlers for individual states */ | ||
264 | |||
265 | static void rk3x_i2c_handle_start(struct rk3x_i2c *i2c, unsigned int ipd) | ||
266 | { | ||
267 | if (!(ipd & REG_INT_START)) { | ||
268 | rk3x_i2c_stop(i2c, -EIO); | ||
269 | dev_warn(i2c->dev, "unexpected irq in START: 0x%x\n", ipd); | ||
270 | rk3x_i2c_clean_ipd(i2c); | ||
271 | return; | ||
272 | } | ||
273 | |||
274 | /* ack interrupt */ | ||
275 | i2c_writel(i2c, REG_INT_START, REG_IPD); | ||
276 | |||
277 | /* disable start bit */ | ||
278 | i2c_writel(i2c, i2c_readl(i2c, REG_CON) & ~REG_CON_START, REG_CON); | ||
279 | |||
280 | /* enable appropriate interrupts and transition */ | ||
281 | if (i2c->mode == REG_CON_MOD_TX) { | ||
282 | i2c_writel(i2c, REG_INT_MBTF | REG_INT_NAKRCV, REG_IEN); | ||
283 | i2c->state = STATE_WRITE; | ||
284 | rk3x_i2c_fill_transmit_buf(i2c); | ||
285 | } else { | ||
286 | /* in any other case, we are going to be reading. */ | ||
287 | i2c_writel(i2c, REG_INT_MBRF | REG_INT_NAKRCV, REG_IEN); | ||
288 | i2c->state = STATE_READ; | ||
289 | rk3x_i2c_prepare_read(i2c); | ||
290 | } | ||
291 | } | ||
292 | |||
293 | static void rk3x_i2c_handle_write(struct rk3x_i2c *i2c, unsigned int ipd) | ||
294 | { | ||
295 | if (!(ipd & REG_INT_MBTF)) { | ||
296 | rk3x_i2c_stop(i2c, -EIO); | ||
297 | dev_err(i2c->dev, "unexpected irq in WRITE: 0x%x\n", ipd); | ||
298 | rk3x_i2c_clean_ipd(i2c); | ||
299 | return; | ||
300 | } | ||
301 | |||
302 | /* ack interrupt */ | ||
303 | i2c_writel(i2c, REG_INT_MBTF, REG_IPD); | ||
304 | |||
305 | /* are we finished? */ | ||
306 | if (i2c->processed == i2c->msg->len) | ||
307 | rk3x_i2c_stop(i2c, i2c->error); | ||
308 | else | ||
309 | rk3x_i2c_fill_transmit_buf(i2c); | ||
310 | } | ||
311 | |||
312 | static void rk3x_i2c_handle_read(struct rk3x_i2c *i2c, unsigned int ipd) | ||
313 | { | ||
314 | unsigned int i; | ||
315 | unsigned int len = i2c->msg->len - i2c->processed; | ||
316 | u32 uninitialized_var(val); | ||
317 | u8 byte; | ||
318 | |||
319 | /* we only care for MBRF here. */ | ||
320 | if (!(ipd & REG_INT_MBRF)) | ||
321 | return; | ||
322 | |||
323 | /* ack interrupt */ | ||
324 | i2c_writel(i2c, REG_INT_MBRF, REG_IPD); | ||
325 | |||
326 | /* read the data from receive buffer */ | ||
327 | for (i = 0; i < len; ++i) { | ||
328 | if (i % 4 == 0) | ||
329 | val = i2c_readl(i2c, RXBUFFER_BASE + (i / 4) * 4); | ||
330 | |||
331 | byte = (val >> ((i % 4) * 8)) & 0xff; | ||
332 | i2c->msg->buf[i2c->processed++] = byte; | ||
333 | } | ||
334 | |||
335 | /* are we finished? */ | ||
336 | if (i2c->processed == i2c->msg->len) | ||
337 | rk3x_i2c_stop(i2c, i2c->error); | ||
338 | else | ||
339 | rk3x_i2c_prepare_read(i2c); | ||
340 | } | ||
341 | |||
342 | static void rk3x_i2c_handle_stop(struct rk3x_i2c *i2c, unsigned int ipd) | ||
343 | { | ||
344 | unsigned int con; | ||
345 | |||
346 | if (!(ipd & REG_INT_STOP)) { | ||
347 | rk3x_i2c_stop(i2c, -EIO); | ||
348 | dev_err(i2c->dev, "unexpected irq in STOP: 0x%x\n", ipd); | ||
349 | rk3x_i2c_clean_ipd(i2c); | ||
350 | return; | ||
351 | } | ||
352 | |||
353 | /* ack interrupt */ | ||
354 | i2c_writel(i2c, REG_INT_STOP, REG_IPD); | ||
355 | |||
356 | /* disable STOP bit */ | ||
357 | con = i2c_readl(i2c, REG_CON); | ||
358 | con &= ~REG_CON_STOP; | ||
359 | i2c_writel(i2c, con, REG_CON); | ||
360 | |||
361 | i2c->busy = false; | ||
362 | i2c->state = STATE_IDLE; | ||
363 | |||
364 | /* signal rk3x_i2c_xfer that we are finished */ | ||
365 | wake_up(&i2c->wait); | ||
366 | } | ||
367 | |||
368 | static irqreturn_t rk3x_i2c_irq(int irqno, void *dev_id) | ||
369 | { | ||
370 | struct rk3x_i2c *i2c = dev_id; | ||
371 | unsigned int ipd; | ||
372 | |||
373 | spin_lock(&i2c->lock); | ||
374 | |||
375 | ipd = i2c_readl(i2c, REG_IPD); | ||
376 | if (i2c->state == STATE_IDLE) { | ||
377 | dev_warn(i2c->dev, "irq in STATE_IDLE, ipd = 0x%x\n", ipd); | ||
378 | rk3x_i2c_clean_ipd(i2c); | ||
379 | goto out; | ||
380 | } | ||
381 | |||
382 | dev_dbg(i2c->dev, "IRQ: state %d, ipd: %x\n", i2c->state, ipd); | ||
383 | |||
384 | /* Clean interrupt bits we don't care about */ | ||
385 | ipd &= ~(REG_INT_BRF | REG_INT_BTF); | ||
386 | |||
387 | if (ipd & REG_INT_NAKRCV) { | ||
388 | /* | ||
389 | * We got a NACK in the last operation. Depending on whether | ||
390 | * IGNORE_NAK is set, we have to stop the operation and report | ||
391 | * an error. | ||
392 | */ | ||
393 | i2c_writel(i2c, REG_INT_NAKRCV, REG_IPD); | ||
394 | |||
395 | ipd &= ~REG_INT_NAKRCV; | ||
396 | |||
397 | if (!(i2c->msg->flags & I2C_M_IGNORE_NAK)) | ||
398 | rk3x_i2c_stop(i2c, -ENXIO); | ||
399 | } | ||
400 | |||
401 | /* is there anything left to handle? */ | ||
402 | if (unlikely(ipd == 0)) | ||
403 | goto out; | ||
404 | |||
405 | switch (i2c->state) { | ||
406 | case STATE_START: | ||
407 | rk3x_i2c_handle_start(i2c, ipd); | ||
408 | break; | ||
409 | case STATE_WRITE: | ||
410 | rk3x_i2c_handle_write(i2c, ipd); | ||
411 | break; | ||
412 | case STATE_READ: | ||
413 | rk3x_i2c_handle_read(i2c, ipd); | ||
414 | break; | ||
415 | case STATE_STOP: | ||
416 | rk3x_i2c_handle_stop(i2c, ipd); | ||
417 | break; | ||
418 | case STATE_IDLE: | ||
419 | break; | ||
420 | } | ||
421 | |||
422 | out: | ||
423 | spin_unlock(&i2c->lock); | ||
424 | return IRQ_HANDLED; | ||
425 | } | ||
426 | |||
427 | static void rk3x_i2c_set_scl_rate(struct rk3x_i2c *i2c, unsigned long scl_rate) | ||
428 | { | ||
429 | unsigned long i2c_rate = clk_get_rate(i2c->clk); | ||
430 | unsigned int div; | ||
431 | |||
432 | /* SCL rate = (clk rate) / (8 * DIV) */ | ||
433 | div = DIV_ROUND_UP(i2c_rate, scl_rate * 8); | ||
434 | |||
435 | /* The lower and upper half of the CLKDIV reg describe the length of | ||
436 | * SCL low & high periods. */ | ||
437 | div = DIV_ROUND_UP(div, 2); | ||
438 | |||
439 | i2c_writel(i2c, (div << 16) | (div & 0xffff), REG_CLKDIV); | ||
440 | } | ||
441 | |||
442 | /** | ||
443 | * Setup I2C registers for an I2C operation specified by msgs, num. | ||
444 | * | ||
445 | * Must be called with i2c->lock held. | ||
446 | * | ||
447 | * @msgs: I2C msgs to process | ||
448 | * @num: Number of msgs | ||
449 | * | ||
450 | * returns: Number of I2C msgs processed or negative in case of error | ||
451 | */ | ||
452 | static int rk3x_i2c_setup(struct rk3x_i2c *i2c, struct i2c_msg *msgs, int num) | ||
453 | { | ||
454 | u32 addr = (msgs[0].addr & 0x7f) << 1; | ||
455 | int ret = 0; | ||
456 | |||
457 | /* | ||
458 | * The I2C adapter can issue a small (len < 4) write packet before | ||
459 | * reading. This speeds up SMBus-style register reads. | ||
460 | * The MRXADDR/MRXRADDR hold the slave address and the slave register | ||
461 | * address in this case. | ||
462 | */ | ||
463 | |||
464 | if (num >= 2 && msgs[0].len < 4 && | ||
465 | !(msgs[0].flags & I2C_M_RD) && (msgs[1].flags & I2C_M_RD)) { | ||
466 | u32 reg_addr = 0; | ||
467 | int i; | ||
468 | |||
469 | dev_dbg(i2c->dev, "Combined write/read from addr 0x%x\n", | ||
470 | addr >> 1); | ||
471 | |||
472 | /* Fill MRXRADDR with the register address(es) */ | ||
473 | for (i = 0; i < msgs[0].len; ++i) { | ||
474 | reg_addr |= msgs[0].buf[i] << (i * 8); | ||
475 | reg_addr |= REG_MRXADDR_VALID(i); | ||
476 | } | ||
477 | |||
478 | /* msgs[0] is handled by hw. */ | ||
479 | i2c->msg = &msgs[1]; | ||
480 | |||
481 | i2c->mode = REG_CON_MOD_REGISTER_TX; | ||
482 | |||
483 | i2c_writel(i2c, addr | REG_MRXADDR_VALID(0), REG_MRXADDR); | ||
484 | i2c_writel(i2c, reg_addr, REG_MRXRADDR); | ||
485 | |||
486 | ret = 2; | ||
487 | } else { | ||
488 | /* | ||
489 | * We'll have to do it the boring way and process the msgs | ||
490 | * one-by-one. | ||
491 | */ | ||
492 | |||
493 | if (msgs[0].flags & I2C_M_RD) { | ||
494 | addr |= 1; /* set read bit */ | ||
495 | |||
496 | /* | ||
497 | * We have to transmit the slave addr first. Use | ||
498 | * MOD_REGISTER_TX for that purpose. | ||
499 | */ | ||
500 | i2c->mode = REG_CON_MOD_REGISTER_TX; | ||
501 | i2c_writel(i2c, addr | REG_MRXADDR_VALID(0), | ||
502 | REG_MRXADDR); | ||
503 | i2c_writel(i2c, 0, REG_MRXRADDR); | ||
504 | } else { | ||
505 | i2c->mode = REG_CON_MOD_TX; | ||
506 | } | ||
507 | |||
508 | i2c->msg = &msgs[0]; | ||
509 | |||
510 | ret = 1; | ||
511 | } | ||
512 | |||
513 | i2c->addr = msgs[0].addr; | ||
514 | i2c->busy = true; | ||
515 | i2c->state = STATE_START; | ||
516 | i2c->processed = 0; | ||
517 | i2c->error = 0; | ||
518 | |||
519 | rk3x_i2c_clean_ipd(i2c); | ||
520 | |||
521 | return ret; | ||
522 | } | ||
523 | |||
524 | static int rk3x_i2c_xfer(struct i2c_adapter *adap, | ||
525 | struct i2c_msg *msgs, int num) | ||
526 | { | ||
527 | struct rk3x_i2c *i2c = (struct rk3x_i2c *)adap->algo_data; | ||
528 | unsigned long timeout, flags; | ||
529 | int ret = 0; | ||
530 | int i; | ||
531 | |||
532 | spin_lock_irqsave(&i2c->lock, flags); | ||
533 | |||
534 | clk_enable(i2c->clk); | ||
535 | |||
536 | /* The clock rate might have changed, so setup the divider again */ | ||
537 | rk3x_i2c_set_scl_rate(i2c, i2c->scl_frequency); | ||
538 | |||
539 | i2c->is_last_msg = false; | ||
540 | |||
541 | /* | ||
542 | * Process msgs. We can handle more than one message at once (see | ||
543 | * rk3x_i2c_setup()). | ||
544 | */ | ||
545 | for (i = 0; i < num; i += ret) { | ||
546 | ret = rk3x_i2c_setup(i2c, msgs + i, num - i); | ||
547 | |||
548 | if (ret < 0) { | ||
549 | dev_err(i2c->dev, "rk3x_i2c_setup() failed\n"); | ||
550 | break; | ||
551 | } | ||
552 | |||
553 | if (i + ret >= num) | ||
554 | i2c->is_last_msg = true; | ||
555 | |||
556 | spin_unlock_irqrestore(&i2c->lock, flags); | ||
557 | |||
558 | rk3x_i2c_start(i2c); | ||
559 | |||
560 | timeout = wait_event_timeout(i2c->wait, !i2c->busy, | ||
561 | msecs_to_jiffies(WAIT_TIMEOUT)); | ||
562 | |||
563 | spin_lock_irqsave(&i2c->lock, flags); | ||
564 | |||
565 | if (timeout == 0) { | ||
566 | dev_err(i2c->dev, "timeout, ipd: 0x%02x, state: %d\n", | ||
567 | i2c_readl(i2c, REG_IPD), i2c->state); | ||
568 | |||
569 | /* Force a STOP condition without interrupt */ | ||
570 | i2c_writel(i2c, 0, REG_IEN); | ||
571 | i2c_writel(i2c, REG_CON_EN | REG_CON_STOP, REG_CON); | ||
572 | |||
573 | i2c->state = STATE_IDLE; | ||
574 | |||
575 | ret = -ETIMEDOUT; | ||
576 | break; | ||
577 | } | ||
578 | |||
579 | if (i2c->error) { | ||
580 | ret = i2c->error; | ||
581 | break; | ||
582 | } | ||
583 | } | ||
584 | |||
585 | clk_disable(i2c->clk); | ||
586 | spin_unlock_irqrestore(&i2c->lock, flags); | ||
587 | |||
588 | return ret; | ||
589 | } | ||
590 | |||
591 | static u32 rk3x_i2c_func(struct i2c_adapter *adap) | ||
592 | { | ||
593 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | I2C_FUNC_PROTOCOL_MANGLING; | ||
594 | } | ||
595 | |||
596 | static const struct i2c_algorithm rk3x_i2c_algorithm = { | ||
597 | .master_xfer = rk3x_i2c_xfer, | ||
598 | .functionality = rk3x_i2c_func, | ||
599 | }; | ||
600 | |||
601 | static struct rk3x_i2c_soc_data soc_data[3] = { | ||
602 | { .grf_offset = 0x154 }, /* rk3066 */ | ||
603 | { .grf_offset = 0x0a4 }, /* rk3188 */ | ||
604 | { .grf_offset = -1 }, /* no I2C switching needed */ | ||
605 | }; | ||
606 | |||
607 | static const struct of_device_id rk3x_i2c_match[] = { | ||
608 | { .compatible = "rockchip,rk3066-i2c", .data = (void *)&soc_data[0] }, | ||
609 | { .compatible = "rockchip,rk3188-i2c", .data = (void *)&soc_data[1] }, | ||
610 | { .compatible = "rockchip,rk3288-i2c", .data = (void *)&soc_data[2] }, | ||
611 | {}, | ||
612 | }; | ||
613 | |||
614 | static int rk3x_i2c_probe(struct platform_device *pdev) | ||
615 | { | ||
616 | struct device_node *np = pdev->dev.of_node; | ||
617 | const struct of_device_id *match; | ||
618 | struct rk3x_i2c *i2c; | ||
619 | struct resource *mem; | ||
620 | int ret = 0; | ||
621 | int bus_nr; | ||
622 | u32 value; | ||
623 | int irq; | ||
624 | |||
625 | i2c = devm_kzalloc(&pdev->dev, sizeof(struct rk3x_i2c), GFP_KERNEL); | ||
626 | if (!i2c) | ||
627 | return -ENOMEM; | ||
628 | |||
629 | match = of_match_node(rk3x_i2c_match, np); | ||
630 | i2c->soc_data = (struct rk3x_i2c_soc_data *)match->data; | ||
631 | |||
632 | if (of_property_read_u32(pdev->dev.of_node, "clock-frequency", | ||
633 | &i2c->scl_frequency)) { | ||
634 | dev_info(&pdev->dev, "using default SCL frequency: %d\n", | ||
635 | DEFAULT_SCL_RATE); | ||
636 | i2c->scl_frequency = DEFAULT_SCL_RATE; | ||
637 | } | ||
638 | |||
639 | if (i2c->scl_frequency == 0 || i2c->scl_frequency > 400 * 1000) { | ||
640 | dev_warn(&pdev->dev, "invalid SCL frequency specified.\n"); | ||
641 | dev_warn(&pdev->dev, "using default SCL frequency: %d\n", | ||
642 | DEFAULT_SCL_RATE); | ||
643 | i2c->scl_frequency = DEFAULT_SCL_RATE; | ||
644 | } | ||
645 | |||
646 | strlcpy(i2c->adap.name, "rk3x-i2c", sizeof(i2c->adap.name)); | ||
647 | i2c->adap.owner = THIS_MODULE; | ||
648 | i2c->adap.algo = &rk3x_i2c_algorithm; | ||
649 | i2c->adap.retries = 3; | ||
650 | i2c->adap.dev.of_node = np; | ||
651 | i2c->adap.algo_data = i2c; | ||
652 | i2c->adap.dev.parent = &pdev->dev; | ||
653 | |||
654 | i2c->dev = &pdev->dev; | ||
655 | |||
656 | spin_lock_init(&i2c->lock); | ||
657 | init_waitqueue_head(&i2c->wait); | ||
658 | |||
659 | i2c->clk = devm_clk_get(&pdev->dev, NULL); | ||
660 | if (IS_ERR(i2c->clk)) { | ||
661 | dev_err(&pdev->dev, "cannot get clock\n"); | ||
662 | return PTR_ERR(i2c->clk); | ||
663 | } | ||
664 | |||
665 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
666 | i2c->regs = devm_ioremap_resource(&pdev->dev, mem); | ||
667 | if (IS_ERR(i2c->regs)) | ||
668 | return PTR_ERR(i2c->regs); | ||
669 | |||
670 | /* Try to set the I2C adapter number from dt */ | ||
671 | bus_nr = of_alias_get_id(np, "i2c"); | ||
672 | |||
673 | /* | ||
674 | * Switch to new interface if the SoC also offers the old one. | ||
675 | * The control bit is located in the GRF register space. | ||
676 | */ | ||
677 | if (i2c->soc_data->grf_offset >= 0) { | ||
678 | struct regmap *grf; | ||
679 | |||
680 | grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf"); | ||
681 | if (IS_ERR(grf)) { | ||
682 | dev_err(&pdev->dev, | ||
683 | "rk3x-i2c needs 'rockchip,grf' property\n"); | ||
684 | return PTR_ERR(grf); | ||
685 | } | ||
686 | |||
687 | if (bus_nr < 0) { | ||
688 | dev_err(&pdev->dev, "rk3x-i2c needs i2cX alias"); | ||
689 | return -EINVAL; | ||
690 | } | ||
691 | |||
692 | /* 27+i: write mask, 11+i: value */ | ||
693 | value = BIT(27 + bus_nr) | BIT(11 + bus_nr); | ||
694 | |||
695 | ret = regmap_write(grf, i2c->soc_data->grf_offset, value); | ||
696 | if (ret != 0) { | ||
697 | dev_err(i2c->dev, "Could not write to GRF: %d\n", ret); | ||
698 | return ret; | ||
699 | } | ||
700 | } | ||
701 | |||
702 | /* IRQ setup */ | ||
703 | irq = platform_get_irq(pdev, 0); | ||
704 | if (irq < 0) { | ||
705 | dev_err(&pdev->dev, "cannot find rk3x IRQ\n"); | ||
706 | return irq; | ||
707 | } | ||
708 | |||
709 | ret = devm_request_irq(&pdev->dev, irq, rk3x_i2c_irq, | ||
710 | 0, dev_name(&pdev->dev), i2c); | ||
711 | if (ret < 0) { | ||
712 | dev_err(&pdev->dev, "cannot request IRQ\n"); | ||
713 | return ret; | ||
714 | } | ||
715 | |||
716 | platform_set_drvdata(pdev, i2c); | ||
717 | |||
718 | ret = clk_prepare(i2c->clk); | ||
719 | if (ret < 0) { | ||
720 | dev_err(&pdev->dev, "Could not prepare clock\n"); | ||
721 | return ret; | ||
722 | } | ||
723 | |||
724 | ret = i2c_add_adapter(&i2c->adap); | ||
725 | if (ret < 0) { | ||
726 | dev_err(&pdev->dev, "Could not register adapter\n"); | ||
727 | goto err_clk; | ||
728 | } | ||
729 | |||
730 | dev_info(&pdev->dev, "Initialized RK3xxx I2C bus at %p\n", i2c->regs); | ||
731 | |||
732 | return 0; | ||
733 | |||
734 | err_clk: | ||
735 | clk_unprepare(i2c->clk); | ||
736 | return ret; | ||
737 | } | ||
738 | |||
739 | static int rk3x_i2c_remove(struct platform_device *pdev) | ||
740 | { | ||
741 | struct rk3x_i2c *i2c = platform_get_drvdata(pdev); | ||
742 | |||
743 | i2c_del_adapter(&i2c->adap); | ||
744 | clk_unprepare(i2c->clk); | ||
745 | |||
746 | return 0; | ||
747 | } | ||
748 | |||
749 | static struct platform_driver rk3x_i2c_driver = { | ||
750 | .probe = rk3x_i2c_probe, | ||
751 | .remove = rk3x_i2c_remove, | ||
752 | .driver = { | ||
753 | .owner = THIS_MODULE, | ||
754 | .name = "rk3x-i2c", | ||
755 | .of_match_table = rk3x_i2c_match, | ||
756 | }, | ||
757 | }; | ||
758 | |||
759 | module_platform_driver(rk3x_i2c_driver); | ||
760 | |||
761 | MODULE_DESCRIPTION("Rockchip RK3xxx I2C Bus driver"); | ||
762 | MODULE_AUTHOR("Max Schwarz <max.schwarz@online.de>"); | ||
763 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/i2c/busses/i2c-sun6i-p2wi.c b/drivers/i2c/busses/i2c-sun6i-p2wi.c new file mode 100644 index 000000000000..4d75d4759709 --- /dev/null +++ b/drivers/i2c/busses/i2c-sun6i-p2wi.c | |||
@@ -0,0 +1,344 @@ | |||
1 | /* | ||
2 | * P2WI (Push-Pull Two Wire Interface) bus driver. | ||
3 | * | ||
4 | * Author: Boris BREZILLON <boris.brezillon@free-electrons.com> | ||
5 | * | ||
6 | * This file is licensed under the terms of the GNU General Public License | ||
7 | * version 2. This program is licensed "as is" without any warranty of any | ||
8 | * kind, whether express or implied. | ||
9 | * | ||
10 | * The P2WI controller looks like an SMBus controller which only supports byte | ||
11 | * data transfers. But, it differs from standard SMBus protocol on several | ||
12 | * aspects: | ||
13 | * - it supports only one slave device, and thus drop the address field | ||
14 | * - it adds a parity bit every 8bits of data | ||
15 | * - only one read access is required to read a byte (instead of a write | ||
16 | * followed by a read access in standard SMBus protocol) | ||
17 | * - there's no Ack bit after each byte transfer | ||
18 | * | ||
19 | * This means this bus cannot be used to interface with standard SMBus | ||
20 | * devices (the only known device to support this interface is the AXP221 | ||
21 | * PMIC). | ||
22 | * | ||
23 | */ | ||
24 | #include <linux/clk.h> | ||
25 | #include <linux/i2c.h> | ||
26 | #include <linux/io.h> | ||
27 | #include <linux/interrupt.h> | ||
28 | #include <linux/module.h> | ||
29 | #include <linux/of.h> | ||
30 | #include <linux/platform_device.h> | ||
31 | #include <linux/reset.h> | ||
32 | |||
33 | |||
34 | /* P2WI registers */ | ||
35 | #define P2WI_CTRL 0x0 | ||
36 | #define P2WI_CCR 0x4 | ||
37 | #define P2WI_INTE 0x8 | ||
38 | #define P2WI_INTS 0xc | ||
39 | #define P2WI_DADDR0 0x10 | ||
40 | #define P2WI_DADDR1 0x14 | ||
41 | #define P2WI_DLEN 0x18 | ||
42 | #define P2WI_DATA0 0x1c | ||
43 | #define P2WI_DATA1 0x20 | ||
44 | #define P2WI_LCR 0x24 | ||
45 | #define P2WI_PMCR 0x28 | ||
46 | |||
47 | /* CTRL fields */ | ||
48 | #define P2WI_CTRL_START_TRANS BIT(7) | ||
49 | #define P2WI_CTRL_ABORT_TRANS BIT(6) | ||
50 | #define P2WI_CTRL_GLOBAL_INT_ENB BIT(1) | ||
51 | #define P2WI_CTRL_SOFT_RST BIT(0) | ||
52 | |||
53 | /* CLK CTRL fields */ | ||
54 | #define P2WI_CCR_SDA_OUT_DELAY(v) (((v) & 0x7) << 8) | ||
55 | #define P2WI_CCR_MAX_CLK_DIV 0xff | ||
56 | #define P2WI_CCR_CLK_DIV(v) ((v) & P2WI_CCR_MAX_CLK_DIV) | ||
57 | |||
58 | /* STATUS fields */ | ||
59 | #define P2WI_INTS_TRANS_ERR_ID(v) (((v) >> 8) & 0xff) | ||
60 | #define P2WI_INTS_LOAD_BSY BIT(2) | ||
61 | #define P2WI_INTS_TRANS_ERR BIT(1) | ||
62 | #define P2WI_INTS_TRANS_OVER BIT(0) | ||
63 | |||
64 | /* DATA LENGTH fields*/ | ||
65 | #define P2WI_DLEN_READ BIT(4) | ||
66 | #define P2WI_DLEN_DATA_LENGTH(v) ((v - 1) & 0x7) | ||
67 | |||
68 | /* LINE CTRL fields*/ | ||
69 | #define P2WI_LCR_SCL_STATE BIT(5) | ||
70 | #define P2WI_LCR_SDA_STATE BIT(4) | ||
71 | #define P2WI_LCR_SCL_CTL BIT(3) | ||
72 | #define P2WI_LCR_SCL_CTL_EN BIT(2) | ||
73 | #define P2WI_LCR_SDA_CTL BIT(1) | ||
74 | #define P2WI_LCR_SDA_CTL_EN BIT(0) | ||
75 | |||
76 | /* PMU MODE CTRL fields */ | ||
77 | #define P2WI_PMCR_PMU_INIT_SEND BIT(31) | ||
78 | #define P2WI_PMCR_PMU_INIT_DATA(v) (((v) & 0xff) << 16) | ||
79 | #define P2WI_PMCR_PMU_MODE_REG(v) (((v) & 0xff) << 8) | ||
80 | #define P2WI_PMCR_PMU_DEV_ADDR(v) ((v) & 0xff) | ||
81 | |||
82 | #define P2WI_MAX_FREQ 6000000 | ||
83 | |||
84 | struct p2wi { | ||
85 | struct i2c_adapter adapter; | ||
86 | struct completion complete; | ||
87 | unsigned int status; | ||
88 | void __iomem *regs; | ||
89 | struct clk *clk; | ||
90 | struct reset_control *rstc; | ||
91 | int slave_addr; | ||
92 | }; | ||
93 | |||
94 | static irqreturn_t p2wi_interrupt(int irq, void *dev_id) | ||
95 | { | ||
96 | struct p2wi *p2wi = dev_id; | ||
97 | unsigned long status; | ||
98 | |||
99 | status = readl(p2wi->regs + P2WI_INTS); | ||
100 | p2wi->status = status; | ||
101 | |||
102 | /* Clear interrupts */ | ||
103 | status &= (P2WI_INTS_LOAD_BSY | P2WI_INTS_TRANS_ERR | | ||
104 | P2WI_INTS_TRANS_OVER); | ||
105 | writel(status, p2wi->regs + P2WI_INTS); | ||
106 | |||
107 | complete(&p2wi->complete); | ||
108 | |||
109 | return IRQ_HANDLED; | ||
110 | } | ||
111 | |||
112 | static u32 p2wi_functionality(struct i2c_adapter *adap) | ||
113 | { | ||
114 | return I2C_FUNC_SMBUS_BYTE_DATA; | ||
115 | } | ||
116 | |||
117 | static int p2wi_smbus_xfer(struct i2c_adapter *adap, u16 addr, | ||
118 | unsigned short flags, char read_write, | ||
119 | u8 command, int size, union i2c_smbus_data *data) | ||
120 | { | ||
121 | struct p2wi *p2wi = i2c_get_adapdata(adap); | ||
122 | unsigned long dlen = P2WI_DLEN_DATA_LENGTH(1); | ||
123 | |||
124 | if (p2wi->slave_addr >= 0 && addr != p2wi->slave_addr) { | ||
125 | dev_err(&adap->dev, "invalid P2WI address\n"); | ||
126 | return -EINVAL; | ||
127 | } | ||
128 | |||
129 | if (!data) | ||
130 | return -EINVAL; | ||
131 | |||
132 | writel(command, p2wi->regs + P2WI_DADDR0); | ||
133 | |||
134 | if (read_write == I2C_SMBUS_READ) | ||
135 | dlen |= P2WI_DLEN_READ; | ||
136 | else | ||
137 | writel(data->byte, p2wi->regs + P2WI_DATA0); | ||
138 | |||
139 | writel(dlen, p2wi->regs + P2WI_DLEN); | ||
140 | |||
141 | if (readl(p2wi->regs + P2WI_CTRL) & P2WI_CTRL_START_TRANS) { | ||
142 | dev_err(&adap->dev, "P2WI bus busy\n"); | ||
143 | return -EBUSY; | ||
144 | } | ||
145 | |||
146 | reinit_completion(&p2wi->complete); | ||
147 | |||
148 | writel(P2WI_INTS_LOAD_BSY | P2WI_INTS_TRANS_ERR | P2WI_INTS_TRANS_OVER, | ||
149 | p2wi->regs + P2WI_INTE); | ||
150 | |||
151 | writel(P2WI_CTRL_START_TRANS | P2WI_CTRL_GLOBAL_INT_ENB, | ||
152 | p2wi->regs + P2WI_CTRL); | ||
153 | |||
154 | wait_for_completion(&p2wi->complete); | ||
155 | |||
156 | if (p2wi->status & P2WI_INTS_LOAD_BSY) { | ||
157 | dev_err(&adap->dev, "P2WI bus busy\n"); | ||
158 | return -EBUSY; | ||
159 | } | ||
160 | |||
161 | if (p2wi->status & P2WI_INTS_TRANS_ERR) { | ||
162 | dev_err(&adap->dev, "P2WI bus xfer error\n"); | ||
163 | return -ENXIO; | ||
164 | } | ||
165 | |||
166 | if (read_write == I2C_SMBUS_READ) | ||
167 | data->byte = readl(p2wi->regs + P2WI_DATA0); | ||
168 | |||
169 | return 0; | ||
170 | } | ||
171 | |||
172 | static const struct i2c_algorithm p2wi_algo = { | ||
173 | .smbus_xfer = p2wi_smbus_xfer, | ||
174 | .functionality = p2wi_functionality, | ||
175 | }; | ||
176 | |||
177 | static const struct of_device_id p2wi_of_match_table[] = { | ||
178 | { .compatible = "allwinner,sun6i-a31-p2wi" }, | ||
179 | {} | ||
180 | }; | ||
181 | MODULE_DEVICE_TABLE(of, p2wi_of_match_table); | ||
182 | |||
183 | static int p2wi_probe(struct platform_device *pdev) | ||
184 | { | ||
185 | struct device *dev = &pdev->dev; | ||
186 | struct device_node *np = dev->of_node; | ||
187 | struct device_node *childnp; | ||
188 | unsigned long parent_clk_freq; | ||
189 | u32 clk_freq = 100000; | ||
190 | struct resource *r; | ||
191 | struct p2wi *p2wi; | ||
192 | u32 slave_addr; | ||
193 | int clk_div; | ||
194 | int irq; | ||
195 | int ret; | ||
196 | |||
197 | of_property_read_u32(np, "clock-frequency", &clk_freq); | ||
198 | if (clk_freq > P2WI_MAX_FREQ) { | ||
199 | dev_err(dev, | ||
200 | "required clock-frequency (%u Hz) is too high (max = 6MHz)", | ||
201 | clk_freq); | ||
202 | return -EINVAL; | ||
203 | } | ||
204 | |||
205 | if (of_get_child_count(np) > 1) { | ||
206 | dev_err(dev, "P2WI only supports one slave device\n"); | ||
207 | return -EINVAL; | ||
208 | } | ||
209 | |||
210 | p2wi = devm_kzalloc(dev, sizeof(struct p2wi), GFP_KERNEL); | ||
211 | if (!p2wi) | ||
212 | return -ENOMEM; | ||
213 | |||
214 | p2wi->slave_addr = -1; | ||
215 | |||
216 | /* | ||
217 | * Authorize a p2wi node without any children to be able to use an | ||
218 | * i2c-dev from userpace. | ||
219 | * In this case the slave_addr is set to -1 and won't be checked when | ||
220 | * launching a P2WI transfer. | ||
221 | */ | ||
222 | childnp = of_get_next_available_child(np, NULL); | ||
223 | if (childnp) { | ||
224 | ret = of_property_read_u32(childnp, "reg", &slave_addr); | ||
225 | if (ret) { | ||
226 | dev_err(dev, "invalid slave address on node %s\n", | ||
227 | childnp->full_name); | ||
228 | return -EINVAL; | ||
229 | } | ||
230 | |||
231 | p2wi->slave_addr = slave_addr; | ||
232 | } | ||
233 | |||
234 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
235 | p2wi->regs = devm_ioremap_resource(dev, r); | ||
236 | if (IS_ERR(p2wi->regs)) | ||
237 | return PTR_ERR(p2wi->regs); | ||
238 | |||
239 | strlcpy(p2wi->adapter.name, pdev->name, sizeof(p2wi->adapter.name)); | ||
240 | irq = platform_get_irq(pdev, 0); | ||
241 | if (irq < 0) { | ||
242 | dev_err(dev, "failed to retrieve irq: %d\n", irq); | ||
243 | return irq; | ||
244 | } | ||
245 | |||
246 | p2wi->clk = devm_clk_get(dev, NULL); | ||
247 | if (IS_ERR(p2wi->clk)) { | ||
248 | ret = PTR_ERR(p2wi->clk); | ||
249 | dev_err(dev, "failed to retrieve clk: %d\n", ret); | ||
250 | return ret; | ||
251 | } | ||
252 | |||
253 | ret = clk_prepare_enable(p2wi->clk); | ||
254 | if (ret) { | ||
255 | dev_err(dev, "failed to enable clk: %d\n", ret); | ||
256 | return ret; | ||
257 | } | ||
258 | |||
259 | parent_clk_freq = clk_get_rate(p2wi->clk); | ||
260 | |||
261 | p2wi->rstc = devm_reset_control_get(dev, NULL); | ||
262 | if (IS_ERR(p2wi->rstc)) { | ||
263 | ret = PTR_ERR(p2wi->rstc); | ||
264 | dev_err(dev, "failed to retrieve reset controller: %d\n", ret); | ||
265 | goto err_clk_disable; | ||
266 | } | ||
267 | |||
268 | ret = reset_control_deassert(p2wi->rstc); | ||
269 | if (ret) { | ||
270 | dev_err(dev, "failed to deassert reset line: %d\n", ret); | ||
271 | goto err_clk_disable; | ||
272 | } | ||
273 | |||
274 | init_completion(&p2wi->complete); | ||
275 | p2wi->adapter.dev.parent = dev; | ||
276 | p2wi->adapter.algo = &p2wi_algo; | ||
277 | p2wi->adapter.owner = THIS_MODULE; | ||
278 | p2wi->adapter.dev.of_node = pdev->dev.of_node; | ||
279 | platform_set_drvdata(pdev, p2wi); | ||
280 | i2c_set_adapdata(&p2wi->adapter, p2wi); | ||
281 | |||
282 | ret = devm_request_irq(dev, irq, p2wi_interrupt, 0, pdev->name, p2wi); | ||
283 | if (ret) { | ||
284 | dev_err(dev, "can't register interrupt handler irq%d: %d\n", | ||
285 | irq, ret); | ||
286 | goto err_reset_assert; | ||
287 | } | ||
288 | |||
289 | writel(P2WI_CTRL_SOFT_RST, p2wi->regs + P2WI_CTRL); | ||
290 | |||
291 | clk_div = parent_clk_freq / clk_freq; | ||
292 | if (!clk_div) { | ||
293 | dev_warn(dev, | ||
294 | "clock-frequency is too high, setting it to %lu Hz\n", | ||
295 | parent_clk_freq); | ||
296 | clk_div = 1; | ||
297 | } else if (clk_div > P2WI_CCR_MAX_CLK_DIV) { | ||
298 | dev_warn(dev, | ||
299 | "clock-frequency is too low, setting it to %lu Hz\n", | ||
300 | parent_clk_freq / P2WI_CCR_MAX_CLK_DIV); | ||
301 | clk_div = P2WI_CCR_MAX_CLK_DIV; | ||
302 | } | ||
303 | |||
304 | writel(P2WI_CCR_SDA_OUT_DELAY(1) | P2WI_CCR_CLK_DIV(clk_div), | ||
305 | p2wi->regs + P2WI_CCR); | ||
306 | |||
307 | ret = i2c_add_adapter(&p2wi->adapter); | ||
308 | if (!ret) | ||
309 | return 0; | ||
310 | |||
311 | err_reset_assert: | ||
312 | reset_control_assert(p2wi->rstc); | ||
313 | |||
314 | err_clk_disable: | ||
315 | clk_disable_unprepare(p2wi->clk); | ||
316 | |||
317 | return ret; | ||
318 | } | ||
319 | |||
320 | static int p2wi_remove(struct platform_device *dev) | ||
321 | { | ||
322 | struct p2wi *p2wi = platform_get_drvdata(dev); | ||
323 | |||
324 | reset_control_assert(p2wi->rstc); | ||
325 | clk_disable_unprepare(p2wi->clk); | ||
326 | i2c_del_adapter(&p2wi->adapter); | ||
327 | |||
328 | return 0; | ||
329 | } | ||
330 | |||
331 | static struct platform_driver p2wi_driver = { | ||
332 | .probe = p2wi_probe, | ||
333 | .remove = p2wi_remove, | ||
334 | .driver = { | ||
335 | .owner = THIS_MODULE, | ||
336 | .name = "i2c-sunxi-p2wi", | ||
337 | .of_match_table = p2wi_of_match_table, | ||
338 | }, | ||
339 | }; | ||
340 | module_platform_driver(p2wi_driver); | ||
341 | |||
342 | MODULE_AUTHOR("Boris BREZILLON <boris.brezillon@free-electrons.com>"); | ||
343 | MODULE_DESCRIPTION("Allwinner P2WI driver"); | ||
344 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/i2c/muxes/Kconfig b/drivers/i2c/muxes/Kconfig index f7f9865b8b89..f6d313e528de 100644 --- a/drivers/i2c/muxes/Kconfig +++ b/drivers/i2c/muxes/Kconfig | |||
@@ -40,6 +40,7 @@ config I2C_MUX_PCA9541 | |||
40 | 40 | ||
41 | config I2C_MUX_PCA954x | 41 | config I2C_MUX_PCA954x |
42 | tristate "Philips PCA954x I2C Mux/switches" | 42 | tristate "Philips PCA954x I2C Mux/switches" |
43 | depends on GPIOLIB | ||
43 | help | 44 | help |
44 | If you say yes here you get support for the Philips PCA954x | 45 | If you say yes here you get support for the Philips PCA954x |
45 | I2C mux/switch devices. | 46 | I2C mux/switch devices. |