These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / i2c / busses / i2c-emev2.c
1 /*
2  * I2C driver for the Renesas EMEV2 SoC
3  *
4  * Copyright (C) 2015 Wolfram Sang <wsa@sang-engineering.com>
5  * Copyright 2013 Codethink Ltd.
6  * Copyright 2010-2015 Renesas Electronics Corporation
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2
10  * as published by the Free Software Foundation.
11  */
12
13 #include <linux/clk.h>
14 #include <linux/completion.h>
15 #include <linux/device.h>
16 #include <linux/i2c.h>
17 #include <linux/init.h>
18 #include <linux/interrupt.h>
19 #include <linux/io.h>
20 #include <linux/kernel.h>
21 #include <linux/module.h>
22 #include <linux/of_device.h>
23 #include <linux/platform_device.h>
24 #include <linux/sched.h>
25
26 /* I2C Registers */
27 #define I2C_OFS_IICACT0         0x00    /* start */
28 #define I2C_OFS_IIC0            0x04    /* shift */
29 #define I2C_OFS_IICC0           0x08    /* control */
30 #define I2C_OFS_SVA0            0x0c    /* slave address */
31 #define I2C_OFS_IICCL0          0x10    /* clock select */
32 #define I2C_OFS_IICX0           0x14    /* extension */
33 #define I2C_OFS_IICS0           0x18    /* status */
34 #define I2C_OFS_IICSE0          0x1c    /* status For emulation */
35 #define I2C_OFS_IICF0           0x20    /* IIC flag */
36
37 /* I2C IICACT0 Masks */
38 #define I2C_BIT_IICE0           0x0001
39
40 /* I2C IICC0 Masks */
41 #define I2C_BIT_LREL0           0x0040
42 #define I2C_BIT_WREL0           0x0020
43 #define I2C_BIT_SPIE0           0x0010
44 #define I2C_BIT_WTIM0           0x0008
45 #define I2C_BIT_ACKE0           0x0004
46 #define I2C_BIT_STT0            0x0002
47 #define I2C_BIT_SPT0            0x0001
48
49 /* I2C IICCL0 Masks */
50 #define I2C_BIT_SMC0            0x0008
51 #define I2C_BIT_DFC0            0x0004
52
53 /* I2C IICSE0 Masks */
54 #define I2C_BIT_MSTS0           0x0080
55 #define I2C_BIT_ALD0            0x0040
56 #define I2C_BIT_EXC0            0x0020
57 #define I2C_BIT_COI0            0x0010
58 #define I2C_BIT_TRC0            0x0008
59 #define I2C_BIT_ACKD0           0x0004
60 #define I2C_BIT_STD0            0x0002
61 #define I2C_BIT_SPD0            0x0001
62
63 /* I2C IICF0 Masks */
64 #define I2C_BIT_STCF            0x0080
65 #define I2C_BIT_IICBSY          0x0040
66 #define I2C_BIT_STCEN           0x0002
67 #define I2C_BIT_IICRSV          0x0001
68
69 struct em_i2c_device {
70         void __iomem *base;
71         struct i2c_adapter adap;
72         struct completion msg_done;
73         struct clk *sclk;
74 };
75
76 static inline void em_clear_set_bit(struct em_i2c_device *priv, u8 clear, u8 set, u8 reg)
77 {
78         writeb((readb(priv->base + reg) & ~clear) | set, priv->base + reg);
79 }
80
81 static int em_i2c_wait_for_event(struct em_i2c_device *priv)
82 {
83         unsigned long time_left;
84         int status;
85
86         reinit_completion(&priv->msg_done);
87
88         time_left = wait_for_completion_timeout(&priv->msg_done, priv->adap.timeout);
89
90         if (!time_left)
91                 return -ETIMEDOUT;
92
93         status = readb(priv->base + I2C_OFS_IICSE0);
94         return status & I2C_BIT_ALD0 ? -EAGAIN : status;
95 }
96
97 static void em_i2c_stop(struct em_i2c_device *priv)
98 {
99         /* Send Stop condition */
100         em_clear_set_bit(priv, 0, I2C_BIT_SPT0 | I2C_BIT_SPIE0, I2C_OFS_IICC0);
101
102         /* Wait for stop condition */
103         em_i2c_wait_for_event(priv);
104 }
105
106 static void em_i2c_reset(struct i2c_adapter *adap)
107 {
108         struct em_i2c_device *priv = i2c_get_adapdata(adap);
109         int retr;
110
111         /* If I2C active */
112         if (readb(priv->base + I2C_OFS_IICACT0) & I2C_BIT_IICE0) {
113                 /* Disable I2C operation */
114                 writeb(0, priv->base + I2C_OFS_IICACT0);
115
116                 retr = 1000;
117                 while (readb(priv->base + I2C_OFS_IICACT0) == 1 && retr)
118                         retr--;
119                 WARN_ON(retr == 0);
120         }
121
122         /* Transfer mode set */
123         writeb(I2C_BIT_DFC0, priv->base + I2C_OFS_IICCL0);
124
125         /* Can Issue start without detecting a stop, Reservation disabled. */
126         writeb(I2C_BIT_STCEN | I2C_BIT_IICRSV, priv->base + I2C_OFS_IICF0);
127
128         /* I2C enable, 9 bit interrupt mode */
129         writeb(I2C_BIT_WTIM0, priv->base + I2C_OFS_IICC0);
130
131         /* Enable I2C operation */
132         writeb(I2C_BIT_IICE0, priv->base + I2C_OFS_IICACT0);
133
134         retr = 1000;
135         while (readb(priv->base + I2C_OFS_IICACT0) == 0 && retr)
136                 retr--;
137         WARN_ON(retr == 0);
138 }
139
140 static int __em_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
141                                 int stop)
142 {
143         struct em_i2c_device *priv = i2c_get_adapdata(adap);
144         int count, status, read = !!(msg->flags & I2C_M_RD);
145
146         /* Send start condition */
147         em_clear_set_bit(priv, 0, I2C_BIT_ACKE0 | I2C_BIT_WTIM0, I2C_OFS_IICC0);
148         em_clear_set_bit(priv, 0, I2C_BIT_STT0, I2C_OFS_IICC0);
149
150         /* Send slave address and R/W type */
151         writeb((msg->addr << 1) | read, priv->base + I2C_OFS_IIC0);
152
153         /* Wait for transaction */
154         status = em_i2c_wait_for_event(priv);
155         if (status < 0)
156                 goto out_reset;
157
158         /* Received NACK (result of setting slave address and R/W) */
159         if (!(status & I2C_BIT_ACKD0)) {
160                 em_i2c_stop(priv);
161                 goto out;
162         }
163
164         /* Extra setup for read transactions */
165         if (read) {
166                 /* 8 bit interrupt mode */
167                 em_clear_set_bit(priv, I2C_BIT_WTIM0, I2C_BIT_ACKE0, I2C_OFS_IICC0);
168                 em_clear_set_bit(priv, I2C_BIT_WTIM0, I2C_BIT_WREL0, I2C_OFS_IICC0);
169
170                 /* Wait for transaction */
171                 status = em_i2c_wait_for_event(priv);
172                 if (status < 0)
173                         goto out_reset;
174         }
175
176         /* Send / receive data */
177         for (count = 0; count < msg->len; count++) {
178                 if (read) { /* Read transaction */
179                         msg->buf[count] = readb(priv->base + I2C_OFS_IIC0);
180                         em_clear_set_bit(priv, 0, I2C_BIT_WREL0, I2C_OFS_IICC0);
181
182                 } else { /* Write transaction */
183                         /* Received NACK */
184                         if (!(status & I2C_BIT_ACKD0)) {
185                                 em_i2c_stop(priv);
186                                 goto out;
187                         }
188
189                         /* Write data */
190                         writeb(msg->buf[count], priv->base + I2C_OFS_IIC0);
191                 }
192
193                 /* Wait for R/W transaction */
194                 status = em_i2c_wait_for_event(priv);
195                 if (status < 0)
196                         goto out_reset;
197         }
198
199         if (stop)
200                 em_i2c_stop(priv);
201
202         return count;
203
204 out_reset:
205         em_i2c_reset(adap);
206 out:
207         return status < 0 ? status : -ENXIO;
208 }
209
210 static int em_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
211         int num)
212 {
213         struct em_i2c_device *priv = i2c_get_adapdata(adap);
214         int ret, i;
215
216         if (readb(priv->base + I2C_OFS_IICF0) & I2C_BIT_IICBSY)
217                 return -EAGAIN;
218
219         for (i = 0; i < num; i++) {
220                 ret = __em_i2c_xfer(adap, &msgs[i], (i == (num - 1)));
221                 if (ret < 0)
222                         return ret;
223         }
224
225         /* I2C transfer completed */
226         return num;
227 }
228
229 static irqreturn_t em_i2c_irq_handler(int this_irq, void *dev_id)
230 {
231         struct em_i2c_device *priv = dev_id;
232
233         complete(&priv->msg_done);
234         return IRQ_HANDLED;
235 }
236
237 static u32 em_i2c_func(struct i2c_adapter *adap)
238 {
239         return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
240 }
241
242 static struct i2c_algorithm em_i2c_algo = {
243         .master_xfer = em_i2c_xfer,
244         .functionality = em_i2c_func,
245 };
246
247 static int em_i2c_probe(struct platform_device *pdev)
248 {
249         struct em_i2c_device *priv;
250         struct resource *r;
251         int irq, ret;
252
253         priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
254         if (!priv)
255                 return -ENOMEM;
256
257         r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
258         priv->base = devm_ioremap_resource(&pdev->dev, r);
259         if (IS_ERR(priv->base))
260                 return PTR_ERR(priv->base);
261
262         strlcpy(priv->adap.name, "EMEV2 I2C", sizeof(priv->adap.name));
263
264         priv->sclk = devm_clk_get(&pdev->dev, "sclk");
265         if (IS_ERR(priv->sclk))
266                 return PTR_ERR(priv->sclk);
267
268         clk_prepare_enable(priv->sclk);
269
270         priv->adap.timeout = msecs_to_jiffies(100);
271         priv->adap.retries = 5;
272         priv->adap.dev.parent = &pdev->dev;
273         priv->adap.algo = &em_i2c_algo;
274         priv->adap.owner = THIS_MODULE;
275         priv->adap.dev.of_node = pdev->dev.of_node;
276
277         init_completion(&priv->msg_done);
278
279         platform_set_drvdata(pdev, priv);
280         i2c_set_adapdata(&priv->adap, priv);
281
282         em_i2c_reset(&priv->adap);
283
284         irq = platform_get_irq(pdev, 0);
285         ret = devm_request_irq(&pdev->dev, irq, em_i2c_irq_handler, 0,
286                                 "em_i2c", priv);
287         if (ret)
288                 goto err_clk;
289
290         ret = i2c_add_adapter(&priv->adap);
291
292         if (ret)
293                 goto err_clk;
294
295         dev_info(&pdev->dev, "Added i2c controller %d, irq %d\n", priv->adap.nr, irq);
296
297         return 0;
298
299 err_clk:
300         clk_disable_unprepare(priv->sclk);
301         return ret;
302 }
303
304 static int em_i2c_remove(struct platform_device *dev)
305 {
306         struct em_i2c_device *priv = platform_get_drvdata(dev);
307
308         i2c_del_adapter(&priv->adap);
309         clk_disable_unprepare(priv->sclk);
310
311         return 0;
312 }
313
314 static const struct of_device_id em_i2c_ids[] = {
315         { .compatible = "renesas,iic-emev2", },
316         { }
317 };
318
319 static struct platform_driver em_i2c_driver = {
320         .probe = em_i2c_probe,
321         .remove = em_i2c_remove,
322         .driver = {
323                 .name = "em-i2c",
324                 .of_match_table = em_i2c_ids,
325         }
326 };
327 module_platform_driver(em_i2c_driver);
328
329 MODULE_DESCRIPTION("EMEV2 I2C bus driver");
330 MODULE_AUTHOR("Ian Molton and Wolfram Sang <wsa@sang-engineering.com>");
331 MODULE_LICENSE("GPL v2");
332 MODULE_DEVICE_TABLE(of, em_i2c_ids);