From c92deced0b1067ec869f36a718d9b0c9c3c19f14 Mon Sep 17 00:00:00 2001 From: YouMin Chen Date: Mon, 17 Apr 2023 11:30:52 +0800 Subject: [PATCH] PM / devfreq: rockchip_dmc: Add lock for rockchip_dmcfreq_get_dev_status RK3588 platform may crash if the CPU and MCU access the DFI/DMC registers at same time. Signed-off-by: YouMin Chen Change-Id: I6912f72aff09f7db6d696f4a5b15ccc06f68ba04 --- drivers/devfreq/rockchip_dmc.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/devfreq/rockchip_dmc.c b/drivers/devfreq/rockchip_dmc.c index 0df9b39f3700..073e679701af 100644 --- a/drivers/devfreq/rockchip_dmc.c +++ b/drivers/devfreq/rockchip_dmc.c @@ -594,12 +594,17 @@ static int rockchip_dmcfreq_get_dev_status(struct device *dev, if (!dmcfreq->info.auto_freq_en) return -EINVAL; + /* + * RK3588 platform may crash if the CPU and MCU access the DFI/DMC + * registers at same time. + */ + rockchip_monitor_volt_adjust_lock(dmcfreq->mdev_info); for (i = 0; i < dmcfreq->edev_count; i++) { ret = devfreq_event_get_event(dmcfreq->edev[i], &edata); if (ret < 0) { dev_err(dev, "failed to get event %s\n", dmcfreq->edev[i]->desc->name); - return ret; + goto out; } if (i == dmcfreq->dfi_id) { stat->busy_time = edata.load_count; @@ -609,7 +614,10 @@ static int rockchip_dmcfreq_get_dev_status(struct device *dev, } } - return 0; +out: + rockchip_monitor_volt_adjust_unlock(dmcfreq->mdev_info); + + return ret; } static int rockchip_dmcfreq_get_cur_freq(struct device *dev,