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