All of lore.kernel.org
 help / color / mirror / Atom feed
* pnx8xxx: move to clocksource
@ 2008-01-10 14:10 Vitaly Wool
  2008-01-10 14:37 ` Ralf Baechle
  2008-01-10 16:21 ` Sergei Shtylyov
  0 siblings, 2 replies; 7+ messages in thread
From: Vitaly Wool @ 2008-01-10 14:10 UTC (permalink / raw)
  To: ralf; +Cc: linux-mips

This patch converts PNX8XXX system timer to clocksource.

 arch/mips/philips/pnx8550/common/time.c |  109 +++++++++++++++++++++-----------
 1 files changed, 72 insertions(+), 37 deletions(-)

Signed-off-by: Vitaly Wool <vitalywool@gmail.com>

Index: linux-2.6/arch/mips/philips/pnx8550/common/time.c
===================================================================
--- linux-2.6.orig/arch/mips/philips/pnx8550/common/time.c
+++ linux-2.6/arch/mips/philips/pnx8550/common/time.c
@@ -22,7 +22,6 @@
 #include <linux/kernel_stat.h>
 #include <linux/spinlock.h>
 #include <linux/interrupt.h>
-#include <linux/module.h>
 
 #include <asm/bootinfo.h>
 #include <asm/cpu.h>
@@ -41,11 +40,60 @@ static cycle_t hpt_read(void)
 	return read_c0_count2();
 }
 
+static struct clocksource pnx_clocksource = {
+	.name		= "pnx8xxx",
+	.rating		= 200,
+	.read		= hpt_read,
+	.flags		= CLOCK_SOURCE_IS_CONTINUOUS,
+};
+
 static void timer_ack(void)
 {
 	write_c0_compare(cpj);
 }
 
+static irqreturn_t pnx8xxx_timer_interrupt(int irq, void *dev_id)
+{
+        struct clock_event_device *c = dev_id;
+
+        /* clear MATCH, signal the event */
+        c->event_handler(c);
+
+	return IRQ_HANDLED;
+}
+
+static struct irqaction pnx8xxx_timer_irq = {
+	.handler	= pnx8xxx_timer_interrupt,
+	.flags		= IRQF_DISABLED | IRQF_PERCPU,
+	.name		= "pnx8xxx_timer",
+};
+
+static irqreturn_t monotonic_interrupt(int irq, void *dev_id)
+{
+	/* Timer 2 clear interrupt */
+	write_c0_compare2(-1);
+	return IRQ_HANDLED;
+}
+
+static struct irqaction monotonic_irqaction = {
+	.handler = monotonic_interrupt,
+	.flags = IRQF_DISABLED,
+	.name = "Monotonic timer",
+};
+
+static int pnx8xxx_set_next_event(unsigned long delta,
+				struct clock_event_device *evt)
+{
+	write_c0_compare(delta);
+	return 0;
+}
+
+static struct clock_event_device pnx8xxx_clockevent = {
+	.name		= "pnx8xxx_clockevent",
+	.features	= CLOCK_EVT_FEAT_ONESHOT,
+	.set_next_event = pnx8xxx_set_next_event,
+};
+
 /*
  * plat_time_init() - it does the following things:
  *
@@ -58,11 +106,34 @@ static void timer_ack(void)
 
 __init void plat_time_init(void)
 {
+	unsigned int             configPR;
 	unsigned int             n;
 	unsigned int             m;
 	unsigned int             p;
 	unsigned int             pow2p;
 
+	clockevents_register_device(&pnx8xxx_clockevent);
+	clocksource_register(&pnx_clocksource);
+
+	setup_irq(PNX8550_INT_TIMER1, &pnx8xxx_timer_irq);
+	setup_irq(PNX8550_INT_TIMER2, &monotonic_irqaction);
+
+	/* Timer 1 start */
+	configPR = read_c0_config7();
+	configPR &= ~0x00000008;
+	write_c0_config7(configPR);
+
+	/* Timer 2 start */
+	configPR = read_c0_config7();
+	configPR &= ~0x00000010;
+	write_c0_config7(configPR);
+
+	/* Timer 3 stop */
+	configPR = read_c0_config7();
+	configPR |= 0x00000020;
+	write_c0_config7(configPR);
+
+
         /* PLL0 sets MIPS clock (PLL1 <=> TM1, PLL6 <=> TM2, PLL5 <=> mem) */
         /* (but only if CLK_MIPS_CTL select value [bits 3:1] is 1:  FIXME) */
 
