dprtc.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright 2013-2016 Freescale Semiconductor Inc.
  4. * Copyright 2016-2018 NXP
  5. */
  6. #include <linux/fsl/mc.h>
  7. #include "dprtc.h"
  8. #include "dprtc-cmd.h"
  9. /**
  10. * dprtc_open() - Open a control session for the specified object.
  11. * @mc_io: Pointer to MC portal's I/O object
  12. * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  13. * @dprtc_id: DPRTC unique ID
  14. * @token: Returned token; use in subsequent API calls
  15. *
  16. * This function can be used to open a control session for an
  17. * already created object; an object may have been declared in
  18. * the DPL or by calling the dprtc_create function.
  19. * This function returns a unique authentication token,
  20. * associated with the specific object ID and the specific MC
  21. * portal; this token must be used in all subsequent commands for
  22. * this specific object
  23. *
  24. * Return: '0' on Success; Error code otherwise.
  25. */
  26. int dprtc_open(struct fsl_mc_io *mc_io,
  27. u32 cmd_flags,
  28. int dprtc_id,
  29. u16 *token)
  30. {
  31. struct dprtc_cmd_open *cmd_params;
  32. struct fsl_mc_command cmd = { 0 };
  33. int err;
  34. cmd.header = mc_encode_cmd_header(DPRTC_CMDID_OPEN,
  35. cmd_flags,
  36. 0);
  37. cmd_params = (struct dprtc_cmd_open *)cmd.params;
  38. cmd_params->dprtc_id = cpu_to_le32(dprtc_id);
  39. err = mc_send_command(mc_io, &cmd);
  40. if (err)
  41. return err;
  42. *token = mc_cmd_hdr_read_token(&cmd);
  43. return 0;
  44. }
  45. /**
  46. * dprtc_close() - Close the control session of the object
  47. * @mc_io: Pointer to MC portal's I/O object
  48. * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  49. * @token: Token of DPRTC object
  50. *
  51. * After this function is called, no further operations are
  52. * allowed on the object without opening a new control session.
  53. *
  54. * Return: '0' on Success; Error code otherwise.
  55. */
  56. int dprtc_close(struct fsl_mc_io *mc_io,
  57. u32 cmd_flags,
  58. u16 token)
  59. {
  60. struct fsl_mc_command cmd = { 0 };
  61. cmd.header = mc_encode_cmd_header(DPRTC_CMDID_CLOSE, cmd_flags,
  62. token);
  63. return mc_send_command(mc_io, &cmd);
  64. }
  65. /**
  66. * dprtc_set_irq_enable() - Set overall interrupt state.
  67. * @mc_io: Pointer to MC portal's I/O object
  68. * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  69. * @token: Token of DPRTC object
  70. * @irq_index: The interrupt index to configure
  71. * @en: Interrupt state - enable = 1, disable = 0
  72. *
  73. * Allows GPP software to control when interrupts are generated.
  74. * Each interrupt can have up to 32 causes. The enable/disable control's the
  75. * overall interrupt state. if the interrupt is disabled no causes will cause
  76. * an interrupt.
  77. *
  78. * Return: '0' on Success; Error code otherwise.
  79. */
  80. int dprtc_set_irq_enable(struct fsl_mc_io *mc_io,
  81. u32 cmd_flags,
  82. u16 token,
  83. u8 irq_index,
  84. u8 en)
  85. {
  86. struct dprtc_cmd_set_irq_enable *cmd_params;
  87. struct fsl_mc_command cmd = { 0 };
  88. cmd.header = mc_encode_cmd_header(DPRTC_CMDID_SET_IRQ_ENABLE,
  89. cmd_flags,
  90. token);
  91. cmd_params = (struct dprtc_cmd_set_irq_enable *)cmd.params;
  92. cmd_params->irq_index = irq_index;
  93. cmd_params->en = en;
  94. return mc_send_command(mc_io, &cmd);
  95. }
  96. /**
  97. * dprtc_get_irq_enable() - Get overall interrupt state
  98. * @mc_io: Pointer to MC portal's I/O object
  99. * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  100. * @token: Token of DPRTC object
  101. * @irq_index: The interrupt index to configure
  102. * @en: Returned interrupt state - enable = 1, disable = 0
  103. *
  104. * Return: '0' on Success; Error code otherwise.
  105. */
  106. int dprtc_get_irq_enable(struct fsl_mc_io *mc_io,
  107. u32 cmd_flags,
  108. u16 token,
  109. u8 irq_index,
  110. u8 *en)
  111. {
  112. struct dprtc_rsp_get_irq_enable *rsp_params;
  113. struct dprtc_cmd_get_irq *cmd_params;
  114. struct fsl_mc_command cmd = { 0 };
  115. int err;
  116. cmd.header = mc_encode_cmd_header(DPRTC_CMDID_GET_IRQ_ENABLE,
  117. cmd_flags,
  118. token);
  119. cmd_params = (struct dprtc_cmd_get_irq *)cmd.params;
  120. cmd_params->irq_index = irq_index;
  121. err = mc_send_command(mc_io, &cmd);
  122. if (err)
  123. return err;
  124. rsp_params = (struct dprtc_rsp_get_irq_enable *)cmd.params;
  125. *en = rsp_params->en;
  126. return 0;
  127. }
  128. /**
  129. * dprtc_set_irq_mask() - Set interrupt mask.
  130. * @mc_io: Pointer to MC portal's I/O object
  131. * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  132. * @token: Token of DPRTC object
  133. * @irq_index: The interrupt index to configure
  134. * @mask: Event mask to trigger interrupt;
  135. * each bit:
  136. * 0 = ignore event
  137. * 1 = consider event for asserting IRQ
  138. *
  139. * Every interrupt can have up to 32 causes and the interrupt model supports
  140. * masking/unmasking each cause independently
  141. *
  142. * Return: '0' on Success; Error code otherwise.
  143. */
  144. int dprtc_set_irq_mask(struct fsl_mc_io *mc_io,
  145. u32 cmd_flags,
  146. u16 token,
  147. u8 irq_index,
  148. u32 mask)
  149. {
  150. struct dprtc_cmd_set_irq_mask *cmd_params;
  151. struct fsl_mc_command cmd = { 0 };
  152. cmd.header = mc_encode_cmd_header(DPRTC_CMDID_SET_IRQ_MASK,
  153. cmd_flags,
  154. token);
  155. cmd_params = (struct dprtc_cmd_set_irq_mask *)cmd.params;
  156. cmd_params->mask = cpu_to_le32(mask);
  157. cmd_params->irq_index = irq_index;
  158. return mc_send_command(mc_io, &cmd);
  159. }
  160. /**
  161. * dprtc_get_irq_mask() - Get interrupt mask.
  162. * @mc_io: Pointer to MC portal's I/O object
  163. * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  164. * @token: Token of DPRTC object
  165. * @irq_index: The interrupt index to configure
  166. * @mask: Returned event mask to trigger interrupt
  167. *
  168. * Every interrupt can have up to 32 causes and the interrupt model supports
  169. * masking/unmasking each cause independently
  170. *
  171. * Return: '0' on Success; Error code otherwise.
  172. */
  173. int dprtc_get_irq_mask(struct fsl_mc_io *mc_io,
  174. u32 cmd_flags,
  175. u16 token,
  176. u8 irq_index,
  177. u32 *mask)
  178. {
  179. struct dprtc_rsp_get_irq_mask *rsp_params;
  180. struct dprtc_cmd_get_irq *cmd_params;
  181. struct fsl_mc_command cmd = { 0 };
  182. int err;
  183. cmd.header = mc_encode_cmd_header(DPRTC_CMDID_GET_IRQ_MASK,
  184. cmd_flags,
  185. token);
  186. cmd_params = (struct dprtc_cmd_get_irq *)cmd.params;
  187. cmd_params->irq_index = irq_index;
  188. err = mc_send_command(mc_io, &cmd);
  189. if (err)
  190. return err;
  191. rsp_params = (struct dprtc_rsp_get_irq_mask *)cmd.params;
  192. *mask = le32_to_cpu(rsp_params->mask);
  193. return 0;
  194. }
  195. /**
  196. * dprtc_get_irq_status() - Get the current status of any pending interrupts.
  197. *
  198. * @mc_io: Pointer to MC portal's I/O object
  199. * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  200. * @token: Token of DPRTC object
  201. * @irq_index: The interrupt index to configure
  202. * @status: Returned interrupts status - one bit per cause:
  203. * 0 = no interrupt pending
  204. * 1 = interrupt pending
  205. *
  206. * Return: '0' on Success; Error code otherwise.
  207. */
  208. int dprtc_get_irq_status(struct fsl_mc_io *mc_io,
  209. u32 cmd_flags,
  210. u16 token,
  211. u8 irq_index,
  212. u32 *status)
  213. {
  214. struct dprtc_cmd_get_irq_status *cmd_params;
  215. struct dprtc_rsp_get_irq_status *rsp_params;
  216. struct fsl_mc_command cmd = { 0 };
  217. int err;
  218. cmd.header = mc_encode_cmd_header(DPRTC_CMDID_GET_IRQ_STATUS,
  219. cmd_flags,
  220. token);
  221. cmd_params = (struct dprtc_cmd_get_irq_status *)cmd.params;
  222. cmd_params->status = cpu_to_le32(*status);
  223. cmd_params->irq_index = irq_index;
  224. err = mc_send_command(mc_io, &cmd);
  225. if (err)
  226. return err;
  227. rsp_params = (struct dprtc_rsp_get_irq_status *)cmd.params;
  228. *status = le32_to_cpu(rsp_params->status);
  229. return 0;
  230. }
  231. /**
  232. * dprtc_clear_irq_status() - Clear a pending interrupt's status
  233. *
  234. * @mc_io: Pointer to MC portal's I/O object
  235. * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  236. * @token: Token of DPRTC object
  237. * @irq_index: The interrupt index to configure
  238. * @status: Bits to clear (W1C) - one bit per cause:
  239. * 0 = don't change
  240. * 1 = clear status bit
  241. *
  242. * Return: '0' on Success; Error code otherwise.
  243. */
  244. int dprtc_clear_irq_status(struct fsl_mc_io *mc_io,
  245. u32 cmd_flags,
  246. u16 token,
  247. u8 irq_index,
  248. u32 status)
  249. {
  250. struct dprtc_cmd_clear_irq_status *cmd_params;
  251. struct fsl_mc_command cmd = { 0 };
  252. cmd.header = mc_encode_cmd_header(DPRTC_CMDID_CLEAR_IRQ_STATUS,
  253. cmd_flags,
  254. token);
  255. cmd_params = (struct dprtc_cmd_clear_irq_status *)cmd.params;
  256. cmd_params->irq_index = irq_index;
  257. cmd_params->status = cpu_to_le32(status);
  258. return mc_send_command(mc_io, &cmd);
  259. }