forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-11 072de836f53be56a70cecf70b43ae43b7ce17376
kernel/drivers/iio/adc/rockchip_saradc.c
....@@ -1,16 +1,7 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * Rockchip Successive Approximation Register (SAR) A/D Converter
34 * Copyright (C) 2014 ROCKCHIP, Inc.
4
- *
5
- * This program is free software; you can redistribute it and/or modify
6
- * it under the terms of the GNU General Public License as published by
7
- * the Free Software Foundation; either version 2 of the License, or
8
- * (at your option) any later version.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
145 */
156
167 #include <linux/module.h>
....@@ -82,6 +73,7 @@
8273 const struct rockchip_saradc_data *data;
8374 u16 last_val;
8475 const struct iio_chan_spec *last_chan;
76
+ struct notifier_block nb;
8577 bool suspended;
8678 #ifdef CONFIG_ROCKCHIP_SARADC_TEST_CHN
8779 bool test;
....@@ -321,6 +313,40 @@
321313 .power_down = rockchip_saradc_power_down_v1,
322314 };
323315
316
+static const struct iio_chan_spec rockchip_rk3528_saradc_iio_channels[] = {
317
+ SARADC_CHANNEL(0, "adc0", 10),
318
+ SARADC_CHANNEL(1, "adc1", 10),
319
+ SARADC_CHANNEL(2, "adc2", 10),
320
+ SARADC_CHANNEL(3, "adc3", 10),
321
+};
322
+
323
+static const struct rockchip_saradc_data rk3528_saradc_data = {
324
+ .channels = rockchip_rk3528_saradc_iio_channels,
325
+ .num_channels = ARRAY_SIZE(rockchip_rk3528_saradc_iio_channels),
326
+ .clk_rate = 1000000,
327
+ .start = rockchip_saradc_start_v2,
328
+ .read = rockchip_saradc_read_v2,
329
+};
330
+
331
+static const struct iio_chan_spec rockchip_rk3562_saradc_iio_channels[] = {
332
+ SARADC_CHANNEL(0, "adc0", 10),
333
+ SARADC_CHANNEL(1, "adc1", 10),
334
+ SARADC_CHANNEL(2, "adc2", 10),
335
+ SARADC_CHANNEL(3, "adc3", 10),
336
+ SARADC_CHANNEL(4, "adc4", 10),
337
+ SARADC_CHANNEL(5, "adc5", 10),
338
+ SARADC_CHANNEL(6, "adc6", 10),
339
+ SARADC_CHANNEL(7, "adc7", 10),
340
+};
341
+
342
+static const struct rockchip_saradc_data rk3562_saradc_data = {
343
+ .channels = rockchip_rk3562_saradc_iio_channels,
344
+ .num_channels = ARRAY_SIZE(rockchip_rk3562_saradc_iio_channels),
345
+ .clk_rate = 1000000,
346
+ .start = rockchip_saradc_start_v2,
347
+ .read = rockchip_saradc_read_v2,
348
+};
349
+
324350 static const struct iio_chan_spec rockchip_rk3568_saradc_iio_channels[] = {
325351 SARADC_CHANNEL(0, "adc0", 10),
326352 SARADC_CHANNEL(1, "adc1", 10),
....@@ -384,6 +410,12 @@
384410 .compatible = "rockchip,rk3399-saradc",
385411 .data = &rk3399_saradc_data,
386412 }, {
413
+ .compatible = "rockchip,rk3528-saradc",
414
+ .data = &rk3528_saradc_data,
415
+ }, {
416
+ .compatible = "rockchip,rk3562-saradc",
417
+ .data = &rk3562_saradc_data,
418
+ }, {
387419 .compatible = "rockchip,rk3568-saradc",
388420 .data = &rk3568_saradc_data,
389421 }, {
....@@ -397,7 +429,7 @@
397429 };
398430 MODULE_DEVICE_TABLE(of, rockchip_saradc_match);
399431
400
-/**
432
+/*
401433 * Reset SARADC Controller.
402434 */
403435 static void rockchip_saradc_reset_controller(struct reset_control *reset)
....@@ -468,6 +500,26 @@
468500 return IRQ_HANDLED;
469501 }
470502
503
+static int rockchip_saradc_volt_notify(struct notifier_block *nb,
504
+ unsigned long event,
505
+ void *data)
506
+{
507
+ struct rockchip_saradc *info =
508
+ container_of(nb, struct rockchip_saradc, nb);
509
+
510
+ if (event & REGULATOR_EVENT_VOLTAGE_CHANGE)
511
+ info->uv_vref = (unsigned long)data;
512
+
513
+ return NOTIFY_OK;
514
+}
515
+
516
+static void rockchip_saradc_regulator_unreg_notifier(void *data)
517
+{
518
+ struct rockchip_saradc *info = data;
519
+
520
+ regulator_unregister_notifier(info->vref, &info->nb);
521
+}
522
+
471523 #ifdef CONFIG_ROCKCHIP_SARADC_TEST_CHN
472524 static ssize_t saradc_test_chn_store(struct device *dev,
473525 struct device_attribute *attr,
....@@ -492,7 +544,7 @@
492544 return size;
493545 }
494546
495
- if (!info->test && val < SARADC_CTRL_CHN_MASK) {
547
+ if (!info->test && val <= SARADC_CTRL_CHN_MASK) {
496548 info->test = true;
497549 info->chn = val;
498550 mod_delayed_work(info->wq, &info->work, msecs_to_jiffies(100));
....@@ -594,10 +646,8 @@
594646 init_completion(&info->completion);
595647
596648 irq = platform_get_irq(pdev, 0);
597
- if (irq < 0) {
598
- dev_err(&pdev->dev, "no irq resource?\n");
649
+ if (irq < 0)
599650 return irq;
600
- }
601651
602652 ret = devm_request_irq(&pdev->dev, irq, rockchip_saradc_isr,
603653 0, dev_name(&pdev->dev), info);
....@@ -651,12 +701,13 @@
651701 return ret;
652702 }
653703
654
- info->uv_vref = regulator_get_voltage(info->vref);
655
- if (info->uv_vref < 0) {
704
+ ret = regulator_get_voltage(info->vref);
705
+ if (ret < 0) {
656706 dev_err(&pdev->dev, "failed to get voltage\n");
657
- ret = info->uv_vref;
658707 return ret;
659708 }
709
+
710
+ info->uv_vref = ret;
660711
661712 ret = clk_prepare_enable(info->pclk);
662713 if (ret < 0) {
....@@ -687,8 +738,6 @@
687738 platform_set_drvdata(pdev, indio_dev);
688739
689740 indio_dev->name = dev_name(&pdev->dev);
690
- indio_dev->dev.parent = &pdev->dev;
691
- indio_dev->dev.of_node = pdev->dev.of_node;
692741 indio_dev->info = &rockchip_saradc_iio_info;
693742 indio_dev->modes = INDIO_DIRECT_MODE;
694743
....@@ -697,6 +746,17 @@
697746 ret = devm_iio_triggered_buffer_setup(&indio_dev->dev, indio_dev, NULL,
698747 rockchip_saradc_trigger_handler,
699748 NULL);
749
+ if (ret)
750
+ return ret;
751
+
752
+ info->nb.notifier_call = rockchip_saradc_volt_notify;
753
+ ret = regulator_register_notifier(info->vref, &info->nb);
754
+ if (ret)
755
+ return ret;
756
+
757
+ ret = devm_add_action_or_reset(&pdev->dev,
758
+ rockchip_saradc_regulator_unreg_notifier,
759
+ info);
700760 if (ret)
701761 return ret;
702762
....@@ -782,21 +842,7 @@
782842 },
783843 };
784844
785
-#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT
786
-static int __init rockchip_saradc_driver_init(void)
787
-{
788
- return platform_driver_register(&rockchip_saradc_driver);
789
-}
790
-fs_initcall(rockchip_saradc_driver_init);
791
-
792
-static void __exit rockchip_saradc_driver_exit(void)
793
-{
794
- platform_driver_unregister(&rockchip_saradc_driver);
795
-}
796
-module_exit(rockchip_saradc_driver_exit);
797
-#else
798845 module_platform_driver(rockchip_saradc_driver);
799
-#endif
800846
801847 MODULE_AUTHOR("Heiko Stuebner <heiko@sntech.de>");
802848 MODULE_DESCRIPTION("Rockchip SARADC driver");