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: Olof Johansson <olof@lixom.net>
This commit is contained in:
Коммит
e3db2217f3
|
@ -499,23 +499,23 @@
|
||||||
};
|
};
|
||||||
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 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* 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
|
||||||
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
|
||||||
#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);
|
||||||
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 @@
|
||||||
#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 @@
|
||||||
|
|
||||||
/* 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
|
||||||
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 @@
|
||||||
#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)
|
||||||
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 @@
|
||||||
|
|
||||||
#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)
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче