From 2f7c68cb55ecb7331f2381deb497c27155f32faf Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Wed, 03 Jan 2024 09:43:39 +0000 Subject: [PATCH] update kernel to 5.10.198 --- kernel/drivers/soc/rockchip/rockchip_system_monitor.c | 93 ++++++++++++++++++++++++++-------------------- 1 files changed, 52 insertions(+), 41 deletions(-) diff --git a/kernel/drivers/soc/rockchip/rockchip_system_monitor.c b/kernel/drivers/soc/rockchip/rockchip_system_monitor.c index 4082565..c2fbb66 100644 --- a/kernel/drivers/soc/rockchip/rockchip_system_monitor.c +++ b/kernel/drivers/soc/rockchip/rockchip_system_monitor.c @@ -4,7 +4,6 @@ * Author: Finley Xiao <finley.xiao@rock-chips.com> */ -#include <dt-bindings/soc/rockchip-system-status.h> #include <linux/clk-provider.h> #include <linux/cpu.h> #include <linux/cpufreq.h> @@ -24,6 +23,7 @@ #include <linux/regulator/driver.h> #include <linux/regulator/machine.h> #include <linux/reboot.h> +#include <linux/rockchip/rockchip_sip.h> #include <linux/slab.h> #include <linux/suspend.h> #include <linux/thermal.h> @@ -246,34 +246,6 @@ return video_info; } -static struct video_info *rockchip_find_video_info(const char *buf) -{ - struct video_info *info, *video_info; - - video_info = rockchip_parse_video_info(buf); - - if (!video_info) - return NULL; - - mutex_lock(&video_info_mutex); - list_for_each_entry(info, &video_info_list, node) { - if (info->width == video_info->width && - info->height == video_info->height && - info->ishevc == video_info->ishevc && - info->videoFramerate == video_info->videoFramerate && - info->streamBitrate == video_info->streamBitrate) { - mutex_unlock(&video_info_mutex); - kfree(video_info); - return info; - } - } - - mutex_unlock(&video_info_mutex); - kfree(video_info); - - return NULL; -} - static void rockchip_add_video_info(struct video_info *video_info) { if (video_info) { @@ -285,12 +257,25 @@ static void rockchip_del_video_info(struct video_info *video_info) { - if (video_info) { - mutex_lock(&video_info_mutex); - list_del(&video_info->node); - mutex_unlock(&video_info_mutex); - kfree(video_info); + struct video_info *info, *tmp; + + if (!video_info) + return; + + mutex_lock(&video_info_mutex); + list_for_each_entry_safe(info, tmp, &video_info_list, node) { + if (info->width == video_info->width && + info->height == video_info->height && + info->ishevc == video_info->ishevc && + info->videoFramerate == video_info->videoFramerate && + info->streamBitrate == video_info->streamBitrate) { + list_del(&info->node); + kfree(info); + break; + } } + kfree(video_info); + mutex_unlock(&video_info_mutex); } static void rockchip_update_video_info(void) @@ -338,7 +323,7 @@ switch (buf[0]) { case '0': /* clear video flag */ - video_info = rockchip_find_video_info(buf); + video_info = rockchip_parse_video_info(buf); if (video_info) { rockchip_del_video_info(video_info); rockchip_update_video_info(); @@ -920,6 +905,7 @@ bool is_low) { struct monitor_dev_profile *devp = info->devp; + struct arm_smccc_res res; int ret = 0; dev_dbg(info->dev, "low_temp %d\n", is_low); @@ -934,6 +920,17 @@ if (devp->update_volt) devp->update_volt(info); + + if (devp->opp_info && devp->opp_info->pvtpll_low_temp) { + res = sip_smc_pvtpll_config(PVTPLL_LOW_TEMP, + devp->opp_info->pvtpll_clk_id, + is_low, 0, 0, 0, 0); + if (res.a0) + dev_err(info->dev, + "%s: error cfg id=%u low temp %d (%d)\n", + __func__, devp->opp_info->pvtpll_clk_id, + is_low, (int)res.a0); + } } static void rockchip_high_temp_adjust(struct monitor_dev_info *info, @@ -1338,6 +1335,15 @@ 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 +1353,13 @@ 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 +1404,12 @@ 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: -- Gitblit v1.6.2