socsvn commit: r237621 - in
soc2012/aleek/beaglexm-armv6/sys/arm/ti: . am37x
aleek at FreeBSD.org
aleek at FreeBSD.org
Wed Jun 13 18:01:46 UTC 2012
Author: aleek
Date: Wed Jun 13 18:01:43 2012
New Revision: 237621
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=237621
Log:
fixed problem with FDT Interrupt decoding
Modified:
soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer.c
soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer.h
soc2012/aleek/beaglexm-armv6/sys/arm/ti/common.c
Modified: soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer.c
==============================================================================
--- soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer.c Wed Jun 13 17:45:38 2012 (r237620)
+++ soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer.c Wed Jun 13 18:01:43 2012 (r237621)
@@ -42,7 +42,7 @@
#include <sys/rman.h>
#include <sys/timetc.h>
#include <sys/lock.h>
-#include "sys/gpio.h""
+#include <sys/gpio.h>
#include <sys/mutex.h>
#include <machine/bus.h>
@@ -120,7 +120,12 @@
oldirqstate = disable_interrupts(I32_bit);
start = omap3_gptimer_tc_get_timecount(tc);
- __omap3_delay(10240);
+ //__omap3_delay(10240);
+ for (int usec=10240; usec > 0; usec--)
+ for (int32_t counts = 200; counts > 0; counts--)
+ /* Prevent gcc from optimizing out the loop */
+ cpufunc_nullop();
+
end = omap3_gptimer_tc_get_timecount(tc);
restore_interrupts(oldirqstate);
@@ -515,6 +520,29 @@
int
omap3_gptimer_start(unsigned int n)
{
+ struct omap3_gptimer_softc *sc = g_omap3_gptimer_sc;
+ struct omap3_gptimer *timer;
+ uint32_t val;
+
+ /* Sanity checks */
+ if (sc == NULL)
+ return (ENOMEM);
+ if ((n == 0) || (n > OMAP3_NUM_TIMERS))
+ return (EINVAL);
+
+ /* Get a pointer to the individual timer struct */
+ timer = &sc->sc_timers[n-1];
+ if (!(timer->flags & OMAP3_GPTIMER_ACTIVATED_FLAG))
+ return (EINVAL);
+
+ OMAP3_GPTIMER_LOCK(timer);
+
+ val = omap3_gptimer_readl(timer, OMAP3_GPT_TCLR);
+ val |= TCLR_ST;
+ omap3_gptimer_writel(timer, OMAP3_GPT_TCLR, val);
+
+ OMAP3_GPTIMER_UNLOCK(timer);
+
return 0;
}
@@ -529,6 +557,29 @@
int
omap3_gptimer_stop(unsigned int n)
{
+ struct omap3_gptimer_softc *sc = g_omap3_gptimer_sc;
+ struct omap3_gptimer *timer;
+ uint32_t val;
+
+ /* Sanity checks */
+ if (sc == NULL)
+ return (ENOMEM);
+ if ((n == 0) || (n > OMAP3_NUM_TIMERS))
+ return (EINVAL);
+
+ /* Get a pointer to the individual timer struct */
+ timer = &sc->sc_timers[n-1];
+ if (!(timer->flags & OMAP3_GPTIMER_ACTIVATED_FLAG))
+ return (EINVAL);
+
+ OMAP3_GPTIMER_LOCK(timer);
+
+ val = omap3_gptimer_readl(timer, OMAP3_GPT_TCLR);
+ val &= ~TCLR_ST;
+ omap3_gptimer_writel(timer, OMAP3_GPT_TCLR, val);
+
+ OMAP3_GPTIMER_UNLOCK(timer);
+
return 0;
}
@@ -741,6 +792,7 @@
static int
omap3_gptimer_probe(device_t dev)
{
+ printf( "GPTIMER HABABABA\n" );
device_set_desc(dev, "TI OMAP3 General Purpose Timers");
return (0);
}
@@ -757,6 +809,8 @@
u_int oldirqstate;
unsigned int timer_freq;
+ device_printf( dev, "Attaching the device..." );
+
// Setup the basics
sc->sc_dev = dev;
@@ -781,6 +835,10 @@
timer->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
RF_ACTIVE | RF_SHAREABLE);
+ /* Mutex to protect the shared data structures */
+ snprintf(name, 32, "omap_gptimer%u", (n + 1));
+ mtx_init(&timer->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(timer, OMAP3_GPT_TIDR);
switch (rev) {
@@ -863,6 +921,7 @@
/* Restore interrupt state */
restore_interrupts(oldirqstate);
+ return 0;
}
static device_method_t g_omap3_gptimer_methods[] = {
Modified: soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer.h
==============================================================================
--- soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer.h Wed Jun 13 17:45:38 2012 (r237620)
+++ soc2012/aleek/beaglexm-armv6/sys/arm/ti/am37x/am37x_gptimer.h Wed Jun 13 18:01:43 2012 (r237621)
@@ -63,7 +63,7 @@
#define OMAP_GPTIMER_PROFILE_OMAP3 3
// XXX @todo fix it, move somewhere
-#define OMAP3_HEARTBEAT_GPIO 150
+//#define OMAP3_HEARTBEAT_GPIO 150
/*
Modified: soc2012/aleek/beaglexm-armv6/sys/arm/ti/common.c
==============================================================================
--- soc2012/aleek/beaglexm-armv6/sys/arm/ti/common.c Wed Jun 13 17:45:38 2012 (r237620)
+++ soc2012/aleek/beaglexm-armv6/sys/arm/ti/common.c Wed Jun 13 18:01:43 2012 (r237621)
@@ -70,7 +70,7 @@
}
#endif
-#ifdef SOC_TI_AM335X
+#if defined( SOC_TI_AM335X ) || defined( SOC_TI_AM37X )
static int
fdt_aintc_decode_ic(phandle_t node, pcell_t *intr, int *interrupt, int *trig,
int *pol)
@@ -94,5 +94,9 @@
#ifdef SOC_TI_AM335X
&fdt_aintc_decode_ic,
#endif
+#ifdef SOC_TI_AM37X
+ &fdt_aintc_decode_ic,
+#endif
+
NULL
};
More information about the svn-soc-all
mailing list