From owner-svn-soc-all@FreeBSD.ORG Thu Jun 21 15:37:39 2012 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from socsvn.FreeBSD.org (unknown [IPv6:2001:4f8:fff6::2f]) by hub.freebsd.org (Postfix) with SMTP id 970C0106564A for ; Thu, 21 Jun 2012 15:37:37 +0000 (UTC) (envelope-from aleek@FreeBSD.org) Received: by socsvn.FreeBSD.org (sSMTP sendmail emulation); Thu, 21 Jun 2012 15:37:37 +0000 Date: Thu, 21 Jun 2012 15:37:37 +0000 From: aleek@FreeBSD.org To: svn-soc-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Message-Id: <20120621153737.970C0106564A@hub.freebsd.org> Cc: Subject: socsvn commit: r238093 - in soc2012/aleek/beaglexm-armv6/sys/arm: conf ti/am37x X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 21 Jun 2012 15:37:39 -0000 Author: aleek Date: Thu Jun 21 15:37:36 2012 New Revision: 238093 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=238093 Log: modified Event Timer Clock. Still not working Modified: soc2012/aleek/beaglexm-armv6/sys/arm/conf/BEAGLEBOARD-XM soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer.h soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer_tc.c Modified: soc2012/aleek/beaglexm-armv6/sys/arm/conf/BEAGLEBOARD-XM ============================================================================== --- soc2012/aleek/beaglexm-armv6/sys/arm/conf/BEAGLEBOARD-XM Thu Jun 21 14:55:35 2012 (r238092) +++ soc2012/aleek/beaglexm-armv6/sys/arm/conf/BEAGLEBOARD-XM Thu Jun 21 15:37:36 2012 (r238093) @@ -49,6 +49,8 @@ # Debugging makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols +#makeoptions WERROR="-Werror" +#makeoptions WERROR="" options BREAK_TO_DEBUGGER #options VERBOSE_SYSINIT #Enable verbose sysinit messages options KDB Modified: soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer.h ============================================================================== --- soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer.h Thu Jun 21 14:55:35 2012 (r238092) +++ soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer.h Thu Jun 21 15:37:36 2012 (r238093) @@ -144,10 +144,16 @@ omap3_timer_tick_intr(void *arg); static int -omap3_gptimer_probe(device_t dev); +omap3_gptimer_probe_tc(device_t dev); static int -omap3_gptimer_attach(device_t dev); +omap3_gptimer_attach_tc(device_t dev); + +static int +omap3_gptimer_probe_et(device_t dev); + +static int +omap3_gptimer_attach_et(device_t dev); int omap3_gptimer_write_count(struct omap3_gptimer_softc *sc, uint32_t cnt); Modified: soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer_tc.c ============================================================================== --- soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer_tc.c Thu Jun 21 14:55:35 2012 (r238092) +++ soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer_tc.c Thu Jun 21 15:37:36 2012 (r238093) @@ -64,7 +64,8 @@ #include #include -static struct omap3_gptimer_softc *g_omap3_gptimer_sc = NULL; +static struct omap3_gptimer_softc *g_omap3_gptimer_sc_tc = NULL; +static struct omap3_gptimer_softc *g_omap3_gptimer_sc_et = NULL; static unsigned int delay_loops_per_us = 100; @@ -150,7 +151,7 @@ omap3_gptimer_tc_get_timecount(struct timecounter *tc) { uint32_t count; - omap3_gptimer_read_count(g_omap3_gptimer_sc, &count); + omap3_gptimer_read_count(g_omap3_gptimer_sc_tc, &count); return(count); } @@ -175,7 +176,7 @@ /* Get a pointer to the individual sc struct */ - OMAP3_GPTIMER_LOCK(sc); + //OMAP3_GPTIMER_LOCK(sc); if (!(sc->flags & OMAP3_GPTIMER_ACTIVATED_FLAG)) { ret = EINVAL; @@ -184,7 +185,7 @@ ret = 0; } - OMAP3_GPTIMER_UNLOCK(sc); + //OMAP3_GPTIMER_UNLOCK(sc); return (ret); } @@ -210,11 +211,11 @@ if (!(sc->flags & OMAP3_GPTIMER_ACTIVATED_FLAG)) return (EINVAL); - OMAP3_GPTIMER_LOCK(sc); + //OMAP3_GPTIMER_LOCK(sc); omap3_gptimer_writel(sc, OMAP3_GPT_TCRR, cnt); - OMAP3_GPTIMER_UNLOCK(sc); + //OMAP3_GPTIMER_UNLOCK(sc); return (0); } @@ -285,7 +286,7 @@ return (rc); - OMAP3_GPTIMER_LOCK(sc); + //OMAP3_GPTIMER_LOCK(sc); /* Determine if the pre-scalar is enabled and if so the prescaler value */ tclr = omap3_gptimer_readl(sc, OMAP3_GPT_TCLR); @@ -297,7 +298,7 @@ /* Get the reload count */ tldr = omap3_gptimer_readl(sc, OMAP3_GPT_TLDR); - OMAP3_GPTIMER_UNLOCK(sc); + //OMAP3_GPTIMER_UNLOCK(sc); /* Calculate the tick freq */ @@ -363,7 +364,7 @@ return (EINVAL); } - OMAP3_GPTIMER_LOCK(sc); + //OMAP3_GPTIMER_LOCK(sc); /* Enable the functional and interface clock */ if (flags & OMAP3_GPTIMER_32KCLK_FLAG) @@ -462,6 +463,7 @@ sc->callback_data = data; /* Activate the interrupt */ + printf( "bus_setup_intr(): %s:%d\n", __func__, __LINE__ ); if (bus_setup_intr(sc->sc_dev, sc->irq_res, INTR_TYPE_MISC | INTR_MPSAFE, NULL, omap3_gptimer_intr, (void*)sc, &sc->irq_h)) { @@ -479,7 +481,7 @@ /* Finally set the activated flag */ sc->flags |= OMAP3_GPTIMER_ACTIVATED_FLAG; - OMAP3_GPTIMER_UNLOCK(sc); + //OMAP3_GPTIMER_UNLOCK(sc); printf("[BRG] %s, %d\n", __func__, __LINE__); @@ -505,13 +507,13 @@ if (!(sc->flags & OMAP3_GPTIMER_ACTIVATED_FLAG)) return (EINVAL); - OMAP3_GPTIMER_LOCK(sc); + //OMAP3_GPTIMER_LOCK(sc); val = omap3_gptimer_readl(sc, OMAP3_GPT_TCLR); val |= TCLR_ST; omap3_gptimer_writel(sc, OMAP3_GPT_TCLR, val); - OMAP3_GPTIMER_UNLOCK(sc); + //OMAP3_GPTIMER_UNLOCK(sc); return 0; } @@ -535,13 +537,13 @@ if (!(sc->flags & OMAP3_GPTIMER_ACTIVATED_FLAG)) return (EINVAL); - OMAP3_GPTIMER_LOCK(sc); + //OMAP3_GPTIMER_LOCK(sc); val = omap3_gptimer_readl(sc, OMAP3_GPT_TCLR); val &= ~TCLR_ST; omap3_gptimer_writel(sc, OMAP3_GPT_TCLR, val); - OMAP3_GPTIMER_UNLOCK(sc); + //OMAP3_GPTIMER_UNLOCK(sc); return 0; } @@ -563,27 +565,28 @@ if (sc == NULL) return (ENOMEM); - OMAP3_GPTIMER_LOCK(sc); + //OMAP3_GPTIMER_LOCK(sc); /* If a callback is already installed this won't work */ if (sc->callback != NULL) { - OMAP3_GPTIMER_UNLOCK(sc); + //OMAP3_GPTIMER_UNLOCK(sc); return(EINVAL); } /* Sanity check the timer is already activated and periodic type */ if ((sc->flags & (OMAP3_GPTIMER_ACTIVATED_FLAG | OMAP3_GPTIMER_PERIODIC_FLAG)) != (OMAP3_GPTIMER_ACTIVATED_FLAG | OMAP3_GPTIMER_PERIODIC_FLAG)) { - OMAP3_GPTIMER_UNLOCK(sc); + //OMAP3_GPTIMER_UNLOCK(sc); return(EINVAL); } /* Attempt to activate the interrupt for the tick */ + printf( "bus_setup_intr(): %s:%d\n", __func__, __LINE__ ); if (bus_setup_intr(sc->sc_dev, sc->irq_res, INTR_TYPE_CLK, filter, NULL, NULL, &sc->irq_h)) { device_printf(sc->sc_dev, "Error: failed to activate interrupt\n"); - OMAP3_GPTIMER_UNLOCK(sc); + //OMAP3_GPTIMER_UNLOCK(sc); return(EINVAL); } @@ -595,7 +598,7 @@ omap3_gptimer_writel(sc, OMAP3_GPT_TIER, val); } - OMAP3_GPTIMER_UNLOCK(sc); + //OMAP3_GPTIMER_UNLOCK(sc); return(0); } @@ -615,7 +618,7 @@ { uint32_t stat; - OMAP3_GPTIMER_LOCK(sc); + //OMAP3_GPTIMER_LOCK(sc); /* Read the interrupt status flag and clear it */ /* Read the status and it with the enable flag */ @@ -624,7 +627,7 @@ /* Clear the status flag */ omap3_gptimer_writel(sc, OMAP3_GPT_TISR, stat); - OMAP3_GPTIMER_UNLOCK(sc); + //OMAP3_GPTIMER_UNLOCK(sc); } @@ -659,7 +662,7 @@ int32_t counts; //uint32_t first, last; - if (g_omap3_gptimer_sc == NULL) { + if (g_omap3_gptimer_sc_tc == NULL) { for (; usec > 0; usec--) for (counts = 200; counts > 0; counts--) /* Prevent gcc from optimizing out the loop */ @@ -676,7 +679,7 @@ void* callback_data; uint32_t stat = 0x0000; - OMAP3_GPTIMER_LOCK(sc); + //OMAP3_GPTIMER_LOCK(sc); /* Read the interrupt status flag and clear it */ if (sc->profile == OMAP_GPTIMER_PROFILE_OMAP3) { @@ -693,7 +696,7 @@ callback = sc->callback; callback_data = sc->callback_data; - OMAP3_GPTIMER_UNLOCK(sc); + //OMAP3_GPTIMER_UNLOCK(sc); /* Check if an actual overflow interrupt */ if ((stat & OVF) && (callback != NULL)) @@ -712,7 +715,6 @@ * RETURNS: * Always returns FILTER_HANDLED. */ -#if 0 static int omap3_timer_tick_intr(void *arg) { @@ -722,7 +724,7 @@ #endif /* Acknowledge the interrupt */ - omap3_gptimer_intr_filter_ack(TICKTIMER_GPTIMER); + omap3_gptimer_intr_filter_ack(g_omap3_gptimer_sc_et); /* Heartbeat */ #if defined(OMAP3_HEARTBEAT_GPIO) @@ -739,33 +741,18 @@ /* Indicate we've handed the interrupt */ return (FILTER_HANDLED); } -#endif - -static int -omap3_gptimer_probe(device_t dev) -{ - //struct omap3_gptimer_softc *sc = (struct omap3_gptimer_softc *)device_get_softc(dev); - if (ofw_bus_is_compatible(dev, "ti,omap3_gptimer_tc")) { - device_set_desc(dev, "OMAP3 General Purpose Timer - Tick Counter"); - return(BUS_PROBE_DEFAULT); - } - - return (ENXIO); -} static int -omap3_gptimer_attach(device_t dev) +omap3_gptimer_attach_common(device_t dev) { struct omap3_gptimer_softc *sc = device_get_softc(dev); - char name[32]; + //char name[32]; int rid=0; // resource id for device, unique uint32_t rev; - u_int oldirqstate; - unsigned int timer_freq; - device_printf( dev, "Attaching the device..." ); + device_printf( dev, "Generic attaching the device...\n" ); // Setup the basics @@ -786,8 +773,8 @@ sc->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE | RF_SHAREABLE); //@TODO XXX Why shareable? /* Mutex to protect the shared data structures */ - snprintf(name, 32, "omap_gptimer_tc"); - mtx_init(&sc->mtx, device_get_nameunit(dev), name, MTX_SPIN); + //snprintf(name, 32, "omap_gptimer_tc"); + //mtx_init(&sc->mtx, device_get_nameunit(dev), name, MTX_SPIN); // I decided to delete support for OMAP4 timers from the original code - aleek rev = omap3_gptimer_readl(sc, OMAP3_GPT_TIDR); @@ -809,10 +796,36 @@ rev); return (ENXIO); } + device_printf( dev, "done!\n" ); + + return 0; +} + +static int +omap3_gptimer_probe_tc(device_t dev) +{ + //struct omap3_gptimer_softc *sc = (struct omap3_gptimer_softc *)device_get_softc(dev); + + if (ofw_bus_is_compatible(dev, "ti,omap3_gptimer_tc")) { + device_set_desc(dev, "OMAP3 General Purpose Timer - Tick Counter"); + return(BUS_PROBE_DEFAULT); + } + + return (ENXIO); +} + +static int +omap3_gptimer_attach_tc(device_t dev) +{ + u_int oldirqstate; + unsigned int timer_freq; + struct omap3_gptimer_softc *sc = device_get_softc(dev); + + omap3_gptimer_attach_common(dev); /* Set the clock source for the timer, this is just a one to one * mapping of the clock id to timer, i.e. n=0 => GPTIMER1_CLK. */ - sc->source = GPTIMER10_CLK; // @TODO XXX fix this - the timer number shouldn't be hardcoded + sc->source = GPTIMER11_CLK; // @TODO XXX fix this - the timer number shouldn't be hardcoded /* Finally mark the timer as available */ sc->flags = OMAP3_GPTIMER_AVAILABLE_FLAG; @@ -832,7 +845,7 @@ omap3_gptimer_tc.tc_frequency = timer_freq; /* Setup the time counter */ - tc_init(&omap3_gptimer_tc); + //tc_init(&omap3_gptimer_tc); /* Calibrate the delay loop */ omap3_calibrate_delay_loop(&omap3_gptimer_tc); @@ -840,24 +853,100 @@ /* Restore interrupt state */ restore_interrupts(oldirqstate); - g_omap3_gptimer_sc = sc; + g_omap3_gptimer_sc_tc = sc; return 0; } -static device_method_t g_omap3_gptimer_methods[] = { - DEVMETHOD(device_probe, omap3_gptimer_probe), - DEVMETHOD(device_attach, omap3_gptimer_attach), +static device_method_t g_omap3_gptimer_methods_tc[] = { + DEVMETHOD(device_probe, omap3_gptimer_probe_tc), + DEVMETHOD(device_attach, omap3_gptimer_attach_tc), {0, 0}, }; -static driver_t g_omap3_gptimer_driver = { +static driver_t g_omap3_gptimer_driver_tc = { "omap3_gptimer_tc", - g_omap3_gptimer_methods, + g_omap3_gptimer_methods_tc, sizeof(struct omap3_gptimer_softc), }; -static devclass_t g_omap3_gptimer_devclass; +static devclass_t g_omap3_gptimer_devclass_tc; + +DRIVER_MODULE(omap3_gptimer_tc, simplebus, g_omap3_gptimer_driver_tc, g_omap3_gptimer_devclass_tc, 0, 0); +MODULE_DEPEND(omap3_gptimer_tc, ti_prcm, 1, 1, 1); + + +static int +omap3_gptimer_probe_et(device_t dev) +{ + //struct omap3_gptimer_softc *sc = (struct omap3_gptimer_softc *)device_get_softc(dev); -DRIVER_MODULE(omap3_gptimer, simplebus, g_omap3_gptimer_driver, g_omap3_gptimer_devclass, 0, 0); -///MODULE_DEPEND(omap3_gptimer, ti_prcm, 1, 1, 1); + if (ofw_bus_is_compatible(dev, "ti,omap3_gptimer_et")) { + device_set_desc(dev, "OMAP3 General Purpose Timer - Event Timer"); + return(BUS_PROBE_DEFAULT); + } + + return (ENXIO); +} + +static int +omap3_gptimer_attach_et(device_t dev) +{ + u_int oldirqstate; + unsigned int timer_freq; + struct omap3_gptimer_softc *sc = device_get_softc(dev); + + omap3_gptimer_attach_common(dev); + device_printf( dev, "Timer specyfic attaching...\n" ); + /* Set the clock source for the timer, this is just a one to one + * mapping of the clock id to timer, i.e. n=0 => GPTIMER1_CLK. + */ + sc->source = GPTIMER10_CLK; // @TODO XXX fix this - the timer number shouldn't be hardcoded + + /* Finally mark the timer as available */ + sc->flags = OMAP3_GPTIMER_AVAILABLE_FLAG; + + /* setup GPTIMER10 for system ticks, and GPTIMER11 for general purpose counter */ + oldirqstate = disable_interrupts(I32_bit); + + /* Number of microseconds between interrupts */ + unsigned int tick = 1000000 / hz; + + /* Next setup one of the timers to be the system tick timer */ + if (omap3_gptimer_activate(sc, OMAP3_GPTIMER_PERIODIC_FLAG, tick, NULL, NULL)) { + panic("Error: failed to activate system tick timer\n"); + } + + /* Setup an interrupt filter for the timer */ + if (omap3_gptimer_set_intr_filter(sc, omap3_timer_tick_intr)) + panic("Error: failed to start system tick timer\n"); + + /* Lastly start the tick timer */ + if (omap3_gptimer_start(sc)) + panic("Error: failed to start system tick timer\n"); + + omap3_gptimer_get_freq(sc, &timer_freq); + device_printf(dev, "tick: timer_freq = %u\n", timer_freq); + + /* Restore interrupt state */ + restore_interrupts(oldirqstate); + + g_omap3_gptimer_sc_et = sc; + + return 0; +} + +static device_method_t g_omap3_gptimer_methods_et[] = { + DEVMETHOD(device_probe, omap3_gptimer_probe_et), + DEVMETHOD(device_attach, omap3_gptimer_attach_et), + {0, 0}, +}; + +static driver_t g_omap3_gptimer_driver_et = { + "omap3_gptimer_et", + g_omap3_gptimer_methods_et, + sizeof(struct omap3_gptimer_softc), +}; +static devclass_t g_omap3_gptimer_devclass_et; +DRIVER_MODULE(omap3_gptimer_et, simplebus, g_omap3_gptimer_driver_et, g_omap3_gptimer_devclass_et, 0, 0); +MODULE_DEPEND(omap3_gptimer_et, ti_prcm, 1, 1, 1);