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