xref: /rk3399_ARM-atf/drivers/st/regulator/regulator_fixed.c (revision 9526ad6058720fa6ad0369839c1aa72e60f5ce82)
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