Module Name: src Committed By: kiyohara Date: Mon Feb 17 05:25:32 UTC 2014
Modified Files: src/sys/arch/arm/marvell: mvsoctmr.c Log Message: Remove TMR_FLAGS_ARMADAXP and Add flags NOBRIDGE, 25MHZ, SYSCLK. - NOBRIDGE does not go via a bridge. - 25MHZ is always counted with the cycle of 25 MHz. - SYSCLK is counted with the cycle of sysClk. This is used in a few days for Armada 370. And please use not mvTclk but variable mvsoctmr_freq for calculation of a clock. (e.g. in delay()) To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.11 src/sys/arch/arm/marvell/mvsoctmr.c 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.10 src/sys/arch/arm/marvell/mvsoctmr.c:1.11 --- src/sys/arch/arm/marvell/mvsoctmr.c:1.10 Mon Oct 14 04:17:59 2013 +++ src/sys/arch/arm/marvell/mvsoctmr.c Mon Feb 17 05:25:32 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: mvsoctmr.c,v 1.10 2013/10/14 04:17:59 kiyohara Exp $ */ +/* $NetBSD: mvsoctmr.c,v 1.11 2014/02/17 05:25:32 kiyohara Exp $ */ /* * Copyright (c) 2007, 2008, 2010 KIYOHARA Takashi * All rights reserved. @@ -25,7 +25,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mvsoctmr.c,v 1.10 2013/10/14 04:17:59 kiyohara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mvsoctmr.c,v 1.11 2014/02/17 05:25:32 kiyohara Exp $"); #include "opt_ddb.h" #include "opt_mvsoc.h" @@ -71,7 +71,9 @@ struct mvsoctmr_softc { bus_space_handle_t sc_ioh; int sc_irq; -#define TMR_FLAGS_ARMADAXP (1 << 0) +#define TMR_FLAGS_NOBRIDGE (1 << 0) +#define TMR_FLAGS_25MHZ (1 << 1) +#define TMR_FLAGS_SYSCLK (1 << 2) int sc_flags; }; @@ -92,7 +94,9 @@ static int mvsoctmr_wdog_setmode(struct static void mvsoctmr_wdog_ddb_trap(int); #endif -#define MVSOC_WDOG_MAX_PERIOD (0xffffffff / mvTclk) +static int mvsoctmr_freq; + +#define MVSOC_WDOG_MAX_PERIOD (0xffffffff / mvsoctmr_freq) static struct mvsoctmr_softc *mvsoctmr_sc; static struct timecounter mvsoctmr_timecounter = { @@ -153,8 +157,15 @@ mvsoctmr_attach(device_t parent, device_ case MARVELL_ARMADAXP_MV78230: case MARVELL_ARMADAXP_MV78260: case MARVELL_ARMADAXP_MV78460: - sc->sc_flags = TMR_FLAGS_ARMADAXP; + sc->sc_flags = TMR_FLAGS_25MHZ | TMR_FLAGS_NOBRIDGE; + break; +#if 0 + case MARVELL_ARMADA370_MV6707: + case MARVELL_ARMADA370_MV6710: + case MARVELL_ARMADA370_MV6W11: + sc->sc_flags = TMR_FLAGS_NOBRIDGE | TMR_FLAGS_SYSCLK; break; +#endif } mvsoctmr_timecounter.tc_name = device_xname(self); @@ -198,7 +209,7 @@ clockhandler(void *arg) #if defined(ARMADAXP) KASSERT(mvsoctmr_sc != NULL); - if (mvsoctmr_sc->sc_flags & TMR_FLAGS_ARMADAXP) + if (mvsoctmr_sc->sc_flags & TMR_FLAGS_NOBRIDGE) /* Acknowledge all timers-related interrupts */ bus_space_write_4(mvsoctmr_sc->sc_iot, mvsoctmr_sc->sc_ioh, MVSOCTMR_TESR, 0x0); @@ -237,21 +248,24 @@ cpu_initclocks(void) if (sc == NULL) panic("cpu_initclocks: mvsoctmr not found"); - mvsoctmr_timecounter.tc_priv = sc; - - if (sc->sc_flags & TMR_FLAGS_ARMADAXP) + if (sc->sc_flags & TMR_FLAGS_25MHZ) /* We set global timer and counter to 25 MHz mode */ - mvsoctmr_timecounter.tc_frequency = 25000000; + mvsoctmr_freq = 25000000; + else if (sc->sc_flags & TMR_FLAGS_SYSCLK) + mvsoctmr_freq = mvSysclk; else - mvsoctmr_timecounter.tc_frequency = mvTclk; + mvsoctmr_freq = mvTclk; + + mvsoctmr_timecounter.tc_priv = sc; + mvsoctmr_timecounter.tc_frequency = mvsoctmr_freq; - timer0_tval = (mvsoctmr_timecounter.tc_frequency * 2) / (u_long) hz; + timer0_tval = (mvsoctmr_freq * 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 (sc->sc_flags & TMR_FLAGS_ARMADAXP) { + if (sc->sc_flags & TMR_FLAGS_NOBRIDGE) { /* * Establishing timer interrupts is slightly different for * Armada XP than for other supported SoCs from Marvell. @@ -292,18 +306,18 @@ delay(unsigned int n) initial_tick = bus_space_read_4(sc->sc_iot, sc->sc_ioh, MVSOCTMR_TIMER(MVSOCTMR_TIMER1)); - if (n <= UINT_MAX / mvTclk) { + if (n <= UINT_MAX / mvsoctmr_freq) { /* * For unsigned arithmetic, division can be replaced with * multiplication with the inverse and a shift. */ - remaining = n * mvTclk / 1000000; + remaining = n * mvsoctmr_freq / 1000000; } else { /* * This is a very long delay. * Being slow here doesn't matter. */ - remaining = (unsigned long long) n * mvTclk / 1000000; + remaining = (unsigned long long) n * mvsoctmr_freq / 1000000; } while (remaining > 0) { @@ -345,7 +359,7 @@ mvsoctmr_cntl(struct mvsoctmr_softc *sc, ctrl |= MVSOCTMR_CTCR_CPUTIMERAUTO(num); else ctrl &= ~MVSOCTMR_CTCR_CPUTIMERAUTO(num); - if (sc->sc_flags & TMR_FLAGS_ARMADAXP) + if (sc->sc_flags & TMR_FLAGS_25MHZ) /* Set timer and counter to 25MHz mode */ ctrl |= MVSOCTMR_CTCR_25MHZEN(num); bus_space_write_4(sc->sc_iot, sc->sc_ioh, MVSOCTMR_CTCR, ctrl); @@ -366,7 +380,7 @@ mvsoctmr_wdog_setmode(struct sysmon_wdog else if (smw->smw_period > MVSOC_WDOG_MAX_PERIOD || smw->smw_period <= 0) return (EOPNOTSUPP); - sc->sc_wdog_period = smw->smw_period * mvTclk; + sc->sc_wdog_period = smw->smw_period * mvsoctmr_freq; mvsoctmr_cntl(sc, MVSOCTMR_WATCHDOG, sc->sc_wdog_period, 1, 0); }