Commit 24d7b40a authored by Kevin Hilman's avatar Kevin Hilman

ARM: OMAP2+: PM: MPU DVFS: use generic CPU device for MPU-SS

Currently, a dummy omap_device is created for the MPU sub-system so
that a device node exists for MPU DVFS.  Specifically, for the
association of MPU OPPs to a device node, and so that a voltage
regulator can be mapped to a device node.

For drivers to get a handle to this device node, an OMAP-specific API
has been used.  However, the kernel already has device nodes for the
CPU(s) in the system, so we can use those instead of an OMAP-specific
dummy device and then drivers (like OMAP CPUfreq) can use generic
APIs.

To use the existing CPU device nodes, modify the OPP creation and
regulator registration to use the CPU0 device node for registraion.

NOTE: this patch always uses CPU0 as the device node.  On all
      OMAPs today, MPU DVFS scales all CPUs together, so this will
      not be a problem, but this assumption will need to be changed
      if independently scalable CPUs are introduced.

Cc: Paul Walmsley <paul@pwsan.com>
Signed-off-by: default avatarKevin Hilman <khilman@ti.com>
parent 747a7f64
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
*/ */
#include <linux/module.h> #include <linux/module.h>
#include <linux/opp.h> #include <linux/opp.h>
#include <linux/cpu.h>
#include <plat/omap_device.h> #include <plat/omap_device.h>
...@@ -62,6 +63,15 @@ int __init omap_init_opp_table(struct omap_opp_def *opp_def, ...@@ -62,6 +63,15 @@ int __init omap_init_opp_table(struct omap_opp_def *opp_def,
__func__, i); __func__, i);
return -EINVAL; return -EINVAL;
} }
if (!strncmp(opp_def->hwmod_name, "mpu", 3)) {
/*
* All current OMAPs share voltage rail and
* clock source, so CPU0 is used to represent
* the MPU-SS.
*/
dev = get_cpu_device(0);
} else {
oh = omap_hwmod_lookup(opp_def->hwmod_name); oh = omap_hwmod_lookup(opp_def->hwmod_name);
if (!oh || !oh->od) { if (!oh || !oh->od) {
pr_debug("%s: no hwmod or odev for %s, [%d] cannot add OPPs.\n", pr_debug("%s: no hwmod or odev for %s, [%d] cannot add OPPs.\n",
...@@ -69,6 +79,7 @@ int __init omap_init_opp_table(struct omap_opp_def *opp_def, ...@@ -69,6 +79,7 @@ int __init omap_init_opp_table(struct omap_opp_def *opp_def,
continue; continue;
} }
dev = &oh->od->pdev->dev; dev = &oh->od->pdev->dev;
}
r = opp_add(dev, opp_def->freq, opp_def->u_volt); r = opp_add(dev, opp_def->freq, opp_def->u_volt);
if (r) { if (r) {
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <linux/opp.h> #include <linux/opp.h>
#include <linux/export.h> #include <linux/export.h>
#include <linux/suspend.h> #include <linux/suspend.h>
#include <linux/cpu.h>
#include <asm/system_misc.h> #include <asm/system_misc.h>
...@@ -168,7 +169,15 @@ static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name, ...@@ -168,7 +169,15 @@ static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name,
goto exit; goto exit;
} }
if (!strncmp(oh_name, "mpu", 3))
/*
* All current OMAPs share voltage rail and clock
* source, so CPU0 is used to represent the MPU-SS.
*/
dev = get_cpu_device(0);
else
dev = omap_device_get_by_hwmod_name(oh_name); dev = omap_device_get_by_hwmod_name(oh_name);
if (IS_ERR(dev)) { if (IS_ERR(dev)) {
pr_err("%s: Unable to get dev pointer for hwmod %s\n", pr_err("%s: Unable to get dev pointer for hwmod %s\n",
__func__, oh_name); __func__, oh_name);
......
...@@ -158,7 +158,7 @@ static struct regulator_init_data omap3_vpll2_idata = { ...@@ -158,7 +158,7 @@ static struct regulator_init_data omap3_vpll2_idata = {
}; };
static struct regulator_consumer_supply omap3_vdd1_supply[] = { static struct regulator_consumer_supply omap3_vdd1_supply[] = {
REGULATOR_SUPPLY("vcc", "mpu.0"), REGULATOR_SUPPLY("vcc", "cpu0"),
}; };
static struct regulator_consumer_supply omap3_vdd2_supply[] = { static struct regulator_consumer_supply omap3_vdd2_supply[] = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment