Merge branch 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull timer fixes from Ingo Molnar: "Five self-contained fixlets: - fix clocksource driver build bug - fix two sched_clock() bugs triggering on specific hardware - fix devicetree enumeration bug affecting specific hardware - fix irq handler registration race resulting in boot crash - fix device node refcount bug" * 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: clocksource: dw_apb_timer_of: Fix support for dts binding "snps,dw-apb-timer" clocksource: dw_apb_timer_of: Fix read_sched_clock clocksource: sunxi: Stop timer from ticking before enabling interrupts clocksource: clksrc-of: Do not drop unheld reference on device node clocksource: armada-370-xp: Register sched_clock after the counter reset clocksource: time-efm32: Select CLKSRC_MMIO
This commit is contained in:
@@ -75,6 +75,7 @@ config CLKSRC_DBX500_PRCMU_SCHED_CLOCK
|
|||||||
config CLKSRC_EFM32
|
config CLKSRC_EFM32
|
||||||
bool "Clocksource for Energy Micro's EFM32 SoCs" if !ARCH_EFM32
|
bool "Clocksource for Energy Micro's EFM32 SoCs" if !ARCH_EFM32
|
||||||
depends on OF && ARM && (ARCH_EFM32 || COMPILE_TEST)
|
depends on OF && ARM && (ARCH_EFM32 || COMPILE_TEST)
|
||||||
|
select CLKSRC_MMIO
|
||||||
default ARCH_EFM32
|
default ARCH_EFM32
|
||||||
help
|
help
|
||||||
Support to use the timers of EFM32 SoCs as clock source and clock
|
Support to use the timers of EFM32 SoCs as clock source and clock
|
||||||
|
@@ -35,6 +35,5 @@ void __init clocksource_of_init(void)
|
|||||||
|
|
||||||
init_func = match->data;
|
init_func = match->data;
|
||||||
init_func(np);
|
init_func(np);
|
||||||
of_node_put(np);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -108,12 +108,11 @@ static void __init add_clocksource(struct device_node *source_timer)
|
|||||||
|
|
||||||
static u64 read_sched_clock(void)
|
static u64 read_sched_clock(void)
|
||||||
{
|
{
|
||||||
return __raw_readl(sched_io_base);
|
return ~__raw_readl(sched_io_base);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct of_device_id sptimer_ids[] __initconst = {
|
static const struct of_device_id sptimer_ids[] __initconst = {
|
||||||
{ .compatible = "picochip,pc3x2-rtc" },
|
{ .compatible = "picochip,pc3x2-rtc" },
|
||||||
{ .compatible = "snps,dw-apb-timer-sp" },
|
|
||||||
{ /* Sentinel */ },
|
{ /* Sentinel */ },
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -151,4 +150,6 @@ static void __init dw_apb_timer_init(struct device_node *timer)
|
|||||||
num_called++;
|
num_called++;
|
||||||
}
|
}
|
||||||
CLOCKSOURCE_OF_DECLARE(pc3x2_timer, "picochip,pc3x2-timer", dw_apb_timer_init);
|
CLOCKSOURCE_OF_DECLARE(pc3x2_timer, "picochip,pc3x2-timer", dw_apb_timer_init);
|
||||||
CLOCKSOURCE_OF_DECLARE(apb_timer, "snps,dw-apb-timer-osc", dw_apb_timer_init);
|
CLOCKSOURCE_OF_DECLARE(apb_timer_osc, "snps,dw-apb-timer-osc", dw_apb_timer_init);
|
||||||
|
CLOCKSOURCE_OF_DECLARE(apb_timer_sp, "snps,dw-apb-timer-sp", dw_apb_timer_init);
|
||||||
|
CLOCKSOURCE_OF_DECLARE(apb_timer, "snps,dw-apb-timer", dw_apb_timer_init);
|
||||||
|
@@ -179,6 +179,9 @@ static void __init sun4i_timer_init(struct device_node *node)
|
|||||||
writel(TIMER_CTL_CLK_SRC(TIMER_CTL_CLK_SRC_OSC24M),
|
writel(TIMER_CTL_CLK_SRC(TIMER_CTL_CLK_SRC_OSC24M),
|
||||||
timer_base + TIMER_CTL_REG(0));
|
timer_base + TIMER_CTL_REG(0));
|
||||||
|
|
||||||
|
/* Make sure timer is stopped before playing with interrupts */
|
||||||
|
sun4i_clkevt_time_stop(0);
|
||||||
|
|
||||||
ret = setup_irq(irq, &sun4i_timer_irq);
|
ret = setup_irq(irq, &sun4i_timer_irq);
|
||||||
if (ret)
|
if (ret)
|
||||||
pr_warn("failed to setup irq %d\n", irq);
|
pr_warn("failed to setup irq %d\n", irq);
|
||||||
|
@@ -255,11 +255,6 @@ static void __init armada_370_xp_timer_common_init(struct device_node *np)
|
|||||||
|
|
||||||
ticks_per_jiffy = (timer_clk + HZ / 2) / HZ;
|
ticks_per_jiffy = (timer_clk + HZ / 2) / HZ;
|
||||||
|
|
||||||
/*
|
|
||||||
* Set scale and timer for sched_clock.
|
|
||||||
*/
|
|
||||||
sched_clock_register(armada_370_xp_read_sched_clock, 32, timer_clk);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup free-running clocksource timer (interrupts
|
* Setup free-running clocksource timer (interrupts
|
||||||
* disabled).
|
* disabled).
|
||||||
@@ -270,6 +265,11 @@ static void __init armada_370_xp_timer_common_init(struct device_node *np)
|
|||||||
timer_ctrl_clrset(0, TIMER0_EN | TIMER0_RELOAD_EN |
|
timer_ctrl_clrset(0, TIMER0_EN | TIMER0_RELOAD_EN |
|
||||||
TIMER0_DIV(TIMER_DIVIDER_SHIFT));
|
TIMER0_DIV(TIMER_DIVIDER_SHIFT));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set scale and timer for sched_clock.
|
||||||
|
*/
|
||||||
|
sched_clock_register(armada_370_xp_read_sched_clock, 32, timer_clk);
|
||||||
|
|
||||||
clocksource_mmio_init(timer_base + TIMER0_VAL_OFF,
|
clocksource_mmio_init(timer_base + TIMER0_VAL_OFF,
|
||||||
"armada_370_xp_clocksource",
|
"armada_370_xp_clocksource",
|
||||||
timer_clk, 300, 32, clocksource_mmio_readl_down);
|
timer_clk, 300, 32, clocksource_mmio_readl_down);
|
||||||
|
Reference in New Issue
Block a user