15d6a2646SPascal Paillet /*
2*adeee68bSPascal Paillet * Copyright (c) 2021-2025, 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
16cff2b114SPascal Paillet #ifndef PLAT_NB_FIXED_REGUS
17cff2b114SPascal 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 struct regul_description desc;
255d6a2646SPascal Paillet };
265d6a2646SPascal Paillet
27cff2b114SPascal Paillet static struct fixed_data data[PLAT_NB_FIXED_REGUS];
285d6a2646SPascal Paillet
fixed_set_state(const struct regul_description * desc,bool state)295d6a2646SPascal Paillet static int fixed_set_state(const struct regul_description *desc, bool state)
305d6a2646SPascal Paillet {
315d6a2646SPascal Paillet return 0;
325d6a2646SPascal Paillet }
335d6a2646SPascal Paillet
fixed_get_state(const struct regul_description * desc)345d6a2646SPascal Paillet static int fixed_get_state(const struct regul_description *desc)
355d6a2646SPascal Paillet {
365d6a2646SPascal Paillet return 1;
375d6a2646SPascal Paillet }
385d6a2646SPascal Paillet
395d6a2646SPascal Paillet static struct regul_ops fixed_ops = {
405d6a2646SPascal Paillet .set_state = fixed_set_state,
415d6a2646SPascal Paillet .get_state = fixed_get_state,
425d6a2646SPascal Paillet };
435d6a2646SPascal Paillet
fixed_regulator_register(void)445d6a2646SPascal Paillet int fixed_regulator_register(void)
455d6a2646SPascal Paillet {
465d6a2646SPascal Paillet uint32_t count = 0;
475d6a2646SPascal Paillet void *fdt;
485d6a2646SPascal Paillet int node;
495d6a2646SPascal Paillet
505d6a2646SPascal Paillet VERBOSE("fixed reg init!\n");
515d6a2646SPascal Paillet
525d6a2646SPascal Paillet if (fdt_get_address(&fdt) == 0) {
535d6a2646SPascal Paillet return -FDT_ERR_NOTFOUND;
545d6a2646SPascal Paillet }
555d6a2646SPascal Paillet
565d6a2646SPascal Paillet fdt_for_each_compatible_node(fdt, node, "regulator-fixed") {
575d6a2646SPascal Paillet int len __unused;
585d6a2646SPascal Paillet int ret;
595d6a2646SPascal Paillet struct fixed_data *d = &data[count];
605d6a2646SPascal Paillet const char *reg_name;
615d6a2646SPascal Paillet
625d6a2646SPascal Paillet reg_name = fdt_get_name(fdt, node, NULL);
635d6a2646SPascal Paillet
645d6a2646SPascal Paillet VERBOSE("register fixed reg %s!\n", reg_name);
655d6a2646SPascal Paillet
665d6a2646SPascal Paillet len = snprintf(d->name, FIXED_NAME_LEN - 1, "%s", reg_name);
675d6a2646SPascal Paillet assert((len > 0) && (len < (FIXED_NAME_LEN - 1)));
685d6a2646SPascal Paillet
695d6a2646SPascal Paillet d->desc.node_name = d->name;
705d6a2646SPascal Paillet d->desc.driver_data = d;
715d6a2646SPascal Paillet d->desc.ops = &fixed_ops;
725d6a2646SPascal Paillet
735d6a2646SPascal Paillet ret = regulator_register(&d->desc, node);
745d6a2646SPascal Paillet if (ret != 0) {
755d6a2646SPascal Paillet WARN("%s:%d failed to register %s\n", __func__,
765d6a2646SPascal Paillet __LINE__, reg_name);
775d6a2646SPascal Paillet return ret;
785d6a2646SPascal Paillet }
795d6a2646SPascal Paillet
805d6a2646SPascal Paillet count++;
81cff2b114SPascal Paillet assert(count <= PLAT_NB_FIXED_REGUS);
825d6a2646SPascal Paillet
835d6a2646SPascal Paillet }
845d6a2646SPascal Paillet
855d6a2646SPascal Paillet return 0;
865d6a2646SPascal Paillet }
87