Module Name:    src
Committed By:   rkujawa
Date:           Wed May  1 12:45:32 UTC 2013

Modified Files:
        src/sys/arch/arm/marvell: mvsoctmr.c mvsoctmrreg.h

Log Message:
Add support for timers on Armada XP.

Obtained from Marvell, Semihalf.


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/arm/marvell/mvsoctmr.c
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/marvell/mvsoctmrreg.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/marvell/mvsoctmr.c
diff -u src/sys/arch/arm/marvell/mvsoctmr.c:1.8 src/sys/arch/arm/marvell/mvsoctmr.c:1.9
--- src/sys/arch/arm/marvell/mvsoctmr.c:1.8	Sun Jul 22 19:35:04 2012
+++ src/sys/arch/arm/marvell/mvsoctmr.c	Wed May  1 12:45:31 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: mvsoctmr.c,v 1.8 2012/07/22 19:35:04 jakllsch Exp $	*/
+/*	$NetBSD: mvsoctmr.c,v 1.9 2013/05/01 12:45:31 rkujawa Exp $	*/
 /*
  * Copyright (c) 2007, 2008 KIYOHARA Takashi
  * All rights reserved.
@@ -25,9 +25,10 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mvsoctmr.c,v 1.8 2012/07/22 19:35:04 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mvsoctmr.c,v 1.9 2013/05/01 12:45:31 rkujawa Exp $");
 
 #include "opt_ddb.h"
+#include "opt_mvsoc.h"
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -67,6 +68,9 @@ struct mvsoctmr_softc {
 
 	bus_space_tag_t sc_iot;
 	bus_space_handle_t sc_ioh;
+#if defined(ARMADAXP)
+	int sc_irq;
+#endif
 };
 
 
@@ -133,6 +137,10 @@ mvsoctmr_attach(device_t parent, device_
 	if (mvsoctmr_sc == NULL)
 		mvsoctmr_sc = sc;
 
+#if defined(ARMADAXP)
+	sc->sc_irq = mva->mva_irq;
+#endif
+
 	sc->sc_dev = self;
 	sc->sc_iot = mva->mva_iot;
 	if (bus_space_subregion(mva->mva_iot, mva->mva_ioh,
@@ -177,6 +185,12 @@ clockhandler(void *arg)
 {
 	struct clockframe *frame = arg;
 
+#if defined(ARMADAXP)
+	/* Acknowledge all timers-related interrupts */
+	bus_space_write_4(mvsoctmr_sc->sc_iot, mvsoctmr_sc->sc_ioh,
+	    MVSOCTMR_TESR, 0x0);
+#endif
+
 	hardclock(frame);
 
 	return 1;
@@ -211,16 +225,33 @@ cpu_initclocks(void)
 		panic("cpu_initclocks: mvsoctmr not found");
 
 	mvsoctmr_timecounter.tc_priv = sc;
+
+#if defined(ARMADAXP)
+	/* We set global timer and counter to 25 MHz mode */
+	mvsoctmr_timecounter.tc_frequency = 25000000;
+#else
 	mvsoctmr_timecounter.tc_frequency = mvTclk;
+#endif
 
-	timer0_tval = (mvTclk * 2) / (u_long) hz;
+	timer0_tval = (mvsoctmr_timecounter.tc_frequency * 2) / (u_long) hz;
 	timer0_tval = (timer0_tval / 2) + (timer0_tval & 1);
 
 	mvsoctmr_cntl(sc, MVSOCTMR_TIMER0, timer0_tval, en, autoen);
 	mvsoctmr_cntl(sc, MVSOCTMR_TIMER1, 0xffffffff, en, autoen);
 
+#if defined(ARMADAXP)
+	/*
+	 * Establishing timer interrupts is slightly different for Armada XP
+	 * than for other supported SoCs from Marvell.
+	 * Timer interrupt is no different from any other interrupt in Armada
+	 * XP, so we use generic marvell_intr_establish().
+	 */
+	clock_ih = marvell_intr_establish(sc->sc_irq, IPL_CLOCK,
+	    clockhandler, NULL);
+#else
 	clock_ih = mvsoc_bridge_intr_establish(MVSOC_MLMB_MLMBI_CPUTIMER0INTREQ,
 	    IPL_CLOCK, clockhandler, NULL);
+#endif
 	if (clock_ih == NULL)
 		panic("cpu_initclocks: unable to register timer interrupt");
 
@@ -303,6 +334,10 @@ mvsoctmr_cntl(struct mvsoctmr_softc *sc,
 		ctrl |= MVSOCTMR_CTCR_CPUTIMERAUTO(num);
 	else
 		ctrl &= ~MVSOCTMR_CTCR_CPUTIMERAUTO(num);
+#if defined(ARMADAXP)
+	/* Set timer and counter to 25MHz mode */
+	ctrl |= MVSOCTMR_CTCR_25MHZEN(num);
+#endif
 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, MVSOCTMR_CTCR, ctrl);
 }
 

Index: src/sys/arch/arm/marvell/mvsoctmrreg.h
diff -u src/sys/arch/arm/marvell/mvsoctmrreg.h:1.1 src/sys/arch/arm/marvell/mvsoctmrreg.h:1.2
--- src/sys/arch/arm/marvell/mvsoctmrreg.h:1.1	Sun Oct  3 05:49:24 2010
+++ src/sys/arch/arm/marvell/mvsoctmrreg.h	Wed May  1 12:45:31 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: mvsoctmrreg.h,v 1.1 2010/10/03 05:49:24 kiyohara Exp $	*/
+/*	$NetBSD: mvsoctmrreg.h,v 1.2 2013/05/01 12:45:31 rkujawa Exp $	*/
 /*
  * Copyright (c) 2007 KIYOHARA Takashi
  * All rights reserved.
@@ -30,6 +30,7 @@
 #define MVSOCTMR_SIZE		0x100
 
 #define MVSOCTMR_CTCR		0x00		/* CPU Timers Control */
+#define MVSOCTMR_TESR		0x04		/* CPU Timers Event Status */
 #define MVSOCTMR_RELOAD(n)	(0x10 + (n) * 8)/* CPU Timer(n) Reload */
 #define MVSOCTMR_TIMER(n)	(0x14 + (n) * 8)/* CPU Timer(n) */
 
@@ -37,9 +38,9 @@
 #define MVSOCTMR_TIMER1		1
 #define MVSOCTMR_WATCHDOG	2
 
-
 /* CPU Timers Control Register (MVSOCTMR_CTCR) */
-#define MVSOCTMR_CTCR_CPUTIMEREN(n)	(1 << (n * 2))
-#define MVSOCTMR_CTCR_CPUTIMERAUTO(n)	(1 << (n * 2 + 1))
+#define MVSOCTMR_CTCR_CPUTIMEREN(n)	(1 << ((n) * 2))
+#define MVSOCTMR_CTCR_CPUTIMERAUTO(n)	(1 << ((n) * 2 + 1))
+#define MVSOCTMR_CTCR_25MHZEN(n)	(1 << ((n) + 11))
 
 #endif	/* !_MVSOCTMRREG_H_ */

Reply via email to