@@ -87,42 +158,6 @@ __init void plat_time_init(void)
 	write_c0_count2(0);
 	write_c0_compare2(0xffffffff);
 
-	clocksource_mips.read = hpt_read;
-	mips_timer_ack = timer_ack;
-}
-
-static irqreturn_t monotonic_interrupt(int irq, void *dev_id)
-{
-	/* Timer 2 clear interrupt */
-	write_c0_compare2(-1);
-	return IRQ_HANDLED;
 }
 
-static struct irqaction monotonic_irqaction = {
-	.handler = monotonic_interrupt,
-	.flags = IRQF_DISABLED,
-	.name = "Monotonic timer",
-};
 
-void __init plat_timer_setup(struct irqaction *irq)
-{
-	int configPR;
-
-	setup_irq(PNX8550_INT_TIMER1, irq);
-	setup_irq(PNX8550_INT_TIMER2, &monotonic_irqaction);
-
-	/* Timer 1 start */
-	configPR = read_c0_config7();
-	configPR &= ~0x00000008;
-	write_c0_config7(configPR);
-
-	/* Timer 2 start */
-	configPR = read_c0_config7();
-	configPR &= ~0x00000010;
-	write_c0_config7(configPR);
-
-	/* Timer 3 stop */
-	configPR = read_c0_config7();
-	configPR |= 0x00000020;
-	write_c0_config7(configPR);
-}

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: pnx8xxx: move to clocksource
  2008-01-10 14:10 pnx8xxx: move to clocksource Vitaly Wool
@ 2008-01-10 14:37 ` Ralf Baechle
  2008-01-10 16:21 ` Sergei Shtylyov
  1 sibling, 0 replies; 7+ messages in thread
From: Ralf Baechle @ 2008-01-10 14:37 UTC (permalink / raw)
  To: Vitaly Wool; +Cc: linux-mips

On Thu, Jan 10, 2008 at 05:10:05PM +0300, Vitaly Wool wrote:

> This patch converts PNX8XXX system timer to clocksource.

Checkpatch had a little to moan on your patch:

$ scripts/checkpatch.pl /tmp/pend 
ERROR: use tabs not spaces
#79: FILE: arch/mips/philips/pnx8550/common/time.c:57:
+        struct clock_event_device *c = dev_id;$

ERROR: use tabs not spaces
#81: FILE: arch/mips/philips/pnx8550/common/time.c:59:
+        /* clear MATCH, signal the event */$

ERROR: use tabs not spaces
#82: FILE: arch/mips/philips/pnx8550/common/time.c:60:
+        c->event_handler(c);$

Your patch has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

