summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Hellstrom <daniel@gaisler.com>2017-04-10 14:52:16 +0200
committerDaniel Hellstrom <daniel@gaisler.com>2017-05-02 12:34:45 +0200
commit78e56096c81bb3bbe1418c16ce9b5b8165d6f574 (patch)
tree5fbb5ac9acc79142ea3c4b5ae633e31154cc7b5b
parentleon, ambapp_bus: IRQ affinity for on-chip AMBAPP bus (diff)
downloadrtems-78e56096c81bb3bbe1418c16ce9b5b8165d6f574.tar.bz2
leon, tlib: added timer width mask information
-rw-r--r--c/src/lib/libbsp/sparc/shared/include/tlib.h8
-rw-r--r--c/src/lib/libbsp/sparc/shared/timer/gptimer.c16
2 files changed, 24 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/sparc/shared/include/tlib.h b/c/src/lib/libbsp/sparc/shared/include/tlib.h
index 7e6c49ae62..5e49dd488e 100644
--- a/c/src/lib/libbsp/sparc/shared/include/tlib.h
+++ b/c/src/lib/libbsp/sparc/shared/include/tlib.h
@@ -43,6 +43,7 @@ struct tlib_drv {
void (*get_counter)(struct tlib_dev *hand, unsigned int *counter);
int (*custom)(struct tlib_dev *hand, int cmd, void *arg);
int (*int_pend)(struct tlib_dev *hand, int ack);
+ void (*get_widthmask)(struct tlib_dev *hand, unsigned int *widthmask);
};
struct tlib_dev {
@@ -183,6 +184,13 @@ static inline int tlib_interrupt_pending(void *hand, int ack)
return dev->drv->int_pend(dev, ack);
}
+static inline void tlib_get_widthmask(void *hand, unsigned int *widthmask)
+{
+ struct tlib_dev *dev = hand;
+
+ dev->drv->get_widthmask(dev, widthmask);
+}
+
#ifdef __cplusplus
}
#endif
diff --git a/c/src/lib/libbsp/sparc/shared/timer/gptimer.c b/c/src/lib/libbsp/sparc/shared/timer/gptimer.c
index f8c6da20f3..f47952ff74 100644
--- a/c/src/lib/libbsp/sparc/shared/timer/gptimer.c
+++ b/c/src/lib/libbsp/sparc/shared/timer/gptimer.c
@@ -93,6 +93,7 @@ struct gptimer_priv {
struct gptimer_regs *regs;
unsigned int base_clk;
unsigned int base_freq;
+ unsigned int widthmask;
char separate_interrupt;
char isr_installed;
@@ -265,6 +266,10 @@ int gptimer_init1(struct drvmgr_dev *dev)
else
irq_ack_mask = ~0;
+ /* Probe timer register width mask */
+ priv->regs->timer[timer_start].value = 0xffffffff;
+ priv->widthmask = priv->regs->timer[timer_start].value;
+
priv->timer_cnt = timer_cnt;
for (i=0; i<timer_cnt; i++) {
timer = &priv->timers[i];
@@ -493,6 +498,16 @@ static void gptimer_tlib_get_counter(
*counter = timer->tregs->value;
}
+static void gptimer_tlib_get_widthmask(
+ struct tlib_dev *hand,
+ unsigned int *widthmask)
+{
+ struct gptimer_timer *timer = (struct gptimer_timer *)hand;
+ struct gptimer_priv *priv = priv_from_timer(timer);
+
+ *widthmask = priv->widthmask;
+}
+
static struct tlib_drv gptimer_tlib_drv =
{
.reset = gptimer_tlib_reset,
@@ -506,4 +521,5 @@ static struct tlib_drv gptimer_tlib_drv =
.get_counter = gptimer_tlib_get_counter,
.custom = NULL,
.int_pend = gptimer_tlib_int_pend,
+ .get_widthmask = gptimer_tlib_get_widthmask,
};