From 1e5bbbbd5395ceaee23c6c989ba9a69b08a0f020 Mon Sep 17 00:00:00 2001 From: Finley Xiao Date: Mon, 11 Sep 2023 16:19:31 +0800 Subject: [PATCH] soc: rockchip: rockchip_system_monitor: Make mem volt greater than vdd volt The vdd is the power supply of pvtpll, if mem volt less than vdd volt, there will not be enough voltage margin. Signed-off-by: Finley Xiao Change-Id: I15b57904c20b74d16ac8113f3e49e3410bcf02af --- .../soc/rockchip/rockchip_system_monitor.c | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/drivers/soc/rockchip/rockchip_system_monitor.c b/drivers/soc/rockchip/rockchip_system_monitor.c index 40825656d406..4f96c079f8f7 100644 --- a/drivers/soc/rockchip/rockchip_system_monitor.c +++ b/drivers/soc/rockchip/rockchip_system_monitor.c @@ -1338,6 +1338,15 @@ int rockchip_monitor_check_rate_volt(struct monitor_dev_info *info) rockchip_set_intermediate_rate(dev, opp_info, info->clk, old_rate, new_rate, true, is_set_clk); + + if (old_volt > new_volt) { + ret = regulator_set_voltage(vdd_reg, new_volt, INT_MAX); + if (ret) { + dev_err(dev, "%s: failed to set volt: %lu\n", + __func__, new_volt); + goto restore_voltage; + } + } if (info->regulator_count > 1) { ret = regulator_set_voltage(mem_reg, new_mem_volt, INT_MAX); @@ -1347,11 +1356,13 @@ int rockchip_monitor_check_rate_volt(struct monitor_dev_info *info) goto restore_voltage; } } - ret = regulator_set_voltage(vdd_reg, new_volt, INT_MAX); - if (ret) { - dev_err(dev, "%s: failed to set volt: %lu\n", - __func__, new_volt); - goto restore_voltage; + if (old_volt <= new_volt) { + ret = regulator_set_voltage(vdd_reg, new_volt, INT_MAX); + if (ret) { + dev_err(dev, "%s: failed to set volt: %lu\n", + __func__, new_volt); + goto restore_voltage; + } } rockchip_set_read_margin(dev, opp_info, target_rm, is_set_rm); if (is_set_clk && clk_set_rate(info->clk, new_rate)) { @@ -1396,9 +1407,12 @@ restore_rm: rockchip_get_read_margin(dev, opp_info, old_volt, &target_rm); rockchip_set_read_margin(dev, opp_info, target_rm, is_set_rm); restore_voltage: + if (old_volt <= new_volt) + regulator_set_voltage(vdd_reg, old_volt, INT_MAX); if (info->regulator_count > 1) regulator_set_voltage(mem_reg, old_mem_volt, INT_MAX); - regulator_set_voltage(vdd_reg, old_volt, INT_MAX); + if (old_volt > new_volt) + regulator_set_voltage(vdd_reg, old_volt, INT_MAX); disable_clk: rockchip_monitor_disable_opp_clk(dev, opp_info); unlock: