You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull timer changes from Ingo Molnar: - ARM clocksource/clockevent improvements and fixes - generic timekeeping updates: TAI fixes/improvements, cleanups - Posix cpu timer cleanups and improvements - dynticks updates: full dynticks bugfixes, optimizations and cleanups * 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (46 commits) clocksource: Timer-sun5i: Switch to sched_clock_register() timekeeping: Remove comment that's mostly out of date rtc-cmos: Add an alarm disable quirk timekeeper: fix comment typo for tk_setup_internals() timekeeping: Fix missing timekeeping_update in suspend path timekeeping: Fix CLOCK_TAI timer/nanosleep delays tick/timekeeping: Call update_wall_time outside the jiffies lock timekeeping: Avoid possible deadlock from clock_was_set_delayed timekeeping: Fix potential lost pv notification of time change timekeeping: Fix lost updates to tai adjustment clocksource: sh_cmt: Add clk_prepare/unprepare support clocksource: bcm_kona_timer: Remove unused bcm_timer_ids clocksource: vt8500: Remove deprecated IRQF_DISABLED clocksource: tegra: Remove deprecated IRQF_DISABLED clocksource: misc drivers: Remove deprecated IRQF_DISABLED clocksource: sh_mtu2: Remove unnecessary platform_set_drvdata() clocksource: sh_tmu: Remove unnecessary platform_set_drvdata() clocksource: armada-370-xp: Enable timer divider only when needed clocksource: clksrc-of: Warn if no clock sources are found clocksource: orion: Switch to sched_clock_register() ...
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
Allwinner SoCs High Speed Timer Controller
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : should be "allwinner,sun5i-a13-hstimer" or
|
||||
"allwinner,sun7i-a20-hstimer"
|
||||
- reg : Specifies base physical address and size of the registers.
|
||||
- interrupts : The interrupts of these timers (2 for the sun5i IP, 4 for the sun7i
|
||||
one)
|
||||
- clocks: phandle to the source clock (usually the AHB clock)
|
||||
|
||||
Example:
|
||||
|
||||
timer@01c60000 {
|
||||
compatible = "allwinner,sun7i-a20-hstimer";
|
||||
reg = <0x01c60000 0x1000>;
|
||||
interrupts = <0 51 1>,
|
||||
<0 52 1>,
|
||||
<0 53 1>,
|
||||
<0 54 1>;
|
||||
clocks = <&ahb1_gates 19>;
|
||||
};
|
||||
@@ -332,5 +332,12 @@
|
||||
clock-frequency = <100000>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
timer@01c60000 {
|
||||
compatible = "allwinner,sun5i-a13-hstimer";
|
||||
reg = <0x01c60000 0x1000>;
|
||||
interrupts = <82>, <83>;
|
||||
clocks = <&ahb_gates 28>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -273,5 +273,12 @@
|
||||
clock-frequency = <100000>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
timer@01c60000 {
|
||||
compatible = "allwinner,sun5i-a13-hstimer";
|
||||
reg = <0x01c60000 0x1000>;
|
||||
interrupts = <82>, <83>;
|
||||
clocks = <&ahb_gates 28>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -395,6 +395,16 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
hstimer@01c60000 {
|
||||
compatible = "allwinner,sun7i-a20-hstimer";
|
||||
reg = <0x01c60000 0x1000>;
|
||||
interrupts = <0 81 1>,
|
||||
<0 82 1>,
|
||||
<0 83 1>,
|
||||
<0 84 1>;
|
||||
clocks = <&ahb_gates 28>;
|
||||
};
|
||||
|
||||
gic: interrupt-controller@01c81000 {
|
||||
compatible = "arm,cortex-a7-gic", "arm,cortex-a15-gic";
|
||||
reg = <0x01c81000 0x1000>,
|
||||
|
||||
@@ -12,3 +12,4 @@ config ARCH_SUNXI
|
||||
select PINCTRL_SUNXI
|
||||
select SPARSE_IRQ
|
||||
select SUN4I_TIMER
|
||||
select SUN5I_HSTIMER
|
||||
|
||||
@@ -37,6 +37,10 @@ config SUN4I_TIMER
|
||||
select CLKSRC_MMIO
|
||||
bool
|
||||
|
||||
config SUN5I_HSTIMER
|
||||
select CLKSRC_MMIO
|
||||
bool
|
||||
|
||||
config VT8500_TIMER
|
||||
bool
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@ obj-$(CONFIG_ARCH_MOXART) += moxart_timer.o
|
||||
obj-$(CONFIG_ARCH_MXS) += mxs_timer.o
|
||||
obj-$(CONFIG_ARCH_PRIMA2) += timer-prima2.o
|
||||
obj-$(CONFIG_SUN4I_TIMER) += sun4i_timer.o
|
||||
obj-$(CONFIG_SUN5I_HSTIMER) += timer-sun5i.o
|
||||
obj-$(CONFIG_ARCH_TEGRA) += tegra20_timer.o
|
||||
obj-$(CONFIG_VT8500_TIMER) += vt8500_timer.o
|
||||
obj-$(CONFIG_ARCH_NSPIRE) += zevio-timer.o
|
||||
|
||||
@@ -202,7 +202,7 @@ static struct clocksource gt_clocksource = {
|
||||
};
|
||||
|
||||
#ifdef CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK
|
||||
static u32 notrace gt_sched_clock_read(void)
|
||||
static u64 notrace gt_sched_clock_read(void)
|
||||
{
|
||||
return gt_counter_read();
|
||||
}
|
||||
@@ -217,7 +217,7 @@ static void __init gt_clocksource_init(void)
|
||||
writel(GT_CONTROL_TIMER_ENABLE, gt_base + GT_CONTROL);
|
||||
|
||||
#ifdef CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK
|
||||
setup_sched_clock(gt_sched_clock_read, 32, gt_clk_rate);
|
||||
sched_clock_register(gt_sched_clock_read, 64, gt_clk_rate);
|
||||
#endif
|
||||
clocksource_register_hz(>_clocksource, gt_clk_rate);
|
||||
}
|
||||
|
||||
@@ -98,12 +98,6 @@ kona_timer_get_counter(void *timer_base, uint32_t *msw, uint32_t *lsw)
|
||||
return;
|
||||
}
|
||||
|
||||
static const struct of_device_id bcm_timer_ids[] __initconst = {
|
||||
{.compatible = "brcm,kona-timer"},
|
||||
{.compatible = "bcm,kona-timer"}, /* deprecated name */
|
||||
{},
|
||||
};
|
||||
|
||||
static void __init kona_timers_init(struct device_node *node)
|
||||
{
|
||||
u32 freq;
|
||||
|
||||
@@ -160,7 +160,7 @@ static cycle_t __ttc_clocksource_read(struct clocksource *cs)
|
||||
TTC_COUNT_VAL_OFFSET);
|
||||
}
|
||||
|
||||
static u32 notrace ttc_sched_clock_read(void)
|
||||
static u64 notrace ttc_sched_clock_read(void)
|
||||
{
|
||||
return __raw_readl(ttc_sched_clock_val_reg);
|
||||
}
|
||||
@@ -308,7 +308,7 @@ static void __init ttc_setup_clocksource(struct clk *clk, void __iomem *base)
|
||||
}
|
||||
|
||||
ttc_sched_clock_val_reg = base + TTC_COUNT_VAL_OFFSET;
|
||||
setup_sched_clock(ttc_sched_clock_read, 16, ttccs->ttc.freq / PRESCALE);
|
||||
sched_clock_register(ttc_sched_clock_read, 16, ttccs->ttc.freq / PRESCALE);
|
||||
}
|
||||
|
||||
static int ttc_rate_change_clockevent_cb(struct notifier_block *nb,
|
||||
@@ -393,8 +393,7 @@ static void __init ttc_setup_clockevent(struct clk *clk,
|
||||
__raw_writel(0x1, ttcce->ttc.base_addr + TTC_IER_OFFSET);
|
||||
|
||||
err = request_irq(irq, ttc_clock_event_interrupt,
|
||||
IRQF_DISABLED | IRQF_TIMER,
|
||||
ttcce->ce.name, ttcce);
|
||||
IRQF_TIMER, ttcce->ce.name, ttcce);
|
||||
if (WARN_ON(err)) {
|
||||
kfree(ttcce);
|
||||
return;
|
||||
|
||||
@@ -28,6 +28,7 @@ void __init clocksource_of_init(void)
|
||||
struct device_node *np;
|
||||
const struct of_device_id *match;
|
||||
clocksource_of_init_fn init_func;
|
||||
unsigned clocksources = 0;
|
||||
|
||||
for_each_matching_node_and_match(np, __clksrc_of_table, &match) {
|
||||
if (!of_device_is_available(np))
|
||||
@@ -35,5 +36,8 @@ void __init clocksource_of_init(void)
|
||||
|
||||
init_func = match->data;
|
||||
init_func(np);
|
||||
clocksources++;
|
||||
}
|
||||
if (!clocksources)
|
||||
pr_crit("%s: no matching clocksources found\n", __func__);
|
||||
}
|
||||
|
||||
@@ -131,7 +131,7 @@ static irqreturn_t mfgpt_tick(int irq, void *dev_id)
|
||||
|
||||
static struct irqaction mfgptirq = {
|
||||
.handler = mfgpt_tick,
|
||||
.flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_TIMER | IRQF_SHARED,
|
||||
.flags = IRQF_NOBALANCING | IRQF_TIMER | IRQF_SHARED,
|
||||
.name = DRV_NAME,
|
||||
};
|
||||
|
||||
|
||||
@@ -243,8 +243,7 @@ dw_apb_clockevent_init(int cpu, const char *name, unsigned rating,
|
||||
dw_ced->irqaction.dev_id = &dw_ced->ced;
|
||||
dw_ced->irqaction.irq = irq;
|
||||
dw_ced->irqaction.flags = IRQF_TIMER | IRQF_IRQPOLL |
|
||||
IRQF_NOBALANCING |
|
||||
IRQF_DISABLED;
|
||||
IRQF_NOBALANCING;
|
||||
|
||||
dw_ced->eoi = apbt_eoi;
|
||||
err = setup_irq(irq, &dw_ced->irqaction);
|
||||
|
||||
@@ -187,7 +187,7 @@ static irqreturn_t nmdk_timer_interrupt(int irq, void *dev_id)
|
||||
|
||||
static struct irqaction nmdk_timer_irq = {
|
||||
.name = "Nomadik Timer Tick",
|
||||
.flags = IRQF_DISABLED | IRQF_TIMER,
|
||||
.flags = IRQF_TIMER,
|
||||
.handler = nmdk_timer_interrupt,
|
||||
.dev_id = &nmdk_clkevt,
|
||||
};
|
||||
|
||||
@@ -264,7 +264,7 @@ static irqreturn_t samsung_clock_event_isr(int irq, void *dev_id)
|
||||
|
||||
static struct irqaction samsung_clock_event_irq = {
|
||||
.name = "samsung_time_irq",
|
||||
.flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
|
||||
.flags = IRQF_TIMER | IRQF_IRQPOLL,
|
||||
.handler = samsung_clock_event_isr,
|
||||
.dev_id = &time_event_device,
|
||||
};
|
||||
|
||||
@@ -634,12 +634,18 @@ static int sh_cmt_clock_event_next(unsigned long delta,
|
||||
|
||||
static void sh_cmt_clock_event_suspend(struct clock_event_device *ced)
|
||||
{
|
||||
pm_genpd_syscore_poweroff(&ced_to_sh_cmt(ced)->pdev->dev);
|
||||
struct sh_cmt_priv *p = ced_to_sh_cmt(ced);
|
||||
|
||||
pm_genpd_syscore_poweroff(&p->pdev->dev);
|
||||
clk_unprepare(p->clk);
|
||||
}
|
||||
|
||||
static void sh_cmt_clock_event_resume(struct clock_event_device *ced)
|
||||
{
|
||||
pm_genpd_syscore_poweron(&ced_to_sh_cmt(ced)->pdev->dev);
|
||||
struct sh_cmt_priv *p = ced_to_sh_cmt(ced);
|
||||
|
||||
clk_prepare(p->clk);
|
||||
pm_genpd_syscore_poweron(&p->pdev->dev);
|
||||
}
|
||||
|
||||
static void sh_cmt_register_clockevent(struct sh_cmt_priv *p,
|
||||
@@ -726,8 +732,7 @@ static int sh_cmt_setup(struct sh_cmt_priv *p, struct platform_device *pdev)
|
||||
p->irqaction.name = dev_name(&p->pdev->dev);
|
||||
p->irqaction.handler = sh_cmt_interrupt;
|
||||
p->irqaction.dev_id = p;
|
||||
p->irqaction.flags = IRQF_DISABLED | IRQF_TIMER | \
|
||||
IRQF_IRQPOLL | IRQF_NOBALANCING;
|
||||
p->irqaction.flags = IRQF_TIMER | IRQF_IRQPOLL | IRQF_NOBALANCING;
|
||||
|
||||
/* get hold of clock */
|
||||
p->clk = clk_get(&p->pdev->dev, "cmt_fck");
|
||||
@@ -737,6 +742,10 @@ static int sh_cmt_setup(struct sh_cmt_priv *p, struct platform_device *pdev)
|
||||
goto err2;
|
||||
}
|
||||
|
||||
ret = clk_prepare(p->clk);
|
||||
if (ret < 0)
|
||||
goto err3;
|
||||
|
||||
if (res2 && (resource_size(res2) == 4)) {
|
||||
/* assume both CMSTR and CMCSR to be 32-bit */
|
||||
p->read_control = sh_cmt_read32;
|
||||
@@ -773,19 +782,21 @@ static int sh_cmt_setup(struct sh_cmt_priv *p, struct platform_device *pdev)
|
||||
cfg->clocksource_rating);
|
||||
if (ret) {
|
||||
dev_err(&p->pdev->dev, "registration failed\n");
|
||||
goto err3;
|
||||
goto err4;
|
||||
}
|
||||
p->cs_enabled = false;
|
||||
|
||||
ret = setup_irq(irq, &p->irqaction);
|
||||
if (ret) {
|
||||
dev_err(&p->pdev->dev, "failed to request irq %d\n", irq);
|
||||
goto err3;
|
||||
goto err4;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, p);
|
||||
|
||||
return 0;
|
||||
err4:
|
||||
clk_unprepare(p->clk);
|
||||
err3:
|
||||
clk_put(p->clk);
|
||||
err2:
|
||||
|
||||
@@ -302,8 +302,7 @@ static int sh_mtu2_setup(struct sh_mtu2_priv *p, struct platform_device *pdev)
|
||||
p->irqaction.handler = sh_mtu2_interrupt;
|
||||
p->irqaction.dev_id = p;
|
||||
p->irqaction.irq = irq;
|
||||
p->irqaction.flags = IRQF_DISABLED | IRQF_TIMER | \
|
||||
IRQF_IRQPOLL | IRQF_NOBALANCING;
|
||||
p->irqaction.flags = IRQF_TIMER | IRQF_IRQPOLL | IRQF_NOBALANCING;
|
||||
|
||||
/* get hold of clock */
|
||||
p->clk = clk_get(&p->pdev->dev, "mtu2_fck");
|
||||
@@ -358,7 +357,6 @@ static int sh_mtu2_probe(struct platform_device *pdev)
|
||||
ret = sh_mtu2_setup(p, pdev);
|
||||
if (ret) {
|
||||
kfree(p);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
pm_runtime_idle(&pdev->dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -462,8 +462,7 @@ static int sh_tmu_setup(struct sh_tmu_priv *p, struct platform_device *pdev)
|
||||
p->irqaction.handler = sh_tmu_interrupt;
|
||||
p->irqaction.dev_id = p;
|
||||
p->irqaction.irq = irq;
|
||||
p->irqaction.flags = IRQF_DISABLED | IRQF_TIMER | \
|
||||
IRQF_IRQPOLL | IRQF_NOBALANCING;
|
||||
p->irqaction.flags = IRQF_TIMER | IRQF_IRQPOLL | IRQF_NOBALANCING;
|
||||
|
||||
/* get hold of clock */
|
||||
p->clk = clk_get(&p->pdev->dev, "tmu_fck");
|
||||
@@ -523,7 +522,6 @@ static int sh_tmu_probe(struct platform_device *pdev)
|
||||
ret = sh_tmu_setup(p, pdev);
|
||||
if (ret) {
|
||||
kfree(p);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
pm_runtime_idle(&pdev->dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -114,7 +114,7 @@ static int sun4i_clkevt_next_event(unsigned long evt,
|
||||
|
||||
static struct clock_event_device sun4i_clockevent = {
|
||||
.name = "sun4i_tick",
|
||||
.rating = 300,
|
||||
.rating = 350,
|
||||
.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
|
||||
.set_mode = sun4i_clkevt_mode,
|
||||
.set_next_event = sun4i_clkevt_next_event,
|
||||
@@ -138,7 +138,7 @@ static struct irqaction sun4i_timer_irq = {
|
||||
.dev_id = &sun4i_clockevent,
|
||||
};
|
||||
|
||||
static u32 sun4i_timer_sched_read(void)
|
||||
static u64 notrace sun4i_timer_sched_read(void)
|
||||
{
|
||||
return ~readl(timer_base + TIMER_CNTVAL_REG(1));
|
||||
}
|
||||
@@ -170,9 +170,9 @@ static void __init sun4i_timer_init(struct device_node *node)
|
||||
TIMER_CTL_CLK_SRC(TIMER_CTL_CLK_SRC_OSC24M),
|
||||
timer_base + TIMER_CTL_REG(1));
|
||||
|
||||
setup_sched_clock(sun4i_timer_sched_read, 32, rate);
|
||||
sched_clock_register(sun4i_timer_sched_read, 32, rate);
|
||||
clocksource_mmio_init(timer_base + TIMER_CNTVAL_REG(1), node->name,
|
||||
rate, 300, 32, clocksource_mmio_readl_down);
|
||||
rate, 350, 32, clocksource_mmio_readl_down);
|
||||
|
||||
ticks_per_jiffy = DIV_ROUND_UP(rate, HZ);
|
||||
|
||||
@@ -190,7 +190,8 @@ static void __init sun4i_timer_init(struct device_node *node)
|
||||
val = readl(timer_base + TIMER_IRQ_EN_REG);
|
||||
writel(val | TIMER_IRQ_EN(0), timer_base + TIMER_IRQ_EN_REG);
|
||||
|
||||
sun4i_clockevent.cpumask = cpumask_of(0);
|
||||
sun4i_clockevent.cpumask = cpu_possible_mask;
|
||||
sun4i_clockevent.irq = irq;
|
||||
|
||||
clockevents_config_and_register(&sun4i_clockevent, rate,
|
||||
TIMER_SYNC_TICKS, 0xffffffff);
|
||||
|
||||
@@ -149,7 +149,7 @@ static irqreturn_t tegra_timer_interrupt(int irq, void *dev_id)
|
||||
|
||||
static struct irqaction tegra_timer_irq = {
|
||||
.name = "timer0",
|
||||
.flags = IRQF_DISABLED | IRQF_TIMER | IRQF_TRIGGER_HIGH,
|
||||
.flags = IRQF_TIMER | IRQF_TRIGGER_HIGH,
|
||||
.handler = tegra_timer_interrupt,
|
||||
.dev_id = &tegra_clockevent,
|
||||
};
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user