1 /*
2 * Copyright (c) 2021-2025, STMicroelectronics - All Rights Reserved
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 #include <assert.h>
8 #include <errno.h>
9
10 #include <common/debug.h>
11 #include <common/fdt_wrappers.h>
12 #include <drivers/st/regulator.h>
13 #include <drivers/st/regulator_fixed.h>
14 #include <libfdt.h>
15
16 #ifndef PLAT_NB_FIXED_REGUS
17 #error "Missing PLAT_NB_FIXED_REGUS"
18 #endif
19
20 #define FIXED_NAME_LEN 32
21
22 struct fixed_data {
23 char name[FIXED_NAME_LEN];
24 struct regul_description desc;
25 };
26
27 static struct fixed_data data[PLAT_NB_FIXED_REGUS];
28
fixed_set_state(const struct regul_description * desc,bool state)29 static int fixed_set_state(const struct regul_description *desc, bool state)
30 {
31 return 0;
32 }
33
fixed_get_state(const struct regul_description * desc)34 static int fixed_get_state(const struct regul_description *desc)
35 {
36 return 1;
37 }
38
39 static struct regul_ops fixed_ops = {
40 .set_state = fixed_set_state,
41 .get_state = fixed_get_state,
42 };
43
fixed_regulator_register(void)44 int fixed_regulator_register(void)
45 {
46 uint32_t count = 0;
47 void *fdt;
48 int node;
49
50 VERBOSE("fixed reg init!\n");
51
52 if (fdt_get_address(&fdt) == 0) {
53 return -FDT_ERR_NOTFOUND;
54 }
55
56 fdt_for_each_compatible_node(fdt, node, "regulator-fixed") {
57 int len __unused;
58 int ret;
59 struct fixed_data *d = &data[count];
60 const char *reg_name;
61
62 reg_name = fdt_get_name(fdt, node, NULL);
63
64 VERBOSE("register fixed reg %s!\n", reg_name);
65
66 len = snprintf(d->name, FIXED_NAME_LEN - 1, "%s", reg_name);
67 assert((len > 0) && (len < (FIXED_NAME_LEN - 1)));
68
69 d->desc.node_name = d->name;
70 d->desc.driver_data = d;
71 d->desc.ops = &fixed_ops;
72
73 ret = regulator_register(&d->desc, node);
74 if (ret != 0) {
75 WARN("%s:%d failed to register %s\n", __func__,
76 __LINE__, reg_name);
77 return ret;
78 }
79
80 count++;
81 assert(count <= PLAT_NB_FIXED_REGUS);
82
83 }
84
85 return 0;
86 }
87