-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'pm-opp' of ssh://master.kernel.org/pub/scm/linux/kernel…
…/git/khilman/linux-omap-pm into omap-for-linus
- Loading branch information
Showing
11 changed files
with
391 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
/* | ||
* OMAP SoC specific OPP Data helpers | ||
* | ||
* Copyright (C) 2009-2010 Texas Instruments Incorporated - http://www.ti.com/ | ||
* Nishanth Menon | ||
* Kevin Hilman | ||
* Copyright (C) 2010 Nokia Corporation. | ||
* Eduardo Valentin | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
* | ||
* This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
* kind, whether express or implied; without even the implied warranty | ||
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
*/ | ||
#ifndef __ARCH_ARM_MACH_OMAP2_OMAP_OPP_DATA_H | ||
#define __ARCH_ARM_MACH_OMAP2_OMAP_OPP_DATA_H | ||
|
||
#include <plat/omap_hwmod.h> | ||
|
||
/* | ||
* *BIG FAT WARNING*: | ||
* USE the following ONLY in opp data initialization common to an SoC. | ||
* DO NOT USE these in board files/pm core etc. | ||
*/ | ||
|
||
/** | ||
* struct omap_opp_def - OMAP OPP Definition | ||
* @hwmod_name: Name of the hwmod for this domain | ||
* @freq: Frequency in hertz corresponding to this OPP | ||
* @u_volt: Nominal voltage in microvolts corresponding to this OPP | ||
* @default_available: True/false - is this OPP available by default | ||
* | ||
* OMAP SOCs have a standard set of tuples consisting of frequency and voltage | ||
* pairs that the device will support per voltage domain. This is called | ||
* Operating Points or OPP. The actual definitions of OMAP Operating Points | ||
* varies over silicon within the same family of devices. For a specific | ||
* domain, you can have a set of {frequency, voltage} pairs and this is denoted | ||
* by an array of omap_opp_def. As the kernel boots and more information is | ||
* available, a set of these are activated based on the precise nature of | ||
* device the kernel boots up on. It is interesting to remember that each IP | ||
* which belongs to a voltage domain may define their own set of OPPs on top | ||
* of this - but this is handled by the appropriate driver. | ||
*/ | ||
struct omap_opp_def { | ||
char *hwmod_name; | ||
|
||
unsigned long freq; | ||
unsigned long u_volt; | ||
|
||
bool default_available; | ||
}; | ||
|
||
/* | ||
* Initialization wrapper used to define an OPP for OMAP variants. | ||
*/ | ||
#define OPP_INITIALIZER(_hwmod_name, _enabled, _freq, _uv) \ | ||
{ \ | ||
.hwmod_name = _hwmod_name, \ | ||
.default_available = _enabled, \ | ||
.freq = _freq, \ | ||
.u_volt = _uv, \ | ||
} | ||
|
||
/* Use this to initialize the default table */ | ||
extern int __init omap_init_opp_table(struct omap_opp_def *opp_def, | ||
u32 opp_def_size); | ||
|
||
#endif /* __ARCH_ARM_MACH_OMAP2_OMAP_OPP_DATA_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
/* | ||
* OMAP SoC specific OPP wrapper function | ||
* | ||
* Copyright (C) 2009-2010 Texas Instruments Incorporated - http://www.ti.com/ | ||
* Nishanth Menon | ||
* Kevin Hilman | ||
* Copyright (C) 2010 Nokia Corporation. | ||
* Eduardo Valentin | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
* | ||
* This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
* kind, whether express or implied; without even the implied warranty | ||
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
*/ | ||
#include <linux/module.h> | ||
#include <linux/opp.h> | ||
|
||
#include <plat/omap_device.h> | ||
|
||
#include "omap_opp_data.h" | ||
|
||
/* Temp variable to allow multiple calls */ | ||
static u8 __initdata omap_table_init; | ||
|
||
/** | ||
* omap_init_opp_table() - Initialize opp table as per the CPU type | ||
* @opp_def: opp default list for this silicon | ||
* @opp_def_size: number of opp entries for this silicon | ||
* | ||
* Register the initial OPP table with the OPP library based on the CPU | ||
* type. This is meant to be used only by SoC specific registration. | ||
*/ | ||
int __init omap_init_opp_table(struct omap_opp_def *opp_def, | ||
u32 opp_def_size) | ||
{ | ||
int i, r; | ||
|
||
if (!opp_def || !opp_def_size) { | ||
pr_err("%s: invalid params!\n", __func__); | ||
return -EINVAL; | ||
} | ||
|
||
/* | ||
* Initialize only if not already initialized even if the previous | ||
* call failed, because, no reason we'd succeed again. | ||
*/ | ||
if (omap_table_init) | ||
return -EEXIST; | ||
omap_table_init = 1; | ||
|
||
/* Lets now register with OPP library */ | ||
for (i = 0; i < opp_def_size; i++) { | ||
struct omap_hwmod *oh; | ||
struct device *dev; | ||
|
||
if (!opp_def->hwmod_name) { | ||
pr_err("%s: NULL name of omap_hwmod, failing [%d].\n", | ||
__func__, i); | ||
return -EINVAL; | ||
} | ||
oh = omap_hwmod_lookup(opp_def->hwmod_name); | ||
if (!oh || !oh->od) { | ||
pr_warn("%s: no hwmod or odev for %s, [%d] " | ||
"cannot add OPPs.\n", __func__, | ||
opp_def->hwmod_name, i); | ||
return -EINVAL; | ||
} | ||
dev = &oh->od->pdev.dev; | ||
|
||
r = opp_add(dev, opp_def->freq, opp_def->u_volt); | ||
if (r) { | ||
dev_err(dev, "%s: add OPP %ld failed for %s [%d] " | ||
"result=%d\n", | ||
__func__, opp_def->freq, | ||
opp_def->hwmod_name, i, r); | ||
} else { | ||
if (!opp_def->default_available) | ||
r = opp_disable(dev, opp_def->freq); | ||
if (r) | ||
dev_err(dev, "%s: disable %ld failed for %s " | ||
"[%d] result=%d\n", | ||
__func__, opp_def->freq, | ||
opp_def->hwmod_name, i, r); | ||
} | ||
opp_def++; | ||
} | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
/* | ||
* OMAP3 OPP table definitions. | ||
* | ||
* Copyright (C) 2009-2010 Texas Instruments Incorporated - http://www.ti.com/ | ||
* Nishanth Menon | ||
* Kevin Hilman | ||
* Copyright (C) 2010 Nokia Corporation. | ||
* Eduardo Valentin | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
* | ||
* This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
* kind, whether express or implied; without even the implied warranty | ||
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
*/ | ||
#include <linux/module.h> | ||
|
||
#include <plat/cpu.h> | ||
|
||
#include "omap_opp_data.h" | ||
|
||
static struct omap_opp_def __initdata omap34xx_opp_def_list[] = { | ||
/* MPU OPP1 */ | ||
OPP_INITIALIZER("mpu", true, 125000000, 975000), | ||
/* MPU OPP2 */ | ||
OPP_INITIALIZER("mpu", true, 250000000, 1075000), | ||
/* MPU OPP3 */ | ||
OPP_INITIALIZER("mpu", true, 500000000, 1200000), | ||
/* MPU OPP4 */ | ||
OPP_INITIALIZER("mpu", true, 550000000, 1270000), | ||
/* MPU OPP5 */ | ||
OPP_INITIALIZER("mpu", true, 600000000, 1350000), | ||
|
||
/* | ||
* L3 OPP1 - 41.5 MHz is disabled because: The voltage for that OPP is | ||
* almost the same than the one at 83MHz thus providing very little | ||
* gain for the power point of view. In term of energy it will even | ||
* increase the consumption due to the very negative performance | ||
* impact that frequency will do to the MPU and the whole system in | ||
* general. | ||
*/ | ||
OPP_INITIALIZER("l3_main", false, 41500000, 975000), | ||
/* L3 OPP2 */ | ||
OPP_INITIALIZER("l3_main", true, 83000000, 1050000), | ||
/* L3 OPP3 */ | ||
OPP_INITIALIZER("l3_main", true, 166000000, 1150000), | ||
|
||
/* DSP OPP1 */ | ||
OPP_INITIALIZER("iva", true, 90000000, 975000), | ||
/* DSP OPP2 */ | ||
OPP_INITIALIZER("iva", true, 180000000, 1075000), | ||
/* DSP OPP3 */ | ||
OPP_INITIALIZER("iva", true, 360000000, 1200000), | ||
/* DSP OPP4 */ | ||
OPP_INITIALIZER("iva", true, 400000000, 1270000), | ||
/* DSP OPP5 */ | ||
OPP_INITIALIZER("iva", true, 430000000, 1350000), | ||
}; | ||
|
||
static struct omap_opp_def __initdata omap36xx_opp_def_list[] = { | ||
/* MPU OPP1 - OPP50 */ | ||
OPP_INITIALIZER("mpu", true, 300000000, 1012500), | ||
/* MPU OPP2 - OPP100 */ | ||
OPP_INITIALIZER("mpu", true, 600000000, 1200000), | ||
/* MPU OPP3 - OPP-Turbo */ | ||
OPP_INITIALIZER("mpu", false, 800000000, 1325000), | ||
/* MPU OPP4 - OPP-SB */ | ||
OPP_INITIALIZER("mpu", false, 1000000000, 1375000), | ||
|
||
/* L3 OPP1 - OPP50 */ | ||
OPP_INITIALIZER("l3_main", true, 100000000, 1000000), | ||
/* L3 OPP2 - OPP100, OPP-Turbo, OPP-SB */ | ||
OPP_INITIALIZER("l3_main", true, 200000000, 1200000), | ||
|
||
/* DSP OPP1 - OPP50 */ | ||
OPP_INITIALIZER("iva", true, 260000000, 1012500), | ||
/* DSP OPP2 - OPP100 */ | ||
OPP_INITIALIZER("iva", true, 520000000, 1200000), | ||
/* DSP OPP3 - OPP-Turbo */ | ||
OPP_INITIALIZER("iva", false, 660000000, 1325000), | ||
/* DSP OPP4 - OPP-SB */ | ||
OPP_INITIALIZER("iva", false, 800000000, 1375000), | ||
}; | ||
|
||
/** | ||
* omap3_opp_init() - initialize omap3 opp table | ||
*/ | ||
static int __init omap3_opp_init(void) | ||
{ | ||
int r = -ENODEV; | ||
|
||
if (!cpu_is_omap34xx()) | ||
return r; | ||
|
||
if (cpu_is_omap3630()) | ||
r = omap_init_opp_table(omap36xx_opp_def_list, | ||
ARRAY_SIZE(omap36xx_opp_def_list)); | ||
else | ||
r = omap_init_opp_table(omap34xx_opp_def_list, | ||
ARRAY_SIZE(omap34xx_opp_def_list)); | ||
|
||
return r; | ||
} | ||
device_initcall(omap3_opp_init); |
Oops, something went wrong.