Commit e3db2217 authored by Olof Johansson's avatar Olof Johansson

Merge tag 'omap-for-v3.19/fixes-rc1' of...

Merge tag 'omap-for-v3.19/fixes-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into fixes

Merge "omap fixes against v3.19-rc1" from Tony Lindgren:

Fixes for omaps mostly to deal with dra7 timer issues
and hypervisor mode. The other fixes are minor fixes for
various boards. The summary of the fixes is:

- Fix real-time counter rate typos for some frequencies
- Fix counter frequency drift for am572x
- Fix booting of secondary CPU in HYP mode
- Fix n900 board name for legacy user space
- Fix cpufreq in omap2plus_defconfig after Kconfig change
- Fix dra7 qspi partitions

And also, let's re-enable smc91x on some n900 boards that
we have sitting in a few test boot systems after the boot
loader dependencies got fixed.

* tag 'omap-for-v3.19/fixes-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap:
  ARM: dts: Revert disabling of smc91x for n900
  ARM: dts: dra7-evm: fix qspi device tree partition size
  ARM: omap2plus_defconfig: use CONFIG_CPUFREQ_DT
  ARM: OMAP2+: Fix n900 board name for legacy user space
  ARM: omap5/dra7xx: Enable booting secondary CPU in HYP mode
  ARM: dra7xx: Fix counter frequency drift for AM572x errata i856
  ARM: omap5/dra7xx: Fix frequency typos
