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