Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 226666
b: refs/heads/master
c: 1482d8b
h: refs/heads/master
v: v3
  • Loading branch information
Thara Gopinath authored and Kevin Hilman committed Dec 22, 2010
1 parent d451598 commit 1d69214
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 077fceca3a5db69791d64723ffba1caad2f03a08
refs/heads/master: 1482d8be5525eccdec6286677d40af29da03a30c
76 changes: 76 additions & 0 deletions trunk/arch/arm/mach-omap2/pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include <linux/init.h>
#include <linux/io.h>
#include <linux/err.h>
#include <linux/opp.h>

#include <plat/omap-pm.h>
#include <plat/omap_device.h>
Expand Down Expand Up @@ -156,6 +157,76 @@ int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
return ret;
}

/*
* This API is to be called during init to put the various voltage
* domains to the voltage as per the opp table. Typically we boot up
* at the nominal voltage. So this function finds out the rate of
* the clock associated with the voltage domain, finds out the correct
* opp entry and puts the voltage domain to the voltage specifies
* in the opp entry
*/
static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name,
struct device *dev)
{
struct voltagedomain *voltdm;
struct clk *clk;
struct opp *opp;
unsigned long freq, bootup_volt;

if (!vdd_name || !clk_name || !dev) {
printk(KERN_ERR "%s: Invalid parameters!\n", __func__);
goto exit;
}

voltdm = omap_voltage_domain_lookup(vdd_name);
if (IS_ERR(voltdm)) {
printk(KERN_ERR "%s: Unable to get vdd pointer for vdd_%s\n",
__func__, vdd_name);
goto exit;
}

clk = clk_get(NULL, clk_name);
if (IS_ERR(clk)) {
printk(KERN_ERR "%s: unable to get clk %s\n",
__func__, clk_name);
goto exit;
}

freq = clk->rate;
clk_put(clk);

opp = opp_find_freq_ceil(dev, &freq);
if (IS_ERR(opp)) {
printk(KERN_ERR "%s: unable to find boot up OPP for vdd_%s\n",
__func__, vdd_name);
goto exit;
}

bootup_volt = opp_get_voltage(opp);
if (!bootup_volt) {
printk(KERN_ERR "%s: unable to find voltage corresponding"
"to the bootup OPP for vdd_%s\n", __func__, vdd_name);
goto exit;
}

omap_voltage_scale_vdd(voltdm, bootup_volt);
return 0;

exit:
printk(KERN_ERR "%s: Unable to put vdd_%s to its init voltage\n\n",
__func__, vdd_name);
return -EINVAL;
}

static void __init omap3_init_voltages(void)
{
if (!cpu_is_omap34xx())
return;

omap2_set_init_voltage("mpu", "dpll1_ck", mpu_dev);
omap2_set_init_voltage("core", "l3_ick", l3_dev);
}

static int __init omap2_common_pm_init(void)
{
omap2_init_processor_devices();
Expand All @@ -169,8 +240,13 @@ static int __init omap2_common_pm_late_init(void)
{
/* Init the OMAP TWL parameters */
omap3_twl_init();

/* Init the voltage layer */
omap_voltage_late_init();

/* Initialize the voltages */
omap3_init_voltages();

/* Smartreflex device init */
omap_devinit_smartreflex();

Expand Down

0 comments on commit 1d69214

Please sign in to comment.