Merge branch 'i2c/for-5.8' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
[platform/kernel/linux-rpi.git] / drivers / gnss / sirf.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * SiRFstar GNSS receiver driver
4  *
5  * Copyright (C) 2018 Johan Hovold <johan@kernel.org>
6  */
7
8 #include <linux/errno.h>
9 #include <linux/gnss.h>
10 #include <linux/gpio/consumer.h>
11 #include <linux/init.h>
12 #include <linux/interrupt.h>
13 #include <linux/kernel.h>
14 #include <linux/module.h>
15 #include <linux/of.h>
16 #include <linux/pm.h>
17 #include <linux/pm_runtime.h>
18 #include <linux/regulator/consumer.h>
19 #include <linux/sched.h>
20 #include <linux/serdev.h>
21 #include <linux/slab.h>
22 #include <linux/wait.h>
23
24 #define SIRF_BOOT_DELAY                 500
25 #define SIRF_ON_OFF_PULSE_TIME          100
26 #define SIRF_ACTIVATE_TIMEOUT           200
27 #define SIRF_HIBERNATE_TIMEOUT          200
28 /*
29  * If no data arrives for this time, we assume that the chip is off.
30  * REVISIT: The report cycle is configurable and can be several minutes long,
31  * so this will only work reliably if the report cycle is set to a reasonable
32  * low value. Also power saving settings (like send data only on movement)
33  * might things work even worse.
34  * Workaround might be to parse shutdown or bootup messages.
35  */
36 #define SIRF_REPORT_CYCLE       2000
37
38 struct sirf_data {
39         struct gnss_device *gdev;
40         struct serdev_device *serdev;
41         speed_t speed;
42         struct regulator *vcc;
43         struct regulator *lna;
44         struct gpio_desc *on_off;
45         struct gpio_desc *wakeup;
46         int irq;
47         bool active;
48
49         struct mutex gdev_mutex;
50         bool open;
51
52         struct mutex serdev_mutex;
53         int serdev_count;
54
55         wait_queue_head_t power_wait;
56 };
57
58 static int sirf_serdev_open(struct sirf_data *data)
59 {
60         int ret = 0;
61
62         mutex_lock(&data->serdev_mutex);
63         if (++data->serdev_count == 1) {
64                 ret = serdev_device_open(data->serdev);
65                 if (ret) {
66                         data->serdev_count--;
67                         goto out_unlock;
68                 }
69
70                 serdev_device_set_baudrate(data->serdev, data->speed);
71                 serdev_device_set_flow_control(data->serdev, false);
72         }
73
74 out_unlock:
75         mutex_unlock(&data->serdev_mutex);
76
77         return ret;
78 }
79
80 static void sirf_serdev_close(struct sirf_data *data)
81 {
82         mutex_lock(&data->serdev_mutex);
83         if (--data->serdev_count == 0)
84                 serdev_device_close(data->serdev);
85         mutex_unlock(&data->serdev_mutex);
86 }
87
88 static int sirf_open(struct gnss_device *gdev)
89 {
90         struct sirf_data *data = gnss_get_drvdata(gdev);
91         struct serdev_device *serdev = data->serdev;
92         int ret;
93
94         mutex_lock(&data->gdev_mutex);
95         data->open = true;
96         mutex_unlock(&data->gdev_mutex);
97
98         ret = sirf_serdev_open(data);
99         if (ret) {
100                 mutex_lock(&data->gdev_mutex);
101                 data->open = false;
102                 mutex_unlock(&data->gdev_mutex);
103                 return ret;
104         }
105
106         ret = pm_runtime_get_sync(&serdev->dev);
107         if (ret < 0) {
108                 dev_err(&gdev->dev, "failed to runtime resume: %d\n", ret);
109                 pm_runtime_put_noidle(&serdev->dev);
110                 goto err_close;
111         }
112
113         return 0;
114
115 err_close:
116         sirf_serdev_close(data);
117
118         mutex_lock(&data->gdev_mutex);
119         data->open = false;
120         mutex_unlock(&data->gdev_mutex);
121
122         return ret;
123 }
124
125 static void sirf_close(struct gnss_device *gdev)
126 {
127         struct sirf_data *data = gnss_get_drvdata(gdev);
128         struct serdev_device *serdev = data->serdev;
129
130         sirf_serdev_close(data);
131
132         pm_runtime_put(&serdev->dev);
133
134         mutex_lock(&data->gdev_mutex);
135         data->open = false;
136         mutex_unlock(&data->gdev_mutex);
137 }
138
139 static int sirf_write_raw(struct gnss_device *gdev, const unsigned char *buf,
140                                 size_t count)
141 {
142         struct sirf_data *data = gnss_get_drvdata(gdev);
143         struct serdev_device *serdev = data->serdev;
144         int ret;
145
146         /* write is only buffered synchronously */
147         ret = serdev_device_write(serdev, buf, count, MAX_SCHEDULE_TIMEOUT);
148         if (ret < 0 || ret < count)
149                 return ret;
150
151         /* FIXME: determine if interrupted? */
152         serdev_device_wait_until_sent(serdev, 0);
153
154         return count;
155 }
156
157 static const struct gnss_operations sirf_gnss_ops = {
158         .open           = sirf_open,
159         .close          = sirf_close,
160         .write_raw      = sirf_write_raw,
161 };
162
163 static int sirf_receive_buf(struct serdev_device *serdev,
164                                 const unsigned char *buf, size_t count)
165 {
166         struct sirf_data *data = serdev_device_get_drvdata(serdev);
167         struct gnss_device *gdev = data->gdev;
168         int ret = 0;
169
170         if (!data->wakeup && !data->active) {
171                 data->active = true;
172                 wake_up_interruptible(&data->power_wait);
173         }
174
175         mutex_lock(&data->gdev_mutex);
176         if (data->open)
177                 ret = gnss_insert_raw(gdev, buf, count);
178         mutex_unlock(&data->gdev_mutex);
179
180         return ret;
181 }
182
183 static const struct serdev_device_ops sirf_serdev_ops = {
184         .receive_buf    = sirf_receive_buf,
185         .write_wakeup   = serdev_device_write_wakeup,
186 };
187
188 static irqreturn_t sirf_wakeup_handler(int irq, void *dev_id)
189 {
190         struct sirf_data *data = dev_id;
191         struct device *dev = &data->serdev->dev;
192         int ret;
193
194         ret = gpiod_get_value_cansleep(data->wakeup);
195         dev_dbg(dev, "%s - wakeup = %d\n", __func__, ret);
196         if (ret < 0)
197                 goto out;
198
199         data->active = ret;
200         wake_up_interruptible(&data->power_wait);
201 out:
202         return IRQ_HANDLED;
203 }
204
205 static int sirf_wait_for_power_state_nowakeup(struct sirf_data *data,
206                                                 bool active,
207                                                 unsigned long timeout)
208 {
209         int ret;
210
211         /* Wait for state change (including any shutdown messages). */
212         msleep(timeout);
213
214         /* Wait for data reception or timeout. */
215         data->active = false;
216         ret = wait_event_interruptible_timeout(data->power_wait,
217                         data->active, msecs_to_jiffies(SIRF_REPORT_CYCLE));
218         if (ret < 0)
219                 return ret;
220
221         if (ret > 0 && !active)
222                 return -ETIMEDOUT;
223
224         if (ret == 0 && active)
225                 return -ETIMEDOUT;
226
227         return 0;
228 }
229
230 static int sirf_wait_for_power_state(struct sirf_data *data, bool active,
231                                         unsigned long timeout)
232 {
233         int ret;
234
235         if (!data->wakeup)
236                 return sirf_wait_for_power_state_nowakeup(data, active, timeout);
237
238         ret = wait_event_interruptible_timeout(data->power_wait,
239                         data->active == active, msecs_to_jiffies(timeout));
240         if (ret < 0)
241                 return ret;
242
243         if (ret == 0) {
244                 dev_warn(&data->serdev->dev, "timeout waiting for active state = %d\n",
245                                 active);
246                 return -ETIMEDOUT;
247         }
248
249         return 0;
250 }
251
252 static void sirf_pulse_on_off(struct sirf_data *data)
253 {
254         gpiod_set_value_cansleep(data->on_off, 1);
255         msleep(SIRF_ON_OFF_PULSE_TIME);
256         gpiod_set_value_cansleep(data->on_off, 0);
257 }
258
259 static int sirf_set_active(struct sirf_data *data, bool active)
260 {
261         unsigned long timeout;
262         int retries = 3;
263         int ret;
264
265         if (active)
266                 timeout = SIRF_ACTIVATE_TIMEOUT;
267         else
268                 timeout = SIRF_HIBERNATE_TIMEOUT;
269
270         if (!data->wakeup) {
271                 ret = sirf_serdev_open(data);
272                 if (ret)
273                         return ret;
274         }
275
276         do {
277                 sirf_pulse_on_off(data);
278                 ret = sirf_wait_for_power_state(data, active, timeout);
279         } while (ret == -ETIMEDOUT && retries--);
280
281         if (!data->wakeup)
282                 sirf_serdev_close(data);
283
284         if (ret)
285                 return ret;
286
287         return 0;
288 }
289
290 static int sirf_runtime_suspend(struct device *dev)
291 {
292         struct sirf_data *data = dev_get_drvdata(dev);
293         int ret2;
294         int ret;
295
296         if (data->on_off)
297                 ret = sirf_set_active(data, false);
298         else
299                 ret = regulator_disable(data->vcc);
300
301         if (ret)
302                 return ret;
303
304         ret = regulator_disable(data->lna);
305         if (ret)
306                 goto err_reenable;
307
308         return 0;
309
310 err_reenable:
311         if (data->on_off)
312                 ret2 = sirf_set_active(data, true);
313         else
314                 ret2 = regulator_enable(data->vcc);
315
316         if (ret2)
317                 dev_err(dev,
318                         "failed to reenable power on failed suspend: %d\n",
319                         ret2);
320
321         return ret;
322 }
323
324 static int sirf_runtime_resume(struct device *dev)
325 {
326         struct sirf_data *data = dev_get_drvdata(dev);
327         int ret;
328
329         ret = regulator_enable(data->lna);
330         if (ret)
331                 return ret;
332
333         if (data->on_off)
334                 ret = sirf_set_active(data, true);
335         else
336                 ret = regulator_enable(data->vcc);
337
338         if (ret)
339                 goto err_disable_lna;
340
341         return 0;
342
343 err_disable_lna:
344         regulator_disable(data->lna);
345
346         return ret;
347 }
348
349 static int __maybe_unused sirf_suspend(struct device *dev)
350 {
351         struct sirf_data *data = dev_get_drvdata(dev);
352         int ret = 0;
353
354         if (!pm_runtime_suspended(dev))
355                 ret = sirf_runtime_suspend(dev);
356
357         if (data->wakeup)
358                 disable_irq(data->irq);
359
360         return ret;
361 }
362
363 static int __maybe_unused sirf_resume(struct device *dev)
364 {
365         struct sirf_data *data = dev_get_drvdata(dev);
366         int ret = 0;
367
368         if (data->wakeup)
369                 enable_irq(data->irq);
370
371         if (!pm_runtime_suspended(dev))
372                 ret = sirf_runtime_resume(dev);
373
374         return ret;
375 }
376
377 static const struct dev_pm_ops sirf_pm_ops = {
378         SET_SYSTEM_SLEEP_PM_OPS(sirf_suspend, sirf_resume)
379         SET_RUNTIME_PM_OPS(sirf_runtime_suspend, sirf_runtime_resume, NULL)
380 };
381
382 static int sirf_parse_dt(struct serdev_device *serdev)
383 {
384         struct sirf_data *data = serdev_device_get_drvdata(serdev);
385         struct device_node *node = serdev->dev.of_node;
386         u32 speed = 9600;
387
388         of_property_read_u32(node, "current-speed", &speed);
389
390         data->speed = speed;
391
392         return 0;
393 }
394
395 static int sirf_probe(struct serdev_device *serdev)
396 {
397         struct device *dev = &serdev->dev;
398         struct gnss_device *gdev;
399         struct sirf_data *data;
400         int ret;
401
402         data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
403         if (!data)
404                 return -ENOMEM;
405
406         gdev = gnss_allocate_device(dev);
407         if (!gdev)
408                 return -ENOMEM;
409
410         gdev->type = GNSS_TYPE_SIRF;
411         gdev->ops = &sirf_gnss_ops;
412         gnss_set_drvdata(gdev, data);
413
414         data->serdev = serdev;
415         data->gdev = gdev;
416
417         mutex_init(&data->gdev_mutex);
418         mutex_init(&data->serdev_mutex);
419         init_waitqueue_head(&data->power_wait);
420
421         serdev_device_set_drvdata(serdev, data);
422         serdev_device_set_client_ops(serdev, &sirf_serdev_ops);
423
424         ret = sirf_parse_dt(serdev);
425         if (ret)
426                 goto err_put_device;
427
428         data->vcc = devm_regulator_get(dev, "vcc");
429         if (IS_ERR(data->vcc)) {
430                 ret = PTR_ERR(data->vcc);
431                 goto err_put_device;
432         }
433
434         data->lna = devm_regulator_get(dev, "lna");
435         if (IS_ERR(data->lna)) {
436                 ret = PTR_ERR(data->lna);
437                 goto err_put_device;
438         }
439
440         data->on_off = devm_gpiod_get_optional(dev, "sirf,onoff",
441                         GPIOD_OUT_LOW);
442         if (IS_ERR(data->on_off)) {
443                 ret = PTR_ERR(data->on_off);
444                 goto err_put_device;
445         }
446
447         if (data->on_off) {
448                 data->wakeup = devm_gpiod_get_optional(dev, "sirf,wakeup",
449                                 GPIOD_IN);
450                 if (IS_ERR(data->wakeup)) {
451                         ret = PTR_ERR(data->wakeup);
452                         goto err_put_device;
453                 }
454
455                 ret = regulator_enable(data->vcc);
456                 if (ret)
457                         goto err_put_device;
458
459                 /* Wait for chip to boot into hibernate mode. */
460                 msleep(SIRF_BOOT_DELAY);
461         }
462
463         if (data->wakeup) {
464                 ret = gpiod_get_value_cansleep(data->wakeup);
465                 if (ret < 0)
466                         goto err_disable_vcc;
467                 data->active = ret;
468
469                 ret = gpiod_to_irq(data->wakeup);
470                 if (ret < 0)
471                         goto err_disable_vcc;
472                 data->irq = ret;
473
474                 ret = request_threaded_irq(data->irq, NULL, sirf_wakeup_handler,
475                                 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
476                                 "wakeup", data);
477                 if (ret)
478                         goto err_disable_vcc;
479         }
480
481         if (data->on_off) {
482                 if (!data->wakeup) {
483                         data->active = false;
484
485                         ret = sirf_serdev_open(data);
486                         if (ret)
487                                 goto err_disable_vcc;
488
489                         msleep(SIRF_REPORT_CYCLE);
490                         sirf_serdev_close(data);
491                 }
492
493                 /* Force hibernate mode if already active. */
494                 if (data->active) {
495                         ret = sirf_set_active(data, false);
496                         if (ret) {
497                                 dev_err(dev, "failed to set hibernate mode: %d\n",
498                                                 ret);
499                                 goto err_free_irq;
500                         }
501                 }
502         }
503
504         if (IS_ENABLED(CONFIG_PM)) {
505                 pm_runtime_set_suspended(dev);  /* clear runtime_error flag */
506                 pm_runtime_enable(dev);
507         } else {
508                 ret = sirf_runtime_resume(dev);
509                 if (ret < 0)
510                         goto err_free_irq;
511         }
512
513         ret = gnss_register_device(gdev);
514         if (ret)
515                 goto err_disable_rpm;
516
517         return 0;
518
519 err_disable_rpm:
520         if (IS_ENABLED(CONFIG_PM))
521                 pm_runtime_disable(dev);
522         else
523                 sirf_runtime_suspend(dev);
524 err_free_irq:
525         if (data->wakeup)
526                 free_irq(data->irq, data);
527 err_disable_vcc:
528         if (data->on_off)
529                 regulator_disable(data->vcc);
530 err_put_device:
531         gnss_put_device(data->gdev);
532
533         return ret;
534 }
535
536 static void sirf_remove(struct serdev_device *serdev)
537 {
538         struct sirf_data *data = serdev_device_get_drvdata(serdev);
539
540         gnss_deregister_device(data->gdev);
541
542         if (IS_ENABLED(CONFIG_PM))
543                 pm_runtime_disable(&serdev->dev);
544         else
545                 sirf_runtime_suspend(&serdev->dev);
546
547         if (data->wakeup)
548                 free_irq(data->irq, data);
549
550         if (data->on_off)
551                 regulator_disable(data->vcc);
552
553         gnss_put_device(data->gdev);
554 };
555
556 #ifdef CONFIG_OF
557 static const struct of_device_id sirf_of_match[] = {
558         { .compatible = "fastrax,uc430" },
559         { .compatible = "linx,r4" },
560         { .compatible = "wi2wi,w2sg0004" },
561         { .compatible = "wi2wi,w2sg0008i" },
562         { .compatible = "wi2wi,w2sg0084i" },
563         {},
564 };
565 MODULE_DEVICE_TABLE(of, sirf_of_match);
566 #endif
567
568 static struct serdev_device_driver sirf_driver = {
569         .driver = {
570                 .name           = "gnss-sirf",
571                 .of_match_table = of_match_ptr(sirf_of_match),
572                 .pm             = &sirf_pm_ops,
573         },
574         .probe  = sirf_probe,
575         .remove = sirf_remove,
576 };
577 module_serdev_device_driver(sirf_driver);
578
579 MODULE_AUTHOR("Johan Hovold <johan@kernel.org>");
580 MODULE_DESCRIPTION("SiRFstar GNSS receiver driver");
581 MODULE_LICENSE("GPL v2");