summaryrefslogtreecommitdiff
path: root/arch/arm/mach-omap2
diff options
context:
space:
mode:
authormattis fjallstrom <mattis@acm.org>2015-05-21 12:00:33 -0700
committermattis fjallstrom <mattis@acm.org>2015-05-21 13:24:30 -0700
commit7d990a059acf5eb46ae99c058fc9911cbdce131d (patch)
treeac9531b3ff2b2670dabc84c248a1770c84109586 /arch/arm/mach-omap2
parente8980e2a6a7392ae5a1f882d1ba01e03ac83f899 (diff)
parent89fdc2c4bb83fff36199cd883a27efb317f02037 (diff)
downloadolio-linux-3.10-7d990a059acf5eb46ae99c058fc9911cbdce131d.tar.xz
olio-linux-3.10-7d990a059acf5eb46ae99c058fc9911cbdce131d.zip
Merge branch 'android-omap-minnow-3.10-lollipop-wear-release' of https://android.googlesource.com/kernel/omap into mattis_devmattis_dev
Change-Id: I46165dd7747b9b6289eb44cb96cbef2de46c10ba
Diffstat (limited to 'arch/arm/mach-omap2')
-rw-r--r--arch/arm/mach-omap2/cclock3xxx_data.c9
-rw-r--r--arch/arm/mach-omap2/clkt34xx_dpll3m2.c7
-rw-r--r--arch/arm/mach-omap2/control.c4
-rw-r--r--arch/arm/mach-omap2/omap-secure.c5
-rw-r--r--arch/arm/mach-omap2/omap-secure.h1
-rw-r--r--arch/arm/mach-omap2/pm-debug.c18
-rw-r--r--arch/arm/mach-omap2/pm.c7
-rw-r--r--arch/arm/mach-omap2/pm.h2
-rw-r--r--arch/arm/mach-omap2/pm34xx.c36
-rw-r--r--arch/arm/mach-omap2/sdram-toshiba-hynix-numonyx.h24
10 files changed, 70 insertions, 43 deletions
diff --git a/arch/arm/mach-omap2/cclock3xxx_data.c b/arch/arm/mach-omap2/cclock3xxx_data.c
index e823edd05eb..50d8b4587f6 100644
--- a/arch/arm/mach-omap2/cclock3xxx_data.c
+++ b/arch/arm/mach-omap2/cclock3xxx_data.c
@@ -137,6 +137,10 @@ DEFINE_CLK_DIVIDER(dpll3_m2_ck, "dpll3_ck", &dpll3_ck, 0x0,
OMAP3430_CORE_DPLL_CLKOUT_DIV_WIDTH,
CLK_DIVIDER_ONE_BASED, NULL);
+/* placeholder for ops substitution */
+static struct clk_ops dpll3_m2_ck_subops = {
+};
+
static struct clk core_ck;
static const char *core_ck_parent_names[] = {
@@ -3566,6 +3570,11 @@ int __init omap3xxx_clk_init(void)
dpll4_m4x2_ck = dpll4_m4x2_ck_3630;
dpll4_m5x2_ck = dpll4_m5x2_ck_3630;
dpll4_m6x2_ck = dpll4_m6x2_ck_3630;
+ memcpy(
+ &dpll3_m2_ck_subops, dpll3_m2_ck.ops, sizeof(struct clk_ops));
+
+ dpll3_m2_ck_subops.set_rate = omap3_core_dpll_m2_set_rate;
+ dpll3_m2_ck.ops = &dpll3_m2_ck_subops;
}
/*
diff --git a/arch/arm/mach-omap2/clkt34xx_dpll3m2.c b/arch/arm/mach-omap2/clkt34xx_dpll3m2.c
index eb69acf2101..1fc3b607c7d 100644
--- a/arch/arm/mach-omap2/clkt34xx_dpll3m2.c
+++ b/arch/arm/mach-omap2/clkt34xx_dpll3m2.c
@@ -55,15 +55,16 @@ int omap3_core_dpll_m2_set_rate(struct clk_hw *hw, unsigned long rate,
struct omap_sdrc_params *sdrc_cs0;
struct omap_sdrc_params *sdrc_cs1;
int ret;
- unsigned long clkrate;
+ unsigned long clkrate, flags;
if (!clk || !rate)
return -EINVAL;
- validrate = omap2_clksel_round_rate_div(clk, rate, &new_div);
+ validrate = clk_round_rate(hw->clk, rate);
if (validrate != rate)
return -EINVAL;
+ new_div = parent_rate / validrate;
sdrcrate = __clk_get_rate(sdrc_ick_p);
clkrate = __clk_get_rate(hw->clk);
if (rate > clkrate)
@@ -101,6 +102,7 @@ int omap3_core_dpll_m2_set_rate(struct clk_hw *hw, unsigned long rate,
sdrc_cs1->rfr_ctrl, sdrc_cs1->actim_ctrla,
sdrc_cs1->actim_ctrlb, sdrc_cs1->mr);
+ local_irq_save(flags);
if (sdrc_cs1)
omap3_configure_core_dpll(
new_div, unlock_dll, c, rate > clkrate,
@@ -114,6 +116,7 @@ int omap3_core_dpll_m2_set_rate(struct clk_hw *hw, unsigned long rate,
sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla,
sdrc_cs0->actim_ctrlb, sdrc_cs0->mr,
0, 0, 0, 0);
+ local_irq_restore(flags);
return 0;
}
diff --git a/arch/arm/mach-omap2/control.c b/arch/arm/mach-omap2/control.c
index ab5ec4b28ab..a7da7ccd1a1 100644
--- a/arch/arm/mach-omap2/control.c
+++ b/arch/arm/mach-omap2/control.c
@@ -92,7 +92,7 @@ struct omap3_scratchpad_sdrc_block {
u32 block_size;
};
-void *omap3_secure_ram_storage;
+phys_addr_t omap3_secure_ram_context;
/*
* This is used to store ARM registers in SDRAM before attempting
@@ -360,7 +360,7 @@ void omap3_save_scratchpad_contents(void)
scratchpad_contents.secure_ram_restore_ptr = 0x0;
else
scratchpad_contents.secure_ram_restore_ptr =
- (u32) __pa(omap3_secure_ram_storage);
+ (u32) omap3_secure_ram_context;
scratchpad_contents.sdrc_module_semaphore = 0x0;
scratchpad_contents.prcm_block_offset = 0x2C;
scratchpad_contents.sdrc_block_offset = 0x64;
diff --git a/arch/arm/mach-omap2/omap-secure.c b/arch/arm/mach-omap2/omap-secure.c
index b970440cffc..55b24c32099 100644
--- a/arch/arm/mach-omap2/omap-secure.c
+++ b/arch/arm/mach-omap2/omap-secure.c
@@ -58,10 +58,7 @@ u32 omap_secure_dispatcher(u32 idx, u32 flag, u32 nargs, u32 arg1, u32 arg2,
/* Allocate the memory to save secure ram */
int __init omap_secure_ram_reserve_memblock(void)
{
- u32 size = OMAP_SECURE_RAM_STORAGE;
-
- size = ALIGN(size, SECTION_SIZE);
- omap_secure_memblock_base = arm_memblock_steal(size, SECTION_SIZE);
+ omap_secure_memblock_base = OMAP_SECURE_RAM_STORAGE_ADDR;
return 0;
}
diff --git a/arch/arm/mach-omap2/omap-secure.h b/arch/arm/mach-omap2/omap-secure.h
index 0e729170c46..dd894db8599 100644
--- a/arch/arm/mach-omap2/omap-secure.h
+++ b/arch/arm/mach-omap2/omap-secure.h
@@ -28,6 +28,7 @@
/* Maximum Secure memory storage size */
#define OMAP_SECURE_RAM_STORAGE (88 * SZ_1K)
+#define OMAP_SECURE_RAM_STORAGE_ADDR 0x83020000
/* Secure low power HAL API index */
#define OMAP4_HAL_SAVESECURERAM_INDEX 0x1a
diff --git a/arch/arm/mach-omap2/pm-debug.c b/arch/arm/mach-omap2/pm-debug.c
index b5dff42606c..ea5a306d1f1 100644
--- a/arch/arm/mach-omap2/pm-debug.c
+++ b/arch/arm/mach-omap2/pm-debug.c
@@ -38,8 +38,16 @@
#include "pm.h"
#include "pm-debug-regs.h"
+/* enable_off_mode is the runtime flag for enable/disable of offmode */
u32 enable_off_mode;
+/*
+ * global_disable_off_mode supercedes enable_off_mode and keeps
+ * offmode disabled as long as it is set
+ */
+bool global_disable_off_mode = 1;
+module_param(global_disable_off_mode, bool, 0644);
+
#ifdef CONFIG_DEBUG_FS
#include <linux/debugfs.h>
#include <linux/seq_file.h>
@@ -236,9 +244,13 @@ static int option_set(void *data, u64 val)
{
u32 *option = data;
- *option = val;
-
if (option == &enable_off_mode) {
+ if (global_disable_off_mode) {
+ pr_warn("Disable global_disable_off_mode "
+ "before enabling off mode");
+ return -EINVAL;
+ }
+
if (val)
omap_pm_enable_off_mode();
else
@@ -247,6 +259,8 @@ static int option_set(void *data, u64 val)
omap3_pm_off_mode_enable(val);
}
+ *option = val;
+
return 0;
}
diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c
index 303a8d2012b..b2dc18a6b82 100644
--- a/arch/arm/mach-omap2/pm.c
+++ b/arch/arm/mach-omap2/pm.c
@@ -311,13 +311,6 @@ int __init omap2_common_pm_late_init(void)
/* Smartreflex device init */
omap_devinit_smartreflex();
- } else {
- struct device_node *np;
- np = of_find_node_by_name(NULL, "omap_pimic");
- if (np) {
- of_platform_populate(np, NULL, NULL, NULL);
- of_node_put(np);
- }
}
/* cpufreq dummy device instantiation */
diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h
index 4f6f52b5215..551db0bb4a6 100644
--- a/arch/arm/mach-omap2/pm.h
+++ b/arch/arm/mach-omap2/pm.h
@@ -30,7 +30,7 @@ static inline int omap4_idle_init(void)
}
#endif
-extern void *omap3_secure_ram_storage;
+extern phys_addr_t omap3_secure_ram_context;
extern void omap3_pm_off_mode_enable(int);
extern void omap_sram_idle(bool in_suspend);
extern int omap_pm_clkdms_setup(struct clockdomain *clkdm, void *unused);
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
index 6f67bfa0b03..bdb2388ef4c 100644
--- a/arch/arm/mach-omap2/pm34xx.c
+++ b/arch/arm/mach-omap2/pm34xx.c
@@ -59,6 +59,10 @@
#include "pad_wkup.h"
+#define OMAP3_SECURE_RAM_CTX_ADDR 0x83036000
+
+extern bool global_disable_off_mode;
+
/* pm34xx errata defined in pm.h */
u16 pm34xx_errata;
bool suspend_debug;
@@ -133,8 +137,7 @@ static void omap3_save_secure_ram_context(void)
* will hang the system.
*/
pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON);
- ret = _omap_save_secure_sram((u32 *)
- __pa(omap3_secure_ram_storage));
+ ret = _omap_save_secure_sram((u32 *)omap3_secure_ram_context);
pwrdm_set_next_pwrst(mpu_pwrdm, mpu_next_state);
/* Following is for error tracking, it should not happen */
if (ret) {
@@ -667,6 +670,12 @@ void omap3_pm_off_mode_enable(int enable)
pwrst->next_state = PWRDM_POWER_RET;
pr_warn("%s: Core OFF disabled due to errata i583\n",
__func__);
+ } else if (global_disable_off_mode &&
+ pwrst->pwrdm == core_pwrdm &&
+ state == PWRDM_POWER_OFF) {
+ pwrst->next_state = PWRDM_POWER_RET;
+ pr_warn("%s: Core OFF disabled due global disable\n",
+ __func__);
} else {
pwrst->next_state = state;
}
@@ -741,13 +750,14 @@ static void __init pm_errata_configure(void)
/* Enable the l2 cache toggling in sleep logic */
enable_omap3630_toggle_l2_on_restore();
- if (omap_rev() < OMAP3630_REV_ES1_2)
+ if (omap_rev() < OMAP3630_REV_ES1_2) {
pm34xx_errata |= PM_PER_MEMORIES_ERRATUM_i582;
#ifndef CONFIG_DISABLE_OMAP_ERRATA_i583
pm34xx_errata |= PM_SDRC_WAKEUP_ERRATUM_i583;
#endif
- if (meminfo.bank[0].size > 256 * (1024 * 1024))
- pm34xx_errata |= PM_SDRC_WAKEUP_ERRATUM_i583;
+ if (meminfo.bank[0].size > 256 * (1024 * 1024))
+ pm34xx_errata |= PM_SDRC_WAKEUP_ERRATUM_i583;
+ }
} else if (cpu_is_omap34xx()) {
pm34xx_errata |= PM_PER_MEMORIES_ERRATUM_i582;
@@ -818,8 +828,7 @@ int __init omap3_pm_init(void)
omap_pm_suspend = omap3_pm_suspend;
#endif
- if (omap_pm_get_off_mode())
- omap3_pm_off_mode_enable(true);
+ omap3_pm_off_mode_enable(omap_pm_get_off_mode());
arm_pm_idle = omap3_pm_idle;
omap3_idle_init();
@@ -850,15 +859,16 @@ int __init omap3_pm_init(void)
* XXX Technically this workaround is only needed if off-mode
* or OSWR is enabled.
*/
- if (IS_PM34XX_ERRATUM(PM_PER_MEMORIES_ERRATUM_i582))
- clkdm_add_wkdep(per_clkdm, wkup_clkdm);
+
+ /*
+ * The PER wake dependency is still needed on ES1.2 which
+ * has fixed i582
+ */
+ clkdm_add_wkdep(per_clkdm, wkup_clkdm);
clkdm_add_wkdep(neon_clkdm, mpu_clkdm);
if (omap_type() != OMAP2_DEVICE_TYPE_GP) {
- omap3_secure_ram_storage =
- kmalloc(0x803F, GFP_KERNEL);
- if (!omap3_secure_ram_storage)
- pr_err("Memory allocation failed when allocating for secure sram context\n");
+ omap3_secure_ram_context = OMAP3_SECURE_RAM_CTX_ADDR;
local_irq_disable();
diff --git a/arch/arm/mach-omap2/sdram-toshiba-hynix-numonyx.h b/arch/arm/mach-omap2/sdram-toshiba-hynix-numonyx.h
index c7acdb8312d..fe835c96b7d 100644
--- a/arch/arm/mach-omap2/sdram-toshiba-hynix-numonyx.h
+++ b/arch/arm/mach-omap2/sdram-toshiba-hynix-numonyx.h
@@ -17,43 +17,43 @@
static struct omap_sdrc_params JEDEC_JESD209A_sdrc_params[] = {
[0] = {
.rate = 200000000,
- .actim_ctrla = 0xE2E1B4C6,
- .actim_ctrlb = 0x00022228,
+ .actim_ctrla = 0x7ae1b4c6,
+ .actim_ctrlb = 0x00021217,
.rfr_ctrl = 0x0005E602,
.mr = 0x00000032,
},
[1] = {
.rate = 100000000,
- .actim_ctrla = 0x7211B485,
- .actim_ctrlb = 0x00022214,
+ .actim_ctrla = 0x41912286,
+ .actim_ctrlb = 0x0001110c,
.rfr_ctrl = 0x0002DA02,
.mr = 0x00000032,
},
[2] = {
.rate = 166000000,
- .actim_ctrla = 0xE2E1B4C6,
- .actim_ctrlb = 0x00022228,
+ .actim_ctrla = 0x6A9DB4C6,
+ .actim_ctrlb = 0x00021214,
.rfr_ctrl = 0x0004DD02,
.mr = 0x00000032,
},
[3] = {
.rate = 83000000,
- .actim_ctrla = 0x7215B485,
- .actim_ctrlb = 0x00022214,
+ .actim_ctrla = 0x39512286,
+ .actim_ctrlb = 0x0001110C,
.rfr_ctrl = 0x00025602,
.mr = 0x00000032,
},
[4] = {
.rate = 160000000,
- .actim_ctrla = 0xBA9DB4C6,
- .actim_ctrlb = 0x00022220,
+ .actim_ctrla = 0x625DB4C6,
+ .actim_ctrlb = 0x00021213,
.rfr_ctrl = 0x0004AE02,
.mr = 0x00000032,
},
[5] = {
.rate = 80000000,
- .actim_ctrla = 0x49512284,
- .actim_ctrlb = 0x0001120C,
+ .actim_ctrla = 0x31512284,
+ .actim_ctrlb = 0x0001110C,
.rfr_ctrl = 0x23E02,
.mr = 0x00000032,
},