Merge branch 'sched_clock-for-rmk' of git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms into devel-stable
This commit is contained in:
@@ -51,9 +51,6 @@ config MIGHT_HAVE_PCI
|
|||||||
config SYS_SUPPORTS_APM_EMULATION
|
config SYS_SUPPORTS_APM_EMULATION
|
||||||
bool
|
bool
|
||||||
|
|
||||||
config HAVE_SCHED_CLOCK
|
|
||||||
bool
|
|
||||||
|
|
||||||
config GENERIC_GPIO
|
config GENERIC_GPIO
|
||||||
bool
|
bool
|
||||||
|
|
||||||
@@ -438,7 +435,6 @@ config ARCH_MXC
|
|||||||
select CLKDEV_LOOKUP
|
select CLKDEV_LOOKUP
|
||||||
select CLKSRC_MMIO
|
select CLKSRC_MMIO
|
||||||
select GENERIC_IRQ_CHIP
|
select GENERIC_IRQ_CHIP
|
||||||
select HAVE_SCHED_CLOCK
|
|
||||||
select MULTI_IRQ_HANDLER
|
select MULTI_IRQ_HANDLER
|
||||||
help
|
help
|
||||||
Support for Freescale MXC/iMX-based family of processors
|
Support for Freescale MXC/iMX-based family of processors
|
||||||
@@ -530,7 +526,6 @@ config ARCH_IXP4XX
|
|||||||
select CPU_XSCALE
|
select CPU_XSCALE
|
||||||
select GENERIC_GPIO
|
select GENERIC_GPIO
|
||||||
select GENERIC_CLOCKEVENTS
|
select GENERIC_CLOCKEVENTS
|
||||||
select HAVE_SCHED_CLOCK
|
|
||||||
select MIGHT_HAVE_PCI
|
select MIGHT_HAVE_PCI
|
||||||
select DMABOUNCE if PCI
|
select DMABOUNCE if PCI
|
||||||
help
|
help
|
||||||
@@ -601,7 +596,6 @@ config ARCH_MMP
|
|||||||
select CLKDEV_LOOKUP
|
select CLKDEV_LOOKUP
|
||||||
select GENERIC_CLOCKEVENTS
|
select GENERIC_CLOCKEVENTS
|
||||||
select GPIO_PXA
|
select GPIO_PXA
|
||||||
select HAVE_SCHED_CLOCK
|
|
||||||
select TICK_ONESHOT
|
select TICK_ONESHOT
|
||||||
select PLAT_PXA
|
select PLAT_PXA
|
||||||
select SPARSE_IRQ
|
select SPARSE_IRQ
|
||||||
@@ -642,7 +636,6 @@ config ARCH_TEGRA
|
|||||||
select GENERIC_CLOCKEVENTS
|
select GENERIC_CLOCKEVENTS
|
||||||
select GENERIC_GPIO
|
select GENERIC_GPIO
|
||||||
select HAVE_CLK
|
select HAVE_CLK
|
||||||
select HAVE_SCHED_CLOCK
|
|
||||||
select HAVE_SMP
|
select HAVE_SMP
|
||||||
select MIGHT_HAVE_CACHE_L2X0
|
select MIGHT_HAVE_CACHE_L2X0
|
||||||
select ARCH_HAS_CPUFREQ
|
select ARCH_HAS_CPUFREQ
|
||||||
@@ -659,7 +652,6 @@ config ARCH_PICOXCELL
|
|||||||
select DW_APB_TIMER
|
select DW_APB_TIMER
|
||||||
select GENERIC_CLOCKEVENTS
|
select GENERIC_CLOCKEVENTS
|
||||||
select GENERIC_GPIO
|
select GENERIC_GPIO
|
||||||
select HAVE_SCHED_CLOCK
|
|
||||||
select HAVE_TCM
|
select HAVE_TCM
|
||||||
select NO_IOPORT
|
select NO_IOPORT
|
||||||
select SPARSE_IRQ
|
select SPARSE_IRQ
|
||||||
@@ -687,7 +679,6 @@ config ARCH_PXA
|
|||||||
select ARCH_REQUIRE_GPIOLIB
|
select ARCH_REQUIRE_GPIOLIB
|
||||||
select GENERIC_CLOCKEVENTS
|
select GENERIC_CLOCKEVENTS
|
||||||
select GPIO_PXA
|
select GPIO_PXA
|
||||||
select HAVE_SCHED_CLOCK
|
|
||||||
select TICK_ONESHOT
|
select TICK_ONESHOT
|
||||||
select PLAT_PXA
|
select PLAT_PXA
|
||||||
select SPARSE_IRQ
|
select SPARSE_IRQ
|
||||||
@@ -755,7 +746,6 @@ config ARCH_SA1100
|
|||||||
select CPU_FREQ
|
select CPU_FREQ
|
||||||
select GENERIC_CLOCKEVENTS
|
select GENERIC_CLOCKEVENTS
|
||||||
select CLKDEV_LOOKUP
|
select CLKDEV_LOOKUP
|
||||||
select HAVE_SCHED_CLOCK
|
|
||||||
select TICK_ONESHOT
|
select TICK_ONESHOT
|
||||||
select ARCH_REQUIRE_GPIOLIB
|
select ARCH_REQUIRE_GPIOLIB
|
||||||
select HAVE_IDE
|
select HAVE_IDE
|
||||||
@@ -812,7 +802,6 @@ config ARCH_S5P64X0
|
|||||||
select CLKSRC_MMIO
|
select CLKSRC_MMIO
|
||||||
select HAVE_S3C2410_WATCHDOG if WATCHDOG
|
select HAVE_S3C2410_WATCHDOG if WATCHDOG
|
||||||
select GENERIC_CLOCKEVENTS
|
select GENERIC_CLOCKEVENTS
|
||||||
select HAVE_SCHED_CLOCK
|
|
||||||
select HAVE_S3C2410_I2C if I2C
|
select HAVE_S3C2410_I2C if I2C
|
||||||
select HAVE_S3C_RTC if RTC_CLASS
|
select HAVE_S3C_RTC if RTC_CLASS
|
||||||
help
|
help
|
||||||
@@ -845,7 +834,6 @@ config ARCH_S5PV210
|
|||||||
select ARM_L1_CACHE_SHIFT_6
|
select ARM_L1_CACHE_SHIFT_6
|
||||||
select ARCH_HAS_CPUFREQ
|
select ARCH_HAS_CPUFREQ
|
||||||
select GENERIC_CLOCKEVENTS
|
select GENERIC_CLOCKEVENTS
|
||||||
select HAVE_SCHED_CLOCK
|
|
||||||
select HAVE_S3C2410_I2C if I2C
|
select HAVE_S3C2410_I2C if I2C
|
||||||
select HAVE_S3C_RTC if RTC_CLASS
|
select HAVE_S3C_RTC if RTC_CLASS
|
||||||
select HAVE_S3C2410_WATCHDOG if WATCHDOG
|
select HAVE_S3C2410_WATCHDOG if WATCHDOG
|
||||||
@@ -888,7 +876,6 @@ config ARCH_U300
|
|||||||
depends on MMU
|
depends on MMU
|
||||||
select CLKSRC_MMIO
|
select CLKSRC_MMIO
|
||||||
select CPU_ARM926T
|
select CPU_ARM926T
|
||||||
select HAVE_SCHED_CLOCK
|
|
||||||
select HAVE_TCM
|
select HAVE_TCM
|
||||||
select ARM_AMBA
|
select ARM_AMBA
|
||||||
select ARM_PATCH_PHYS_VIRT
|
select ARM_PATCH_PHYS_VIRT
|
||||||
@@ -946,7 +933,6 @@ config ARCH_OMAP
|
|||||||
select ARCH_HAS_CPUFREQ
|
select ARCH_HAS_CPUFREQ
|
||||||
select CLKSRC_MMIO
|
select CLKSRC_MMIO
|
||||||
select GENERIC_CLOCKEVENTS
|
select GENERIC_CLOCKEVENTS
|
||||||
select HAVE_SCHED_CLOCK
|
|
||||||
select ARCH_HAS_HOLES_MEMORYMODEL
|
select ARCH_HAS_HOLES_MEMORYMODEL
|
||||||
help
|
help
|
||||||
Support for TI's OMAP platform (OMAP1/2/3/4).
|
Support for TI's OMAP platform (OMAP1/2/3/4).
|
||||||
@@ -1112,13 +1098,11 @@ config ARCH_ACORN
|
|||||||
config PLAT_IOP
|
config PLAT_IOP
|
||||||
bool
|
bool
|
||||||
select GENERIC_CLOCKEVENTS
|
select GENERIC_CLOCKEVENTS
|
||||||
select HAVE_SCHED_CLOCK
|
|
||||||
|
|
||||||
config PLAT_ORION
|
config PLAT_ORION
|
||||||
bool
|
bool
|
||||||
select CLKSRC_MMIO
|
select CLKSRC_MMIO
|
||||||
select GENERIC_IRQ_CHIP
|
select GENERIC_IRQ_CHIP
|
||||||
select HAVE_SCHED_CLOCK
|
|
||||||
|
|
||||||
config PLAT_PXA
|
config PLAT_PXA
|
||||||
bool
|
bool
|
||||||
|
@@ -14,8 +14,8 @@ CFLAGS_REMOVE_return_address.o = -pg
|
|||||||
# Object file lists.
|
# Object file lists.
|
||||||
|
|
||||||
obj-y := elf.o entry-armv.o entry-common.o irq.o opcodes.o \
|
obj-y := elf.o entry-armv.o entry-common.o irq.o opcodes.o \
|
||||||
process.o ptrace.o return_address.o setup.o signal.o \
|
process.o ptrace.o return_address.o sched_clock.o \
|
||||||
sys_arm.o stacktrace.o time.o traps.o
|
setup.o signal.o stacktrace.o sys_arm.o time.o traps.o
|
||||||
|
|
||||||
obj-$(CONFIG_DEPRECATED_PARAM_STRUCT) += compat.o
|
obj-$(CONFIG_DEPRECATED_PARAM_STRUCT) += compat.o
|
||||||
|
|
||||||
@@ -30,7 +30,6 @@ obj-$(CONFIG_ARTHUR) += arthur.o
|
|||||||
obj-$(CONFIG_ISA_DMA) += dma-isa.o
|
obj-$(CONFIG_ISA_DMA) += dma-isa.o
|
||||||
obj-$(CONFIG_PCI) += bios32.o isa.o
|
obj-$(CONFIG_PCI) += bios32.o isa.o
|
||||||
obj-$(CONFIG_ARM_CPU_SUSPEND) += sleep.o suspend.o
|
obj-$(CONFIG_ARM_CPU_SUSPEND) += sleep.o suspend.o
|
||||||
obj-$(CONFIG_HAVE_SCHED_CLOCK) += sched_clock.o
|
|
||||||
obj-$(CONFIG_SMP) += smp.o smp_tlb.o
|
obj-$(CONFIG_SMP) += smp.o smp_tlb.o
|
||||||
obj-$(CONFIG_HAVE_ARM_SCU) += smp_scu.o
|
obj-$(CONFIG_HAVE_ARM_SCU) += smp_scu.o
|
||||||
obj-$(CONFIG_HAVE_ARM_TWD) += smp_twd.o
|
obj-$(CONFIG_HAVE_ARM_TWD) += smp_twd.o
|
||||||
|
@@ -147,8 +147,6 @@ void __init time_init(void)
|
|||||||
{
|
{
|
||||||
system_timer = machine_desc->timer;
|
system_timer = machine_desc->timer;
|
||||||
system_timer->init();
|
system_timer->init();
|
||||||
#ifdef CONFIG_HAVE_SCHED_CLOCK
|
|
||||||
sched_clock_postinit();
|
sched_clock_postinit();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -19,11 +19,14 @@
|
|||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
#include <asm/sched_clock.h>
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
#include <asm/mach/time.h>
|
#include <asm/mach/time.h>
|
||||||
|
|
||||||
#include <mach/cputype.h>
|
#include <mach/cputype.h>
|
||||||
|
#include <mach/hardware.h>
|
||||||
#include <mach/time.h>
|
#include <mach/time.h>
|
||||||
|
|
||||||
#include "clock.h"
|
#include "clock.h"
|
||||||
|
|
||||||
static struct clock_event_device clockevent_davinci;
|
static struct clock_event_device clockevent_davinci;
|
||||||
@@ -272,19 +275,9 @@ static cycle_t read_cycles(struct clocksource *cs)
|
|||||||
return (cycles_t)timer32_read(t);
|
return (cycles_t)timer32_read(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Kernel assumes that sched_clock can be called early but may not have
|
|
||||||
* things ready yet.
|
|
||||||
*/
|
|
||||||
static cycle_t read_dummy(struct clocksource *cs)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static struct clocksource clocksource_davinci = {
|
static struct clocksource clocksource_davinci = {
|
||||||
.rating = 300,
|
.rating = 300,
|
||||||
.read = read_dummy,
|
.read = read_cycles,
|
||||||
.mask = CLOCKSOURCE_MASK(32),
|
.mask = CLOCKSOURCE_MASK(32),
|
||||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||||
};
|
};
|
||||||
@@ -292,12 +285,9 @@ static struct clocksource clocksource_davinci = {
|
|||||||
/*
|
/*
|
||||||
* Overwrite weak default sched_clock with something more precise
|
* Overwrite weak default sched_clock with something more precise
|
||||||
*/
|
*/
|
||||||
unsigned long long notrace sched_clock(void)
|
static u32 notrace davinci_read_sched_clock(void)
|
||||||
{
|
{
|
||||||
const cycle_t cyc = clocksource_davinci.read(&clocksource_davinci);
|
return timer32_read(&timers[TID_CLOCKSOURCE]);
|
||||||
|
|
||||||
return clocksource_cyc2ns(cyc, clocksource_davinci.mult,
|
|
||||||
clocksource_davinci.shift);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -397,12 +387,14 @@ static void __init davinci_timer_init(void)
|
|||||||
davinci_clock_tick_rate = clk_get_rate(timer_clk);
|
davinci_clock_tick_rate = clk_get_rate(timer_clk);
|
||||||
|
|
||||||
/* setup clocksource */
|
/* setup clocksource */
|
||||||
clocksource_davinci.read = read_cycles;
|
|
||||||
clocksource_davinci.name = id_to_name[clocksource_id];
|
clocksource_davinci.name = id_to_name[clocksource_id];
|
||||||
if (clocksource_register_hz(&clocksource_davinci,
|
if (clocksource_register_hz(&clocksource_davinci,
|
||||||
davinci_clock_tick_rate))
|
davinci_clock_tick_rate))
|
||||||
printk(err, clocksource_davinci.name);
|
printk(err, clocksource_davinci.name);
|
||||||
|
|
||||||
|
setup_sched_clock(davinci_read_sched_clock, 32,
|
||||||
|
davinci_clock_tick_rate);
|
||||||
|
|
||||||
/* setup clockevent */
|
/* setup clockevent */
|
||||||
clockevent_davinci.name = id_to_name[timers[TID_CLOCKEVENT].id];
|
clockevent_davinci.name = id_to_name[timers[TID_CLOCKEVENT].id];
|
||||||
clockevent_davinci.mult = div_sc(davinci_clock_tick_rate, NSEC_PER_SEC,
|
clockevent_davinci.mult = div_sc(davinci_clock_tick_rate, NSEC_PER_SEC,
|
||||||
|
@@ -18,6 +18,7 @@
|
|||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
#include <mach/map.h>
|
#include <mach/map.h>
|
||||||
|
#include <asm/sched_clock.h>
|
||||||
#include <asm/mach/time.h>
|
#include <asm/mach/time.h>
|
||||||
|
|
||||||
#define SIRFSOC_TIMER_COUNTER_LO 0x0000
|
#define SIRFSOC_TIMER_COUNTER_LO 0x0000
|
||||||
@@ -165,21 +166,9 @@ static struct irqaction sirfsoc_timer_irq = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* Overwrite weak default sched_clock with more precise one */
|
/* Overwrite weak default sched_clock with more precise one */
|
||||||
unsigned long long notrace sched_clock(void)
|
static u32 notrace sirfsoc_read_sched_clock(void)
|
||||||
{
|
{
|
||||||
static int is_mapped;
|
return (u32)(sirfsoc_timer_read(NULL) & 0xffffffff);
|
||||||
|
|
||||||
/*
|
|
||||||
* sched_clock is called earlier than .init of sys_timer
|
|
||||||
* if we map timer memory in .init of sys_timer, system
|
|
||||||
* will panic due to illegal memory access
|
|
||||||
*/
|
|
||||||
if (!is_mapped) {
|
|
||||||
sirfsoc_of_timer_map();
|
|
||||||
is_mapped = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sirfsoc_timer_read(NULL) * (NSEC_PER_SEC / CLOCK_TICK_RATE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init sirfsoc_clockevent_init(void)
|
static void __init sirfsoc_clockevent_init(void)
|
||||||
@@ -210,6 +199,8 @@ static void __init sirfsoc_timer_init(void)
|
|||||||
BUG_ON(rate < CLOCK_TICK_RATE);
|
BUG_ON(rate < CLOCK_TICK_RATE);
|
||||||
BUG_ON(rate % CLOCK_TICK_RATE);
|
BUG_ON(rate % CLOCK_TICK_RATE);
|
||||||
|
|
||||||
|
sirfsoc_of_timer_map();
|
||||||
|
|
||||||
writel_relaxed(rate / CLOCK_TICK_RATE / 2 - 1, sirfsoc_timer_base + SIRFSOC_TIMER_DIV);
|
writel_relaxed(rate / CLOCK_TICK_RATE / 2 - 1, sirfsoc_timer_base + SIRFSOC_TIMER_DIV);
|
||||||
writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_LO);
|
writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_LO);
|
||||||
writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_HI);
|
writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_HI);
|
||||||
@@ -217,6 +208,8 @@ static void __init sirfsoc_timer_init(void)
|
|||||||
|
|
||||||
BUG_ON(clocksource_register_hz(&sirfsoc_clocksource, CLOCK_TICK_RATE));
|
BUG_ON(clocksource_register_hz(&sirfsoc_clocksource, CLOCK_TICK_RATE));
|
||||||
|
|
||||||
|
setup_sched_clock(sirfsoc_read_sched_clock, 32, CLOCK_TICK_RATE);
|
||||||
|
|
||||||
BUG_ON(setup_irq(sirfsoc_timer_irq.irq, &sirfsoc_timer_irq));
|
BUG_ON(setup_irq(sirfsoc_timer_irq.irq, &sirfsoc_timer_irq));
|
||||||
|
|
||||||
sirfsoc_clockevent_init();
|
sirfsoc_clockevent_init();
|
||||||
|
@@ -23,7 +23,6 @@ config HAS_MTU
|
|||||||
config NOMADIK_MTU_SCHED_CLOCK
|
config NOMADIK_MTU_SCHED_CLOCK
|
||||||
bool
|
bool
|
||||||
depends on HAS_MTU
|
depends on HAS_MTU
|
||||||
select HAVE_SCHED_CLOCK
|
|
||||||
help
|
help
|
||||||
Use the Multi Timer Unit as the sched_clock.
|
Use the Multi Timer Unit as the sched_clock.
|
||||||
|
|
||||||
|
@@ -12,6 +12,5 @@ config PLAT_VERSATILE_LEDS
|
|||||||
|
|
||||||
config PLAT_VERSATILE_SCHED_CLOCK
|
config PLAT_VERSATILE_SCHED_CLOCK
|
||||||
def_bool y if !ARCH_INTEGRATOR_AP
|
def_bool y if !ARCH_INTEGRATOR_AP
|
||||||
select HAVE_SCHED_CLOCK
|
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
Reference in New Issue
Block a user