2 * Renesas R-Car GyroADC driver
4 * Copyright 2016 Marek Vasut <marek.vasut@gmail.com>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
17 #include <linux/module.h>
18 #include <linux/platform_device.h>
19 #include <linux/delay.h>
20 #include <linux/kernel.h>
21 #include <linux/slab.h>
23 #include <linux/clk.h>
25 #include <linux/of_irq.h>
26 #include <linux/regulator/consumer.h>
27 #include <linux/of_platform.h>
28 #include <linux/err.h>
29 #include <linux/pm_runtime.h>
31 #include <linux/iio/iio.h>
32 #include <linux/iio/sysfs.h>
33 #include <linux/iio/trigger.h>
35 #define DRIVER_NAME "rcar-gyroadc"
37 /* GyroADC registers. */
38 #define RCAR_GYROADC_MODE_SELECT 0x00
39 #define RCAR_GYROADC_MODE_SELECT_1_MB88101A 0x0
40 #define RCAR_GYROADC_MODE_SELECT_2_ADCS7476 0x1
41 #define RCAR_GYROADC_MODE_SELECT_3_MAX1162 0x3
43 #define RCAR_GYROADC_START_STOP 0x04
44 #define RCAR_GYROADC_START_STOP_START BIT(0)
46 #define RCAR_GYROADC_CLOCK_LENGTH 0x08
47 #define RCAR_GYROADC_1_25MS_LENGTH 0x0c
49 #define RCAR_GYROADC_REALTIME_DATA(ch) (0x10 + ((ch) * 4))
50 #define RCAR_GYROADC_100MS_ADDED_DATA(ch) (0x30 + ((ch) * 4))
51 #define RCAR_GYROADC_10MS_AVG_DATA(ch) (0x50 + ((ch) * 4))
53 #define RCAR_GYROADC_FIFO_STATUS 0x70
54 #define RCAR_GYROADC_FIFO_STATUS_EMPTY(ch) BIT(0 + (4 * (ch)))
55 #define RCAR_GYROADC_FIFO_STATUS_FULL(ch) BIT(1 + (4 * (ch)))
56 #define RCAR_GYROADC_FIFO_STATUS_ERROR(ch) BIT(2 + (4 * (ch)))
58 #define RCAR_GYROADC_INTR 0x74
59 #define RCAR_GYROADC_INTR_INT BIT(0)
61 #define RCAR_GYROADC_INTENR 0x78
62 #define RCAR_GYROADC_INTENR_INTEN BIT(0)
64 #define RCAR_GYROADC_SAMPLE_RATE 800 /* Hz */
66 #define RCAR_GYROADC_RUNTIME_PM_DELAY_MS 2000
68 enum rcar_gyroadc_model
{
69 RCAR_GYROADC_MODEL_DEFAULT
,
70 RCAR_GYROADC_MODEL_R8A7792
,
77 struct regulator
*vref
[8];
78 unsigned int num_channels
;
79 enum rcar_gyroadc_model model
;
81 unsigned int sample_width
;
84 static void rcar_gyroadc_hw_init(struct rcar_gyroadc
*priv
)
86 const unsigned long clk_mhz
= clk_get_rate(priv
->clk
) / 1000000;
87 const unsigned long clk_mul
=
88 (priv
->mode
== RCAR_GYROADC_MODE_SELECT_1_MB88101A
) ? 10 : 5;
89 unsigned long clk_len
= clk_mhz
* clk_mul
;
92 * According to the R-Car Gen2 datasheet Rev. 1.01, Sept 08 2014,
93 * page 77-7, clock length must be even number. If it's odd number,
99 /* Stop the GyroADC. */
100 writel(0, priv
->regs
+ RCAR_GYROADC_START_STOP
);
102 /* Disable IRQ on V2H. */
103 if (priv
->model
== RCAR_GYROADC_MODEL_R8A7792
)
104 writel(0, priv
->regs
+ RCAR_GYROADC_INTENR
);
106 /* Set mode and timing. */
107 writel(priv
->mode
, priv
->regs
+ RCAR_GYROADC_MODE_SELECT
);
108 writel(clk_len
, priv
->regs
+ RCAR_GYROADC_CLOCK_LENGTH
);
109 writel(clk_mhz
* 1250, priv
->regs
+ RCAR_GYROADC_1_25MS_LENGTH
);
112 static void rcar_gyroadc_hw_start(struct rcar_gyroadc
*priv
)
114 /* Start sampling. */
115 writel(RCAR_GYROADC_START_STOP_START
,
116 priv
->regs
+ RCAR_GYROADC_START_STOP
);
119 * Wait for the first conversion to complete. This is longer than
120 * the 1.25 mS in the datasheet because 1.25 mS is not enough for
121 * the hardware to deliver the first sample and the hardware does
122 * then return zeroes instead of valid data.
127 static void rcar_gyroadc_hw_stop(struct rcar_gyroadc
*priv
)
129 /* Stop the GyroADC. */
130 writel(0, priv
->regs
+ RCAR_GYROADC_START_STOP
);
133 #define RCAR_GYROADC_CHAN(_idx) { \
134 .type = IIO_VOLTAGE, \
137 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
138 BIT(IIO_CHAN_INFO_SCALE), \
139 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
142 static const struct iio_chan_spec rcar_gyroadc_iio_channels_1
[] = {
143 RCAR_GYROADC_CHAN(0),
144 RCAR_GYROADC_CHAN(1),
145 RCAR_GYROADC_CHAN(2),
146 RCAR_GYROADC_CHAN(3),
149 static const struct iio_chan_spec rcar_gyroadc_iio_channels_2
[] = {
150 RCAR_GYROADC_CHAN(0),
151 RCAR_GYROADC_CHAN(1),
152 RCAR_GYROADC_CHAN(2),
153 RCAR_GYROADC_CHAN(3),
154 RCAR_GYROADC_CHAN(4),
155 RCAR_GYROADC_CHAN(5),
156 RCAR_GYROADC_CHAN(6),
157 RCAR_GYROADC_CHAN(7),
160 static const struct iio_chan_spec rcar_gyroadc_iio_channels_3
[] = {
161 RCAR_GYROADC_CHAN(0),
162 RCAR_GYROADC_CHAN(1),
163 RCAR_GYROADC_CHAN(2),
164 RCAR_GYROADC_CHAN(3),
165 RCAR_GYROADC_CHAN(4),
166 RCAR_GYROADC_CHAN(5),
167 RCAR_GYROADC_CHAN(6),
168 RCAR_GYROADC_CHAN(7),
171 static int rcar_gyroadc_set_power(struct rcar_gyroadc
*priv
, bool on
)
173 struct device
*dev
= priv
->dev
;
177 ret
= pm_runtime_get_sync(dev
);
179 pm_runtime_put_noidle(dev
);
181 pm_runtime_mark_last_busy(dev
);
182 ret
= pm_runtime_put_autosuspend(dev
);
188 static int rcar_gyroadc_read_raw(struct iio_dev
*indio_dev
,
189 struct iio_chan_spec
const *chan
,
190 int *val
, int *val2
, long mask
)
192 struct rcar_gyroadc
*priv
= iio_priv(indio_dev
);
193 struct regulator
*consumer
;
194 unsigned int datareg
= RCAR_GYROADC_REALTIME_DATA(chan
->channel
);
199 * MB88101 is special in that it has only single regulator for
202 if (priv
->mode
== RCAR_GYROADC_MODE_SELECT_1_MB88101A
)
203 consumer
= priv
->vref
[0];
205 consumer
= priv
->vref
[chan
->channel
];
208 case IIO_CHAN_INFO_RAW
:
209 if (chan
->type
!= IIO_VOLTAGE
)
212 /* Channel not connected. */
216 ret
= iio_device_claim_direct_mode(indio_dev
);
220 ret
= rcar_gyroadc_set_power(priv
, true);
222 iio_device_release_direct_mode(indio_dev
);
226 *val
= readl(priv
->regs
+ datareg
);
227 *val
&= BIT(priv
->sample_width
) - 1;
229 ret
= rcar_gyroadc_set_power(priv
, false);
230 iio_device_release_direct_mode(indio_dev
);
235 case IIO_CHAN_INFO_SCALE
:
236 /* Channel not connected. */
240 vref
= regulator_get_voltage(consumer
);
242 *val2
= 1 << priv
->sample_width
;
244 return IIO_VAL_FRACTIONAL
;
245 case IIO_CHAN_INFO_SAMP_FREQ
:
246 *val
= RCAR_GYROADC_SAMPLE_RATE
;
254 static int rcar_gyroadc_reg_access(struct iio_dev
*indio_dev
,
255 unsigned int reg
, unsigned int writeval
,
256 unsigned int *readval
)
258 struct rcar_gyroadc
*priv
= iio_priv(indio_dev
);
259 unsigned int maxreg
= RCAR_GYROADC_FIFO_STATUS
;
267 /* Handle the V2H case with extra interrupt block. */
268 if (priv
->model
== RCAR_GYROADC_MODEL_R8A7792
)
269 maxreg
= RCAR_GYROADC_INTENR
;
274 *readval
= readl(priv
->regs
+ reg
);
279 static const struct iio_info rcar_gyroadc_iio_info
= {
280 .read_raw
= rcar_gyroadc_read_raw
,
281 .debugfs_reg_access
= rcar_gyroadc_reg_access
,
284 static const struct of_device_id rcar_gyroadc_match
[] = {
286 /* R-Car compatible GyroADC */
287 .compatible
= "renesas,rcar-gyroadc",
288 .data
= (void *)RCAR_GYROADC_MODEL_DEFAULT
,
290 /* R-Car V2H specialty with interrupt registers. */
291 .compatible
= "renesas,r8a7792-gyroadc",
292 .data
= (void *)RCAR_GYROADC_MODEL_R8A7792
,
298 MODULE_DEVICE_TABLE(of
, rcar_gyroadc_match
);
300 static const struct of_device_id rcar_gyroadc_child_match
[] = {
303 .compatible
= "fujitsu,mb88101a",
304 .data
= (void *)RCAR_GYROADC_MODE_SELECT_1_MB88101A
,
308 .compatible
= "ti,adcs7476",
309 .data
= (void *)RCAR_GYROADC_MODE_SELECT_2_ADCS7476
,
311 .compatible
= "ti,adc121",
312 .data
= (void *)RCAR_GYROADC_MODE_SELECT_2_ADCS7476
,
314 .compatible
= "adi,ad7476",
315 .data
= (void *)RCAR_GYROADC_MODE_SELECT_2_ADCS7476
,
319 .compatible
= "maxim,max1162",
320 .data
= (void *)RCAR_GYROADC_MODE_SELECT_3_MAX1162
,
322 .compatible
= "maxim,max11100",
323 .data
= (void *)RCAR_GYROADC_MODE_SELECT_3_MAX1162
,
328 static int rcar_gyroadc_parse_subdevs(struct iio_dev
*indio_dev
)
330 const struct of_device_id
*of_id
;
331 const struct iio_chan_spec
*channels
;
332 struct rcar_gyroadc
*priv
= iio_priv(indio_dev
);
333 struct device
*dev
= priv
->dev
;
334 struct device_node
*np
= dev
->of_node
;
335 struct device_node
*child
;
336 struct regulator
*vref
;
338 unsigned int adcmode
= -1, childmode
;
339 unsigned int sample_width
;
340 unsigned int num_channels
;
343 for_each_child_of_node(np
, child
) {
344 of_id
= of_match_node(rcar_gyroadc_child_match
, child
);
346 dev_err(dev
, "Ignoring unsupported ADC \"%s\".",
351 childmode
= (uintptr_t)of_id
->data
;
353 case RCAR_GYROADC_MODE_SELECT_1_MB88101A
:
355 channels
= rcar_gyroadc_iio_channels_1
;
356 num_channels
= ARRAY_SIZE(rcar_gyroadc_iio_channels_1
);
358 case RCAR_GYROADC_MODE_SELECT_2_ADCS7476
:
360 channels
= rcar_gyroadc_iio_channels_2
;
361 num_channels
= ARRAY_SIZE(rcar_gyroadc_iio_channels_2
);
363 case RCAR_GYROADC_MODE_SELECT_3_MAX1162
:
365 channels
= rcar_gyroadc_iio_channels_3
;
366 num_channels
= ARRAY_SIZE(rcar_gyroadc_iio_channels_3
);
373 * MB88101 is special in that it's only a single chip taking
374 * up all the CHS lines. Thus, the DT binding is also special
375 * and has no reg property. If we run into such ADC, handle
378 if (childmode
== RCAR_GYROADC_MODE_SELECT_1_MB88101A
) {
381 ret
= of_property_read_u32(child
, "reg", ®
);
384 "Failed to get child reg property of ADC \"%s\".\n",
389 /* Channel number is too high. */
390 if (reg
>= num_channels
) {
392 "Only %i channels supported with %s, but reg = <%i>.\n",
393 num_channels
, child
->name
, reg
);
398 /* Child node selected different mode than the rest. */
399 if (!first
&& (adcmode
!= childmode
)) {
401 "Channel %i uses different ADC mode than the rest.\n",
406 /* Channel is valid, grab the regulator. */
407 dev
->of_node
= child
;
408 vref
= devm_regulator_get(dev
, "vref");
411 dev_dbg(dev
, "Channel %i 'vref' supply not connected.\n",
413 return PTR_ERR(vref
);
416 priv
->vref
[reg
] = vref
;
421 /* First child node which passed sanity tests. */
425 priv
->num_channels
= num_channels
;
426 priv
->mode
= childmode
;
427 priv
->sample_width
= sample_width
;
429 indio_dev
->channels
= channels
;
430 indio_dev
->num_channels
= num_channels
;
433 * MB88101 is special and we only have one such device
434 * attached to the GyroADC at a time, so if we found it,
435 * we can stop parsing here.
437 if (childmode
== RCAR_GYROADC_MODE_SELECT_1_MB88101A
)
442 dev_err(dev
, "No valid ADC channels found, aborting.\n");
449 static void rcar_gyroadc_deinit_supplies(struct iio_dev
*indio_dev
)
451 struct rcar_gyroadc
*priv
= iio_priv(indio_dev
);
454 for (i
= 0; i
< priv
->num_channels
; i
++) {
458 regulator_disable(priv
->vref
[i
]);
462 static int rcar_gyroadc_init_supplies(struct iio_dev
*indio_dev
)
464 struct rcar_gyroadc
*priv
= iio_priv(indio_dev
);
465 struct device
*dev
= priv
->dev
;
469 for (i
= 0; i
< priv
->num_channels
; i
++) {
473 ret
= regulator_enable(priv
->vref
[i
]);
475 dev_err(dev
, "Failed to enable regulator %i (ret=%i)\n",
484 rcar_gyroadc_deinit_supplies(indio_dev
);
488 static int rcar_gyroadc_probe(struct platform_device
*pdev
)
490 struct device
*dev
= &pdev
->dev
;
491 struct rcar_gyroadc
*priv
;
492 struct iio_dev
*indio_dev
;
493 struct resource
*mem
;
496 indio_dev
= devm_iio_device_alloc(dev
, sizeof(*priv
));
498 dev_err(dev
, "Failed to allocate IIO device.\n");
502 priv
= iio_priv(indio_dev
);
505 mem
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
506 priv
->regs
= devm_ioremap_resource(dev
, mem
);
507 if (IS_ERR(priv
->regs
))
508 return PTR_ERR(priv
->regs
);
510 priv
->clk
= devm_clk_get(dev
, "fck");
511 if (IS_ERR(priv
->clk
)) {
512 ret
= PTR_ERR(priv
->clk
);
513 if (ret
!= -EPROBE_DEFER
)
514 dev_err(dev
, "Failed to get IF clock (ret=%i)\n", ret
);
518 ret
= rcar_gyroadc_parse_subdevs(indio_dev
);
522 ret
= rcar_gyroadc_init_supplies(indio_dev
);
526 priv
->model
= (enum rcar_gyroadc_model
)
527 of_device_get_match_data(&pdev
->dev
);
529 platform_set_drvdata(pdev
, indio_dev
);
531 indio_dev
->name
= DRIVER_NAME
;
532 indio_dev
->dev
.parent
= dev
;
533 indio_dev
->dev
.of_node
= pdev
->dev
.of_node
;
534 indio_dev
->info
= &rcar_gyroadc_iio_info
;
535 indio_dev
->modes
= INDIO_DIRECT_MODE
;
537 ret
= clk_prepare_enable(priv
->clk
);
539 dev_err(dev
, "Could not prepare or enable the IF clock.\n");
540 goto err_clk_if_enable
;
543 pm_runtime_set_autosuspend_delay(dev
, RCAR_GYROADC_RUNTIME_PM_DELAY_MS
);
544 pm_runtime_use_autosuspend(dev
);
545 pm_runtime_enable(dev
);
547 pm_runtime_get_sync(dev
);
548 rcar_gyroadc_hw_init(priv
);
549 rcar_gyroadc_hw_start(priv
);
551 ret
= iio_device_register(indio_dev
);
553 dev_err(dev
, "Couldn't register IIO device.\n");
554 goto err_iio_device_register
;
557 pm_runtime_put_sync(dev
);
561 err_iio_device_register
:
562 rcar_gyroadc_hw_stop(priv
);
563 pm_runtime_put_sync(dev
);
564 pm_runtime_disable(dev
);
565 pm_runtime_set_suspended(dev
);
566 clk_disable_unprepare(priv
->clk
);
568 rcar_gyroadc_deinit_supplies(indio_dev
);
573 static int rcar_gyroadc_remove(struct platform_device
*pdev
)
575 struct iio_dev
*indio_dev
= platform_get_drvdata(pdev
);
576 struct rcar_gyroadc
*priv
= iio_priv(indio_dev
);
577 struct device
*dev
= priv
->dev
;
579 iio_device_unregister(indio_dev
);
580 pm_runtime_get_sync(dev
);
581 rcar_gyroadc_hw_stop(priv
);
582 pm_runtime_put_sync(dev
);
583 pm_runtime_disable(dev
);
584 pm_runtime_set_suspended(dev
);
585 clk_disable_unprepare(priv
->clk
);
586 rcar_gyroadc_deinit_supplies(indio_dev
);
591 #if defined(CONFIG_PM)
592 static int rcar_gyroadc_suspend(struct device
*dev
)
594 struct iio_dev
*indio_dev
= dev_get_drvdata(dev
);
595 struct rcar_gyroadc
*priv
= iio_priv(indio_dev
);
597 rcar_gyroadc_hw_stop(priv
);
602 static int rcar_gyroadc_resume(struct device
*dev
)
604 struct iio_dev
*indio_dev
= dev_get_drvdata(dev
);
605 struct rcar_gyroadc
*priv
= iio_priv(indio_dev
);
607 rcar_gyroadc_hw_start(priv
);
613 static const struct dev_pm_ops rcar_gyroadc_pm_ops
= {
614 SET_RUNTIME_PM_OPS(rcar_gyroadc_suspend
, rcar_gyroadc_resume
, NULL
)
617 static struct platform_driver rcar_gyroadc_driver
= {
618 .probe
= rcar_gyroadc_probe
,
619 .remove
= rcar_gyroadc_remove
,
622 .of_match_table
= rcar_gyroadc_match
,
623 .pm
= &rcar_gyroadc_pm_ops
,
627 module_platform_driver(rcar_gyroadc_driver
);
629 MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>");
630 MODULE_DESCRIPTION("Renesas R-Car GyroADC driver");
631 MODULE_LICENSE("GPL");