summaryrefslogtreecommitdiffstats
path: root/src/mainboard/google/cherry/regulator.c
blob: abda0d7682730dace8a31951b233b52605523f4e (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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/* SPDX-License-Identifier: GPL-2.0-only */

#include <console/console.h>
#include <ec/google/chromeec/ec.h>
#include <soc/mt6359p.h>
#include <soc/mt6360.h>
#include <soc/mt6691.h>
#include <soc/regulator.h>

#define MT6691_I2C_NUM	7

static int get_mt6360_regulator_id(enum mtk_regulator regulator)
{
	switch (regulator) {
	case MTK_REGULATOR_VDD2:
		return MT6360_BUCK1;
	case MTK_REGULATOR_VDDQ:
		return MT6360_BUCK2;
	case MTK_REGULATOR_VCC:
		return MT6360_LDO5;
	case MTK_REGULATOR_VCCQ:
		return MT6360_LDO3;
	default:
		break;
	}

	return -1;
}

static int get_mt6359p_regulator_id(enum mtk_regulator regulator)
{
	return regulator == MTK_REGULATOR_VCORE ? MT6359P_GPU11 : -1;
}

static int get_mt6691_regulator_id(enum mtk_regulator regulator)
{
	return regulator == MTK_REGULATOR_VMDDR ? MT6691_I2C_NUM : -1;
}

static int check_regulator_control(enum mtk_regulator regulator)
{
	/*
	 * MT6880 is not controlled by SW.
	 * No need to control it.
	 */
	if (regulator == MTK_REGULATOR_VDD1) {
		printk(BIOS_WARNING,
		       "[%d] MT6880 is not controlled by SW.\n", regulator);
		return -1;
	}
	return 0;
}

void mainboard_set_regulator_vol(enum mtk_regulator regulator,
				 uint32_t voltage_uv)
{
	if (check_regulator_control(regulator) < 0)
		return;

	int id;

	id = get_mt6360_regulator_id(regulator);
	if (id >= 0) {
		mt6360_set_voltage(id, voltage_uv);
		return;
	}

	id = get_mt6359p_regulator_id(regulator);
	if (id >= 0) {
		mt6359p_buck_set_voltage(id, voltage_uv);
		return;
	}

	id = get_mt6691_regulator_id(regulator);
	if (id >= 0) {
		mt6691_set_voltage(id, voltage_uv);
		return;
	}

	printk(BIOS_ERR, "Invalid regulator ID: %d\n", regulator);
}

uint32_t mainboard_get_regulator_vol(enum mtk_regulator regulator)
{
	if (check_regulator_control(regulator) < 0)
		return 0;

	int id;

	id = get_mt6360_regulator_id(regulator);
	if (id >= 0)
		return mt6360_get_voltage(id);

	id = get_mt6359p_regulator_id(regulator);
	if (id >= 0)
		return mt6359p_buck_get_voltage(id);

	id = get_mt6691_regulator_id(regulator);
	if (id >= 0)
		return mt6691_get_voltage(id);

	printk(BIOS_ERR, "Invalid regulator ID: %d\n", regulator);

	return 0;
}

int mainboard_enable_regulator(enum mtk_regulator regulator, uint8_t enable)
{
	if (check_regulator_control(regulator) < 0)
		return 0;

	/* Return 0 if the regulator is already enabled or disabled. */
	if (mainboard_regulator_is_enabled(regulator) == enable)
		return 0;

	int id;

	id = get_mt6360_regulator_id(regulator);
	if (id >= 0) {
		mt6360_enable(id, enable);
		return 0;
	}

	printk(BIOS_ERR, "Invalid regulator ID: %d\n", regulator);

	return -1;
}

uint8_t mainboard_regulator_is_enabled(enum mtk_regulator regulator)
{
	if (check_regulator_control(regulator) < 0)
		return 0;

	int id;

	id = get_mt6360_regulator_id(regulator);
	if (id >= 0)
		return mt6360_is_enabled(id);

	printk(BIOS_ERR,
	       "Failed to query regulator ID: %d\n; assuming disabled",
	       regulator);

	return 0;
}