/*
 * Copyright (c) 2021-2023, 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_REGUS
#error "Missing PLAT_NB_FIXED_REGUS"
#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_REGUS];

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_REGUS);

	}

	return 0;
}
