From 29d49c14109003f642313adc3b4f20f59b50974c Mon Sep 17 00:00:00 2001 From: Xiao Feng Date: Thu, 14 May 2015 15:45:31 +0800 Subject: [PATCH] ddrfreq: add vop bandwidth freq table in dts, in order to support more boards Signed-off-by: Xiao Feng --- arch/arm/boot/dts/rk3288-p977.dts | 7 ++++ arch/arm/boot/dts/rk3288-p977_8846.dts | 7 ++++ arch/arm/boot/dts/rk3288-tb.dts | 7 ++++ arch/arm/boot/dts/rk3288-tb_8846.dts | 7 ++++ arch/arm/boot/dts/rk3288.dtsi | 7 ++++ arch/arm/mach-rockchip/ddr_freq.c | 57 ++++++++++++++++++++------ 6 files changed, 79 insertions(+), 13 deletions(-) diff --git a/arch/arm/boot/dts/rk3288-p977.dts b/arch/arm/boot/dts/rk3288-p977.dts index 3332f90de4a1..a6072b0ad3bd 100755 --- a/arch/arm/boot/dts/rk3288-p977.dts +++ b/arch/arm/boot/dts/rk3288-p977.dts @@ -611,6 +611,13 @@ SYS_STATUS_BOOST 324000 SYS_STATUS_ISP 533000 >; + bd-freq-table = < + /* bandwidth freq */ + 5000 800000 + 3500 456000 + 2600 396000 + 2000 324000 + >; auto-freq-table = < 240000 324000 diff --git a/arch/arm/boot/dts/rk3288-p977_8846.dts b/arch/arm/boot/dts/rk3288-p977_8846.dts index a7b2e452e93d..b092288ea96d 100755 --- a/arch/arm/boot/dts/rk3288-p977_8846.dts +++ b/arch/arm/boot/dts/rk3288-p977_8846.dts @@ -668,6 +668,13 @@ SYS_STATUS_BOOST 324000 SYS_STATUS_ISP 533000 >; + bd-freq-table = < + /* bandwidth freq */ + 5000 800000 + 3500 456000 + 2600 396000 + 2000 324000 + >; auto-freq-table = < 240000 324000 diff --git a/arch/arm/boot/dts/rk3288-tb.dts b/arch/arm/boot/dts/rk3288-tb.dts index 9858154d3e17..74e89529c61d 100755 --- a/arch/arm/boot/dts/rk3288-tb.dts +++ b/arch/arm/boot/dts/rk3288-tb.dts @@ -759,6 +759,13 @@ SYS_STATUS_BOOST 324000 SYS_STATUS_ISP 533000 >; + bd-freq-table = < + /* bandwidth freq */ + 5000 800000 + 3500 456000 + 2600 396000 + 2000 324000 + >; auto-freq-table = < 240000 324000 diff --git a/arch/arm/boot/dts/rk3288-tb_8846.dts b/arch/arm/boot/dts/rk3288-tb_8846.dts index caeaaefff8b3..e32edd8dc136 100755 --- a/arch/arm/boot/dts/rk3288-tb_8846.dts +++ b/arch/arm/boot/dts/rk3288-tb_8846.dts @@ -802,6 +802,13 @@ SYS_STATUS_BOOST 324000 SYS_STATUS_ISP 400000 >; + bd-freq-table = < + /* bandwidth freq */ + 5000 800000 + 3500 456000 + 2600 396000 + 2000 324000 + >; auto-freq-table = < 240000 324000 diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi index 71c54c7c7d96..0da4cdf4b9c6 100644 --- a/arch/arm/boot/dts/rk3288.dtsi +++ b/arch/arm/boot/dts/rk3288.dtsi @@ -937,6 +937,13 @@ 300000 1200000 400000 1200000 >; + bd-freq-table = < + /* bandwidth freq */ + 5000 800000 + 3500 456000 + 2600 396000 + 2000 324000 + >; channel = <2>; status = "disabled"; }; diff --git a/arch/arm/mach-rockchip/ddr_freq.c b/arch/arm/mach-rockchip/ddr_freq.c index 1403ed50e651..b44538b1197d 100644 --- a/arch/arm/mach-rockchip/ddr_freq.c +++ b/arch/arm/mach-rockchip/ddr_freq.c @@ -54,6 +54,7 @@ static int auto_freq_table_size; static unsigned long vop_bandwidth_update_jiffies = 0, vop_bandwidth = 0; static int vop_bandwidth_update_flag = 0; static struct ddr_bw_info ddr_bw_ch0 = {0}, ddr_bw_ch1 = {0}; +static struct cpufreq_frequency_table *bd_freq_table; enum { DEBUG_DDR = 1U << 0, @@ -198,23 +199,17 @@ static void ddrfreq_mode(bool auto_self_refresh, unsigned long target_rate, char unsigned long req_freq_by_vop(unsigned long bandwidth) { + unsigned int i = 0; + if (time_after(jiffies, vop_bandwidth_update_jiffies + msecs_to_jiffies(down_rate_delay_ms))) return 0; - if (bandwidth >= 5000){ - return 800000000; - } - - if (bandwidth >= 3500) { - return 456000000; - } - - if (bandwidth >= 2600) { - return 396000000; - } - if (bandwidth >= 2000) { - return 324000000; + if (bd_freq_table == NULL) + return 0; + for (i = 0; bd_freq_table[i].frequency != CPUFREQ_TABLE_END; i++) { + if (bandwidth >= bd_freq_table[i].index) + return bd_freq_table[i].frequency * 1000; } return 0; @@ -822,6 +817,40 @@ static struct notifier_block ddrfreq_system_status_notifier = { .notifier_call = ddrfreq_system_status_notifier_call, }; +static struct cpufreq_frequency_table + *of_get_bd_freq_table(struct device_node *np, const char *propname) +{ + struct cpufreq_frequency_table *freq_table = NULL; + const struct property *prop; + const __be32 *val; + int nr, i; + + prop = of_find_property(np, propname, NULL); + if (!prop) + return NULL; + if (!prop->value) + return NULL; + + nr = prop->length / sizeof(u32); + if (nr % 2) { + pr_err("%s: Invalid freq list\n", __func__); + return NULL; + } + + freq_table = kzalloc(sizeof(*freq_table) * (nr/2 + 1), GFP_KERNEL); + + val = prop->value; + + for (i = 0; i < nr/2; i++) { + freq_table[i].index = be32_to_cpup(val++); + freq_table[i].frequency = be32_to_cpup(val++); + } + + freq_table[i].index = 0; + freq_table[i].frequency = CPUFREQ_TABLE_END; + + return freq_table; +} int of_init_ddr_freq_table(void) { @@ -898,6 +927,8 @@ int of_init_ddr_freq_table(void) nr -= 2; } + bd_freq_table = of_get_bd_freq_table(clk_ddr_dev_node, "bd-freq-table"); + return 0; } -- 2.34.1