Skip to content
Snippets Groups Projects
Commit d6b61f9b authored by Armin Luntzer's avatar Armin Luntzer
Browse files

* add GPTIMER access library

* rename dev/ -> lib/
* rename leon_uptime_init() -> sparc_uptime_init()
parent a1b8d817
No related branches found
No related tags found
No related merge requests found
obj-y += kernel/
obj-y += mm/
obj-y += drv/
/**
* @file arch/sparc/include/time.h
* @file arch/sparc/include/asm/time.h
*/
#ifndef _SPARC_TIME_H_
......@@ -61,6 +61,6 @@ compile_time_assert((SPARC_CPU_CPS <= 1000000000UL),
void leon_uptime_init(void);
void sparc_uptime_init(void);
#endif /* _SPARC_TIME_H_ */
/**
* @file arch/sparc/gptimer.h
* @ingroup timing
* @author Armin Luntzer (armin.luntzer@univie.ac.at),
* @date July, 2016
*
* @copyright GPLv2
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#ifndef _SPARC_GPTIMER_H
#define _SPARC_GPTIMER_H
#include <asm/leon_reg.h>
#define LEON3_TIMER_EN 0x00000001 /* enable counting */
#define LEON3_TIMER_RS 0x00000002 /* restart from timer reload value */
#define LEON3_TIMER_LD 0x00000004 /* load counter */
#define LEON3_TIMER_IE 0x00000008 /* irq enable */
#define LEON3_TIMER_IP 0x00000010 /* irq pending (clear by writing 0 */
#define LEON3_TIMER_CH 0x00000020 /* chain with preceeding timer */
#define LEON3_CFG_TIMERS_MASK 0x00000007
#define LEON3_CFG_IRQNUM_MASK 0x000000f8
#define LEON3_CFG_IRQNUM_SHIFT 0x3
void gptimer_set_scaler_reload(struct gptimer_unit *ptu, uint32_t value);
uint32_t gptimer_get_scaler_reload(struct gptimer_unit *ptu);
void gptimer_set_interrupt_enabled(struct gptimer_unit *ptu, uint32_t timer);
void gptimer_clear_interrupt_enabled(struct gptimer_unit *ptu, uint32_t timer);
void gptimer_set_load(struct gptimer_unit *ptu, uint32_t timer);
void gptimer_clear_load(struct gptimer_unit *ptu, uint32_t timer);
void gptimer_set_enabled(struct gptimer_unit *ptu, uint32_t timer);
void gptimer_clear_enabled(struct gptimer_unit *ptu, uint32_t timer);
void gptimer_set_restart(struct gptimer_unit *ptu, uint32_t timer);
void gptimer_clear_restart(struct gptimer_unit *ptu, uint32_t timer);
void gptimer_set_chained(struct gptimer_unit *ptu, uint32_t timer);
void gptimer_clear_chained(struct gptimer_unit *ptu, uint32_t timer);
uint32_t gptimer_get_interrupt_pending_status(struct gptimer_unit *ptu,
uint32_t timer);
void gptimer_clear_interrupt_pending_status(struct gptimer_unit *ptu,
uint32_t timer);
uint32_t gptimer_get_num_implemented(struct gptimer_unit *ptu);
uint32_t gptimer_get_first_timer_irq_id(struct gptimer_unit *ptu);
void gptimer_set_value(struct gptimer_unit *ptu,
uint32_t timer,
uint32_t value);
uint32_t gptimer_get_value(struct gptimer_unit *ptu, uint32_t timer);
void gptimer_set_reload(struct gptimer_unit *ptu,
uint32_t timer,
uint32_t reload);
uint32_t gptimer_get_reload(struct gptimer_unit *ptu, uint32_t timer);
void gptimer_start(struct gptimer_unit *ptu, uint32_t timer, uint32_t value);
void gptimer_start_cyclical(struct gptimer_unit *ptu,
uint32_t timer,
uint32_t value);
#endif /* _SPARC_GPTIMER_H */
......@@ -103,5 +103,5 @@ void setup_arch(void)
leon_irq_init();
leon_uptime_init();
sparc_uptime_init();
}
......@@ -75,7 +75,7 @@ static struct clocksource uptime_clock = {
};
void leon_uptime_init(void)
void sparc_uptime_init(void)
{
#ifdef CONFIG_LEON3
leon_grtimer_longcount_init();
......
File moved
/**
* @file arch/sparc/lib/gptimer.c
* @ingroup time
* @author Armin Luntzer (armin.luntzer@univie.ac.at),
* @date July, 2016
*
* @copyright GPLv2
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* @brief implements access to the LEON3 General Purpose Timer Unit
* @see GR712RC user manual chapter 11
*
*/
#include <asm/io.h>
#include <gptimer.h>
/**
* @brief set scaler reload value of the timer block
* @param ptu a struct gptimer_unit
*
*/
void gptimer_set_scaler_reload(struct gptimer_unit *ptu, uint32_t value)
{
iowrite32be(value, &ptu->scaler_reload);
}
/**
* @brief get scaler reload value of the timer block
* @param ptu a struct gptimer_unit
*
*/
uint32_t gptimer_get_scaler_reload(struct gptimer_unit *ptu)
{
return ioread32be(&ptu->scaler_reload);
}
/**
* @brief sets the interrupt enabled flag of a timer
* @param ptu a struct gptimer_unit
* @param timer the selected timer
*/
void gptimer_set_interrupt_enabled(struct gptimer_unit *ptu, uint32_t timer)
{
uint32_t flags;
flags = ioread32be(&ptu->timer[timer].ctrl);
flags |= LEON3_TIMER_IE;
iowrite32be(flags, &ptu->timer[timer].ctrl);
}
/**
* @brief sets the interrupt enabled flag of a timer
* @param ptu a struct gptimer_unit
* @param timer the selected timer
*/
void gptimer_clear_interrupt_enabled(struct gptimer_unit *ptu, uint32_t timer)
{
uint32_t flags;
flags = ioread32be(&ptu->timer[timer].ctrl);
flags &= ~LEON3_TIMER_IE;
iowrite32be(flags, &ptu->timer[timer].ctrl);
}
/**
* @brief sets the load flag of a timer
* @param ptu a struct gptimer_unit
* @param timer the selected timer
*/
void gptimer_set_load(struct gptimer_unit *ptu, uint32_t timer)
{
uint32_t flags;
flags = ioread32be(&ptu->timer[timer].ctrl);
flags |= LEON3_TIMER_LD;
iowrite32be(flags, &ptu->timer[timer].ctrl);
}
/**
* @brief clears the load flag of a timer
* @param ptu a struct gptimer_unit
* @param timer the selected timer
*/
void gptimer_clear_load(struct gptimer_unit *ptu, uint32_t timer)
{
uint32_t flags;
flags = ioread32be(&ptu->timer[timer].ctrl);
flags &= ~LEON3_TIMER_LD;
iowrite32be(flags, &ptu->timer[timer].ctrl);
}
/**
* @brief set enable flag in timer
* @param ptu a struct gptimer_unit
* @param timer the selected timer
*/
void gptimer_set_enabled(struct gptimer_unit *ptu, uint32_t timer)
{
uint32_t ctrl;
ctrl = ioread32be(&ptu->timer[timer].ctrl);
ctrl |= LEON3_TIMER_EN;
iowrite32be(ctrl, &ptu->timer[timer].ctrl);
}
/**
* @brief clear enable flag in timer
* @param ptu a struct gptimer_unit
* @param timer the selected timer
*/
void gptimer_clear_enabled(struct gptimer_unit *ptu, uint32_t timer)
{
uint32_t ctrl;
ctrl = ioread32be(&ptu->timer[timer].ctrl);
ctrl &= ~LEON3_TIMER_EN;
iowrite32be(ctrl, &ptu->timer[timer].ctrl);
}
/**
* @brief set restart flag in timer
* @param ptu a struct gptimer_unit
* @param timer the selected timer
*/
void gptimer_set_restart(struct gptimer_unit *ptu, uint32_t timer)
{
uint32_t ctrl;
ctrl = ioread32be(&ptu->timer[timer].ctrl);
ctrl |= LEON3_TIMER_RS;
iowrite32be(ctrl, &ptu->timer[timer].ctrl);
}
/**
* @brief clear restart flag in timer
* @param ptu a struct gptimer_unit
* @param timer the selected timer
*/
void gptimer_clear_restart(struct gptimer_unit *ptu, uint32_t timer)
{
uint32_t ctrl;
ctrl = ioread32be(&ptu->timer[timer].ctrl);
ctrl &= ~LEON3_TIMER_RS;
iowrite32be(ctrl, &ptu->timer[timer].ctrl);
}
/**
* @brief set timer to chain to the preceeding timer
* @param ptu a struct gptimer_unit
* @param timer the selected timer
*/
void gptimer_set_chained(struct gptimer_unit *ptu, uint32_t timer)
{
uint32_t ctrl;
ctrl = ioread32be(&ptu->timer[timer].ctrl);
ctrl |= LEON3_TIMER_CH;
iowrite32be(ctrl, &ptu->timer[timer].ctrl);
}
/**
* @brief clear timer to chain to the preceeding timer
* @param ptu a struct gptimer_unit
* @param timer the selected timer
*/
void gptimer_clear_chained(struct gptimer_unit *ptu, uint32_t timer)
{
uint32_t ctrl;
ctrl = ioread32be(&ptu->timer[timer].ctrl);
ctrl &= ~LEON3_TIMER_CH;
iowrite32be(ctrl, &ptu->timer[timer].ctrl);
}
/**
* @brief get status of interrupt pending status
* @param ptu a struct gptimer_unit
* @param timer the selected timer
*/
uint32_t gptimer_get_interrupt_pending_status(struct gptimer_unit *ptu,
uint32_t timer)
{
return ioread32be(&ptu->timer[timer].ctrl) & LEON3_TIMER_IP;
}
/**
* @brief clear status of interrupt pending status
* @param ptu a struct gptimer_unit
* @param timer the selected timer
*/
void gptimer_clear_interrupt_pending_status(struct gptimer_unit *ptu,
uint32_t timer)
{
uint32_t ctrl;
ctrl = ioread32be(&ptu->timer[timer].ctrl);
ctrl &= ~LEON3_TIMER_IP;
iowrite32be(ctrl, &ptu->timer[timer].ctrl);
}
/**
* @brief get number of implemented general purpose timers
* @param ptu a struct gptimer_unit
* @param timer the selected timer
*/
uint32_t gptimer_get_num_implemented(struct gptimer_unit *ptu)
{
return ioread32be(&ptu->config) & LEON3_CFG_TIMERS_MASK;
}
/**
* @brief get interrupt ID of first implemented timer
* @param ptu a struct gptimer_unit
* @param timer the selected timer
*/
uint32_t gptimer_get_first_timer_irq_id(struct gptimer_unit *ptu)
{
return (ioread32be(&ptu->config) & LEON3_CFG_IRQNUM_MASK) >>
LEON3_CFG_IRQNUM_SHIFT;
}
/**
* @brief set the value of a gptimer
* @param ptu a struct gptimer_unit
* @param timer the selected timer
* @param value the timer counter value to set
*/
void gptimer_set_value(struct gptimer_unit *ptu, uint32_t timer, uint32_t value)
{
iowrite32be(value, &ptu->timer[timer].value);
}
/**
* @brief get the value of a gptimer
* @param ptu a struct gptimer_unit
* @param timer the selected timer
* @param value the timer counter value to set
*/
uint32_t gptimer_get_value(struct gptimer_unit *ptu, uint32_t timer)
{
return ioread32be(&ptu->timer[timer].value);
}
/**
* @brief set the reload of a gptimer
* @param ptu a struct gptimer_unit
* @param timer the selected timer
* @param reload the timer counter reload to set
*/
void gptimer_set_reload(struct gptimer_unit *ptu,
uint32_t timer,
uint32_t reload)
{
iowrite32be(reload, &ptu->timer[timer].reload);
}
/**
* @brief get the reload of a gptimer
* @param ptu a struct gptimer_unit
* @param timer the selected timer
* @param reload the timer counter reload to set
*/
uint32_t gptimer_get_reload(struct gptimer_unit *ptu, uint32_t timer)
{
return ioread32be(&ptu->timer[timer].reload);
}
/**
* @brief starts a gptimer; emits an irq but does not enable reload on underflow
* @param ptu a struct gptimer_unit
* @param timer the selected timer
* @param value the timer counter value to set
*/
void gptimer_start(struct gptimer_unit *ptu, uint32_t timer, uint32_t value)
{
gptimer_set_value(ptu, timer, value);
gptimer_set_reload(ptu, timer, value);
gptimer_set_interrupt_enabled(ptu, timer);
gptimer_set_load(ptu, timer);
gptimer_set_enabled(ptu, timer);
}
/**
* @brief start a gptimer, emits an irq and enables reload on underflow
* @param ptu a struct gptimer_unit
* @param timer the selected timer
* @param value the timer counter value to set
*/
void gptimer_start_cyclical(struct gptimer_unit *ptu,
uint32_t timer, uint32_t value)
{
gptimer_set_value(ptu, timer, value);
gptimer_set_reload(ptu, timer, value);
gptimer_set_interrupt_enabled(ptu, timer);
gptimer_set_load(ptu, timer);
gptimer_set_restart(ptu, timer);
gptimer_set_enabled(ptu, timer);
}
/**
* @file arch/sparc/drv/grtimer.c
* @file arch/sparc/lib/grtimer.c
* @ingroup time
* @author Armin Luntzer (armin.luntzer@univie.ac.at),
* @date July, 2016
......
/**
* @file leon3_grtimer_longcount.c
* @ingroup timing
* @file arch/sparc/lib/grtimer_longcount.c
* @ingroup time
* @author Armin Luntzer (armin.luntzer@univie.ac.at),
* @date July, 2016
*
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment