blob: f1c224e04d06193a9b3289936143462a6ef5dc43 [file] [log] [blame]
/*
* Copyright (c) 2021, STMicroelectronics - All Rights Reserved
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <assert.h>
#include <errno.h>
#include <common/debug.h>
#include <common/fdt_wrappers.h>
#include <drivers/st/regulator.h>
#include <drivers/st/regulator_fixed.h>
#include <libfdt.h>
#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;
}