summaryrefslogtreecommitdiff
path: root/chip/it83xx/hwtimer_chip.h
blob: 2ccdce1d965b4acea7b6da7866ff670d94b59efc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/* Copyright 2015 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

/* External timers control module for IT83xx. */

#ifndef __CROS_EC_HWTIMER_CHIP_H
#define __CROS_EC_HWTIMER_CHIP_H

#define TIMER_COUNT_1US_SHIFT      3

/* Microseconds to event timer counter setting register */
#define EVENT_TIMER_US_TO_COUNT(us)  ((us) << TIMER_COUNT_1US_SHIFT)
/* Event timer counter observation value to microseconds */
#define EVENT_TIMER_COUNT_TO_US(cnt) ((cnt) >> TIMER_COUNT_1US_SHIFT)

#define FREE_EXT_TIMER_L     EXT_TIMER_3
#define FREE_EXT_TIMER_H     EXT_TIMER_4
#define FAN_CTRL_EXT_TIMER   EXT_TIMER_5
#define EVENT_EXT_TIMER      EXT_TIMER_6
/*
 * The low power timer is used to continue system time when EC goes into low
 * power in idle task. Timer 7 is 24bit timer and configured at 32.768khz.
 * The configuration is enough for continuing system time, because periodic
 * tick event (interval is 500ms on it8xxx2) will wake EC up.
 *
 * IMPORTANT:
 * If you change low power timer to a non-24bit timer, you also have to change
 * mask of observation register in clock_sleep_mode_wakeup_isr() or EC will get
 * wrong system time after resume.
 */
#define LOW_POWER_EXT_TIMER  EXT_TIMER_7
#define LOW_POWER_TIMER_MASK (BIT(24) - 1)
#define WDT_EXT_TIMER        EXT_TIMER_8

enum ext_timer_clock_source {
	EXT_PSR_32P768K_HZ = 0,
	EXT_PSR_1P024K_HZ  = 1,
	EXT_PSR_32_HZ      = 2,
	EXT_PSR_8M_HZ      = 3
};

/*
 * 24-bit timers: external timer 3, 5, and 7
 * 32-bit timers: external timer 4, 6, and 8
 */
enum ext_timer_sel {
	/* timer 3 and 4 combine mode for free running timer */
	EXT_TIMER_3 = 0,
	EXT_TIMER_4,
	/* For fan control */
	EXT_TIMER_5,
	/* timer 6 for event timer */
	EXT_TIMER_6,
	/* For WDT capture important state information before being reset */
	EXT_TIMER_7,
	/* HW timer for low power mode */
	EXT_TIMER_8,
	EXT_TIMER_COUNT,
};

struct ext_timer_ctrl_t {
	volatile uint8_t *mode;
	volatile uint8_t *polarity;
	volatile uint8_t *isr;
	uint8_t mask;
	uint8_t irq;
};

extern const struct ext_timer_ctrl_t et_ctrl_regs[];
#ifdef IT83XX_EXT_OBSERVATION_REG_READ_TWO_TIMES
uint32_t __ram_code ext_observation_reg_read(enum ext_timer_sel ext_timer);
#endif
void ext_timer_start(enum ext_timer_sel ext_timer, int en_irq);
void ext_timer_stop(enum ext_timer_sel ext_timer, int dis_irq);
void fan_ext_timer_interrupt(void);
void update_exc_start_time(void);

/**
 * Config a external timer.
 *
 * @param raw	(!=0) timer count equal to param "ms" no conversion.
 */
int ext_timer_ms(enum ext_timer_sel ext_timer,
		enum ext_timer_clock_source ext_timer_clock,
		int start,
		int et_int,
		int32_t ms,
		int first_time_enable,
		int raw);

#endif /* __CROS_EC_HWTIMER_CHIP_H */