xref: /rk3399_ARM-atf/plat/st/stm32mp1/plat_ddr.c (revision eaaf26e3e6ac347cbfda00b6ba7d327e715d68f0)
1*47e62314SPatrick Delaunay /*
2*47e62314SPatrick Delaunay  * Copyright (C) 2024, STMicroelectronics - All Rights Reserved
3*47e62314SPatrick Delaunay  *
4*47e62314SPatrick Delaunay  * SPDX-License-Identifier: BSD-3-Clause
5*47e62314SPatrick Delaunay  */
6*47e62314SPatrick Delaunay 
7*47e62314SPatrick Delaunay #include <errno.h>
8*47e62314SPatrick Delaunay 
9*47e62314SPatrick Delaunay #include <drivers/st/regulator.h>
10*47e62314SPatrick Delaunay #include <drivers/st/stm32mp_ddr.h>
11*47e62314SPatrick Delaunay #include <drivers/st/stm32mp_pmic.h>
12*47e62314SPatrick Delaunay 
13*47e62314SPatrick Delaunay /* configure the STPMIC1 regulators on STMicroelectronics boards */
pmic_ddr_power_init(enum ddr_type ddr_type)14*47e62314SPatrick Delaunay static int pmic_ddr_power_init(enum ddr_type ddr_type)
15*47e62314SPatrick Delaunay {
16*47e62314SPatrick Delaunay 	int status;
17*47e62314SPatrick Delaunay 	uint16_t buck3_min_mv __maybe_unused;
18*47e62314SPatrick Delaunay 	struct rdev *buck2, *buck3 __maybe_unused, *vref;
19*47e62314SPatrick Delaunay 	struct rdev *ldo3 __maybe_unused;
20*47e62314SPatrick Delaunay 
21*47e62314SPatrick Delaunay 	buck2 = regulator_get_by_name("buck2");
22*47e62314SPatrick Delaunay 	if (buck2 == NULL) {
23*47e62314SPatrick Delaunay 		return -ENOENT;
24*47e62314SPatrick Delaunay 	}
25*47e62314SPatrick Delaunay 
26*47e62314SPatrick Delaunay #if STM32MP15
27*47e62314SPatrick Delaunay 	ldo3 = regulator_get_by_name("ldo3");
28*47e62314SPatrick Delaunay 	if (ldo3 == NULL) {
29*47e62314SPatrick Delaunay 		return -ENOENT;
30*47e62314SPatrick Delaunay 	}
31*47e62314SPatrick Delaunay #endif
32*47e62314SPatrick Delaunay 
33*47e62314SPatrick Delaunay 	vref = regulator_get_by_name("vref_ddr");
34*47e62314SPatrick Delaunay 	if (vref == NULL) {
35*47e62314SPatrick Delaunay 		return -ENOENT;
36*47e62314SPatrick Delaunay 	}
37*47e62314SPatrick Delaunay 
38*47e62314SPatrick Delaunay 	switch (ddr_type) {
39*47e62314SPatrick Delaunay 	case STM32MP_DDR3:
40*47e62314SPatrick Delaunay #if STM32MP15
41*47e62314SPatrick Delaunay 		status = regulator_set_flag(ldo3, REGUL_SINK_SOURCE);
42*47e62314SPatrick Delaunay 		if (status != 0) {
43*47e62314SPatrick Delaunay 			return status;
44*47e62314SPatrick Delaunay 		}
45*47e62314SPatrick Delaunay #endif
46*47e62314SPatrick Delaunay 
47*47e62314SPatrick Delaunay 		status = regulator_set_min_voltage(buck2);
48*47e62314SPatrick Delaunay 		if (status != 0) {
49*47e62314SPatrick Delaunay 			return status;
50*47e62314SPatrick Delaunay 		}
51*47e62314SPatrick Delaunay 
52*47e62314SPatrick Delaunay 		status = regulator_enable(buck2);
53*47e62314SPatrick Delaunay 		if (status != 0) {
54*47e62314SPatrick Delaunay 			return status;
55*47e62314SPatrick Delaunay 		}
56*47e62314SPatrick Delaunay 
57*47e62314SPatrick Delaunay 		status = regulator_enable(vref);
58*47e62314SPatrick Delaunay 		if (status != 0) {
59*47e62314SPatrick Delaunay 			return status;
60*47e62314SPatrick Delaunay 		}
61*47e62314SPatrick Delaunay 
62*47e62314SPatrick Delaunay #if STM32MP15
63*47e62314SPatrick Delaunay 		status = regulator_enable(ldo3);
64*47e62314SPatrick Delaunay 		if (status != 0) {
65*47e62314SPatrick Delaunay 			return status;
66*47e62314SPatrick Delaunay 		}
67*47e62314SPatrick Delaunay #endif
68*47e62314SPatrick Delaunay 		break;
69*47e62314SPatrick Delaunay 
70*47e62314SPatrick Delaunay 	case STM32MP_LPDDR2:
71*47e62314SPatrick Delaunay 	case STM32MP_LPDDR3:
72*47e62314SPatrick Delaunay #if STM32MP15
73*47e62314SPatrick Delaunay 		/*
74*47e62314SPatrick Delaunay 		 * Set LDO3 to 1.8V according  BUCK3 voltage
75*47e62314SPatrick Delaunay 		 * => bypass mode if BUCK3 = 1.8V
76*47e62314SPatrick Delaunay 		 * => normal mode if BUCK3 != 1.8V
77*47e62314SPatrick Delaunay 		 */
78*47e62314SPatrick Delaunay 		buck3 = regulator_get_by_name("buck3");
79*47e62314SPatrick Delaunay 		if (buck3 == NULL) {
80*47e62314SPatrick Delaunay 			return -ENOENT;
81*47e62314SPatrick Delaunay 		}
82*47e62314SPatrick Delaunay 
83*47e62314SPatrick Delaunay 		regulator_get_range(buck3, &buck3_min_mv, NULL);
84*47e62314SPatrick Delaunay 
85*47e62314SPatrick Delaunay 		if (buck3_min_mv != 1800) {
86*47e62314SPatrick Delaunay 			status = regulator_set_min_voltage(ldo3);
87*47e62314SPatrick Delaunay 			if (status != 0) {
88*47e62314SPatrick Delaunay 				return status;
89*47e62314SPatrick Delaunay 			}
90*47e62314SPatrick Delaunay 		} else {
91*47e62314SPatrick Delaunay 			status = regulator_set_flag(ldo3, REGUL_ENABLE_BYPASS);
92*47e62314SPatrick Delaunay 			if (status != 0) {
93*47e62314SPatrick Delaunay 				return status;
94*47e62314SPatrick Delaunay 			}
95*47e62314SPatrick Delaunay 		}
96*47e62314SPatrick Delaunay #endif
97*47e62314SPatrick Delaunay 
98*47e62314SPatrick Delaunay 		status = regulator_set_min_voltage(buck2);
99*47e62314SPatrick Delaunay 		if (status != 0) {
100*47e62314SPatrick Delaunay 			return status;
101*47e62314SPatrick Delaunay 		}
102*47e62314SPatrick Delaunay 
103*47e62314SPatrick Delaunay #if STM32MP15
104*47e62314SPatrick Delaunay 		status = regulator_enable(ldo3);
105*47e62314SPatrick Delaunay 		if (status != 0) {
106*47e62314SPatrick Delaunay 			return status;
107*47e62314SPatrick Delaunay 		}
108*47e62314SPatrick Delaunay #endif
109*47e62314SPatrick Delaunay 
110*47e62314SPatrick Delaunay 		status = regulator_enable(buck2);
111*47e62314SPatrick Delaunay 		if (status != 0) {
112*47e62314SPatrick Delaunay 			return status;
113*47e62314SPatrick Delaunay 		}
114*47e62314SPatrick Delaunay 
115*47e62314SPatrick Delaunay 		status = regulator_enable(vref);
116*47e62314SPatrick Delaunay 		if (status != 0) {
117*47e62314SPatrick Delaunay 			return status;
118*47e62314SPatrick Delaunay 		}
119*47e62314SPatrick Delaunay 		break;
120*47e62314SPatrick Delaunay 
121*47e62314SPatrick Delaunay 	default:
122*47e62314SPatrick Delaunay 		break;
123*47e62314SPatrick Delaunay 	};
124*47e62314SPatrick Delaunay 
125*47e62314SPatrick Delaunay 	return 0;
126*47e62314SPatrick Delaunay }
127*47e62314SPatrick Delaunay 
stm32mp_board_ddr_power_init(enum ddr_type ddr_type)128*47e62314SPatrick Delaunay int stm32mp_board_ddr_power_init(enum ddr_type ddr_type)
129*47e62314SPatrick Delaunay {
130*47e62314SPatrick Delaunay 	if (dt_pmic_status() > 0) {
131*47e62314SPatrick Delaunay 		return pmic_ddr_power_init(ddr_type);
132*47e62314SPatrick Delaunay 	}
133*47e62314SPatrick Delaunay 
134*47e62314SPatrick Delaunay 	return 0;
135*47e62314SPatrick Delaunay }
136