"Rajendra Nayak" <[email protected]> writes:
> This patch implements an implicit/internal constraint
> of 100Mhz for L3 bus while the VDD1 OPP is OPP3 or higher.
> The patch also removes the usage of bus_throughput_db
> from SRF.
> Applies on the latest pm branch.
>
> Signed-off-by: Rajendra Nayak <[email protected]>
Thanks, applied to PM branch.
Kevin
> ---
> arch/arm/mach-omap2/pm.c | 6 +++++-
> arch/arm/mach-omap2/resource34xx.c | 37
> ++++++++++++++++++++++++++++---------
> arch/arm/mach-omap2/resource34xx.h | 13 -------------
> 3 files changed, 33 insertions(+), 23 deletions(-)
>
> Index: linux-omap-2.6/arch/arm/mach-omap2/resource34xx.c
> ===================================================================
> --- linux-omap-2.6.orig/arch/arm/mach-omap2/resource34xx.c 2008-12-16
> 11:11:28.000000000 +0530
> +++ linux-omap-2.6/arch/arm/mach-omap2/resource34xx.c 2008-12-16
> 16:04:43.017689014 +0530
> @@ -146,7 +146,7 @@ void init_opp(struct shared_resource *re
> resp->no_of_users = 0;
>
> if (!mpu_opps || !dsp_opps || !l3_opps)
> - return 0;
> + return;
>
> /* Initialize the current level of the OPP resource
> * to the opp set by u-boot.
> @@ -161,11 +161,12 @@ void init_opp(struct shared_resource *re
> return;
> }
>
> +static struct device vdd2_dev;
> +
> int set_opp(struct shared_resource *resp, u32 target_level)
> {
> - unsigned long mpu_freq, mpu_old_freq, l3_freq, tput, t_opp;
> + unsigned long mpu_freq, mpu_old_freq, l3_freq, req_l3_freq, tput, t_opp;
> int ind;
> - struct bus_throughput_db *tput_db;
> struct cpufreq_freqs freqs_notify;
>
> if (resp->curr_level == target_level)
> @@ -188,6 +189,14 @@ int set_opp(struct shared_resource *resp
> #endif
> t_opp = ID_VDD(PRCM_VDD1) |
> ID_OPP_NO(mpu_opps[target_level].opp_id);
> +
> + /* For VDD1 OPP3 and above, make sure the interconnect
> + * is at 100Mhz or above.
> + * throughput in KiB/s for 100 Mhz = 100 * 1000 * 4.
> + */
> + if (mpu_opps[target_level].opp_id >= 3)
> + resource_request("vdd2_opp", &vdd2_dev, 400000);
> +
> if (resp->curr_level > target_level) {
> /* Scale Frequency and then voltage */
> clk_set_rate(vdd1_clk, mpu_freq);
> @@ -203,22 +212,32 @@ int set_opp(struct shared_resource *resp
> #endif
> clk_set_rate(vdd1_clk, mpu_freq);
> }
> +
> + /* Release the VDD2/interconnect constraint */
> + if (mpu_opps[target_level].opp_id < 3)
> + resource_release("vdd2_opp", &vdd2_dev);
> +
> resp->curr_level = curr_vdd1_prcm_set->opp_id;
> #ifdef CONFIG_CPU_FREQ
> /* Send a post notification to CPUFreq */
> cpufreq_notify_transition(&freqs_notify, CPUFREQ_POSTCHANGE);
> #endif
> } else if (strcmp(resp->name, "vdd2_opp") == 0) {
> - tput_db = resp->resource_data;
> tput = target_level;
> - /* using the throughput db map to the appropriate L3 Freq */
> - for (ind = 1; ind < MAX_VDD2_OPP; ind++)
> - if (tput_db->throughput[ind] > tput)
> +
> + /* Convert the tput in KiB/s to Bus frequency in Mhz*/
> + req_l3_freq = (tput * 1000)/4;
> +
> + for (ind = 2; ind <= MAX_VDD2_OPP; ind++) {
> + if ((l3_opps + ind)->rate >= req_l3_freq) {
> target_level = ind;
> + break;
> + }
> + }
>
> /* Set the highest OPP possible */
> - if (ind == MAX_VDD2_OPP)
> - target_level = ind-1;
> + if (ind > MAX_VDD2_OPP)
> + target_level = MAX_VDD2_OPP;
>
> if (resp->curr_level == target_level)
> return 0;
> Index: linux-omap-2.6/arch/arm/mach-omap2/pm.c
> ===================================================================
> --- linux-omap-2.6.orig/arch/arm/mach-omap2/pm.c 2008-12-16
> 10:35:55.000000000 +0530
> +++ linux-omap-2.6/arch/arm/mach-omap2/pm.c 2008-12-16 16:01:48.580075608
> +0530
> @@ -34,6 +34,7 @@
> #include <mach/powerdomain.h>
> #include <mach/omapdev.h>
> #include <mach/resource.h>
> +#include <mach/omap-pm.h>
>
> #include "prm-regbits-34xx.h"
> #include "pm.h"
> @@ -136,6 +137,7 @@ static ssize_t vdd_opp_store(struct kobj
> const char *buf, size_t n)
> {
> unsigned short value;
> + unsigned long bus_tput;
>
> if (sscanf(buf, "%hu", &value) != 1)
> return -EINVAL;
> @@ -151,7 +153,9 @@ static ssize_t vdd_opp_store(struct kobj
> printk(KERN_ERR "vdd_opp_store: Invalid value\n");
> return -EINVAL;
> }
> - resource_request("vdd2_opp", &dummy_sysfs_dev, value);
> + /* Convert OPP's requested to appr. bus throughtput in KiB/s */
> + bus_tput = ((l3_opps + value)->rate/1000) * 4;
> + resource_request("vdd2_opp", &dummy_sysfs_dev, bus_tput);
> } else {
> return -EINVAL;
> }
> Index: linux-omap-2.6/arch/arm/mach-omap2/resource34xx.h
> ===================================================================
> --- linux-omap-2.6.orig/arch/arm/mach-omap2/resource34xx.h 2008-12-16
> 10:35:55.000000000 +0530
> +++ linux-omap-2.6/arch/arm/mach-omap2/resource34xx.h 2008-12-16
> 15:28:22.341172791 +0530
> @@ -238,11 +238,6 @@ void init_freq(struct shared_resource *r
> int set_freq(struct shared_resource *resp, u32 target_level);
> int validate_freq(struct shared_resource *resp, u32 target_level);
>
> -struct bus_throughput_db {
> - /* Throughput for each OPP/Freq of the bus */
> - unsigned long throughput[3];
> -};
> -
> static struct shared_resource_ops opp_res_ops = {
> .init = init_opp,
> .change_level = set_opp,
> @@ -255,17 +250,9 @@ static struct shared_resource vdd1_opp =
> .ops = &opp_res_ops,
> };
>
> -/* Throughput in KiB/s */
> -static struct bus_throughput_db l3_throughput_db = {
> - .throughput[0] = 0,
> - .throughput[1] = 2656000,
> - .throughput[2] = 5312000,
> -};
> -
> static struct shared_resource vdd2_opp = {
> .name = "vdd2_opp",
> .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
> - .resource_data = &l3_throughput_db,
> .ops = &opp_res_ops,
> };
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html