123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- /*
- * Copyright (C) 2024, STMicroelectronics - All Rights Reserved
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
- #include <errno.h>
- #include <drivers/st/regulator.h>
- #include <drivers/st/stm32mp_ddr.h>
- #include <drivers/st/stm32mp_pmic.h>
- /* 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;
- }
|