timer.c (262534) | timer.c (294416) |
---|---|
1/*- 2 * Copyright (c) 2006 Benno Rice. 3 * Copyright (C) 2007-2008 MARVELL INTERNATIONAL LTD. 4 * All rights reserved. 5 * 6 * Adapted to Marvell SoC by Semihalf. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 15 unchanged lines hidden (view full) --- 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 * from: FreeBSD: //depot/projects/arm/src/sys/arm/xscale/pxa2x0/pxa2x0_timer.c, rev 1 29 */ 30 31#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2006 Benno Rice. 3 * Copyright (C) 2007-2008 MARVELL INTERNATIONAL LTD. 4 * All rights reserved. 5 * 6 * Adapted to Marvell SoC by Semihalf. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 15 unchanged lines hidden (view full) --- 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 * from: FreeBSD: //depot/projects/arm/src/sys/arm/xscale/pxa2x0/pxa2x0_timer.c, rev 1 29 */ 30 31#include <sys/cdefs.h> |
32__FBSDID("$FreeBSD: head/sys/arm/mv/timer.c 262534 2014-02-26 22:06:10Z ian $"); | 32__FBSDID("$FreeBSD: head/sys/arm/mv/timer.c 294416 2016-01-20 13:14:36Z zbb $"); |
33 34#include <sys/param.h> 35#include <sys/systm.h> 36#include <sys/bus.h> 37#include <sys/kernel.h> 38#include <sys/module.h> 39#include <sys/malloc.h> 40#include <sys/rman.h> --- 8 unchanged lines hidden (view full) --- 49#include <arm/mv/mvvar.h> 50 51#include <dev/ofw/ofw_bus.h> 52#include <dev/ofw/ofw_bus_subr.h> 53 54#define INITIAL_TIMECOUNTER (0xffffffff) 55#define MAX_WATCHDOG_TICKS (0xffffffff) 56 | 33 34#include <sys/param.h> 35#include <sys/systm.h> 36#include <sys/bus.h> 37#include <sys/kernel.h> 38#include <sys/module.h> 39#include <sys/malloc.h> 40#include <sys/rman.h> --- 8 unchanged lines hidden (view full) --- 49#include <arm/mv/mvvar.h> 50 51#include <dev/ofw/ofw_bus.h> 52#include <dev/ofw/ofw_bus_subr.h> 53 54#define INITIAL_TIMECOUNTER (0xffffffff) 55#define MAX_WATCHDOG_TICKS (0xffffffff) 56 |
57#if defined(SOC_MV_ARMADAXP) | 57#if defined(SOC_MV_ARMADAXP) || defined(SOC_MV_ARMADA38X) |
58#define MV_CLOCK_SRC 25000000 /* Timers' 25MHz mode */ 59#else 60#define MV_CLOCK_SRC get_tclk() 61#endif 62 63struct mv_timer_softc { 64 struct resource * timer_res[2]; 65 bus_space_tag_t timer_bst; --- 53 unchanged lines hidden (view full) --- 119} 120 121static int 122mv_timer_attach(device_t dev) 123{ 124 int error; 125 void *ihl; 126 struct mv_timer_softc *sc; | 58#define MV_CLOCK_SRC 25000000 /* Timers' 25MHz mode */ 59#else 60#define MV_CLOCK_SRC get_tclk() 61#endif 62 63struct mv_timer_softc { 64 struct resource * timer_res[2]; 65 bus_space_tag_t timer_bst; --- 53 unchanged lines hidden (view full) --- 119} 120 121static int 122mv_timer_attach(device_t dev) 123{ 124 int error; 125 void *ihl; 126 struct mv_timer_softc *sc; |
127#if !defined(SOC_MV_ARMADAXP) | 127#if !defined(SOC_MV_ARMADAXP) && !defined(SOC_MV_ARMADA38X) |
128 uint32_t irq_cause, irq_mask; 129#endif 130 131 if (timer_softc != NULL) 132 return (ENXIO); 133 134 sc = (struct mv_timer_softc *)device_get_softc(dev); 135 timer_softc = sc; --- 14 unchanged lines hidden (view full) --- 150 if (bus_setup_intr(dev, sc->timer_res[1], INTR_TYPE_CLK, 151 mv_hardclock, NULL, sc, &ihl) != 0) { 152 bus_release_resources(dev, mv_timer_spec, sc->timer_res); 153 device_printf(dev, "Could not setup interrupt.\n"); 154 return (ENXIO); 155 } 156 157 mv_setup_timers(); | 128 uint32_t irq_cause, irq_mask; 129#endif 130 131 if (timer_softc != NULL) 132 return (ENXIO); 133 134 sc = (struct mv_timer_softc *)device_get_softc(dev); 135 timer_softc = sc; --- 14 unchanged lines hidden (view full) --- 150 if (bus_setup_intr(dev, sc->timer_res[1], INTR_TYPE_CLK, 151 mv_hardclock, NULL, sc, &ihl) != 0) { 152 bus_release_resources(dev, mv_timer_spec, sc->timer_res); 153 device_printf(dev, "Could not setup interrupt.\n"); 154 return (ENXIO); 155 } 156 157 mv_setup_timers(); |
158#if !defined(SOC_MV_ARMADAXP) | 158#if !defined(SOC_MV_ARMADAXP) && !defined(SOC_MV_ARMADA38X) |
159 irq_cause = read_cpu_ctrl(BRIDGE_IRQ_CAUSE); 160 irq_cause &= IRQ_TIMER0_CLR; 161 162 write_cpu_ctrl(BRIDGE_IRQ_CAUSE, irq_cause); 163 irq_mask = read_cpu_ctrl(BRIDGE_IRQ_MASK); 164 irq_mask |= IRQ_TIMER0_MASK; 165 irq_mask &= ~IRQ_TIMER1_MASK; 166 write_cpu_ctrl(BRIDGE_IRQ_MASK, irq_mask); --- 122 unchanged lines hidden (view full) --- 289 bus_space_write_4(timer_softc->timer_bst, 290 timer_softc->timer_bsh, CPU_TIMER0_REL + timer * 0x8, val); 291} 292 293static void 294mv_watchdog_enable(void) 295{ 296 uint32_t val, irq_cause; | 159 irq_cause = read_cpu_ctrl(BRIDGE_IRQ_CAUSE); 160 irq_cause &= IRQ_TIMER0_CLR; 161 162 write_cpu_ctrl(BRIDGE_IRQ_CAUSE, irq_cause); 163 irq_mask = read_cpu_ctrl(BRIDGE_IRQ_MASK); 164 irq_mask |= IRQ_TIMER0_MASK; 165 irq_mask &= ~IRQ_TIMER1_MASK; 166 write_cpu_ctrl(BRIDGE_IRQ_MASK, irq_mask); --- 122 unchanged lines hidden (view full) --- 289 bus_space_write_4(timer_softc->timer_bst, 290 timer_softc->timer_bsh, CPU_TIMER0_REL + timer * 0x8, val); 291} 292 293static void 294mv_watchdog_enable(void) 295{ 296 uint32_t val, irq_cause; |
297#if !defined(SOC_MV_ARMADAXP) | 297#if !defined(SOC_MV_ARMADAXP) && !defined(SOC_MV_ARMADA38X) |
298 uint32_t irq_mask; 299#endif 300 301 irq_cause = read_cpu_ctrl(BRIDGE_IRQ_CAUSE); 302 irq_cause &= IRQ_TIMER_WD_CLR; 303 write_cpu_ctrl(BRIDGE_IRQ_CAUSE, irq_cause); 304 | 298 uint32_t irq_mask; 299#endif 300 301 irq_cause = read_cpu_ctrl(BRIDGE_IRQ_CAUSE); 302 irq_cause &= IRQ_TIMER_WD_CLR; 303 write_cpu_ctrl(BRIDGE_IRQ_CAUSE, irq_cause); 304 |
305#if defined(SOC_MV_ARMADAXP) | 305#if defined(SOC_MV_ARMADAXP) || defined(SOC_MV_ARMADA38X) |
306 val = read_cpu_mp_clocks(WD_RSTOUTn_MASK); 307 val |= (WD_GLOBAL_MASK | WD_CPU0_MASK); 308 write_cpu_mp_clocks(WD_RSTOUTn_MASK, val); 309#else 310 irq_mask = read_cpu_ctrl(BRIDGE_IRQ_MASK); 311 irq_mask |= IRQ_TIMER_WD_MASK; 312 write_cpu_ctrl(BRIDGE_IRQ_MASK, irq_mask); 313 314 val = read_cpu_ctrl(RSTOUTn_MASK); 315 val |= WD_RST_OUT_EN; 316 write_cpu_ctrl(RSTOUTn_MASK, val); 317#endif 318 319 val = mv_get_timer_control(); 320 val |= CPU_TIMER_WD_EN | CPU_TIMER_WD_AUTO; | 306 val = read_cpu_mp_clocks(WD_RSTOUTn_MASK); 307 val |= (WD_GLOBAL_MASK | WD_CPU0_MASK); 308 write_cpu_mp_clocks(WD_RSTOUTn_MASK, val); 309#else 310 irq_mask = read_cpu_ctrl(BRIDGE_IRQ_MASK); 311 irq_mask |= IRQ_TIMER_WD_MASK; 312 write_cpu_ctrl(BRIDGE_IRQ_MASK, irq_mask); 313 314 val = read_cpu_ctrl(RSTOUTn_MASK); 315 val |= WD_RST_OUT_EN; 316 write_cpu_ctrl(RSTOUTn_MASK, val); 317#endif 318 319 val = mv_get_timer_control(); 320 val |= CPU_TIMER_WD_EN | CPU_TIMER_WD_AUTO; |
321#if defined(SOC_MV_ARMADAXP) | 321#if defined(SOC_MV_ARMADAXP) || defined(SOC_MV_ARMADA38X) |
322 val |= CPU_TIMER_WD_25MHZ_EN; 323#endif 324 mv_set_timer_control(val); 325} 326 327static void 328mv_watchdog_disable(void) 329{ 330 uint32_t val, irq_cause; | 322 val |= CPU_TIMER_WD_25MHZ_EN; 323#endif 324 mv_set_timer_control(val); 325} 326 327static void 328mv_watchdog_disable(void) 329{ 330 uint32_t val, irq_cause; |
331#if !defined(SOC_MV_ARMADAXP) | 331#if !defined(SOC_MV_ARMADAXP) && !defined(SOC_MV_ARMADA38X) |
332 uint32_t irq_mask; 333#endif 334 335 val = mv_get_timer_control(); 336 val &= ~(CPU_TIMER_WD_EN | CPU_TIMER_WD_AUTO); 337 mv_set_timer_control(val); 338 | 332 uint32_t irq_mask; 333#endif 334 335 val = mv_get_timer_control(); 336 val &= ~(CPU_TIMER_WD_EN | CPU_TIMER_WD_AUTO); 337 mv_set_timer_control(val); 338 |
339#if defined(SOC_MV_ARMADAXP) | 339#if defined(SOC_MV_ARMADAXP) || defined(SOC_MV_ARMADA38X) |
340 val = read_cpu_mp_clocks(WD_RSTOUTn_MASK); 341 val &= ~(WD_GLOBAL_MASK | WD_CPU0_MASK); 342 write_cpu_mp_clocks(WD_RSTOUTn_MASK, val); 343#else 344 val = read_cpu_ctrl(RSTOUTn_MASK); 345 val &= ~WD_RST_OUT_EN; 346 write_cpu_ctrl(RSTOUTn_MASK, val); 347 --- 85 unchanged lines hidden (view full) --- 433{ 434 uint32_t val; 435 436 mv_set_timer_rel(1, INITIAL_TIMECOUNTER); 437 mv_set_timer(1, INITIAL_TIMECOUNTER); 438 val = mv_get_timer_control(); 439 val &= ~(CPU_TIMER0_EN | CPU_TIMER0_AUTO); 440 val |= CPU_TIMER1_EN | CPU_TIMER1_AUTO; | 340 val = read_cpu_mp_clocks(WD_RSTOUTn_MASK); 341 val &= ~(WD_GLOBAL_MASK | WD_CPU0_MASK); 342 write_cpu_mp_clocks(WD_RSTOUTn_MASK, val); 343#else 344 val = read_cpu_ctrl(RSTOUTn_MASK); 345 val &= ~WD_RST_OUT_EN; 346 write_cpu_ctrl(RSTOUTn_MASK, val); 347 --- 85 unchanged lines hidden (view full) --- 433{ 434 uint32_t val; 435 436 mv_set_timer_rel(1, INITIAL_TIMECOUNTER); 437 mv_set_timer(1, INITIAL_TIMECOUNTER); 438 val = mv_get_timer_control(); 439 val &= ~(CPU_TIMER0_EN | CPU_TIMER0_AUTO); 440 val |= CPU_TIMER1_EN | CPU_TIMER1_AUTO; |
441#if defined(SOC_MV_ARMADAXP) | 441#if defined(SOC_MV_ARMADAXP) || defined(SOC_MV_ARMADA38X) |
442 /* Enable 25MHz mode */ 443 val |= CPU_TIMER0_25MHZ_EN | CPU_TIMER1_25MHZ_EN; 444#endif 445 mv_set_timer_control(val); 446 timers_initialized = 1; 447} | 442 /* Enable 25MHz mode */ 443 val |= CPU_TIMER0_25MHZ_EN | CPU_TIMER1_25MHZ_EN; 444#endif 445 mv_set_timer_control(val); 446 timers_initialized = 1; 447} |