Skip to content

Commit e64ee27

Browse files
mwallebroonie
authored andcommitted
regulator: tps6594-regulator: refactor variant descriptions
Instead of using conditionals or tri state operators throughout the .probe() provide a description per variant. This will make it much easier to add new variants later. While at it, make the variable naming more consistent. This patch is only compile-time tested. Signed-off-by: Michael Walle <[email protected]> Acked-by: Mark Brown <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent 180a135 commit e64ee27

File tree

1 file changed

+112
-87
lines changed

1 file changed

+112
-87
lines changed

drivers/regulator/tps6594-regulator.c

Lines changed: 112 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,6 @@
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

2925
enum 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+
552605
static 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

Comments
 (0)