GNU Linux-libre 4.19.207-gnu1
[releases.git] / drivers / input / serio / ps2-gpio.c
1 /*
2  * GPIO based serio bus driver for bit banging the PS/2 protocol
3  *
4  * Author: Danilo Krummrich <danilokrummrich@dk-develop.de>
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.
9  */
10
11 #include <linux/gpio/consumer.h>
12 #include <linux/interrupt.h>
13 #include <linux/module.h>
14 #include <linux/serio.h>
15 #include <linux/slab.h>
16 #include <linux/platform_device.h>
17 #include <linux/workqueue.h>
18 #include <linux/completion.h>
19 #include <linux/mutex.h>
20 #include <linux/preempt.h>
21 #include <linux/property.h>
22 #include <linux/of.h>
23 #include <linux/jiffies.h>
24 #include <linux/delay.h>
25
26 #define DRIVER_NAME             "ps2-gpio"
27
28 #define PS2_MODE_RX             0
29 #define PS2_MODE_TX             1
30
31 #define PS2_START_BIT           0
32 #define PS2_DATA_BIT0           1
33 #define PS2_DATA_BIT1           2
34 #define PS2_DATA_BIT2           3
35 #define PS2_DATA_BIT3           4
36 #define PS2_DATA_BIT4           5
37 #define PS2_DATA_BIT5           6
38 #define PS2_DATA_BIT6           7
39 #define PS2_DATA_BIT7           8
40 #define PS2_PARITY_BIT          9
41 #define PS2_STOP_BIT            10
42 #define PS2_TX_TIMEOUT          11
43 #define PS2_ACK_BIT             12
44
45 #define PS2_DEV_RET_ACK         0xfa
46 #define PS2_DEV_RET_NACK        0xfe
47
48 #define PS2_CMD_RESEND          0xfe
49
50 struct ps2_gpio_data {
51         struct device *dev;
52         struct serio *serio;
53         unsigned char mode;
54         struct gpio_desc *gpio_clk;
55         struct gpio_desc *gpio_data;
56         bool write_enable;
57         int irq;
58         unsigned char rx_cnt;
59         unsigned char rx_byte;
60         unsigned char tx_cnt;
61         unsigned char tx_byte;
62         struct completion tx_done;
63         struct mutex tx_mutex;
64         struct delayed_work tx_work;
65 };
66
67 static int ps2_gpio_open(struct serio *serio)
68 {
69         struct ps2_gpio_data *drvdata = serio->port_data;
70
71         enable_irq(drvdata->irq);
72         return 0;
73 }
74
75 static void ps2_gpio_close(struct serio *serio)
76 {
77         struct ps2_gpio_data *drvdata = serio->port_data;
78
79         flush_delayed_work(&drvdata->tx_work);
80         disable_irq(drvdata->irq);
81 }
82
83 static int __ps2_gpio_write(struct serio *serio, unsigned char val)
84 {
85         struct ps2_gpio_data *drvdata = serio->port_data;
86
87         disable_irq_nosync(drvdata->irq);
88         gpiod_direction_output(drvdata->gpio_clk, 0);
89
90         drvdata->mode = PS2_MODE_TX;
91         drvdata->tx_byte = val;
92
93         schedule_delayed_work(&drvdata->tx_work, usecs_to_jiffies(200));
94
95         return 0;
96 }
97
98 static int ps2_gpio_write(struct serio *serio, unsigned char val)
99 {
100         struct ps2_gpio_data *drvdata = serio->port_data;
101         int ret = 0;
102
103         if (in_task()) {
104                 mutex_lock(&drvdata->tx_mutex);
105                 __ps2_gpio_write(serio, val);
106                 if (!wait_for_completion_timeout(&drvdata->tx_done,
107                                                  msecs_to_jiffies(10000)))
108                         ret = SERIO_TIMEOUT;
109                 mutex_unlock(&drvdata->tx_mutex);
110         } else {
111                 __ps2_gpio_write(serio, val);
112         }
113
114         return ret;
115 }
116
117 static void ps2_gpio_tx_work_fn(struct work_struct *work)
118 {
119         struct delayed_work *dwork = to_delayed_work(work);
120         struct ps2_gpio_data *drvdata = container_of(dwork,
121                                                     struct ps2_gpio_data,
122                                                     tx_work);
123
124         enable_irq(drvdata->irq);
125         gpiod_direction_output(drvdata->gpio_data, 0);
126         gpiod_direction_input(drvdata->gpio_clk);
127 }
128
129 static irqreturn_t ps2_gpio_irq_rx(struct ps2_gpio_data *drvdata)
130 {
131         unsigned char byte, cnt;
132         int data;
133         int rxflags = 0;
134         static unsigned long old_jiffies;
135
136         byte = drvdata->rx_byte;
137         cnt = drvdata->rx_cnt;
138
139         if (old_jiffies == 0)
140                 old_jiffies = jiffies;
141
142         if ((jiffies - old_jiffies) > usecs_to_jiffies(100)) {
143                 dev_err(drvdata->dev,
144                         "RX: timeout, probably we missed an interrupt\n");
145                 goto err;
146         }
147         old_jiffies = jiffies;
148
149         data = gpiod_get_value(drvdata->gpio_data);
150         if (unlikely(data < 0)) {
151                 dev_err(drvdata->dev, "RX: failed to get data gpio val: %d\n",
152                         data);
153                 goto err;
154         }
155
156         switch (cnt) {
157         case PS2_START_BIT:
158                 /* start bit should be low */
159                 if (unlikely(data)) {
160                         dev_err(drvdata->dev, "RX: start bit should be low\n");
161                         goto err;
162                 }
163                 break;
164         case PS2_DATA_BIT0:
165         case PS2_DATA_BIT1:
166         case PS2_DATA_BIT2:
167         case PS2_DATA_BIT3:
168         case PS2_DATA_BIT4:
169         case PS2_DATA_BIT5:
170         case PS2_DATA_BIT6:
171         case PS2_DATA_BIT7:
172                 /* processing data bits */
173                 if (data)
174                         byte |= (data << (cnt - 1));
175                 break;
176         case PS2_PARITY_BIT:
177                 /* check odd parity */
178                 if (!((hweight8(byte) & 1) ^ data)) {
179                         rxflags |= SERIO_PARITY;
180                         dev_warn(drvdata->dev, "RX: parity error\n");
181                         if (!drvdata->write_enable)
182                                 goto err;
183                 }
184
185                 /* Do not send spurious ACK's and NACK's when write fn is
186                  * not provided.
187                  */
188                 if (!drvdata->write_enable) {
189                         if (byte == PS2_DEV_RET_NACK)
190                                 goto err;
191                         else if (byte == PS2_DEV_RET_ACK)
192                                 break;
193                 }
194
195                 /* Let's send the data without waiting for the stop bit to be
196                  * sent. It may happen that we miss the stop bit. When this
197                  * happens we have no way to recover from this, certainly
198                  * missing the parity bit would be recognized when processing
199                  * the stop bit. When missing both, data is lost.
200                  */
201                 serio_interrupt(drvdata->serio, byte, rxflags);
202                 dev_dbg(drvdata->dev, "RX: sending byte 0x%x\n", byte);
203                 break;
204         case PS2_STOP_BIT:
205                 /* stop bit should be high */
206                 if (unlikely(!data)) {
207                         dev_err(drvdata->dev, "RX: stop bit should be high\n");
208                         goto err;
209                 }
210                 cnt = byte = 0;
211                 old_jiffies = 0;
212                 goto end; /* success */
213         default:
214                 dev_err(drvdata->dev, "RX: got out of sync with the device\n");
215                 goto err;
216         }
217
218         cnt++;
219         goto end; /* success */
220
221 err:
222         cnt = byte = 0;
223         old_jiffies = 0;
224         __ps2_gpio_write(drvdata->serio, PS2_CMD_RESEND);
225 end:
226         drvdata->rx_cnt = cnt;
227         drvdata->rx_byte = byte;
228         return IRQ_HANDLED;
229 }
230
231 static irqreturn_t ps2_gpio_irq_tx(struct ps2_gpio_data *drvdata)
232 {
233         unsigned char byte, cnt;
234         int data;
235         static unsigned long old_jiffies;
236
237         cnt = drvdata->tx_cnt;
238         byte = drvdata->tx_byte;
239
240         if (old_jiffies == 0)
241                 old_jiffies = jiffies;
242
243         if ((jiffies - old_jiffies) > usecs_to_jiffies(100)) {
244                 dev_err(drvdata->dev,
245                         "TX: timeout, probably we missed an interrupt\n");
246                 goto err;
247         }
248         old_jiffies = jiffies;
249
250         switch (cnt) {
251         case PS2_START_BIT:
252                 /* should never happen */
253                 dev_err(drvdata->dev,
254                         "TX: start bit should have been sent already\n");
255                 goto err;
256         case PS2_DATA_BIT0:
257         case PS2_DATA_BIT1:
258         case PS2_DATA_BIT2:
259         case PS2_DATA_BIT3:
260         case PS2_DATA_BIT4:
261         case PS2_DATA_BIT5:
262         case PS2_DATA_BIT6:
263         case PS2_DATA_BIT7:
264                 data = byte & BIT(cnt - 1);
265                 gpiod_set_value(drvdata->gpio_data, data);
266                 break;
267         case PS2_PARITY_BIT:
268                 /* do odd parity */
269                 data = !(hweight8(byte) & 1);
270                 gpiod_set_value(drvdata->gpio_data, data);
271                 break;
272         case PS2_STOP_BIT:
273                 /* release data line to generate stop bit */
274                 gpiod_direction_input(drvdata->gpio_data);
275                 break;
276         case PS2_TX_TIMEOUT:
277                 /* Devices generate one extra clock pulse before sending the
278                  * acknowledgment.
279                  */
280                 break;
281         case PS2_ACK_BIT:
282                 gpiod_direction_input(drvdata->gpio_data);
283                 data = gpiod_get_value(drvdata->gpio_data);
284                 if (data) {
285                         dev_warn(drvdata->dev, "TX: received NACK, retry\n");
286                         goto err;
287                 }
288
289                 drvdata->mode = PS2_MODE_RX;
290                 complete(&drvdata->tx_done);
291
292                 cnt = 1;
293                 old_jiffies = 0;
294                 goto end; /* success */
295         default:
296                 /* Probably we missed the stop bit. Therefore we release data
297                  * line and try again.
298                  */
299                 gpiod_direction_input(drvdata->gpio_data);
300                 dev_err(drvdata->dev, "TX: got out of sync with the device\n");
301                 goto err;
302         }
303
304         cnt++;
305         goto end; /* success */
306
307 err:
308         cnt = 1;
309         old_jiffies = 0;
310         gpiod_direction_input(drvdata->gpio_data);
311         __ps2_gpio_write(drvdata->serio, drvdata->tx_byte);
312 end:
313         drvdata->tx_cnt = cnt;
314         return IRQ_HANDLED;
315 }
316
317 static irqreturn_t ps2_gpio_irq(int irq, void *dev_id)
318 {
319         struct ps2_gpio_data *drvdata = dev_id;
320
321         return drvdata->mode ? ps2_gpio_irq_tx(drvdata) :
322                 ps2_gpio_irq_rx(drvdata);
323 }
324
325 static int ps2_gpio_get_props(struct device *dev,
326                                  struct ps2_gpio_data *drvdata)
327 {
328         drvdata->gpio_data = devm_gpiod_get(dev, "data", GPIOD_IN);
329         if (IS_ERR(drvdata->gpio_data)) {
330                 dev_err(dev, "failed to request data gpio: %ld",
331                         PTR_ERR(drvdata->gpio_data));
332                 return PTR_ERR(drvdata->gpio_data);
333         }
334
335         drvdata->gpio_clk = devm_gpiod_get(dev, "clk", GPIOD_IN);
336         if (IS_ERR(drvdata->gpio_clk)) {
337                 dev_err(dev, "failed to request clock gpio: %ld",
338                         PTR_ERR(drvdata->gpio_clk));
339                 return PTR_ERR(drvdata->gpio_clk);
340         }
341
342         drvdata->write_enable = device_property_read_bool(dev,
343                                 "write-enable");
344
345         return 0;
346 }
347
348 static int ps2_gpio_probe(struct platform_device *pdev)
349 {
350         struct ps2_gpio_data *drvdata;
351         struct serio *serio;
352         struct device *dev = &pdev->dev;
353         int error;
354
355         drvdata = devm_kzalloc(dev, sizeof(struct ps2_gpio_data), GFP_KERNEL);
356         serio = kzalloc(sizeof(struct serio), GFP_KERNEL);
357         if (!drvdata || !serio) {
358                 error = -ENOMEM;
359                 goto err_free_serio;
360         }
361
362         error = ps2_gpio_get_props(dev, drvdata);
363         if (error)
364                 goto err_free_serio;
365
366         if (gpiod_cansleep(drvdata->gpio_data) ||
367             gpiod_cansleep(drvdata->gpio_clk)) {
368                 dev_err(dev, "GPIO data or clk are connected via slow bus\n");
369                 error = -EINVAL;
370                 goto err_free_serio;
371         }
372
373         drvdata->irq = platform_get_irq(pdev, 0);
374         if (drvdata->irq < 0) {
375                 dev_err(dev, "failed to get irq from platform resource: %d\n",
376                         drvdata->irq);
377                 error = drvdata->irq;
378                 goto err_free_serio;
379         }
380
381         error = devm_request_irq(dev, drvdata->irq, ps2_gpio_irq,
382                                  IRQF_NO_THREAD, DRIVER_NAME, drvdata);
383         if (error) {
384                 dev_err(dev, "failed to request irq %d: %d\n",
385                         drvdata->irq, error);
386                 goto err_free_serio;
387         }
388
389         /* Keep irq disabled until serio->open is called. */
390         disable_irq(drvdata->irq);
391
392         serio->id.type = SERIO_8042;
393         serio->open = ps2_gpio_open;
394         serio->close = ps2_gpio_close;
395         /* Write can be enabled in platform/dt data, but possibly it will not
396          * work because of the tough timings.
397          */
398         serio->write = drvdata->write_enable ? ps2_gpio_write : NULL;
399         serio->port_data = drvdata;
400         serio->dev.parent = dev;
401         strlcpy(serio->name, dev_name(dev), sizeof(serio->name));
402         strlcpy(serio->phys, dev_name(dev), sizeof(serio->phys));
403
404         drvdata->serio = serio;
405         drvdata->dev = dev;
406         drvdata->mode = PS2_MODE_RX;
407
408         /* Tx count always starts at 1, as the start bit is sent implicitly by
409          * host-to-device communication initialization.
410          */
411         drvdata->tx_cnt = 1;
412
413         INIT_DELAYED_WORK(&drvdata->tx_work, ps2_gpio_tx_work_fn);
414         init_completion(&drvdata->tx_done);
415         mutex_init(&drvdata->tx_mutex);
416
417         serio_register_port(serio);
418         platform_set_drvdata(pdev, drvdata);
419
420         return 0;       /* success */
421
422 err_free_serio:
423         kfree(serio);
424         return error;
425 }
426
427 static int ps2_gpio_remove(struct platform_device *pdev)
428 {
429         struct ps2_gpio_data *drvdata = platform_get_drvdata(pdev);
430
431         serio_unregister_port(drvdata->serio);
432         return 0;
433 }
434
435 #if defined(CONFIG_OF)
436 static const struct of_device_id ps2_gpio_match[] = {
437         { .compatible = "ps2-gpio", },
438         { },
439 };
440 MODULE_DEVICE_TABLE(of, ps2_gpio_match);
441 #endif
442
443 static struct platform_driver ps2_gpio_driver = {
444         .probe          = ps2_gpio_probe,
445         .remove         = ps2_gpio_remove,
446         .driver = {
447                 .name = DRIVER_NAME,
448                 .of_match_table = of_match_ptr(ps2_gpio_match),
449         },
450 };
451 module_platform_driver(ps2_gpio_driver);
452
453 MODULE_AUTHOR("Danilo Krummrich <danilokrummrich@dk-develop.de>");
454 MODULE_DESCRIPTION("GPIO PS2 driver");
455 MODULE_LICENSE("GPL v2");