Signed-off-by: default avatarOlof Johansson <olof@lixom.net>
parents 3be81429 7ac72746
...@@ -499,23 +499,23 @@ partition@4 { ...@@ -499,23 +499,23 @@ partition@4 {
}; };
partition@5 { partition@5 {
label = "QSPI.u-boot-spl-os"; label = "QSPI.u-boot-spl-os";
reg = <0x00140000 0x00010000>; reg = <0x00140000 0x00080000>;
}; };
partition@6 { partition@6 {
label = "QSPI.u-boot-env"; label = "QSPI.u-boot-env";
reg = <0x00150000 0x00010000>; reg = <0x001c0000 0x00010000>;
}; };
partition@7 { partition@7 {
label = "QSPI.u-boot-env.backup1"; label = "QSPI.u-boot-env.backup1";
reg = <0x00160000 0x0010000>; reg = <0x001d0000 0x0010000>;
}; };
partition@8 { partition@8 {
label = "QSPI.kernel"; label = "QSPI.kernel";
reg = <0x00170000 0x0800000>; reg = <0x001e0000 0x0800000>;
}; };
partition@9 { partition@9 {
label = "QSPI.file-system"; label = "QSPI.file-system";
reg = <0x00970000 0x01690000>; reg = <0x009e0000 0x01620000>;
}; };
}; };
}; };
......
...@@ -700,11 +700,9 @@ partition@5 { ...@@ -700,11 +700,9 @@ partition@5 {
}; };
}; };
/* Ethernet is on some early development boards and qemu */
ethernet@gpmc { ethernet@gpmc {
compatible = "smsc,lan91c94"; compatible = "smsc,lan91c94";
status = "disabled";
interrupt-parent = <&gpio2>; interrupt-parent = <&gpio2>;
interrupts = <22 IRQ_TYPE_LEVEL_HIGH>; /* gpio54 */ interrupts = <22 IRQ_TYPE_LEVEL_HIGH>; /* gpio54 */
reg = <1 0x300 0xf>; /* 16 byte IO range at offset 0x300 */ reg = <1 0x300 0xf>; /* 16 byte IO range at offset 0x300 */
......
...@@ -68,7 +68,7 @@ CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y ...@@ -68,7 +68,7 @@ CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y
CONFIG_CPU_FREQ_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_USERSPACE=y
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
CONFIG_GENERIC_CPUFREQ_CPU0=y CONFIG_CPUFREQ_DT=y
# CONFIG_ARM_OMAP2PLUS_CPUFREQ is not set # CONFIG_ARM_OMAP2PLUS_CPUFREQ is not set
CONFIG_CPU_IDLE=y CONFIG_CPU_IDLE=y
CONFIG_BINFMT_MISC=y CONFIG_BINFMT_MISC=y
......
...@@ -77,6 +77,24 @@ MACHINE_END ...@@ -77,6 +77,24 @@ MACHINE_END
#endif #endif
#ifdef CONFIG_ARCH_OMAP3 #ifdef CONFIG_ARCH_OMAP3
/* Some boards need board name for legacy userspace in /proc/cpuinfo */
static const char *const n900_boards_compat[] __initconst = {
"nokia,omap3-n900",
NULL,
};
DT_MACHINE_START(OMAP3_N900_DT, "Nokia RX-51 board")
.reserve = omap_reserve,
.map_io = omap3_map_io,
.init_early = omap3430_init_early,
.init_machine = omap_generic_init,
.init_late = omap3_init_late,
.init_time = omap3_sync32k_timer_init,
.dt_compat = n900_boards_compat,
.restart = omap3xxx_restart,
MACHINE_END
/* Generic omap3 boards, most boards can use these */
static const char *const omap3_boards_compat[] __initconst = { static const char *const omap3_boards_compat[] __initconst = {
"ti,omap3430", "ti,omap3430",
"ti,omap3", "ti,omap3",
......
...@@ -249,6 +249,7 @@ extern void omap4_cpu_die(unsigned int cpu); ...@@ -249,6 +249,7 @@ extern void omap4_cpu_die(unsigned int cpu);
extern struct smp_operations omap4_smp_ops; extern struct smp_operations omap4_smp_ops;
extern void omap5_secondary_startup(void); extern void omap5_secondary_startup(void);
extern void omap5_secondary_hyp_startup(void);
#endif #endif
#if defined(CONFIG_SMP) && defined(CONFIG_PM) #if defined(CONFIG_SMP) && defined(CONFIG_PM)
......
...@@ -286,6 +286,10 @@ ...@@ -286,6 +286,10 @@
#define OMAP5XXX_CONTROL_STATUS 0x134 #define OMAP5XXX_CONTROL_STATUS 0x134
#define OMAP5_DEVICETYPE_MASK (0x7 << 6) #define OMAP5_DEVICETYPE_MASK (0x7 << 6)
/* DRA7XX CONTROL CORE BOOTSTRAP */
#define DRA7_CTRL_CORE_BOOTSTRAP 0x6c4
#define DRA7_SPEEDSELECT_MASK (0x3 << 8)
/* /*
* REVISIT: This list of registers is not comprehensive - there are more * REVISIT: This list of registers is not comprehensive - there are more
* that should be added. * that should be added.
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
/* Physical address needed since MMU not enabled yet on secondary core */ /* Physical address needed since MMU not enabled yet on secondary core */
#define AUX_CORE_BOOT0_PA 0x48281800 #define AUX_CORE_BOOT0_PA 0x48281800
#define API_HYP_ENTRY 0x102
/* /*
* OMAP5 specific entry point for secondary CPU to jump from ROM * OMAP5 specific entry point for secondary CPU to jump from ROM
...@@ -40,6 +41,26 @@ wait: ldr r2, =AUX_CORE_BOOT0_PA @ read from AuxCoreBoot0 ...@@ -40,6 +41,26 @@ wait: ldr r2, =AUX_CORE_BOOT0_PA @ read from AuxCoreBoot0
bne wait bne wait
b secondary_startup b secondary_startup
ENDPROC(omap5_secondary_startup) ENDPROC(omap5_secondary_startup)
/*
* Same as omap5_secondary_startup except we call into the ROM to
* enable HYP mode first. This is called instead of
* omap5_secondary_startup if the primary CPU was put into HYP mode by
* the boot loader.
*/
ENTRY(omap5_secondary_hyp_startup)
wait_2: ldr r2, =AUX_CORE_BOOT0_PA @ read from AuxCoreBoot0
ldr r0, [r2]
mov r0, r0, lsr #5
mrc p15, 0, r4, c0, c0, 5
and r4, r4, #0x0f
cmp r0, r4
bne wait_2
ldr r12, =API_HYP_ENTRY
adr r0, hyp_boot
smc #0
hyp_boot:
b secondary_startup
ENDPROC(omap5_secondary_hyp_startup)
/* /*
* OMAP4 specific entry point for secondary CPU to jump from ROM * OMAP4 specific entry point for secondary CPU to jump from ROM
* code. This routine also provides a holding flag into which * code. This routine also provides a holding flag into which
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <linux/irqchip/arm-gic.h> #include <linux/irqchip/arm-gic.h>
#include <asm/smp_scu.h> #include <asm/smp_scu.h>
#include <asm/virt.h>
#include "omap-secure.h" #include "omap-secure.h"
#include "omap-wakeupgen.h" #include "omap-wakeupgen.h"
...@@ -227,8 +228,16 @@ static void __init omap4_smp_prepare_cpus(unsigned int max_cpus) ...@@ -227,8 +228,16 @@ static void __init omap4_smp_prepare_cpus(unsigned int max_cpus)
if (omap_secure_apis_support()) if (omap_secure_apis_support())
omap_auxcoreboot_addr(virt_to_phys(startup_addr)); omap_auxcoreboot_addr(virt_to_phys(startup_addr));
else else
writel_relaxed(virt_to_phys(omap5_secondary_startup), /*
base + OMAP_AUX_CORE_BOOT_1); * If the boot CPU is in HYP mode then start secondary
* CPU in HYP mode as well.
*/
if ((__boot_cpu_mode & MODE_MASK) == HYP_MODE)
writel_relaxed(virt_to_phys(omap5_secondary_hyp_startup),
base + OMAP_AUX_CORE_BOOT_1);
else
writel_relaxed(virt_to_phys(omap5_secondary_startup),
base + OMAP_AUX_CORE_BOOT_1);
} }
......
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
#include "soc.h" #include "soc.h"
#include "common.h" #include "common.h"
#include "control.h"
#include "powerdomain.h" #include "powerdomain.h"
#include "omap-secure.h" #include "omap-secure.h"
...@@ -496,7 +497,8 @@ static void __init realtime_counter_init(void) ...@@ -496,7 +497,8 @@ static void __init realtime_counter_init(void)
void __iomem *base; void __iomem *base;
static struct clk *sys_clk; static struct clk *sys_clk;
unsigned long rate; unsigned long rate;
unsigned int reg, num, den; unsigned int reg;
unsigned long long num, den;
base = ioremap(REALTIME_COUNTER_BASE, SZ_32); base = ioremap(REALTIME_COUNTER_BASE, SZ_32);
if (!base) { if (!base) {
...@@ -511,13 +513,42 @@ static void __init realtime_counter_init(void) ...@@ -511,13 +513,42 @@ static void __init realtime_counter_init(void)
} }
rate = clk_get_rate(sys_clk); rate = clk_get_rate(sys_clk);
if (soc_is_dra7xx()) {
/*
* Errata i856 says the 32.768KHz crystal does not start at
* power on, so the CPU falls back to an emulated 32KHz clock
* based on sysclk / 610 instead. This causes the master counter
* frequency to not be 6.144MHz but at sysclk / 610 * 375 / 2
* (OR sysclk * 75 / 244)
*
* This affects at least the DRA7/AM572x 1.0, 1.1 revisions.
* Of course any board built without a populated 32.768KHz
* crystal would also need this fix even if the CPU is fixed
* later.
*
* Either case can be detected by using the two speedselect bits
* If they are not 0, then the 32.768KHz clock driving the
* coarse counter that corrects the fine counter every time it
* ticks is actually rate/610 rather than 32.768KHz and we
* should compensate to avoid the 570ppm (at 20MHz, much worse
* at other rates) too fast system time.
*/
reg = omap_ctrl_readl(DRA7_CTRL_CORE_BOOTSTRAP);
if (reg & DRA7_SPEEDSELECT_MASK) {
num = 75;
den = 244;
goto sysclk1_based;
}
}
/* Numerator/denumerator values refer TRM Realtime Counter section */ /* Numerator/denumerator values refer TRM Realtime Counter section */
switch (rate) { switch (rate) {
case 1200000: case 12000000:
num = 64; num = 64;
den = 125; den = 125;
break; break;
case 1300000: case 13000000:
num = 768; num = 768;
den = 1625; den = 1625;
break; break;
...@@ -529,11 +560,11 @@ static void __init realtime_counter_init(void) ...@@ -529,11 +560,11 @@ static void __init realtime_counter_init(void)
num = 192; num = 192;
den = 625; den = 625;
break; break;
case 2600000: case 26000000:
num = 384; num = 384;
den = 1625; den = 1625;
break; break;
case 2700000: case 27000000:
num = 256; num = 256;
den = 1125; den = 1125;
break; break;
...@@ -545,6 +576,7 @@ static void __init realtime_counter_init(void) ...@@ -545,6 +576,7 @@ static void __init realtime_counter_init(void)
break; break;
} }
sysclk1_based:
/* Program numerator and denumerator registers */ /* Program numerator and denumerator registers */
reg = readl_relaxed(base + INCREMENTER_NUMERATOR_OFFSET) & reg = readl_relaxed(base + INCREMENTER_NUMERATOR_OFFSET) &
NUMERATOR_DENUMERATOR_MASK; NUMERATOR_DENUMERATOR_MASK;
...@@ -556,7 +588,7 @@ static void __init realtime_counter_init(void) ...@@ -556,7 +588,7 @@ static void __init realtime_counter_init(void)
reg |= den; reg |= den;
writel_relaxed(reg, base + INCREMENTER_DENUMERATOR_RELOAD_OFFSET); writel_relaxed(reg, base + INCREMENTER_DENUMERATOR_RELOAD_OFFSET);
arch_timer_freq = (rate / den) * num; arch_timer_freq = DIV_ROUND_UP_ULL(rate * num, den);
set_cntfreq(); set_cntfreq();
iounmap(base); iounmap(base);
......
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