1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright 2013-2016 Freescale Semiconductor Inc.
4  * Copyright 2016-2018 NXP
5  */
6 
7 #include <linux/fsl/mc.h>
8 
9 #include "dprtc.h"
10 #include "dprtc-cmd.h"
11 
12 /**
13  * dprtc_open() - Open a control session for the specified object.
14  * @mc_io:	Pointer to MC portal's I/O object
15  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
16  * @dprtc_id:	DPRTC unique ID
17  * @token:	Returned token; use in subsequent API calls
18  *
19  * This function can be used to open a control session for an
20  * already created object; an object may have been declared in
21  * the DPL or by calling the dprtc_create function.
22  * This function returns a unique authentication token,
23  * associated with the specific object ID and the specific MC
24  * portal; this token must be used in all subsequent commands for
25  * this specific object
26  *
27  * Return:	'0' on Success; Error code otherwise.
28  */
dprtc_open(struct fsl_mc_io * mc_io,u32 cmd_flags,int dprtc_id,u16 * token)29 int dprtc_open(struct fsl_mc_io *mc_io,
30 	       u32 cmd_flags,
31 	       int dprtc_id,
32 	       u16 *token)
33 {
34 	struct dprtc_cmd_open *cmd_params;
35 	struct fsl_mc_command cmd = { 0 };
36 	int err;
37 
38 	cmd.header = mc_encode_cmd_header(DPRTC_CMDID_OPEN,
39 					  cmd_flags,
40 					  0);
41 	cmd_params = (struct dprtc_cmd_open *)cmd.params;
42 	cmd_params->dprtc_id = cpu_to_le32(dprtc_id);
43 
44 	err = mc_send_command(mc_io, &cmd);
45 	if (err)
46 		return err;
47 
48 	*token = mc_cmd_hdr_read_token(&cmd);
49 
50 	return 0;
51 }
52 
53 /**
54  * dprtc_close() - Close the control session of the object
55  * @mc_io:	Pointer to MC portal's I/O object
56  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
57  * @token:	Token of DPRTC object
58  *
59  * After this function is called, no further operations are
60  * allowed on the object without opening a new control session.
61  *
62  * Return:	'0' on Success; Error code otherwise.
63  */
dprtc_close(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)64 int dprtc_close(struct fsl_mc_io *mc_io,
65 		u32 cmd_flags,
66 		u16 token)
67 {
68 	struct fsl_mc_command cmd = { 0 };
69 
70 	cmd.header = mc_encode_cmd_header(DPRTC_CMDID_CLOSE, cmd_flags,
71 					  token);
72 
73 	return mc_send_command(mc_io, &cmd);
74 }
75 
76 /**
77  * dprtc_create() - Create the DPRTC object.
78  * @mc_io:	Pointer to MC portal's I/O object
79  * @dprc_token:	Parent container token; '0' for default container
80  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
81  * @cfg:	Configuration structure
82  * @obj_id:	Returned object id
83  *
84  * Create the DPRTC object, allocate required resources and
85  * perform required initialization.
86  *
87  * The function accepts an authentication token of a parent
88  * container that this object should be assigned to. The token
89  * can be '0' so the object will be assigned to the default container.
90  * The newly created object can be opened with the returned
91  * object id and using the container's associated tokens and MC portals.
92  *
93  * Return:	'0' on Success; Error code otherwise.
94  */
dprtc_create(struct fsl_mc_io * mc_io,u16 dprc_token,u32 cmd_flags,const struct dprtc_cfg * cfg,u32 * obj_id)95 int dprtc_create(struct fsl_mc_io *mc_io,
96 		 u16 dprc_token,
97 		 u32 cmd_flags,
98 		 const struct dprtc_cfg *cfg,
99 		 u32 *obj_id)
100 {
101 	struct fsl_mc_command cmd = { 0 };
102 	int err;
103 
104 	cmd.header = mc_encode_cmd_header(DPRTC_CMDID_CREATE,
105 					  cmd_flags,
106 					  dprc_token);
107 
108 	err = mc_send_command(mc_io, &cmd);
109 	if (err)
110 		return err;
111 
112 	*obj_id = mc_cmd_read_object_id(&cmd);
113 
114 	return 0;
115 }
116 
117 /**
118  * dprtc_destroy() - Destroy the DPRTC object and release all its resources.
119  * @mc_io:	Pointer to MC portal's I/O object
120  * @dprc_token: Parent container token; '0' for default container
121  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
122  * @object_id:	The object id; it must be a valid id within the container that
123  * created this object;
124  *
125  * The function accepts the authentication token of the parent container that
126  * created the object (not the one that currently owns the object). The object
127  * is searched within parent using the provided 'object_id'.
128  * All tokens to the object must be closed before calling destroy.
129  *
130  * Return:	'0' on Success; error code otherwise.
131  */
dprtc_destroy(struct fsl_mc_io * mc_io,u16 dprc_token,u32 cmd_flags,u32 object_id)132 int dprtc_destroy(struct fsl_mc_io *mc_io,
133 		  u16 dprc_token,
134 		  u32 cmd_flags,
135 		  u32 object_id)
136 {
137 	struct dprtc_cmd_destroy *cmd_params;
138 	struct fsl_mc_command cmd = { 0 };
139 
140 	cmd.header = mc_encode_cmd_header(DPRTC_CMDID_DESTROY,
141 					  cmd_flags,
142 					  dprc_token);
143 	cmd_params = (struct dprtc_cmd_destroy *)cmd.params;
144 	cmd_params->object_id = cpu_to_le32(object_id);
145 
146 	return mc_send_command(mc_io, &cmd);
147 }
148 
149 /**
150  * dprtc_enable() - Enable the DPRTC.
151  * @mc_io:	Pointer to MC portal's I/O object
152  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
153  * @token:	Token of DPRTC object
154  *
155  * Return:	'0' on Success; Error code otherwise.
156  */
dprtc_enable(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)157 int dprtc_enable(struct fsl_mc_io *mc_io,
158 		 u32 cmd_flags,
159 		 u16 token)
160 {
161 	struct fsl_mc_command cmd = { 0 };
162 
163 	cmd.header = mc_encode_cmd_header(DPRTC_CMDID_ENABLE, cmd_flags,
164 					  token);
165 
166 	return mc_send_command(mc_io, &cmd);
167 }
168 
169 /**
170  * dprtc_disable() - Disable the DPRTC.
171  * @mc_io:	Pointer to MC portal's I/O object
172  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
173  * @token:	Token of DPRTC object
174  *
175  * Return:	'0' on Success; Error code otherwise.
176  */
dprtc_disable(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)177 int dprtc_disable(struct fsl_mc_io *mc_io,
178 		  u32 cmd_flags,
179 		  u16 token)
180 {
181 	struct fsl_mc_command cmd = { 0 };
182 
183 	cmd.header = mc_encode_cmd_header(DPRTC_CMDID_DISABLE,
184 					  cmd_flags,
185 					  token);
186 
187 	return mc_send_command(mc_io, &cmd);
188 }
189 
190 /**
191  * dprtc_is_enabled() - Check if the DPRTC is enabled.
192  * @mc_io:	Pointer to MC portal's I/O object
193  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
194  * @token:	Token of DPRTC object
195  * @en:		Returns '1' if object is enabled; '0' otherwise
196  *
197  * Return:	'0' on Success; Error code otherwise.
198  */
dprtc_is_enabled(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,int * en)199 int dprtc_is_enabled(struct fsl_mc_io *mc_io,
200 		     u32 cmd_flags,
201 		     u16 token,
202 		     int *en)
203 {
204 	struct dprtc_rsp_is_enabled *rsp_params;
205 	struct fsl_mc_command cmd = { 0 };
206 	int err;
207 
208 	cmd.header = mc_encode_cmd_header(DPRTC_CMDID_IS_ENABLED, cmd_flags,
209 					  token);
210 
211 	err = mc_send_command(mc_io, &cmd);
212 	if (err)
213 		return err;
214 
215 	rsp_params = (struct dprtc_rsp_is_enabled *)cmd.params;
216 	*en = dprtc_get_field(rsp_params->en, ENABLE);
217 
218 	return 0;
219 }
220 
221 /**
222  * dprtc_reset() - Reset the DPRTC, returns the object to initial state.
223  * @mc_io:	Pointer to MC portal's I/O object
224  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
225  * @token:	Token of DPRTC object
226  *
227  * Return:	'0' on Success; Error code otherwise.
228  */
dprtc_reset(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)229 int dprtc_reset(struct fsl_mc_io *mc_io,
230 		u32 cmd_flags,
231 		u16 token)
232 {
233 	struct fsl_mc_command cmd = { 0 };
234 
235 	cmd.header = mc_encode_cmd_header(DPRTC_CMDID_RESET,
236 					  cmd_flags,
237 					  token);
238 
239 	return mc_send_command(mc_io, &cmd);
240 }
241 
242 /**
243  * dprtc_set_irq_enable() - Set overall interrupt state.
244  * @mc_io:	Pointer to MC portal's I/O object
245  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
246  * @token:	Token of DPRTC object
247  * @irq_index:	The interrupt index to configure
248  * @en:		Interrupt state - enable = 1, disable = 0
249  *
250  * Allows GPP software to control when interrupts are generated.
251  * Each interrupt can have up to 32 causes.  The enable/disable control's the
252  * overall interrupt state. if the interrupt is disabled no causes will cause
253  * an interrupt.
254  *
255  * Return:	'0' on Success; Error code otherwise.
256  */
dprtc_set_irq_enable(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u8 irq_index,u8 en)257 int dprtc_set_irq_enable(struct fsl_mc_io *mc_io,
258 			 u32 cmd_flags,
259 			 u16 token,
260 			 u8 irq_index,
261 			 u8 en)
262 {
263 	struct dprtc_cmd_set_irq_enable *cmd_params;
264 	struct fsl_mc_command cmd = { 0 };
265 
266 	cmd.header = mc_encode_cmd_header(DPRTC_CMDID_SET_IRQ_ENABLE,
267 					  cmd_flags,
268 					  token);
269 	cmd_params = (struct dprtc_cmd_set_irq_enable *)cmd.params;
270 	cmd_params->irq_index = irq_index;
271 	cmd_params->en = en;
272 
273 	return mc_send_command(mc_io, &cmd);
274 }
275 
276 /**
277  * dprtc_get_irq_enable() - Get overall interrupt state
278  * @mc_io:	Pointer to MC portal's I/O object
279  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
280  * @token:	Token of DPRTC object
281  * @irq_index:	The interrupt index to configure
282  * @en:		Returned interrupt state - enable = 1, disable = 0
283  *
284  * Return:	'0' on Success; Error code otherwise.
285  */
dprtc_get_irq_enable(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u8 irq_index,u8 * en)286 int dprtc_get_irq_enable(struct fsl_mc_io *mc_io,
287 			 u32 cmd_flags,
288 			 u16 token,
289 			 u8 irq_index,
290 			 u8 *en)
291 {
292 	struct dprtc_rsp_get_irq_enable *rsp_params;
293 	struct dprtc_cmd_get_irq *cmd_params;
294 	struct fsl_mc_command cmd = { 0 };
295 	int err;
296 
297 	cmd.header = mc_encode_cmd_header(DPRTC_CMDID_GET_IRQ_ENABLE,
298 					  cmd_flags,
299 					  token);
300 	cmd_params = (struct dprtc_cmd_get_irq *)cmd.params;
301 	cmd_params->irq_index = irq_index;
302 
303 	err = mc_send_command(mc_io, &cmd);
304 	if (err)
305 		return err;
306 
307 	rsp_params = (struct dprtc_rsp_get_irq_enable *)cmd.params;
308 	*en = rsp_params->en;
309 
310 	return 0;
311 }
312 
313 /**
314  * dprtc_set_irq_mask() - Set interrupt mask.
315  * @mc_io:	Pointer to MC portal's I/O object
316  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
317  * @token:	Token of DPRTC object
318  * @irq_index:	The interrupt index to configure
319  * @mask:	Event mask to trigger interrupt;
320  *		each bit:
321  *			0 = ignore event
322  *			1 = consider event for asserting IRQ
323  *
324  * Every interrupt can have up to 32 causes and the interrupt model supports
325  * masking/unmasking each cause independently
326  *
327  * Return:	'0' on Success; Error code otherwise.
328  */
dprtc_set_irq_mask(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u8 irq_index,u32 mask)329 int dprtc_set_irq_mask(struct fsl_mc_io *mc_io,
330 		       u32 cmd_flags,
331 		       u16 token,
332 		       u8 irq_index,
333 		       u32 mask)
334 {
335 	struct dprtc_cmd_set_irq_mask *cmd_params;
336 	struct fsl_mc_command cmd = { 0 };
337 
338 	cmd.header = mc_encode_cmd_header(DPRTC_CMDID_SET_IRQ_MASK,
339 					  cmd_flags,
340 					  token);
341 	cmd_params = (struct dprtc_cmd_set_irq_mask *)cmd.params;
342 	cmd_params->mask = cpu_to_le32(mask);
343 	cmd_params->irq_index = irq_index;
344 
345 	return mc_send_command(mc_io, &cmd);
346 }
347 
348 /**
349  * dprtc_get_irq_mask() - Get interrupt mask.
350  * @mc_io:	Pointer to MC portal's I/O object
351  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
352  * @token:	Token of DPRTC object
353  * @irq_index:	The interrupt index to configure
354  * @mask:	Returned event mask to trigger interrupt
355  *
356  * Every interrupt can have up to 32 causes and the interrupt model supports
357  * masking/unmasking each cause independently
358  *
359  * Return:	'0' on Success; Error code otherwise.
360  */
dprtc_get_irq_mask(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u8 irq_index,u32 * mask)361 int dprtc_get_irq_mask(struct fsl_mc_io *mc_io,
362 		       u32 cmd_flags,
363 		       u16 token,
364 		       u8 irq_index,
365 		       u32 *mask)
366 {
367 	struct dprtc_rsp_get_irq_mask *rsp_params;
368 	struct dprtc_cmd_get_irq *cmd_params;
369 	struct fsl_mc_command cmd = { 0 };
370 	int err;
371 
372 	cmd.header = mc_encode_cmd_header(DPRTC_CMDID_GET_IRQ_MASK,
373 					  cmd_flags,
374 					  token);
375 	cmd_params = (struct dprtc_cmd_get_irq *)cmd.params;
376 	cmd_params->irq_index = irq_index;
377 
378 	err = mc_send_command(mc_io, &cmd);
379 	if (err)
380 		return err;
381 
382 	rsp_params = (struct dprtc_rsp_get_irq_mask *)cmd.params;
383 	*mask = le32_to_cpu(rsp_params->mask);
384 
385 	return 0;
386 }
387 
388 /**
389  * dprtc_get_irq_status() - Get the current status of any pending interrupts.
390  *
391  * @mc_io:	Pointer to MC portal's I/O object
392  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
393  * @token:	Token of DPRTC object
394  * @irq_index:	The interrupt index to configure
395  * @status:	Returned interrupts status - one bit per cause:
396  *			0 = no interrupt pending
397  *			1 = interrupt pending
398  *
399  * Return:	'0' on Success; Error code otherwise.
400  */
dprtc_get_irq_status(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u8 irq_index,u32 * status)401 int dprtc_get_irq_status(struct fsl_mc_io *mc_io,
402 			 u32 cmd_flags,
403 			 u16 token,
404 			 u8 irq_index,
405 			 u32 *status)
406 {
407 	struct dprtc_cmd_get_irq_status *cmd_params;
408 	struct dprtc_rsp_get_irq_status *rsp_params;
409 	struct fsl_mc_command cmd = { 0 };
410 	int err;
411 
412 	cmd.header = mc_encode_cmd_header(DPRTC_CMDID_GET_IRQ_STATUS,
413 					  cmd_flags,
414 					  token);
415 	cmd_params = (struct dprtc_cmd_get_irq_status *)cmd.params;
416 	cmd_params->status = cpu_to_le32(*status);
417 	cmd_params->irq_index = irq_index;
418 
419 	err = mc_send_command(mc_io, &cmd);
420 	if (err)
421 		return err;
422 
423 	rsp_params = (struct dprtc_rsp_get_irq_status *)cmd.params;
424 	*status = le32_to_cpu(rsp_params->status);
425 
426 	return 0;
427 }
428 
429 /**
430  * dprtc_clear_irq_status() - Clear a pending interrupt's status
431  *
432  * @mc_io:	Pointer to MC portal's I/O object
433  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
434  * @token:	Token of DPRTC object
435  * @irq_index:	The interrupt index to configure
436  * @status:	Bits to clear (W1C) - one bit per cause:
437  *			0 = don't change
438  *			1 = clear status bit
439  *
440  * Return:	'0' on Success; Error code otherwise.
441  */
dprtc_clear_irq_status(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u8 irq_index,u32 status)442 int dprtc_clear_irq_status(struct fsl_mc_io *mc_io,
443 			   u32 cmd_flags,
444 			   u16 token,
445 			   u8 irq_index,
446 			   u32 status)
447 {
448 	struct dprtc_cmd_clear_irq_status *cmd_params;
449 	struct fsl_mc_command cmd = { 0 };
450 
451 	cmd.header = mc_encode_cmd_header(DPRTC_CMDID_CLEAR_IRQ_STATUS,
452 					  cmd_flags,
453 					  token);
454 	cmd_params = (struct dprtc_cmd_clear_irq_status *)cmd.params;
455 	cmd_params->irq_index = irq_index;
456 	cmd_params->status = cpu_to_le32(status);
457 
458 	return mc_send_command(mc_io, &cmd);
459 }
460 
461 /**
462  * dprtc_get_attributes - Retrieve DPRTC attributes.
463  *
464  * @mc_io:	Pointer to MC portal's I/O object
465  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
466  * @token:	Token of DPRTC object
467  * @attr:	Returned object's attributes
468  *
469  * Return:	'0' on Success; Error code otherwise.
470  */
dprtc_get_attributes(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,struct dprtc_attr * attr)471 int dprtc_get_attributes(struct fsl_mc_io *mc_io,
472 			 u32 cmd_flags,
473 			 u16 token,
474 			 struct dprtc_attr *attr)
475 {
476 	struct dprtc_rsp_get_attributes *rsp_params;
477 	struct fsl_mc_command cmd = { 0 };
478 	int err;
479 
480 	cmd.header = mc_encode_cmd_header(DPRTC_CMDID_GET_ATTR,
481 					  cmd_flags,
482 					  token);
483 
484 	err = mc_send_command(mc_io, &cmd);
485 	if (err)
486 		return err;
487 
488 	rsp_params = (struct dprtc_rsp_get_attributes *)cmd.params;
489 	attr->id = le32_to_cpu(rsp_params->id);
490 
491 	return 0;
492 }
493 
494 /**
495  * dprtc_set_clock_offset() - Sets the clock's offset
496  * (usually relative to another clock).
497  *
498  * @mc_io:	Pointer to MC portal's I/O object
499  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
500  * @token:	Token of DPRTC object
501  * @offset:	New clock offset (in nanoseconds).
502  *
503  * Return:	'0' on Success; Error code otherwise.
504  */
dprtc_set_clock_offset(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,int64_t offset)505 int dprtc_set_clock_offset(struct fsl_mc_io *mc_io,
506 			   u32 cmd_flags,
507 			   u16 token,
508 			   int64_t offset)
509 {
510 	struct dprtc_cmd_set_clock_offset *cmd_params;
511 	struct fsl_mc_command cmd = { 0 };
512 
513 	cmd.header = mc_encode_cmd_header(DPRTC_CMDID_SET_CLOCK_OFFSET,
514 					  cmd_flags,
515 					  token);
516 	cmd_params = (struct dprtc_cmd_set_clock_offset *)cmd.params;
517 	cmd_params->offset = cpu_to_le64(offset);
518 
519 	return mc_send_command(mc_io, &cmd);
520 }
521 
522 /**
523  * dprtc_set_freq_compensation() - Sets a new frequency compensation value.
524  *
525  * @mc_io:		Pointer to MC portal's I/O object
526  * @cmd_flags:		Command flags; one or more of 'MC_CMD_FLAG_'
527  * @token:		Token of DPRTC object
528  * @freq_compensation:	The new frequency compensation value to set.
529  *
530  * Return:	'0' on Success; Error code otherwise.
531  */
dprtc_set_freq_compensation(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u32 freq_compensation)532 int dprtc_set_freq_compensation(struct fsl_mc_io *mc_io,
533 				u32 cmd_flags,
534 				u16 token,
535 				u32 freq_compensation)
536 {
537 	struct dprtc_get_freq_compensation *cmd_params;
538 	struct fsl_mc_command cmd = { 0 };
539 
540 	cmd.header = mc_encode_cmd_header(DPRTC_CMDID_SET_FREQ_COMPENSATION,
541 					  cmd_flags,
542 					  token);
543 	cmd_params = (struct dprtc_get_freq_compensation *)cmd.params;
544 	cmd_params->freq_compensation = cpu_to_le32(freq_compensation);
545 
546 	return mc_send_command(mc_io, &cmd);
547 }
548 
549 /**
550  * dprtc_get_freq_compensation() - Retrieves the frequency compensation value
551  *
552  * @mc_io:		Pointer to MC portal's I/O object
553  * @cmd_flags:		Command flags; one or more of 'MC_CMD_FLAG_'
554  * @token:		Token of DPRTC object
555  * @freq_compensation:	Frequency compensation value
556  *
557  * Return:	'0' on Success; Error code otherwise.
558  */
dprtc_get_freq_compensation(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u32 * freq_compensation)559 int dprtc_get_freq_compensation(struct fsl_mc_io *mc_io,
560 				u32 cmd_flags,
561 				u16 token,
562 				u32 *freq_compensation)
563 {
564 	struct dprtc_get_freq_compensation *rsp_params;
565 	struct fsl_mc_command cmd = { 0 };
566 	int err;
567 
568 	cmd.header = mc_encode_cmd_header(DPRTC_CMDID_GET_FREQ_COMPENSATION,
569 					  cmd_flags,
570 					  token);
571 
572 	err = mc_send_command(mc_io, &cmd);
573 	if (err)
574 		return err;
575 
576 	rsp_params = (struct dprtc_get_freq_compensation *)cmd.params;
577 	*freq_compensation = le32_to_cpu(rsp_params->freq_compensation);
578 
579 	return 0;
580 }
581 
582 /**
583  * dprtc_get_time() - Returns the current RTC time.
584  *
585  * @mc_io:	Pointer to MC portal's I/O object
586  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
587  * @token:	Token of DPRTC object
588  * @time:	Current RTC time.
589  *
590  * Return:	'0' on Success; Error code otherwise.
591  */
dprtc_get_time(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,uint64_t * time)592 int dprtc_get_time(struct fsl_mc_io *mc_io,
593 		   u32 cmd_flags,
594 		   u16 token,
595 		   uint64_t *time)
596 {
597 	struct dprtc_time *rsp_params;
598 	struct fsl_mc_command cmd = { 0 };
599 	int err;
600 
601 	cmd.header = mc_encode_cmd_header(DPRTC_CMDID_GET_TIME,
602 					  cmd_flags,
603 					  token);
604 
605 	err = mc_send_command(mc_io, &cmd);
606 	if (err)
607 		return err;
608 
609 	rsp_params = (struct dprtc_time *)cmd.params;
610 	*time = le64_to_cpu(rsp_params->time);
611 
612 	return 0;
613 }
614 
615 /**
616  * dprtc_set_time() - Updates current RTC time.
617  *
618  * @mc_io:	Pointer to MC portal's I/O object
619  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
620  * @token:	Token of DPRTC object
621  * @time:	New RTC time.
622  *
623  * Return:	'0' on Success; Error code otherwise.
624  */
dprtc_set_time(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,uint64_t time)625 int dprtc_set_time(struct fsl_mc_io *mc_io,
626 		   u32 cmd_flags,
627 		   u16 token,
628 		   uint64_t time)
629 {
630 	struct dprtc_time *cmd_params;
631 	struct fsl_mc_command cmd = { 0 };
632 
633 	cmd.header = mc_encode_cmd_header(DPRTC_CMDID_SET_TIME,
634 					  cmd_flags,
635 					  token);
636 	cmd_params = (struct dprtc_time *)cmd.params;
637 	cmd_params->time = cpu_to_le64(time);
638 
639 	return mc_send_command(mc_io, &cmd);
640 }
641 
642 /**
643  * dprtc_set_alarm() - Defines and sets alarm.
644  *
645  * @mc_io:	Pointer to MC portal's I/O object
646  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
647  * @token:	Token of DPRTC object
648  * @time:	In nanoseconds, the time when the alarm
649  *			should go off - must be a multiple of
650  *			1 microsecond
651  *
652  * Return:	'0' on Success; Error code otherwise.
653  */
dprtc_set_alarm(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,uint64_t time)654 int dprtc_set_alarm(struct fsl_mc_io *mc_io,
655 		    u32 cmd_flags,
656 		    u16 token, uint64_t time)
657 {
658 	struct dprtc_time *cmd_params;
659 	struct fsl_mc_command cmd = { 0 };
660 
661 	cmd.header = mc_encode_cmd_header(DPRTC_CMDID_SET_ALARM,
662 					  cmd_flags,
663 					  token);
664 	cmd_params = (struct dprtc_time *)cmd.params;
665 	cmd_params->time = cpu_to_le64(time);
666 
667 	return mc_send_command(mc_io, &cmd);
668 }
669 
670 /**
671  * dprtc_get_api_version() - Get Data Path Real Time Counter API version
672  * @mc_io:	Pointer to MC portal's I/O object
673  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
674  * @major_ver:	Major version of data path real time counter API
675  * @minor_ver:	Minor version of data path real time counter API
676  *
677  * Return:  '0' on Success; Error code otherwise.
678  */
dprtc_get_api_version(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 * major_ver,u16 * minor_ver)679 int dprtc_get_api_version(struct fsl_mc_io *mc_io,
680 			  u32 cmd_flags,
681 			  u16 *major_ver,
682 			  u16 *minor_ver)
683 {
684 	struct dprtc_rsp_get_api_version *rsp_params;
685 	struct fsl_mc_command cmd = { 0 };
686 	int err;
687 
688 	cmd.header = mc_encode_cmd_header(DPRTC_CMDID_GET_API_VERSION,
689 					  cmd_flags,
690 					  0);
691 
692 	err = mc_send_command(mc_io, &cmd);
693 	if (err)
694 		return err;
695 
696 	rsp_params = (struct dprtc_rsp_get_api_version *)cmd.params;
697 	*major_ver = le16_to_cpu(rsp_params->major);
698 	*minor_ver = le16_to_cpu(rsp_params->minor);
699 
700 	return 0;
701 }
702