clocksource: asm9260: Migrate to new 'set-state' interface
Subsystems (17)
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH 1/41 clocksource: asm9260: Migrate to new 'set-state' interface
Migrate asm9260 driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/asm9260_timer.c | 61 ++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 25 deletions(-)
drivers/clocksource/asm9260_timer.c +36 -25
@@ -120,38 +120,49 @@ static int asm9260_timer_set_next_event(unsigned long delta,return 0 ; } -static void asm9260_timer_set_mode (enum clock_event_mode mode, -struct clock_event_device *evt) +static int asm9260_timer_shutdown (struct clock_event_device *evt) {/* stop timer0 */ writel_relaxed (BM_C0_EN , priv.base +HW_TCR +CLR_REG ); +return 0 ; +} + +static int asm9260_timer_set_oneshot (struct clock_event_device *evt) +{ +/* stop timer0 */ +writel_relaxed (BM_C0_EN , priv.base +HW_TCR +CLR_REG ); + +/* enable reset and stop on match */ +writel_relaxed (BM_MCR_RES_EN (0 ) |BM_MCR_STOP_EN (0 ), + priv.base +HW_MCR +SET_REG ); +return 0 ; +} -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -/* disable reset and stop on match */ -writel_relaxed (BM_MCR_RES_EN (0 ) |BM_MCR_STOP_EN (0 ), - priv.base +HW_MCR +CLR_REG ); -/* configure match count for TC0 */ -writel_relaxed (priv.ticks_per_jiffy, priv.base +HW_MR0 ); -/* enable TC0 */ -writel_relaxed (BM_C0_EN , priv.base +HW_TCR +SET_REG ); -break ; -case CLOCK_EVT_MODE_ONESHOT : -/* enable reset and stop on match */ -writel_relaxed (BM_MCR_RES_EN (0 ) |BM_MCR_STOP_EN (0 ), - priv.base +HW_MCR +SET_REG ); -break ; -default : -break ; - } +static int asm9260_timer_set_periodic (struct clock_event_device *evt) +{ +/* stop timer0 */ +writel_relaxed (BM_C0_EN , priv.base +HW_TCR +CLR_REG ); + +/* disable reset and stop on match */ +writel_relaxed (BM_MCR_RES_EN (0 ) |BM_MCR_STOP_EN (0 ), + priv.base +HW_MCR +CLR_REG ); +/* configure match count for TC0 */ +writel_relaxed (priv.ticks_per_jiffy, priv.base +HW_MR0 ); +/* enable TC0 */ +writel_relaxed (BM_C0_EN , priv.base +HW_TCR +SET_REG ); +return 0 ; }static struct clock_event_device event_dev = { - .name =DRIVER_NAME , - .rating =200 , - .features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT , - .set_next_event = asm9260_timer_set_next_event, - .set_mode = asm9260_timer_set_mode, + .name =DRIVER_NAME , + .rating =200 , + .features =CLOCK_EVT_FEAT_PERIODIC | +CLOCK_EVT_FEAT_ONESHOT , + .set_next_event = asm9260_timer_set_next_event, + .set_state_shutdown = asm9260_timer_shutdown, + .set_state_periodic = asm9260_timer_set_periodic, + .set_state_oneshot = asm9260_timer_set_oneshot, + .tick_resume = asm9260_timer_shutdown, };static irqreturn_t asm9260_timer_interrupt (int irq,void *dev_id)
Signature · 1 line
2.4.0
Quoted 6 lines · Viresh Kumar
Migrate asm9260 driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.
Could you add in the changelog the subtle change with set_mode(RESUME) and this code. As a default the timer was stopped when entering in the set_mode function, now with the new API, this is done explicitly.
Quoted 3 lines
Cc Oleksij Rempel <[email protected]>Signed-off-by Viresh Kumar <[email protected]>---
[ ... ]
drivers/clocksource/asm9260_timer.c static int asm9260_timer_set_next_event(unsigned long delta, · line 133
Quoted 11 lines
drivers/clocksource/asm9260_timer.c +8
-0+static int asm9260_timer_shutdown (struct clock_event_device *evt) {/* stop timer0 */ writel_relaxed (BM_C0_EN , priv.base +HW_TCR +CLR_REG ); +return 0 ; +} + +static int asm9260_timer_set_oneshot (struct clock_event_device *evt) +{ +/* stop timer0 */ +writel_relaxed (BM_C0_EN , priv.base +HW_TCR +CLR_REG );
Can you replace this line with a call to asm9260_timer_shutdown ?
Quoted 5 lines
drivers/clocksource/asm9260_timer.c +5
-0+/* enable reset and stop on match */ +writel_relaxed (BM_MCR_RES_EN (0 ) |BM_MCR_STOP_EN (0 ), + priv.base +HW_MCR +SET_REG ); +return 0 ; +}
[ ... ]
drivers/clocksource/asm9260_timer.c static int asm9260_timer_set_next_event(unsigned long delta, · line 144
Quoted 4 lines
drivers/clocksource/asm9260_timer.c +4
-0+static int asm9260_timer_set_periodic (struct clock_event_device *evt) +{ +/* stop timer0 */ +writel_relaxed (BM_C0_EN , priv.base +HW_TCR +CLR_REG );
idem.
Thanks
-- Daniel
Signature · 5 lines
<http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog
Quoted 6 lines · Daniel Lezcano
Could you add in the changelog the subtle change with
set_mode(RESUME)and this code. As a default the timer was stopped when entering in theset_modefunction, now with the new API, this is done explicitly.Can you replace this line with a call to
asm9260_timer_shutdown?
How does this look ?
--------------------------8<------------------
Message-Id: <12839571df542ecc8b9304b7de9881216d45aef8.1435654791.git.viresh.kumar@linaro.org>
From: Viresh Kumar <[email protected]>
Date: Fri, 27 Feb 2015 13:39:52 +0530
Subject: [PATCH] clocksource: asm9260: Migrate to new 'set-state' interface
Migrate asm9260 driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
As a default the timer was stopped when entering in the set_mode(RESUME) function, now this is done explicitly with the new API.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/asm9260_timer.c | 64 ++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 25 deletions(-)
drivers/clocksource/asm9260_timer.c +39 -25
@@ -120,38 +120,52 @@ static int asm9260_timer_set_next_event(unsigned long delta,return 0 ; } -static void asm9260_timer_set_mode (enum clock_event_mode mode, -struct clock_event_device *evt) +static inline void __asm9260_timer_shutdown (struct clock_event_device *evt) {/* stop timer0 */ writel_relaxed (BM_C0_EN , priv.base +HW_TCR +CLR_REG ); +} + +static int asm9260_timer_shutdown (struct clock_event_device *evt) +{ +__asm9260_timer_shutdown (evt); +return 0 ; +} + +static int asm9260_timer_set_oneshot (struct clock_event_device *evt) +{ +__asm9260_timer_shutdown (evt); + +/* enable reset and stop on match */ +writel_relaxed (BM_MCR_RES_EN (0 ) |BM_MCR_STOP_EN (0 ), + priv.base +HW_MCR +SET_REG ); +return 0 ; +} + +static int asm9260_timer_set_periodic (struct clock_event_device *evt) +{ +__asm9260_timer_shutdown (evt); -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -/* disable reset and stop on match */ -writel_relaxed (BM_MCR_RES_EN (0 ) |BM_MCR_STOP_EN (0 ), - priv.base +HW_MCR +CLR_REG ); -/* configure match count for TC0 */ -writel_relaxed (priv.ticks_per_jiffy, priv.base +HW_MR0 ); -/* enable TC0 */ -writel_relaxed (BM_C0_EN , priv.base +HW_TCR +SET_REG ); -break ; -case CLOCK_EVT_MODE_ONESHOT : -/* enable reset and stop on match */ -writel_relaxed (BM_MCR_RES_EN (0 ) |BM_MCR_STOP_EN (0 ), - priv.base +HW_MCR +SET_REG ); -break ; -default : -break ; - } +/* disable reset and stop on match */ +writel_relaxed (BM_MCR_RES_EN (0 ) |BM_MCR_STOP_EN (0 ), + priv.base +HW_MCR +CLR_REG ); +/* configure match count for TC0 */ +writel_relaxed (priv.ticks_per_jiffy, priv.base +HW_MR0 ); +/* enable TC0 */ +writel_relaxed (BM_C0_EN , priv.base +HW_TCR +SET_REG ); +return 0 ; }static struct clock_event_device event_dev = { - .name =DRIVER_NAME , - .rating =200 , - .features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT , - .set_next_event = asm9260_timer_set_next_event, - .set_mode = asm9260_timer_set_mode, + .name =DRIVER_NAME , + .rating =200 , + .features =CLOCK_EVT_FEAT_PERIODIC | +CLOCK_EVT_FEAT_ONESHOT , + .set_next_event = asm9260_timer_set_next_event, + .set_state_shutdown = asm9260_timer_shutdown, + .set_state_periodic = asm9260_timer_set_periodic, + .set_state_oneshot = asm9260_timer_set_oneshot, + .tick_resume = asm9260_timer_shutdown, };static irqreturn_t asm9260_timer_interrupt (int irq,void *dev_id)
Quoted 9 lines · Viresh Kumar
Quoted 6 lines · Daniel Lezcano
Could you add in the changelog the subtle change with
set_mode(RESUME)and this code. As a default the timer was stopped when entering in theset_modefunction, now with the new API, this is done explicitly.Can you replace this line with a call to
asm9260_timer_shutdown?How does this look ?
Looks good to me.
Signature · 5 lines
<http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog
Quoted 6 lines · Viresh Kumar
Migrate asm9260 driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.
Hi Viresh,
Is this series (and other one touching arch/arm/*) specific to ARM event timers. Are you planning to fixup the drivers in arch/* or the respective maintainers need to follow suit.
Thx,
-Vineet
Quoted 3 lines · Vineet Gupta
Is this series (and other one touching
arch/arm/*) specific to ARM event timers. Are you planning to fixup the drivers inarch/*or the respective maintainers need to follow suit.
Hi Vineet,
I am fixing all clockevent drivers available in Linux kernel, so you need not worry :)
I stopped a bit because of a dependency patch, which just got included in tip tree yesterday. Once that gets into next rc release (hopefully -4.2-rc2), I will send all the patches I have. At that point, these changes wouldn't have any dependency on clockevents tree and maintainers like you can apply them directly.
Changes are kept here for testing by auto-bots, in case you wanna have a look at arc patch :).
git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/linux.git clkevt/clocksource/set-state
Signature · 1 line
viresh
Quoted 8 lines · Viresh Kumar
Quoted 3 lines · Vineet Gupta
Is this series (and other one touching
arch/arm/*) specific to ARM event timers. Are you planning to fixup the drivers inarch/*or the respective maintainers need to follow suit.Hi Vineet,
I am fixing all clockevent drivers available in Linux kernel, so you need not worry :)
Ok I can go back to sleeping peacefully again ;-)
Quoted 4 lines
Changes are kept here for testing by auto-bots, in case you wanna have a look at arc patch :).
git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/linux.gitclkevt/clocksource/set-state
LGTM - I'll give it a spin when u send out the series on ml.
Thx,
-Vineet
PATCH 2/41 clocksource: cadence_ttc: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate cadence_ttc driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/cadence_ttc_timer.c | 59 ++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 27 deletions(-)
drivers/clocksource/cadence_ttc_timer.c +32 -27
@@ -191,40 +191,42 @@ static int ttc_set_next_event(unsigned long cycles, }/** -* ttc_set_mode - Sets the mode of timer +* ttc_set_{shutdown|oneshot|periodic} - Sets the state of timer * -* @mode: Mode to be set * @evt: Address of clock event instance **/ -static void ttc_set_mode (enum clock_event_mode mode, -struct clock_event_device *evt) +static int ttc_shutdown (struct clock_event_device *evt) {struct ttc_timer_clockevent *ttce =to_ttc_timer_clkevent (evt);struct ttc_timer *timer = &ttce->ttc;u32 ctrl_reg; -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -ttc_set_interval (timer,DIV_ROUND_CLOSEST (ttce->ttc.freq, -PRESCALE *HZ )); -break ; -case CLOCK_EVT_MODE_ONESHOT : -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : - ctrl_reg =readl_relaxed (timer->base_addr + -TTC_CNT_CNTRL_OFFSET ); - ctrl_reg |=TTC_CNT_CNTRL_DISABLE_MASK ; -writel_relaxed (ctrl_reg, - timer->base_addr +TTC_CNT_CNTRL_OFFSET ); -break ; -case CLOCK_EVT_MODE_RESUME : - ctrl_reg =readl_relaxed (timer->base_addr + -TTC_CNT_CNTRL_OFFSET ); - ctrl_reg &= ~TTC_CNT_CNTRL_DISABLE_MASK ; -writel_relaxed (ctrl_reg, - timer->base_addr +TTC_CNT_CNTRL_OFFSET ); -break ; - } + ctrl_reg =readl_relaxed (timer->base_addr +TTC_CNT_CNTRL_OFFSET ); + ctrl_reg |=TTC_CNT_CNTRL_DISABLE_MASK ; +writel_relaxed (ctrl_reg, timer->base_addr +TTC_CNT_CNTRL_OFFSET ); +return 0 ; +} + +static int ttc_set_periodic (struct clock_event_device *evt) +{ +struct ttc_timer_clockevent *ttce =to_ttc_timer_clkevent (evt); +struct ttc_timer *timer = &ttce->ttc; + +ttc_set_interval (timer, +DIV_ROUND_CLOSEST (ttce->ttc.freq,PRESCALE *HZ )); +return 0 ; +} + +static int ttc_resume (struct clock_event_device *evt) +{ +struct ttc_timer_clockevent *ttce =to_ttc_timer_clkevent (evt); +struct ttc_timer *timer = &ttce->ttc; +u32 ctrl_reg; + + ctrl_reg =readl_relaxed (timer->base_addr +TTC_CNT_CNTRL_OFFSET ); + ctrl_reg &= ~TTC_CNT_CNTRL_DISABLE_MASK ; +writel_relaxed (ctrl_reg, timer->base_addr +TTC_CNT_CNTRL_OFFSET ); +return 0 ; } static int ttc_rate_change_clocksource_cb(struct notifier_block *nb,
@@ -430,7 +432,10 @@ static void __init ttc_setup_clockevent(struct clk *clk, ttcce->ce.name ="ttc_clockevent" ; ttcce->ce.features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT ; ttcce->ce.set_next_event = ttc_set_next_event; - ttcce->ce.set_mode = ttc_set_mode; + ttcce->ce.set_state_shutdown = ttc_shutdown; + ttcce->ce.set_state_periodic = ttc_set_periodic; + ttcce->ce.set_state_oneshot = ttc_shutdown; + ttcce->ce.tick_resume = ttc_resume; ttcce->ce.rating =200 ; ttcce->ce.irq = irq; ttcce->ce.cpumask = cpu_possible_mask;
Signature · 1 line
2.4.0
Re: [PATCH 02/41] clocksource: cadence_ttc: Migrate to new 'set-state' interface
Quoted 10 lines · Viresh Kumar
Migrate
cadence_ttcdriver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.Cc Michal Simek <[email protected]>Cc S?ren Brinkmann <[email protected]>Signed-off-by Viresh Kumar <[email protected]>
S?ren
Re: [PATCH 02/41] clocksource: cadence_ttc: Migrate to new 'set-state' interface
In reply to Viresh KumarQuoted 11 lines · Viresh Kumar
Migrate
cadence_ttcdriver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.Cc Michal Simek <[email protected]>Cc S?ren Brinkmann <[email protected]>Signed-off-by Viresh Kumar <[email protected]>---
Sounds good.
Signature · 5 lines
<http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog
PATCH 3/41 clocksource: clps711x: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate clps711x driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
We weren't doing anything in the ->set_mode() callback. So, this patch doesn't provide any set-state callbacks.
--- drivers/clocksource/clps711x-timer.c | 6 ------ 1 file changed, 6 deletions(-)
drivers/clocksource/clps711x-timer.c +0 -6
@@ -61,11 +61,6 @@ static irqreturn_t clps711x_timer_interrupt(int irq, void *dev_id)return IRQ_HANDLED ; } -static void clps711x_clockevent_set_mode (enum clock_event_mode mode, -struct clock_event_device *evt) -{ -} -static int __init _clps711x_clkevt_init (struct clk *clock,void __iomem *base,unsigned int irq) {
@@ -91,7 +86,6 @@ static int __init _clps711x_clkevt_init(struct clk *clock, void __iomem *base, clkevt->name ="clps711x-clockevent" ; clkevt->rating =300 ; clkevt->features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_C3STOP ; - clkevt->set_mode = clps711x_clockevent_set_mode; clkevt->cpumask =cpumask_of (0 );clockevents_config_and_register (clkevt,HZ ,0 ,0 );
Signature · 1 line
2.4.0
PATCH 4/41 clocksource: dummy_timer: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate dummy_timer driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
We weren't doing anything in the ->set_mode() callback. So, this patch doesn't provide any set-state callbacks.
--- drivers/clocksource/dummy_timer.c | 10 ---------- 1 file changed, 10 deletions(-)
drivers/clocksource/dummy_timer.c +0 -10
@@ -16,15 +16,6 @@ static DEFINE_PER_CPU(struct clock_event_device, dummy_timer_evt); -static void dummy_timer_set_mode (enum clock_event_mode mode, -struct clock_event_device *evt) -{ -/* -* Core clockevents code will call this when exchanging timer devices. -* We don't need to do anything here. -*/ -} -static void dummy_timer_setup (void ) {int cpu =smp_processor_id ();
@@ -35,7 +26,6 @@ static void dummy_timer_setup(void)CLOCK_EVT_FEAT_ONESHOT |CLOCK_EVT_FEAT_DUMMY ; evt->rating =100 ; - evt->set_mode = dummy_timer_set_mode; evt->cpumask =cpumask_of (cpu);clockevents_register_device (evt);
Signature · 1 line
2.4.0
PATCH 5/41 clocksource: dw_apb: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate dw_apb driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/dw_apb_timer.c | 143 +++++++++++++++++++++---------------- 1 file changed, 81 insertions(+), 62 deletions(-)
drivers/clocksource/dw_apb_timer.c +81 -62
@@ -110,71 +110,87 @@ static void apbt_enable_int(struct dw_apb_timer *timer)apbt_writel (timer, ctrl,APBTMR_N_CONTROL ); } -static void apbt_set_mode (enum clock_event_mode mode, -struct clock_event_device *evt) +static int apbt_shutdown (struct clock_event_device *evt) { +struct dw_apb_clock_event_device *dw_ced =ced_to_dw_apb_ced (evt);unsigned long ctrl; -unsigned long period; + +pr_debug ("%s CPU %d state=shutdown\n" , __func__, +cpumask_first (evt->cpumask)); + + ctrl =apbt_readl (&dw_ced->timer,APBTMR_N_CONTROL ); + ctrl &= ~APBTMR_CONTROL_ENABLE ; +apbt_writel (&dw_ced->timer, ctrl,APBTMR_N_CONTROL ); +return 0 ; +} + +static int apbt_set_oneshot (struct clock_event_device *evt) +{struct dw_apb_clock_event_device *dw_ced =ced_to_dw_apb_ced (evt); +unsigned long ctrl; -pr_debug ("%s CPU %d mode=%d\n" , __func__, -cpumask_first (evt->cpumask), - mode); - -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : - period =DIV_ROUND_UP (dw_ced->timer.freq,HZ ); - ctrl =apbt_readl (&dw_ced->timer,APBTMR_N_CONTROL ); - ctrl |=APBTMR_CONTROL_MODE_PERIODIC ; -apbt_writel (&dw_ced->timer, ctrl,APBTMR_N_CONTROL ); -/* -* DW APB p. 46, have to disable timer before load counter, -* may cause sync problem. -*/ - ctrl &= ~APBTMR_CONTROL_ENABLE ; -apbt_writel (&dw_ced->timer, ctrl,APBTMR_N_CONTROL ); -udelay (1 ); -pr_debug ("Setting clock period %lu for HZ %d\n" , period,HZ ); -apbt_writel (&dw_ced->timer, period,APBTMR_N_LOAD_COUNT ); - ctrl |=APBTMR_CONTROL_ENABLE ; -apbt_writel (&dw_ced->timer, ctrl,APBTMR_N_CONTROL ); -break ; - -case CLOCK_EVT_MODE_ONESHOT : - ctrl =apbt_readl (&dw_ced->timer,APBTMR_N_CONTROL ); -/* -* set free running mode, this mode will let timer reload max -* timeout which will give time (3min on 25MHz clock) to rearm -* the next event, therefore emulate the one-shot mode. -*/ - ctrl &= ~APBTMR_CONTROL_ENABLE ; - ctrl &= ~APBTMR_CONTROL_MODE_PERIODIC ; - -apbt_writel (&dw_ced->timer, ctrl,APBTMR_N_CONTROL ); -/* write again to set free running mode */ -apbt_writel (&dw_ced->timer, ctrl,APBTMR_N_CONTROL ); - -/* -* DW APB p. 46, load counter with all 1s before starting free -* running mode. -*/ -apbt_writel (&dw_ced->timer, ~0 ,APBTMR_N_LOAD_COUNT ); - ctrl &= ~APBTMR_CONTROL_INT ; - ctrl |=APBTMR_CONTROL_ENABLE ; -apbt_writel (&dw_ced->timer, ctrl,APBTMR_N_CONTROL ); -break ; - -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : - ctrl =apbt_readl (&dw_ced->timer,APBTMR_N_CONTROL ); - ctrl &= ~APBTMR_CONTROL_ENABLE ; -apbt_writel (&dw_ced->timer, ctrl,APBTMR_N_CONTROL ); -break ; - -case CLOCK_EVT_MODE_RESUME : -apbt_enable_int (&dw_ced->timer); -break ; - } +pr_debug ("%s CPU %d state=oneshot\n" , __func__, +cpumask_first (evt->cpumask)); + + ctrl =apbt_readl (&dw_ced->timer,APBTMR_N_CONTROL ); +/* +* set free running mode, this mode will let timer reload max +* timeout which will give time (3min on 25MHz clock) to rearm +* the next event, therefore emulate the one-shot mode. +*/ + ctrl &= ~APBTMR_CONTROL_ENABLE ; + ctrl &= ~APBTMR_CONTROL_MODE_PERIODIC ; + +apbt_writel (&dw_ced->timer, ctrl,APBTMR_N_CONTROL ); +/* write again to set free running mode */ +apbt_writel (&dw_ced->timer, ctrl,APBTMR_N_CONTROL ); + +/* +* DW APB p. 46, load counter with all 1s before starting free +* running mode. +*/ +apbt_writel (&dw_ced->timer, ~0 ,APBTMR_N_LOAD_COUNT ); + ctrl &= ~APBTMR_CONTROL_INT ; + ctrl |=APBTMR_CONTROL_ENABLE ; +apbt_writel (&dw_ced->timer, ctrl,APBTMR_N_CONTROL ); +return 0 ; +} + +static int apbt_set_periodic (struct clock_event_device *evt) +{ +struct dw_apb_clock_event_device *dw_ced =ced_to_dw_apb_ced (evt); +unsigned long period =DIV_ROUND_UP (dw_ced->timer.freq,HZ ); +unsigned long ctrl; + +pr_debug ("%s CPU %d state=periodic\n" , __func__, +cpumask_first (evt->cpumask)); + + ctrl =apbt_readl (&dw_ced->timer,APBTMR_N_CONTROL ); + ctrl |=APBTMR_CONTROL_MODE_PERIODIC ; +apbt_writel (&dw_ced->timer, ctrl,APBTMR_N_CONTROL ); +/* +* DW APB p. 46, have to disable timer before load counter, +* may cause sync problem. +*/ + ctrl &= ~APBTMR_CONTROL_ENABLE ; +apbt_writel (&dw_ced->timer, ctrl,APBTMR_N_CONTROL ); +udelay (1 ); +pr_debug ("Setting clock period %lu for HZ %d\n" , period,HZ ); +apbt_writel (&dw_ced->timer, period,APBTMR_N_LOAD_COUNT ); + ctrl |=APBTMR_CONTROL_ENABLE ; +apbt_writel (&dw_ced->timer, ctrl,APBTMR_N_CONTROL ); +return 0 ; +} + +static int apbt_resume (struct clock_event_device *evt) +{ +struct dw_apb_clock_event_device *dw_ced =ced_to_dw_apb_ced (evt); + +pr_debug ("%s CPU %d state=resume\n" , __func__, +cpumask_first (evt->cpumask)); + +apbt_enable_int (&dw_ced->timer); +return 0 ; } static int apbt_next_event(unsigned long delta,
@@ -233,7 +249,10 @@ dw_apb_clockevent_init(int cpu, const char *name, unsigned rating, dw_ced->ced.min_delta_ns =clockevent_delta2ns (5000 , &dw_ced->ced); dw_ced->ced.cpumask =cpumask_of (cpu); dw_ced->ced.features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT ; - dw_ced->ced.set_mode = apbt_set_mode; + 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.tick_resume = apbt_resume; dw_ced->ced.set_next_event = apbt_next_event; dw_ced->ced.irq = dw_ced->timer.irq; dw_ced->ced.rating = rating;
Signature · 1 line
2.4.0
PATCH 6/41 clocksource: exynos_mct: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate exynos_mct driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/exynos_mct.c | 85 +++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 45 deletions(-)
drivers/clocksource/exynos_mct.c +40 -45
@@ -257,15 +257,14 @@ static void exynos4_mct_comp0_stop(void)exynos4_mct_write (0 ,EXYNOS4_MCT_G_INT_ENB ); } -static void exynos4_mct_comp0_start (enum clock_event_mode mode, -unsigned long cycles) +static void exynos4_mct_comp0_start (bool periodic,unsigned long cycles) {unsigned int tcon;cycle_t comp_cycle; tcon =readl_relaxed (reg_base +EXYNOS4_MCT_G_TCON ); -if (mode ==CLOCK_EVT_MODE_PERIODIC ) { +if (periodic) { tcon |=MCT_G_TCON_COMP0_AUTO_INC ;exynos4_mct_write (cycles,EXYNOS4_MCT_G_COMP0_ADD_INCR ); }
@@ -283,38 +282,38 @@ static void exynos4_mct_comp0_start(enum clock_event_mode mode,static int exynos4_comp_set_next_event (unsigned long cycles,struct clock_event_device *evt) { -exynos4_mct_comp0_start (evt->mode, cycles); +exynos4_mct_comp0_start (false, cycles);return 0 ; } -static void exynos4_comp_set_mode (enum clock_event_mode mode, -struct clock_event_device *evt) +static int mct_set_state_shutdown (struct clock_event_device *evt) { -unsigned long cycles_per_jiffy;exynos4_mct_comp0_stop (); +return 0 ; +} -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : - cycles_per_jiffy = - (((unsigned long long )NSEC_PER_SEC /HZ * evt->mult) >> evt->shift); -exynos4_mct_comp0_start (mode, cycles_per_jiffy); -break ; +static int mct_set_state_periodic (struct clock_event_device *evt) +{ +unsigned long cycles_per_jiffy; -case CLOCK_EVT_MODE_ONESHOT : -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -case CLOCK_EVT_MODE_RESUME : -break ; - } + cycles_per_jiffy = (((unsigned long long )NSEC_PER_SEC /HZ * evt->mult) + >> evt->shift); +exynos4_mct_comp0_stop (); +exynos4_mct_comp0_start (true, cycles_per_jiffy); +return 0 ; }static struct clock_event_device mct_comp_device = { - .name ="mct-comp" , - .features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT , - .rating =250 , - .set_next_event = exynos4_comp_set_next_event, - .set_mode = exynos4_comp_set_mode, + .name ="mct-comp" , + .features =CLOCK_EVT_FEAT_PERIODIC | +CLOCK_EVT_FEAT_ONESHOT , + .rating =250 , + .set_next_event = exynos4_comp_set_next_event, + .set_state_periodic = mct_set_state_periodic, + .set_state_shutdown = mct_set_state_shutdown, + .set_state_oneshot = mct_set_state_shutdown, + .tick_resume = mct_set_state_shutdown, };static irqreturn_t exynos4_mct_comp_isr (int irq,void *dev_id)
@@ -390,39 +389,32 @@ static int exynos4_tick_set_next_event(unsigned long cycles,return 0 ; } -static inline void exynos4_tick_set_mode (enum clock_event_mode mode, -struct clock_event_device *evt) +static int set_state_shutdown (struct clock_event_device *evt) +{ +exynos4_mct_tick_stop (this_cpu_ptr (&percpu_mct_tick)); +return 0 ; +} + +static int set_state_periodic (struct clock_event_device *evt) {struct mct_clock_event_device *mevt =this_cpu_ptr (&percpu_mct_tick);unsigned long cycles_per_jiffy; + cycles_per_jiffy = (((unsigned long long )NSEC_PER_SEC /HZ * evt->mult) + >> evt->shift);exynos4_mct_tick_stop (mevt); - -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : - cycles_per_jiffy = - (((unsigned long long )NSEC_PER_SEC /HZ * evt->mult) >> evt->shift); -exynos4_mct_tick_start (cycles_per_jiffy, mevt); -break ; - -case CLOCK_EVT_MODE_ONESHOT : -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -case CLOCK_EVT_MODE_RESUME : -break ; - } +exynos4_mct_tick_start (cycles_per_jiffy, mevt); +return 0 ; }static void exynos4_mct_tick_clear (struct mct_clock_event_device *mevt) { -struct clock_event_device *evt = &mevt->evt; -/* * This is for supporting oneshot mode. * Mct would generate interrupt periodically * without explicit stopping. */ -if (evt->mode !=CLOCK_EVT_MODE_PERIODIC ) +if (!clockevent_state_periodic (&mevt->evt))exynos4_mct_tick_stop (mevt);/* Clear the MCT tick interrupt */
@@ -455,7 +447,10 @@ static int exynos4_local_timer_setup(struct clock_event_device *evt) evt->name = mevt->name; evt->cpumask =cpumask_of (cpu); evt->set_next_event = exynos4_tick_set_next_event; - evt->set_mode = exynos4_tick_set_mode; + evt->set_state_periodic = set_state_periodic; + evt->set_state_shutdown = set_state_shutdown; + evt->set_state_oneshot = set_state_shutdown; + evt->tick_resume = set_state_shutdown; evt->features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT ; evt->rating =450 ;
@@ -482,7 +477,7 @@ static int exynos4_local_timer_setup(struct clock_event_device *evt)static void exynos4_local_timer_stop (struct clock_event_device *evt) { - evt->set_mode (CLOCK_EVT_MODE_UNUSED , evt); + evt->set_state_shutdown (evt);if (mct_int_type ==MCT_INT_SPI )free_irq (evt->irq,this_cpu_ptr (&percpu_mct_tick));else
Signature · 1 line
2.4.0
Re: [PATCH 06/41] clocksource: exynos_mct: Migrate to new 'set-state' interface
Hi Viresh,
(adding samsung list and Krzysztof to c/c)
Please don't forget to send patches to platform list and platform maintainers.
Quoted 96 lines · Viresh Kumar
Migrate
exynos_mctdriver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.Cc Kukjin Kim <[email protected]>Signed-off-by Viresh Kumar <[email protected]>--- drivers/clocksource/exynos_mct.c | 85 +++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 45 deletions(-)drivers/clocksource/exynos_mct.c +23
-24@@ -257,15 +257,14 @@ static void exynos4_mct_comp0_stop(void)exynos4_mct_write (0 ,EXYNOS4_MCT_G_INT_ENB ); } -static void exynos4_mct_comp0_start (enum clock_event_mode mode, -unsigned long cycles) +static void exynos4_mct_comp0_start (bool periodic,unsigned long cycles) {unsigned int tcon;cycle_t comp_cycle; tcon =readl_relaxed (reg_base +EXYNOS4_MCT_G_TCON ); -if (mode ==CLOCK_EVT_MODE_PERIODIC ) { +if (periodic) { tcon |=MCT_G_TCON_COMP0_AUTO_INC ;exynos4_mct_write (cycles,EXYNOS4_MCT_G_COMP0_ADD_INCR ); }@@ -283,38 +282,38 @@ static void exynos4_mct_comp0_start(enum clock_event_mode mode,static int exynos4_comp_set_next_event (unsigned long cycles,struct clock_event_device *evt) { -exynos4_mct_comp0_start (evt->mode, cycles); +exynos4_mct_comp0_start (false, cycles);return 0 ; } -static void exynos4_comp_set_mode (enum clock_event_mode mode, -struct clock_event_device *evt) +static int mct_set_state_shutdown (struct clock_event_device *evt) { -unsigned long cycles_per_jiffy;exynos4_mct_comp0_stop (); +return 0 ; +} -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : - cycles_per_jiffy = - (((unsigned long long )NSEC_PER_SEC /HZ * evt->mult) >> evt->shift); -exynos4_mct_comp0_start (mode, cycles_per_jiffy); -break ; +static int mct_set_state_periodic (struct clock_event_device *evt) +{ +unsigned long cycles_per_jiffy; -case CLOCK_EVT_MODE_ONESHOT : -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -case CLOCK_EVT_MODE_RESUME : -break ; - } + cycles_per_jiffy = (((unsigned long long )NSEC_PER_SEC /HZ * evt->mult) + >> evt->shift); +exynos4_mct_comp0_stop (); +exynos4_mct_comp0_start (true, cycles_per_jiffy); +return 0 ; }static struct clock_event_device mct_comp_device = { - .name ="mct-comp" , - .features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT , - .rating =250 , - .set_next_event = exynos4_comp_set_next_event, - .set_mode = exynos4_comp_set_mode, + .name ="mct-comp" , + .features =CLOCK_EVT_FEAT_PERIODIC | +CLOCK_EVT_FEAT_ONESHOT , + .rating =250 , + .set_next_event = exynos4_comp_set_next_event, + .set_state_periodic = mct_set_state_periodic, + .set_state_shutdown = mct_set_state_shutdown, + .set_state_oneshot = mct_set_state_shutdown, + .tick_resume = mct_set_state_shutdown, };static irqreturn_t exynos4_mct_comp_isr (int irq,void *dev_id)
drivers/clocksource/exynos_mct.c static int exynos4_tick_set_next_event(unsigned long cycles, · line 394
Quoted 8 lines
drivers/clocksource/exynos_mct.c +3
-2@@ -390,39 +389,32 @@ static int exynos4_tick_set_next_event(unsigned long cycles,return 0 ; } -static inline void exynos4_tick_set_mode (enum clock_event_mode mode, -struct clock_event_device *evt) +static int set_state_shutdown (struct clock_event_device *evt) +{ +exynos4_mct_tick_stop (this_cpu_ptr (&percpu_mct_tick));
Passed evt pointer isn't used and instead you're going to locate percpu_mct_tick struct knowing current cpu number offset. What do you think, since evt is embedded into percpu_mct_tick structure then maybe it will be cheaper to calculate percpu_mct_tick using container_of()?
struct mct_clock_event_device *mevt;
mevt = container_of(evt, struct mct_clock_event_device, evt);
Quoted 44 lines
drivers/clocksource/exynos_mct.c +9
-17+return 0 ; +} + +static int set_state_periodic (struct clock_event_device *evt) {struct mct_clock_event_device *mevt =this_cpu_ptr (&percpu_mct_tick);unsigned long cycles_per_jiffy; + cycles_per_jiffy = (((unsigned long long )NSEC_PER_SEC /HZ * evt->mult) + >> evt->shift);exynos4_mct_tick_stop (mevt); - -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : - cycles_per_jiffy = - (((unsigned long long )NSEC_PER_SEC /HZ * evt->mult) >> evt->shift); -exynos4_mct_tick_start (cycles_per_jiffy, mevt); -break ; - -case CLOCK_EVT_MODE_ONESHOT : -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -case CLOCK_EVT_MODE_RESUME : -break ; - } +exynos4_mct_tick_start (cycles_per_jiffy, mevt); +return 0 ; }static void exynos4_mct_tick_clear (struct mct_clock_event_device *mevt) { -struct clock_event_device *evt = &mevt->evt; -/* * This is for supporting oneshot mode. * Mct would generate interrupt periodically * without explicit stopping. */ -if (evt->mode !=CLOCK_EVT_MODE_PERIODIC ) +if (!clockevent_state_periodic (&mevt->evt))exynos4_mct_tick_stop (mevt);/* Clear the MCT tick interrupt */
drivers/clocksource/exynos_mct.c static int exynos4_local_timer_setup(struct clock_event_device *evt) · line 453
Quoted 8 lines
drivers/clocksource/exynos_mct.c +4
-1@@ -455,7 +447,10 @@ static int exynos4_local_timer_setup(struct clock_event_device *evt) evt->name = mevt->name; evt->cpumask =cpumask_of (cpu); evt->set_next_event = exynos4_tick_set_next_event; - evt->set_mode = exynos4_tick_set_mode; + evt->set_state_periodic = set_state_periodic; + evt->set_state_shutdown = set_state_shutdown; + evt->set_state_oneshot = set_state_shutdown; + evt->tick_resume = set_state_shutdown;
Do i correctly understand that during massive hot-plug cpu events (i guess that will lead to CPU_STARING notification) on power management this *_timer_setup() function will be called?
And here code performs setting of rather constant values and copying. You're going to increase number of such strange assignments.
Well, just lazy-thinking. Can we do something like this:
for_each_possible_cpu(cpu) {
exynos4_local_timer_setup_prepare(&per_cpu(percpu_mct_tick,
cpu).evt, cpu);
}
somewhere in exynos_mct init functions and assign most of these values for each evt structure?
And make *_timer_setup() function lighter moving some code to prepare/init functions.
If it makes any sense i can take a look and try to prepare patch.
drivers/clocksource/exynos_mct.c static int exynos4_local_timer_setup(struct clock_event_device *evt)
Quoted 13 lines
drivers/clocksource/exynos_mct.c +1
-2evt->features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT ; evt->rating =450 ;@@ -482,7 +477,7 @@ static int exynos4_local_timer_setup(struct clock_event_device *evt)static void exynos4_local_timer_stop (struct clock_event_device *evt) { - evt->set_mode (CLOCK_EVT_MODE_UNUSED , evt); + evt->set_state_shutdown (evt);if (mct_int_type ==MCT_INT_SPI )free_irq (evt->irq,this_cpu_ptr (&percpu_mct_tick));else --
Do you need testers? I can test it on odroid-xu3.
Can't find in emails similar patch for ARM arch timer. Any plans about it? Or if it's already converted to 'set-state' then could you please share a link?
Thanks and best regards,
Alexey Klimov
Re: [PATCH 06/41] clocksource: exynos_mct: Migrate to new 'set-state' interface
Hi Alexey,
Quoted 1 line · Alexey Klimov
(adding samsung list and Krzysztof to c/c)
Thanks.
Quoted 1 line
Please don't forget to send patches to platform list and platform maintainers.
Hmmm, I cc'd Kukjin on this patch as he was the one Acking most of the patches on this driver recently (had a look at git log). Also looked at MAINTAINERS and the driver itself to look for maintainers, and kukjin was all I can find. Yes, get_maintainers gave the two names you added, but many a times it generates list longer than required and so I don't completely depend on that.
Anyway, thanks.
Quoted 4 lines · Viresh Kumar
drivers/clocksource/exynos_mct.c static int exynos4_tick_set_next_event(unsigned long cycles, · line 394
Quoted 3 lines
drivers/clocksource/exynos_mct.c +3
-0+static int set_state_shutdown (struct clock_event_device *evt) +{ +exynos4_mct_tick_stop (this_cpu_ptr (&percpu_mct_tick));
Let me clarify the purpose of this patch and the series.
Its only about breaking the older ->set_mode() callback into state based callbacks and not change the way things were done. And so no improvements in this patch. If there are improvements possible on the driver, then they must be done separately.
Quoted 1 line
Passed evt pointer isn't used
Its a callback from clockevents core, and we can't get rid of the argument. :)
Quoted 2 lines
and instead you're going to locate
percpu_mct_tickstruct knowing current cpu number offset.
That's the way ->set_mode() was doing it and so I didn't touched it to keep this patch simple.
Quoted 6 lines
What do you think, since evt is embedded into
percpu_mct_tickstructure then maybe it will be cheaper to calculatepercpu_mct_tickusingcontainer_of()?struct
mct_clock_event_device*mevt;
mevt =container_of(evt, struct mct_clock_event_device, evt);
Ofcourse, but that has to be fixed for many routines and should be done in a separate patch. It doesn't belong to this one.
Quoted 5 lines
Quoted 5 lines
drivers/clocksource/exynos_mct.c +0
-1@@ -455,7 +447,10 @@ static int exynos4_local_timer_setup(struct clock_event_device *evt) evt->name = mevt->name; evt->cpumask =cpumask_of (cpu); evt->set_next_event = exynos4_tick_set_next_event; - evt->set_mode = exynos4_tick_set_mode;
Quoted 8 lines
drivers/clocksource/exynos_mct.c static int exynos4_local_timer_setup(struct clock_event_device *evt) · line 453
Quoted 4 lines
drivers/clocksource/exynos_mct.c +4
-0+ evt->set_state_periodic = set_state_periodic; + evt->set_state_shutdown = set_state_shutdown; + evt->set_state_oneshot = set_state_shutdown; + evt->tick_resume = set_state_shutdown;Do i correctly understand that during massive hot-plug cpu events (i guess that will lead to
CPU_STARINGnotification) on power management this*_timer_setup()function will be called?
I hope so.
Quoted 10 lines
And here code performs setting of rather constant values and copying. You're going to increase number of such strange assignments.
Well, just lazy-thinking. Can we do something like this:
for_each_possible_cpu(cpu){
exynos4_local_timer_setup_prepare(&per_cpu(percpu_mct_tick,
cpu).evt, cpu);
}
Quoted 4 lines
somewhere in
exynos_mctinit functions and assign most of these values for each evt structure?
And make*_timer_setup()function lighter moving some code to prepare/init functions.
I agree.. But again, that has to be done in a separate patch.
Quoted 1 line
If it makes any sense i can take a look and try to prepare patch.
Sure..
Quoted 1 line
Do you need testers? I can test it on odroid-xu3.
That will be good.
Quoted 3 lines
Can't find in emails similar patch for ARM arch timer. Any plans about it? Or if it's already converted to 'set-state' then could you please share a link?
https://git.linaro.org/people/daniel.lezcano/linux.git/shortlog/refs/heads/clockevents/4.3
Signature · 1 line
viresh
PATCH 7/41 clocksource: fsl_ftm: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate fsl_ftm driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/fsl_ftm_timer.c | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-)
drivers/clocksource/fsl_ftm_timer.c +17 -18
@@ -153,19 +153,16 @@ static int ftm_set_next_event(unsigned long delta,return 0 ; } -static void ftm_set_mode (enum clock_event_mode mode, -struct clock_event_device *evt) +static int ftm_set_oneshot (struct clock_event_device *evt) { -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -ftm_set_next_event (priv->periodic_cyc, evt); -break ; -case CLOCK_EVT_MODE_ONESHOT : -ftm_counter_disable (priv->clkevt_base); -break ; -default : -return ; - } +ftm_counter_disable (priv->clkevt_base); +return 0 ; +} + +static int ftm_set_periodic (struct clock_event_device *evt) +{ +ftm_set_next_event (priv->periodic_cyc, evt); +return 0 ; }static irqreturn_t ftm_evt_interrupt (int irq,void *dev_id)
@@ -174,7 +171,7 @@ static irqreturn_t ftm_evt_interrupt(int irq, void *dev_id)ftm_irq_acknowledge (priv->clkevt_base); -if (likely (evt->mode ==CLOCK_EVT_MODE_ONESHOT )) { +if (likely (clockevent_state_oneshot (evt))) {ftm_irq_disable (priv->clkevt_base);ftm_counter_disable (priv->clkevt_base); }
@@ -185,11 +182,13 @@ static irqreturn_t ftm_evt_interrupt(int irq, void *dev_id) }static struct clock_event_device ftm_clockevent = { - .name ="Freescale ftm timer" , - .features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT , - .set_mode = ftm_set_mode, - .set_next_event = ftm_set_next_event, - .rating =300 , + .name ="Freescale ftm timer" , + .features =CLOCK_EVT_FEAT_PERIODIC | +CLOCK_EVT_FEAT_ONESHOT , + .set_state_periodic = ftm_set_periodic, + .set_state_oneshot = ftm_set_oneshot, + .set_next_event = ftm_set_next_event, + .rating =300 , };static struct irqaction ftm_timer_irq = {
Signature · 1 line
2.4.0
PATCH 8/41 clocksource: i8253: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate i8253 driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- arch/x86/kernel/i8253.c | 2 +- drivers/clocksource/i8253.c | 77 ++++++++++++++++++++++----------------------- 2 files changed, 39 insertions(+), 40 deletions(-)
arch/x86/kernel/i8253.c +1 -1
@@ -34,7 +34,7 @@ static int __init init_pit_clocksource(void)* - when local APIC timer is active (PIT is switched off) */ if (num_possible_cpus () >1 ||is_hpet_enabled () || - i8253_clockevent.mode !=CLOCK_EVT_MODE_PERIODIC ) + !clockevent_state_periodic (&i8253_clockevent))return 0 ;return clocksource_i8253_init ();
drivers/clocksource/i8253.c +38 -39
100 lines not on this page · raw message
Signature · 1 line
2.4.0
PATCH 9/41 clocksource: meson6: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate meson6 driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/meson6_timer.c | 50 ++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 23 deletions(-)
drivers/clocksource/meson6_timer.c +27 -23
@@ -67,25 +67,25 @@ static void meson6_clkevt_time_start(unsigned char timer, bool periodic)writel (val |TIMER_ENABLE_BIT (timer), timer_base +TIMER_ISA_MUX ); } -static void meson6_clkevt_mode (enum clock_event_mode mode, -struct clock_event_device *clk) +static int meson6_shutdown (struct clock_event_device *evt) { -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -meson6_clkevt_time_stop (CED_ID ); -meson6_clkevt_time_setup (CED_ID ,USEC_PER_SEC /HZ -1 ); -meson6_clkevt_time_start (CED_ID , true); -break ; -case CLOCK_EVT_MODE_ONESHOT : -meson6_clkevt_time_stop (CED_ID ); -meson6_clkevt_time_start (CED_ID , false); -break ; -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -default : -meson6_clkevt_time_stop (CED_ID ); -break ; - } +meson6_clkevt_time_stop (CED_ID ); +return 0 ; +} + +static int meson6_set_oneshot (struct clock_event_device *evt) +{ +meson6_clkevt_time_stop (CED_ID ); +meson6_clkevt_time_start (CED_ID , false); +return 0 ; +} + +static int meson6_set_periodic (struct clock_event_device *evt) +{ +meson6_clkevt_time_stop (CED_ID ); +meson6_clkevt_time_setup (CED_ID ,USEC_PER_SEC /HZ -1 ); +meson6_clkevt_time_start (CED_ID , true); +return 0 ; } static int meson6_clkevt_next_event(unsigned long evt,
@@ -99,11 +99,15 @@ static int meson6_clkevt_next_event(unsigned long evt, }static struct clock_event_device meson6_clockevent = { - .name ="meson6_tick" , - .rating =400 , - .features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT , - .set_mode = meson6_clkevt_mode, - .set_next_event = meson6_clkevt_next_event, + .name ="meson6_tick" , + .rating =400 , + .features =CLOCK_EVT_FEAT_PERIODIC | +CLOCK_EVT_FEAT_ONESHOT , + .set_state_shutdown = meson6_shutdown, + .set_state_periodic = meson6_set_periodic, + .set_state_oneshot = meson6_set_oneshot, + .tick_resume = meson6_shutdown, + .set_next_event = meson6_clkevt_next_event, };static irqreturn_t meson6_timer_interrupt (int irq,void *dev_id)
Signature · 1 line
2.4.0
Re: [PATCH 09/41] clocksource: meson6: Migrate to new 'set-state' interface
Quoted 4 lines · Viresh Kumar
Migrate meson6 driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
Quoted 8 lines
This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.Cc Carlo Caione <[email protected]>Signed-off-by Viresh Kumar <[email protected]>--- drivers/clocksource/meson6_timer.c | 50 ++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 23 deletions(-)
Signature · 1 line
Carlo Caione
PATCH 10/41 clocksource: metag_generic: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate metag_generic driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
We weren't doing anything in the ->set_mode() callback. Even the WARN() for periodic or unused modes isn't required anymore as the core is taking care of that now. So, this patch doesn't provide any set-state callbacks.
--- drivers/clocksource/metag_generic.c | 20 -------------------- 1 file changed, 20 deletions(-)
drivers/clocksource/metag_generic.c +0 -20
@@ -56,25 +56,6 @@ static int metag_timer_set_next_event(unsigned long delta,return 0 ; } -static void metag_timer_set_mode (enum clock_event_mode mode, -struct clock_event_device *evt) -{ -switch (mode) { -case CLOCK_EVT_MODE_ONESHOT : -case CLOCK_EVT_MODE_RESUME : -break ; - -case CLOCK_EVT_MODE_SHUTDOWN : -/* We should disable the IRQ here */ -break ; - -case CLOCK_EVT_MODE_PERIODIC : -case CLOCK_EVT_MODE_UNUSED : -WARN_ON (1 ); -break ; - }; -} -static cycle_t metag_clocksource_read (struct clocksource *cs) {return __core_reg_get (TXTIMER );
@@ -129,7 +110,6 @@ static void arch_timer_setup(unsigned int cpu) clk->rating =200 , clk->shift =12 , clk->irq =tbisig_map (TBID_SIGNUM_TRT ), - clk->set_mode = metag_timer_set_mode, clk->set_next_event = metag_timer_set_next_event, clk->mult =div_sc (hwtimer_freq,NSEC_PER_SEC , clk->shift);
Signature · 1 line
2.4.0
PATCH 11/41 clocksource: mips-gic: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate mips-gic driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
We weren't doing anything in the ->set_mode() callback. So, this patch doesn't provide any set-state callbacks.
--- drivers/clocksource/mips-gic-timer.c | 7 ------- 1 file changed, 7 deletions(-)
drivers/clocksource/mips-gic-timer.c +0 -7
@@ -33,12 +33,6 @@ static int gic_next_event(unsigned long delta, struct clock_event_device *evt)return res; } -static void gic_set_clock_mode (enum clock_event_mode mode, -struct clock_event_device *evt) -{ -/* Nothing to do ... */ -} -static irqreturn_t gic_compare_interrupt (int irq,void *dev_id) {struct clock_event_device *cd = dev_id;
@@ -67,7 +61,6 @@ static void gic_clockevent_cpu_init(struct clock_event_device *cd) cd->irq = gic_timer_irq; cd->cpumask =cpumask_of (cpu); cd->set_next_event = gic_next_event; - cd->set_mode = gic_set_clock_mode;clockevents_config_and_register (cd, gic_frequency,0x300 ,0x7fffffff );
Signature · 1 line
2.4.0
PATCH 12/41 clocksource: moxart: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate moxart driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/moxart_timer.c | 49 ++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 23 deletions(-)
drivers/clocksource/moxart_timer.c +26 -23
@@ -58,25 +58,24 @@static void __iomem *base;static unsigned int clock_count_per_tick; -static void moxart_clkevt_mode (enum clock_event_mode mode, -struct clock_event_device *clk) +static int moxart_shutdown (struct clock_event_device *evt) { -switch (mode) { -case CLOCK_EVT_MODE_RESUME : -case CLOCK_EVT_MODE_ONESHOT : -writel (TIMER1_DISABLE , base +TIMER_CR ); -writel (~0 , base +TIMER1_BASE +REG_LOAD ); -break ; -case CLOCK_EVT_MODE_PERIODIC : -writel (clock_count_per_tick, base +TIMER1_BASE +REG_LOAD ); -writel (TIMER1_ENABLE , base +TIMER_CR ); -break ; -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -default : -writel (TIMER1_DISABLE , base +TIMER_CR ); -break ; - } +writel (TIMER1_DISABLE , base +TIMER_CR ); +return 0 ; +} + +static int moxart_set_oneshot (struct clock_event_device *evt) +{ +writel (TIMER1_DISABLE , base +TIMER_CR ); +writel (~0 , base +TIMER1_BASE +REG_LOAD ); +return 0 ; +} + +static int moxart_set_periodic (struct clock_event_device *evt) +{ +writel (clock_count_per_tick, base +TIMER1_BASE +REG_LOAD ); +writel (TIMER1_ENABLE , base +TIMER_CR ); +return 0 ; } static int moxart_clkevt_next_event(unsigned long cycles,
@@ -95,11 +94,15 @@ static int moxart_clkevt_next_event(unsigned long cycles, }static struct clock_event_device moxart_clockevent = { - .name ="moxart_timer" , - .rating =200 , - .features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT , - .set_mode = moxart_clkevt_mode, - .set_next_event = moxart_clkevt_next_event, + .name ="moxart_timer" , + .rating =200 , + .features =CLOCK_EVT_FEAT_PERIODIC | +CLOCK_EVT_FEAT_ONESHOT , + .set_state_shutdown = moxart_shutdown, + .set_state_periodic = moxart_set_periodic, + .set_state_oneshot = moxart_set_oneshot, + .tick_resume = moxart_set_oneshot, + .set_next_event = moxart_clkevt_next_event, };static irqreturn_t moxart_timer_interrupt (int irq,void *dev_id)
Signature · 1 line
2.4.0
PATCH 13/41 clocksource: mtk: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate mtk driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/mtk_timer.c | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-)
drivers/clocksource/mtk_timer.c +14 -18
@@ -102,27 +102,20 @@ static void mtk_clkevt_time_start(struct mtk_clock_event_device *evt, evt->gpt_base + TIMER_CTRL_REG(timer)); } -static void mtk_clkevt_mode (enum clock_event_mode mode, -struct clock_event_device *clk) +static int mtk_clkevt_shutdown (struct clock_event_device *clk) +{ +mtk_clkevt_time_stop (to_mtk_clk (clk),GPT_CLK_EVT ); +return 0 ; +} + +static int mtk_clkevt_set_periodic (struct clock_event_device *clk) {struct mtk_clock_event_device *evt =to_mtk_clk (clk);mtk_clkevt_time_stop (evt,GPT_CLK_EVT ); - -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -mtk_clkevt_time_setup (evt, evt->ticks_per_jiffy,GPT_CLK_EVT ); -mtk_clkevt_time_start (evt, true,GPT_CLK_EVT ); -break ; -case CLOCK_EVT_MODE_ONESHOT : -/* Timer is enabled in set_next_event */ -break ; -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -default : -/* No more interrupts will occur as source is disabled */ -break ; - } +mtk_clkevt_time_setup (evt, evt->ticks_per_jiffy,GPT_CLK_EVT ); +mtk_clkevt_time_start (evt, true,GPT_CLK_EVT ); +return 0 ; } static int mtk_clkevt_next_event(unsigned long event,
@@ -196,7 +189,10 @@ static void __init mtk_timer_init(struct device_node *node) evt->dev.name ="mtk_tick" ; evt->dev.rating =300 ; evt->dev.features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT ; - evt->dev.set_mode = mtk_clkevt_mode; + evt->dev.set_state_shutdown = mtk_clkevt_shutdown; + evt->dev.set_state_periodic = mtk_clkevt_set_periodic; + evt->dev.set_state_oneshot = mtk_clkevt_shutdown; + evt->dev.tick_resume = mtk_clkevt_shutdown; evt->dev.set_next_event = mtk_clkevt_next_event; evt->dev.cpumask = cpu_possible_mask;
Signature · 1 line
2.4.0
PATCH 14/41 clocksource: mxs: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate mxs driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
Also drop:
- 'mxs_clockevent_mode': as we have helpers available from core for the same.
same state twice and so perhaps the check wasn't required.
- 'clock_event_mode_label': CLOCK_EVT_MODE_* shouldn't be used anymore by drivers and it was used just to print old-state:new-state. The debug prints are called from mxs_irq_clear() now based on the state-name passed to it. The printed name will be same for shutdown and resume states as they use the same callback pointer.
---
@Shawn: Please let me know if you want to print "resume" for resume state, as that will require a separate callback for resume state, just to print the name correctly. I thought it might not be worth enough :)
--- drivers/clocksource/mxs_timer.c | 80 +++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 48 deletions(-)
drivers/clocksource/mxs_timer.c +32 -48
@@ -77,7 +77,6 @@#define BV_TIMROTv2_TIMCTRLn_SELECT__TICK_ALWAYS 0xfstatic struct clock_event_device mxs_clockevent_device; -static enum clock_event_mode mxs_clockevent_mode =CLOCK_EVT_MODE_UNUSED ;static void __iomem *mxs_timrot_base;static u32 timrot_major_version;
@@ -141,64 +140,49 @@ static struct irqaction mxs_timer_irq = { .handler = mxs_timer_interrupt, }; -#ifdef DEBUG -static const char *clock_event_mode_label[] const = { - [CLOCK_EVT_MODE_PERIODIC ] ="CLOCK_EVT_MODE_PERIODIC" , - [CLOCK_EVT_MODE_ONESHOT ] ="CLOCK_EVT_MODE_ONESHOT" , - [CLOCK_EVT_MODE_SHUTDOWN ] ="CLOCK_EVT_MODE_SHUTDOWN" , - [CLOCK_EVT_MODE_UNUSED ] ="CLOCK_EVT_MODE_UNUSED" -}; -#endif /* DEBUG */ - -static void mxs_set_mode (enum clock_event_mode mode, -struct clock_event_device *evt) +static void mxs_irq_clear (char *state) {/* Disable interrupt in timer module */ timrot_irq_disable (); -if (mode != mxs_clockevent_mode) { -/* Set event time into the furthest future */ -if (timrot_is_v1 ()) -__raw_writel (0xffff , - mxs_timrot_base +HW_TIMROT_TIMCOUNTn (1 )); -else -__raw_writel (0xffffffff , - mxs_timrot_base +HW_TIMROT_FIXED_COUNTn (1 )); - -/* Clear pending interrupt */ -timrot_irq_acknowledge (); - } +/* Set event time into the furthest future */ +if (timrot_is_v1 ()) +__raw_writel (0xffff , mxs_timrot_base +HW_TIMROT_TIMCOUNTn (1 )); +else +__raw_writel (0xffffffff , + mxs_timrot_base +HW_TIMROT_FIXED_COUNTn (1 )); + +/* Clear pending interrupt */ +timrot_irq_acknowledge ();#ifdef DEBUG -pr_info ("%s: changing mode from %s to %s\n" , __func__, - clock_event_mode_label[mxs_clockevent_mode], - clock_event_mode_label[mode]); + pr_info("%s: changing mode to %s\n", __func__, state)#endif /* DEBUG */ +} -/* Remember timer mode */ - mxs_clockevent_mode = mode; - -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -pr_err ("%s: Periodic mode is not implemented\n" , __func__); -break ; -case CLOCK_EVT_MODE_ONESHOT : -timrot_irq_enable (); -break ; -case CLOCK_EVT_MODE_SHUTDOWN : -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_RESUME : -/* Left event sources disabled, no more interrupts appear */ -break ; - } +static int mxs_shutdown (struct clock_event_device *evt) +{ +mxs_irq_clear ("shutdown" ); + +return 0 ; +} + +static int mxs_set_oneshot (struct clock_event_device *evt) +{ +if (clockevent_state_oneshot (evt)) +mxs_irq_clear ("oneshot" ); +timrot_irq_enable (); +return 0 ; }static struct clock_event_device mxs_clockevent_device = { - .name ="mxs_timrot" , - .features =CLOCK_EVT_FEAT_ONESHOT , - .set_mode = mxs_set_mode, - .set_next_event = timrotv2_set_next_event, - .rating =200 , + .name ="mxs_timrot" , + .features =CLOCK_EVT_FEAT_ONESHOT , + .set_state_shutdown = mxs_shutdown, + .set_state_oneshot = mxs_set_oneshot, + .tick_resume = mxs_shutdown, + .set_next_event = timrotv2_set_next_event, + .rating =200 , };static int __init mxs_clockevent_init (struct clk *timer_clk)
Signature · 1 line
2.4.0
Re: [PATCH 14/41] clocksource: mxs: Migrate to new 'set-state' interface
Hi Viresh,
[add Fabio, Marek and Pengutronix to CC]
Quoted 21 lines
Viresh Kumar <[email protected]> hat am 18. Juni 2015 um 12:54 geschrieben:
Migrate mxs driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.Also drop:
- 'mxs_clockevent_mode': as we have helpers available from core for the same.
same state twice and so perhaps the check wasn't required.
- 'clock_event_mode_label': CLOCK_EVT_MODE_* shouldn't be used anymore by drivers and it was used just to print old-state:new-state. The debug prints are called frommxs_irq_clear()now based on the state-name passed to it. The printed name will be same for shutdown and resume states as they use the same callback pointer.
Quoted 8 lines
Cc Shawn Guo <[email protected]>Signed-off-by Viresh Kumar <[email protected]>---
@Shawn: Please let me know if you want to print "resume" for resume state, as that will require a separate callback for resume state, just to print the name correctly. I thought it might not be worth enough :)
---
sorry for the late feedback. I've tested the patch with an i.MX23 and an i.MX28 board without any problems.
Regards
Stefan
PATCH 15/41 clocksource: nomadik-mtu: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate nomadik-mtu driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/nomadik-mtu.c | 58 ++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 28 deletions(-)
drivers/clocksource/nomadik-mtu.c +30 -28
@@ -119,28 +119,27 @@ static void nmdk_clkevt_reset(void) } } -static void nmdk_clkevt_mode (enum clock_event_mode mode, -struct clock_event_device *dev) +static int nmdk_clkevt_shutdown (struct clock_event_device *evt) { -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : - clkevt_periodic = true; -nmdk_clkevt_reset (); -break ; -case CLOCK_EVT_MODE_ONESHOT : - clkevt_periodic = false; -break ; -case CLOCK_EVT_MODE_SHUTDOWN : -case CLOCK_EVT_MODE_UNUSED : -writel (0 , mtu_base +MTU_IMSC ); -/* disable timer */ -writel (0 , mtu_base +MTU_CR (1 )); -/* load some high default value */ -writel (0xffffffff , mtu_base +MTU_LR (1 )); -break ; -case CLOCK_EVT_MODE_RESUME : -break ; - } +writel (0 , mtu_base +MTU_IMSC ); +/* disable timer */ +writel (0 , mtu_base +MTU_CR (1 )); +/* load some high default value */ +writel (0xffffffff , mtu_base +MTU_LR (1 )); +return 0 ; +} + +static int nmdk_clkevt_set_oneshot (struct clock_event_device *evt) +{ + clkevt_periodic = false; +return 0 ; +} + +static int nmdk_clkevt_set_periodic (struct clock_event_device *evt) +{ + clkevt_periodic = true; +nmdk_clkevt_reset (); +return 0 ; }static void nmdk_clksrc_reset (void )
@@ -163,13 +162,16 @@ static void nmdk_clkevt_resume(struct clock_event_device *cedev) }static struct clock_event_device nmdk_clkevt = { - .name ="mtu_1" , - .features =CLOCK_EVT_FEAT_ONESHOT |CLOCK_EVT_FEAT_PERIODIC | -CLOCK_EVT_FEAT_DYNIRQ , - .rating =200 , - .set_mode = nmdk_clkevt_mode, - .set_next_event = nmdk_clkevt_next, - .resume = nmdk_clkevt_resume, + .name ="mtu_1" , + .features =CLOCK_EVT_FEAT_ONESHOT | +CLOCK_EVT_FEAT_PERIODIC | +CLOCK_EVT_FEAT_DYNIRQ , + .rating =200 , + .set_state_shutdown = nmdk_clkevt_shutdown, + .set_state_periodic = nmdk_clkevt_set_periodic, + .set_state_oneshot = nmdk_clkevt_set_oneshot, + .set_next_event = nmdk_clkevt_next, + .resume = nmdk_clkevt_resume, };/*
Signature · 1 line
2.4.0
Re: [PATCH 15/41] clocksource: nomadik-mtu: Migrate to new 'set-state' interface
Quoted 9 lines · Viresh Kumar
Migrate nomadik-mtu driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.Cc Linus Walleij <[email protected]>Signed-off-by Viresh Kumar <[email protected]>
Yours,
Linus Walleij
PATCH 16/41 clocksource: pxa: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate pxa driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
Both oneshot and shutdown modes had exactly same code and so only a single callback is sufficient now, which will be called for both the modes.
--- drivers/clocksource/pxa_timer.c | 39 +++++++++++++-------------------------- 1 file changed, 13 insertions(+), 26 deletions(-)
drivers/clocksource/pxa_timer.c +13 -26
@@ -88,26 +88,12 @@ pxa_osmr0_set_next_event(unsigned long delta, struct clock_event_device *dev)return (signed )(next - oscr) <=MIN_OSCR_DELTA ? -ETIME :0 ; } -static void -pxa_osmr0_set_mode (enum clock_event_mode mode,struct clock_event_device *dev) +static int pxa_osmr0_shutdown (struct clock_event_device *evt) { -switch (mode) { -case CLOCK_EVT_MODE_ONESHOT : -timer_writel (timer_readl (OIER ) & ~OIER_E0 ,OIER ); -timer_writel (OSSR_M0 ,OSSR ); -break ; - -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -/* initializing, released, or preparing for suspend */ -timer_writel (timer_readl (OIER ) & ~OIER_E0 ,OIER ); -timer_writel (OSSR_M0 ,OSSR ); -break ; - -case CLOCK_EVT_MODE_RESUME : -case CLOCK_EVT_MODE_PERIODIC : -break ; - } +/* initializing, released, or preparing for suspend */ +timer_writel (timer_readl (OIER ) & ~OIER_E0 ,OIER ); +timer_writel (OSSR_M0 ,OSSR ); +return 0 ; }#ifdef CONFIG_PM
@@ -147,13 +133,14 @@ static void pxa_timer_resume(struct clock_event_device *cedev)#endif static struct clock_event_device ckevt_pxa_osmr0 = { - .name ="osmr0" , - .features =CLOCK_EVT_FEAT_ONESHOT , - .rating =200 , - .set_next_event = pxa_osmr0_set_next_event, - .set_mode = pxa_osmr0_set_mode, - .suspend = pxa_timer_suspend, - .resume = pxa_timer_resume, + .name ="osmr0" , + .features =CLOCK_EVT_FEAT_ONESHOT , + .rating =200 , + .set_next_event = pxa_osmr0_set_next_event, + .set_state_shutdown = pxa_osmr0_shutdown, + .set_state_oneshot = pxa_osmr0_shutdown, + .suspend = pxa_timer_suspend, + .resume = pxa_timer_resume, };static struct irqaction pxa_ost0_irq = {
Signature · 1 line
2.4.0
Re: [PATCH 16/41] clocksource: pxa: Migrate to new 'set-state' interface
Quoted 19 lines · Viresh Kumar
drivers/clocksource/pxa_timer.c +1
-13@@ -88,26 +88,12 @@ pxa_osmr0_set_next_event(unsigned long delta, struct clock_event_device *dev)return (signed )(next - oscr) <=MIN_OSCR_DELTA ? -ETIME :0 ; } -static void -pxa_osmr0_set_mode (enum clock_event_mode mode,struct clock_event_device *dev) +static int pxa_osmr0_shutdown (struct clock_event_device *evt) { -switch (mode) { -case CLOCK_EVT_MODE_ONESHOT : -timer_writel (timer_readl (OIER ) & ~OIER_E0 ,OIER ); -timer_writel (OSSR_M0 ,OSSR ); -break ; - -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -/* initializing, released, or preparing for suspend */ -timer_writel (timer_readl (OIER ) & ~OIER_E0 ,OIER ); -timer_writel (OSSR_M0 ,OSSR );
drivers/clocksource/pxa_timer.c pxa_osmr0_set_next_event(unsigned long delta, struct clock_event_device *dev) · line 96
Quoted 10 lines
drivers/clocksource/pxa_timer.c +4
-6-break ; - -case CLOCK_EVT_MODE_RESUME : -case CLOCK_EVT_MODE_PERIODIC : -break ; - } +/* initializing, released, or preparing for suspend */ +timer_writel (timer_readl (OIER ) & ~OIER_E0 ,OIER ); +timer_writel (OSSR_M0 ,OSSR ); +return 0 ;
For consistency, please leave an empty line before that return statement.
Quoted 7 lines
drivers/clocksource/pxa_timer.c +0
-3@@ -147,13 +133,14 @@ static void pxa_timer_resume(struct clock_event_device *cedev)#endif static struct clock_event_device ckevt_pxa_osmr0 = { - .name ="osmr0" , - .features =CLOCK_EVT_FEAT_ONESHOT , - .rating =200 ,
drivers/clocksource/pxa_timer.c static void pxa_timer_resume(struct clock_event_device *cedev) · line 141
Quoted 10 lines
drivers/clocksource/pxa_timer.c +6
-4- .set_next_event = pxa_osmr0_set_next_event, - .set_mode = pxa_osmr0_set_mode, - .suspend = pxa_timer_suspend, - .resume = pxa_timer_resume, + .name = "osmr0", + .features = CLOCK_EVT_FEAT_ONESHOT, + .rating = 200, + .set_next_event = pxa_osmr0_set_next_event, + .set_state_shutdown = pxa_osmr0_shutdown, + .set_state_oneshot = pxa_osmr0_shutdown,
A bit weird to have a "set_state_oneshot" function to point to a function called "X_shutdown". As I don't have a clear idea on what's this new interface for, I'll just hope it's the intended purpose. The code does look equivalent to me anyway.
Apart from the cosmetic comment, once it is fixed :
Cheers.
Signature · 1 line
Robert
Re: [PATCH 16/41] clocksource: pxa: Migrate to new 'set-state' interface
Hi Robert,
Quoted 5 lines · Robert Jarzmik
drivers/clocksource/pxa_timer.c pxa_osmr0_set_next_event(unsigned long delta, struct clock_event_device *dev) · line 96
Quoted 4 lines
drivers/clocksource/pxa_timer.c +4
-0+/* initializing, released, or preparing for suspend */ +timer_writel (timer_readl (OIER ) & ~OIER_E0 ,OIER ); +timer_writel (OSSR_M0 ,OSSR ); +return 0 ;For consistency, please leave an empty line before that return statement.
Its already applied by Daniel now, and the change is too trivial to request for an update to his tree. Maybe we should leave it as is for now.
Quoted 19 lines
Quoted 7 lines
drivers/clocksource/pxa_timer.c +0
-3@@ -147,13 +133,14 @@ static void pxa_timer_resume(struct clock_event_device *cedev)#endif static struct clock_event_device ckevt_pxa_osmr0 = { - .name ="osmr0" , - .features =CLOCK_EVT_FEAT_ONESHOT , - .rating =200 ,drivers/clocksource/pxa_timer.c static void pxa_timer_resume(struct clock_event_device *cedev) · line 141
Quoted 10 lines
drivers/clocksource/pxa_timer.c +6
-4- .set_next_event = pxa_osmr0_set_next_event, - .set_mode = pxa_osmr0_set_mode, - .suspend = pxa_timer_suspend, - .resume = pxa_timer_resume, + .name = "osmr0", + .features = CLOCK_EVT_FEAT_ONESHOT, + .rating = 200, + .set_next_event = pxa_osmr0_set_next_event, + .set_state_shutdown = pxa_osmr0_shutdown, + .set_state_oneshot = pxa_osmr0_shutdown,A bit weird to have a "
set_state_oneshot" function to point to a function called "X_shutdown".
What's weird (or looks weird) is that we stop the timer when requested to switch to oneshot mode. But that's what we really wanted, because set_next_event is the one that will program the timer in oneshot mode.
Quoted 1 line
As I don't have a clear idea on what's this new interface for,
It just provides per-state API's for what's being done in set_mode() earlier.
Quoted 5 lines
I'll just hope it's the intended purpose. The code does look equivalent to me anyway.
Apart from the cosmetic comment, once it is fixed :
Acked-by Robert Jarzmik <[email protected]>
Thanks.
Signature · 1 line
viresh
Re: [PATCH 16/41] clocksource: pxa: Migrate to new 'set-state' interface
Quoted 9 lines · Viresh Kumar
Hi Robert,
Quoted 5 lines · Robert Jarzmik
drivers/clocksource/pxa_timer.c pxa_osmr0_set_next_event(unsigned long delta, struct clock_event_device *dev) · line 96
Quoted 4 lines
drivers/clocksource/pxa_timer.c +4
-0+/* initializing, released, or preparing for suspend */ +timer_writel (timer_readl (OIER ) & ~OIER_E0 ,OIER ); +timer_writel (OSSR_M0 ,OSSR ); +return 0 ;For consistency, please leave an empty line before that return statement.
Quoted 3 lines
Its already applied by Daniel now, and the change is too trivial to request for an update to his tree. Maybe we should leave it as is for now.
If it's applied it's indeed too late.
Quoted 8 lines
Quoted 4 lines
drivers/clocksource/pxa_timer.c static void pxa_timer_resume(struct clock_event_device *cedev) · line 141
Quoted 2 lines
drivers/clocksource/pxa_timer.c +2
-0+ .set_state_shutdown = pxa_osmr0_shutdown, + .set_state_oneshot = pxa_osmr0_shutdown,A bit weird to have a "
set_state_oneshot" function to point to a function called "X_shutdown".What's weird (or looks weird) is that we stop the timer when requested to switch to oneshot mode. But that's what we really wanted, because
set_next_eventis the one that will program the timer in oneshot mode.
Ok, thanks for the explanation.
Cheers.
Signature · 1 line
Robert
PATCH 17/41 clocksource: qcom: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate qcom driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
Periodic mode isn't supported by the driver and so the callback isn't provided anymore.
--- drivers/clocksource/qcom-timer.c | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-)
drivers/clocksource/qcom-timer.c +7 -17
@@ -47,7 +47,7 @@ static irqreturn_t msm_timer_interrupt(int irq, void *dev_id) {struct clock_event_device *evt = dev_id;/* Stop the timer tick */ -if (evt->mode ==CLOCK_EVT_MODE_ONESHOT ) { +if (clockevent_state_oneshot (evt)) {u32 ctrl =readl_relaxed (event_base +TIMER_ENABLE ); ctrl &= ~TIMER_ENABLE_EN ;writel_relaxed (ctrl, event_base +TIMER_ENABLE );
@@ -75,26 +75,14 @@ static int msm_timer_set_next_event(unsigned long cycles,return 0 ; } -static void msm_timer_set_mode (enum clock_event_mode mode, -struct clock_event_device *evt) +static int msm_timer_shutdown (struct clock_event_device *evt) {u32 ctrl; ctrl =readl_relaxed (event_base +TIMER_ENABLE ); ctrl &= ~(TIMER_ENABLE_EN |TIMER_ENABLE_CLR_ON_MATCH_EN ); - -switch (mode) { -case CLOCK_EVT_MODE_RESUME : -case CLOCK_EVT_MODE_PERIODIC : -break ; -case CLOCK_EVT_MODE_ONESHOT : -/* Timer is enabled in set_next_event */ -break ; -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -break ; - }writel_relaxed (ctrl, event_base +TIMER_ENABLE ); +return 0 ; }static struct clock_event_device __percpu *msm_evt;
@@ -126,7 +114,9 @@ static int msm_local_timer_setup(struct clock_event_device *evt) evt->name ="msm_timer" ; evt->features =CLOCK_EVT_FEAT_ONESHOT ; evt->rating =200 ; - evt->set_mode = msm_timer_set_mode; + evt->set_state_shutdown = msm_timer_shutdown; + evt->set_state_oneshot = msm_timer_shutdown; + evt->tick_resume = msm_timer_shutdown; evt->set_next_event = msm_timer_set_next_event; evt->cpumask =cpumask_of (cpu);
@@ -147,7 +137,7 @@ static int msm_local_timer_setup(struct clock_event_device *evt)static void msm_local_timer_stop (struct clock_event_device *evt) { - evt->set_mode (CLOCK_EVT_MODE_UNUSED , evt); + evt->set_state_shutdown (evt);disable_percpu_irq (evt->irq); }
Signature · 1 line
2.4.0
Re: [PATCH 17/41] clocksource: qcom: Migrate to new 'set-state' interface
Quoted 10 lines · Viresh Kumar
Migrate qcom driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.Periodic mode isn't supported by the driver and so the callback isn't provided anymore.
Quoted 6 lines
Cc Stephen Boyd <[email protected]>Cc Kumar Gala <[email protected]>Cc Andy Gross <[email protected]>Cc David Brown <[email protected]>Signed-off-by Viresh Kumar <[email protected]>---
Signature · 2 lines
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH 18/41 clocksource: rockchip: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate rockchip driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
We weren't doing anything for oneshot or resume modes, and so the callbacks aren't provided.
--- drivers/clocksource/rockchip_timer.c | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-)
drivers/clocksource/rockchip_timer.c +14 -18
@@ -82,23 +82,18 @@ static inline int rk_timer_set_next_event(unsigned long cycles,return 0 ; } -static inline void rk_timer_set_mode (enum clock_event_mode mode, -struct clock_event_device *ce) +static int rk_timer_shutdown (struct clock_event_device *ce) { -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -rk_timer_disable (ce); -rk_timer_update_counter (rk_timer (ce)->freq /HZ -1 , ce); -rk_timer_enable (ce,TIMER_MODE_FREE_RUNNING ); -break ; -case CLOCK_EVT_MODE_ONESHOT : -case CLOCK_EVT_MODE_RESUME : -break ; -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -rk_timer_disable (ce); -break ; - } +rk_timer_disable (ce); +return 0 ; +} + +static int rk_timer_set_periodic (struct clock_event_device *ce) +{ +rk_timer_disable (ce); +rk_timer_update_counter (rk_timer (ce)->freq /HZ -1 , ce); +rk_timer_enable (ce,TIMER_MODE_FREE_RUNNING ); +return 0 ; }static irqreturn_t rk_timer_interrupt (int irq,void *dev_id)
@@ -107,7 +102,7 @@ static irqreturn_t rk_timer_interrupt(int irq, void *dev_id)rk_timer_interrupt_clear (ce); -if (ce->mode ==CLOCK_EVT_MODE_ONESHOT ) +if (clockevent_state_oneshot (ce))rk_timer_disable (ce); ce->event_handler (ce);
@@ -161,7 +156,8 @@ static void __init rk_timer_init(struct device_node *np) ce->name =TIMER_NAME ; ce->features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT ; ce->set_next_event = rk_timer_set_next_event; - ce->set_mode = rk_timer_set_mode; + ce->set_state_shutdown = rk_timer_shutdown; + ce->set_state_periodic = rk_timer_set_periodic; ce->irq = irq; ce->cpumask =cpumask_of (0 ); ce->rating =250 ;
Signature · 1 line
2.4.0
PATCH 19/41 clocksource: samsung_pwm: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate samsung_pwm driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/samsung_pwm_timer.c | 41 +++++++++++++++------------------ 1 file changed, 19 insertions(+), 22 deletions(-)
drivers/clocksource/samsung_pwm_timer.c +19 -22
@@ -207,25 +207,18 @@ static int samsung_set_next_event(unsigned long cycles,return 0 ; } -static void samsung_set_mode (enum clock_event_mode mode, -struct clock_event_device *evt) +static int samsung_shutdown (struct clock_event_device *evt) {samsung_time_stop (pwm.event_id); +return 0 ; +} -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -samsung_time_setup (pwm.event_id, pwm.clock_count_per_tick -1 ); -samsung_time_start (pwm.event_id, true); -break ; - -case CLOCK_EVT_MODE_ONESHOT : -break ; - -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -case CLOCK_EVT_MODE_RESUME : -break ; - } +static int samsung_set_periodic (struct clock_event_device *evt) +{ +samsung_time_stop (pwm.event_id); +samsung_time_setup (pwm.event_id, pwm.clock_count_per_tick -1 ); +samsung_time_start (pwm.event_id, true); +return 0 ; }static void samsung_clockevent_resume (struct clock_event_device *cev)
@@ -240,12 +233,16 @@ static void samsung_clockevent_resume(struct clock_event_device *cev) }static struct clock_event_device time_event_device = { - .name ="samsung_event_timer" , - .features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT , - .rating =200 , - .set_next_event = samsung_set_next_event, - .set_mode = samsung_set_mode, - .resume = samsung_clockevent_resume, + .name ="samsung_event_timer" , + .features =CLOCK_EVT_FEAT_PERIODIC | +CLOCK_EVT_FEAT_ONESHOT , + .rating =200 , + .set_next_event = samsung_set_next_event, + .set_state_shutdown = samsung_shutdown, + .set_state_periodic = samsung_set_periodic, + .set_state_oneshot = samsung_shutdown, + .tick_resume = samsung_shutdown, + .resume = samsung_clockevent_resume, };static irqreturn_t samsung_clock_event_isr (int irq,void *dev_id)
Signature · 1 line
2.4.0
PATCH 20/41 clocksource: sh_cmt: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate sh_cmt driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/sh_cmt.c | 62 ++++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 31 deletions(-)
drivers/clocksource/sh_cmt.c +31 -31
@@ -538,7 +538,7 @@ static irqreturn_t sh_cmt_interrupt(int irq, void *dev_id)if (ch->flags &FLAG_CLOCKEVENT ) {if (!(ch->flags &FLAG_SKIPEVENT )) { -if (ch->ced.mode ==CLOCK_EVT_MODE_ONESHOT ) { +if (clockevent_state_oneshot (&ch->ced)) { ch->next_match_value = ch->max_match_value; ch->flags |=FLAG_REPROGRAM ; }
@@ -554,7 +554,7 @@ static irqreturn_t sh_cmt_interrupt(int irq, void *dev_id)sh_cmt_clock_event_program_verify (ch,1 );if (ch->flags &FLAG_CLOCKEVENT ) -if ((ch->ced.mode ==CLOCK_EVT_MODE_SHUTDOWN ) +if ((clockevent_state_shutdown (&ch->ced)) || (ch->match_value == ch->next_match_value)) ch->flags &= ~FLAG_REPROGRAM ; }
@@ -720,39 +720,37 @@ static void sh_cmt_clock_event_start(struct sh_cmt_channel *ch, int periodic)sh_cmt_set_next (ch, ch->max_match_value); } -static void sh_cmt_clock_event_mode (enum clock_event_mode mode, -struct clock_event_device *ced) +static int sh_cmt_clock_event_shutdown (struct clock_event_device *ced) +{ +struct sh_cmt_channel *ch =ced_to_sh_cmt (ced); + +sh_cmt_stop (ch,FLAG_CLOCKEVENT ); +return 0 ; +} + +static int sh_cmt_clock_event_set_state (struct clock_event_device *ced, +int periodic) {struct sh_cmt_channel *ch =ced_to_sh_cmt (ced);/* deal with old setting first */ -switch (ced->mode) { -case CLOCK_EVT_MODE_PERIODIC : -case CLOCK_EVT_MODE_ONESHOT : +if (clockevent_state_oneshot (ced) ||clockevent_state_periodic (ced))sh_cmt_stop (ch,FLAG_CLOCKEVENT ); -break ; -default : -break ; - } -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -dev_info (&ch->cmt->pdev->dev, -"ch%u: used for periodic clock events\n" , ch->index); -sh_cmt_clock_event_start (ch,1 ); -break ; -case CLOCK_EVT_MODE_ONESHOT : -dev_info (&ch->cmt->pdev->dev, -"ch%u: used for oneshot clock events\n" , ch->index); -sh_cmt_clock_event_start (ch,0 ); -break ; -case CLOCK_EVT_MODE_SHUTDOWN : -case CLOCK_EVT_MODE_UNUSED : -sh_cmt_stop (ch,FLAG_CLOCKEVENT ); -break ; -default : -break ; - } +dev_info (&ch->cmt->pdev->dev,"ch%u: used for %s clock events\n" , + ch->index, periodic ?"periodic" :"oneshot" ); +sh_cmt_clock_event_start (ch, periodic); +return 0 ; +} + +static int sh_cmt_clock_event_set_oneshot (struct clock_event_device *ced) +{ +return sh_cmt_clock_event_set_state (ced,0 ); +} + +static int sh_cmt_clock_event_set_periodic (struct clock_event_device *ced) +{ +return sh_cmt_clock_event_set_state (ced,1 ); } static int sh_cmt_clock_event_next(unsigned long delta,
@@ -760,7 +758,7 @@ static int sh_cmt_clock_event_next(unsigned long delta, {struct sh_cmt_channel *ch =ced_to_sh_cmt (ced); -BUG_ON (ced->mode !=CLOCK_EVT_MODE_ONESHOT ); +BUG_ON (!clockevent_state_oneshot (ced));if (likely (ch->flags &FLAG_IRQCONTEXT )) ch->next_match_value = delta -1 ;else
@@ -814,7 +812,9 @@ static int sh_cmt_register_clockevent(struct sh_cmt_channel *ch, ced->rating =125 ; ced->cpumask = cpu_possible_mask; ced->set_next_event = sh_cmt_clock_event_next; - ced->set_mode = sh_cmt_clock_event_mode; + ced->set_state_shutdown = sh_cmt_clock_event_shutdown; + ced->set_state_periodic = sh_cmt_clock_event_set_periodic; + ced->set_state_oneshot = sh_cmt_clock_event_set_oneshot; ced->suspend = sh_cmt_clock_event_suspend; ced->resume = sh_cmt_clock_event_resume;
Signature · 1 line
2.4.0
Re: [PATCH 20/41] clocksource: sh_cmt: Migrate to new 'set-state' interface
Hi Viresh,
Thank you for the patch.
Quoted 11 lines · On Thursday 18 June 2015 16:24:34 Viresh Kumar wrote:
Migrate
sh_cmtdriver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.Cc Magnus Damm <[email protected]>Cc Laurent Pinchart <[email protected]>Cc Paul Mundt <[email protected]>Signed-off-by Viresh Kumar <[email protected]>
Quoted 113 lines
--- drivers/clocksource/sh_cmt.c | 62 ++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 31 deletions(-)drivers/clocksource/sh_cmt.c +1
-1@@ -538,7 +538,7 @@ static irqreturn_t sh_cmt_interrupt(int irq, void *dev_id)if (ch->flags &FLAG_CLOCKEVENT ) {if (!(ch->flags &FLAG_SKIPEVENT )) { -if (ch->ced.mode ==CLOCK_EVT_MODE_ONESHOT ) { +if (clockevent_state_oneshot (&ch->ced)) { ch->next_match_value = ch->max_match_value; ch->flags |=FLAG_REPROGRAM ;drivers/clocksource/sh_cmt.c +1
-1}@@ -554,7 +554,7 @@ static irqreturn_t sh_cmt_interrupt(int irq, void *dev_id) sh_cmt_clock_event_program_verify(ch, 1);if (ch->flags &FLAG_CLOCKEVENT ) -if ((ch->ced.mode ==CLOCK_EVT_MODE_SHUTDOWN ) +if ((clockevent_state_shutdown (&ch->ced)) || (ch->match_value == ch->next_match_value))drivers/clocksource/sh_cmt.c +29
-29ch->flags &= ~FLAG_REPROGRAM ; }@@ -720,39 +720,37 @@ static void sh_cmt_clock_event_start(struct sh_cmt_channel *ch, int periodic) sh_cmt_set_next(ch, ch->max_match_value); } -static void sh_cmt_clock_event_mode (enum clock_event_mode mode, -struct clock_event_device *ced) +static int sh_cmt_clock_event_shutdown (struct clock_event_device *ced) +{ +struct sh_cmt_channel *ch =ced_to_sh_cmt (ced); + +sh_cmt_stop (ch,FLAG_CLOCKEVENT ); +return 0 ; +} + +static int sh_cmt_clock_event_set_state (struct clock_event_device *ced, +int periodic) {struct sh_cmt_channel *ch =ced_to_sh_cmt (ced);/* deal with old setting first */ -switch (ced->mode) { -case CLOCK_EVT_MODE_PERIODIC : -case CLOCK_EVT_MODE_ONESHOT : +if (clockevent_state_oneshot (ced) ||clockevent_state_periodic (ced))sh_cmt_stop (ch,FLAG_CLOCKEVENT ); -break ; -default : -break ; - } -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -dev_info (&ch->cmt->pdev->dev, -"ch%u: used for periodic clock events\n" , ch->index); -sh_cmt_clock_event_start (ch,1 ); -break ; -case CLOCK_EVT_MODE_ONESHOT : -dev_info (&ch->cmt->pdev->dev, -"ch%u: used for oneshot clock events\n" , ch->index); -sh_cmt_clock_event_start (ch,0 ); -break ; -case CLOCK_EVT_MODE_SHUTDOWN : -case CLOCK_EVT_MODE_UNUSED : -sh_cmt_stop (ch,FLAG_CLOCKEVENT ); -break ; -default : -break ; - } +dev_info (&ch->cmt->pdev->dev,"ch%u: used for %s clock events\n" , + ch->index, periodic ?"periodic" :"oneshot" ); +sh_cmt_clock_event_start (ch, periodic); +return 0 ; +} + +static int sh_cmt_clock_event_set_oneshot (struct clock_event_device *ced) +{ +return sh_cmt_clock_event_set_state (ced,0 ); +} + +static int sh_cmt_clock_event_set_periodic (struct clock_event_device *ced) +{ +return sh_cmt_clock_event_set_state (ced,1 ); } static int sh_cmt_clock_event_next(unsigned long delta,@@ -760,7 +758,7 @@ static int sh_cmt_clock_event_next(unsigned long delta, {struct sh_cmt_channel *ch =ced_to_sh_cmt (ced); -BUG_ON (ced->mode !=CLOCK_EVT_MODE_ONESHOT ); +BUG_ON (!clockevent_state_oneshot (ced));if (likely (ch->flags &FLAG_IRQCONTEXT )) ch->next_match_value = delta -1 ;else @@ -814,7 +812,9 @@ static int sh_cmt_register_clockevent(struct sh_cmt_channel *ch, ced->rating =125 ; ced->cpumask = cpu_possible_mask; ced->set_next_event = sh_cmt_clock_event_next; - ced->set_mode = sh_cmt_clock_event_mode; + ced->set_state_shutdown = sh_cmt_clock_event_shutdown; + ced->set_state_periodic = sh_cmt_clock_event_set_periodic; + ced->set_state_oneshot = sh_cmt_clock_event_set_oneshot; ced->suspend = sh_cmt_clock_event_suspend; ced->resume = sh_cmt_clock_event_resume;
Signature · 3 lines
Regards, Laurent Pinchart
PATCH 21/41 clocksource: sh_mtu2: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate sh_mtu2 driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/sh_mtu2.c | 42 ++++++++++++++++-------------------------- 1 file changed, 16 insertions(+), 26 deletions(-)
drivers/clocksource/sh_mtu2.c +16 -26
@@ -276,36 +276,25 @@ static struct sh_mtu2_channel *ced_to_sh_mtu2(struct clock_event_device *ced) return container_of(ced, struct sh_mtu2_channel, ced); } -static void sh_mtu2_clock_event_mode (enum clock_event_mode mode, -struct clock_event_device *ced) +static int sh_mtu2_clock_event_shutdown (struct clock_event_device *ced) {struct sh_mtu2_channel *ch =ced_to_sh_mtu2 (ced); -int disabled =0 ; -/* deal with old setting first */ -switch (ced->mode) { -case CLOCK_EVT_MODE_PERIODIC : +sh_mtu2_disable (ch); +return 0 ; +} + +static int sh_mtu2_clock_event_set_periodic (struct clock_event_device *ced) +{ +struct sh_mtu2_channel *ch =ced_to_sh_mtu2 (ced); + +if (clockevent_state_periodic (ced))sh_mtu2_disable (ch); - disabled =1 ; -break ; -default : -break ; - } -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -dev_info (&ch->mtu->pdev->dev, -"ch%u: used for periodic clock events\n" , ch->index); -sh_mtu2_enable (ch); -break ; -case CLOCK_EVT_MODE_UNUSED : -if (!disabled) -sh_mtu2_disable (ch); -break ; -case CLOCK_EVT_MODE_SHUTDOWN : -default : -break ; - } +dev_info (&ch->mtu->pdev->dev,"ch%u: used for periodic clock events\n" , + ch->index); +sh_mtu2_enable (ch); +return 0 ; }static void sh_mtu2_clock_event_suspend (struct clock_event_device *ced)
@@ -327,7 +316,8 @@ static void sh_mtu2_register_clockevent(struct sh_mtu2_channel *ch, ced->features =CLOCK_EVT_FEAT_PERIODIC ; ced->rating =200 ; ced->cpumask = cpu_possible_mask; - ced->set_mode = sh_mtu2_clock_event_mode; + ced->set_state_shutdown = sh_mtu2_clock_event_shutdown; + ced->set_state_periodic = sh_mtu2_clock_event_set_periodic; ced->suspend = sh_mtu2_clock_event_suspend; ced->resume = sh_mtu2_clock_event_resume;
Signature · 1 line
2.4.0
Re: [PATCH 21/41] clocksource: sh_mtu2: Migrate to new 'set-state' interface
Hi Viresh,
Thank you for the patch.
Quoted 11 lines · On Thursday 18 June 2015 16:24:35 Viresh Kumar wrote:
Migrate
sh_mtu2driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.Cc Magnus Damm <[email protected]>Cc Laurent Pinchart <[email protected]>Cc Paul Mundt <[email protected]>Signed-off-by Viresh Kumar <[email protected]>
Quoted 69 lines
--- drivers/clocksource/sh_mtu2.c | 42 ++++++++++++++------------------------ 1 file changed, 16 insertions(+), 26 deletions(-)drivers/clocksource/sh_mtu2.c +14
-25@@ -276,36 +276,25 @@ static struct sh_mtu2_channel *ced_to_sh_mtu2(struct clock_event_device *ced) return container_of(ced, struct sh_mtu2_channel,ced ); } -static void sh_mtu2_clock_event_mode (enum clock_event_mode mode, -struct clock_event_device *ced) +static int sh_mtu2_clock_event_shutdown (struct clock_event_device *ced) {struct sh_mtu2_channel *ch =ced_to_sh_mtu2 (ced); -int disabled =0 ; -/* deal with old setting first */ -switch (ced->mode) { -case CLOCK_EVT_MODE_PERIODIC : +sh_mtu2_disable (ch); +return 0 ; +} + +static int sh_mtu2_clock_event_set_periodic (struct clock_event_device *ced) +{ +struct sh_mtu2_channel *ch =ced_to_sh_mtu2 (ced); + +if (clockevent_state_periodic (ced))sh_mtu2_disable (ch); - disabled =1 ; -break ; -default : -break ; - } -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -dev_info (&ch->mtu->pdev->dev, -"ch%u: used for periodic clock events\n" , ch->index); -sh_mtu2_enable (ch); -break ; -case CLOCK_EVT_MODE_UNUSED : -if (!disabled) -sh_mtu2_disable (ch); -break ; -case CLOCK_EVT_MODE_SHUTDOWN : -default : -break ; - } +dev_info (&ch->mtu->pdev->dev,"ch%u: used for periodic clock events\n" , + ch->index); +sh_mtu2_enable (ch); +return 0 ; }static void
sh_mtu2_clock_event_suspend(struct clock_event_device *ced)drivers/clocksource/sh_mtu2.c +2
-1@@ -327,7 +316,8 @@ static void sh_mtu2_register_clockevent(struct sh_mtu2_channel *ch, ced->features =CLOCK_EVT_FEAT_PERIODIC ; ced->rating =200 ; ced->cpumask = cpu_possible_mask; - ced->set_mode = sh_mtu2_clock_event_mode; + ced->set_state_shutdown = sh_mtu2_clock_event_shutdown; + ced->set_state_periodic = sh_mtu2_clock_event_set_periodic; ced->suspend = sh_mtu2_clock_event_suspend; ced->resume = sh_mtu2_clock_event_resume;
Signature · 3 lines
Regards, Laurent Pinchart
PATCH 22/41 clocksource: sh_tmu: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate sh_tmu driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/sh_tmu.c | 63 +++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 33 deletions(-)
drivers/clocksource/sh_tmu.c +30 -33
@@ -240,7 +240,7 @@ static irqreturn_t sh_tmu_interrupt(int irq, void *dev_id)struct sh_tmu_channel *ch = dev_id;/* disable or acknowledge interrupt */ -if (ch->ced.mode ==CLOCK_EVT_MODE_ONESHOT ) +if (clockevent_state_oneshot (&ch->ced))sh_tmu_write (ch,TCR ,TCR_TPSC_CLK4 );else sh_tmu_write (ch,TCR ,TCR_UNIE |TCR_TPSC_CLK4 );
@@ -358,42 +358,37 @@ static void sh_tmu_clock_event_start(struct sh_tmu_channel *ch, int periodic) } } -static void sh_tmu_clock_event_mode (enum clock_event_mode mode, -struct clock_event_device *ced) +static int sh_tmu_clock_event_shutdown (struct clock_event_device *ced) +{ +struct sh_tmu_channel *ch =ced_to_sh_tmu (ced); + +sh_tmu_disable (ch); +return 0 ; +} + +static int sh_tmu_clock_event_set_state (struct clock_event_device *ced, +int periodic) {struct sh_tmu_channel *ch =ced_to_sh_tmu (ced); -int disabled =0 ;/* deal with old setting first */ -switch (ced->mode) { -case CLOCK_EVT_MODE_PERIODIC : -case CLOCK_EVT_MODE_ONESHOT : +if (clockevent_state_oneshot (ced) ||clockevent_state_periodic (ced))sh_tmu_disable (ch); - disabled =1 ; -break ; -default : -break ; - } -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -dev_info (&ch->tmu->pdev->dev, -"ch%u: used for periodic clock events\n" , ch->index); -sh_tmu_clock_event_start (ch,1 ); -break ; -case CLOCK_EVT_MODE_ONESHOT : -dev_info (&ch->tmu->pdev->dev, -"ch%u: used for oneshot clock events\n" , ch->index); -sh_tmu_clock_event_start (ch,0 ); -break ; -case CLOCK_EVT_MODE_UNUSED : -if (!disabled) -sh_tmu_disable (ch); -break ; -case CLOCK_EVT_MODE_SHUTDOWN : -default : -break ; - } +dev_info (&ch->tmu->pdev->dev,"ch%u: used for %s clock events\n" , + ch->index, periodic ?"periodic" :"oneshot" ); +sh_tmu_clock_event_start (ch, periodic); +return 0 ; +} + +static int sh_tmu_clock_event_set_oneshot (struct clock_event_device *ced) +{ +return sh_tmu_clock_event_set_state (ced,0 ); +} + +static int sh_tmu_clock_event_set_periodic (struct clock_event_device *ced) +{ +return sh_tmu_clock_event_set_state (ced,1 ); } static int sh_tmu_clock_event_next(unsigned long delta,
@@ -401,7 +396,7 @@ static int sh_tmu_clock_event_next(unsigned long delta, {struct sh_tmu_channel *ch =ced_to_sh_tmu (ced); -BUG_ON (ced->mode !=CLOCK_EVT_MODE_ONESHOT ); +BUG_ON (!clockevent_state_oneshot (ced));/* program new delta value */ sh_tmu_set_next (ch, delta,0 );
@@ -430,7 +425,9 @@ static void sh_tmu_register_clockevent(struct sh_tmu_channel *ch, ced->rating =200 ; ced->cpumask = cpu_possible_mask; ced->set_next_event = sh_tmu_clock_event_next; - ced->set_mode = sh_tmu_clock_event_mode; + ced->set_state_shutdown = sh_tmu_clock_event_shutdown; + ced->set_state_periodic = sh_tmu_clock_event_set_periodic; + ced->set_state_oneshot = sh_tmu_clock_event_set_oneshot; ced->suspend = sh_tmu_clock_event_suspend; ced->resume = sh_tmu_clock_event_resume;
Signature · 1 line
2.4.0
Re: [PATCH 22/41] clocksource: sh_tmu: Migrate to new 'set-state' interface
Hi Viresh,
Thank you for the patch.
Quoted 11 lines · On Thursday 18 June 2015 16:24:36 Viresh Kumar wrote:
Migrate
sh_tmudriver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.Cc Magnus Damm <[email protected]>Cc Laurent Pinchart <[email protected]>Cc Paul Mundt <[email protected]>Signed-off-by Viresh Kumar <[email protected]>
Quoted 104 lines
--- drivers/clocksource/sh_tmu.c | 63 +++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 33 deletions(-)drivers/clocksource/sh_tmu.c +30
-33@@ -240,7 +240,7 @@ static irqreturn_t sh_tmu_interrupt(int irq, void *dev_id) struct sh_tmu_channel *ch = dev_id;/* disable or acknowledge interrupt */ -if (ch->ced.mode ==CLOCK_EVT_MODE_ONESHOT ) +if (clockevent_state_oneshot (&ch->ced))sh_tmu_write (ch,TCR ,TCR_TPSC_CLK4 );else sh_tmu_write (ch,TCR ,TCR_UNIE |TCR_TPSC_CLK4 );@@ -358,42 +358,37 @@ static void sh_tmu_clock_event_start(struct sh_tmu_channel *ch, int periodic) } } -static void sh_tmu_clock_event_mode (enum clock_event_mode mode, -struct clock_event_device *ced) +static int sh_tmu_clock_event_shutdown (struct clock_event_device *ced) +{ +struct sh_tmu_channel *ch =ced_to_sh_tmu (ced); + +sh_tmu_disable (ch); +return 0 ; +} + +static int sh_tmu_clock_event_set_state (struct clock_event_device *ced, +int periodic) {struct sh_tmu_channel *ch =ced_to_sh_tmu (ced); -int disabled =0 ;/* deal with old setting first */ -switch (ced->mode) { -case CLOCK_EVT_MODE_PERIODIC : -case CLOCK_EVT_MODE_ONESHOT : +if (clockevent_state_oneshot (ced) ||clockevent_state_periodic (ced))sh_tmu_disable (ch); - disabled =1 ; -break ; -default : -break ; - } -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -dev_info (&ch->tmu->pdev->dev, -"ch%u: used for periodic clock events\n" , ch->index); -sh_tmu_clock_event_start (ch,1 ); -break ; -case CLOCK_EVT_MODE_ONESHOT : -dev_info (&ch->tmu->pdev->dev, -"ch%u: used for oneshot clock events\n" , ch->index); -sh_tmu_clock_event_start (ch,0 ); -break ; -case CLOCK_EVT_MODE_UNUSED : -if (!disabled) -sh_tmu_disable (ch); -break ; -case CLOCK_EVT_MODE_SHUTDOWN : -default : -break ; - } +dev_info (&ch->tmu->pdev->dev,"ch%u: used for %s clock events\n" , + ch->index, periodic ?"periodic" :"oneshot" ); +sh_tmu_clock_event_start (ch, periodic); +return 0 ; +} + +static int sh_tmu_clock_event_set_oneshot (struct clock_event_device *ced) +{ +return sh_tmu_clock_event_set_state (ced,0 ); +} + +static int sh_tmu_clock_event_set_periodic (struct clock_event_device *ced) +{ +return sh_tmu_clock_event_set_state (ced,1 ); } static int sh_tmu_clock_event_next(unsigned long delta,@@ -401,7 +396,7 @@ static int sh_tmu_clock_event_next(unsigned long delta, {struct sh_tmu_channel *ch =ced_to_sh_tmu (ced); -BUG_ON (ced->mode !=CLOCK_EVT_MODE_ONESHOT ); +BUG_ON (!clockevent_state_oneshot (ced));/* program new delta value */ sh_tmu_set_next (ch, delta,0 );@@ -430,7 +425,9 @@ static void sh_tmu_register_clockevent(struct sh_tmu_channel *ch, ced->rating =200 ; ced->cpumask = cpu_possible_mask; ced->set_next_event = sh_tmu_clock_event_next; - ced->set_mode = sh_tmu_clock_event_mode; + ced->set_state_shutdown = sh_tmu_clock_event_shutdown; + ced->set_state_periodic = sh_tmu_clock_event_set_periodic; + ced->set_state_oneshot = sh_tmu_clock_event_set_oneshot; ced->suspend = sh_tmu_clock_event_suspend; ced->resume = sh_tmu_clock_event_resume;
Signature · 3 lines
Regards, Laurent Pinchart
PATCH 23/41 clocksource: sun4i: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate sun4i driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/sun4i_timer.c | 41 +++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 19 deletions(-)
drivers/clocksource/sun4i_timer.c +22 -19
@@ -81,25 +81,25 @@ static void sun4i_clkevt_time_start(u8 timer, bool periodic) timer_base + TIMER_CTL_REG(timer)); } -static void sun4i_clkevt_mode (enum clock_event_mode mode, -struct clock_event_device *clk) +static int sun4i_clkevt_shutdown (struct clock_event_device *evt) { -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -sun4i_clkevt_time_stop (0 ); -sun4i_clkevt_time_setup (0 , ticks_per_jiffy); -sun4i_clkevt_time_start (0 , true); -break ; -case CLOCK_EVT_MODE_ONESHOT : -sun4i_clkevt_time_stop (0 ); -sun4i_clkevt_time_start (0 , false); -break ; -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -default : -sun4i_clkevt_time_stop (0 ); -break ; - } +sun4i_clkevt_time_stop (0 ); +return 0 ; +} + +static int sun4i_clkevt_set_oneshot (struct clock_event_device *evt) +{ +sun4i_clkevt_time_stop (0 ); +sun4i_clkevt_time_start (0 , false); +return 0 ; +} + +static int sun4i_clkevt_set_periodic (struct clock_event_device *evt) +{ +sun4i_clkevt_time_stop (0 ); +sun4i_clkevt_time_setup (0 , ticks_per_jiffy); +sun4i_clkevt_time_start (0 , true); +return 0 ; } static int sun4i_clkevt_next_event(unsigned long evt,
@@ -116,7 +116,10 @@ static struct clock_event_device sun4i_clockevent = { .name = "sun4i_tick", .rating = 350, .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, - .set_mode = sun4i_clkevt_mode, + .set_state_shutdown = sun4i_clkevt_shutdown, + .set_state_periodic = sun4i_clkevt_set_periodic, + .set_state_oneshot = sun4i_clkevt_set_oneshot, + .tick_resume = sun4i_clkevt_shutdown, .set_next_event = sun4i_clkevt_next_event, };
Signature · 1 line
2.4.0
Re: [PATCH 23/41] clocksource: sun4i: Migrate to new 'set-state' interface
Quoted 62 lines · Viresh Kumar
Migrate sun4i driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.Cc Maxime Ripard <[email protected]>Signed-off-by Viresh Kumar <[email protected]>--- drivers/clocksource/sun4i_timer.c | 41 +++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 19 deletions(-)drivers/clocksource/sun4i_timer.c +18
-18@@ -81,25 +81,25 @@ static void sun4i_clkevt_time_start(u8 timer, bool periodic) timer_base + TIMER_CTL_REG(timer)); } -static void sun4i_clkevt_mode (enum clock_event_mode mode, -struct clock_event_device *clk) +static int sun4i_clkevt_shutdown (struct clock_event_device *evt) { -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -sun4i_clkevt_time_stop (0 ); -sun4i_clkevt_time_setup (0 , ticks_per_jiffy); -sun4i_clkevt_time_start (0 , true); -break ; -case CLOCK_EVT_MODE_ONESHOT : -sun4i_clkevt_time_stop (0 ); -sun4i_clkevt_time_start (0 , false); -break ; -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -default : -sun4i_clkevt_time_stop (0 ); -break ; - } +sun4i_clkevt_time_stop (0 ); +return 0 ; +} + +static int sun4i_clkevt_set_oneshot (struct clock_event_device *evt) +{ +sun4i_clkevt_time_stop (0 ); +sun4i_clkevt_time_start (0 , false); +return 0 ; +} + +static int sun4i_clkevt_set_periodic (struct clock_event_device *evt) +{ +sun4i_clkevt_time_stop (0 ); +sun4i_clkevt_time_setup (0 , ticks_per_jiffy); +sun4i_clkevt_time_start (0 , true); +return 0 ; } static int sun4i_clkevt_next_event(unsigned long evt,
drivers/clocksource/sun4i_timer.c static struct clock_event_device sun4i_clockevent = { · line 122
Quoted 8 lines
drivers/clocksource/sun4i_timer.c +4
-1@@ -116,7 +116,10 @@ static struct clock_event_device sun4i_clockevent = { .name = "sun4i_tick", .rating = 350, .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, - .set_mode = sun4i_clkevt_mode, + .set_state_shutdown = sun4i_clkevt_shutdown, + .set_state_periodic = sun4i_clkevt_set_periodic, + .set_state_oneshot = sun4i_clkevt_set_oneshot, + .tick_resume = sun4i_clkevt_shutdown,
I'm not exactly sure of the context here, but I wouldn't expect a callback called tick_resume to stop a timer. Is this expected?
Maxime
Signature · 10 lines
Maxime Ripard, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20150618/8f4d71d0/attachment.sig>
Re: [PATCH 23/41] clocksource: sun4i: Migrate to new 'set-state' interface
Quoted 10 lines · Maxime Ripard
Quoted 9 lines · Viresh Kumar
drivers/clocksource/sun4i_timer.c +1
-7+static int sun4i_clkevt_shutdown (struct clock_event_device *evt) { -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -sun4i_clkevt_time_stop (0 ); -sun4i_clkevt_time_setup (0 , ticks_per_jiffy); -sun4i_clkevt_time_start (0 , true); -break ; -case CLOCK_EVT_MODE_ONESHOT :
Quoted 8 lines
drivers/clocksource/sun4i_timer.c static void sun4i_clkevt_time_start(u8 timer, bool periodic) · line 101
Quoted 8 lines
drivers/clocksource/sun4i_timer.c +0
-8-sun4i_clkevt_time_stop (0 ); -sun4i_clkevt_time_start (0 , false); -break ; -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -default : -sun4i_clkevt_time_stop (0 ); -break ;
Because sun4i_clkevt_time_stop() is getting called in default case, it is getting called for tick-resume mode already with the old set_mode interface.
Quoted 4 lines
drivers/clocksource/sun4i_timer.c static struct clock_event_device sun4i_clockevent = { · line 122
Quoted 1 line
drivers/clocksource/sun4i_timer.c +1
-0+ .tick_resume = sun4i_clkevt_shutdown,I'm not exactly sure of the context here, but I wouldn't expect a callback called
tick_resumeto stop a timer. Is this expected?
And so this patch carried the same logic here.
At suspend: clockevents core calls ->set_state_shutdown() and at resume it calls ->tick_resume() followed by setting to the proper mode, i.e. periodic or oneshot.
Many driver authors didn't knew about these details and so did shutdown in resume path as well.
For me, you might not even need a tick_resume() at all, as your driver would have already shutted down on suspend and is just required to be put to the right mode again.
But, I didn't wanted to change the way things behaved until now. I can add another patch to get things fixed separately if you want me to.
Signature · 1 line
viresh
Re: [PATCH 23/41] clocksource: sun4i: Migrate to new 'set-state' interface
Quoted 35 lines · Viresh Kumar
Quoted 10 lines · Maxime Ripard
Quoted 9 lines · Viresh Kumar
drivers/clocksource/sun4i_timer.c +1
-7+static int sun4i_clkevt_shutdown (struct clock_event_device *evt) { -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -sun4i_clkevt_time_stop (0 ); -sun4i_clkevt_time_setup (0 , ticks_per_jiffy); -sun4i_clkevt_time_start (0 , true); -break ; -case CLOCK_EVT_MODE_ONESHOT :Quoted 8 lines
drivers/clocksource/sun4i_timer.c static void sun4i_clkevt_time_start(u8 timer, bool periodic) · line 101
Quoted 8 lines
drivers/clocksource/sun4i_timer.c +0
-8-sun4i_clkevt_time_stop (0 ); -sun4i_clkevt_time_start (0 , false); -break ; -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -default : -sun4i_clkevt_time_stop (0 ); -break ;Because
sun4i_clkevt_time_stop()is getting called in default case, it is getting called for tick-resume mode already with the oldset_modeinterface.Quoted 4 lines
drivers/clocksource/sun4i_timer.c static struct clock_event_device sun4i_clockevent = { · line 122
Quoted 1 line
drivers/clocksource/sun4i_timer.c +1
-0+ .tick_resume = sun4i_clkevt_shutdown,I'm not exactly sure of the context here, but I wouldn't expect a callback called
tick_resumeto stop a timer. Is this expected?And so this patch carried the same logic here.
At suspend: clockevents core calls ->set_state_shutdown() and at resume it calls ->tick_resume() followed by setting to the proper mode, i.e. periodic or oneshot.
Quoted 6 lines
Many driver authors didn't knew about these details and so did shutdown in resume path as well.
For me, you might not even need a
tick_resume()at all, as your driver would have already shutted down on suspend and is just required to be put to the right mode again.
Ok, thanks for the explanation.
It looks good for both this patch and the sun5i one. You can add my Acked-by.
Quoted 2 lines
But, I didn't wanted to change the way things behaved until now. I can add another patch to get things fixed separately if you want me to.
If you have some spare time, it would be great :)
Thanks!
Maxime
Signature · 10 lines
Maxime Ripard, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20150619/06f8ce21/attachment.sig>
PATCH 24/41 clocksource: tcb_clksrc: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate tcb_clksrc driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/tcb_clksrc.c | 93 ++++++++++++++++++++++------------------ 1 file changed, 51 insertions(+), 42 deletions(-)
drivers/clocksource/tcb_clksrc.c +51 -42
@@ -91,55 +91,62 @@ static struct tc_clkevt_device *to_tc_clkevt(struct clock_event_device *clkevt)*/ static u32 timer_clock; -static void tc_mode (enum clock_event_mode m,struct clock_event_device *d) +static int tc_shutdown (struct clock_event_device *d) {struct tc_clkevt_device *tcd =to_tc_clkevt (d);void __iomem *regs = tcd->regs; -if (tcd->clkevt.mode ==CLOCK_EVT_MODE_PERIODIC - || tcd->clkevt.mode ==CLOCK_EVT_MODE_ONESHOT ) { -__raw_writel (0xff , regs +ATMEL_TC_REG (2 ,IDR )); -__raw_writel (ATMEL_TC_CLKDIS , regs +ATMEL_TC_REG (2 ,CCR )); -clk_disable (tcd->clk); - } +__raw_writel (0xff , regs +ATMEL_TC_REG (2 ,IDR )); +__raw_writel (ATMEL_TC_CLKDIS , regs +ATMEL_TC_REG (2 ,CCR )); +clk_disable (tcd->clk); -switch (m) { +return 0 ; +} -/* By not making the gentime core emulate periodic mode on top -* of oneshot, we get lower overhead and improved accuracy. -*/ -case CLOCK_EVT_MODE_PERIODIC : -clk_enable (tcd->clk); +static int tc_set_oneshot (struct clock_event_device *d) +{ +struct tc_clkevt_device *tcd =to_tc_clkevt (d); +void __iomem *regs = tcd->regs; -/* slow clock, count up to RC, then irq and restart */ -__raw_writel (timer_clock - |ATMEL_TC_WAVE |ATMEL_TC_WAVESEL_UP_AUTO , - regs +ATMEL_TC_REG (2 ,CMR )); -__raw_writel ((32768 +HZ /2 ) /HZ , tcaddr +ATMEL_TC_REG (2 ,RC )); +if (clockevent_state_oneshot (d) ||clockevent_state_periodic (d)) +tc_shutdown (d); -/* Enable clock and interrupts on RC compare */ -__raw_writel (ATMEL_TC_CPCS , regs +ATMEL_TC_REG (2 ,IER )); +clk_enable (tcd->clk); -/* go go gadget! */ -__raw_writel (ATMEL_TC_CLKEN |ATMEL_TC_SWTRG , - regs +ATMEL_TC_REG (2 ,CCR )); -break ; +/* slow clock, count up to RC, then irq and stop */ +__raw_writel (timer_clock |ATMEL_TC_CPCSTOP |ATMEL_TC_WAVE | +ATMEL_TC_WAVESEL_UP_AUTO , regs +ATMEL_TC_REG (2 ,CMR )); +__raw_writel (ATMEL_TC_CPCS , regs +ATMEL_TC_REG (2 ,IER )); -case CLOCK_EVT_MODE_ONESHOT : -clk_enable (tcd->clk); +/* set_next_event() configures and starts the timer */ +return 0 ; +} -/* slow clock, count up to RC, then irq and stop */ -__raw_writel (timer_clock |ATMEL_TC_CPCSTOP - |ATMEL_TC_WAVE |ATMEL_TC_WAVESEL_UP_AUTO , - regs +ATMEL_TC_REG (2 ,CMR )); -__raw_writel (ATMEL_TC_CPCS , regs +ATMEL_TC_REG (2 ,IER )); +static int tc_set_periodic (struct clock_event_device *d) +{ +struct tc_clkevt_device *tcd =to_tc_clkevt (d); +void __iomem *regs = tcd->regs; -/* set_next_event() configures and starts the timer */ -break ; +if (clockevent_state_oneshot (d) ||clockevent_state_periodic (d)) +tc_shutdown (d); -default : -break ; - } +/* By not making the gentime core emulate periodic mode on top +* of oneshot, we get lower overhead and improved accuracy. +*/ +clk_enable (tcd->clk); + +/* slow clock, count up to RC, then irq and restart */ +__raw_writel (timer_clock |ATMEL_TC_WAVE |ATMEL_TC_WAVESEL_UP_AUTO , + regs +ATMEL_TC_REG (2 ,CMR )); +__raw_writel ((32768 +HZ /2 ) /HZ , tcaddr +ATMEL_TC_REG (2 ,RC )); + +/* Enable clock and interrupts on RC compare */ +__raw_writel (ATMEL_TC_CPCS , regs +ATMEL_TC_REG (2 ,IER )); + +/* go go gadget! */ +__raw_writel (ATMEL_TC_CLKEN |ATMEL_TC_SWTRG , regs + +ATMEL_TC_REG (2 ,CCR )); +return 0 ; }static int tc_next_event (unsigned long delta,struct clock_event_device *d)
@@ -154,13 +161,15 @@ static int tc_next_event(unsigned long delta, struct clock_event_device *d)static struct tc_clkevt_device clkevt = { .clkevt = { - .name ="tc_clkevt" , - .features =CLOCK_EVT_FEAT_PERIODIC - |CLOCK_EVT_FEAT_ONESHOT , + .name ="tc_clkevt" , + .features =CLOCK_EVT_FEAT_PERIODIC | +CLOCK_EVT_FEAT_ONESHOT ,/* Should be lower than at91rm9200's system timer */ - .rating =125 , - .set_next_event = tc_next_event, - .set_mode = tc_mode, + .rating =125 , + .set_next_event = tc_next_event, + .set_state_shutdown = tc_shutdown, + .set_state_periodic = tc_set_periodic, + .set_state_oneshot = tc_set_oneshot, }, };
Signature · 1 line
2.4.0
PATCH 25/41 clocksource: tegra20: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate tegra20 driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/tegra20_timer.c | 40 ++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 21 deletions(-)
drivers/clocksource/tegra20_timer.c +19 -21
@@ -72,33 +72,31 @@ static int tegra_timer_set_next_event(unsigned long cycles,return 0 ; } -static void tegra_timer_set_mode (enum clock_event_mode mode, -struct clock_event_device *evt) +static int tegra_timer_shutdown (struct clock_event_device *evt) { -u32 reg; -timer_writel (0 ,TIMER3_BASE +TIMER_PTV ); +return 0 ; +} -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : - reg =0xC0000000 | ((1000000 /HZ )-1 ); -timer_writel (reg,TIMER3_BASE +TIMER_PTV ); -break ; -case CLOCK_EVT_MODE_ONESHOT : -break ; -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -case CLOCK_EVT_MODE_RESUME : -break ; - } +static int tegra_timer_set_periodic (struct clock_event_device *evt) +{ +u32 reg =0xC0000000 | ((1000000 /HZ ) -1 ); + +timer_writel (0 ,TIMER3_BASE +TIMER_PTV ); +timer_writel (reg,TIMER3_BASE +TIMER_PTV ); +return 0 ; }static struct clock_event_device tegra_clockevent = { - .name ="timer0" , - .rating =300 , - .features =CLOCK_EVT_FEAT_ONESHOT |CLOCK_EVT_FEAT_PERIODIC , - .set_next_event = tegra_timer_set_next_event, - .set_mode = tegra_timer_set_mode, + .name ="timer0" , + .rating =300 , + .features =CLOCK_EVT_FEAT_ONESHOT | +CLOCK_EVT_FEAT_PERIODIC , + .set_next_event = tegra_timer_set_next_event, + .set_state_shutdown = tegra_timer_shutdown, + .set_state_periodic = tegra_timer_set_periodic, + .set_state_oneshot = tegra_timer_shutdown, + .tick_resume = tegra_timer_shutdown, }; static u64 notrace tegra_read_sched_clock(void)
Signature · 1 line
2.4.0
Re: [PATCH 25/41] clocksource: tegra20: Migrate to new 'set-state' interface
Quoted 11 lines · Viresh Kumar
Migrate tegra20 driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.Cc Thierry Reding <[email protected]>Cc Stephen Warren <[email protected]>Signed-off-by Viresh Kumar <[email protected]>---
[ ... ]
Quoted 15 lines
drivers/clocksource/tegra20_timer.c +3
-9+static int tegra_timer_shutdown (struct clock_event_device *evt) { -u32 reg; -timer_writel (0 ,TIMER3_BASE +TIMER_PTV ); +return 0 ; +} -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : - reg =0xC0000000 | ((1000000 /HZ )-1 ); -timer_writel (reg,TIMER3_BASE +TIMER_PTV ); -break ; -case CLOCK_EVT_MODE_ONESHOT : -break ;
drivers/clocksource/tegra20_timer.c static int tegra_timer_set_next_event(unsigned long cycles, · line 85
Quoted 10 lines
drivers/clocksource/tegra20_timer.c +5
-5-case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -case CLOCK_EVT_MODE_RESUME : -break ; - } +static int tegra_timer_set_periodic (struct clock_event_device *evt) +{ +u32 reg =0xC0000000 | ((1000000 /HZ ) -1 ); + +timer_writel (0 ,TIMER3_BASE +TIMER_PTV );
Replace with 'tegra_timer_shutdown'
Quoted 3 lines
drivers/clocksource/tegra20_timer.c +2
-0+timer_writel (reg,TIMER3_BASE +TIMER_PTV ); +return 0 ; }
Signature · 5 lines
<http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog
Re: [PATCH 25/41] clocksource: tegra20: Migrate to new 'set-state' interface
Quoted 3 lines · Daniel Lezcano
Review
Quoted 1 line
(quoted diff) +1
-0+ timer_writel(0, TIMER3_BASE + TIMER_PTV);Replace with '
tegra_timer_shutdown'
Looks fine now ?
---------------8<-----------------------
Message-Id: <2b6d1a867e100033f1f406fda39d358a4db80733.1435913653.git.viresh.kumar@linaro.org>
From: Viresh Kumar <[email protected]>
Date: Fri, 27 Feb 2015 13:39:52 +0530
Subject: [PATCH] clocksource: tegra20: Migrate to new 'set-state' interface
Migrate tegra20 driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/tegra20_timer.c | 45 ++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 21 deletions(-)
drivers/clocksource/tegra20_timer.c +24 -21
@@ -72,33 +72,36 @@ static int tegra_timer_set_next_event(unsigned long cycles,return 0 ; } -static void tegra_timer_set_mode (enum clock_event_mode mode, -struct clock_event_device *evt) +static inline void timer_shutdown (struct clock_event_device *evt) { -u32 reg; -timer_writel (0 ,TIMER3_BASE +TIMER_PTV ); +} -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : - reg =0xC0000000 | ((1000000 /HZ )-1 ); -timer_writel (reg,TIMER3_BASE +TIMER_PTV ); -break ; -case CLOCK_EVT_MODE_ONESHOT : -break ; -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -case CLOCK_EVT_MODE_RESUME : -break ; - } +static int tegra_timer_shutdown (struct clock_event_device *evt) +{ +timer_shutdown (evt); +return 0 ; +} + +static int tegra_timer_set_periodic (struct clock_event_device *evt) +{ +u32 reg =0xC0000000 | ((1000000 /HZ ) -1 ); + +timer_shutdown (evt); +timer_writel (reg,TIMER3_BASE +TIMER_PTV ); +return 0 ; }static struct clock_event_device tegra_clockevent = { - .name ="timer0" , - .rating =300 , - .features =CLOCK_EVT_FEAT_ONESHOT |CLOCK_EVT_FEAT_PERIODIC , - .set_next_event = tegra_timer_set_next_event, - .set_mode = tegra_timer_set_mode, + .name ="timer0" , + .rating =300 , + .features =CLOCK_EVT_FEAT_ONESHOT | +CLOCK_EVT_FEAT_PERIODIC , + .set_next_event = tegra_timer_set_next_event, + .set_state_shutdown = tegra_timer_shutdown, + .set_state_periodic = tegra_timer_set_periodic, + .set_state_oneshot = tegra_timer_shutdown, + .tick_resume = tegra_timer_shutdown, }; static u64 notrace tegra_read_sched_clock(void)
PATCH 26/41 clocksource: time-armada-370-xp: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate time-armada-370-xp driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/time-armada-370-xp.c | 53 +++++++++++++++++--------------- 1 file changed, 28 insertions(+), 25 deletions(-)
drivers/clocksource/time-armada-370-xp.c +28 -25
@@ -121,33 +121,33 @@ armada_370_xp_clkevt_next_event(unsigned long delta,return 0 ; } -static void -armada_370_xp_clkevt_mode (enum clock_event_mode mode, -struct clock_event_device *dev) +static int armada_370_xp_clkevt_shutdown (struct clock_event_device *evt) { -if (mode ==CLOCK_EVT_MODE_PERIODIC ) { +/* +* Disable timer. +*/ +local_timer_ctrl_clrset (TIMER0_EN ,0 ); -/* -* Setup timer to fire at 1/HZ intervals. -*/ -writel (ticks_per_jiffy -1 , local_base +TIMER0_RELOAD_OFF ); -writel (ticks_per_jiffy -1 , local_base +TIMER0_VAL_OFF ); +/* +* ACK pending timer interrupt. +*/ +writel (TIMER0_CLR_MASK , local_base +LCL_TIMER_EVENTS_STATUS ); +return 0 ; +} -/* -* Enable timer. -*/ -local_timer_ctrl_clrset (0 ,TIMER0_RELOAD_EN | enable_mask); - }else { -/* -* Disable timer. -*/ -local_timer_ctrl_clrset (TIMER0_EN ,0 ); +static int armada_370_xp_clkevt_set_periodic (struct clock_event_device *evt) +{ +/* +* Setup timer to fire at 1/HZ intervals. +*/ +writel (ticks_per_jiffy -1 , local_base +TIMER0_RELOAD_OFF ); +writel (ticks_per_jiffy -1 , local_base +TIMER0_VAL_OFF ); -/* -* ACK pending timer interrupt. -*/ -writel (TIMER0_CLR_MASK , local_base +LCL_TIMER_EVENTS_STATUS ); - } +/* +* Enable timer. +*/ +local_timer_ctrl_clrset (0 ,TIMER0_RELOAD_EN | enable_mask); +return 0 ; }static int armada_370_xp_clkevt_irq;
@@ -185,7 +185,10 @@ static int armada_370_xp_timer_setup(struct clock_event_device *evt) evt->shift =32 , evt->rating =300 , evt->set_next_event = armada_370_xp_clkevt_next_event, - evt->set_mode = armada_370_xp_clkevt_mode, + evt->set_state_shutdown = armada_370_xp_clkevt_shutdown; + evt->set_state_periodic = armada_370_xp_clkevt_set_periodic; + evt->set_state_oneshot = armada_370_xp_clkevt_shutdown; + evt->tick_resume = armada_370_xp_clkevt_shutdown; evt->irq = armada_370_xp_clkevt_irq; evt->cpumask =cpumask_of (cpu);
@@ -197,7 +200,7 @@ static int armada_370_xp_timer_setup(struct clock_event_device *evt)static void armada_370_xp_timer_stop (struct clock_event_device *evt) { - evt->set_mode (CLOCK_EVT_MODE_UNUSED , evt); + evt->set_state_shutdown (evt);disable_percpu_irq (evt->irq); }
Signature · 1 line
2.4.0
PATCH 27/41 clocksource: efm32: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate efm32 driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
There is nothing to be done for resume state and so isn't implemented.
--- drivers/clocksource/time-efm32.c | 66 +++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 31 deletions(-)
drivers/clocksource/time-efm32.c +35 -31
@@ -48,40 +48,42 @@ struct efm32_clock_event_ddata {unsigned periodic_top; }; -static void efm32_clock_event_set_mode (enum clock_event_mode mode, -struct clock_event_device *evtdev) +static int efm32_clock_event_shutdown (struct clock_event_device *evtdev) {struct efm32_clock_event_ddata *ddata = container_of(evtdev, struct efm32_clock_event_ddata, evtdev); -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -writel_relaxed (TIMERn_CMD_STOP, ddata->base + TIMERn_CMD); -writel_relaxed (ddata->periodic_top, ddata->base + TIMERn_TOP); -writel_relaxed (TIMERn_CTRL_PRESC_1024 | - TIMERn_CTRL_CLKSEL_PRESCHFPERCLK | - TIMERn_CTRL_MODE_DOWN, - ddata->base + TIMERn_CTRL); -writel_relaxed (TIMERn_CMD_START, ddata->base + TIMERn_CMD); -break ; - -case CLOCK_EVT_MODE_ONESHOT : -writel_relaxed (TIMERn_CMD_STOP, ddata->base + TIMERn_CMD); -writel_relaxed (TIMERn_CTRL_PRESC_1024 | - TIMERn_CTRL_CLKSEL_PRESCHFPERCLK | - TIMERn_CTRL_OSMEN | - TIMERn_CTRL_MODE_DOWN, - ddata->base + TIMERn_CTRL); -break ; - -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -writel_relaxed (TIMERn_CMD_STOP, ddata->base + TIMERn_CMD); -break ; - -case CLOCK_EVT_MODE_RESUME : -break ; - } +writel_relaxed (TIMERn_CMD_STOP, ddata->base + TIMERn_CMD); +return 0 ; +} + +static int efm32_clock_event_set_oneshot (struct clock_event_device *evtdev) +{ +struct efm32_clock_event_ddata *ddata = + container_of(evtdev, struct efm32_clock_event_ddata, evtdev); + +writel_relaxed (TIMERn_CMD_STOP, ddata->base + TIMERn_CMD); +writel_relaxed (TIMERn_CTRL_PRESC_1024 | + TIMERn_CTRL_CLKSEL_PRESCHFPERCLK | + TIMERn_CTRL_OSMEN | + TIMERn_CTRL_MODE_DOWN, + ddata->base + TIMERn_CTRL); +return 0 ; +} + +static int efm32_clock_event_set_periodic (struct clock_event_device *evtdev) +{ +struct efm32_clock_event_ddata *ddata = + container_of(evtdev, struct efm32_clock_event_ddata, evtdev); + +writel_relaxed (TIMERn_CMD_STOP, ddata->base + TIMERn_CMD); +writel_relaxed (ddata->periodic_top, ddata->base + TIMERn_TOP); +writel_relaxed (TIMERn_CTRL_PRESC_1024 | + TIMERn_CTRL_CLKSEL_PRESCHFPERCLK | + TIMERn_CTRL_MODE_DOWN, + ddata->base + TIMERn_CTRL); +writel_relaxed (TIMERn_CMD_START, ddata->base + TIMERn_CMD); +return 0 ; } static int efm32_clock_event_set_next_event(unsigned long evt,
@@ -112,7 +114,9 @@ static struct efm32_clock_event_ddata clock_event_ddata = { .evtdev = { .name = "efm32 clockevent", .features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC, - .set_mode = efm32_clock_event_set_mode, + .set_state_shutdown = efm32_clock_event_shutdown, + .set_state_periodic = efm32_clock_event_set_periodic, + .set_state_oneshot = efm32_clock_event_set_oneshot, .set_next_event = efm32_clock_event_set_next_event, .rating = 200, },
Signature · 1 line
2.4.0
PATCH 28/41 clocksource: orion: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate orion driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/time-orion.c | 46 +++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 20 deletions(-)
drivers/clocksource/time-orion.c +26 -20
@@ -60,30 +60,36 @@ static int orion_clkevt_next_event(unsigned long delta,return 0 ; } -static void orion_clkevt_mode (enum clock_event_mode mode, -struct clock_event_device *dev) +static int orion_clkevt_shutdown (struct clock_event_device *dev) { -if (mode ==CLOCK_EVT_MODE_PERIODIC ) { -/* setup and enable periodic timer at 1/HZ intervals */ -writel (ticks_per_jiffy -1 , timer_base +TIMER1_RELOAD ); -writel (ticks_per_jiffy -1 , timer_base +TIMER1_VAL ); -atomic_io_modify (timer_base +TIMER_CTRL , -TIMER1_RELOAD_EN |TIMER1_EN , -TIMER1_RELOAD_EN |TIMER1_EN ); - }else { -/* disable timer */ -atomic_io_modify (timer_base +TIMER_CTRL , -TIMER1_RELOAD_EN |TIMER1_EN ,0 ); - } +/* disable timer */ +atomic_io_modify (timer_base +TIMER_CTRL , +TIMER1_RELOAD_EN |TIMER1_EN ,0 ); +return 0 ; +} + +static int orion_clkevt_set_periodic (struct clock_event_device *dev) +{ +/* setup and enable periodic timer at 1/HZ intervals */ +writel (ticks_per_jiffy -1 , timer_base +TIMER1_RELOAD ); +writel (ticks_per_jiffy -1 , timer_base +TIMER1_VAL ); +atomic_io_modify (timer_base +TIMER_CTRL , +TIMER1_RELOAD_EN |TIMER1_EN , +TIMER1_RELOAD_EN |TIMER1_EN ); +return 0 ; }static struct clock_event_device orion_clkevt = { - .name ="orion_event" , - .features =CLOCK_EVT_FEAT_ONESHOT |CLOCK_EVT_FEAT_PERIODIC , - .shift =32 , - .rating =300 , - .set_next_event = orion_clkevt_next_event, - .set_mode = orion_clkevt_mode, + .name ="orion_event" , + .features =CLOCK_EVT_FEAT_ONESHOT | +CLOCK_EVT_FEAT_PERIODIC , + .shift =32 , + .rating =300 , + .set_next_event = orion_clkevt_next_event, + .set_state_shutdown = orion_clkevt_shutdown, + .set_state_periodic = orion_clkevt_set_periodic, + .set_state_oneshot = orion_clkevt_shutdown, + .tick_resume = orion_clkevt_shutdown, };static irqreturn_t orion_clkevt_irq_handler (int irq,void *dev_id)
Signature · 1 line
2.4.0
PATCH 29/41 clocksource: atlas7: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate atlas7 driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/timer-atlas7.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-)
drivers/clocksource/timer-atlas7.c +7 -12
@@ -76,7 +76,7 @@ static irqreturn_t sirfsoc_timer_interrupt(int irq, void *dev_id)/* clear timer interrupt */ writel_relaxed (BIT (cpu), sirfsoc_timer_base +SIRFSOC_TIMER_INTR_STATUS ); -if (ce->mode ==CLOCK_EVT_MODE_ONESHOT ) +if (clockevent_state_oneshot (ce))sirfsoc_timer_count_disable (cpu); ce->event_handler (ce);
@@ -117,18 +117,11 @@ static int sirfsoc_timer_set_next_event(unsigned long delta,return 0 ; } -static void sirfsoc_timer_set_mode (enum clock_event_mode mode, -struct clock_event_device *ce) +/* Oneshot is enabled in set_next_event */ +static int sirfsoc_timer_shutdown (struct clock_event_device *evt) { -switch (mode) { -case CLOCK_EVT_MODE_ONESHOT : -/* enable in set_next_event */ -break ; -default : -break ; - } -sirfsoc_timer_count_disable (smp_processor_id ()); +return 0 ; }static void sirfsoc_clocksource_suspend (struct clocksource *cs)
@@ -193,7 +186,9 @@ static int sirfsoc_local_timer_setup(struct clock_event_device *ce) ce->name ="local_timer" ; ce->features =CLOCK_EVT_FEAT_ONESHOT ; ce->rating =200 ; - ce->set_mode = sirfsoc_timer_set_mode; + ce->set_state_shutdown = sirfsoc_timer_shutdown; + ce->set_state_oneshot = sirfsoc_timer_shutdown; + ce->tick_resume = sirfsoc_timer_shutdown; ce->set_next_event = sirfsoc_timer_set_next_event;clockevents_calc_mult_shift (ce, atlas7_timer_rate,60 ); ce->max_delta_ns =clockevent_delta2ns (-2 , ce);
Signature · 1 line
2.4.0
PATCH 30/41 clocksource: atmel: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate atmel driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/timer-atmel-pit.c | 41 +++++++++++++++-------------------- 1 file changed, 18 insertions(+), 23 deletions(-)
drivers/clocksource/timer-atmel-pit.c +18 -23
@@ -90,33 +90,27 @@ static cycle_t read_pit_clk(struct clocksource *cs)return elapsed; } +static int pit_clkevt_shutdown (struct clock_event_device *dev) +{ +struct pit_data *data =clkevt_to_pit_data (dev); + +/* disable irq, leaving the clocksource active */ +pit_write (data->base,AT91_PIT_MR , (data->cycle -1 ) |AT91_PIT_PITEN ); +return 0 ; +} +/* * Clockevent device: interrupts every 1/HZ (== pit_cycles * MCK/16) */ -static void -pit_clkevt_mode (enum clock_event_mode mode,struct clock_event_device *dev) +static int pit_clkevt_set_periodic (struct clock_event_device *dev) {struct pit_data *data =clkevt_to_pit_data (dev); -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -/* update clocksource counter */ - data->cnt += data->cycle *PIT_PICNT (pit_read (data->base,AT91_PIT_PIVR )); -pit_write (data->base,AT91_PIT_MR , - (data->cycle -1 ) |AT91_PIT_PITEN |AT91_PIT_PITIEN ); -break ; -case CLOCK_EVT_MODE_ONESHOT : -BUG (); -/* FALLTHROUGH */ -case CLOCK_EVT_MODE_SHUTDOWN : -case CLOCK_EVT_MODE_UNUSED : -/* disable irq, leaving the clocksource active */ -pit_write (data->base,AT91_PIT_MR , - (data->cycle -1 ) |AT91_PIT_PITEN ); -break ; -case CLOCK_EVT_MODE_RESUME : -break ; - } +/* update clocksource counter */ + data->cnt += data->cycle *PIT_PICNT (pit_read (data->base,AT91_PIT_PIVR )); +pit_write (data->base,AT91_PIT_MR , + (data->cycle -1 ) |AT91_PIT_PITEN |AT91_PIT_PITIEN ); +return 0 ; }static void at91sam926x_pit_suspend (struct clock_event_device *cedev)
@@ -162,7 +156,7 @@ static irqreturn_t at91sam926x_pit_interrupt(int irq, void *dev_id)WARN_ON_ONCE (!irqs_disabled ());/* The PIT interrupt may be disabled, and is shared */ -if ((data->clkevt.mode ==CLOCK_EVT_MODE_PERIODIC ) && +if (clockevent_state_periodic (&data->clkevt) && (pit_read (data->base,AT91_PIT_SR ) &AT91_PIT_PITS )) {unsigned nr_ticks;
@@ -227,7 +221,8 @@ static void __init at91sam926x_pit_common_init(struct pit_data *data) data->clkevt.rating =100 ; data->clkevt.cpumask =cpumask_of (0 ); - data->clkevt.set_mode = pit_clkevt_mode; + data->clkevt.set_state_shutdown = pit_clkevt_shutdown; + data->clkevt.set_state_periodic = pit_clkevt_set_periodic; data->clkevt.resume = at91sam926x_pit_resume; data->clkevt.suspend = at91sam926x_pit_suspend;clockevents_register_device (&data->clkevt);
Signature · 1 line
2.4.0
Re: [PATCH 30/41] clocksource: atmel: Migrate to new 'set-state' interface
Quoted 11 lines · Viresh Kumar
Migrate atmel driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.Cc Nicolas Ferre <[email protected]>Cc Alexandre Belloni <[email protected]>Cc Jean-Christophe Plagniol-Villard <[email protected]>Signed-off-by Viresh Kumar <[email protected]>
Quoted 79 lines
--- drivers/clocksource/timer-atmel-pit.c | 41 +++++++++++++++-------------------- 1 file changed, 18 insertions(+), 23 deletions(-)drivers/clocksource/timer-atmel-pit.c +18
-23@@ -90,33 +90,27 @@ static cycle_t read_pit_clk(struct clocksource *cs)return elapsed; } +static int pit_clkevt_shutdown (struct clock_event_device *dev) +{ +struct pit_data *data =clkevt_to_pit_data (dev); + +/* disable irq, leaving the clocksource active */ +pit_write (data->base,AT91_PIT_MR , (data->cycle -1 ) |AT91_PIT_PITEN ); +return 0 ; +} +/* * Clockevent device: interrupts every 1/HZ (== pit_cycles * MCK/16) */ -static void -pit_clkevt_mode (enum clock_event_mode mode,struct clock_event_device *dev) +static int pit_clkevt_set_periodic (struct clock_event_device *dev) {struct pit_data *data =clkevt_to_pit_data (dev); -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -/* update clocksource counter */ - data->cnt += data->cycle *PIT_PICNT (pit_read (data->base,AT91_PIT_PIVR )); -pit_write (data->base,AT91_PIT_MR , - (data->cycle -1 ) |AT91_PIT_PITEN |AT91_PIT_PITIEN ); -break ; -case CLOCK_EVT_MODE_ONESHOT : -BUG (); -/* FALLTHROUGH */ -case CLOCK_EVT_MODE_SHUTDOWN : -case CLOCK_EVT_MODE_UNUSED : -/* disable irq, leaving the clocksource active */ -pit_write (data->base,AT91_PIT_MR , - (data->cycle -1 ) |AT91_PIT_PITEN ); -break ; -case CLOCK_EVT_MODE_RESUME : -break ; - } +/* update clocksource counter */ + data->cnt += data->cycle *PIT_PICNT (pit_read (data->base,AT91_PIT_PIVR )); +pit_write (data->base,AT91_PIT_MR , + (data->cycle -1 ) |AT91_PIT_PITEN |AT91_PIT_PITIEN ); +return 0 ; }static void at91sam926x_pit_suspend (struct clock_event_device *cedev)@@ -162,7 +156,7 @@ static irqreturn_t at91sam926x_pit_interrupt(int irq, void *dev_id)WARN_ON_ONCE (!irqs_disabled ());/* The PIT interrupt may be disabled, and is shared */ -if ((data->clkevt.mode ==CLOCK_EVT_MODE_PERIODIC ) && +if (clockevent_state_periodic (&data->clkevt) && (pit_read (data->base,AT91_PIT_SR ) &AT91_PIT_PITS )) {unsigned nr_ticks;@@ -227,7 +221,8 @@ static void __init at91sam926x_pit_common_init(struct pit_data *data) data->clkevt.rating =100 ; data->clkevt.cpumask =cpumask_of (0 ); - data->clkevt.set_mode = pit_clkevt_mode; + data->clkevt.set_state_shutdown = pit_clkevt_shutdown; + data->clkevt.set_state_periodic = pit_clkevt_set_periodic; data->clkevt.resume = at91sam926x_pit_resume; data->clkevt.suspend = at91sam926x_pit_suspend;clockevents_register_device (&data->clkevt);Signature · 1 line
2.4.0
Signature · 3 lines
Alexandre Belloni, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com
PATCH 31/41 clocksource: atmel-st: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate atmel-st driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/timer-atmel-st.c | 69 ++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 27 deletions(-)
drivers/clocksource/timer-atmel-st.c +42 -27
@@ -106,36 +106,47 @@ static struct clocksource clk32k = { .flags = CLOCK_SOURCE_IS_CONTINUOUS, }; -static void -clkevt32k_mode (enum clock_event_mode mode,struct clock_event_device *dev) +static void clkdev32k_disable_and_flush_irq (void ) {unsigned int val;/* Disable and flush pending timer interrupts */ regmap_write (regmap_st,AT91_ST_IDR ,AT91_ST_PITS |AT91_ST_ALMS );regmap_read (regmap_st,AT91_ST_SR , &val); - last_crtr =read_CRTR (); -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -/* PIT for periodic irqs; fixed rate of 1/HZ */ - irqmask =AT91_ST_PITS ; -regmap_write (regmap_st,AT91_ST_PIMR ,RM9200_TIMER_LATCH ); -break ; -case CLOCK_EVT_MODE_ONESHOT : -/* ALM for oneshot irqs, set by next_event() -* before 32 seconds have passed -*/ - irqmask =AT91_ST_ALMS ; -regmap_write (regmap_st,AT91_ST_RTAR , last_crtr); -break ; -case CLOCK_EVT_MODE_SHUTDOWN : -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_RESUME : - irqmask =0 ; -break ; - } +} + +static int clkevt32k_shutdown (struct clock_event_device *evt) +{ +clkdev32k_disable_and_flush_irq (); + irqmask =0 ; +regmap_write (regmap_st,AT91_ST_IER , irqmask); +return 0 ; +} + +static int clkevt32k_set_oneshot (struct clock_event_device *dev) +{ +clkdev32k_disable_and_flush_irq (); + +/* +* ALM for oneshot irqs, set by next_event() +* before 32 seconds have passed. +*/ + irqmask =AT91_ST_ALMS ; +regmap_write (regmap_st,AT91_ST_RTAR , last_crtr);regmap_write (regmap_st,AT91_ST_IER , irqmask); +return 0 ; +} + +static int clkevt32k_set_periodic (struct clock_event_device *dev) +{ +clkdev32k_disable_and_flush_irq (); + +/* PIT for periodic irqs; fixed rate of 1/HZ */ + irqmask =AT91_ST_PITS ; +regmap_write (regmap_st,AT91_ST_PIMR ,RM9200_TIMER_LATCH ); +regmap_write (regmap_st,AT91_ST_IER , irqmask); +return 0 ; } static int
@@ -170,11 +181,15 @@ clkevt32k_next_event(unsigned long delta, struct clock_event_device *dev) }static struct clock_event_device clkevt = { - .name ="at91_tick" , - .features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT , - .rating =150 , - .set_next_event = clkevt32k_next_event, - .set_mode = clkevt32k_mode, + .name ="at91_tick" , + .features =CLOCK_EVT_FEAT_PERIODIC | +CLOCK_EVT_FEAT_ONESHOT , + .rating =150 , + .set_next_event = clkevt32k_next_event, + .set_state_shutdown = clkevt32k_shutdown, + .set_state_periodic = clkevt32k_set_periodic, + .set_state_oneshot = clkevt32k_set_oneshot, + .tick_resume = clkevt32k_shutdown, };/*
Signature · 1 line
2.4.0
Re: [PATCH 31/41] clocksource: atmel-st: Migrate to new 'set-state' interface
Quoted 11 lines · Viresh Kumar
Migrate atmel-st driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.Cc Nicolas Ferre <[email protected]>Cc Alexandre Belloni <[email protected]>Cc Jean-Christophe Plagniol-Villard <[email protected]>Signed-off-by Viresh Kumar <[email protected]>
I think that anyway I'm the only one booting a kernel from after 3.0 on the rm9200. I'll test boot that when 4.3-rc1 is released.
Quoted 102 lines
--- drivers/clocksource/timer-atmel-st.c | 69 ++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 27 deletions(-)drivers/clocksource/timer-atmel-st.c +42
-27@@ -106,36 +106,47 @@ static struct clocksource clk32k = { .flags = CLOCK_SOURCE_IS_CONTINUOUS, }; -static void -clkevt32k_mode (enum clock_event_mode mode,struct clock_event_device *dev) +static void clkdev32k_disable_and_flush_irq (void ) {unsigned int val;/* Disable and flush pending timer interrupts */ regmap_write (regmap_st,AT91_ST_IDR ,AT91_ST_PITS |AT91_ST_ALMS );regmap_read (regmap_st,AT91_ST_SR , &val); - last_crtr =read_CRTR (); -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -/* PIT for periodic irqs; fixed rate of 1/HZ */ - irqmask =AT91_ST_PITS ; -regmap_write (regmap_st,AT91_ST_PIMR ,RM9200_TIMER_LATCH ); -break ; -case CLOCK_EVT_MODE_ONESHOT : -/* ALM for oneshot irqs, set by next_event() -* before 32 seconds have passed -*/ - irqmask =AT91_ST_ALMS ; -regmap_write (regmap_st,AT91_ST_RTAR , last_crtr); -break ; -case CLOCK_EVT_MODE_SHUTDOWN : -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_RESUME : - irqmask =0 ; -break ; - } +} + +static int clkevt32k_shutdown (struct clock_event_device *evt) +{ +clkdev32k_disable_and_flush_irq (); + irqmask =0 ; +regmap_write (regmap_st,AT91_ST_IER , irqmask); +return 0 ; +} + +static int clkevt32k_set_oneshot (struct clock_event_device *dev) +{ +clkdev32k_disable_and_flush_irq (); + +/* +* ALM for oneshot irqs, set by next_event() +* before 32 seconds have passed. +*/ + irqmask =AT91_ST_ALMS ; +regmap_write (regmap_st,AT91_ST_RTAR , last_crtr);regmap_write (regmap_st,AT91_ST_IER , irqmask); +return 0 ; +} + +static int clkevt32k_set_periodic (struct clock_event_device *dev) +{ +clkdev32k_disable_and_flush_irq (); + +/* PIT for periodic irqs; fixed rate of 1/HZ */ + irqmask =AT91_ST_PITS ; +regmap_write (regmap_st,AT91_ST_PIMR ,RM9200_TIMER_LATCH ); +regmap_write (regmap_st,AT91_ST_IER , irqmask); +return 0 ; } static int@@ -170,11 +181,15 @@ clkevt32k_next_event(unsigned long delta, struct clock_event_device *dev) }static struct clock_event_device clkevt = { - .name ="at91_tick" , - .features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT , - .rating =150 , - .set_next_event = clkevt32k_next_event, - .set_mode = clkevt32k_mode, + .name ="at91_tick" , + .features =CLOCK_EVT_FEAT_PERIODIC | +CLOCK_EVT_FEAT_ONESHOT , + .rating =150 , + .set_next_event = clkevt32k_next_event, + .set_state_shutdown = clkevt32k_shutdown, + .set_state_periodic = clkevt32k_set_periodic, + .set_state_oneshot = clkevt32k_set_oneshot, + .tick_resume = clkevt32k_shutdown, };/* Signature · 1 line
2.4.0
Signature · 3 lines
Alexandre Belloni, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com
Re: [PATCH 31/41] clocksource: atmel-st: Migrate to new 'set-state' interface
Quoted 1 line · Alexandre Belloni
Thanks.
Quoted 2 lines
I think that anyway I'm the only one booting a kernel from after 3.0 on the rm9200. I'll test boot that when 4.3-rc1 is released.
What about testing it now on top of clockevents tree which I have mentioned in the cover letter ?
Signature · 1 line
viresh
Re: [PATCH 31/41] clocksource: atmel-st: Migrate to new 'set-state' interface
Quoted 11 lines · Viresh Kumar
Quoted 1 line · Alexandre Belloni
Thanks.
Quoted 2 lines
I think that anyway I'm the only one booting a kernel from after 3.0 on the rm9200. I'll test boot that when 4.3-rc1 is released.
What about testing it now on top of clockevents tree which I have mentioned in the cover letter ?
I just did.
I was not being lazy but booting that board is actually time consuming for multiple reasons and time is a scarce resource ;)
Signature · 3 lines
Alexandre Belloni, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com
Re: [PATCH 31/41] clocksource: atmel-st: Migrate to new 'set-state' interface
Quoted 4 lines · Alexandre Belloni
I just did.
I was not being lazy but booting that board is actually time consuming for multiple reasons and time is a scarce resource ;)
Want to give your Tested-by as well ?
Signature · 1 line
viresh
Alexandre Belloni
Tested-byRe: [PATCH 31/41] clocksource: atmel-st: Migrate to new 'set-state' interface
Quoted 8 lines · Viresh Kumar
Quoted 4 lines · Alexandre Belloni
I just did.
I was not being lazy but booting that board is actually time consuming for multiple reasons and time is a scarce resource ;)
Want to give your Tested-by as well ?
Sure,
Signature · 3 lines
Alexandre Belloni, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com
PATCH 32/41 clocksource: digicolor: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate digicolor driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/timer-digicolor.c | 41 +++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 19 deletions(-)
drivers/clocksource/timer-digicolor.c +22 -19
@@ -87,27 +87,27 @@ static inline void dc_timer_set_count(struct clock_event_device *ce,writel (count, dt->base +COUNT (dt->timer_id)); } -static void digicolor_clkevt_mode (enum clock_event_mode mode, -struct clock_event_device *ce) +static int digicolor_clkevt_shutdown (struct clock_event_device *ce) +{ +dc_timer_disable (ce); +return 0 ; +} + +static int digicolor_clkevt_set_oneshot (struct clock_event_device *ce) +{ +dc_timer_disable (ce); +dc_timer_enable (ce,CONTROL_MODE_ONESHOT ); +return 0 ; +} + +static int digicolor_clkevt_set_periodic (struct clock_event_device *ce) {struct digicolor_timer *dt =dc_timer (ce); -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -dc_timer_disable (ce); -dc_timer_set_count (ce, dt->ticks_per_jiffy); -dc_timer_enable (ce,CONTROL_MODE_PERIODIC ); -break ; -case CLOCK_EVT_MODE_ONESHOT : -dc_timer_disable (ce); -dc_timer_enable (ce,CONTROL_MODE_ONESHOT ); -break ; -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -default : -dc_timer_disable (ce); -break ; - } +dc_timer_disable (ce); +dc_timer_set_count (ce, dt->ticks_per_jiffy); +dc_timer_enable (ce,CONTROL_MODE_PERIODIC ); +return 0 ; } static int digicolor_clkevt_next_event(unsigned long evt,
@@ -125,7 +125,10 @@ static struct digicolor_timer dc_timer_dev = { .name = "digicolor_tick", .rating = 340, .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, - .set_mode = digicolor_clkevt_mode, + .set_state_shutdown = digicolor_clkevt_shutdown, + .set_state_periodic = digicolor_clkevt_set_periodic, + .set_state_oneshot = digicolor_clkevt_set_oneshot, + .tick_resume = digicolor_clkevt_shutdown, .set_next_event = digicolor_clkevt_next_event, }, .timer_id = TIMER_C,
Signature · 1 line
2.4.0
Re: [PATCH 32/41] clocksource: digicolor: Migrate to new 'set-state' interface
Hi Viresh,
Quoted 9 lines · Viresh Kumar
Migrate digicolor driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.Cc Baruch Siach <[email protected]>Signed-off-by Viresh Kumar <[email protected]>
Tested on a Conexant CX92755 Equinox board.
Thanks,
baruch
Signature · 3 lines
http://baruch.siach.name/blog/ ~. .~ Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
- baruch at tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -Re: [PATCH 32/41] clocksource: digicolor: Migrate to new 'set-state' interface
Quoted 4 lines · Baruch Siach
Tested on a Conexant CX92755 Equinox board.
Acked-by Baruch Siach <[email protected]>Tested-by Baruch Siach <[email protected]>
Thanks a lot.
Signature · 1 line
viresh
PATCH 33/41 clocksource: integrator: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate integrator driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
For oneshot mode the clkevt device was first getting disabled by clearing TIMER_CTRL_ENABLE bits in TIMER_CTRL register, followed by clearing TIMER_CTRL_PERIODIC bit. Both these are done with a single write operation now.
--- drivers/clocksource/timer-integrator-ap.c | 58 ++++++++++++++++++------------- 1 file changed, 33 insertions(+), 25 deletions(-)
drivers/clocksource/timer-integrator-ap.c +33 -25
@@ -74,33 +74,37 @@ static irqreturn_t integrator_timer_interrupt(int irq, void *dev_id)return IRQ_HANDLED ; } -static void clkevt_set_mode (enum clock_event_mode mode,struct clock_event_device *evt) +static int clkevt_shutdown (struct clock_event_device *evt) {u32 ctrl =readl (clkevt_base +TIMER_CTRL ) & ~TIMER_CTRL_ENABLE ;/* Disable timer */ writel (ctrl, clkevt_base +TIMER_CTRL ); +return 0 ; +} -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -/* Enable the timer and start the periodic tick */ -writel (timer_reload, clkevt_base +TIMER_LOAD ); - ctrl |=TIMER_CTRL_PERIODIC |TIMER_CTRL_ENABLE ; -writel (ctrl, clkevt_base +TIMER_CTRL ); -break ; -case CLOCK_EVT_MODE_ONESHOT : -/* Leave the timer disabled, .set_next_event will enable it */ - ctrl &= ~TIMER_CTRL_PERIODIC ; -writel (ctrl, clkevt_base +TIMER_CTRL ); -break ; -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -case CLOCK_EVT_MODE_RESUME : -default : -/* Just leave in disabled state */ -break ; - } +static int clkevt_set_oneshot (struct clock_event_device *evt) +{ +u32 ctrl =readl (clkevt_base +TIMER_CTRL ) & + ~(TIMER_CTRL_ENABLE |TIMER_CTRL_PERIODIC ); + +/* Leave the timer disabled, .set_next_event will enable it */ +writel (ctrl, clkevt_base +TIMER_CTRL ); +return 0 ; +} +static int clkevt_set_periodic (struct clock_event_device *evt) +{ +u32 ctrl =readl (clkevt_base +TIMER_CTRL ) & ~TIMER_CTRL_ENABLE ; + +/* Disable timer */ +writel (ctrl, clkevt_base +TIMER_CTRL ); + +/* Enable the timer and start the periodic tick */ +writel (timer_reload, clkevt_base +TIMER_LOAD ); + ctrl |=TIMER_CTRL_PERIODIC |TIMER_CTRL_ENABLE ; +writel (ctrl, clkevt_base +TIMER_CTRL ); +return 0 ; }static int clkevt_set_next_event (unsigned long next,struct clock_event_device *evt)
@@ -115,11 +119,15 @@ static int clkevt_set_next_event(unsigned long next, struct clock_event_device * }static struct clock_event_device integrator_clockevent = { - .name ="timer1" , - .features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT , - .set_mode = clkevt_set_mode, - .set_next_event = clkevt_set_next_event, - .rating =300 , + .name ="timer1" , + .features =CLOCK_EVT_FEAT_PERIODIC | +CLOCK_EVT_FEAT_ONESHOT , + .set_state_shutdown = clkevt_shutdown, + .set_state_periodic = clkevt_set_periodic, + .set_state_oneshot = clkevt_set_oneshot, + .tick_resume = clkevt_shutdown, + .set_next_event = clkevt_set_next_event, + .rating =300 , };static struct irqaction integrator_timer_irq = {
Signature · 1 line
2.4.0
Re: [PATCH 33/41] clocksource: integrator: Migrate to new 'set-state' interface
Quoted 7 lines · Viresh Kumar
Migrate integrator driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.
Quoted 7 lines
For oneshot mode the clkevt device was first getting disabled by clearing
TIMER_CTRL_ENABLEbits inTIMER_CTRLregister, followed by clearingTIMER_CTRL_PERIODICbit. Both these are done with a single write operation now.Cc Linus Walleij <[email protected]>Signed-off-by Viresh Kumar <[email protected]>
Yours,
Linus Walleij
PATCH 34/41 clocksource: keystone: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate keystone driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
Also pass the mode-mask to keystone_timer_config() instead of the mode as mode macro's aren't valid anymore.
--- drivers/clocksource/timer-keystone.c | 44 +++++++++++++----------------------- 1 file changed, 16 insertions(+), 28 deletions(-)
drivers/clocksource/timer-keystone.c +16 -28
@@ -72,10 +72,10 @@ static inline void keystone_timer_barrier(void)/** * keystone_timer_config: configures timer to work in oneshot/periodic modes. -* @ mode: mode to configure +* @ mask: mask of the mode to configure * @ period: cycles number to configure for */ -static int keystone_timer_config (u64 period,enum clock_event_mode mode) +static int keystone_timer_config (u64 period,int mask) {u32 tcr;u32 off;
@@ -84,16 +84,7 @@ static int keystone_timer_config(u64 period, enum clock_event_mode mode) off = tcr & ~(TCR_ENAMODE_MASK );/* set enable mode */ -switch (mode) { -case CLOCK_EVT_MODE_ONESHOT : - tcr |=TCR_ENAMODE_ONESHOT_MASK ; -break ; -case CLOCK_EVT_MODE_PERIODIC : - tcr |=TCR_ENAMODE_PERIODIC_MASK ; -break ; -default : -return -1 ; - } + tcr |= mask;/* disable timer */ keystone_timer_writel (off,TCR );
@@ -138,24 +129,19 @@ static irqreturn_t keystone_timer_interrupt(int irq, void *dev_id)static int keystone_set_next_event (unsigned long cycles,struct clock_event_device *evt) { -return keystone_timer_config (cycles, evt->mode); +return keystone_timer_config (cycles,TCR_ENAMODE_ONESHOT_MASK ); } -static void keystone_set_mode (enum clock_event_mode mode, -struct clock_event_device *evt) +static int keystone_shutdown (struct clock_event_device *evt) { -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -keystone_timer_config (timer.hz_period,CLOCK_EVT_MODE_PERIODIC ); -break ; -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -case CLOCK_EVT_MODE_ONESHOT : -keystone_timer_disable (); -break ; -default : -break ; - } +keystone_timer_disable (); +return 0 ; +} + +static int keystone_set_periodic (struct clock_event_device *evt) +{ +keystone_timer_config (timer.hz_period,TCR_ENAMODE_PERIODIC_MASK ); +return 0 ; }static void __init keystone_timer_init (struct device_node *np)
@@ -222,7 +208,9 @@ static void __init keystone_timer_init(struct device_node *np)/* setup clockevent */ event_dev->features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT ; event_dev->set_next_event = keystone_set_next_event; - event_dev->set_mode = keystone_set_mode; + event_dev->set_state_shutdown = keystone_shutdown; + event_dev->set_state_periodic = keystone_set_periodic; + event_dev->set_state_oneshot = keystone_shutdown; event_dev->cpumask = cpu_all_mask; event_dev->owner =THIS_MODULE ; event_dev->name =TIMER_NAME ;
Signature · 1 line
2.4.0
PATCH 35/41 clocksource: prima2: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate prima2 driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/timer-prima2.c | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-)
drivers/clocksource/timer-prima2.c +15 -19
@@ -104,26 +104,21 @@ static int sirfsoc_timer_set_next_event(unsigned long delta,return next - now > delta ? -ETIME :0 ; } -static void sirfsoc_timer_set_mode (enum clock_event_mode mode, -struct clock_event_device *ce) +static int sirfsoc_timer_shutdown (struct clock_event_device *evt) {u32 val =readl_relaxed (sirfsoc_timer_base +SIRFSOC_TIMER_INT_EN ); -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -WARN_ON (1 ); -break ; -case CLOCK_EVT_MODE_ONESHOT : -writel_relaxed (val |BIT (0 ), - sirfsoc_timer_base +SIRFSOC_TIMER_INT_EN ); -break ; -case CLOCK_EVT_MODE_SHUTDOWN : -writel_relaxed (val & ~BIT (0 ), - sirfsoc_timer_base +SIRFSOC_TIMER_INT_EN ); -break ; -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_RESUME : -break ; - } + +writel_relaxed (val & ~BIT (0 ), + sirfsoc_timer_base +SIRFSOC_TIMER_INT_EN ); +return 0 ; +} + +static int sirfsoc_timer_set_oneshot (struct clock_event_device *evt) +{ +u32 val =readl_relaxed (sirfsoc_timer_base +SIRFSOC_TIMER_INT_EN ); + +writel_relaxed (val |BIT (0 ), sirfsoc_timer_base +SIRFSOC_TIMER_INT_EN ); +return 0 ; }static void sirfsoc_clocksource_suspend (struct clocksource *cs)
@@ -157,7 +152,8 @@ static struct clock_event_device sirfsoc_clockevent = { .name = "sirfsoc_clockevent", .rating = 200, .features = CLOCK_EVT_FEAT_ONESHOT, - .set_mode = sirfsoc_timer_set_mode, + .set_state_shutdown = sirfsoc_timer_shutdown, + .set_state_oneshot = sirfsoc_timer_set_oneshot, .set_next_event = sirfsoc_timer_set_next_event, };
Signature · 1 line
2.4.0
PATCH 36/41 clocksource: stm32: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate stm32 driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/timer-stm32.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-)
drivers/clocksource/timer-stm32.c +17 -13
@@ -40,24 +40,25 @@ struct stm32_clock_event_ddata {void __iomem *base; }; -static void stm32_clock_event_set_mode (enum clock_event_mode mode, -struct clock_event_device *evtdev) +static int stm32_clock_event_shutdown (struct clock_event_device *evtdev) {struct stm32_clock_event_ddata *data = container_of(evtdev, struct stm32_clock_event_ddata, evtdev);void *base = data->base; -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -writel_relaxed (data->periodic_top, base +TIM_ARR ); -writel_relaxed (TIM_CR1_ARPE |TIM_CR1_CEN , base +TIM_CR1 ); -break ; +writel_relaxed (0 , base +TIM_CR1 ); +return 0 ; +} -case CLOCK_EVT_MODE_ONESHOT : -default : -writel_relaxed (0 , base +TIM_CR1 ); -break ; - } +static int stm32_clock_event_set_periodic (struct clock_event_device *evtdev) +{ +struct stm32_clock_event_ddata *data = + container_of(evtdev, struct stm32_clock_event_ddata, evtdev); +void *base = data->base; + +writel_relaxed (data->periodic_top, base +TIM_ARR ); +writel_relaxed (TIM_CR1_ARPE |TIM_CR1_CEN , base +TIM_CR1 ); +return 0 ; } static int stm32_clock_event_set_next_event(unsigned long evt,
@@ -88,7 +89,10 @@ static struct stm32_clock_event_ddata clock_event_ddata = { .evtdev = { .name = "stm32 clockevent", .features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC, - .set_mode = stm32_clock_event_set_mode, + .set_state_shutdown = stm32_clock_event_shutdown, + .set_state_periodic = stm32_clock_event_set_periodic, + .set_state_oneshot = stm32_clock_event_shutdown, + .tick_resume = stm32_clock_event_shutdown, .set_next_event = stm32_clock_event_set_next_event, .rating = 200, },
Signature · 1 line
2.4.0
Re: [PATCH 36/41] clocksource: stm32: Migrate to new 'set-state' interface
Hi Viresh,
Quoted 4 lines · Viresh Kumar
Migrate stm32 driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
Quoted 10 lines
This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.Cc Maxime Coquelin <[email protected]>Signed-off-by Viresh Kumar <[email protected]>--- drivers/clocksource/timer-stm32.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-)
Thanks for having implemented the move to the new interface. I just tested it, and confirm it works fine on my STM32 board. You can add:
Regards,
Maxime
Re: [PATCH 36/41] clocksource: stm32: Migrate to new 'set-state' interface
Quoted 6 lines · Maxime Coquelin
Thanks for having implemented the move to the new interface. I just tested it, and confirm it works fine on my STM32 board. You can add:
Tested-by Maxime Coquelin <[email protected]>Acked-by Maxime Coquelin <[email protected]>
Oh, that was so quick. Thanks a lot.
Signature · 1 line
viresh
PATCH 37/41 clocksource: sun5i: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate sun5i driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/timer-sun5i.c | 45 ++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 19 deletions(-)
drivers/clocksource/timer-sun5i.c +26 -19
@@ -103,27 +103,31 @@ static void sun5i_clkevt_time_start(struct sun5i_timer_clkevt *ce, u8 timer, boo ce->timer.base + TIMER_CTL_REG(timer)); } -static void sun5i_clkevt_mode (enum clock_event_mode mode, -struct clock_event_device *clkevt) +static int sun5i_clkevt_shutdown (struct clock_event_device *clkevt) {struct sun5i_timer_clkevt *ce =to_sun5i_timer_clkevt (clkevt); -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -sun5i_clkevt_time_stop (ce,0 ); -sun5i_clkevt_time_setup (ce,0 , ce->timer.ticks_per_jiffy); -sun5i_clkevt_time_start (ce,0 , true); -break ; -case CLOCK_EVT_MODE_ONESHOT : -sun5i_clkevt_time_stop (ce,0 ); -sun5i_clkevt_time_start (ce,0 , false); -break ; -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -default : -sun5i_clkevt_time_stop (ce,0 ); -break ; - } +sun5i_clkevt_time_stop (ce,0 ); +return 0 ; +} + +static int sun5i_clkevt_set_oneshot (struct clock_event_device *clkevt) +{ +struct sun5i_timer_clkevt *ce =to_sun5i_timer_clkevt (clkevt); + +sun5i_clkevt_time_stop (ce,0 ); +sun5i_clkevt_time_start (ce,0 , false); +return 0 ; +} + +static int sun5i_clkevt_set_periodic (struct clock_event_device *clkevt) +{ +struct sun5i_timer_clkevt *ce =to_sun5i_timer_clkevt (clkevt); + +sun5i_clkevt_time_stop (ce,0 ); +sun5i_clkevt_time_setup (ce,0 , ce->timer.ticks_per_jiffy); +sun5i_clkevt_time_start (ce,0 , true); +return 0 ; } static int sun5i_clkevt_next_event(unsigned long evt,
@@ -286,7 +290,10 @@ static int __init sun5i_setup_clockevent(struct device_node *node, void __iomem ce->clkevt.name = node->name; ce->clkevt.features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT ; ce->clkevt.set_next_event = sun5i_clkevt_next_event; - ce->clkevt.set_mode = sun5i_clkevt_mode; + ce->clkevt.set_state_shutdown = sun5i_clkevt_shutdown; + ce->clkevt.set_state_periodic = sun5i_clkevt_set_periodic; + ce->clkevt.set_state_oneshot = sun5i_clkevt_set_oneshot; + ce->clkevt.tick_resume = sun5i_clkevt_shutdown; ce->clkevt.rating =340 ; ce->clkevt.irq = irq; ce->clkevt.cpumask = cpu_possible_mask;
Signature · 1 line
2.4.0
PATCH 38/41 clocksource: u300: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate u300 driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/timer-u300.c | 155 +++++++++++++++++++-------------------- 1 file changed, 77 insertions(+), 78 deletions(-)
drivers/clocksource/timer-u300.c +77 -78
@@ -187,85 +187,82 @@ struct u300_clockevent_data {unsigned ticks_per_jiffy; }; +static int u300_shutdown (struct clock_event_device *evt) +{ +/* Disable interrupts on GP1 */ +writel (U300_TIMER_APP_GPT1IE_IRQ_DISABLE , + u300_timer_base +U300_TIMER_APP_GPT1IE ); +/* Disable GP1 */ +writel (U300_TIMER_APP_DGPT1_TIMER_DISABLE , + u300_timer_base +U300_TIMER_APP_DGPT1 ); +return 0 ; +} +/* -* The u300_set_mode() function is always called first, if we -* have oneshot timer active, the oneshot scheduling function +* If we have oneshot timer active, the oneshot scheduling function * u300_set_next_event() is called immediately after. */ -static void u300_set_mode (enum clock_event_mode mode, -struct clock_event_device *evt) +static int u300_set_oneshot (struct clock_event_device *evt) +{ +/* Just return; here? */ +/* +* The actual event will be programmed by the next event hook, +* so we just set a dummy value somewhere at the end of the +* universe here. +*/ +/* Disable interrupts on GPT1 */ +writel (U300_TIMER_APP_GPT1IE_IRQ_DISABLE , + u300_timer_base +U300_TIMER_APP_GPT1IE ); +/* Disable GP1 while we're reprogramming it. */ +writel (U300_TIMER_APP_DGPT1_TIMER_DISABLE , + u300_timer_base +U300_TIMER_APP_DGPT1 ); +/* +* Expire far in the future, u300_set_next_event() will be +* called soon... +*/ +writel (0xFFFFFFFF , u300_timer_base +U300_TIMER_APP_GPT1TC ); +/* We run one shot per tick here! */ +writel (U300_TIMER_APP_SGPT1M_MODE_ONE_SHOT , + u300_timer_base +U300_TIMER_APP_SGPT1M ); +/* Enable interrupts for this timer */ +writel (U300_TIMER_APP_GPT1IE_IRQ_ENABLE , + u300_timer_base +U300_TIMER_APP_GPT1IE ); +/* Enable timer */ +writel (U300_TIMER_APP_EGPT1_TIMER_ENABLE , + u300_timer_base +U300_TIMER_APP_EGPT1 ); +return 0 ; +} + +static int u300_set_periodic (struct clock_event_device *evt) {struct u300_clockevent_data *cevdata = container_of(evt, struct u300_clockevent_data, cevd); -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -/* Disable interrupts on GPT1 */ -writel (U300_TIMER_APP_GPT1IE_IRQ_DISABLE , - u300_timer_base +U300_TIMER_APP_GPT1IE ); -/* Disable GP1 while we're reprogramming it. */ -writel (U300_TIMER_APP_DGPT1_TIMER_DISABLE , - u300_timer_base +U300_TIMER_APP_DGPT1 ); -/* -* Set the periodic mode to a certain number of ticks per -* jiffy. -*/ -writel (cevdata->ticks_per_jiffy, - u300_timer_base +U300_TIMER_APP_GPT1TC ); -/* -* Set continuous mode, so the timer keeps triggering -* interrupts. -*/ -writel (U300_TIMER_APP_SGPT1M_MODE_CONTINUOUS , - u300_timer_base +U300_TIMER_APP_SGPT1M ); -/* Enable timer interrupts */ -writel (U300_TIMER_APP_GPT1IE_IRQ_ENABLE , - u300_timer_base +U300_TIMER_APP_GPT1IE ); -/* Then enable the OS timer again */ -writel (U300_TIMER_APP_EGPT1_TIMER_ENABLE , - u300_timer_base +U300_TIMER_APP_EGPT1 ); -break ; -case CLOCK_EVT_MODE_ONESHOT : -/* Just break; here? */ -/* -* The actual event will be programmed by the next event hook, -* so we just set a dummy value somewhere at the end of the -* universe here. -*/ -/* Disable interrupts on GPT1 */ -writel (U300_TIMER_APP_GPT1IE_IRQ_DISABLE , - u300_timer_base +U300_TIMER_APP_GPT1IE ); -/* Disable GP1 while we're reprogramming it. */ -writel (U300_TIMER_APP_DGPT1_TIMER_DISABLE , - u300_timer_base +U300_TIMER_APP_DGPT1 ); -/* -* Expire far in the future, u300_set_next_event() will be -* called soon... -*/ -writel (0xFFFFFFFF , u300_timer_base +U300_TIMER_APP_GPT1TC ); -/* We run one shot per tick here! */ -writel (U300_TIMER_APP_SGPT1M_MODE_ONE_SHOT , - u300_timer_base +U300_TIMER_APP_SGPT1M ); -/* Enable interrupts for this timer */ -writel (U300_TIMER_APP_GPT1IE_IRQ_ENABLE , - u300_timer_base +U300_TIMER_APP_GPT1IE ); -/* Enable timer */ -writel (U300_TIMER_APP_EGPT1_TIMER_ENABLE , - u300_timer_base +U300_TIMER_APP_EGPT1 ); -break ; -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -/* Disable interrupts on GP1 */ -writel (U300_TIMER_APP_GPT1IE_IRQ_DISABLE , - u300_timer_base +U300_TIMER_APP_GPT1IE ); -/* Disable GP1 */ -writel (U300_TIMER_APP_DGPT1_TIMER_DISABLE , - u300_timer_base +U300_TIMER_APP_DGPT1 ); -break ; -case CLOCK_EVT_MODE_RESUME : -/* Ignore this call */ -break ; - } +/* Disable interrupts on GPT1 */ +writel (U300_TIMER_APP_GPT1IE_IRQ_DISABLE , + u300_timer_base +U300_TIMER_APP_GPT1IE ); +/* Disable GP1 while we're reprogramming it. */ +writel (U300_TIMER_APP_DGPT1_TIMER_DISABLE , + u300_timer_base +U300_TIMER_APP_DGPT1 ); +/* +* Set the periodic mode to a certain number of ticks per +* jiffy. +*/ +writel (cevdata->ticks_per_jiffy, + u300_timer_base +U300_TIMER_APP_GPT1TC ); +/* +* Set continuous mode, so the timer keeps triggering +* interrupts. +*/ +writel (U300_TIMER_APP_SGPT1M_MODE_CONTINUOUS , + u300_timer_base +U300_TIMER_APP_SGPT1M ); +/* Enable timer interrupts */ +writel (U300_TIMER_APP_GPT1IE_IRQ_ENABLE , + u300_timer_base +U300_TIMER_APP_GPT1IE ); +/* Then enable the OS timer again */ +writel (U300_TIMER_APP_EGPT1_TIMER_ENABLE , + u300_timer_base +U300_TIMER_APP_EGPT1 ); +return 0 ; }/*
@@ -309,13 +306,15 @@ static int u300_set_next_event(unsigned long cycles,static struct u300_clockevent_data u300_clockevent_data = {/* Use general purpose timer 1 as clock event */ .cevd = { - .name ="GPT1" , + .name ="GPT1" ,/* Reasonably fast and accurate clock event */ - .rating =300 , - .features =CLOCK_EVT_FEAT_PERIODIC | -CLOCK_EVT_FEAT_ONESHOT , - .set_next_event = u300_set_next_event, - .set_mode = u300_set_mode, + .rating =300 , + .features =CLOCK_EVT_FEAT_PERIODIC | +CLOCK_EVT_FEAT_ONESHOT , + .set_next_event = u300_set_next_event, + .set_state_shutdown = u300_shutdown, + .set_state_periodic = u300_set_periodic, + .set_state_oneshot = u300_set_oneshot, }, };
Signature · 1 line
2.4.0
Re: [PATCH 38/41] clocksource: u300: Migrate to new 'set-state' interface
Quoted 9 lines · Viresh Kumar
Migrate u300 driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.Cc Linus Walleij <[email protected]>Signed-off-by Viresh Kumar <[email protected]>
Yours,
Linus Walleij
PATCH 39/41 clocksource: vf_pit: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate vf_pit driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/vf_pit_timer.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-)
drivers/clocksource/vf_pit_timer.c +12 -15
@@ -86,20 +86,16 @@ static int pit_set_next_event(unsigned long delta,return 0 ; } -static void pit_set_mode (enum clock_event_mode mode, -struct clock_event_device *evt) +static int pit_shutdown (struct clock_event_device *evt) { -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -pit_set_next_event (cycle_per_jiffy, evt); -break ; -case CLOCK_EVT_MODE_SHUTDOWN : -case CLOCK_EVT_MODE_UNUSED : -pit_timer_disable (); -break ; -default : -break ; - } +pit_timer_disable (); +return 0 ; +} + +static int pit_set_periodic (struct clock_event_device *evt) +{ +pit_set_next_event (cycle_per_jiffy, evt); +return 0 ; }static irqreturn_t pit_timer_interrupt (int irq,void *dev_id)
@@ -114,7 +110,7 @@ static irqreturn_t pit_timer_interrupt(int irq, void *dev_id)* and start the counter again. So software need to disable the timer * to stop the counter loop in ONESHOT mode. */ -if (likely (evt->mode ==CLOCK_EVT_MODE_ONESHOT )) +if (likely (clockevent_state_oneshot (evt)))pit_timer_disable (); evt->event_handler (evt);
@@ -125,7 +121,8 @@ static irqreturn_t pit_timer_interrupt(int irq, void *dev_id)static struct clock_event_device clockevent_pit = { .name ="VF pit timer" , .features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT , - .set_mode = pit_set_mode, + .set_state_shutdown = pit_shutdown, + .set_state_periodic = pit_set_periodic, .set_next_event = pit_set_next_event, .rating =300 , };
Signature · 1 line
2.4.0
Re: [PATCH 39/41] clocksource: vf_pit: Migrate to new 'set-state' interface
Quoted 61 lines · Viresh Kumar
Migrate
vf_pitdriver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.Cc Jingchang Lu <[email protected]>Cc Stefan Agner <[email protected]>Cc Shawn Guo <[email protected]>Signed-off-by Viresh Kumar <[email protected]>--- drivers/clocksource/vf_pit_timer.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-)drivers/clocksource/vf_pit_timer.c +10
-14@@ -86,20 +86,16 @@ static int pit_set_next_event(unsigned long delta,return 0 ; } -static void pit_set_mode (enum clock_event_mode mode, -struct clock_event_device *evt) +static int pit_shutdown (struct clock_event_device *evt) { -switch (mode) { -case CLOCK_EVT_MODE_PERIODIC : -pit_set_next_event (cycle_per_jiffy, evt); -break ; -case CLOCK_EVT_MODE_SHUTDOWN : -case CLOCK_EVT_MODE_UNUSED : -pit_timer_disable (); -break ; -default : -break ; - } +pit_timer_disable (); +return 0 ; +} + +static int pit_set_periodic (struct clock_event_device *evt) +{ +pit_set_next_event (cycle_per_jiffy, evt); +return 0 ; }static irqreturn_t pit_timer_interrupt (int irq,void *dev_id)@@ -114,7 +110,7 @@ static irqreturn_t pit_timer_interrupt(int irq,void *dev_id) * and start the counter again. So software need to disable the timer * to stop the counter loop in ONESHOT mode. */ -if (likely (evt->mode ==CLOCK_EVT_MODE_ONESHOT )) +if (likely (clockevent_state_oneshot (evt)))pit_timer_disable ();drivers/clocksource/vf_pit_timer.c +0
-0evt->event_handler (evt);
drivers/clocksource/vf_pit_timer.c static irqreturn_t pit_timer_interrupt(int irq, · line 126
Quoted 7 lines
drivers/clocksource/vf_pit_timer.c +2
-1@@ -125,7 +121,8 @@ static irqreturn_t pit_timer_interrupt(int irq, void *dev_id)static struct clock_event_device clockevent_pit = { .name ="VF pit timer" , .features =CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT , - .set_mode = pit_set_mode, + .set_state_shutdown = pit_shutdown, + .set_state_periodic = pit_set_periodic,
I'm not really familiar with the interface, but given that we announce the feature CLOCK_EVT_FEAT_ONESHOT shouldn't we add a set_state_oneshot callback here?
--
Stefan
Quoted 3 lines
drivers/clocksource/vf_pit_timer.c +0
-0.set_next_event = pit_set_next_event, .rating = 300,};
Re: [PATCH 39/41] clocksource: vf_pit: Migrate to new 'set-state' interface
Quoted 8 lines · Stefan Agner
drivers/clocksource/vf_pit_timer.c static irqreturn_t pit_timer_interrupt(int irq, void *dev_id) · line 125
Quoted 4 lines
drivers/clocksource/vf_pit_timer.c +2
-1.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, - .set_mode = pit_set_mode, + .set_state_shutdown = pit_shutdown, + .set_state_periodic = pit_set_periodic,I'm not really familiar with the interface, but given that we announce the feature
CLOCK_EVT_FEAT_ONESHOTshouldn't we add aset_state_oneshotcallback here?
We weren't doing anything in pit_set_mode(ONESHOT) and so that callback is not implemented. In case you need to do something in set_state_oneshot(), we can add it back.
Signature · 1 line
viresh
Stefan Agner
Acked-byRe: [PATCH 39/41] clocksource: vf_pit: Migrate to new 'set-state' interface
Quoted 10 lines · Viresh Kumar
Quoted 8 lines · Stefan Agner
drivers/clocksource/vf_pit_timer.c static irqreturn_t pit_timer_interrupt(int irq, void *dev_id) · line 125
Quoted 4 lines
drivers/clocksource/vf_pit_timer.c +2
-1.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, - .set_mode = pit_set_mode, + .set_state_shutdown = pit_shutdown, + .set_state_periodic = pit_set_periodic,I'm not really familiar with the interface, but given that we announce the feature
CLOCK_EVT_FEAT_ONESHOTshouldn't we add aset_state_oneshotcallback here?
Quoted 3 lines
We weren't doing anything in
pit_set_mode(ONESHOT)and so that callback is not implemented. In case you need to do something inset_state_oneshot(), we can add it back.
True, weren't doing anything. I wonder if that is right. Afaik, we should set the same timer for oneshot too, hence call pit_set_next_event. With your change we can just reuse the same function (pit_set_periodic) for set_state_oneshot.
To maintain the atomicity of the changes, this would need to be fixed in a separate patch anyway. So this change looks good to me:
I guess "clockevents: Allow set-state callbacks to be optional" makes it before this patch? Otherwise we would call a null pointer...
--
Stefan
Re: [PATCH 39/41] clocksource: vf_pit: Migrate to new 'set-state' interface
Quoted 11 lines · Stefan Agner
Quoted 10 lines · Viresh Kumar
Quoted 8 lines · Stefan Agner
drivers/clocksource/vf_pit_timer.c static irqreturn_t pit_timer_interrupt(int irq, void *dev_id) · line 125
Quoted 4 lines
drivers/clocksource/vf_pit_timer.c +2
-1.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, - .set_mode = pit_set_mode, + .set_state_shutdown = pit_shutdown, + .set_state_periodic = pit_set_periodic,I'm not really familiar with the interface, but given that we announce the feature
CLOCK_EVT_FEAT_ONESHOTshouldn't we add aset_state_oneshotcallback here?
Quoted 8 lines
Quoted 3 lines
We weren't doing anything in
pit_set_mode(ONESHOT)and so that callback is not implemented. In case you need to do something inset_state_oneshot(), we can add it back.True, weren't doing anything. I wonder if that is right. Afaik, we should set the same timer for oneshot too, hence call
pit_set_next_event. With your change we can just reuse the same function (pit_set_periodic) forset_state_oneshot.
pit_set_next_event() will be called by clockevents core directly after tying to set the device in oneshot mode. And so no changes are required.
Quoted 4 lines
To maintain the atomicity of the changes, this would need to be fixed in a separate patch anyway. So this change looks good to me:
Acked-by Stefan Agner <[email protected]>
Thanks.
Quoted 2 lines
I guess "clockevents: Allow set-state callbacks to be optional" makes it before this patch? Otherwise we would call a null pointer...
Yeah, I have mentioned this in the cover-letter that there are dependencies over clockevent core's next branch.
Signature · 1 line
viresh
PATCH 40/41 clocksource: vt8500: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate vt8500 driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/vt8500_timer.c | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-)
drivers/clocksource/vt8500_timer.c +10 -19
@@ -88,29 +88,20 @@ static int vt8500_timer_set_next_event(unsigned long cycles,return 0 ; } -static void vt8500_timer_set_mode (enum clock_event_mode mode, -struct clock_event_device *evt) +static int vt8500_shutdown (struct clock_event_device *evt) { -switch (mode) { -case CLOCK_EVT_MODE_RESUME : -case CLOCK_EVT_MODE_PERIODIC : -break ; -case CLOCK_EVT_MODE_ONESHOT : -case CLOCK_EVT_MODE_UNUSED : -case CLOCK_EVT_MODE_SHUTDOWN : -writel (readl (regbase +TIMER_CTRL_VAL ) |1 , - regbase +TIMER_CTRL_VAL ); -writel (0 , regbase +TIMER_IER_VAL ); -break ; - } +writel (readl (regbase +TIMER_CTRL_VAL ) |1 , regbase +TIMER_CTRL_VAL ); +writel (0 , regbase +TIMER_IER_VAL ); +return 0 ; }static struct clock_event_device clockevent = { - .name ="vt8500_timer" , - .features =CLOCK_EVT_FEAT_ONESHOT , - .rating =200 , - .set_next_event = vt8500_timer_set_next_event, - .set_mode = vt8500_timer_set_mode, + .name ="vt8500_timer" , + .features =CLOCK_EVT_FEAT_ONESHOT , + .rating =200 , + .set_next_event = vt8500_timer_set_next_event, + .set_state_shutdown = vt8500_shutdown, + .set_state_oneshot = vt8500_shutdown, };static irqreturn_t vt8500_timer_interrupt (int irq,void *dev_id)
Signature · 1 line
2.4.0
PATCH 41/41 clocksource: zevio: Migrate to new 'set-state' interface
In reply to a message not in the archiveMigrate zevio driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example: ONESHOT_STOPPED.
--- drivers/clocksource/zevio-timer.c | 44 +++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 23 deletions(-)
drivers/clocksource/zevio-timer.c +21 -23
@@ -76,32 +76,28 @@ static int zevio_timer_set_event(unsigned long delta,return 0 ; } -static void zevio_timer_set_mode (enum clock_event_mode mode, -struct clock_event_device *dev) +static int zevio_timer_shutdown (struct clock_event_device *dev) { struct zevio_timer *timer = container_of(dev, struct zevio_timer, clkevt); -switch (mode) { -case CLOCK_EVT_MODE_RESUME : -case CLOCK_EVT_MODE_ONESHOT : -/* Enable timer interrupts */ -writel (TIMER_INTR_MSK , timer->interrupt_regs +IO_INTR_MSK ); -writel (TIMER_INTR_ALL , timer->interrupt_regs +IO_INTR_ACK ); -break ; -case CLOCK_EVT_MODE_SHUTDOWN : -case CLOCK_EVT_MODE_UNUSED : -/* Disable timer interrupts */ -writel (0 , timer->interrupt_regs +IO_INTR_MSK ); -writel (TIMER_INTR_ALL , timer->interrupt_regs +IO_INTR_ACK ); -/* Stop timer */ -writel (CNTL_STOP_TIMER , timer->timer1 +IO_CONTROL ); -break ; -case CLOCK_EVT_MODE_PERIODIC : -default : -/* Unsupported */ -break ; - } +/* Disable timer interrupts */ +writel (0 , timer->interrupt_regs +IO_INTR_MSK ); +writel (TIMER_INTR_ALL , timer->interrupt_regs +IO_INTR_ACK ); +/* Stop timer */ +writel (CNTL_STOP_TIMER , timer->timer1 +IO_CONTROL ); +return 0 ; +} + +static int zevio_timer_set_oneshot (struct clock_event_device *dev) +{ + struct zevio_timer *timer = container_of(dev, struct zevio_timer, + clkevt); + +/* Enable timer interrupts */ +writel (TIMER_INTR_MSK , timer->interrupt_regs +IO_INTR_MSK ); +writel (TIMER_INTR_ALL , timer->interrupt_regs +IO_INTR_ACK ); +return 0 ; }static irqreturn_t zevio_timer_interrupt (int irq,void *dev_id)
@@ -162,7 +158,9 @@ static int __init zevio_timer_add(struct device_node *node)if (timer->interrupt_regs && irqnr) { timer->clkevt.name = timer->clockevent_name; timer->clkevt.set_next_event = zevio_timer_set_event; - timer->clkevt.set_mode = zevio_timer_set_mode; + timer->clkevt.set_state_shutdown = zevio_timer_shutdown; + timer->clkevt.set_state_oneshot = zevio_timer_set_oneshot; + timer->clkevt.tick_resume = zevio_timer_set_oneshot; timer->clkevt.rating =200 ; timer->clkevt.cpumask = cpu_all_mask; timer->clkevt.features =CLOCK_EVT_FEAT_ONESHOT ;
Signature · 1 line
2.4.0
Re: [PATCH 41/41] clocksource: zevio: Migrate to new 'set-state' interface
Quoted 10 lines · Viresh Kumar
Migrate zevio driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.Cc Daniel Tang <[email protected]>Signed-off-by Viresh Kumar <[email protected]>---
[ ... ]
drivers/clocksource/zevio-timer.c static int __init zevio_timer_add(struct device_node *node) · line 163
Quoted 9 lines
static
irqreturn_tzevio_timer_interrupt(int irq, void *dev_id)drivers/clocksource/zevio-timer.c +3
-1@@ -162,7 +158,9 @@ static int __init zevio_timer_add(struct device_node *node)if (timer->interrupt_regs && irqnr) { timer->clkevt.name = timer->clockevent_name; timer->clkevt.set_next_event = zevio_timer_set_event; - timer->clkevt.set_mode = zevio_timer_set_mode; + timer->clkevt.set_state_shutdown = zevio_timer_shutdown; + timer->clkevt.set_state_oneshot = zevio_timer_set_oneshot; + timer->clkevt.tick_resume = zevio_timer_set_oneshot;
Why is tick_resume added here ?
Quoted 4 lines
drivers/clocksource/zevio-timer.c +0
-0timer->clkevt.rating =200 ; timer->clkevt.cpumask = cpu_all_mask; timer->clkevt.features =CLOCK_EVT_FEAT_ONESHOT ;
Signature · 5 lines
<http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog
Re: [PATCH 41/41] clocksource: zevio: Migrate to new 'set-state' interface
Quoted 14 lines · Daniel Lezcano
Quoted 10 lines · Viresh Kumar
Migrate zevio driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.Cc Daniel Tang <[email protected]>Signed-off-by Viresh Kumar <[email protected]>---
[ ... ]
Quoted 11 lines
drivers/clocksource/zevio-timer.c static int __init zevio_timer_add(struct device_node *node) · line 163
Quoted 9 lines
static
irqreturn_tzevio_timer_interrupt(int irq, void *dev_id)drivers/clocksource/zevio-timer.c +3
-1@@ -162,7 +158,9 @@ static int __init zevio_timer_add(struct device_node *node)if (timer->interrupt_regs && irqnr) { timer->clkevt.name = timer->clockevent_name; timer->clkevt.set_next_event = zevio_timer_set_event; - timer->clkevt.set_mode = zevio_timer_set_mode; + timer->clkevt.set_state_shutdown = zevio_timer_shutdown; + timer->clkevt.set_state_oneshot = zevio_timer_set_oneshot; + timer->clkevt.tick_resume = zevio_timer_set_oneshot;Why is
tick_resumeadded here ?
I am assuming you are lost because of reviewing too many similar patches, but anyway below was part of the diff and so resume was required :)
- switch (mode) {
- case CLOCK_EVT_MODE_RESUME:
- case CLOCK_EVT_MODE_ONESHOT:
- /* Enable timer interrupts */
- writel(TIMER_INTR_MSK, timer->interrupt_regs + IO_INTR_MSK);
- writel(TIMER_INTR_ALL, timer->interrupt_regs + IO_INTR_ACK);
- break;Signature · 1 line
viresh
Re: [PATCH 41/41] clocksource: zevio: Migrate to new 'set-state' interface
Quoted 27 lines · Viresh Kumar
Quoted 14 lines · Daniel Lezcano
Quoted 10 lines · Viresh Kumar
Migrate zevio driver to the new 'set-state' interface provided by clockevents core, the earlier 'set-mode' interface is marked obsolete now.
This also enables us to implement callbacks for new states of clockevent devices, for example:
ONESHOT_STOPPED.Cc Daniel Tang <[email protected]>Signed-off-by Viresh Kumar <[email protected]>---
[ ... ]
Quoted 11 lines
drivers/clocksource/zevio-timer.c static int __init zevio_timer_add(struct device_node *node) · line 163
Quoted 9 lines
static
irqreturn_tzevio_timer_interrupt(int irq, void *dev_id)drivers/clocksource/zevio-timer.c +3
-1@@ -162,7 +158,9 @@ static int __init zevio_timer_add(struct device_node *node)if (timer->interrupt_regs && irqnr) { timer->clkevt.name = timer->clockevent_name; timer->clkevt.set_next_event = zevio_timer_set_event; - timer->clkevt.set_mode = zevio_timer_set_mode; + timer->clkevt.set_state_shutdown = zevio_timer_shutdown; + timer->clkevt.set_state_oneshot = zevio_timer_set_oneshot; + timer->clkevt.tick_resume = zevio_timer_set_oneshot;Why is
tick_resumeadded here ?
Quoted 3 lines
I am assuming you are lost because of reviewing too many similar patches, but anyway below was part of the diff and so resume was required :)
Ah, yeah. I missed the RESUME. Thanks.
Signature · 5 lines
<http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog