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