summaryrefslogtreecommitdiff
path: root/drivers/clk/rockchip/clk-pll.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/clk/rockchip/clk-pll.c')
-rw-r--r--drivers/clk/rockchip/clk-pll.c37
1 files changed, 34 insertions, 3 deletions
diff --git a/drivers/clk/rockchip/clk-pll.c b/drivers/clk/rockchip/clk-pll.c
index 2426582ad23a..0a9f31f2dd27 100644
--- a/drivers/clk/rockchip/clk-pll.c
+++ b/drivers/clk/rockchip/clk-pll.c
@@ -57,6 +57,8 @@ struct rockchip_clk_pll {
struct rockchip_clk_provider *ctx;
bool boost_enabled;
+ u32 boost_backup_pll_usage;
+ unsigned long boost_backup_pll_rate;
unsigned long boost_low_rate;
unsigned long boost_high_rate;
struct regmap *boost;
@@ -1581,10 +1583,12 @@ void rockchip_boost_init(struct clk_hw *hw)
BOOST_BACKUP_PLL_SHIFT));
}
if (!of_property_read_u32(np, "rockchip,boost-backup-pll-usage",
- &value)) {
- pr_debug("boost-backup-pll-usage=0x%x\n", value);
+ &pll->boost_backup_pll_usage)) {
+ pr_debug("boost-backup-pll-usage=0x%x\n",
+ pll->boost_backup_pll_usage);
regmap_write(pll->boost, BOOST_CLK_CON,
- HIWORD_UPDATE(value, BOOST_BACKUP_PLL_USAGE_MASK,
+ HIWORD_UPDATE(pll->boost_backup_pll_usage,
+ BOOST_BACKUP_PLL_USAGE_MASK,
BOOST_BACKUP_PLL_USAGE_SHIFT));
}
if (!of_property_read_u32(np, "rockchip,boost-switch-threshold",
@@ -1674,6 +1678,33 @@ void rockchip_boost_disable_recovery_sw(struct clk_hw *hw)
BOOST_SW_CTRL_SHIFT));
}
+void rockchip_boost_add_core_div(struct clk_hw *hw, unsigned long prate)
+{
+ struct rockchip_clk_pll *pll;
+ unsigned int div;
+
+ if (!hw)
+ return;
+ pll = to_rockchip_clk_pll(hw);
+ if (!pll->boost_enabled || pll->boost_backup_pll_rate == prate)
+ return;
+
+ /* todo */
+ if (pll->boost_backup_pll_usage == BOOST_BACKUP_PLL_USAGE_TARGET)
+ return;
+ /*
+ * cpu clock rate should be less than or equal to
+ * low rate when change pll rate in boost module
+ */
+ if (pll->boost_low_rate && prate > pll->boost_low_rate) {
+ div = DIV_ROUND_UP(prate, pll->boost_low_rate) - 1;
+ regmap_write(pll->boost, BOOST_CLK_CON,
+ HIWORD_UPDATE(div, BOOST_CORE_DIV_MASK,
+ BOOST_CORE_DIV_SHIFT));
+ pll->boost_backup_pll_rate = prate;
+ }
+}
+
#ifdef CONFIG_DEBUG_FS
#include <linux/debugfs.h>