* [PULL] clockevents for 4.7
@ 2016-04-28 13:19 Daniel Lezcano
2016-04-28 13:20 ` [PATCH 1/5] clockevents/drivers/dw_apb_timer: Implement ->set_state_oneshot_stopped() Daniel Lezcano
0 siblings, 1 reply; 6+ messages in thread
From: Daniel Lezcano @ 2016-04-28 13:19 UTC (permalink / raw)
To: Thomas Gleixner, Ingo Molnar; +Cc: linux-kernel
Hi Thomas, Ingo,
this pull request contains the following changes:
- Implement the set_state_oneshot_stopped() for dw_apb timer (Jisheng
Zhang)
- Add a missing __init attribute for the Mediatek timer (Julia Lawall)
- Remove the suspend/resume code as it is never used (Thierry Reding)
- Add a new driver MPS2 with the DT bindings documenation (Vladimir Murzin)
The following changes since commit 86d3473224b004f920c107206d181d37db735145:
time: Introduce do_sys_settimeofday64() (2016-04-22 11:49:04 -0700)
are available in the git repository at:
http://git.linaro.org/people/daniel.lezcano/linux.git clockevents/4.7
for you to fetch changes up to 9999c5fc014adcc4278adddb73888c301be7b9f7:
clocksource/drivers/tegra: Remove unused suspend/resume code (2016-04-28
15:09:08 +0200)
----------------------------------------------------------------
Jisheng Zhang (1):
clockevents/drivers/dw_apb_timer: Implement
->set_state_oneshot_stopped()
Julia Lawall (1):
clocksource/drivers/mtk_timer: Add __init attribute
Thierry Reding (1):
clocksource/drivers/tegra: Remove unused suspend/resume code
Vladimir Murzin (2):
dt-bindings: document the MPS2 timer bindings
clockevents/driversi/mps2: add MPS2 Timer driver
Documentation/devicetree/bindings/timer/arm,mps2-timer.txt | 28
+++++++++++++
drivers/clocksource/Kconfig | 6 +++
drivers/clocksource/Makefile | 1 +
drivers/clocksource/dw_apb_timer.c | 1 +
drivers/clocksource/mps2-timer.c | 275
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
drivers/clocksource/mtk_timer.c | 2 +-
drivers/clocksource/tegra20_timer.c | 14 -------
7 files changed, 312 insertions(+), 15 deletions(-)
create mode 100644
Documentation/devicetree/bindings/timer/arm,mps2-timer.txt
create mode 100644 drivers/clocksource/mps2-timer.c
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/5] clockevents/drivers/dw_apb_timer: Implement ->set_state_oneshot_stopped()
2016-04-28 13:19 [PULL] clockevents for 4.7 Daniel Lezcano
@ 2016-04-28 13:20 ` Daniel Lezcano
2016-04-28 13:20 ` [PATCH 2/5] clocksource/drivers/mtk_timer: Add __init attribute Daniel Lezcano
` (3 more replies)
0 siblings, 4 replies; 6+ messages in thread
From: Daniel Lezcano @ 2016-04-28 13:20 UTC (permalink / raw)
To: tglx, mingo; +Cc: Jisheng Zhang, open list:CLOCKSOURCE, CLOC...
From: Jisheng Zhang <jszhang@marvell.com>
The dw_apb_timer only "supports PERIODIC mode and their drivers emulate
ONESHOT over that" as described in commit 8fff52fd5093 ("clockevents:
Introduce CLOCK_EVT_STATE_ONESHOT_STOPPED state").
Inspired by Viresh, I think the dw_apb_timer also needs to implement
the set_state_oneshot_stopped() which is called by the clkevt core,
when the next event is required at an expiry time of 'KTIME_MAX'. This
normally happens with NO_HZ_{IDLE|FULL} in both LOWRES/HIGHRES modes.
This patch makes the clockevent device to stop on such an event, to
avoid spurious interrupts, as explained by the above commit.
Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org>
---
drivers/clocksource/dw_apb_timer.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/clocksource/dw_apb_timer.c b/drivers/clocksource/dw_apb_timer.c
index 6334526..797505a 100644
--- a/drivers/clocksource/dw_apb_timer.c
+++ b/drivers/clocksource/dw_apb_timer.c
@@ -264,6 +264,7 @@ dw_apb_clockevent_init(int cpu, const char *name, unsigned rating,
dw_ced->ced.set_state_shutdown = apbt_shutdown;
dw_ced->ced.set_state_periodic = apbt_set_periodic;
dw_ced->ced.set_state_oneshot = apbt_set_oneshot;
+ dw_ced->ced.set_state_oneshot_stopped = apbt_shutdown;
dw_ced->ced.tick_resume = apbt_resume;
dw_ced->ced.set_next_event = apbt_next_event;
dw_ced->ced.irq = dw_ced->timer.irq;
--
1.9.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/5] clocksource/drivers/mtk_timer: Add __init attribute
2016-04-28 13:20 ` [PATCH 1/5] clockevents/drivers/dw_apb_timer: Implement ->set_state_oneshot_stopped() Daniel Lezcano
@ 2016-04-28 13:20 ` Daniel Lezcano
2016-04-28 13:20 ` [PATCH 3/5] dt-bindings: document the MPS2 timer bindings Daniel Lezcano
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Daniel Lezcano @ 2016-04-28 13:20 UTC (permalink / raw)
To: tglx, mingo
Cc: Julia Lawall, Matthias Brugger, open list:CLOCKSOURCE, CLOC...,
moderated list:ARM/Mediatek SoC...,
moderated list:ARM/Mediatek SoC...
From: Julia Lawall <Julia.Lawall@lip6.fr>
Add __init attribute on a function that is only called from other __init
functions and that is not inlined, at least with gcc version 4.8.4 on an
x86 machine with allyesconfig. Currently, the function is put in the
.text.unlikely segment. Declaring it as __init will cause it to be put in
the .init.text and to disappear after initialization.
The result of objdump -x on the function before the change is as follows:
0000000000000000 l F .text.unlikely 000000000000006f mtk_timer_setup.isra.4
And after the change it is as follows:
0000000000000000 l F .init.text 000000000000006a mtk_timer_setup.isra.4
Done with the help of Coccinelle. The semantic patch checks for local
static non-init functions that are called from an __init function and are
not called from any other function.
Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Acked-by: Matthias Brugger <matthias.bgg@gmail.com>
---
drivers/clocksource/mtk_timer.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/clocksource/mtk_timer.c b/drivers/clocksource/mtk_timer.c
index d67bc35..7e583f8 100644
--- a/drivers/clocksource/mtk_timer.c
+++ b/drivers/clocksource/mtk_timer.c
@@ -152,7 +152,7 @@ static irqreturn_t mtk_timer_interrupt(int irq, void *dev_id)
}
static void
-mtk_timer_setup(struct mtk_clock_event_device *evt, u8 timer, u8 option)
+__init mtk_timer_setup(struct mtk_clock_event_device *evt, u8 timer, u8 option)
{
writel(TIMER_CTRL_CLEAR | TIMER_CTRL_DISABLE,
evt->gpt_base + TIMER_CTRL_REG(timer));
--
1.9.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 3/5] dt-bindings: document the MPS2 timer bindings
2016-04-28 13:20 ` [PATCH 1/5] clockevents/drivers/dw_apb_timer: Implement ->set_state_oneshot_stopped() Daniel Lezcano
2016-04-28 13:20 ` [PATCH 2/5] clocksource/drivers/mtk_timer: Add __init attribute Daniel Lezcano
@ 2016-04-28 13:20 ` Daniel Lezcano
2016-04-28 13:20 ` [PATCH 4/5] clockevents/driversi/mps2: add MPS2 Timer driver Daniel Lezcano
2016-04-28 13:20 ` [PATCH 5/5] clocksource/drivers/tegra: Remove unused suspend/resume code Daniel Lezcano
3 siblings, 0 replies; 6+ messages in thread
From: Daniel Lezcano @ 2016-04-28 13:20 UTC (permalink / raw)
To: tglx, mingo
Cc: Vladimir Murzin, Rob Herring, Rob Herring, Pawel Moll,
Mark Rutland, Ian Campbell, Kumar Gala,
open list:OPEN FIRMWARE AND..., open list
From: Vladimir Murzin <vladimir.murzin@arm.com>
This adds documentation of device tree bindings for the
timers found on ARM MPS2 platform.
Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
.../devicetree/bindings/timer/arm,mps2-timer.txt | 28 ++++++++++++++++++++++
1 file changed, 28 insertions(+)
create mode 100644 Documentation/devicetree/bindings/timer/arm,mps2-timer.txt
diff --git a/Documentation/devicetree/bindings/timer/arm,mps2-timer.txt b/Documentation/devicetree/bindings/timer/arm,mps2-timer.txt
new file mode 100644
index 0000000..48f84d7
--- /dev/null
+++ b/Documentation/devicetree/bindings/timer/arm,mps2-timer.txt
@@ -0,0 +1,28 @@
+ARM MPS2 timer
+
+The MPS2 platform has simple general-purpose 32 bits timers.
+
+Required properties:
+- compatible : Should be "arm,mps2-timer"
+- reg : Address and length of the register set
+- interrupts : Reference to the timer interrupt
+
+Required clocking property, have to be one of:
+- clocks : The input clock of the timer
+- clock-frequency : The rate in HZ in input of the ARM MPS2 timer
+
+Examples:
+
+timer1: mps2-timer@40000000 {
+ compatible = "arm,mps2-timer";
+ reg = <0x40000000 0x1000>;
+ interrupts = <8>;
+ clocks = <&sysclk>;
+};
+
+timer2: mps2-timer@40001000 {
+ compatible = "arm,mps2-timer";
+ reg = <0x40001000 0x1000>;
+ interrupts = <9>;
+ clock-frequency = <25000000>;
+};
--
1.9.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 4/5] clockevents/driversi/mps2: add MPS2 Timer driver
2016-04-28 13:20 ` [PATCH 1/5] clockevents/drivers/dw_apb_timer: Implement ->set_state_oneshot_stopped() Daniel Lezcano
2016-04-28 13:20 ` [PATCH 2/5] clocksource/drivers/mtk_timer: Add __init attribute Daniel Lezcano
2016-04-28 13:20 ` [PATCH 3/5] dt-bindings: document the MPS2 timer bindings Daniel Lezcano
@ 2016-04-28 13:20 ` Daniel Lezcano
2016-04-28 13:20 ` [PATCH 5/5] clocksource/drivers/tegra: Remove unused suspend/resume code Daniel Lezcano
3 siblings, 0 replies; 6+ messages in thread
From: Daniel Lezcano @ 2016-04-28 13:20 UTC (permalink / raw)
To: tglx, mingo; +Cc: Vladimir Murzin, open list
From: Vladimir Murzin <vladimir.murzin@arm.com>
MPS2 platform has simple 32 bits general purpose countdown timers.
The driver uses the first detected timer as a clocksource and the rest
of the timers as a clockevent
Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
drivers/clocksource/Kconfig | 6 +
drivers/clocksource/Makefile | 1 +
drivers/clocksource/mps2-timer.c | 275 +++++++++++++++++++++++++++++++++++++++
3 files changed, 282 insertions(+)
create mode 100644 drivers/clocksource/mps2-timer.c
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index c346be6..6ff327a 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -186,6 +186,12 @@ config CLKSRC_STM32
depends on OF && ARM && (ARCH_STM32 || COMPILE_TEST)
select CLKSRC_MMIO
+config CLKSRC_MPS2
+ bool "Clocksource for MPS2 SoCs" if COMPILE_TEST
+ depends on GENERIC_SCHED_CLOCK
+ select CLKSRC_MMIO
+ select CLKSRC_OF
+
config ARM_ARCH_TIMER
bool
select CLKSRC_OF if OF
diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile
index dc2b899..b0a3c96 100644
--- a/drivers/clocksource/Makefile
+++ b/drivers/clocksource/Makefile
@@ -39,6 +39,7 @@ obj-$(CONFIG_CLKSRC_EFM32) += time-efm32.o
obj-$(CONFIG_CLKSRC_STM32) += timer-stm32.o
obj-$(CONFIG_CLKSRC_EXYNOS_MCT) += exynos_mct.o
obj-$(CONFIG_CLKSRC_LPC32XX) += time-lpc32xx.o
+obj-$(CONFIG_CLKSRC_MPS2) += mps2-timer.o
obj-$(CONFIG_CLKSRC_SAMSUNG_PWM) += samsung_pwm_timer.o
obj-$(CONFIG_FSL_FTM_TIMER) += fsl_ftm_timer.o
obj-$(CONFIG_VF_PIT_TIMER) += vf_pit_timer.o
diff --git a/drivers/clocksource/mps2-timer.c b/drivers/clocksource/mps2-timer.c
new file mode 100644
index 0000000..3d33a5e
--- /dev/null
+++ b/drivers/clocksource/mps2-timer.c
@@ -0,0 +1,275 @@
+/*
+ * Copyright (C) 2015 ARM Limited
+ *
+ * Author: Vladimir Murzin <vladimir.murzin@arm.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/clk.h>
+#include <linux/clockchips.h>
+#include <linux/clocksource.h>
+#include <linux/err.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/irq.h>
+#include <linux/of_address.h>
+#include <linux/of.h>
+#include <linux/of_irq.h>
+#include <linux/sched_clock.h>
+#include <linux/slab.h>
+
+#define TIMER_CTRL 0x0
+#define TIMER_CTRL_ENABLE BIT(0)
+#define TIMER_CTRL_IE BIT(3)
+
+#define TIMER_VALUE 0x4
+#define TIMER_RELOAD 0x8
+#define TIMER_INT 0xc
+
+struct clockevent_mps2 {
+ void __iomem *reg;
+ u32 clock_count_per_tick;
+ struct clock_event_device clkevt;
+};
+
+static void __iomem *sched_clock_base;
+
+static u64 notrace mps2_sched_read(void)
+{
+ return ~readl_relaxed(sched_clock_base + TIMER_VALUE);
+}
+
+static inline struct clockevent_mps2 *to_mps2_clkevt(struct clock_event_device *c)
+{
+ return container_of(c, struct clockevent_mps2, clkevt);
+}
+
+static void clockevent_mps2_writel(u32 val, struct clock_event_device *c, u32 offset)
+{
+ writel_relaxed(val, to_mps2_clkevt(c)->reg + offset);
+}
+
+static int mps2_timer_shutdown(struct clock_event_device *ce)
+{
+ clockevent_mps2_writel(0, ce, TIMER_RELOAD);
+ clockevent_mps2_writel(0, ce, TIMER_CTRL);
+
+ return 0;
+}
+
+static int mps2_timer_set_next_event(unsigned long next, struct clock_event_device *ce)
+{
+ clockevent_mps2_writel(next, ce, TIMER_VALUE);
+ clockevent_mps2_writel(TIMER_CTRL_IE | TIMER_CTRL_ENABLE, ce, TIMER_CTRL);
+
+ return 0;
+}
+
+static int mps2_timer_set_periodic(struct clock_event_device *ce)
+{
+ u32 clock_count_per_tick = to_mps2_clkevt(ce)->clock_count_per_tick;
+
+ clockevent_mps2_writel(clock_count_per_tick, ce, TIMER_RELOAD);
+ clockevent_mps2_writel(clock_count_per_tick, ce, TIMER_VALUE);
+ clockevent_mps2_writel(TIMER_CTRL_IE | TIMER_CTRL_ENABLE, ce, TIMER_CTRL);
+
+ return 0;
+}
+
+static irqreturn_t mps2_timer_interrupt(int irq, void *dev_id)
+{
+ struct clockevent_mps2 *ce = dev_id;
+ u32 status = readl_relaxed(ce->reg + TIMER_INT);
+
+ if (!status) {
+ pr_warn("spurious interrupt\n");
+ return IRQ_NONE;
+ }
+
+ writel_relaxed(1, ce->reg + TIMER_INT);
+
+ ce->clkevt.event_handler(&ce->clkevt);
+
+ return IRQ_HANDLED;
+}
+
+static int __init mps2_clockevent_init(struct device_node *np)
+{
+ void __iomem *base;
+ struct clk *clk = NULL;
+ struct clockevent_mps2 *ce;
+ u32 rate;
+ int irq, ret;
+ const char *name = "mps2-clkevt";
+
+ ret = of_property_read_u32(np, "clock-frequency", &rate);
+ if (ret) {
+ clk = of_clk_get(np, 0);
+ if (IS_ERR(clk)) {
+ ret = PTR_ERR(clk);
+ pr_err("failed to get clock for clockevent: %d\n", ret);
+ goto out;
+ }
+
+ ret = clk_prepare_enable(clk);
+ if (ret) {
+ pr_err("failed to enable clock for clockevent: %d\n", ret);
+ goto out_clk_put;
+ }
+
+ rate = clk_get_rate(clk);
+ }
+
+ base = of_iomap(np, 0);
+ if (!base) {
+ ret = -EADDRNOTAVAIL;
+ pr_err("failed to map register for clockevent: %d\n", ret);
+ goto out_clk_disable;
+ }
+
+ irq = irq_of_parse_and_map(np, 0);
+ if (!irq) {
+ ret = -ENOENT;
+ pr_err("failed to get irq for clockevent: %d\n", ret);
+ goto out_iounmap;
+ }
+
+ ce = kzalloc(sizeof(*ce), GFP_KERNEL);
+ if (!ce) {
+ ret = -ENOMEM;
+ goto out_iounmap;
+ }
+
+ ce->reg = base;
+ ce->clock_count_per_tick = DIV_ROUND_CLOSEST(rate, HZ);
+ ce->clkevt.irq = irq;
+ ce->clkevt.name = name;
+ ce->clkevt.rating = 200;
+ ce->clkevt.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
+ ce->clkevt.cpumask = cpu_possible_mask;
+ ce->clkevt.set_state_shutdown = mps2_timer_shutdown,
+ ce->clkevt.set_state_periodic = mps2_timer_set_periodic,
+ ce->clkevt.set_state_oneshot = mps2_timer_shutdown,
+ ce->clkevt.set_next_event = mps2_timer_set_next_event;
+
+ /* Ensure timer is disabled */
+ writel_relaxed(0, base + TIMER_CTRL);
+
+ ret = request_irq(irq, mps2_timer_interrupt, IRQF_TIMER, name, ce);
+ if (ret) {
+ pr_err("failed to request irq for clockevent: %d\n", ret);
+ goto out_kfree;
+ }
+
+ clockevents_config_and_register(&ce->clkevt, rate, 0xf, 0xffffffff);
+
+ return 0;
+
+out_kfree:
+ kfree(ce);
+out_iounmap:
+ iounmap(base);
+out_clk_disable:
+ /* clk_{disable, unprepare, put}() can handle NULL as a parameter */
+ clk_disable_unprepare(clk);
+out_clk_put:
+ clk_put(clk);
+out:
+ return ret;
+}
+
+static int __init mps2_clocksource_init(struct device_node *np)
+{
+ void __iomem *base;
+ struct clk *clk = NULL;
+ u32 rate;
+ int ret;
+ const char *name = "mps2-clksrc";
+
+ ret = of_property_read_u32(np, "clock-frequency", &rate);
+ if (ret) {
+ clk = of_clk_get(np, 0);
+ if (IS_ERR(clk)) {
+ ret = PTR_ERR(clk);
+ pr_err("failed to get clock for clocksource: %d\n", ret);
+ goto out;
+ }
+
+ ret = clk_prepare_enable(clk);
+ if (ret) {
+ pr_err("failed to enable clock for clocksource: %d\n", ret);
+ goto out_clk_put;
+ }
+
+ rate = clk_get_rate(clk);
+ }
+
+ base = of_iomap(np, 0);
+ if (!base) {
+ ret = -EADDRNOTAVAIL;
+ pr_err("failed to map register for clocksource: %d\n", ret);
+ goto out_clk_disable;
+ }
+
+ /* Ensure timer is disabled */
+ writel_relaxed(0, base + TIMER_CTRL);
+
+ /* ... and set it up as free-running clocksource */
+ writel_relaxed(0xffffffff, base + TIMER_VALUE);
+ writel_relaxed(0xffffffff, base + TIMER_RELOAD);
+
+ writel_relaxed(TIMER_CTRL_ENABLE, base + TIMER_CTRL);
+
+ ret = clocksource_mmio_init(base + TIMER_VALUE, name,
+ rate, 200, 32,
+ clocksource_mmio_readl_down);
+ if (ret) {
+ pr_err("failed to init clocksource: %d\n", ret);
+ goto out_iounmap;
+ }
+
+ sched_clock_base = base;
+ sched_clock_register(mps2_sched_read, 32, rate);
+
+ return 0;
+
+out_iounmap:
+ iounmap(base);
+out_clk_disable:
+ /* clk_{disable, unprepare, put}() can handle NULL as a parameter */
+ clk_disable_unprepare(clk);
+out_clk_put:
+ clk_put(clk);
+out:
+ return ret;
+}
+
+static void __init mps2_timer_init(struct device_node *np)
+{
+ static int has_clocksource, has_clockevent;
+ int ret;
+
+ if (!has_clocksource) {
+ ret = mps2_clocksource_init(np);
+ if (!ret) {
+ has_clocksource = 1;
+ return;
+ }
+ }
+
+ if (!has_clockevent) {
+ ret = mps2_clockevent_init(np);
+ if (!ret) {
+ has_clockevent = 1;
+ return;
+ }
+ }
+}
+
+CLOCKSOURCE_OF_DECLARE(mps2_timer, "arm,mps2-timer", mps2_timer_init);
--
1.9.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 5/5] clocksource/drivers/tegra: Remove unused suspend/resume code
2016-04-28 13:20 ` [PATCH 1/5] clockevents/drivers/dw_apb_timer: Implement ->set_state_oneshot_stopped() Daniel Lezcano
` (2 preceding siblings ...)
2016-04-28 13:20 ` [PATCH 4/5] clockevents/driversi/mps2: add MPS2 Timer driver Daniel Lezcano
@ 2016-04-28 13:20 ` Daniel Lezcano
3 siblings, 0 replies; 6+ messages in thread
From: Daniel Lezcano @ 2016-04-28 13:20 UTC (permalink / raw)
To: tglx, mingo
Cc: Thierry Reding, Stephen Warren, Thierry Reding, Alexandre Courbot,
open list:CLOCKSOURCE, CLOC..., open list:TEGRA ARCHITECTUR...
From: Thierry Reding <treding@nvidia.com>
The tegra_timer_suspend() and tegra_timer_resume() functions are never
used, so they can be removed.
Signed-off-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
drivers/clocksource/tegra20_timer.c | 14 --------------
1 file changed, 14 deletions(-)
diff --git a/drivers/clocksource/tegra20_timer.c b/drivers/clocksource/tegra20_timer.c
index 38333ab..7b94ad2 100644
--- a/drivers/clocksource/tegra20_timer.c
+++ b/drivers/clocksource/tegra20_timer.c
@@ -258,17 +258,3 @@ static void __init tegra20_init_rtc(struct device_node *np)
register_persistent_clock(NULL, tegra_read_persistent_clock64);
}
CLOCKSOURCE_OF_DECLARE(tegra20_rtc, "nvidia,tegra20-rtc", tegra20_init_rtc);
-
-#ifdef CONFIG_PM
-static u32 usec_config;
-
-void tegra_timer_suspend(void)
-{
- usec_config = timer_readl(TIMERUS_USEC_CFG);
-}
-
-void tegra_timer_resume(void)
-{
- timer_writel(usec_config, TIMERUS_USEC_CFG);
-}
-#endif
--
1.9.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2016-04-28 13:21 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-04-28 13:19 [PULL] clockevents for 4.7 Daniel Lezcano
2016-04-28 13:20 ` [PATCH 1/5] clockevents/drivers/dw_apb_timer: Implement ->set_state_oneshot_stopped() Daniel Lezcano
2016-04-28 13:20 ` [PATCH 2/5] clocksource/drivers/mtk_timer: Add __init attribute Daniel Lezcano
2016-04-28 13:20 ` [PATCH 3/5] dt-bindings: document the MPS2 timer bindings Daniel Lezcano
2016-04-28 13:20 ` [PATCH 4/5] clockevents/driversi/mps2: add MPS2 Timer driver Daniel Lezcano
2016-04-28 13:20 ` [PATCH 5/5] clocksource/drivers/tegra: Remove unused suspend/resume code Daniel Lezcano
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox