forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-09 95099d4622f8cb224d94e314c7a8e0df60b13f87
kernel/drivers/regulator/as3722-regulator.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * Voltage regulator support for AMS AS3722 PMIC
34 *
....@@ -5,21 +6,6 @@
56 *
67 * Author: Florian Lobmaier <florian.lobmaier@ams.com>
78 * Author: Laxman Dewangan <ldewangan@nvidia.com>
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License as published by
11
- * the Free Software Foundation; either version 2 of the License, or
12
- * (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- * GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program; if not, write to the Free Software
21
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
- *
239 */
2410
2511 #include <linux/err.h>
....@@ -81,7 +67,6 @@
8167 struct as3722_regulators {
8268 struct device *dev;
8369 struct as3722 *as3722;
84
- struct regulator_dev *rdevs[AS3722_REGULATOR_ID_MAX];
8570 struct regulator_desc desc[AS3722_REGULATOR_ID_MAX];
8671 struct as3722_regulator_config_data
8772 reg_config_data[AS3722_REGULATOR_ID_MAX];
....@@ -314,63 +299,10 @@
314299 },
315300 };
316301
317
-
318
-static const int as3722_ldo_current[] = { 150000, 300000 };
319
-static const int as3722_sd016_current[] = { 2500000, 3000000, 3500000 };
320
-
321
-static int as3722_current_to_index(int min_uA, int max_uA,
322
- const int *curr_table, int n_currents)
323
-{
324
- int i;
325
-
326
- for (i = n_currents - 1; i >= 0; i--) {
327
- if ((min_uA <= curr_table[i]) && (curr_table[i] <= max_uA))
328
- return i;
329
- }
330
- return -EINVAL;
331
-}
332
-
333
-static int as3722_ldo_get_current_limit(struct regulator_dev *rdev)
334
-{
335
- struct as3722_regulators *as3722_regs = rdev_get_drvdata(rdev);
336
- struct as3722 *as3722 = as3722_regs->as3722;
337
- int id = rdev_get_id(rdev);
338
- u32 val;
339
- int ret;
340
-
341
- ret = as3722_read(as3722, as3722_reg_lookup[id].vsel_reg, &val);
342
- if (ret < 0) {
343
- dev_err(as3722_regs->dev, "Reg 0x%02x read failed: %d\n",
344
- as3722_reg_lookup[id].vsel_reg, ret);
345
- return ret;
346
- }
347
- if (val & AS3722_LDO_ILIMIT_MASK)
348
- return 300000;
349
- return 150000;
350
-}
351
-
352
-static int as3722_ldo_set_current_limit(struct regulator_dev *rdev,
353
- int min_uA, int max_uA)
354
-{
355
- struct as3722_regulators *as3722_regs = rdev_get_drvdata(rdev);
356
- struct as3722 *as3722 = as3722_regs->as3722;
357
- int id = rdev_get_id(rdev);
358
- int ret;
359
- u32 reg = 0;
360
-
361
- ret = as3722_current_to_index(min_uA, max_uA, as3722_ldo_current,
362
- ARRAY_SIZE(as3722_ldo_current));
363
- if (ret < 0) {
364
- dev_err(as3722_regs->dev,
365
- "Current range min:max = %d:%d does not support\n",
366
- min_uA, max_uA);
367
- return ret;
368
- }
369
- if (ret)
370
- reg = AS3722_LDO_ILIMIT_BIT;
371
- return as3722_update_bits(as3722, as3722_reg_lookup[id].vsel_reg,
372
- AS3722_LDO_ILIMIT_MASK, reg);
373
-}
302
+static const unsigned int as3722_ldo_current[] = { 150000, 300000 };
303
+static const unsigned int as3722_sd016_current[] = {
304
+ 2500000, 3000000, 3500000
305
+};
374306
375307 static const struct regulator_ops as3722_ldo0_ops = {
376308 .is_enabled = regulator_is_enabled_regmap,
....@@ -379,16 +311,16 @@
379311 .list_voltage = regulator_list_voltage_linear,
380312 .get_voltage_sel = regulator_get_voltage_sel_regmap,
381313 .set_voltage_sel = regulator_set_voltage_sel_regmap,
382
- .get_current_limit = as3722_ldo_get_current_limit,
383
- .set_current_limit = as3722_ldo_set_current_limit,
314
+ .get_current_limit = regulator_get_current_limit_regmap,
315
+ .set_current_limit = regulator_set_current_limit_regmap,
384316 };
385317
386318 static const struct regulator_ops as3722_ldo0_extcntrl_ops = {
387319 .list_voltage = regulator_list_voltage_linear,
388320 .get_voltage_sel = regulator_get_voltage_sel_regmap,
389321 .set_voltage_sel = regulator_set_voltage_sel_regmap,
390
- .get_current_limit = as3722_ldo_get_current_limit,
391
- .set_current_limit = as3722_ldo_set_current_limit,
322
+ .get_current_limit = regulator_get_current_limit_regmap,
323
+ .set_current_limit = regulator_set_current_limit_regmap,
392324 };
393325
394326 static int as3722_ldo3_set_tracking_mode(struct as3722_regulators *as3722_reg,
....@@ -440,8 +372,8 @@
440372 .set_voltage_sel = regulator_set_voltage_sel_regmap,
441373 .get_voltage_sel = regulator_get_voltage_sel_regmap,
442374 .list_voltage = regulator_list_voltage_linear_range,
443
- .get_current_limit = as3722_ldo_get_current_limit,
444
- .set_current_limit = as3722_ldo_set_current_limit,
375
+ .get_current_limit = regulator_get_current_limit_regmap,
376
+ .set_current_limit = regulator_set_current_limit_regmap,
445377 .get_bypass = regulator_get_bypass_regmap,
446378 .set_bypass = regulator_set_bypass_regmap,
447379 };
....@@ -451,13 +383,13 @@
451383 .set_voltage_sel = regulator_set_voltage_sel_regmap,
452384 .get_voltage_sel = regulator_get_voltage_sel_regmap,
453385 .list_voltage = regulator_list_voltage_linear_range,
454
- .get_current_limit = as3722_ldo_get_current_limit,
455
- .set_current_limit = as3722_ldo_set_current_limit,
386
+ .get_current_limit = regulator_get_current_limit_regmap,
387
+ .set_current_limit = regulator_set_current_limit_regmap,
456388 .get_bypass = regulator_get_bypass_regmap,
457389 .set_bypass = regulator_set_bypass_regmap,
458390 };
459391
460
-static const struct regulator_linear_range as3722_ldo_ranges[] = {
392
+static const struct linear_range as3722_ldo_ranges[] = {
461393 REGULATOR_LINEAR_RANGE(0, 0x00, 0x00, 0),
462394 REGULATOR_LINEAR_RANGE(825000, 0x01, 0x24, 25000),
463395 REGULATOR_LINEAR_RANGE(1725000, 0x40, 0x7F, 25000),
....@@ -471,8 +403,8 @@
471403 .set_voltage_sel = regulator_set_voltage_sel_regmap,
472404 .get_voltage_sel = regulator_get_voltage_sel_regmap,
473405 .list_voltage = regulator_list_voltage_linear_range,
474
- .get_current_limit = as3722_ldo_get_current_limit,
475
- .set_current_limit = as3722_ldo_set_current_limit,
406
+ .get_current_limit = regulator_get_current_limit_regmap,
407
+ .set_current_limit = regulator_set_current_limit_regmap,
476408 };
477409
478410 static const struct regulator_ops as3722_ldo_extcntrl_ops = {
....@@ -480,8 +412,8 @@
480412 .set_voltage_sel = regulator_set_voltage_sel_regmap,
481413 .get_voltage_sel = regulator_get_voltage_sel_regmap,
482414 .list_voltage = regulator_list_voltage_linear_range,
483
- .get_current_limit = as3722_ldo_get_current_limit,
484
- .set_current_limit = as3722_ldo_set_current_limit,
415
+ .get_current_limit = regulator_get_current_limit_regmap,
416
+ .set_current_limit = regulator_set_current_limit_regmap,
485417 };
486418
487419 static unsigned int as3722_sd_get_mode(struct regulator_dev *rdev)
....@@ -539,85 +471,6 @@
539471 return ret;
540472 }
541473
542
-static int as3722_sd016_get_current_limit(struct regulator_dev *rdev)
543
-{
544
- struct as3722_regulators *as3722_regs = rdev_get_drvdata(rdev);
545
- struct as3722 *as3722 = as3722_regs->as3722;
546
- int id = rdev_get_id(rdev);
547
- u32 val, reg;
548
- int mask;
549
- int ret;
550
-
551
- switch (id) {
552
- case AS3722_REGULATOR_ID_SD0:
553
- reg = AS3722_OVCURRENT_REG;
554
- mask = AS3722_OVCURRENT_SD0_TRIP_MASK;
555
- break;
556
- case AS3722_REGULATOR_ID_SD1:
557
- reg = AS3722_OVCURRENT_REG;
558
- mask = AS3722_OVCURRENT_SD1_TRIP_MASK;
559
- break;
560
- case AS3722_REGULATOR_ID_SD6:
561
- reg = AS3722_OVCURRENT_DEB_REG;
562
- mask = AS3722_OVCURRENT_SD6_TRIP_MASK;
563
- break;
564
- default:
565
- return -EINVAL;
566
- }
567
- ret = as3722_read(as3722, reg, &val);
568
- if (ret < 0) {
569
- dev_err(as3722_regs->dev, "Reg 0x%02x read failed: %d\n",
570
- reg, ret);
571
- return ret;
572
- }
573
- val &= mask;
574
- val >>= ffs(mask) - 1;
575
- if (val == 3)
576
- return -EINVAL;
577
- return as3722_sd016_current[val];
578
-}
579
-
580
-static int as3722_sd016_set_current_limit(struct regulator_dev *rdev,
581
- int min_uA, int max_uA)
582
-{
583
- struct as3722_regulators *as3722_regs = rdev_get_drvdata(rdev);
584
- struct as3722 *as3722 = as3722_regs->as3722;
585
- int id = rdev_get_id(rdev);
586
- int ret;
587
- int val;
588
- int mask;
589
- u32 reg;
590
-
591
- ret = as3722_current_to_index(min_uA, max_uA, as3722_sd016_current,
592
- ARRAY_SIZE(as3722_sd016_current));
593
- if (ret < 0) {
594
- dev_err(as3722_regs->dev,
595
- "Current range min:max = %d:%d does not support\n",
596
- min_uA, max_uA);
597
- return ret;
598
- }
599
-
600
- switch (id) {
601
- case AS3722_REGULATOR_ID_SD0:
602
- reg = AS3722_OVCURRENT_REG;
603
- mask = AS3722_OVCURRENT_SD0_TRIP_MASK;
604
- break;
605
- case AS3722_REGULATOR_ID_SD1:
606
- reg = AS3722_OVCURRENT_REG;
607
- mask = AS3722_OVCURRENT_SD1_TRIP_MASK;
608
- break;
609
- case AS3722_REGULATOR_ID_SD6:
610
- reg = AS3722_OVCURRENT_DEB_REG;
611
- mask = AS3722_OVCURRENT_SD6_TRIP_MASK;
612
- break;
613
- default:
614
- return -EINVAL;
615
- }
616
- ret <<= ffs(mask) - 1;
617
- val = ret & mask;
618
- return as3722_update_bits(as3722, reg, mask, val);
619
-}
620
-
621474 static bool as3722_sd0_is_low_voltage(struct as3722_regulators *as3722_regs)
622475 {
623476 int err;
....@@ -634,7 +487,7 @@
634487 return false;
635488 }
636489
637
-static const struct regulator_linear_range as3722_sd2345_ranges[] = {
490
+static const struct linear_range as3722_sd2345_ranges[] = {
638491 REGULATOR_LINEAR_RANGE(0, 0x00, 0x00, 0),
639492 REGULATOR_LINEAR_RANGE(612500, 0x01, 0x40, 12500),
640493 REGULATOR_LINEAR_RANGE(1425000, 0x41, 0x70, 25000),
....@@ -649,8 +502,8 @@
649502 .map_voltage = regulator_map_voltage_linear,
650503 .get_voltage_sel = regulator_get_voltage_sel_regmap,
651504 .set_voltage_sel = regulator_set_voltage_sel_regmap,
652
- .get_current_limit = as3722_sd016_get_current_limit,
653
- .set_current_limit = as3722_sd016_set_current_limit,
505
+ .get_current_limit = regulator_get_current_limit_regmap,
506
+ .set_current_limit = regulator_set_current_limit_regmap,
654507 .get_mode = as3722_sd_get_mode,
655508 .set_mode = as3722_sd_set_mode,
656509 };
....@@ -660,8 +513,8 @@
660513 .map_voltage = regulator_map_voltage_linear,
661514 .get_voltage_sel = regulator_get_voltage_sel_regmap,
662515 .set_voltage_sel = regulator_set_voltage_sel_regmap,
663
- .get_current_limit = as3722_sd016_get_current_limit,
664
- .set_current_limit = as3722_sd016_set_current_limit,
516
+ .get_current_limit = regulator_get_current_limit_regmap,
517
+ .set_current_limit = regulator_set_current_limit_regmap,
665518 .get_mode = as3722_sd_get_mode,
666519 .set_mode = as3722_sd_set_mode,
667520 };
....@@ -807,42 +660,45 @@
807660 config.regmap = as3722->regmap;
808661
809662 for (id = 0; id < AS3722_REGULATOR_ID_MAX; id++) {
663
+ struct regulator_desc *desc;
664
+
665
+ desc = &as3722_regs->desc[id];
810666 reg_config = &as3722_regs->reg_config_data[id];
811667
812
- as3722_regs->desc[id].name = as3722_reg_lookup[id].name;
813
- as3722_regs->desc[id].supply_name = as3722_reg_lookup[id].sname;
814
- as3722_regs->desc[id].id = as3722_reg_lookup[id].regulator_id;
815
- as3722_regs->desc[id].n_voltages =
816
- as3722_reg_lookup[id].n_voltages;
817
- as3722_regs->desc[id].type = REGULATOR_VOLTAGE;
818
- as3722_regs->desc[id].owner = THIS_MODULE;
819
- as3722_regs->desc[id].enable_reg =
820
- as3722_reg_lookup[id].enable_reg;
821
- as3722_regs->desc[id].enable_mask =
822
- as3722_reg_lookup[id].enable_mask;
823
- as3722_regs->desc[id].vsel_reg = as3722_reg_lookup[id].vsel_reg;
824
- as3722_regs->desc[id].vsel_mask =
825
- as3722_reg_lookup[id].vsel_mask;
668
+ desc->name = as3722_reg_lookup[id].name;
669
+ desc->supply_name = as3722_reg_lookup[id].sname;
670
+ desc->id = as3722_reg_lookup[id].regulator_id;
671
+ desc->n_voltages = as3722_reg_lookup[id].n_voltages;
672
+ desc->type = REGULATOR_VOLTAGE;
673
+ desc->owner = THIS_MODULE;
674
+ desc->enable_reg = as3722_reg_lookup[id].enable_reg;
675
+ desc->enable_mask = as3722_reg_lookup[id].enable_mask;
676
+ desc->vsel_reg = as3722_reg_lookup[id].vsel_reg;
677
+ desc->vsel_mask = as3722_reg_lookup[id].vsel_mask;
826678 switch (id) {
827679 case AS3722_REGULATOR_ID_LDO0:
828680 if (reg_config->ext_control)
829681 ops = &as3722_ldo0_extcntrl_ops;
830682 else
831683 ops = &as3722_ldo0_ops;
832
- as3722_regs->desc[id].min_uV = 825000;
833
- as3722_regs->desc[id].uV_step = 25000;
834
- as3722_regs->desc[id].linear_min_sel = 1;
835
- as3722_regs->desc[id].enable_time = 500;
684
+ desc->min_uV = 825000;
685
+ desc->uV_step = 25000;
686
+ desc->linear_min_sel = 1;
687
+ desc->enable_time = 500;
688
+ desc->curr_table = as3722_ldo_current;
689
+ desc->n_current_limits = ARRAY_SIZE(as3722_ldo_current);
690
+ desc->csel_reg = as3722_reg_lookup[id].vsel_reg;
691
+ desc->csel_mask = AS3722_LDO_ILIMIT_MASK;
836692 break;
837693 case AS3722_REGULATOR_ID_LDO3:
838694 if (reg_config->ext_control)
839695 ops = &as3722_ldo3_extcntrl_ops;
840696 else
841697 ops = &as3722_ldo3_ops;
842
- as3722_regs->desc[id].min_uV = 620000;
843
- as3722_regs->desc[id].uV_step = 20000;
844
- as3722_regs->desc[id].linear_min_sel = 1;
845
- as3722_regs->desc[id].enable_time = 500;
698
+ desc->min_uV = 620000;
699
+ desc->uV_step = 20000;
700
+ desc->linear_min_sel = 1;
701
+ desc->enable_time = 500;
846702 if (reg_config->enable_tracking) {
847703 ret = as3722_ldo3_set_tracking_mode(as3722_regs,
848704 id, AS3722_LDO3_MODE_PMOS_TRACKING);
....@@ -859,18 +715,17 @@
859715 ops = &as3722_ldo6_extcntrl_ops;
860716 else
861717 ops = &as3722_ldo6_ops;
862
- as3722_regs->desc[id].enable_time = 500;
863
- as3722_regs->desc[id].bypass_reg =
864
- AS3722_LDO6_VOLTAGE_REG;
865
- as3722_regs->desc[id].bypass_mask =
866
- AS3722_LDO_VSEL_MASK;
867
- as3722_regs->desc[id].bypass_val_on =
868
- AS3722_LDO6_VSEL_BYPASS;
869
- as3722_regs->desc[id].bypass_val_off =
870
- AS3722_LDO6_VSEL_BYPASS;
871
- as3722_regs->desc[id].linear_ranges = as3722_ldo_ranges;
872
- as3722_regs->desc[id].n_linear_ranges =
873
- ARRAY_SIZE(as3722_ldo_ranges);
718
+ desc->enable_time = 500;
719
+ desc->bypass_reg = AS3722_LDO6_VOLTAGE_REG;
720
+ desc->bypass_mask = AS3722_LDO_VSEL_MASK;
721
+ desc->bypass_val_on = AS3722_LDO6_VSEL_BYPASS;
722
+ desc->bypass_val_off = AS3722_LDO6_VSEL_BYPASS;
723
+ desc->linear_ranges = as3722_ldo_ranges;
724
+ desc->n_linear_ranges = ARRAY_SIZE(as3722_ldo_ranges);
725
+ desc->curr_table = as3722_ldo_current;
726
+ desc->n_current_limits = ARRAY_SIZE(as3722_ldo_current);
727
+ desc->csel_reg = as3722_reg_lookup[id].vsel_reg;
728
+ desc->csel_mask = AS3722_LDO_ILIMIT_MASK;
874729 break;
875730 case AS3722_REGULATOR_ID_SD0:
876731 case AS3722_REGULATOR_ID_SD1:
....@@ -886,12 +741,28 @@
886741 as3722_regs->desc[id].min_uV = 410000;
887742 } else {
888743 as3722_regs->desc[id].n_voltages =
889
- AS3722_SD0_VSEL_MAX + 1,
744
+ AS3722_SD0_VSEL_MAX + 1;
890745 as3722_regs->desc[id].min_uV = 610000;
891746 }
892
- as3722_regs->desc[id].uV_step = 10000;
893
- as3722_regs->desc[id].linear_min_sel = 1;
894
- as3722_regs->desc[id].enable_time = 600;
747
+ desc->uV_step = 10000;
748
+ desc->linear_min_sel = 1;
749
+ desc->enable_time = 600;
750
+ desc->curr_table = as3722_sd016_current;
751
+ desc->n_current_limits =
752
+ ARRAY_SIZE(as3722_sd016_current);
753
+ if (id == AS3722_REGULATOR_ID_SD0) {
754
+ desc->csel_reg = AS3722_OVCURRENT_REG;
755
+ desc->csel_mask =
756
+ AS3722_OVCURRENT_SD0_TRIP_MASK;
757
+ } else if (id == AS3722_REGULATOR_ID_SD1) {
758
+ desc->csel_reg = AS3722_OVCURRENT_REG;
759
+ desc->csel_mask =
760
+ AS3722_OVCURRENT_SD1_TRIP_MASK;
761
+ } else if (id == AS3722_REGULATOR_ID_SD6) {
762
+ desc->csel_reg = AS3722_OVCURRENT_DEB_REG;
763
+ desc->csel_mask =
764
+ AS3722_OVCURRENT_SD6_TRIP_MASK;
765
+ }
895766 break;
896767 case AS3722_REGULATOR_ID_SD2:
897768 case AS3722_REGULATOR_ID_SD3:
....@@ -901,9 +772,8 @@
901772 ops = &as3722_sd2345_extcntrl_ops;
902773 else
903774 ops = &as3722_sd2345_ops;
904
- as3722_regs->desc[id].linear_ranges =
905
- as3722_sd2345_ranges;
906
- as3722_regs->desc[id].n_linear_ranges =
775
+ desc->linear_ranges = as3722_sd2345_ranges;
776
+ desc->n_linear_ranges =
907777 ARRAY_SIZE(as3722_sd2345_ranges);
908778 break;
909779 default:
....@@ -911,17 +781,19 @@
911781 ops = &as3722_ldo_extcntrl_ops;
912782 else
913783 ops = &as3722_ldo_ops;
914
- as3722_regs->desc[id].enable_time = 500;
915
- as3722_regs->desc[id].linear_ranges = as3722_ldo_ranges;
916
- as3722_regs->desc[id].n_linear_ranges =
917
- ARRAY_SIZE(as3722_ldo_ranges);
784
+ desc->enable_time = 500;
785
+ desc->linear_ranges = as3722_ldo_ranges;
786
+ desc->n_linear_ranges = ARRAY_SIZE(as3722_ldo_ranges);
787
+ desc->curr_table = as3722_ldo_current;
788
+ desc->n_current_limits = ARRAY_SIZE(as3722_ldo_current);
789
+ desc->csel_reg = as3722_reg_lookup[id].vsel_reg;
790
+ desc->csel_mask = AS3722_LDO_ILIMIT_MASK;
918791 break;
919792 }
920
- as3722_regs->desc[id].ops = ops;
793
+ desc->ops = ops;
921794 config.init_data = reg_config->reg_init;
922795 config.of_node = as3722_regulator_matches[id].of_node;
923
- rdev = devm_regulator_register(&pdev->dev,
924
- &as3722_regs->desc[id], &config);
796
+ rdev = devm_regulator_register(&pdev->dev, desc, &config);
925797 if (IS_ERR(rdev)) {
926798 ret = PTR_ERR(rdev);
927799 dev_err(&pdev->dev, "regulator %d register failed %d\n",
....@@ -929,7 +801,6 @@
929801 return ret;
930802 }
931803
932
- as3722_regs->rdevs[id] = rdev;
933804 if (reg_config->ext_control) {
934805 ret = regulator_enable_regmap(rdev);
935806 if (ret < 0) {