Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/arm/marvell Add support for timers on Armada XP.
details: https://anonhg.NetBSD.org/src/rev/8852aa307aa3
branches: trunk
changeset: 786555:8852aa307aa3
user: rkujawa <rkujawa%NetBSD.org@localhost>
date: Wed May 01 12:45:31 2013 +0000
description:
Add support for timers on Armada XP.
Obtained from Marvell, Semihalf.
diffstat:
sys/arch/arm/marvell/mvsoctmr.c | 43 ++++++++++++++++++++++++++++++++++---
sys/arch/arm/marvell/mvsoctmrreg.h | 9 ++++---
2 files changed, 44 insertions(+), 8 deletions(-)
diffs (132 lines):
diff -r 67cc7d1373d2 -r 8852aa307aa3 sys/arch/arm/marvell/mvsoctmr.c
--- a/sys/arch/arm/marvell/mvsoctmr.c Wed May 01 12:38:06 2013 +0000
+++ b/sys/arch/arm/marvell/mvsoctmr.c Wed May 01 12:45:31 2013 +0000
@@ -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 @@
bus_space_tag_t sc_iot;
bus_space_handle_t sc_ioh;
+#if defined(ARMADAXP)
+ int sc_irq;
+#endif
};
@@ -133,6 +137,10 @@
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 @@
{
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 @@
panic("cpu_initclocks: mvsoctmr not found");
mvsoctmr_timecounter.tc_priv = sc;
- mvsoctmr_timecounter.tc_frequency = mvTclk;
- timer0_tval = (mvTclk * 2) / (u_long) hz;
+#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 = (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 @@
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);
}
diff -r 67cc7d1373d2 -r 8852aa307aa3 sys/arch/arm/marvell/mvsoctmrreg.h
--- a/sys/arch/arm/marvell/mvsoctmrreg.h Wed May 01 12:38:06 2013 +0000
+++ b/sys/arch/arm/marvell/mvsoctmrreg.h Wed May 01 12:45:31 2013 +0000
@@ -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_ */
Home |
Main Index |
Thread Index |
Old Index