summaryrefslogtreecommitdiffstats
path: root/drivers/st/regulator/regulator_fixed.c
blob: 6c9d3b17e1db2f8407b009c4e7b3c407bbf0c99f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
 * 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;
}