zephyr/include/drivers/system_timer.h
Ramesh Thomas 6249c567f5 device_pm: Update control function name and doc to indicate PM specific
PM control function is used only by the PM subsystem. Update
documentations to make it clear and name the relevant structures and
functions with _pm_ in the name.

Jira: ZEP-1044
Change-Id: I29e5b7690db34a228ed30a24a2e912e1360a0090
Signed-off-by: Ramesh Thomas <ramesh.thomas@intel.com>
2016-10-21 23:32:52 +00:00

128 lines
3.3 KiB
C

/*
* Copyright (c) 2015 Wind River Systems, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file
* @brief Timer driver API
*
*
* Declare API implemented by system timer driver and used by kernel components.
*/
#ifndef _TIMER__H_
#define _TIMER__H_
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _ASMLANGUAGE
GTEXT(_timer_int_handler)
#else /* _ASMLANGUAGE */
#include <device.h>
extern int _sys_clock_driver_init(struct device *device);
/*
* Timer interrupt handler is one of the routines that the driver
* has to implement, but it is not necessarily an external function.
* The driver may implement it and use only when setting an
* interrupt handler by calling irq_connect.
*/
extern void _timer_int_handler(void *arg);
#ifdef CONFIG_SYSTEM_CLOCK_DISABLE
extern void sys_clock_disable(void);
#endif
#ifdef CONFIG_TICKLESS_IDLE
extern void _timer_idle_enter(int32_t ticks);
extern void _timer_idle_exit(void);
#endif /* CONFIG_TICKLESS_IDLE */
#ifndef CONFIG_KERNEL_V2
extern uint32_t _nano_get_earliest_deadline(void);
#endif /* CONFIG_KERNEL_V2 */
extern void _nano_sys_clock_tick_announce(int32_t ticks);
extern int sys_clock_device_ctrl(struct device *device,
uint32_t ctrl_command, void *context);
/*
* Currently regarding timers, only loapic timer implements
* device pm functionality. For other timers, use default handler in case
* the app enables CONFIG_DEVICE_POWER_MANAGEMENT.
*/
#ifndef CONFIG_LOAPIC_TIMER
#define sys_clock_device_ctrl device_pm_control_nop
#endif
extern int32_t _sys_idle_elapsed_ticks;
#if !defined(CONFIG_KERNEL_V2) && defined(CONFIG_MICROKERNEL)
extern void (*_do_sys_clock_tick_announce)(kevent_t);
#define _sys_clock_tick_announce() _do_sys_clock_tick_announce(TICK_EVENT)
/**
* @brief Account for the tick due to the timer interrupt
*
* @return N/A
*/
static inline void _sys_clock_final_tick_announce(void)
{
/*
* Ticks are annnounced at interrupt level but processed later in
* the kernel server fiber. Increment '_sys_idle_elapsed_ticks' as
* some ticks may have previously been announced by _timer_idle_exit()
* (if tickless idle is enabled) but not yet processed.
*/
_sys_idle_elapsed_ticks++;
/* If no ticks were previously announced, announce the tick now. */
if (_sys_idle_elapsed_ticks == 1) {
_sys_clock_tick_announce();
}
}
#else
#define _sys_clock_tick_announce() \
_nano_sys_clock_tick_announce(_sys_idle_elapsed_ticks)
/**
* @brief Account for the tick due to the timer interrupt
*
* @return N/A
*/
static inline void _sys_clock_final_tick_announce(void)
{
/*
* Ticks are both announced and immediately processed at interrupt
* level. Thus there is only one tick left to announce (and process).
*/
_sys_idle_elapsed_ticks = 1;
_sys_clock_tick_announce();
}
#endif
#endif /* _ASMLANGUAGE */
#ifdef __cplusplus
}
#endif
#endif /* _TIMER__H_ */