21
21
#define BUCK_NB 5
22
22
#define LDO_NB 4
23
23
#define MULTI_PHASE_NB 4
24
- /* TPS6593 and LP8764 supports OV, UV, SC, ILIM */
25
- #define REGS_INT_NB 4
26
- /* TPS65224 supports OV or UV */
27
- #define TPS65224_REGS_INT_NB 1
28
24
29
25
enum tps6594_regulator_id {
30
26
/* DCDC's */
@@ -192,7 +188,7 @@ static const struct regulator_ops tps6594_ldos_4_ops = {
192
188
.map_voltage = regulator_map_voltage_linear_range ,
193
189
};
194
190
195
- static const struct regulator_desc buck_regs [] = {
191
+ static const struct regulator_desc tps6594_buck_regs [] = {
196
192
TPS6594_REGULATOR ("BUCK1" , "buck1" , TPS6594_BUCK_1 ,
197
193
REGULATOR_VOLTAGE , tps6594_bucks_ops , TPS6594_MASK_BUCKS_VSET ,
198
194
TPS6594_REG_BUCKX_VOUT_1 (0 ),
@@ -549,6 +545,63 @@ static int tps6594_request_reg_irqs(struct platform_device *pdev,
549
545
return 0 ;
550
546
}
551
547
548
+ struct tps6594_regulator_desc {
549
+ const struct regulator_desc * multi_phase_regs ;
550
+ unsigned int num_multi_phase_regs ;
551
+
552
+ const struct regulator_desc * buck_regs ;
553
+ int num_buck_regs ;
554
+
555
+ const struct regulator_desc * ldo_regs ;
556
+ int num_ldo_regs ;
557
+
558
+ const struct tps6594_regulator_irq_type * * bucks_irq_types ;
559
+ const struct tps6594_regulator_irq_type * * ldos_irq_types ;
560
+ int num_irq_types ;
561
+
562
+ const struct tps6594_regulator_irq_type * ext_irq_types ;
563
+ int num_ext_irqs ;
564
+ };
565
+
566
+ static const struct tps6594_regulator_desc tps65224_reg_desc = {
567
+ .multi_phase_regs = tps65224_multi_regs ,
568
+ .num_multi_phase_regs = ARRAY_SIZE (tps65224_multi_regs ),
569
+ .buck_regs = tps65224_buck_regs ,
570
+ .num_buck_regs = ARRAY_SIZE (tps65224_buck_regs ),
571
+ .ldo_regs = tps65224_ldo_regs ,
572
+ .num_ldo_regs = ARRAY_SIZE (tps65224_ldo_regs ),
573
+ .bucks_irq_types = tps65224_bucks_irq_types ,
574
+ .ldos_irq_types = tps65224_ldos_irq_types ,
575
+ .num_irq_types = 1 , /* OV or UV */
576
+ .ext_irq_types = tps65224_ext_regulator_irq_types ,
577
+ .num_ext_irqs = ARRAY_SIZE (tps65224_ext_regulator_irq_types ),
578
+ };
579
+
580
+ static const struct tps6594_regulator_desc tps6594_reg_desc = {
581
+ .multi_phase_regs = tps6594_multi_regs ,
582
+ .num_multi_phase_regs = ARRAY_SIZE (tps6594_multi_regs ),
583
+ .buck_regs = tps6594_buck_regs ,
584
+ .num_buck_regs = ARRAY_SIZE (tps6594_buck_regs ),
585
+ .ldo_regs = tps6594_ldo_regs ,
586
+ .num_ldo_regs = ARRAY_SIZE (tps6594_ldo_regs ),
587
+ .bucks_irq_types = tps6594_bucks_irq_types ,
588
+ .ldos_irq_types = tps6594_ldos_irq_types ,
589
+ .num_irq_types = 4 , /* OV, UV, SC and ILIM */
590
+ .ext_irq_types = tps6594_ext_regulator_irq_types ,
591
+ .num_ext_irqs = 2 , /* only VCCA OV and UV */
592
+ };
593
+
594
+ static const struct tps6594_regulator_desc lp8764_reg_desc = {
595
+ .multi_phase_regs = tps6594_multi_regs ,
596
+ .num_multi_phase_regs = ARRAY_SIZE (tps6594_multi_regs ),
597
+ .buck_regs = tps6594_buck_regs ,
598
+ .num_buck_regs = ARRAY_SIZE (tps6594_buck_regs ),
599
+ .bucks_irq_types = tps6594_bucks_irq_types ,
600
+ .num_irq_types = 4 , /* OV, UV, SC and ILIM */
601
+ .ext_irq_types = tps6594_ext_regulator_irq_types ,
602
+ .num_ext_irqs = ARRAY_SIZE (tps6594_ext_regulator_irq_types ),
603
+ };
604
+
552
605
static int tps6594_regulator_probe (struct platform_device * pdev )
553
606
{
554
607
struct tps6594 * tps = dev_get_drvdata (pdev -> dev .parent );
@@ -559,38 +612,32 @@ static int tps6594_regulator_probe(struct platform_device *pdev)
559
612
struct tps6594_regulator_irq_data * irq_data ;
560
613
struct tps6594_ext_regulator_irq_data * irq_ext_reg_data ;
561
614
const struct tps6594_regulator_irq_type * irq_type ;
562
- const struct tps6594_regulator_irq_type * irq_types ;
563
615
bool buck_configured [BUCK_NB ] = { false };
564
616
bool buck_multi [MULTI_PHASE_NB ] = { false };
617
+ const struct tps6594_regulator_desc * desc ;
618
+ const struct regulator_desc * multi_regs ;
565
619
566
620
const char * npname ;
567
621
int error , i , irq , multi ;
568
622
int irq_idx = 0 ;
569
623
int buck_idx = 0 ;
570
- int nr_ldo ;
571
- int nr_buck ;
572
- int nr_types ;
573
- unsigned int irq_count ;
574
- unsigned int multi_phase_cnt ;
575
624
size_t reg_irq_nb ;
576
- const struct tps6594_regulator_irq_type * * bucks_irq_types ;
577
- const struct regulator_desc * multi_regs ;
578
- const struct tps6594_regulator_irq_type * * ldos_irq_types ;
579
- const struct regulator_desc * ldo_regs ;
580
625
581
- if (tps -> chip_id == TPS65224 ) {
582
- bucks_irq_types = tps65224_bucks_irq_types ;
583
- multi_regs = tps65224_multi_regs ;
584
- ldos_irq_types = tps65224_ldos_irq_types ;
585
- ldo_regs = tps65224_ldo_regs ;
586
- multi_phase_cnt = ARRAY_SIZE (tps65224_multi_regs );
587
- } else {
588
- bucks_irq_types = tps6594_bucks_irq_types ;
589
- multi_regs = tps6594_multi_regs ;
590
- ldos_irq_types = tps6594_ldos_irq_types ;
591
- ldo_regs = tps6594_ldo_regs ;
592
- multi_phase_cnt = ARRAY_SIZE (tps6594_multi_regs );
593
- }
626
+ switch (tps -> chip_id ) {
627
+ case TPS65224 :
628
+ desc = & tps65224_reg_desc ;
629
+ break ;
630
+ case TPS6594 :
631
+ case TPS6593 :
632
+ desc = & tps6594_reg_desc ;
633
+ break ;
634
+ case LP8764 :
635
+ desc = & lp8764_reg_desc ;
636
+ break ;
637
+ default :
638
+ dev_err (tps -> dev , "unknown chip_id %lu\n" , tps -> chip_id );
639
+ return - EINVAL ;
640
+ };
594
641
595
642
enum {
596
643
MULTI_BUCK12 ,
@@ -611,13 +658,14 @@ static int tps6594_regulator_probe(struct platform_device *pdev)
611
658
* In case of Multiphase configuration, value should be defined for
612
659
* buck_configured to avoid creating bucks for every buck in multiphase
613
660
*/
614
- for (multi = 0 ; multi < multi_phase_cnt ; multi ++ ) {
615
- np = of_find_node_by_name (tps -> dev -> of_node , multi_regs [multi ].supply_name );
661
+ for (multi = 0 ; multi < desc -> num_multi_phase_regs ; multi ++ ) {
662
+ multi_regs = & desc -> multi_phase_regs [multi ];
663
+ np = of_find_node_by_name (tps -> dev -> of_node , multi_regs -> supply_name );
616
664
npname = of_node_full_name (np );
617
665
np_pmic_parent = of_get_parent (of_get_parent (np ));
618
666
if (of_node_cmp (of_node_full_name (np_pmic_parent ), tps -> dev -> of_node -> full_name ))
619
667
continue ;
620
- if (strcmp (npname , multi_regs [ multi ]. supply_name ) == 0 ) {
668
+ if (strcmp (npname , multi_regs -> supply_name ) == 0 ) {
621
669
switch (multi ) {
622
670
case MULTI_BUCK12 :
623
671
buck_multi [0 ] = true;
@@ -650,28 +698,19 @@ static int tps6594_regulator_probe(struct platform_device *pdev)
650
698
}
651
699
}
652
700
653
- if (tps -> chip_id == TPS65224 ) {
654
- nr_buck = ARRAY_SIZE (tps65224_buck_regs );
655
- nr_ldo = ARRAY_SIZE (tps65224_ldo_regs );
656
- nr_types = TPS65224_REGS_INT_NB ;
657
- } else {
658
- nr_buck = ARRAY_SIZE (buck_regs );
659
- nr_ldo = (tps -> chip_id == LP8764 ) ? 0 : ARRAY_SIZE (tps6594_ldo_regs );
660
- nr_types = REGS_INT_NB ;
661
- }
662
-
663
- reg_irq_nb = nr_types * (nr_buck + nr_ldo );
701
+ reg_irq_nb = desc -> num_irq_types * (desc -> num_buck_regs + desc -> num_ldo_regs );
664
702
665
703
irq_data = devm_kmalloc_array (tps -> dev , reg_irq_nb ,
666
704
sizeof (struct tps6594_regulator_irq_data ), GFP_KERNEL );
667
705
if (!irq_data )
668
706
return - ENOMEM ;
669
707
670
- for (i = 0 ; i < multi_phase_cnt ; i ++ ) {
708
+ for (i = 0 ; i < desc -> num_multi_phase_regs ; i ++ ) {
671
709
if (!buck_multi [i ])
672
710
continue ;
673
711
674
- rdev = devm_regulator_register (& pdev -> dev , & multi_regs [i ], & config );
712
+ rdev = devm_regulator_register (& pdev -> dev , & desc -> multi_phase_regs [i ],
713
+ & config );
675
714
if (IS_ERR (rdev ))
676
715
return dev_err_probe (tps -> dev , PTR_ERR (rdev ),
677
716
"failed to register %s regulator\n" ,
@@ -682,89 +721,74 @@ static int tps6594_regulator_probe(struct platform_device *pdev)
682
721
buck_idx = 2 ;
683
722
684
723
error = tps6594_request_reg_irqs (pdev , rdev , irq_data ,
685
- bucks_irq_types [buck_idx ],
686
- nr_types , & irq_idx );
724
+ desc -> bucks_irq_types [buck_idx ],
725
+ desc -> num_irq_types , & irq_idx );
687
726
if (error )
688
727
return error ;
689
728
690
729
error = tps6594_request_reg_irqs (pdev , rdev , irq_data ,
691
- bucks_irq_types [buck_idx + 1 ],
692
- nr_types , & irq_idx );
730
+ desc -> bucks_irq_types [buck_idx + 1 ],
731
+ desc -> num_irq_types , & irq_idx );
693
732
if (error )
694
733
return error ;
695
734
696
735
if (i == MULTI_BUCK123 || i == MULTI_BUCK1234 ) {
697
736
error = tps6594_request_reg_irqs (pdev , rdev , irq_data ,
698
- bucks_irq_types [buck_idx + 2 ],
699
- nr_types , & irq_idx );
737
+ desc -> bucks_irq_types [buck_idx + 2 ],
738
+ desc -> num_irq_types ,
739
+ & irq_idx );
700
740
if (error )
701
741
return error ;
702
742
}
703
743
if (i == MULTI_BUCK1234 ) {
704
744
error = tps6594_request_reg_irqs (pdev , rdev , irq_data ,
705
- bucks_irq_types [buck_idx + 3 ],
706
- nr_types , & irq_idx );
745
+ desc -> bucks_irq_types [buck_idx + 3 ],
746
+ desc -> num_irq_types ,
747
+ & irq_idx );
707
748
if (error )
708
749
return error ;
709
750
}
710
751
}
711
752
712
- for (i = 0 ; i < nr_buck ; i ++ ) {
753
+ for (i = 0 ; i < desc -> num_buck_regs ; i ++ ) {
713
754
if (buck_configured [i ])
714
755
continue ;
715
756
716
- const struct regulator_desc * buck_cfg = (tps -> chip_id == TPS65224 ) ?
717
- tps65224_buck_regs : buck_regs ;
718
-
719
- rdev = devm_regulator_register (& pdev -> dev , & buck_cfg [i ], & config );
757
+ rdev = devm_regulator_register (& pdev -> dev , & desc -> buck_regs [i ], & config );
720
758
if (IS_ERR (rdev ))
721
759
return dev_err_probe (tps -> dev , PTR_ERR (rdev ),
722
760
"failed to register %s regulator\n" , pdev -> name );
723
761
724
762
error = tps6594_request_reg_irqs (pdev , rdev , irq_data ,
725
- bucks_irq_types [i ], nr_types , & irq_idx );
763
+ desc -> bucks_irq_types [i ],
764
+ desc -> num_irq_types , & irq_idx );
726
765
if (error )
727
766
return error ;
728
767
}
729
768
730
- /* LP8764 doesn't have LDO */
731
- if (tps -> chip_id != LP8764 ) {
732
- for (i = 0 ; i < nr_ldo ; i ++ ) {
733
- rdev = devm_regulator_register (& pdev -> dev , & ldo_regs [i ], & config );
734
- if (IS_ERR (rdev ))
735
- return dev_err_probe (tps -> dev , PTR_ERR (rdev ),
736
- "failed to register %s regulator\n" ,
737
- pdev -> name );
738
-
739
- error = tps6594_request_reg_irqs (pdev , rdev , irq_data ,
740
- ldos_irq_types [i ], nr_types ,
741
- & irq_idx );
742
- if (error )
743
- return error ;
744
- }
745
- }
769
+ for (i = 0 ; i < desc -> num_ldo_regs ; i ++ ) {
770
+ rdev = devm_regulator_register (& pdev -> dev , & desc -> ldo_regs [i ], & config );
771
+ if (IS_ERR (rdev ))
772
+ return dev_err_probe (tps -> dev , PTR_ERR (rdev ),
773
+ "failed to register %s regulator\n" ,
774
+ pdev -> name );
746
775
747
- if (tps -> chip_id == TPS65224 ) {
748
- irq_types = tps65224_ext_regulator_irq_types ;
749
- irq_count = ARRAY_SIZE (tps65224_ext_regulator_irq_types );
750
- } else {
751
- irq_types = tps6594_ext_regulator_irq_types ;
752
- if (tps -> chip_id == LP8764 )
753
- irq_count = ARRAY_SIZE (tps6594_ext_regulator_irq_types );
754
- else
755
- /* TPS6593 supports only VCCA OV and UV */
756
- irq_count = 2 ;
776
+ error = tps6594_request_reg_irqs (pdev , rdev , irq_data ,
777
+ desc -> ldos_irq_types [i ],
778
+ desc -> num_irq_types , & irq_idx );
779
+ if (error )
780
+ return error ;
757
781
}
758
782
759
783
irq_ext_reg_data = devm_kmalloc_array (tps -> dev ,
760
- irq_count ,
784
+ desc -> num_ext_irqs ,
761
785
sizeof (struct tps6594_ext_regulator_irq_data ),
762
786
GFP_KERNEL );
763
787
if (!irq_ext_reg_data )
764
788
return - ENOMEM ;
765
789
766
- for (i = 0 ; i < irq_count ; ++ i ) {
767
- irq_type = & irq_types [i ];
790
+ for (i = 0 ; i < desc -> num_ext_irqs ; ++ i ) {
791
+ irq_type = & desc -> ext_irq_types [i ];
768
792
irq = platform_get_irq_byname (pdev , irq_type -> irq_name );
769
793
if (irq < 0 )
770
794
return - EINVAL ;
@@ -782,6 +806,7 @@ static int tps6594_regulator_probe(struct platform_device *pdev)
782
806
"failed to request %s IRQ %d\n" ,
783
807
irq_type -> irq_name , irq );
784
808
}
809
+
785
810
return 0 ;
786
811
}
787
812
0 commit comments