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