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 Delaunaystatic 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 Delaunayint 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