/* * Copyright (c) 2021, STMicroelectronics - All Rights Reserved * * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include #include #include #include #include #ifndef PLAT_NB_FIXED_REGS #error "Missing PLAT_NB_FIXED_REGS" #endif #define FIXED_NAME_LEN 32 struct fixed_data { char name[FIXED_NAME_LEN]; uint16_t volt; struct regul_description desc; }; static struct fixed_data data[PLAT_NB_FIXED_REGS]; static int fixed_set_state(const struct regul_description *desc, bool state) { return 0; } static int fixed_get_state(const struct regul_description *desc) { return 1; } static struct regul_ops fixed_ops = { .set_state = fixed_set_state, .get_state = fixed_get_state, }; int fixed_regulator_register(void) { uint32_t count = 0; void *fdt; int node; VERBOSE("fixed reg init!\n"); if (fdt_get_address(&fdt) == 0) { return -FDT_ERR_NOTFOUND; } fdt_for_each_compatible_node(fdt, node, "regulator-fixed") { int len __unused; int ret; struct fixed_data *d = &data[count]; const char *reg_name; reg_name = fdt_get_name(fdt, node, NULL); VERBOSE("register fixed reg %s!\n", reg_name); len = snprintf(d->name, FIXED_NAME_LEN - 1, "%s", reg_name); assert((len > 0) && (len < (FIXED_NAME_LEN - 1))); d->desc.node_name = d->name; d->desc.driver_data = d; d->desc.ops = &fixed_ops; ret = regulator_register(&d->desc, node); if (ret != 0) { WARN("%s:%d failed to register %s\n", __func__, __LINE__, reg_name); return ret; } count++; assert(count <= PLAT_NB_FIXED_REGS); } return 0; }