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 295d6a2646SPascal Paillet static int fixed_set_state(const struct regul_description *desc, bool state) 305d6a2646SPascal Paillet { 315d6a2646SPascal Paillet return 0; 325d6a2646SPascal Paillet } 335d6a2646SPascal Paillet 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 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