I fixed those, applied.  Thanks!

  Ralf

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: pnx8xxx: move to clocksource
  2008-01-10 14:10 pnx8xxx: move to clocksource Vitaly Wool
  2008-01-10 14:37 ` Ralf Baechle
@ 2008-01-10 16:21 ` Sergei Shtylyov
  2008-01-10 16:27   ` Ralf Baechle
  1 sibling, 1 reply; 7+ messages in thread
From: Sergei Shtylyov @ 2008-01-10 16:21 UTC (permalink / raw)
  To: Vitaly Wool; +Cc: ralf, linux-mips

Hello.

Vitaly Wool wrote:

> This patch converts PNX8XXX system timer to clocksource.

    Well, this patch has been already committed but nevertheless...

> arch/mips/philips/pnx8550/common/time.c |  109 
> +++++++++++++++++++++-----------
> 1 files changed, 72 insertions(+), 37 deletions(-)

> Signed-off-by: Vitaly Wool <vitalywool@gmail.com>

> Index: linux-2.6/arch/mips/philips/pnx8550/common/time.c
> ===================================================================
> --- linux-2.6.orig/arch/mips/philips/pnx8550/common/time.c
> +++ linux-2.6/arch/mips/philips/pnx8550/common/time.c
> @@ -22,7 +22,6 @@
> #include <linux/kernel_stat.h>
> #include <linux/spinlock.h>
> #include <linux/interrupt.h>
> -#include <linux/module.h>
> 
> #include <asm/bootinfo.h>
> #include <asm/cpu.h>
> @@ -41,11 +40,60 @@ static cycle_t hpt_read(void)
>     return read_c0_count2();
> }

> +static struct clocksource pnx_clocksource = {
> +    .name        = "pnx8xxx",
> +    .rating        = 200,
> +    .read        = hpt_read,
> +    .flags        = CLOCK_SOURCE_IS_CONTINUOUS,
> +};

    Something probably have converted tabs to 8 spaces...
    I would have done it otherwise -- using timer 1 as a generic MIPS 
clocksource (just hooking the IRQ to reload the comparator to all ones), and 
timer 2 as clockevent...

> static void timer_ack(void)
> {
>     write_c0_compare(cpj);
> }

    Do we still need this function? I don't think so -- mips_timer_ack() is 
dead...

[...]

> +static struct clock_event_device pnx8xxx_clockevent = {
> +    .name        = "pnx8xxx_clockevent",
> +    .features    = CLOCK_EVT_FEAT_ONESHOT,

    Aren't PNX8550 timers actually periodic in nature?

> +    .set_next_event = pnx8xxx_set_next_event,
> +};
> +
> /*
>  * plat_time_init() - it does the following things:
>  *
> @@ -58,11 +106,34 @@ static void timer_ack(void)
> 
> __init void plat_time_init(void)
> {
> +    unsigned int             configPR;

   Something has definitely spoilt all the tabs in the patch...

>     unsigned int             n;
>     unsigned int             m;
>     unsigned int             p;
>     unsigned int             pow2p;
> 
> +    clockevents_register_device(&pnx8xxx_clockevent);
> +    clocksource_register(&pnx_clocksource);
> +
> +    setup_irq(PNX8550_INT_TIMER1, &pnx8xxx_timer_irq);
> +    setup_irq(PNX8550_INT_TIMER2, &monotonic_irqaction);
> +
> +    /* Timer 1 start */
> +    configPR = read_c0_config7();
> +    configPR &= ~0x00000008;
> +    write_c0_config7(configPR);
> +
> +    /* Timer 2 start */
> +    configPR = read_c0_config7();
> +    configPR &= ~0x00000010;
> +    write_c0_config7(configPR);
> +
> +    /* Timer 3 stop */
> +    configPR = read_c0_config7();
> +    configPR |= 0x00000020;
> +    write_c0_config7(configPR);

    Enabling timers before they are actually set up? :-|

> +
> +
>         /* PLL0 sets MIPS clock (PLL1 <=> TM1, PLL6 <=> TM2, PLL5 <=> 
> mem) */
>         /* (but only if CLK_MIPS_CTL select value [bits 3:1] is 1:  
> FIXME) */
> 

WBR, Sergei

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: pnx8xxx: move to clocksource
  2008-01-10 16:21 ` Sergei Shtylyov
@ 2008-01-10 16:27   ` Ralf Baechle
  2008-01-10 16:48     ` Vitaly Wool
  2008-01-10 17:05     ` Sergei Shtylyov
  0 siblings, 2 replies; 7+ messages in thread
From: Ralf Baechle @ 2008-01-10 16:27 UTC (permalink / raw)
  To: Sergei Shtylyov; +Cc: Vitaly Wool, linux-mips

On Thu, Jan 10, 2008 at 07:21:17PM +0300, Sergei Shtylyov wrote:

>> Index: linux-2.6/arch/mips/philips/pnx8550/common/time.c
>> ===================================================================
>> --- linux-2.6.orig/arch/mips/philips/pnx8550/common/time.c
>> +++ linux-2.6/arch/mips/philips/pnx8550/common/time.c
>> @@ -22,7 +22,6 @@
>> #include <linux/kernel_stat.h>
>> #include <linux/spinlock.h>
>> #include <linux/interrupt.h>
>> -#include <linux/module.h>
>>
>> #include <asm/bootinfo.h>
>> #include <asm/cpu.h>
>> @@ -41,11 +40,60 @@ static cycle_t hpt_read(void)
>>     return read_c0_count2();
>> }
>
>> +static struct clocksource pnx_clocksource = {
>> +    .name        = "pnx8xxx",
>> +    .rating        = 200,
>> +    .read        = hpt_read,
>> +    .flags        = CLOCK_SOURCE_IS_CONTINUOUS,
>> +};
>
>    Something probably have converted tabs to 8 spaces...

Only 3 of them?

>    I would have done it otherwise -- using timer 1 as a generic MIPS 
> clocksource (just hooking the IRQ to reload the comparator to all ones), 
> and timer 2 as clockevent...
>
>> static void timer_ack(void)
>> {
>>     write_c0_compare(cpj);
>> }
>
>    Do we still need this function? I don't think so -- mips_timer_ack() is 
> dead...

It's only used on initialization.

> [...]
>
>> +static struct clock_event_device pnx8xxx_clockevent = {
>> +    .name        = "pnx8xxx_clockevent",
>> +    .features    = CLOCK_EVT_FEAT_ONESHOT,
>
>    Aren't PNX8550 timers actually periodic in nature?

All I recall is they were odd ;-)

The hardware nature of timers and how to declare them to the Linux timer
code is not always the same.  CLOCK_EVT_FEAT_ONESHOT be used if the
time to the next shot can be programmed.

>>
>> __init void plat_time_init(void)
>> {
>> +    unsigned int             configPR;
>
>   Something has definitely spoilt all the tabs in the patch...

I fixed the three checkpatch.pl was bitching about.

>>     unsigned int             n;
>>     unsigned int             m;
>>     unsigned int             p;
>>     unsigned int             pow2p;
>>
>> +    clockevents_register_device(&pnx8xxx_clockevent);
>> +    clocksource_register(&pnx_clocksource);
>> +
>> +    setup_irq(PNX8550_INT_TIMER1, &pnx8xxx_timer_irq);
>> +    setup_irq(PNX8550_INT_TIMER2, &monotonic_irqaction);
>> +
>> +    /* Timer 1 start */
>> +    configPR = read_c0_config7();
>> +    configPR &= ~0x00000008;
>> +    write_c0_config7(configPR);
>> +
>> +    /* Timer 2 start */
>> +    configPR = read_c0_config7();
>> +    configPR &= ~0x00000010;
>> +    write_c0_config7(configPR);
>> +
>> +    /* Timer 3 stop */
>> +    configPR = read_c0_config7();
>> +    configPR |= 0x00000020;
>> +    write_c0_config7(configPR);
>
>    Enabling timers before they are actually set up? :-|

Are the additional timers used at all?

  Ralf

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: pnx8xxx: move to clocksource
  2008-01-10 16:27   ` Ralf Baechle
