/* * Copyright (C) 2024, STMicroelectronics - All Rights Reserved * * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include #include /* configure the STPMIC1 regulators on STMicroelectronics boards */ static int pmic_ddr_power_init(enum ddr_type ddr_type) { int status; uint16_t buck3_min_mv __maybe_unused; struct rdev *buck2, *buck3 __maybe_unused, *vref; struct rdev *ldo3 __maybe_unused; buck2 = regulator_get_by_name("buck2"); if (buck2 == NULL) { return -ENOENT; } #if STM32MP15 ldo3 = regulator_get_by_name("ldo3"); if (ldo3 == NULL) { return -ENOENT; } #endif vref = regulator_get_by_name("vref_ddr"); if (vref == NULL) { return -ENOENT; } switch (ddr_type) { case STM32MP_DDR3: #if STM32MP15 status = regulator_set_flag(ldo3, REGUL_SINK_SOURCE); if (status != 0) { return status; } #endif status = regulator_set_min_voltage(buck2); if (status != 0) { return status; } status = regulator_enable(buck2); if (status != 0) { return status; } status = regulator_enable(vref); if (status != 0) { return status; } #if STM32MP15 status = regulator_enable(ldo3); if (status != 0) { return status; } #endif break; case STM32MP_LPDDR2: case STM32MP_LPDDR3: #if STM32MP15 /* * Set LDO3 to 1.8V according BUCK3 voltage * => bypass mode if BUCK3 = 1.8V * => normal mode if BUCK3 != 1.8V */ buck3 = regulator_get_by_name("buck3"); if (buck3 == NULL) { return -ENOENT; } regulator_get_range(buck3, &buck3_min_mv, NULL); if (buck3_min_mv != 1800) { status = regulator_set_min_voltage(ldo3); if (status != 0) { return status; } } else { status = regulator_set_flag(ldo3, REGUL_ENABLE_BYPASS); if (status != 0) { return status; } } #endif status = regulator_set_min_voltage(buck2); if (status != 0) { return status; } #if STM32MP15 status = regulator_enable(ldo3); if (status != 0) { return status; } #endif status = regulator_enable(buck2); if (status != 0) { return status; } status = regulator_enable(vref); if (status != 0) { return status; } break; default: break; }; return 0; } int stm32mp_board_ddr_power_init(enum ddr_type ddr_type) { if (dt_pmic_status() > 0) { return pmic_ddr_power_init(ddr_type); } return 0; }