From ff902937c029245f0e8672fbc7a3a24d45476942 Mon Sep 17 00:00:00 2001 From: Liang Chen Date: Wed, 3 Jan 2024 09:20:32 +0800 Subject: [PATCH 1/4] arm64: dts: rockchip: rk3562: adjust low-temp-min-volt for cpu/dmc Raise voltage of cpu/dmc when low temperature to improve stability. Signed-off-by: Liang Chen Change-Id: I80321c0454c98c62a237192b46fa00da1b48d336 --- arch/arm64/boot/dts/rockchip/rk3562-dictpen-test3-v20.dts | 2 ++ arch/arm64/boot/dts/rockchip/rk3562.dtsi | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/arch/arm64/boot/dts/rockchip/rk3562-dictpen-test3-v20.dts b/arch/arm64/boot/dts/rockchip/rk3562-dictpen-test3-v20.dts index f2198a8b3e8d..c75f6293a1f4 100644 --- a/arch/arm64/boot/dts/rockchip/rk3562-dictpen-test3-v20.dts +++ b/arch/arm64/boot/dts/rockchip/rk3562-dictpen-test3-v20.dts @@ -167,6 +167,8 @@ }; &cpu0_opp_table { + rockchip,low-temp-min-volt = <1000000>; + opp-408000000 { /delete-property/ opp-suspend; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3562.dtsi b/arch/arm64/boot/dts/rockchip/rk3562.dtsi index 7c15aba1fd87..7ccf7e2f2ec7 100644 --- a/arch/arm64/boot/dts/rockchip/rk3562.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3562.dtsi @@ -273,7 +273,7 @@ rockchip,grf = <&sys_grf>; rockchip,temp-hysteresis = <5000>; rockchip,low-temp = <10000>; - rockchip,low-temp-min-volt = <925000>; + rockchip,low-temp-min-volt = <1050000>; opp-408000000 { opp-hz = /bits/ 64 <408000000>; @@ -501,7 +501,7 @@ rockchip,temp-hysteresis = <5000>; rockchip,low-temp = <10000>; - rockchip,low-temp-min-volt = <900000>; + rockchip,low-temp-min-volt = <950000>; rockchip,leakage-voltage-sel = < 1 15 0 From 801e11b222f961e397abac55c37e3222e442fcdd Mon Sep 17 00:00:00 2001 From: Liang Chen Date: Wed, 3 Jan 2024 09:22:01 +0800 Subject: [PATCH 2/4] arm64: dts: rockchip: rk3562: adjust regulator-init-microvolt of vdd_cpu/vdd_logic for rk3562 boards Raise initial voltage of vdd_cpu/vdd_logic when startup to improve stability. Signed-off-by: Liang Chen Change-Id: I223a21351424cb3fb47e5b3cae4f8e0324bd9a25 --- arch/arm64/boot/dts/rockchip/rk3562-dictpen-test3-v20.dts | 4 ++-- arch/arm64/boot/dts/rockchip/rk3562-rk809.dtsi | 4 ++-- arch/arm64/boot/dts/rockchip/rk3562-rk817-tablet-v10.dts | 4 ++-- arch/arm64/boot/dts/rockchip/rk3562-rk817.dtsi | 4 ++-- arch/arm64/boot/dts/rockchip/rk3562j-core-ddr4-v10.dts | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/arch/arm64/boot/dts/rockchip/rk3562-dictpen-test3-v20.dts b/arch/arm64/boot/dts/rockchip/rk3562-dictpen-test3-v20.dts index c75f6293a1f4..0123146714bb 100644 --- a/arch/arm64/boot/dts/rockchip/rk3562-dictpen-test3-v20.dts +++ b/arch/arm64/boot/dts/rockchip/rk3562-dictpen-test3-v20.dts @@ -682,7 +682,7 @@ regulator-boot-on; regulator-min-microvolt = <800000>; regulator-max-microvolt = <1350000>; - regulator-init-microvolt = <900000>; + regulator-init-microvolt = <950000>; regulator-ramp-delay = <6001>; regulator-initial-mode = <0x2>; regulator-name = "vdd_logic"; @@ -697,7 +697,7 @@ regulator-boot-on; regulator-min-microvolt = <825000>; regulator-max-microvolt = <1350000>; - regulator-init-microvolt = <900000>; + regulator-init-microvolt = <1000000>; regulator-ramp-delay = <6001>; regulator-initial-mode = <0x2>; regulator-name = "vdd_cpu"; diff --git a/arch/arm64/boot/dts/rockchip/rk3562-rk809.dtsi b/arch/arm64/boot/dts/rockchip/rk3562-rk809.dtsi index 02f91919b705..1bf64d327fdd 100644 --- a/arch/arm64/boot/dts/rockchip/rk3562-rk809.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3562-rk809.dtsi @@ -76,7 +76,7 @@ regulator-boot-on; regulator-min-microvolt = <500000>; regulator-max-microvolt = <1350000>; - regulator-init-microvolt = <900000>; + regulator-init-microvolt = <950000>; regulator-ramp-delay = <6001>; regulator-initial-mode = <0x2>; regulator-name = "vdd_logic"; @@ -90,7 +90,7 @@ regulator-boot-on; regulator-min-microvolt = <500000>; regulator-max-microvolt = <1350000>; - regulator-init-microvolt = <900000>; + regulator-init-microvolt = <1050000>; regulator-ramp-delay = <6001>; regulator-initial-mode = <0x2>; regulator-name = "vdd_cpu"; diff --git a/arch/arm64/boot/dts/rockchip/rk3562-rk817-tablet-v10.dts b/arch/arm64/boot/dts/rockchip/rk3562-rk817-tablet-v10.dts index 4f9edc072df7..5dd4cc96f112 100644 --- a/arch/arm64/boot/dts/rockchip/rk3562-rk817-tablet-v10.dts +++ b/arch/arm64/boot/dts/rockchip/rk3562-rk817-tablet-v10.dts @@ -601,7 +601,7 @@ regulator-boot-on; regulator-min-microvolt = <500000>; regulator-max-microvolt = <1350000>; - regulator-init-microvolt = <900000>; + regulator-init-microvolt = <950000>; regulator-ramp-delay = <6001>; regulator-initial-mode = <0x2>; regulator-name = "vdd_logic"; @@ -616,7 +616,7 @@ regulator-boot-on; regulator-min-microvolt = <500000>; regulator-max-microvolt = <1350000>; - regulator-init-microvolt = <900000>; + regulator-init-microvolt = <1050000>; regulator-ramp-delay = <6001>; regulator-initial-mode = <0x2>; regulator-name = "vdd_cpu"; diff --git a/arch/arm64/boot/dts/rockchip/rk3562-rk817.dtsi b/arch/arm64/boot/dts/rockchip/rk3562-rk817.dtsi index 8bfd2466c232..25c8c62e077e 100644 --- a/arch/arm64/boot/dts/rockchip/rk3562-rk817.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3562-rk817.dtsi @@ -72,7 +72,7 @@ regulator-boot-on; regulator-min-microvolt = <500000>; regulator-max-microvolt = <1350000>; - regulator-init-microvolt = <900000>; + regulator-init-microvolt = <950000>; regulator-ramp-delay = <6001>; regulator-initial-mode = <0x2>; regulator-name = "vdd_logic"; @@ -87,7 +87,7 @@ regulator-boot-on; regulator-min-microvolt = <500000>; regulator-max-microvolt = <1350000>; - regulator-init-microvolt = <900000>; + regulator-init-microvolt = <1050000>; regulator-ramp-delay = <6001>; regulator-initial-mode = <0x2>; regulator-name = "vdd_cpu"; diff --git a/arch/arm64/boot/dts/rockchip/rk3562j-core-ddr4-v10.dts b/arch/arm64/boot/dts/rockchip/rk3562j-core-ddr4-v10.dts index bdd68af31952..c98056c4517f 100644 --- a/arch/arm64/boot/dts/rockchip/rk3562j-core-ddr4-v10.dts +++ b/arch/arm64/boot/dts/rockchip/rk3562j-core-ddr4-v10.dts @@ -180,7 +180,7 @@ regulator-boot-on; regulator-min-microvolt = <500000>; regulator-max-microvolt = <1350000>; - regulator-init-microvolt = <900000>; + regulator-init-microvolt = <950000>; regulator-ramp-delay = <6001>; regulator-initial-mode = <0x2>; regulator-name = "vdd_logic"; @@ -194,7 +194,7 @@ regulator-boot-on; regulator-min-microvolt = <500000>; regulator-max-microvolt = <1350000>; - regulator-init-microvolt = <900000>; + regulator-init-microvolt = <1050000>; regulator-ramp-delay = <6001>; regulator-initial-mode = <0x2>; regulator-name = "vdd_cpu"; From eaa1941ab724b04cdd577b429d64ec6ffe762229 Mon Sep 17 00:00:00 2001 From: Zhang Yubing Date: Wed, 6 Dec 2023 11:17:27 +0800 Subject: [PATCH 3/4] mfd: rkx110_x120: cru: fix to get a avialble pll rate In some case, the pll rate will be change to get a target rate for it's child. we want set the pll rate closest to the max pll rate. However, It's not all the rate can get a set of legal paramters to config the pll. So when this case happen, we try a lower rate as the target pll rate. Change-Id: I45abec2114f74634904cf3c34655d8df331d171b Signed-off-by: Zhang Yubing --- drivers/mfd/rkx110_x120/hal/cru_rkx110.c | 22 ++++++++++++++++------ drivers/mfd/rkx110_x120/hal/cru_rkx111.c | 22 ++++++++++++++++------ drivers/mfd/rkx110_x120/hal/cru_rkx120.c | 22 ++++++++++++++++------ drivers/mfd/rkx110_x120/hal/cru_rkx121.c | 22 ++++++++++++++++------ 4 files changed, 64 insertions(+), 24 deletions(-) diff --git a/drivers/mfd/rkx110_x120/hal/cru_rkx110.c b/drivers/mfd/rkx110_x120/hal/cru_rkx110.c index 5d53ec33dd60..4e1533fe1b31 100644 --- a/drivers/mfd/rkx110_x120/hal/cru_rkx110.c +++ b/drivers/mfd/rkx110_x120/hal/cru_rkx110.c @@ -263,6 +263,7 @@ static HAL_Status RKX11x_HAL_CRU_ClkSetFreq(struct hwclk *hw, uint32_t clockName uint32_t pll; uint8_t overMax = 0; HAL_Status ret = HAL_OK; + int i; if (clockName == RKX110_CLK_D_DSI_0_PATTERN_GEN || clockName == RKX110_CLK_D_DSI_1_PATTERN_GEN) { @@ -326,12 +327,21 @@ static HAL_Status RKX11x_HAL_CRU_ClkSetFreq(struct hwclk *hw, uint32_t clockName /* PLL change closest new rate <= 1200M if need */ if (!pRate) { - pRate = (_MHZ(1200) / rate) * rate; - } - - ret = RKX11x_HAL_CRU_ClkSetFreq(hw, pll, pRate); - if (ret != HAL_OK) { - return ret; + if (!rate || rate > _MHZ(1200)) + return HAL_ERROR; + for (i = _MHZ(1200) / rate; i > _MHZ(24) / rate; i--) { + pRate = i * rate; + ret = RKX11x_HAL_CRU_ClkSetFreq(hw, pll, pRate); + if (ret == HAL_OK) + break; + } + if (ret != HAL_OK) + return ret; + } else { + ret = RKX11x_HAL_CRU_ClkSetFreq(hw, pll, pRate); + if (ret != HAL_OK) { + return ret; + } } /* if success, continue to set divider */ diff --git a/drivers/mfd/rkx110_x120/hal/cru_rkx111.c b/drivers/mfd/rkx110_x120/hal/cru_rkx111.c index 41da74fb027b..1f22f406ffce 100644 --- a/drivers/mfd/rkx110_x120/hal/cru_rkx111.c +++ b/drivers/mfd/rkx110_x120/hal/cru_rkx111.c @@ -304,6 +304,7 @@ static HAL_Status RKX11x_HAL_CRU_ClkSetFreq(struct hwclk *hw, uint32_t clockName uint32_t pll; uint8_t overMax = 0; HAL_Status ret = HAL_OK; + int i; if (clockName == RKX110_CLK_D_DSI_0_PATTERN_GEN) { clockName = RKX111_CPS_DCLK_D_DSI_0_REC; @@ -371,12 +372,21 @@ static HAL_Status RKX11x_HAL_CRU_ClkSetFreq(struct hwclk *hw, uint32_t clockName /* PLL change closest new rate <= 1200M if need */ if (!pRate) { - pRate = (_MHZ(1200) / rate) * rate; - } - - ret = RKX11x_HAL_CRU_ClkSetFreq(hw, pll, pRate); - if (ret != HAL_OK) { - return ret; + if (!rate || rate > _MHZ(1200)) + return HAL_ERROR; + for (i = _MHZ(1200) / rate; i > _MHZ(24) / rate; i--) { + pRate = i * rate; + ret = RKX11x_HAL_CRU_ClkSetFreq(hw, pll, pRate); + if (ret == HAL_OK) + break; + } + if (ret != HAL_OK) + return ret; + } else { + ret = RKX11x_HAL_CRU_ClkSetFreq(hw, pll, pRate); + if (ret != HAL_OK) { + return ret; + } } /* if success, continue to set divider */ diff --git a/drivers/mfd/rkx110_x120/hal/cru_rkx120.c b/drivers/mfd/rkx110_x120/hal/cru_rkx120.c index 07da30ba0fd4..025a913626f8 100644 --- a/drivers/mfd/rkx110_x120/hal/cru_rkx120.c +++ b/drivers/mfd/rkx110_x120/hal/cru_rkx120.c @@ -252,6 +252,7 @@ static HAL_Status RKX12x_HAL_CRU_ClkSetFreq(struct hwclk *hw, uint32_t clockName uint32_t pll; uint8_t overMax; HAL_Status ret = HAL_OK; + int i; switch (clockName) { case RKX120_CPS_PLL_TXPLL: @@ -298,12 +299,21 @@ static HAL_Status RKX12x_HAL_CRU_ClkSetFreq(struct hwclk *hw, uint32_t clockName /* PLL change closest new rate <= 1200M if need */ if (!pRate) { - pRate = (_MHZ(1200) / rate) * rate; - } - - ret = RKX12x_HAL_CRU_ClkSetFreq(hw, pll, pRate); - if (ret != HAL_OK) { - return ret; + if (!rate || rate > _MHZ(1200)) + return HAL_ERROR; + for (i = _MHZ(1200) / rate; i > _MHZ(24) / rate; i--) { + pRate = i * rate; + ret = RKX12x_HAL_CRU_ClkSetFreq(hw, pll, pRate); + if (ret == HAL_OK) + break; + } + if (ret != HAL_OK) + return ret; + } else { + ret = RKX12x_HAL_CRU_ClkSetFreq(hw, pll, pRate); + if (ret != HAL_OK) { + return ret; + } } /* if success, continue to set divider */ diff --git a/drivers/mfd/rkx110_x120/hal/cru_rkx121.c b/drivers/mfd/rkx110_x120/hal/cru_rkx121.c index 350ce6c47f48..dfa1c62a30bd 100644 --- a/drivers/mfd/rkx110_x120/hal/cru_rkx121.c +++ b/drivers/mfd/rkx110_x120/hal/cru_rkx121.c @@ -263,6 +263,7 @@ static HAL_Status RKX12x_HAL_CRU_ClkSetFreq(struct hwclk *hw, uint32_t clockName uint32_t pll; uint8_t overMax; HAL_Status ret = HAL_OK; + int i; switch (clockName) { case RKX120_CPS_PLL_TXPLL: @@ -309,12 +310,21 @@ static HAL_Status RKX12x_HAL_CRU_ClkSetFreq(struct hwclk *hw, uint32_t clockName /* PLL change closest new rate <= 1200M if need */ if (!pRate) { - pRate = (_MHZ(1200) / rate) * rate; - } - - ret = RKX12x_HAL_CRU_ClkSetFreq(hw, pll, pRate); - if (ret != HAL_OK) { - return ret; + if (!rate || rate > _MHZ(1200)) + return HAL_ERROR; + for (i = _MHZ(1200) / rate; i > _MHZ(24) / rate; i--) { + pRate = i * rate; + ret = RKX12x_HAL_CRU_ClkSetFreq(hw, pll, pRate); + if (ret == HAL_OK) + break; + } + if (ret != HAL_OK) + return ret; + } else { + ret = RKX12x_HAL_CRU_ClkSetFreq(hw, pll, pRate); + if (ret != HAL_OK) { + return ret; + } } /* if success, continue to set divider */ From 08c66b08ce17798f3bbdcdee5b247628817f91d3 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Wed, 3 Jan 2024 12:01:02 +0800 Subject: [PATCH 4/4] media: rockchip: isp: sync irq_ends irqs in different cpu will change irq_ends flag, lock to sync. Change-Id: Ie5467825173a16c796c7ab84c15286af44edc5d9 Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/rkisp.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index c9ffd1ed9094..c3eda3fa3fec 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -1072,8 +1072,10 @@ static void rkisp_rdbk_work(struct work_struct *work) void rkisp_check_idle(struct rkisp_device *dev, u32 irq) { + unsigned long lock_flags = 0; u32 val = 0; + spin_lock_irqsave(&dev->hw_dev->rdbk_lock, lock_flags); dev->irq_ends |= (irq & dev->irq_ends_mask); v4l2_dbg(3, rkisp_debug, &dev->v4l2_dev, "%s irq:0x%x ends:0x%x mask:0x%x\n", @@ -1085,8 +1087,11 @@ void rkisp_check_idle(struct rkisp_device *dev, u32 irq) complete(&dev->hw_dev->monitor.cmpl); } if ((dev->irq_ends & dev->irq_ends_mask) != dev->irq_ends_mask || - !IS_HDR_RDBK(dev->rd_mode)) + !IS_HDR_RDBK(dev->rd_mode)) { + spin_unlock_irqrestore(&dev->hw_dev->rdbk_lock, lock_flags); return; + } + spin_unlock_irqrestore(&dev->hw_dev->rdbk_lock, lock_flags); if (dev->sw_rd_cnt) goto end;