@ 2008-01-10 16:48     ` Vitaly Wool
  2008-01-10 21:50       ` Ralf Baechle
  2008-01-10 17:05     ` Sergei Shtylyov
  1 sibling, 1 reply; 7+ messages in thread
From: Vitaly Wool @ 2008-01-10 16:48 UTC (permalink / raw)
  To: Ralf Baechle; +Cc: Sergei Shtylyov, linux-mips

> >    Something probably have converted tabs to 8 spaces...

No, it's just the lines of original code moved.

> > [...]
> >
> >> +static struct clock_event_device pnx8xxx_clockevent = {
> >> +    .name        = "pnx8xxx_clockevent",
> >> +    .features    = CLOCK_EVT_FEAT_ONESHOT,
> >
> >    Aren't PNX8550 timers actually periodic in nature?
>
> All I recall is they were odd ;-)
>
> The hardware nature of timers and how to declare them to the Linux timer
> code is not always the same.  CLOCK_EVT_FEAT_ONESHOT be used if the
> time to the next shot can be programmed.

Absolutely :)

> >    Enabling timers before they are actually set up? :-|
>
> Are the additional timers used at all?

Heh, that also was the original code which was just moved from one
place in the file to the other.

Sergei, I decided not to mix whitespace cleanups and the clocksource
changes. I'll come up with the whitespace/tab fixups soon arranging it
as a separate patch.

Vitaly

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: pnx8xxx: move to clocksource
  2008-01-10 16:27   ` Ralf Baechle
  2008-01-10 16:48     ` Vitaly Wool
@ 2008-01-10 17:05     ` Sergei Shtylyov
  1 sibling, 0 replies; 7+ messages in thread
From: Sergei Shtylyov @ 2008-01-10 17:05 UTC (permalink / raw)
  To: Ralf Baechle; +Cc: Vitaly Wool, linux-mips

Ralf Baechle wrote:

> On Thu, Jan 10, 2008 at 07:21:17PM +0300, Sergei Shtylyov wrote:

>>>Index: linux-2.6/arch/mips/philips/pnx8550/common/time.c
>>>===================================================================
>>>--- linux-2.6.orig/arch/mips/philips/pnx8550/common/time.c
>>>+++ linux-2.6/arch/mips/philips/pnx8550/common/time.c
>>>@@ -22,7 +22,6 @@
>>>#include <linux/kernel_stat.h>
>>>#include <linux/spinlock.h>
>>>#include <linux/interrupt.h>
>>>-#include <linux/module.h>
>>>
>>>#include <asm/bootinfo.h>
>>>#include <asm/cpu.h>
>>>@@ -41,11 +40,60 @@ static cycle_t hpt_read(void)
>>>    return read_c0_count2();
>>>}
>>
>>>+static struct clocksource pnx_clocksource = {
>>>+    .name        = "pnx8xxx",
>>>+    .rating        = 200,
>>>+    .read        = hpt_read,
>>>+    .flags        = CLOCK_SOURCE_IS_CONTINUOUS,
>>>+};

