mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-24 05:04:00 +08:00
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: Kevin Hilman <khilman@ti.com>
This commit is contained in:
parent
747a7f6420
commit
24d7b40a60
@ -18,6 +18,7 @@
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/opp.h>
|
||||
#include <linux/cpu.h>
|
||||
|
||||
#include <plat/omap_device.h>
|
||||
|
||||
@ -62,13 +63,23 @@ int __init omap_init_opp_table(struct omap_opp_def *opp_def,
|
||||
__func__, i);
|
||||
return -EINVAL;
|
||||
}
|
||||
oh = omap_hwmod_lookup(opp_def->hwmod_name);
|
||||
if (!oh || !oh->od) {
|
||||
pr_debug("%s: no hwmod or odev for %s, [%d] cannot add OPPs.\n",
|
||||
__func__, opp_def->hwmod_name, i);
|
||||
continue;
|
||||
|
||||
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);
|
||||
if (!oh || !oh->od) {
|
||||
pr_debug("%s: no hwmod or odev for %s, [%d] cannot add OPPs.\n",
|
||||
__func__, opp_def->hwmod_name, i);
|
||||
continue;
|
||||
}
|
||||
dev = &oh->od->pdev->dev;
|
||||
}
|
||||
dev = &oh->od->pdev->dev;
|
||||
|
||||
r = opp_add(dev, opp_def->freq, opp_def->u_volt);
|
||||
if (r) {
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include <linux/opp.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/cpu.h>
|
||||
|
||||
#include <asm/system_misc.h>
|
||||
|
||||
@ -168,7 +169,15 @@ static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name,
|
||||
goto exit;
|
||||
}
|
||||
|
||||
dev = omap_device_get_by_hwmod_name(oh_name);
|
||||
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);
|
||||
|
||||
if (IS_ERR(dev)) {
|
||||
pr_err("%s: Unable to get dev pointer for hwmod %s\n",
|
||||
__func__, oh_name);
|
||||
|
@ -158,7 +158,7 @@ static struct regulator_init_data omap3_vpll2_idata = {
|
||||
};
|
||||
|
||||
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[] = {
|
||||
|
Loading…
Reference in New Issue
Block a user