xref: /rk3399_ARM-atf/drivers/st/regulator/regulator_fixed.c (revision cff2b1145d246a0935b72e2c21123641dc8fa182)
15d6a2646SPascal Paillet /*
2*cff2b114SPascal Paillet  * Copyright (c) 2021-2023, STMicroelectronics - All Rights Reserved
35d6a2646SPascal Paillet  *
45d6a2646SPascal Paillet  * SPDX-License-Identifier: BSD-3-Clause
55d6a2646SPascal Paillet  */
65d6a2646SPascal Paillet 
75d6a2646SPascal Paillet #include <assert.h>
85d6a2646SPascal Paillet #include <errno.h>
95d6a2646SPascal Paillet 
105d6a2646SPascal Paillet #include <common/debug.h>
115d6a2646SPascal Paillet #include <common/fdt_wrappers.h>
125d6a2646SPascal Paillet #include <drivers/st/regulator.h>
135d6a2646SPascal Paillet #include <drivers/st/regulator_fixed.h>
145d6a2646SPascal Paillet #include <libfdt.h>
155d6a2646SPascal Paillet 
16*cff2b114SPascal Paillet #ifndef PLAT_NB_FIXED_REGUS
17*cff2b114SPascal Paillet #error "Missing PLAT_NB_FIXED_REGUS"
185d6a2646SPascal Paillet #endif
195d6a2646SPascal Paillet 
205d6a2646SPascal Paillet #define FIXED_NAME_LEN 32
215d6a2646SPascal Paillet 
225d6a2646SPascal Paillet struct fixed_data {
235d6a2646SPascal Paillet 	char name[FIXED_NAME_LEN];
245d6a2646SPascal Paillet 	uint16_t volt;
255d6a2646SPascal Paillet 	struct regul_description desc;
265d6a2646SPascal Paillet };
275d6a2646SPascal Paillet 
28*cff2b114SPascal Paillet static struct fixed_data data[PLAT_NB_FIXED_REGUS];
295d6a2646SPascal Paillet 
305d6a2646SPascal Paillet static int fixed_set_state(const struct regul_description *desc, bool state)
315d6a2646SPascal Paillet {
325d6a2646SPascal Paillet 	return 0;
335d6a2646SPascal Paillet }
345d6a2646SPascal Paillet 
355d6a2646SPascal Paillet static int fixed_get_state(const struct regul_description *desc)
365d6a2646SPascal Paillet {
375d6a2646SPascal Paillet 	return 1;
385d6a2646SPascal Paillet }
395d6a2646SPascal Paillet 
405d6a2646SPascal Paillet static struct regul_ops fixed_ops = {
415d6a2646SPascal Paillet 	.set_state = fixed_set_state,
425d6a2646SPascal Paillet 	.get_state = fixed_get_state,
435d6a2646SPascal Paillet };
445d6a2646SPascal Paillet 
455d6a2646SPascal Paillet int fixed_regulator_register(void)
465d6a2646SPascal Paillet {
475d6a2646SPascal Paillet 	uint32_t count = 0;
485d6a2646SPascal Paillet 	void *fdt;
495d6a2646SPascal Paillet 	int node;
505d6a2646SPascal Paillet 
515d6a2646SPascal Paillet 	VERBOSE("fixed reg init!\n");
525d6a2646SPascal Paillet 
535d6a2646SPascal Paillet 	if (fdt_get_address(&fdt) == 0) {
545d6a2646SPascal Paillet 		return -FDT_ERR_NOTFOUND;
555d6a2646SPascal Paillet 	}
565d6a2646SPascal Paillet 
575d6a2646SPascal Paillet 	fdt_for_each_compatible_node(fdt, node, "regulator-fixed") {
585d6a2646SPascal Paillet 		int len __unused;
595d6a2646SPascal Paillet 		int ret;
605d6a2646SPascal Paillet 		struct fixed_data *d = &data[count];
615d6a2646SPascal Paillet 		const char *reg_name;
625d6a2646SPascal Paillet 
635d6a2646SPascal Paillet 		reg_name = fdt_get_name(fdt, node, NULL);
645d6a2646SPascal Paillet 
655d6a2646SPascal Paillet 		VERBOSE("register fixed reg %s!\n", reg_name);
665d6a2646SPascal Paillet 
675d6a2646SPascal Paillet 		len = snprintf(d->name, FIXED_NAME_LEN - 1, "%s", reg_name);
685d6a2646SPascal Paillet 		assert((len > 0) && (len < (FIXED_NAME_LEN - 1)));
695d6a2646SPascal Paillet 
705d6a2646SPascal Paillet 		d->desc.node_name = d->name;
715d6a2646SPascal Paillet 		d->desc.driver_data = d;
725d6a2646SPascal Paillet 		d->desc.ops = &fixed_ops;
735d6a2646SPascal Paillet 
745d6a2646SPascal Paillet 		ret = regulator_register(&d->desc, node);
755d6a2646SPascal Paillet 		if (ret != 0) {
765d6a2646SPascal Paillet 			WARN("%s:%d failed to register %s\n", __func__,
775d6a2646SPascal Paillet 			     __LINE__, reg_name);
785d6a2646SPascal Paillet 			return ret;
795d6a2646SPascal Paillet 		}
805d6a2646SPascal Paillet 
815d6a2646SPascal Paillet 		count++;
82*cff2b114SPascal Paillet 		assert(count <= PLAT_NB_FIXED_REGUS);
835d6a2646SPascal Paillet 
845d6a2646SPascal Paillet 	}
855d6a2646SPascal Paillet 
865d6a2646SPascal Paillet 	return 0;
875d6a2646SPascal Paillet }
88