>>   Something probably have converted tabs to 8 spaces...

> Only 3 of them?

    Erm, it's format=flowed that spoils the tabs for Mozilla which renders 
them to 4 spaces, so it's actually hard to see which tabs are actually tabs 
and which are not... :-/

>>   I would have done it otherwise -- using timer 1 as a generic MIPS 
>>clocksource (just hooking the IRQ to reload the comparator to all ones), 
>>and timer 2 as clockevent...

>>>static void timer_ack(void)
>>>{
>>>    write_c0_compare(cpj);
>>>}

>>   Do we still need this function? I don't think so -- mips_timer_ack() is 
>>dead...

> It's only used on initialization.

    Could have put the call inline, or loaded the comparator with all ones 
just like timer 2 -- we don't need 'cpj' variable any more as well...

>>[...]

>>>+static struct clock_event_device pnx8xxx_clockevent = {
>>>+    .name        = "pnx8xxx_clockevent",
>>>+    .features    = CLOCK_EVT_FEAT_ONESHOT,

>>   Aren't PNX8550 timers actually periodic in nature?

> All I recall is they were odd ;-)

> The hardware nature of timers and how to declare them to the Linux timer
> code is not always the same.  CLOCK_EVT_FEAT_ONESHOT be used if the
> time to the next shot can be programmed.

    I meant that both modes should have been indicated by the flags.
And actually, shouldn't we disable the timer after expiry if in one-shot mode.
Writing to the comparator doesn't clear the counter, AFAICS -- so, isn't the 
explicit counter clearing to 0 needed in set_next_event() method?

>>>__init void plat_time_init(void)
>>>{
>>>+    unsigned int             configPR;

>>  Something has definitely spoilt all the tabs in the patch...

> I fixed the three checkpatch.pl was bitching about.

    All the others were due to the way format=flowed is rendered by Mozilla it 
seems...

>>>    unsigned int             n;
>>>    unsigned int             m;
>>>    unsigned int             p;
>>>    unsigned int             pow2p;
>>>
>>>+    clockevents_register_device(&pnx8xxx_clockevent);
>>>+    clocksource_register(&pnx_clocksource);
>>>+
>>>+    setup_irq(PNX8550_INT_TIMER1, &pnx8xxx_timer_irq);
>>>+    setup_irq(PNX8550_INT_TIMER2, &monotonic_irqaction);
>>>+
>>>+    /* Timer 1 start */
>>>+    configPR = read_c0_config7();
>>>+    configPR &= ~0x00000008;
>>>+    write_c0_config7(configPR);
>>>+
>>>+    /* Timer 2 start */
>>>+    configPR = read_c0_config7();
>>>+    configPR &= ~0x00000010;
>>>+    write_c0_config7(configPR);
>>>+
>>>+    /* Timer 3 stop */
>>>+    configPR = read_c0_config7();
>>>+    configPR |= 0x00000020;
>>>+    write_c0_config7(configPR);

>>   Enabling timers before they are actually set up? :-|

> Are the additional timers used at all?

    Additional == timer 3? It's not used, only 1 and 2 are -- and their 
count/compare registers are initialized further in this function...

>   Ralf

WBR, Sergei

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: pnx8xxx: move to clocksource
  2008-01-10 16:48     ` Vitaly Wool
@ 2008-01-10 21:50       ` Ralf Baechle
  0 siblings, 0 replies; 7+ messages in thread
From: Ralf Baechle @ 2008-01-10 21:50 UTC (permalink / raw)
  To: Vitaly Wool; +Cc: Sergei Shtylyov, linux-mips

On Thu, Jan 10, 2008 at 07:48:57PM +0300, Vitaly Wool wrote:

> Sergei, I decided not to mix whitespace cleanups and the clocksource
> changes. I'll come up with the whitespace/tab fixups soon arranging it
> as a separate patch.

Generally that's a good approach - but for lines which are modified anyway
I see no reason not to clean the whitespace stuff anyway.

  Ralf

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2008-01-11 10:25 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-01-10 14:10 pnx8xxx: move to clocksource Vitaly Wool
2008-01-10 14:37 ` Ralf Baechle
2008-01-10 16:21 ` Sergei Shtylyov
2008-01-10 16:27   ` Ralf Baechle
2008-01-10 16:48     ` Vitaly Wool
2008-01-10 21:50       ` Ralf Baechle
2008-01-10 17:05     ` Sergei Shtylyov

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.