From mboxrd@z Thu Jan 1 00:00:00 1970 From: pawelo@king.net.pl (Paul Osmialowski) Date: Wed, 1 Jul 2015 16:20:48 +0200 (CEST) Subject: [PATCH v2 4/9] arm: twr-k70f120m: timer driver for Kinetis SoC In-Reply-To: References: <1435667250-28299-1-git-send-email-pawelo@king.net.pl> <1435667250-28299-5-git-send-email-pawelo@king.net.pl> Message-ID: To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Wed, 1 Jul 2015, Thomas Gleixner wrote: >> >> As I removed this kinetis_pit_enable() line, the timer did not start, >> therefore the system became unusable. What could be possible reason for that? > > Well, you need to move both, the init and the enable into > set_periodic(). > Indeed, something like this worked: diff --git a/drivers/clocksource/timer-kinetis.c b/drivers/clocksource/timer-kinetis.c index 1424308..41ef94f 100644 --- a/drivers/clocksource/timer-kinetis.c +++ b/drivers/clocksource/timer-kinetis.c @@ -61,6 +61,7 @@ struct kinetis_clock_event_ddata { struct clock_event_device evtdev; void __iomem *base; void __iomem *mcr; + unsigned long rate; spinlock_t lock; }; @@ -115,6 +116,7 @@ static int kinetis_clockevent_tmr_set_state_periodic( struct kinetis_clock_event_ddata *pit = container_of(evt, struct kinetis_clock_event_ddata, evtdev); + kinetis_pit_init(pit, (pit->rate / HZ) - 1); kinetis_pit_enable(pit, 1); return 0; @@ -235,6 +237,7 @@ static void __init kinetis_clockevent_init(struct device_node *np) kinetis_clockevent_tmr_set_state_oneshot; kinetis_tmr->base = base; kinetis_tmr->mcr = mcr; + kinetis_tmr->rate = rate; spin_lock_init(&kinetis_tmr->lock); /* @@ -250,9 +253,6 @@ static void __init kinetis_clockevent_init(struct device_node *np) clockevents_register_device(&kinetis_tmr->evtdev); - kinetis_pit_init(kinetis_tmr, (rate / HZ) - 1); - kinetis_pit_enable(kinetis_tmr, 1); - if (request_irq(irq, kinetis_clockevent_tmr_irq_handler, IRQF_TIMER | IRQF_IRQPOLL, "kinetis-timer",