2121#define BUCK_NB 5
2222#define LDO_NB 4
2323#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
2824
2925enum tps6594_regulator_id {
3026 /* DCDC's */
@@ -192,7 +188,7 @@ static const struct regulator_ops tps6594_ldos_4_ops = {
192188 .map_voltage = regulator_map_voltage_linear_range ,
193189};
194190
195- static const struct regulator_desc buck_regs [] = {
191+ static const struct regulator_desc tps6594_buck_regs [] = {
196192 TPS6594_REGULATOR ("BUCK1" , "buck1" , TPS6594_BUCK_1 ,
197193 REGULATOR_VOLTAGE , tps6594_bucks_ops , TPS6594_MASK_BUCKS_VSET ,
198194 TPS6594_REG_BUCKX_VOUT_1 (0 ),
@@ -549,6 +545,63 @@ static int tps6594_request_reg_irqs(struct platform_device *pdev,
549545 return 0 ;
550546}
551547
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+
552605static int tps6594_regulator_probe (struct platform_device * pdev )
553606{
554607 struct tps6594 * tps = dev_get_drvdata (pdev -> dev .parent );
@@ -559,38 +612,32 @@ static int tps6594_regulator_probe(struct platform_device *pdev)
559612 struct tps6594_regulator_irq_data * irq_data ;
560613 struct tps6594_ext_regulator_irq_data * irq_ext_reg_data ;
561614 const struct tps6594_regulator_irq_type * irq_type ;
562- const struct tps6594_regulator_irq_type * irq_types ;
563615 bool buck_configured [BUCK_NB ] = { false };
564616 bool buck_multi [MULTI_PHASE_NB ] = { false };
617+ const struct tps6594_regulator_desc * desc ;
618+ const struct regulator_desc * multi_regs ;
565619
566620 const char * npname ;
567621 int error , i , irq , multi ;
568622 int irq_idx = 0 ;
569623 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 ;
575624 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 ;
580625
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+ };
594641
595642 enum {
596643 MULTI_BUCK12 ,
@@ -611,13 +658,14 @@ static int tps6594_regulator_probe(struct platform_device *pdev)
611658 * In case of Multiphase configuration, value should be defined for
612659 * buck_configured to avoid creating bucks for every buck in multiphase
613660 */
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 );
616664 npname = of_node_full_name (np );
617665 np_pmic_parent = of_get_parent (of_get_parent (np ));
618666 if (of_node_cmp (of_node_full_name (np_pmic_parent ), tps -> dev -> of_node -> full_name ))
619667 continue ;
620- if (strcmp (npname , multi_regs [ multi ]. supply_name ) == 0 ) {
668+ if (strcmp (npname , multi_regs -> supply_name ) == 0 ) {
621669 switch (multi ) {
622670 case MULTI_BUCK12 :
623671 buck_multi [0 ] = true;
@@ -650,28 +698,19 @@ static int tps6594_regulator_probe(struct platform_device *pdev)
650698 }
651699 }
652700
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 );
664702
665703 irq_data = devm_kmalloc_array (tps -> dev , reg_irq_nb ,
666704 sizeof (struct tps6594_regulator_irq_data ), GFP_KERNEL );
667705 if (!irq_data )
668706 return - ENOMEM ;
669707
670- for (i = 0 ; i < multi_phase_cnt ; i ++ ) {
708+ for (i = 0 ; i < desc -> num_multi_phase_regs ; i ++ ) {
671709 if (!buck_multi [i ])
672710 continue ;
673711
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 );
675714 if (IS_ERR (rdev ))
676715 return dev_err_probe (tps -> dev , PTR_ERR (rdev ),
677716 "failed to register %s regulator\n" ,
@@ -682,89 +721,74 @@ static int tps6594_regulator_probe(struct platform_device *pdev)
682721 buck_idx = 2 ;
683722
684723 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 );
687726 if (error )
688727 return error ;
689728
690729 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 );
693732 if (error )
694733 return error ;
695734
696735 if (i == MULTI_BUCK123 || i == MULTI_BUCK1234 ) {
697736 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 );
700740 if (error )
701741 return error ;
702742 }
703743 if (i == MULTI_BUCK1234 ) {
704744 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 );
707748 if (error )
708749 return error ;
709750 }
710751 }
711752
712- for (i = 0 ; i < nr_buck ; i ++ ) {
753+ for (i = 0 ; i < desc -> num_buck_regs ; i ++ ) {
713754 if (buck_configured [i ])
714755 continue ;
715756
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 );
720758 if (IS_ERR (rdev ))
721759 return dev_err_probe (tps -> dev , PTR_ERR (rdev ),
722760 "failed to register %s regulator\n" , pdev -> name );
723761
724762 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 );
726765 if (error )
727766 return error ;
728767 }
729768
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 );
746775
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 ;
757781 }
758782
759783 irq_ext_reg_data = devm_kmalloc_array (tps -> dev ,
760- irq_count ,
784+ desc -> num_ext_irqs ,
761785 sizeof (struct tps6594_ext_regulator_irq_data ),
762786 GFP_KERNEL );
763787 if (!irq_ext_reg_data )
764788 return - ENOMEM ;
765789
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 ];
768792 irq = platform_get_irq_byname (pdev , irq_type -> irq_name );
769793 if (irq < 0 )
770794 return - EINVAL ;
@@ -782,6 +806,7 @@ static int tps6594_regulator_probe(struct platform_device *pdev)
782806 "failed to request %s IRQ %d\n" ,
783807 irq_type -> irq_name , irq );
784808 }
809+
785810 return 0 ;
786811}
787812
0 commit comments