xref: /freebsd/sys/contrib/ncsw/inc/flib/fsl_fman_rtc.h (revision c2c014f24c10f90d85126ac5fbd4d8524de32b1c)
1*852ba100SJustin Hibbits /*
2*852ba100SJustin Hibbits  * Copyright 2013 Freescale Semiconductor Inc.
3*852ba100SJustin Hibbits  *
4*852ba100SJustin Hibbits  * Redistribution and use in source and binary forms, with or without
5*852ba100SJustin Hibbits  * modification, are permitted provided that the following conditions are met:
6*852ba100SJustin Hibbits  *     * Redistributions of source code must retain the above copyright
7*852ba100SJustin Hibbits  *       notice, this list of conditions and the following disclaimer.
8*852ba100SJustin Hibbits  *     * Redistributions in binary form must reproduce the above copyright
9*852ba100SJustin Hibbits  *       notice, this list of conditions and the following disclaimer in the
10*852ba100SJustin Hibbits  *       documentation and/or other materials provided with the distribution.
11*852ba100SJustin Hibbits  *     * Neither the name of Freescale Semiconductor nor the
12*852ba100SJustin Hibbits  *       names of its contributors may be used to endorse or promote products
13*852ba100SJustin Hibbits  *       derived from this software without specific prior written permission.
14*852ba100SJustin Hibbits  *
15*852ba100SJustin Hibbits  *
16*852ba100SJustin Hibbits  * ALTERNATIVELY, this software may be distributed under the terms of the
17*852ba100SJustin Hibbits  * GNU General Public License ("GPL") as published by the Free Software
18*852ba100SJustin Hibbits  * Foundation, either version 2 of that License or (at your option) any
19*852ba100SJustin Hibbits  * later version.
20*852ba100SJustin Hibbits  *
21*852ba100SJustin Hibbits  * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
22*852ba100SJustin Hibbits  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23*852ba100SJustin Hibbits  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24*852ba100SJustin Hibbits  * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
25*852ba100SJustin Hibbits  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26*852ba100SJustin Hibbits  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27*852ba100SJustin Hibbits  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28*852ba100SJustin Hibbits  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29*852ba100SJustin Hibbits  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30*852ba100SJustin Hibbits  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*852ba100SJustin Hibbits  */
32*852ba100SJustin Hibbits 
33*852ba100SJustin Hibbits #ifndef __FSL_FMAN_RTC_H
34*852ba100SJustin Hibbits #define __FSL_FMAN_RTC_H
35*852ba100SJustin Hibbits 
36*852ba100SJustin Hibbits #include "common/general.h"
37*852ba100SJustin Hibbits 
38*852ba100SJustin Hibbits /* FM RTC Registers definitions */
39*852ba100SJustin Hibbits #define FMAN_RTC_TMR_CTRL_ALMP1                  0x80000000
40*852ba100SJustin Hibbits #define FMAN_RTC_TMR_CTRL_ALMP2                  0x40000000
41*852ba100SJustin Hibbits #define FMAN_RTC_TMR_CTRL_FS                     0x10000000
42*852ba100SJustin Hibbits #define FMAN_RTC_TMR_CTRL_PP1L                   0x08000000
43*852ba100SJustin Hibbits #define FMAN_RTC_TMR_CTRL_PP2L                   0x04000000
44*852ba100SJustin Hibbits #define FMAN_RTC_TMR_CTRL_TCLK_PERIOD_MASK       0x03FF0000
45*852ba100SJustin Hibbits #define FMAN_RTC_TMR_CTRL_FRD                    0x00004000
46*852ba100SJustin Hibbits #define FMAN_RTC_TMR_CTRL_SLV                    0x00002000
47*852ba100SJustin Hibbits #define FMAN_RTC_TMR_CTRL_ETEP1                  0x00000100
48*852ba100SJustin Hibbits #define FMAN_RTC_TMR_CTRL_COPH                   0x00000080
49*852ba100SJustin Hibbits #define FMAN_RTC_TMR_CTRL_CIPH                   0x00000040
50*852ba100SJustin Hibbits #define FMAN_RTC_TMR_CTRL_TMSR                   0x00000020
51*852ba100SJustin Hibbits #define FMAN_RTC_TMR_CTRL_DBG                    0x00000010
52*852ba100SJustin Hibbits #define FMAN_RTC_TMR_CTRL_BYP                    0x00000008
53*852ba100SJustin Hibbits #define FMAN_RTC_TMR_CTRL_TE                     0x00000004
54*852ba100SJustin Hibbits #define FMAN_RTC_TMR_CTRL_CKSEL_OSC_CLK          0x00000003
55*852ba100SJustin Hibbits #define FMAN_RTC_TMR_CTRL_CKSEL_MAC_CLK          0x00000001
56*852ba100SJustin Hibbits #define FMAN_RTC_TMR_CTRL_CKSEL_EXT_CLK          0x00000000
57*852ba100SJustin Hibbits #define FMAN_RTC_TMR_CTRL_TCLK_PERIOD_SHIFT      16
58*852ba100SJustin Hibbits 
59*852ba100SJustin Hibbits #define FMAN_RTC_TMR_TEVENT_ETS2                 0x02000000
60*852ba100SJustin Hibbits #define FMAN_RTC_TMR_TEVENT_ETS1                 0x01000000
61*852ba100SJustin Hibbits #define FMAN_RTC_TMR_TEVENT_ALM2                 0x00020000
62*852ba100SJustin Hibbits #define FMAN_RTC_TMR_TEVENT_ALM1                 0x00010000
63*852ba100SJustin Hibbits #define FMAN_RTC_TMR_TEVENT_PP1                  0x00000080
64*852ba100SJustin Hibbits #define FMAN_RTC_TMR_TEVENT_PP2                  0x00000040
65*852ba100SJustin Hibbits #define FMAN_RTC_TMR_TEVENT_PP3                  0x00000020
66*852ba100SJustin Hibbits #define FMAN_RTC_TMR_TEVENT_ALL                  (FMAN_RTC_TMR_TEVENT_ETS2 |\
67*852ba100SJustin Hibbits 						FMAN_RTC_TMR_TEVENT_ETS1 |\
68*852ba100SJustin Hibbits 						FMAN_RTC_TMR_TEVENT_ALM2 |\
69*852ba100SJustin Hibbits 						FMAN_RTC_TMR_TEVENT_ALM1 |\
70*852ba100SJustin Hibbits 						FMAN_RTC_TMR_TEVENT_PP1 |\
71*852ba100SJustin Hibbits 						FMAN_RTC_TMR_TEVENT_PP2 |\
72*852ba100SJustin Hibbits 						FMAN_RTC_TMR_TEVENT_PP3)
73*852ba100SJustin Hibbits 
74*852ba100SJustin Hibbits #define FMAN_RTC_TMR_PRSC_OCK_MASK               0x0000FFFF
75*852ba100SJustin Hibbits 
76*852ba100SJustin Hibbits /**************************************************************************//**
77*852ba100SJustin Hibbits  @Description   FM RTC Alarm Polarity Options.
78*852ba100SJustin Hibbits *//***************************************************************************/
79*852ba100SJustin Hibbits enum fman_rtc_alarm_polarity {
80*852ba100SJustin Hibbits     E_FMAN_RTC_ALARM_POLARITY_ACTIVE_HIGH,  /**< Active-high output polarity */
81*852ba100SJustin Hibbits     E_FMAN_RTC_ALARM_POLARITY_ACTIVE_LOW    /**< Active-low output polarity */
82*852ba100SJustin Hibbits };
83*852ba100SJustin Hibbits 
84*852ba100SJustin Hibbits /**************************************************************************//**
85*852ba100SJustin Hibbits  @Description   FM RTC Trigger Polarity Options.
86*852ba100SJustin Hibbits *//***************************************************************************/
87*852ba100SJustin Hibbits enum fman_rtc_trigger_polarity {
88*852ba100SJustin Hibbits     E_FMAN_RTC_TRIGGER_ON_RISING_EDGE,    /**< Trigger on rising edge */
89*852ba100SJustin Hibbits     E_FMAN_RTC_TRIGGER_ON_FALLING_EDGE    /**< Trigger on falling edge */
90*852ba100SJustin Hibbits };
91*852ba100SJustin Hibbits 
92*852ba100SJustin Hibbits /**************************************************************************//**
93*852ba100SJustin Hibbits  @Description   IEEE1588 Timer Module FM RTC Optional Clock Sources.
94*852ba100SJustin Hibbits *//***************************************************************************/
95*852ba100SJustin Hibbits enum fman_src_clock {
96*852ba100SJustin Hibbits     E_FMAN_RTC_SOURCE_CLOCK_EXTERNAL,  /**< external high precision timer
97*852ba100SJustin Hibbits 						reference clock */
98*852ba100SJustin Hibbits     E_FMAN_RTC_SOURCE_CLOCK_SYSTEM,    /**< MAC system clock */
99*852ba100SJustin Hibbits     E_FMAN_RTC_SOURCE_CLOCK_OSCILATOR  /**< RTC clock oscilator */
100*852ba100SJustin Hibbits };
101*852ba100SJustin Hibbits 
102*852ba100SJustin Hibbits /* RTC default values */
103*852ba100SJustin Hibbits #define DEFAULT_SRC_CLOCK                E_FMAN_RTC_SOURCE_CLOCK_SYSTEM
104*852ba100SJustin Hibbits #define DEFAULT_INVERT_INPUT_CLK_PHASE   FALSE
105*852ba100SJustin Hibbits #define DEFAULT_INVERT_OUTPUT_CLK_PHASE  FALSE
106*852ba100SJustin Hibbits #define DEFAULT_ALARM_POLARITY           E_FMAN_RTC_ALARM_POLARITY_ACTIVE_HIGH
107*852ba100SJustin Hibbits #define DEFAULT_TRIGGER_POLARITY         E_FMAN_RTC_TRIGGER_ON_FALLING_EDGE
108*852ba100SJustin Hibbits #define DEFAULT_PULSE_REALIGN            FALSE
109*852ba100SJustin Hibbits 
110*852ba100SJustin Hibbits #define FMAN_RTC_MAX_NUM_OF_ALARMS 3
111*852ba100SJustin Hibbits #define FMAN_RTC_MAX_NUM_OF_PERIODIC_PULSES 4
112*852ba100SJustin Hibbits #define FMAN_RTC_MAX_NUM_OF_EXT_TRIGGERS 3
113*852ba100SJustin Hibbits 
114*852ba100SJustin Hibbits /**************************************************************************//**
115*852ba100SJustin Hibbits  @Description FM RTC timer alarm
116*852ba100SJustin Hibbits *//***************************************************************************/
117*852ba100SJustin Hibbits struct t_tmr_alarm{
118*852ba100SJustin Hibbits     uint32_t   tmr_alarm_h;    /**<  */
119*852ba100SJustin Hibbits     uint32_t   tmr_alarm_l;    /**<  */
120*852ba100SJustin Hibbits };
121*852ba100SJustin Hibbits 
122*852ba100SJustin Hibbits /**************************************************************************//**
123*852ba100SJustin Hibbits  @Description FM RTC timer Ex trigger
124*852ba100SJustin Hibbits *//***************************************************************************/
125*852ba100SJustin Hibbits struct t_tmr_ext_trigger{
126*852ba100SJustin Hibbits     uint32_t   tmr_etts_h;     /**<  */
127*852ba100SJustin Hibbits     uint32_t   tmr_etts_l;     /**<  */
128*852ba100SJustin Hibbits };
129*852ba100SJustin Hibbits 
130*852ba100SJustin Hibbits struct rtc_regs {
131*852ba100SJustin Hibbits     uint32_t tmr_id;      /* 0x000 Module ID register */
132*852ba100SJustin Hibbits     uint32_t tmr_id2;     /* 0x004 Controller ID register */
133*852ba100SJustin Hibbits     uint32_t reserved0008[30];
134*852ba100SJustin Hibbits     uint32_t tmr_ctrl;    /* 0x0080 timer control register */
135*852ba100SJustin Hibbits     uint32_t tmr_tevent;  /* 0x0084 timer event register */
136*852ba100SJustin Hibbits     uint32_t tmr_temask;  /* 0x0088 timer event mask register */
137*852ba100SJustin Hibbits     uint32_t reserved008c[3];
138*852ba100SJustin Hibbits     uint32_t tmr_cnt_h;   /* 0x0098 timer counter high register */
139*852ba100SJustin Hibbits     uint32_t tmr_cnt_l;   /* 0x009c timer counter low register */
140*852ba100SJustin Hibbits     uint32_t tmr_add;     /* 0x00a0 timer drift compensation addend register */
141*852ba100SJustin Hibbits     uint32_t tmr_acc;     /* 0x00a4 timer accumulator register */
142*852ba100SJustin Hibbits     uint32_t tmr_prsc;    /* 0x00a8 timer prescale */
143*852ba100SJustin Hibbits     uint32_t reserved00ac;
144*852ba100SJustin Hibbits     uint32_t tmr_off_h;    /* 0x00b0 timer offset high */
145*852ba100SJustin Hibbits     uint32_t tmr_off_l;    /* 0x00b4 timer offset low  */
146*852ba100SJustin Hibbits     struct t_tmr_alarm tmr_alarm[FMAN_RTC_MAX_NUM_OF_ALARMS]; /* 0x00b8 timer
147*852ba100SJustin Hibbits 								alarm */
148*852ba100SJustin Hibbits     uint32_t tmr_fiper[FMAN_RTC_MAX_NUM_OF_PERIODIC_PULSES]; /* 0x00d0 timer
149*852ba100SJustin Hibbits 						fixed period interval */
150*852ba100SJustin Hibbits     struct t_tmr_ext_trigger tmr_etts[FMAN_RTC_MAX_NUM_OF_EXT_TRIGGERS];
151*852ba100SJustin Hibbits 			/* 0x00e0 time stamp general purpose external */
152*852ba100SJustin Hibbits     uint32_t reserved00f0[4];
153*852ba100SJustin Hibbits };
154*852ba100SJustin Hibbits 
155*852ba100SJustin Hibbits struct rtc_cfg {
156*852ba100SJustin Hibbits     enum fman_src_clock            src_clk;
157*852ba100SJustin Hibbits     uint32_t                ext_src_clk_freq;
158*852ba100SJustin Hibbits     uint32_t                rtc_freq_hz;
159*852ba100SJustin Hibbits     bool                    timer_slave_mode;
160*852ba100SJustin Hibbits     bool                    invert_input_clk_phase;
161*852ba100SJustin Hibbits     bool                    invert_output_clk_phase;
162*852ba100SJustin Hibbits     uint32_t                events_mask;
163*852ba100SJustin Hibbits     bool                    bypass; /**< Indicates if frequency compensation
164*852ba100SJustin Hibbits 					is bypassed */
165*852ba100SJustin Hibbits     bool                    pulse_realign;
166*852ba100SJustin Hibbits     enum fman_rtc_alarm_polarity    alarm_polarity[FMAN_RTC_MAX_NUM_OF_ALARMS];
167*852ba100SJustin Hibbits     enum fman_rtc_trigger_polarity  trigger_polarity
168*852ba100SJustin Hibbits 					[FMAN_RTC_MAX_NUM_OF_EXT_TRIGGERS];
169*852ba100SJustin Hibbits };
170*852ba100SJustin Hibbits 
171*852ba100SJustin Hibbits /**
172*852ba100SJustin Hibbits  * fman_rtc_defconfig() - Get default RTC configuration
173*852ba100SJustin Hibbits  * @cfg:	pointer to configuration structure.
174*852ba100SJustin Hibbits  *
175*852ba100SJustin Hibbits  * Call this function to obtain a default set of configuration values for
176*852ba100SJustin Hibbits  * initializing RTC.  The user can overwrite any of the values before calling
177*852ba100SJustin Hibbits  * fman_rtc_init(), if specific configuration needs to be applied.
178*852ba100SJustin Hibbits  */
179*852ba100SJustin Hibbits void fman_rtc_defconfig(struct rtc_cfg *cfg);
180*852ba100SJustin Hibbits 
181*852ba100SJustin Hibbits /**
182*852ba100SJustin Hibbits  * fman_rtc_get_events() - Get the events
183*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
184*852ba100SJustin Hibbits  *
185*852ba100SJustin Hibbits  * Returns: The events
186*852ba100SJustin Hibbits  */
187*852ba100SJustin Hibbits uint32_t fman_rtc_get_events(struct rtc_regs *regs);
188*852ba100SJustin Hibbits 
189*852ba100SJustin Hibbits /**
190*852ba100SJustin Hibbits  * fman_rtc_get_interrupt_mask() - Get the events mask
191*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
192*852ba100SJustin Hibbits  *
193*852ba100SJustin Hibbits  * Returns: The events mask
194*852ba100SJustin Hibbits  */
195*852ba100SJustin Hibbits uint32_t fman_rtc_get_interrupt_mask(struct rtc_regs *regs);
196*852ba100SJustin Hibbits 
197*852ba100SJustin Hibbits 
198*852ba100SJustin Hibbits /**
199*852ba100SJustin Hibbits  * fman_rtc_set_interrupt_mask() - Set the events mask
200*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
201*852ba100SJustin Hibbits  * @mask:		The mask to set
202*852ba100SJustin Hibbits  */
203*852ba100SJustin Hibbits void fman_rtc_set_interrupt_mask(struct rtc_regs *regs, uint32_t mask);
204*852ba100SJustin Hibbits 
205*852ba100SJustin Hibbits /**
206*852ba100SJustin Hibbits  * fman_rtc_get_event() - Check if specific events occurred
207*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
208*852ba100SJustin Hibbits  * @ev_mask:	a mask of the events to check
209*852ba100SJustin Hibbits  *
210*852ba100SJustin Hibbits  * Returns: 0 if the events did not occur. Non zero if one of the events occurred
211*852ba100SJustin Hibbits  */
212*852ba100SJustin Hibbits uint32_t fman_rtc_get_event(struct rtc_regs *regs, uint32_t ev_mask);
213*852ba100SJustin Hibbits 
214*852ba100SJustin Hibbits /**
215*852ba100SJustin Hibbits  * fman_rtc_check_and_clear_event() - Clear events which are on
216*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
217*852ba100SJustin Hibbits  *
218*852ba100SJustin Hibbits  * Returns: A mask of the events which were cleared
219*852ba100SJustin Hibbits  */
220*852ba100SJustin Hibbits uint32_t fman_rtc_check_and_clear_event(struct rtc_regs *regs);
221*852ba100SJustin Hibbits 
222*852ba100SJustin Hibbits /**
223*852ba100SJustin Hibbits  * fman_rtc_ack_event() - Clear events
224*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
225*852ba100SJustin Hibbits  * @events:		The events to disable
226*852ba100SJustin Hibbits  */
227*852ba100SJustin Hibbits void fman_rtc_ack_event(struct rtc_regs *regs, uint32_t events);
228*852ba100SJustin Hibbits 
229*852ba100SJustin Hibbits /**
230*852ba100SJustin Hibbits  * fman_rtc_enable_interupt() - Enable events interrupts
231*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
232*852ba100SJustin Hibbits  * @mask:		The events to disable
233*852ba100SJustin Hibbits  */
234*852ba100SJustin Hibbits void fman_rtc_enable_interupt(struct rtc_regs *regs, uint32_t mask);
235*852ba100SJustin Hibbits 
236*852ba100SJustin Hibbits /**
237*852ba100SJustin Hibbits  * fman_rtc_disable_interupt() - Disable events interrupts
238*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
239*852ba100SJustin Hibbits  * @mask:		The events to disable
240*852ba100SJustin Hibbits  */
241*852ba100SJustin Hibbits void fman_rtc_disable_interupt(struct rtc_regs *regs, uint32_t mask);
242*852ba100SJustin Hibbits 
243*852ba100SJustin Hibbits /**
244*852ba100SJustin Hibbits  * fman_rtc_get_timer_ctrl() - Get the control register
245*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
246*852ba100SJustin Hibbits  *
247*852ba100SJustin Hibbits  * Returns: The control register value
248*852ba100SJustin Hibbits  */
249*852ba100SJustin Hibbits uint32_t fman_rtc_get_timer_ctrl(struct rtc_regs *regs);
250*852ba100SJustin Hibbits 
251*852ba100SJustin Hibbits /**
252*852ba100SJustin Hibbits  * fman_rtc_set_timer_ctrl() - Set timer control register
253*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
254*852ba100SJustin Hibbits  * @val:		The value to set
255*852ba100SJustin Hibbits  */
256*852ba100SJustin Hibbits void fman_rtc_set_timer_ctrl(struct rtc_regs *regs, uint32_t val);
257*852ba100SJustin Hibbits 
258*852ba100SJustin Hibbits /**
259*852ba100SJustin Hibbits  * fman_rtc_get_frequency_compensation() - Get the frequency compensation
260*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
261*852ba100SJustin Hibbits  *
262*852ba100SJustin Hibbits  * Returns: The timer counter
263*852ba100SJustin Hibbits  */
264*852ba100SJustin Hibbits uint32_t fman_rtc_get_frequency_compensation(struct rtc_regs *regs);
265*852ba100SJustin Hibbits 
266*852ba100SJustin Hibbits /**
267*852ba100SJustin Hibbits  * fman_rtc_set_frequency_compensation() - Set frequency compensation
268*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
269*852ba100SJustin Hibbits  * @val:		The value to set
270*852ba100SJustin Hibbits  */
271*852ba100SJustin Hibbits void fman_rtc_set_frequency_compensation(struct rtc_regs *regs, uint32_t val);
272*852ba100SJustin Hibbits 
273*852ba100SJustin Hibbits /**
274*852ba100SJustin Hibbits  * fman_rtc_get_trigger_stamp() - Get a trigger stamp
275*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
276*852ba100SJustin Hibbits  * @id:	The id of the trigger stamp
277*852ba100SJustin Hibbits  *
278*852ba100SJustin Hibbits  * Returns: The time stamp
279*852ba100SJustin Hibbits  */
280*852ba100SJustin Hibbits uint64_t fman_rtc_get_trigger_stamp(struct rtc_regs *regs,  int id);
281*852ba100SJustin Hibbits 
282*852ba100SJustin Hibbits /**
283*852ba100SJustin Hibbits  * fman_rtc_set_timer_alarm_l() - Set timer alarm low register
284*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
285*852ba100SJustin Hibbits  * @index:		The index of alarm to set
286*852ba100SJustin Hibbits  * @val:		The value to set
287*852ba100SJustin Hibbits  */
288*852ba100SJustin Hibbits void fman_rtc_set_timer_alarm_l(struct rtc_regs *regs, int index,
289*852ba100SJustin Hibbits 		uint32_t val);
290*852ba100SJustin Hibbits 
291*852ba100SJustin Hibbits /**
292*852ba100SJustin Hibbits  * fman_rtc_set_timer_alarm() - Set timer alarm
293*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
294*852ba100SJustin Hibbits  * @index:		The index of alarm to set
295*852ba100SJustin Hibbits  * @val:		The value to set
296*852ba100SJustin Hibbits  */
297*852ba100SJustin Hibbits void fman_rtc_set_timer_alarm(struct rtc_regs *regs, int index, int64_t val);
298*852ba100SJustin Hibbits 
299*852ba100SJustin Hibbits /**
300*852ba100SJustin Hibbits  * fman_rtc_set_timer_fiper() - Set timer fiper
301*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
302*852ba100SJustin Hibbits  * @index:		The index of fiper to set
303*852ba100SJustin Hibbits  * @val:		The value to set
304*852ba100SJustin Hibbits  */
305*852ba100SJustin Hibbits void fman_rtc_set_timer_fiper(struct rtc_regs *regs, int index, uint32_t val);
306*852ba100SJustin Hibbits 
307*852ba100SJustin Hibbits /**
308*852ba100SJustin Hibbits  * fman_rtc_set_timer_offset() - Set timer offset
309*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
310*852ba100SJustin Hibbits  * @val:		The value to set
311*852ba100SJustin Hibbits  */
312*852ba100SJustin Hibbits void fman_rtc_set_timer_offset(struct rtc_regs *regs, int64_t val);
313*852ba100SJustin Hibbits 
314*852ba100SJustin Hibbits /**
315*852ba100SJustin Hibbits  * fman_rtc_get_timer() - Get the timer counter
316*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
317*852ba100SJustin Hibbits  *
318*852ba100SJustin Hibbits  * Returns: The timer counter
319*852ba100SJustin Hibbits  */
fman_rtc_get_timer(struct rtc_regs * regs)320*852ba100SJustin Hibbits static inline uint64_t fman_rtc_get_timer(struct rtc_regs *regs)
321*852ba100SJustin Hibbits {
322*852ba100SJustin Hibbits 	uint64_t time;
323*852ba100SJustin Hibbits     /* TMR_CNT_L must be read first to get an accurate value */
324*852ba100SJustin Hibbits     time = (uint64_t)ioread32be(&regs->tmr_cnt_l);
325*852ba100SJustin Hibbits     time |= ((uint64_t)ioread32be(&regs->tmr_cnt_h) << 32);
326*852ba100SJustin Hibbits 
327*852ba100SJustin Hibbits     return time;
328*852ba100SJustin Hibbits }
329*852ba100SJustin Hibbits 
330*852ba100SJustin Hibbits /**
331*852ba100SJustin Hibbits  * fman_rtc_set_timer() - Set timer counter
332*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
333*852ba100SJustin Hibbits  * @val:		The value to set
334*852ba100SJustin Hibbits  */
fman_rtc_set_timer(struct rtc_regs * regs,int64_t val)335*852ba100SJustin Hibbits static inline void fman_rtc_set_timer(struct rtc_regs *regs, int64_t val)
336*852ba100SJustin Hibbits {
337*852ba100SJustin Hibbits 	iowrite32be((uint32_t)val, &regs->tmr_cnt_l);
338*852ba100SJustin Hibbits 	iowrite32be((uint32_t)(val >> 32), &regs->tmr_cnt_h);
339*852ba100SJustin Hibbits }
340*852ba100SJustin Hibbits 
341*852ba100SJustin Hibbits /**
342*852ba100SJustin Hibbits  * fman_rtc_timers_soft_reset() - Soft reset
343*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
344*852ba100SJustin Hibbits  *
345*852ba100SJustin Hibbits  * Resets all the timer registers and state machines for the 1588 IP and
346*852ba100SJustin Hibbits  * the attached client 1588
347*852ba100SJustin Hibbits  */
348*852ba100SJustin Hibbits void fman_rtc_timers_soft_reset(struct rtc_regs *regs);
349*852ba100SJustin Hibbits 
350*852ba100SJustin Hibbits /**
351*852ba100SJustin Hibbits  * fman_rtc_clear_external_trigger() - Clear an external trigger
352*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
353*852ba100SJustin Hibbits  * @id: The id of the trigger to clear
354*852ba100SJustin Hibbits  */
355*852ba100SJustin Hibbits void fman_rtc_clear_external_trigger(struct rtc_regs *regs, int id);
356*852ba100SJustin Hibbits 
357*852ba100SJustin Hibbits /**
358*852ba100SJustin Hibbits  * fman_rtc_clear_periodic_pulse() - Clear periodic pulse
359*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
360*852ba100SJustin Hibbits  * @id: The id of the fiper to clear
361*852ba100SJustin Hibbits  */
362*852ba100SJustin Hibbits void fman_rtc_clear_periodic_pulse(struct rtc_regs *regs, int id);
363*852ba100SJustin Hibbits 
364*852ba100SJustin Hibbits /**
365*852ba100SJustin Hibbits  * fman_rtc_enable() - Enable RTC hardware block
366*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
367*852ba100SJustin Hibbits  */
368*852ba100SJustin Hibbits void fman_rtc_enable(struct rtc_regs *regs, bool reset_clock);
369*852ba100SJustin Hibbits 
370*852ba100SJustin Hibbits /**
371*852ba100SJustin Hibbits  * fman_rtc_is_enabled() - Is RTC hardware block enabled
372*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
373*852ba100SJustin Hibbits  *
374*852ba100SJustin Hibbits  * Return: TRUE if enabled
375*852ba100SJustin Hibbits  */
376*852ba100SJustin Hibbits bool fman_rtc_is_enabled(struct rtc_regs *regs);
377*852ba100SJustin Hibbits 
378*852ba100SJustin Hibbits /**
379*852ba100SJustin Hibbits  * fman_rtc_disable() - Disable RTC hardware block
380*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
381*852ba100SJustin Hibbits  */
382*852ba100SJustin Hibbits void fman_rtc_disable(struct rtc_regs *regs);
383*852ba100SJustin Hibbits 
384*852ba100SJustin Hibbits /**
385*852ba100SJustin Hibbits  * fman_rtc_init() - Init RTC hardware block
386*852ba100SJustin Hibbits  * @cfg:		RTC configuration data
387*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
388*852ba100SJustin Hibbits  * @num_alarms:		Number of alarms in RTC
389*852ba100SJustin Hibbits  * @num_fipers:		Number of fipers in RTC
390*852ba100SJustin Hibbits  * @num_ext_triggers:	Number of external triggers in RTC
391*852ba100SJustin Hibbits  * @freq_compensation:		Frequency compensation
392*852ba100SJustin Hibbits  * @output_clock_divisor:		Output clock divisor
393*852ba100SJustin Hibbits  *
394*852ba100SJustin Hibbits  * This function initializes RTC and applies basic configuration.
395*852ba100SJustin Hibbits  */
396*852ba100SJustin Hibbits void fman_rtc_init(struct rtc_cfg *cfg, struct rtc_regs *regs, int num_alarms,
397*852ba100SJustin Hibbits 		int num_fipers, int num_ext_triggers, bool init_freq_comp,
398*852ba100SJustin Hibbits 		uint32_t freq_compensation, uint32_t output_clock_divisor);
399*852ba100SJustin Hibbits 
400*852ba100SJustin Hibbits /**
401*852ba100SJustin Hibbits  * fman_rtc_set_alarm() - Set an alarm
402*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
403*852ba100SJustin Hibbits  * @id:			id of alarm
404*852ba100SJustin Hibbits  * @val:		value to write
405*852ba100SJustin Hibbits  * @enable:		should interrupt be enabled
406*852ba100SJustin Hibbits  */
407*852ba100SJustin Hibbits void fman_rtc_set_alarm(struct rtc_regs *regs, int id, uint32_t val, bool enable);
408*852ba100SJustin Hibbits 
409*852ba100SJustin Hibbits /**
410*852ba100SJustin Hibbits  * fman_rtc_set_periodic_pulse() - Set an alarm
411*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
412*852ba100SJustin Hibbits  * @id:			id of fiper
413*852ba100SJustin Hibbits  * @val:		value to write
414*852ba100SJustin Hibbits  * @enable:		should interrupt be enabled
415*852ba100SJustin Hibbits  */
416*852ba100SJustin Hibbits void fman_rtc_set_periodic_pulse(struct rtc_regs *regs, int id, uint32_t val,
417*852ba100SJustin Hibbits 	bool enable);
418*852ba100SJustin Hibbits 
419*852ba100SJustin Hibbits /**
420*852ba100SJustin Hibbits  * fman_rtc_set_ext_trigger() - Set an external trigger
421*852ba100SJustin Hibbits  * @regs:		Pointer to RTC register block
422*852ba100SJustin Hibbits  * @id:			id of trigger
423*852ba100SJustin Hibbits  * @enable:		should interrupt be enabled
424*852ba100SJustin Hibbits  * @use_pulse_as_input: use the pulse as input
425*852ba100SJustin Hibbits  */
426*852ba100SJustin Hibbits void fman_rtc_set_ext_trigger(struct rtc_regs *regs, int id, bool enable,
427*852ba100SJustin Hibbits 	bool use_pulse_as_input);
428*852ba100SJustin Hibbits 
429*852ba100SJustin Hibbits struct fm_rtc_alarm_params {
430*852ba100SJustin Hibbits 	uint8_t alarm_id;            	/**< 0 or 1 */
431*852ba100SJustin Hibbits 	uint64_t alarm_time;         	/**< In nanoseconds, the time when the
432*852ba100SJustin Hibbits 					alarm should go off - must be a
433*852ba100SJustin Hibbits 					multiple of the RTC period */
434*852ba100SJustin Hibbits 	void (*f_alarm_callback)(void* app, uint8_t id); /**< This routine will
435*852ba100SJustin Hibbits 					be called when RTC reaches alarmTime */
436*852ba100SJustin Hibbits 	bool clear_on_expiration;   	/**< TRUE to turn off the alarm once
437*852ba100SJustin Hibbits 					expired.*/
438*852ba100SJustin Hibbits };
439*852ba100SJustin Hibbits 
440*852ba100SJustin Hibbits struct fm_rtc_periodic_pulse_params {
441*852ba100SJustin Hibbits 	uint8_t periodic_pulse_id;      /**< 0 or 1 */
442*852ba100SJustin Hibbits 	uint64_t periodic_pulse_period; /**< In Nanoseconds. Must be a multiple
443*852ba100SJustin Hibbits 					of the RTC period */
444*852ba100SJustin Hibbits 	void (*f_periodic_pulse_callback)(void* app, uint8_t id); /**< This
445*852ba100SJustin Hibbits 					routine will be called every
446*852ba100SJustin Hibbits 					periodicPulsePeriod. */
447*852ba100SJustin Hibbits };
448*852ba100SJustin Hibbits 
449*852ba100SJustin Hibbits #endif /* __FSL_FMAN_RTC_H */
450