1 /* 2 * Copyright (c) 2021-2025, STMicroelectronics - All Rights Reserved 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #include <assert.h> 8 #include <errno.h> 9 10 #include <common/debug.h> 11 #include <common/fdt_wrappers.h> 12 #include <drivers/st/regulator.h> 13 #include <drivers/st/regulator_fixed.h> 14 #include <libfdt.h> 15 16 #ifndef PLAT_NB_FIXED_REGUS 17 #error "Missing PLAT_NB_FIXED_REGUS" 18 #endif 19 20 #define FIXED_NAME_LEN 32 21 22 struct fixed_data { 23 char name[FIXED_NAME_LEN]; 24 struct regul_description desc; 25 }; 26 27 static struct fixed_data data[PLAT_NB_FIXED_REGUS]; 28 29 static int fixed_set_state(const struct regul_description *desc, bool state) 30 { 31 return 0; 32 } 33 34 static int fixed_get_state(const struct regul_description *desc) 35 { 36 return 1; 37 } 38 39 static struct regul_ops fixed_ops = { 40 .set_state = fixed_set_state, 41 .get_state = fixed_get_state, 42 }; 43 44 int fixed_regulator_register(void) 45 { 46 uint32_t count = 0; 47 void *fdt; 48 int node; 49 50 VERBOSE("fixed reg init!\n"); 51 52 if (fdt_get_address(&fdt) == 0) { 53 return -FDT_ERR_NOTFOUND; 54 } 55 56 fdt_for_each_compatible_node(fdt, node, "regulator-fixed") { 57 int len __unused; 58 int ret; 59 struct fixed_data *d = &data[count]; 60 const char *reg_name; 61 62 reg_name = fdt_get_name(fdt, node, NULL); 63 64 VERBOSE("register fixed reg %s!\n", reg_name); 65 66 len = snprintf(d->name, FIXED_NAME_LEN - 1, "%s", reg_name); 67 assert((len > 0) && (len < (FIXED_NAME_LEN - 1))); 68 69 d->desc.node_name = d->name; 70 d->desc.driver_data = d; 71 d->desc.ops = &fixed_ops; 72 73 ret = regulator_register(&d->desc, node); 74 if (ret != 0) { 75 WARN("%s:%d failed to register %s\n", __func__, 76 __LINE__, reg_name); 77 return ret; 78 } 79 80 count++; 81 assert(count <= PLAT_NB_FIXED_REGUS); 82 83 } 84 85 return 0; 86 } 87