forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
kernel/drivers/iio/adc/sc27xx_adc.c
....@@ -3,12 +3,13 @@
33
44 #include <linux/hwspinlock.h>
55 #include <linux/iio/iio.h>
6
-#include <linux/interrupt.h>
76 #include <linux/module.h>
7
+#include <linux/nvmem-consumer.h>
88 #include <linux/of.h>
99 #include <linux/of_device.h>
1010 #include <linux/platform_device.h>
1111 #include <linux/regmap.h>
12
+#include <linux/slab.h>
1213
1314 /* PMIC global registers definition */
1415 #define SC27XX_MODULE_EN 0xc08
....@@ -35,8 +36,8 @@
3536
3637 /* Bits and mask definition for SC27XX_ADC_CH_CFG register */
3738 #define SC27XX_ADC_CHN_ID_MASK GENMASK(4, 0)
38
-#define SC27XX_ADC_SCALE_MASK GENMASK(10, 8)
39
-#define SC27XX_ADC_SCALE_SHIFT 8
39
+#define SC27XX_ADC_SCALE_MASK GENMASK(10, 9)
40
+#define SC27XX_ADC_SCALE_SHIFT 9
4041
4142 /* Bits definitions for SC27XX_ADC_INT_EN registers */
4243 #define SC27XX_ADC_IRQ_EN BIT(0)
....@@ -44,11 +45,18 @@
4445 /* Bits definitions for SC27XX_ADC_INT_CLR registers */
4546 #define SC27XX_ADC_IRQ_CLR BIT(0)
4647
48
+/* Bits definitions for SC27XX_ADC_INT_RAW registers */
49
+#define SC27XX_ADC_IRQ_RAW BIT(0)
50
+
4751 /* Mask definition for SC27XX_ADC_DATA register */
4852 #define SC27XX_ADC_DATA_MASK GENMASK(11, 0)
4953
5054 /* Timeout (ms) for the trylock of hardware spinlocks */
5155 #define SC27XX_ADC_HWLOCK_TIMEOUT 5000
56
+
57
+/* Timeout (us) for ADC data conversion according to ADC datasheet */
58
+#define SC27XX_ADC_RDY_TIMEOUT 1000000
59
+#define SC27XX_ADC_POLL_RAW_STATUS 500
5260
5361 /* Maximum ADC channel number */
5462 #define SC27XX_ADC_CHANNEL_MAX 32
....@@ -67,10 +75,8 @@
6775 * subsystems which will access the unique ADC controller.
6876 */
6977 struct hwspinlock *hwlock;
70
- struct completion completion;
7178 int channel_scale[SC27XX_ADC_CHANNEL_MAX];
7279 u32 base;
73
- int value;
7480 int irq;
7581 };
7682
....@@ -87,15 +93,72 @@
8793 * should use the small-scale graph, and if more than 1.2v, we should use the
8894 * big-scale graph.
8995 */
90
-static const struct sc27xx_adc_linear_graph big_scale_graph = {
96
+static struct sc27xx_adc_linear_graph big_scale_graph = {
9197 4200, 3310,
9298 3600, 2832,
9399 };
94100
95
-static const struct sc27xx_adc_linear_graph small_scale_graph = {
101
+static struct sc27xx_adc_linear_graph small_scale_graph = {
96102 1000, 3413,
97103 100, 341,
98104 };
105
+
106
+static const struct sc27xx_adc_linear_graph sc2731_big_scale_graph_calib = {
107
+ 4200, 850,
108
+ 3600, 728,
109
+};
110
+
111
+static const struct sc27xx_adc_linear_graph sc2731_small_scale_graph_calib = {
112
+ 1000, 838,
113
+ 100, 84,
114
+};
115
+
116
+static int sc27xx_adc_get_calib_data(u32 calib_data, int calib_adc)
117
+{
118
+ return ((calib_data & 0xff) + calib_adc - 128) * 4;
119
+}
120
+
121
+static int sc27xx_adc_scale_calibration(struct sc27xx_adc_data *data,
122
+ bool big_scale)
123
+{
124
+ const struct sc27xx_adc_linear_graph *calib_graph;
125
+ struct sc27xx_adc_linear_graph *graph;
126
+ struct nvmem_cell *cell;
127
+ const char *cell_name;
128
+ u32 calib_data = 0;
129
+ void *buf;
130
+ size_t len;
131
+
132
+ if (big_scale) {
133
+ calib_graph = &sc2731_big_scale_graph_calib;
134
+ graph = &big_scale_graph;
135
+ cell_name = "big_scale_calib";
136
+ } else {
137
+ calib_graph = &sc2731_small_scale_graph_calib;
138
+ graph = &small_scale_graph;
139
+ cell_name = "small_scale_calib";
140
+ }
141
+
142
+ cell = nvmem_cell_get(data->dev, cell_name);
143
+ if (IS_ERR(cell))
144
+ return PTR_ERR(cell);
145
+
146
+ buf = nvmem_cell_read(cell, &len);
147
+ nvmem_cell_put(cell);
148
+
149
+ if (IS_ERR(buf))
150
+ return PTR_ERR(buf);
151
+
152
+ memcpy(&calib_data, buf, min(len, sizeof(u32)));
153
+
154
+ /* Only need to calibrate the adc values in the linear graph. */
155
+ graph->adc0 = sc27xx_adc_get_calib_data(calib_data, calib_graph->adc0);
156
+ graph->adc1 = sc27xx_adc_get_calib_data(calib_data >> 8,
157
+ calib_graph->adc1);
158
+
159
+ kfree(buf);
160
+ return 0;
161
+}
99162
100163 static int sc27xx_adc_get_ratio(int channel, int scale)
101164 {
....@@ -126,9 +189,7 @@
126189 int scale, int *val)
127190 {
128191 int ret;
129
- u32 tmp;
130
-
131
- reinit_completion(&data->completion);
192
+ u32 tmp, value, status;
132193
133194 ret = hwspin_lock_timeout_raw(data->hwlock, SC27XX_ADC_HWLOCK_TIMEOUT);
134195 if (ret) {
....@@ -140,6 +201,11 @@
140201 SC27XX_ADC_EN, SC27XX_ADC_EN);
141202 if (ret)
142203 goto unlock_adc;
204
+
205
+ ret = regmap_update_bits(data->regmap, data->base + SC27XX_ADC_INT_CLR,
206
+ SC27XX_ADC_IRQ_CLR, SC27XX_ADC_IRQ_CLR);
207
+ if (ret)
208
+ goto disable_adc;
143209
144210 /* Configure the channel id and scale */
145211 tmp = (scale << SC27XX_ADC_SCALE_SHIFT) & SC27XX_ADC_SCALE_MASK;
....@@ -164,7 +230,21 @@
164230 if (ret)
165231 goto disable_adc;
166232
167
- wait_for_completion(&data->completion);
233
+ ret = regmap_read_poll_timeout(data->regmap,
234
+ data->base + SC27XX_ADC_INT_RAW,
235
+ status, (status & SC27XX_ADC_IRQ_RAW),
236
+ SC27XX_ADC_POLL_RAW_STATUS,
237
+ SC27XX_ADC_RDY_TIMEOUT);
238
+ if (ret) {
239
+ dev_err(data->dev, "read adc timeout, status = 0x%x\n", status);
240
+ goto disable_adc;
241
+ }
242
+
243
+ ret = regmap_read(data->regmap, data->base + SC27XX_ADC_DATA, &value);
244
+ if (ret)
245
+ goto disable_adc;
246
+
247
+ value &= SC27XX_ADC_DATA_MASK;
168248
169249 disable_adc:
170250 regmap_update_bits(data->regmap, data->base + SC27XX_ADC_CTL,
....@@ -173,30 +253,9 @@
173253 hwspin_unlock_raw(data->hwlock);
174254
175255 if (!ret)
176
- *val = data->value;
256
+ *val = value;
177257
178258 return ret;
179
-}
180
-
181
-static irqreturn_t sc27xx_adc_isr(int irq, void *dev_id)
182
-{
183
- struct sc27xx_adc_data *data = dev_id;
184
- int ret;
185
-
186
- ret = regmap_update_bits(data->regmap, data->base + SC27XX_ADC_INT_CLR,
187
- SC27XX_ADC_IRQ_CLR, SC27XX_ADC_IRQ_CLR);
188
- if (ret)
189
- return IRQ_RETVAL(ret);
190
-
191
- ret = regmap_read(data->regmap, data->base + SC27XX_ADC_DATA,
192
- &data->value);
193
- if (ret)
194
- return IRQ_RETVAL(ret);
195
-
196
- data->value &= SC27XX_ADC_DATA_MASK;
197
- complete(&data->completion);
198
-
199
- return IRQ_HANDLED;
200259 }
201260
202261 static void sc27xx_adc_volt_ratio(struct sc27xx_adc_data *data,
....@@ -209,7 +268,7 @@
209268 *div_denominator = ratio & SC27XX_RATIO_DENOMINATOR_MASK;
210269 }
211270
212
-static int sc27xx_adc_to_volt(const struct sc27xx_adc_linear_graph *graph,
271
+static int sc27xx_adc_to_volt(struct sc27xx_adc_linear_graph *graph,
213272 int raw_adc)
214273 {
215274 int tmp;
....@@ -273,6 +332,17 @@
273332 int ret, tmp;
274333
275334 switch (mask) {
335
+ case IIO_CHAN_INFO_RAW:
336
+ mutex_lock(&indio_dev->mlock);
337
+ ret = sc27xx_adc_read(data, chan->channel, scale, &tmp);
338
+ mutex_unlock(&indio_dev->mlock);
339
+
340
+ if (ret)
341
+ return ret;
342
+
343
+ *val = tmp;
344
+ return IIO_VAL_INT;
345
+
276346 case IIO_CHAN_INFO_PROCESSED:
277347 mutex_lock(&indio_dev->mlock);
278348 ret = sc27xx_adc_read_processed(data, chan->channel, scale,
....@@ -315,48 +385,47 @@
315385 .write_raw = &sc27xx_adc_write_raw,
316386 };
317387
318
-#define SC27XX_ADC_CHANNEL(index) { \
388
+#define SC27XX_ADC_CHANNEL(index, mask) { \
319389 .type = IIO_VOLTAGE, \
320390 .channel = index, \
321
- .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) | \
322
- BIT(IIO_CHAN_INFO_SCALE), \
391
+ .info_mask_separate = mask | BIT(IIO_CHAN_INFO_SCALE), \
323392 .datasheet_name = "CH##index", \
324393 .indexed = 1, \
325394 }
326395
327396 static const struct iio_chan_spec sc27xx_channels[] = {
328
- SC27XX_ADC_CHANNEL(0),
329
- SC27XX_ADC_CHANNEL(1),
330
- SC27XX_ADC_CHANNEL(2),
331
- SC27XX_ADC_CHANNEL(3),
332
- SC27XX_ADC_CHANNEL(4),
333
- SC27XX_ADC_CHANNEL(5),
334
- SC27XX_ADC_CHANNEL(6),
335
- SC27XX_ADC_CHANNEL(7),
336
- SC27XX_ADC_CHANNEL(8),
337
- SC27XX_ADC_CHANNEL(9),
338
- SC27XX_ADC_CHANNEL(10),
339
- SC27XX_ADC_CHANNEL(11),
340
- SC27XX_ADC_CHANNEL(12),
341
- SC27XX_ADC_CHANNEL(13),
342
- SC27XX_ADC_CHANNEL(14),
343
- SC27XX_ADC_CHANNEL(15),
344
- SC27XX_ADC_CHANNEL(16),
345
- SC27XX_ADC_CHANNEL(17),
346
- SC27XX_ADC_CHANNEL(18),
347
- SC27XX_ADC_CHANNEL(19),
348
- SC27XX_ADC_CHANNEL(20),
349
- SC27XX_ADC_CHANNEL(21),
350
- SC27XX_ADC_CHANNEL(22),
351
- SC27XX_ADC_CHANNEL(23),
352
- SC27XX_ADC_CHANNEL(24),
353
- SC27XX_ADC_CHANNEL(25),
354
- SC27XX_ADC_CHANNEL(26),
355
- SC27XX_ADC_CHANNEL(27),
356
- SC27XX_ADC_CHANNEL(28),
357
- SC27XX_ADC_CHANNEL(29),
358
- SC27XX_ADC_CHANNEL(30),
359
- SC27XX_ADC_CHANNEL(31),
397
+ SC27XX_ADC_CHANNEL(0, BIT(IIO_CHAN_INFO_PROCESSED)),
398
+ SC27XX_ADC_CHANNEL(1, BIT(IIO_CHAN_INFO_PROCESSED)),
399
+ SC27XX_ADC_CHANNEL(2, BIT(IIO_CHAN_INFO_PROCESSED)),
400
+ SC27XX_ADC_CHANNEL(3, BIT(IIO_CHAN_INFO_PROCESSED)),
401
+ SC27XX_ADC_CHANNEL(4, BIT(IIO_CHAN_INFO_PROCESSED)),
402
+ SC27XX_ADC_CHANNEL(5, BIT(IIO_CHAN_INFO_PROCESSED)),
403
+ SC27XX_ADC_CHANNEL(6, BIT(IIO_CHAN_INFO_PROCESSED)),
404
+ SC27XX_ADC_CHANNEL(7, BIT(IIO_CHAN_INFO_PROCESSED)),
405
+ SC27XX_ADC_CHANNEL(8, BIT(IIO_CHAN_INFO_PROCESSED)),
406
+ SC27XX_ADC_CHANNEL(9, BIT(IIO_CHAN_INFO_PROCESSED)),
407
+ SC27XX_ADC_CHANNEL(10, BIT(IIO_CHAN_INFO_PROCESSED)),
408
+ SC27XX_ADC_CHANNEL(11, BIT(IIO_CHAN_INFO_PROCESSED)),
409
+ SC27XX_ADC_CHANNEL(12, BIT(IIO_CHAN_INFO_PROCESSED)),
410
+ SC27XX_ADC_CHANNEL(13, BIT(IIO_CHAN_INFO_PROCESSED)),
411
+ SC27XX_ADC_CHANNEL(14, BIT(IIO_CHAN_INFO_PROCESSED)),
412
+ SC27XX_ADC_CHANNEL(15, BIT(IIO_CHAN_INFO_PROCESSED)),
413
+ SC27XX_ADC_CHANNEL(16, BIT(IIO_CHAN_INFO_PROCESSED)),
414
+ SC27XX_ADC_CHANNEL(17, BIT(IIO_CHAN_INFO_PROCESSED)),
415
+ SC27XX_ADC_CHANNEL(18, BIT(IIO_CHAN_INFO_PROCESSED)),
416
+ SC27XX_ADC_CHANNEL(19, BIT(IIO_CHAN_INFO_PROCESSED)),
417
+ SC27XX_ADC_CHANNEL(20, BIT(IIO_CHAN_INFO_RAW)),
418
+ SC27XX_ADC_CHANNEL(21, BIT(IIO_CHAN_INFO_PROCESSED)),
419
+ SC27XX_ADC_CHANNEL(22, BIT(IIO_CHAN_INFO_PROCESSED)),
420
+ SC27XX_ADC_CHANNEL(23, BIT(IIO_CHAN_INFO_PROCESSED)),
421
+ SC27XX_ADC_CHANNEL(24, BIT(IIO_CHAN_INFO_PROCESSED)),
422
+ SC27XX_ADC_CHANNEL(25, BIT(IIO_CHAN_INFO_PROCESSED)),
423
+ SC27XX_ADC_CHANNEL(26, BIT(IIO_CHAN_INFO_PROCESSED)),
424
+ SC27XX_ADC_CHANNEL(27, BIT(IIO_CHAN_INFO_PROCESSED)),
425
+ SC27XX_ADC_CHANNEL(28, BIT(IIO_CHAN_INFO_PROCESSED)),
426
+ SC27XX_ADC_CHANNEL(29, BIT(IIO_CHAN_INFO_PROCESSED)),
427
+ SC27XX_ADC_CHANNEL(30, BIT(IIO_CHAN_INFO_PROCESSED)),
428
+ SC27XX_ADC_CHANNEL(31, BIT(IIO_CHAN_INFO_PROCESSED)),
360429 };
361430
362431 static int sc27xx_adc_enable(struct sc27xx_adc_data *data)
....@@ -375,8 +444,12 @@
375444 if (ret)
376445 goto disable_adc;
377446
378
- ret = regmap_update_bits(data->regmap, data->base + SC27XX_ADC_INT_EN,
379
- SC27XX_ADC_IRQ_EN, SC27XX_ADC_IRQ_EN);
447
+ /* ADC channel scales' calibration from nvmem device */
448
+ ret = sc27xx_adc_scale_calibration(data, true);
449
+ if (ret)
450
+ goto disable_clk;
451
+
452
+ ret = sc27xx_adc_scale_calibration(data, false);
380453 if (ret)
381454 goto disable_clk;
382455
....@@ -396,9 +469,6 @@
396469 {
397470 struct sc27xx_adc_data *data = _data;
398471
399
- regmap_update_bits(data->regmap, data->base + SC27XX_ADC_INT_EN,
400
- SC27XX_ADC_IRQ_EN, 0);
401
-
402472 /* Disable ADC work clock and controller clock */
403473 regmap_update_bits(data->regmap, SC27XX_ARM_CLK_EN,
404474 SC27XX_CLK_ADC_EN | SC27XX_CLK_ADC_CLK_EN, 0);
....@@ -407,97 +477,70 @@
407477 SC27XX_MODULE_ADC_EN, 0);
408478 }
409479
410
-static void sc27xx_adc_free_hwlock(void *_data)
411
-{
412
- struct hwspinlock *hwlock = _data;
413
-
414
- hwspin_lock_free(hwlock);
415
-}
416
-
417480 static int sc27xx_adc_probe(struct platform_device *pdev)
418481 {
419
- struct device_node *np = pdev->dev.of_node;
482
+ struct device *dev = &pdev->dev;
483
+ struct device_node *np = dev->of_node;
420484 struct sc27xx_adc_data *sc27xx_data;
421485 struct iio_dev *indio_dev;
422486 int ret;
423487
424
- indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*sc27xx_data));
488
+ indio_dev = devm_iio_device_alloc(dev, sizeof(*sc27xx_data));
425489 if (!indio_dev)
426490 return -ENOMEM;
427491
428492 sc27xx_data = iio_priv(indio_dev);
429493
430
- sc27xx_data->regmap = dev_get_regmap(pdev->dev.parent, NULL);
494
+ sc27xx_data->regmap = dev_get_regmap(dev->parent, NULL);
431495 if (!sc27xx_data->regmap) {
432
- dev_err(&pdev->dev, "failed to get ADC regmap\n");
496
+ dev_err(dev, "failed to get ADC regmap\n");
433497 return -ENODEV;
434498 }
435499
436500 ret = of_property_read_u32(np, "reg", &sc27xx_data->base);
437501 if (ret) {
438
- dev_err(&pdev->dev, "failed to get ADC base address\n");
502
+ dev_err(dev, "failed to get ADC base address\n");
439503 return ret;
440504 }
441505
442506 sc27xx_data->irq = platform_get_irq(pdev, 0);
443
- if (sc27xx_data->irq < 0) {
444
- dev_err(&pdev->dev, "failed to get ADC irq number\n");
507
+ if (sc27xx_data->irq < 0)
445508 return sc27xx_data->irq;
446
- }
447509
448510 ret = of_hwspin_lock_get_id(np, 0);
449511 if (ret < 0) {
450
- dev_err(&pdev->dev, "failed to get hwspinlock id\n");
512
+ dev_err(dev, "failed to get hwspinlock id\n");
451513 return ret;
452514 }
453515
454
- sc27xx_data->hwlock = hwspin_lock_request_specific(ret);
516
+ sc27xx_data->hwlock = devm_hwspin_lock_request_specific(dev, ret);
455517 if (!sc27xx_data->hwlock) {
456
- dev_err(&pdev->dev, "failed to request hwspinlock\n");
518
+ dev_err(dev, "failed to request hwspinlock\n");
457519 return -ENXIO;
458520 }
459521
460
- ret = devm_add_action(&pdev->dev, sc27xx_adc_free_hwlock,
461
- sc27xx_data->hwlock);
462
- if (ret) {
463
- sc27xx_adc_free_hwlock(sc27xx_data->hwlock);
464
- dev_err(&pdev->dev, "failed to add hwspinlock action\n");
465
- return ret;
466
- }
467
-
468
- init_completion(&sc27xx_data->completion);
469
- sc27xx_data->dev = &pdev->dev;
522
+ sc27xx_data->dev = dev;
470523
471524 ret = sc27xx_adc_enable(sc27xx_data);
472525 if (ret) {
473
- dev_err(&pdev->dev, "failed to enable ADC module\n");
526
+ dev_err(dev, "failed to enable ADC module\n");
474527 return ret;
475528 }
476529
477
- ret = devm_add_action(&pdev->dev, sc27xx_adc_disable, sc27xx_data);
530
+ ret = devm_add_action_or_reset(dev, sc27xx_adc_disable, sc27xx_data);
478531 if (ret) {
479
- sc27xx_adc_disable(sc27xx_data);
480
- dev_err(&pdev->dev, "failed to add ADC disable action\n");
532
+ dev_err(dev, "failed to add ADC disable action\n");
481533 return ret;
482534 }
483535
484
- ret = devm_request_threaded_irq(&pdev->dev, sc27xx_data->irq, NULL,
485
- sc27xx_adc_isr, IRQF_ONESHOT,
486
- pdev->name, sc27xx_data);
487
- if (ret) {
488
- dev_err(&pdev->dev, "failed to request ADC irq\n");
489
- return ret;
490
- }
491
-
492
- indio_dev->dev.parent = &pdev->dev;
493
- indio_dev->name = dev_name(&pdev->dev);
536
+ indio_dev->name = dev_name(dev);
494537 indio_dev->modes = INDIO_DIRECT_MODE;
495538 indio_dev->info = &sc27xx_info;
496539 indio_dev->channels = sc27xx_channels;
497540 indio_dev->num_channels = ARRAY_SIZE(sc27xx_channels);
498
- ret = devm_iio_device_register(&pdev->dev, indio_dev);
541
+ ret = devm_iio_device_register(dev, indio_dev);
499542 if (ret)
500
- dev_err(&pdev->dev, "could not register iio (ADC)");
543
+ dev_err(dev, "could not register iio (ADC)");
501544
502545 return ret;
503546 }