mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
clk: rockchip: optimize static memory consume
Before:
text data bss dec hex filename
5661 24 16 5701 1645 clk.o
10990 0 36 11026 2b12 clk-pll.o
2288 0 0 2288 8f0 clk-cpu.o
1856 0 0 1856 740 clk-half-divider.o
607 0 0 607 25f clk-inverter.o
872 0 0 872 368 clk-mmc-phase.o
580 0 0 580 244 clk-muxgrf.o
1524 0 12 1536 600 clk-ddr.o
1322 0 0 1322 52a clk-dclk-divider.o
2368 160 0 2528 9e0 clk-pvtm.o
After:
text data bss dec hex filename
5461 24 16 5501 157d clk.o
4864 0 36 4900 1324 clk-pll.o
2164 0 0 2164 874 clk-cpu.o
1856 0 0 1856 740 clk-half-divider.o
872 0 0 872 368 clk-mmc-phase.o
580 0 0 580 244 clk-muxgrf.o
908 0 8 916 394 clk-ddr.o
660 0 0 660 294 softrst.o
Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
Change-Id: I469229b9566af1cab6cc3a6bb9f4f8e308e0eded
This commit is contained in:
@@ -148,6 +148,61 @@ config ROCKCHIP_CLK_LINK
|
|||||||
help
|
help
|
||||||
Say y here to enable clock link for Rockchip.
|
Say y here to enable clock link for Rockchip.
|
||||||
|
|
||||||
|
config ROCKCHIP_CLK_BOOST
|
||||||
|
bool "Rockchip Clk Boost"
|
||||||
|
default y if CPU_PX30
|
||||||
|
help
|
||||||
|
Say y here to enable clk boost.
|
||||||
|
|
||||||
|
config ROCKCHIP_CLK_INV
|
||||||
|
bool "Rockchip Clk Inverter"
|
||||||
|
default y if !CPU_RV1126 && !CPU_RV1106
|
||||||
|
help
|
||||||
|
Say y here to enable clk Inverter.
|
||||||
|
|
||||||
|
config ROCKCHIP_CLK_PVTM
|
||||||
|
bool "Rockchip Clk Pvtm"
|
||||||
|
default y if !CPU_RV1126 && !CPU_RV1106
|
||||||
|
help
|
||||||
|
Say y here to enable clk pvtm.
|
||||||
|
|
||||||
|
config ROCKCHIP_DCLK_DIV
|
||||||
|
bool "Rockchip Dclk Divider"
|
||||||
|
default y if !CPU_RV1126 && !CPU_RV1106
|
||||||
|
help
|
||||||
|
Say y here to enable dclk divider.
|
||||||
|
|
||||||
|
config ROCKCHIP_DDRCLK_SCPI
|
||||||
|
bool "Rockchip DDR Clk SCPI"
|
||||||
|
default y if RK3368_SCPI_PROTOCOL
|
||||||
|
help
|
||||||
|
Say y here to enable ddr clk scpi.
|
||||||
|
|
||||||
|
config ROCKCHIP_DDRCLK_SIP
|
||||||
|
bool "Rockchip DDR Clk SIP"
|
||||||
|
default y if CPU_RK3399
|
||||||
|
help
|
||||||
|
Say y here to enable ddr clk sip.
|
||||||
|
|
||||||
|
config ROCKCHIP_PLL_RK3066
|
||||||
|
bool "Rockchip PLL Type RK3066"
|
||||||
|
default y if CPU_RK30XX || CPU_RK3188 || \
|
||||||
|
CPU_RK3288 || CPU_RK3368
|
||||||
|
help
|
||||||
|
Say y here to enable pll type is rk3066.
|
||||||
|
|
||||||
|
config ROCKCHIP_PLL_RK3399
|
||||||
|
bool "Rockchip PLL Type RK3399"
|
||||||
|
default y if CPU_RK3399 || CPU_RV1108
|
||||||
|
help
|
||||||
|
Say y here to enable pll type is rk3399.
|
||||||
|
|
||||||
|
config ROCKCHIP_PLL_RK3588
|
||||||
|
bool "Rockchip PLL Type RK3588"
|
||||||
|
default y if CPU_RK3588
|
||||||
|
help
|
||||||
|
Say y here to enable pll type is rk3588.
|
||||||
|
|
||||||
source "drivers/clk/rockchip/regmap/Kconfig"
|
source "drivers/clk/rockchip/regmap/Kconfig"
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -10,12 +10,12 @@ clk-rockchip-y += clk.o
|
|||||||
clk-rockchip-y += clk-pll.o
|
clk-rockchip-y += clk-pll.o
|
||||||
clk-rockchip-y += clk-cpu.o
|
clk-rockchip-y += clk-cpu.o
|
||||||
clk-rockchip-y += clk-half-divider.o
|
clk-rockchip-y += clk-half-divider.o
|
||||||
clk-rockchip-y += clk-inverter.o
|
|
||||||
clk-rockchip-y += clk-mmc-phase.o
|
clk-rockchip-y += clk-mmc-phase.o
|
||||||
clk-rockchip-y += clk-muxgrf.o
|
clk-rockchip-y += clk-muxgrf.o
|
||||||
clk-rockchip-y += clk-ddr.o
|
clk-rockchip-y += clk-ddr.o
|
||||||
clk-rockchip-y += clk-dclk-divider.o
|
clk-rockchip-$(CONFIG_ROCKCHIP_CLK_INV) += clk-inverter.o
|
||||||
clk-rockchip-y += clk-pvtm.o
|
clk-rockchip-$(CONFIG_ROCKCHIP_CLK_PVTM) += clk-pvtm.o
|
||||||
|
clk-rockchip-$(CONFIG_ROCKCHIP_DCLK_DIV) += clk-dclk-divider.o
|
||||||
clk-rockchip-$(CONFIG_RESET_CONTROLLER) += softrst.o
|
clk-rockchip-$(CONFIG_RESET_CONTROLLER) += softrst.o
|
||||||
|
|
||||||
obj-$(CONFIG_ROCKCHIP_CLK_LINK) += clk-link.o
|
obj-$(CONFIG_ROCKCHIP_CLK_LINK) += clk-link.o
|
||||||
|
|||||||
@@ -171,7 +171,8 @@ static int rockchip_cpuclk_pre_rate_change(struct rockchip_cpuclk *cpuclk,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rockchip_boost_enable_recovery_sw_low(cpuclk->pll_hw);
|
if (IS_ENABLED(CONFIG_ROCKCHIP_CLK_BOOST))
|
||||||
|
rockchip_boost_enable_recovery_sw_low(cpuclk->pll_hw);
|
||||||
|
|
||||||
alt_prate = clk_get_rate(cpuclk->alt_parent);
|
alt_prate = clk_get_rate(cpuclk->alt_parent);
|
||||||
|
|
||||||
@@ -209,7 +210,8 @@ static int rockchip_cpuclk_pre_rate_change(struct rockchip_cpuclk *cpuclk,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rockchip_boost_add_core_div(cpuclk->pll_hw, alt_prate);
|
if (IS_ENABLED(CONFIG_ROCKCHIP_CLK_BOOST))
|
||||||
|
rockchip_boost_add_core_div(cpuclk->pll_hw, alt_prate);
|
||||||
|
|
||||||
rockchip_cpuclk_set_pre_muxs(cpuclk, rate);
|
rockchip_cpuclk_set_pre_muxs(cpuclk, rate);
|
||||||
|
|
||||||
@@ -279,7 +281,8 @@ static int rockchip_cpuclk_post_rate_change(struct rockchip_cpuclk *cpuclk,
|
|||||||
if (ndata->old_rate > ndata->new_rate)
|
if (ndata->old_rate > ndata->new_rate)
|
||||||
rockchip_cpuclk_set_dividers(cpuclk, rate);
|
rockchip_cpuclk_set_dividers(cpuclk, rate);
|
||||||
|
|
||||||
rockchip_boost_disable_recovery_sw(cpuclk->pll_hw);
|
if (IS_ENABLED(CONFIG_ROCKCHIP_CLK_BOOST))
|
||||||
|
rockchip_boost_disable_recovery_sw(cpuclk->pll_hw);
|
||||||
|
|
||||||
spin_unlock_irqrestore(cpuclk->lock, flags);
|
spin_unlock_irqrestore(cpuclk->lock, flags);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -354,7 +357,7 @@ struct clk *rockchip_clk_register_cpuclk(const char *name,
|
|||||||
cpuclk->reg_data = reg_data;
|
cpuclk->reg_data = reg_data;
|
||||||
cpuclk->clk_nb.notifier_call = rockchip_cpuclk_notifier_cb;
|
cpuclk->clk_nb.notifier_call = rockchip_cpuclk_notifier_cb;
|
||||||
cpuclk->hw.init = &init;
|
cpuclk->hw.init = &init;
|
||||||
if (reg_data->pll_name) {
|
if (IS_ENABLED(CONFIG_ROCKCHIP_CLK_BOOST) && reg_data->pll_name) {
|
||||||
pll_clk = clk_get_parent(parent);
|
pll_clk = clk_get_parent(parent);
|
||||||
if (!pll_clk) {
|
if (!pll_clk) {
|
||||||
pr_err("%s: could not lookup pll clock: (%s)\n",
|
pr_err("%s: could not lookup pll clock: (%s)\n",
|
||||||
|
|||||||
@@ -259,12 +259,16 @@ struct clk *rockchip_clk_register_ddrclk(const char *name, int flags,
|
|||||||
init.flags |= CLK_SET_RATE_NO_REPARENT;
|
init.flags |= CLK_SET_RATE_NO_REPARENT;
|
||||||
|
|
||||||
switch (ddr_flag) {
|
switch (ddr_flag) {
|
||||||
|
#ifdef CONFIG_ROCKCHIP_DDRCLK_SIP
|
||||||
case ROCKCHIP_DDRCLK_SIP:
|
case ROCKCHIP_DDRCLK_SIP:
|
||||||
init.ops = &rockchip_ddrclk_sip_ops;
|
init.ops = &rockchip_ddrclk_sip_ops;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_ROCKCHIP_DDRCLK_SCPI
|
||||||
case ROCKCHIP_DDRCLK_SCPI:
|
case ROCKCHIP_DDRCLK_SCPI:
|
||||||
init.ops = &rockchip_ddrclk_scpi_ops;
|
init.ops = &rockchip_ddrclk_scpi_ops;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
case ROCKCHIP_DDRCLK_SIP_V2:
|
case ROCKCHIP_DDRCLK_SIP_V2:
|
||||||
init.ops = &rockchip_ddrclk_sip_ops_v2;
|
init.ops = &rockchip_ddrclk_sip_ops_v2;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -47,12 +47,14 @@ struct rockchip_clk_pll {
|
|||||||
|
|
||||||
struct rockchip_clk_provider *ctx;
|
struct rockchip_clk_provider *ctx;
|
||||||
|
|
||||||
|
#ifdef CONFIG_ROCKCHIP_CLK_BOOST
|
||||||
bool boost_enabled;
|
bool boost_enabled;
|
||||||
u32 boost_backup_pll_usage;
|
u32 boost_backup_pll_usage;
|
||||||
unsigned long boost_backup_pll_rate;
|
unsigned long boost_backup_pll_rate;
|
||||||
unsigned long boost_low_rate;
|
unsigned long boost_low_rate;
|
||||||
unsigned long boost_high_rate;
|
unsigned long boost_high_rate;
|
||||||
struct regmap *boost;
|
struct regmap *boost;
|
||||||
|
#endif
|
||||||
#ifdef CONFIG_DEBUG_FS
|
#ifdef CONFIG_DEBUG_FS
|
||||||
struct hlist_node debug_node;
|
struct hlist_node debug_node;
|
||||||
#endif
|
#endif
|
||||||
@@ -62,7 +64,15 @@ struct rockchip_clk_pll {
|
|||||||
#define to_rockchip_clk_pll_nb(nb) \
|
#define to_rockchip_clk_pll_nb(nb) \
|
||||||
container_of(nb, struct rockchip_clk_pll, clk_nb)
|
container_of(nb, struct rockchip_clk_pll, clk_nb)
|
||||||
|
|
||||||
|
#ifdef CONFIG_ROCKCHIP_CLK_BOOST
|
||||||
static void rockchip_boost_disable_low(struct rockchip_clk_pll *pll);
|
static void rockchip_boost_disable_low(struct rockchip_clk_pll *pll);
|
||||||
|
#ifdef CONFIG_DEBUG_FS
|
||||||
|
static HLIST_HEAD(clk_boost_list);
|
||||||
|
static DEFINE_MUTEX(clk_boost_lock);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
static inline void rockchip_boost_disable_low(struct rockchip_clk_pll *pll) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
#define MHZ (1000UL * 1000UL)
|
#define MHZ (1000UL * 1000UL)
|
||||||
#define KHZ (1000UL)
|
#define KHZ (1000UL)
|
||||||
@@ -86,10 +96,6 @@ static void rockchip_boost_disable_low(struct rockchip_clk_pll *pll);
|
|||||||
#define MAX_FOUTVCO_FREQ (2000 * MHZ)
|
#define MAX_FOUTVCO_FREQ (2000 * MHZ)
|
||||||
|
|
||||||
static struct rockchip_pll_rate_table auto_table;
|
static struct rockchip_pll_rate_table auto_table;
|
||||||
#ifdef CONFIG_DEBUG_FS
|
|
||||||
static HLIST_HEAD(clk_boost_list);
|
|
||||||
static DEFINE_MUTEX(clk_boost_lock);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int rockchip_pll_clk_adaptive_scaling(struct clk *clk, int sel)
|
int rockchip_pll_clk_adaptive_scaling(struct clk *clk, int sel)
|
||||||
{
|
{
|
||||||
@@ -477,7 +483,7 @@ static int rockchip_rk3036_pll_wait_lock(struct rockchip_clk_pll *pll)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned long
|
static unsigned long __maybe_unused
|
||||||
rockchip_rk3036_pll_con_to_rate(struct rockchip_clk_pll *pll,
|
rockchip_rk3036_pll_con_to_rate(struct rockchip_clk_pll *pll,
|
||||||
u32 con0, u32 con1)
|
u32 con0, u32 con1)
|
||||||
{
|
{
|
||||||
@@ -599,7 +605,8 @@ static int rockchip_rk3036_pll_set_params(struct rockchip_clk_pll *pll,
|
|||||||
pllcon |= rate->frac << RK3036_PLLCON2_FRAC_SHIFT;
|
pllcon |= rate->frac << RK3036_PLLCON2_FRAC_SHIFT;
|
||||||
writel_relaxed(pllcon, pll->reg_base + RK3036_PLLCON(2));
|
writel_relaxed(pllcon, pll->reg_base + RK3036_PLLCON(2));
|
||||||
|
|
||||||
rockchip_boost_disable_low(pll);
|
if (IS_ENABLED(CONFIG_ROCKCHIP_CLK_BOOST))
|
||||||
|
rockchip_boost_disable_low(pll);
|
||||||
|
|
||||||
/* wait for the pll to lock */
|
/* wait for the pll to lock */
|
||||||
ret = rockchip_rk3036_pll_wait_lock(pll);
|
ret = rockchip_rk3036_pll_wait_lock(pll);
|
||||||
@@ -1656,18 +1663,23 @@ struct clk *rockchip_clk_register_pll(struct rockchip_clk_provider *ctx,
|
|||||||
else
|
else
|
||||||
init.ops = &rockchip_rk3036_pll_clk_ops;
|
init.ops = &rockchip_rk3036_pll_clk_ops;
|
||||||
break;
|
break;
|
||||||
|
#ifdef CONFIG_ROCKCHIP_PLL_RK3066
|
||||||
case pll_rk3066:
|
case pll_rk3066:
|
||||||
if (!pll->rate_table || IS_ERR(ctx->grf))
|
if (!pll->rate_table || IS_ERR(ctx->grf))
|
||||||
init.ops = &rockchip_rk3066_pll_clk_norate_ops;
|
init.ops = &rockchip_rk3066_pll_clk_norate_ops;
|
||||||
else
|
else
|
||||||
init.ops = &rockchip_rk3066_pll_clk_ops;
|
init.ops = &rockchip_rk3066_pll_clk_ops;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_ROCKCHIP_PLL_RK3399
|
||||||
case pll_rk3399:
|
case pll_rk3399:
|
||||||
if (!pll->rate_table)
|
if (!pll->rate_table)
|
||||||
init.ops = &rockchip_rk3399_pll_clk_norate_ops;
|
init.ops = &rockchip_rk3399_pll_clk_norate_ops;
|
||||||
else
|
else
|
||||||
init.ops = &rockchip_rk3399_pll_clk_ops;
|
init.ops = &rockchip_rk3399_pll_clk_ops;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_ROCKCHIP_PLL_RK3588
|
||||||
case pll_rk3588:
|
case pll_rk3588:
|
||||||
case pll_rk3588_core:
|
case pll_rk3588_core:
|
||||||
if (!pll->rate_table)
|
if (!pll->rate_table)
|
||||||
@@ -1676,6 +1688,7 @@ struct clk *rockchip_clk_register_pll(struct rockchip_clk_provider *ctx,
|
|||||||
init.ops = &rockchip_rk3588_pll_clk_ops;
|
init.ops = &rockchip_rk3588_pll_clk_ops;
|
||||||
init.flags = flags;
|
init.flags = flags;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
pr_warn("%s: Unknown pll type for pll clk %s\n",
|
pr_warn("%s: Unknown pll type for pll clk %s\n",
|
||||||
__func__, name);
|
__func__, name);
|
||||||
@@ -1707,6 +1720,7 @@ err_mux:
|
|||||||
return mux_clk;
|
return mux_clk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_ROCKCHIP_CLK_BOOST
|
||||||
static unsigned long rockchip_pll_con_to_rate(struct rockchip_clk_pll *pll,
|
static unsigned long rockchip_pll_con_to_rate(struct rockchip_clk_pll *pll,
|
||||||
u32 con0, u32 con1)
|
u32 con0, u32 con1)
|
||||||
{
|
{
|
||||||
@@ -2019,3 +2033,4 @@ static int __init boost_debug_init(void)
|
|||||||
late_initcall(boost_debug_init);
|
late_initcall(boost_debug_init);
|
||||||
#endif /* MODULE */
|
#endif /* MODULE */
|
||||||
#endif /* CONFIG_DEBUG_FS */
|
#endif /* CONFIG_DEBUG_FS */
|
||||||
|
#endif /* CONFIG_ROCKCHIP_CLK_BOOST */
|
||||||
|
|||||||
@@ -654,11 +654,13 @@ void rockchip_clk_register_branches(struct rockchip_clk_provider *ctx,
|
|||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case branch_inverter:
|
case branch_inverter:
|
||||||
|
#ifdef CONFIG_ROCKCHIP_CLK_INV
|
||||||
clk = rockchip_clk_register_inverter(
|
clk = rockchip_clk_register_inverter(
|
||||||
list->name, list->parent_names,
|
list->name, list->parent_names,
|
||||||
list->num_parents,
|
list->num_parents,
|
||||||
ctx->reg_base + list->muxdiv_offset,
|
ctx->reg_base + list->muxdiv_offset,
|
||||||
list->div_shift, list->div_flags, &ctx->lock);
|
list->div_shift, list->div_flags, &ctx->lock);
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case branch_factor:
|
case branch_factor:
|
||||||
clk = rockchip_clk_register_factor_branch(
|
clk = rockchip_clk_register_factor_branch(
|
||||||
@@ -678,6 +680,7 @@ void rockchip_clk_register_branches(struct rockchip_clk_provider *ctx,
|
|||||||
ctx->reg_base);
|
ctx->reg_base);
|
||||||
break;
|
break;
|
||||||
case branch_dclk_divider:
|
case branch_dclk_divider:
|
||||||
|
#ifdef CONFIG_ROCKCHIP_DCLK_DIV
|
||||||
clk = rockchip_clk_register_dclk_branch(list->name,
|
clk = rockchip_clk_register_dclk_branch(list->name,
|
||||||
list->parent_names, list->num_parents,
|
list->parent_names, list->num_parents,
|
||||||
ctx->reg_base, list->muxdiv_offset, list->mux_shift,
|
ctx->reg_base, list->muxdiv_offset, list->mux_shift,
|
||||||
@@ -686,6 +689,7 @@ void rockchip_clk_register_branches(struct rockchip_clk_provider *ctx,
|
|||||||
list->div_flags, list->div_table,
|
list->div_flags, list->div_table,
|
||||||
list->gate_offset, list->gate_shift,
|
list->gate_offset, list->gate_shift,
|
||||||
list->gate_flags, flags, list->max_prate, &ctx->lock);
|
list->gate_flags, flags, list->max_prate, &ctx->lock);
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user