sunxi-mad.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. /*
  2. * Copyright (c) 2019-2025 Allwinner Technology Co., Ltd. ALL rights reserved.
  3. *
  4. * Allwinner is a trademark of Allwinner Technology Co.,Ltd., registered in
  5. * the the people's Republic of China and other countries.
  6. * All Allwinner Technology Co.,Ltd. trademarks are used with permission.
  7. *
  8. * DISCLAIMER
  9. * THIRD PARTY LICENCES MAY BE REQUIRED TO IMPLEMENT THE SOLUTION/PRODUCT.
  10. * IF YOU NEED TO INTEGRATE THIRD PARTY’S TECHNOLOGY (SONY, DTS, DOLBY, AVS OR MPEGLA, ETC.)
  11. * IN ALLWINNERS’SDK OR PRODUCTS, YOU SHALL BE SOLELY RESPONSIBLE TO OBTAIN
  12. * ALL APPROPRIATELY REQUIRED THIRD PARTY LICENCES.
  13. * ALLWINNER SHALL HAVE NO WARRANTY, INDEMNITY OR OTHER OBLIGATIONS WITH RESPECT TO MATTERS
  14. * COVERED UNDER ANY REQUIRED THIRD PARTY LICENSE.
  15. * YOU ARE SOLELY RESPONSIBLE FOR YOUR USAGE OF THIRD PARTY’S TECHNOLOGY.
  16. *
  17. *
  18. * THIS SOFTWARE IS PROVIDED BY ALLWINNER"AS IS" AND TO THE MAXIMUM EXTENT
  19. * PERMITTED BY LAW, ALLWINNER EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND,
  20. * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION REGARDING
  21. * THE TITLE, NON-INFRINGEMENT, ACCURACY, CONDITION, COMPLETENESS, PERFORMANCE
  22. * OR MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  23. * IN NO EVENT SHALL ALLWINNER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  24. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  25. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  26. * LOSS OF USE, DATA, OR PROFITS, OR BUSINESS INTERRUPTION)
  27. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  28. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  29. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  30. * OF THE POSSIBILITY OF SUCH DAMAGE.
  31. */
  32. #ifndef __SUNXI_MAD_H_
  33. #define __SUNXI_MAD_H_
  34. #include <aw_common.h>
  35. #include <hal_clk.h>
  36. #include <hal_dma.h>
  37. #include <snd_core.h>
  38. #include <snd_pcm.h>
  39. #include <snd_io.h>
  40. #include "sunxi-pcm.h"
  41. /* memory mapping */
  42. #define MAD_BASE SUNXI_MAD_PBASE
  43. #define MAD_SRAM_DMA_SRC_ADDR SUNXI_MAD_SRAM_PBASE
  44. #ifdef CONFIG_ARCH_SUN8IW18P1
  45. /* SUN8IW18P1 should not be setup. */
  46. #undef MAD_CLK_ALWAYS_ON
  47. //#undef SUNXI_LPSD_CLK_ALWAYS_ON
  48. #define SUNXI_LPSD_CLK_ALWAYS_ON
  49. #undef SUNXI_MAD_DATA_INT_USE
  50. //#define SUNXI_MAD_DATA_INT_USE
  51. #define SUNXI_MAD_SRAM_SUSPEND_RESET
  52. /* 128k bytes */
  53. #define MAD_SRAM_SIZE_VALUE 0x80
  54. #endif
  55. /*memory mapping*/
  56. #ifndef MAD_BASE
  57. #define MAD_BASE (0x05400000)
  58. #endif
  59. #ifndef MAD_SRAM_DMA_SRC_ADDR
  60. #define MAD_SRAM_DMA_SRC_ADDR (0x05480000)
  61. #endif
  62. /* 128k bytes */
  63. #ifndef MAD_SRAM_SIZE_VALUE
  64. #define MAD_SRAM_SIZE_VALUE 0x80
  65. #endif
  66. enum mad_sram_bmode {
  67. MAD_SRAM_BMODE_NORMAL = 0,
  68. MAD_SRAM_BMODE_BOOT = 1,
  69. };
  70. enum mad_path_sel {
  71. MAD_PATH_NONE = 0,
  72. MAD_PATH_I2S0 = 1,
  73. MAD_PATH_CODEC = 2,
  74. MAD_PATH_DMIC = 3,
  75. MAD_PATH_I2S1 = 4,
  76. MAD_PATH_I2S2 = 5,
  77. };
  78. #ifdef CONFIG_ARCH_SUN8IW18P1
  79. #undef SUNXI_MAD_DATA_INT_USE
  80. #endif
  81. #define EVT_MAX_SIZE 256
  82. #define SUNXI_NETLINK_MAD 30
  83. /*------------------MAD register definition--------------------*/
  84. #define SUNXI_MAD_CTRL 0x00
  85. #define SUNXI_MAD_SRAM_POINT 0x04
  86. #define SUNXI_MAD_SRAM_SIZE 0x08
  87. #define SUNXI_MAD_SRAM_RD_POINT 0x0C
  88. #define SUNXI_MAD_RD_SIZE 0x10
  89. #define SUNXI_MAD_SRAM_STORE_TH 0x14
  90. #define SUNXI_MAD_SRAM_AHB1_TX_TH 0x18
  91. #define SUNXI_MAD_SRAM_AHB1_RX_TH 0x1C
  92. #define SUNXI_MAD_SRAM_WAKE_BACK_DATA 0x20
  93. #define SUNXI_MAD_AD_PATH_SEL 0x24
  94. #define SUNXI_MAD_LPSD_AD_SYNC_FC 0x28
  95. #define SUNXI_MAD_LPSD_TH 0x2C
  96. #define SUNXI_MAD_LPSD_RRUN 0x30
  97. #define SUNXI_MAD_LPSD_RSTOP 0x34
  98. #define SUNXI_MAD_LPSD_ECNT 0x38
  99. #define SUNXI_MAD_SRAM_CH_MASK 0x3C
  100. #define SUNXI_MAD_LPSD_CH_MASK 0x40
  101. #define SUNXI_MAD_SRAM_SEC_REGION_REG 0x44
  102. #define SUNXI_MAD_SRAM_PRE_DSIZE 0x48
  103. #define SUNXI_MAD_DMA_TF_SIZE 0x4C
  104. #define SUNXI_MAD_DMA_TF_LAST_SIZE 0x50
  105. #define SUNXI_MAD_INT_ST_CLR 0x60
  106. #define SUNXI_MAD_INT_MASK 0x64
  107. #define SUNXI_MAD_STA 0x68
  108. #define SUNXI_MAD_DEBUG 0x6C
  109. /*SUNXI_MAD_CTRL: 0x00*/
  110. #define AUDIO_DATA_SYNC_FRC 7
  111. #define SRAM_RST 6
  112. #define DMA_TYPE 5
  113. #define DMA_EN 4
  114. #define CPUS_RD_DONE 3
  115. #define GO_ON_SLEEP 2
  116. #define KEY_WORD_OK 1
  117. #define MAD_EN 0
  118. /* DMA type*/
  119. #define DMA_TYPE_MASK 0x1
  120. #define DMA_TYPE_IO 0x1
  121. #define DMA_TYPE_MEM 0x0
  122. /*SUNXI_MAD_SRAM_POINT: 0x04*/
  123. #define MAD_SRAM_PONT 0
  124. /*SUNXI_MAD_SRAM_SIZE: 0x08*/
  125. #define MAD_SRAM_SIZE 0
  126. /*SUNXI_MAD_SRAM_RD_POINT: 0x0C*/
  127. #define MAD_SRAM_RD_POINT 0
  128. /*SUNXI_MAD_SRAM_RD_SIZE(unit: half word): 0x10*/
  129. #define MAD_SRAM_RD_SIZE 0
  130. /*SUNXI_MAD_SRAM_STORE_TH(unit: half word): 0x14*/
  131. #define MAD_SRAM_STORE_TH 0
  132. /*SUNXI_MAD_SRAM_AHB1_TX_TH(unit: byte): 0x18*/
  133. #define MAD_SRAM_AHB1_TX_TH 0
  134. /*SUNXI_MAD_SRAM_AHB1_RX_TH(unit: byte): 0x1C*/
  135. #define MAD_SRAM_AHB1_RX_TH 0
  136. /*SUNXI_MAD_SRAM_WAKE_BACK_DATA(unit: frame): 0x20*/
  137. #define MAD_SRAM_WAKE_BACK_DATA 0
  138. /*SUNXI_MAD_AD_PATH_SEL: 0x24*/
  139. #define MAD_AD_PATH_SEL 0
  140. #define MAD_AD_PATH_SEL_MASK 0xF
  141. /*MAD audio src sel*/
  142. #define MAD_AD_PATH_NO_SRC 0x0
  143. #define MAD_AD_PATH_I2S0_SRC 0x1
  144. #define MAD_AD_PATH_CODEC_SRC 0x2
  145. #define MAD_AD_PATH_DMIC_SRC 0x3
  146. #define MAD_AD_PATH_I2S1_SRC 0x4
  147. #define MAD_AD_PATH_I2S2_SRC 0x5
  148. /*SUNXI_MAD_LPSD_AD_SYNC_FC: 0x28*/
  149. #define MAD_LPSD_AD_SYNC_FC 0
  150. #define MAD_LPSD_AD_SYNC_FC_DEF 0X20
  151. /*SUNXI_MAD_LPSD_TH: 0x2C*/
  152. #define MAD_LPSD_TH 0
  153. /*SUNXI_MAD_LPSD_RRUN: 0x30*/
  154. #define MAD_LPSD_RRUN 0
  155. /*SUNXI_MAD_LPSD_RSTOP: 0x34*/
  156. #define MAD_LPSD_RSTOP 0
  157. /*SUNXI_MAD_LPSD_ECNT: 0x38*/
  158. #define MAD_LPSD_ECNT 0
  159. /*SUNXI_MAD_SRAM_CH_MASK: 0x3C*/
  160. #define MAD_CH_CHANGE_EN 30
  161. #define MAD_CH_COM_NUM 26
  162. #define MAD_AD_SRC_CH_NUM 21
  163. #define MAD_SRAM_CH_NUM 16
  164. #define MAD_SRAM_CH_MASK 0
  165. #define MAD_SRAM_CH_NUM_MASK 0x1F
  166. /*MAD channel change sel*/
  167. #define MAD_CH_COM_NUM_MASK 0xF
  168. #define MAD_CH_COM_NON 0x0
  169. #define MAD_CH_COM_2CH_TO_4CH 0x1
  170. #define MAD_CH_COM_2CH_TO_6CH 0x2
  171. #define MAD_CH_COM_2CH_TO_8CH 0x3
  172. #define MAD_CH_COM_4CH_TO_6CH 0x4
  173. #define MAD_CH_COM_4CH_TO_8CH 0x5
  174. /*SUNXI_MAD_LPSD_CH_MASK: 0x40*/
  175. #define MAD_LPSD_DCBLOCK_EN 20
  176. #define MAD_LPSD_CH_NUM 16
  177. #define MAD_LPSD_CH_MASK 0
  178. /*LPSD receive 0/1 audio channel mask*/
  179. #define MAD_LPSD_CH_NUM_MASK 0xF
  180. /*LPSD AUDIO channel num sel*/
  181. #define MAD_LPSD_CH_NUM_NON 0x0
  182. #define MAD_LPSD_CH_NUM_1CH 0x1
  183. /*SUNXI_MAD_SRAM_SEC_REGION: 0x44*/
  184. #define MAD_SRAM_SEC_REGION 0
  185. /*SUNXI_MAD_SRAM_PRE_DATA_SIZE(unit: half word): 0x48*/
  186. #define MAD_SRAM_PRE_DATA_SIZE 0
  187. /*SUNXI_MAD_DMA_TF_SIZE: 0x4C*/
  188. #define MAD_DMA_TF_SIZE 0
  189. /*SUNXI_MAD_DMA_TF_LAST_SIZE: 0x50*/
  190. #define MAD_DMA_TF_LAST_SIZE 0
  191. /*SUNXI_MAD_INT_ST_CLR: 0x60*/
  192. #define DATA_REQ_INT 1
  193. #define WAKE_INT 0
  194. /*SUNXI_MAD_INT_MASK: 0x64*/
  195. #define DATA_REQ_INT_MASK 1
  196. #define MAD_REQ_INT_MASK 0
  197. /*SUNXI_MAD_STATE_REG: 0x68*/
  198. #define MAD_LPSD_STAT 8
  199. #define MAD_STATE 4
  200. #define MAD_SRAM_FULL 2
  201. #define MAD_SRAM_EMPTY 1
  202. #define MAD_RUN 0
  203. /*MAD STATE(read only)*/
  204. #define MAD_STATE_IDLE 0x0
  205. #define MAD_STATE_WAIT 0x1
  206. #define MAD_STATE_RUN 0x2
  207. #define MAD_STATE_NORMAL 0x4
  208. /*SUNXI_MAD_DEBUG: 0x6C*/
  209. #define MAD_CFG_ERR 4
  210. #define MAD_SRAM_FULL_ERR 3
  211. #define MAD_SRAM_EMPTY_ERR 2
  212. #define DATA_SRAM_ADDR_ERR 1
  213. #define MAD_SRAM_SEC_ERR 0
  214. /*MAD_CFG_ERR mask*/
  215. #define MAD_CFG_ERR_MASK 0x3
  216. /* for mad clk*/
  217. #define MAD_SRAM_BMODE_CTRL 24
  218. #define SRAM_BMODE_CTRL_REG 0x3000004
  219. enum sunxi_mad_standby_debug_flag {
  220. SUNXI_MAD_DEBUG_STANDBY_NULL = 0,
  221. SUNXI_MAD_DEBUG_STANDBY_SUSPEND = 1,
  222. SUNXI_MAD_DEBUG_STANDBY_RESUME = 2,
  223. };
  224. enum sunxi_mad_irq_work_flag {
  225. SUNXI_MAD_NULL_IRQ_WORK = 0,
  226. SUNXI_MAD_LPSD_IRQ_WORK = 1,
  227. SUNXI_MAD_DATA_IRQ_WORK = 2,
  228. };
  229. enum sunxi_mad_sram_reset_flag {
  230. SUNXI_MAD_SRAM_RESET_IDLE = 0,
  231. SUNXI_MAD_SRAM_RESET_START = 1,
  232. SUNXI_MAD_SRAM_RESET_END = 2,
  233. };
  234. enum sunxi_mad_status {
  235. SUNXI_MAD_OPEN = 0,
  236. SUNXI_MAD_PARAMS = 1,
  237. SUNXI_MAD_SUSPEND = 2,
  238. SUNXI_MAD_RESUME = 3,
  239. SUNXI_MAD_CLOSE = 4,
  240. };
  241. enum sunxi_mad_dma_type {
  242. SUNXI_MAD_DMA_MEM = 0,
  243. SUNXI_MAD_DMA_IO = 1,
  244. };
  245. enum sunxi_mad_standby_flag {
  246. /* bit0 for sram IO type when standby */
  247. SUNXI_MAD_STANDBY_SRAM_MEM = 0x1,
  248. };
  249. enum sunxi_mad_wakeup_flag {
  250. /* bit0 for wakeup source */
  251. SUNXI_MAD_WAKEUP_OFF = 0x0,
  252. SUNXI_MAD_WAKEUP_ON = 0x1,
  253. /* bit1 for wakeup use or no */
  254. SUNXI_MAD_WAKEUP_USE = 0x2,
  255. /* bit2 for lpsd wakeup */
  256. SUNXI_MAD_WAKEUP_LPSD_IRQ = 0x4,
  257. /* bit3 for mad irq wakeup */
  258. SUNXI_MAD_WAKEUP_MAD_IRQ = 0x8,
  259. /* bit4 for other irq wakeup */
  260. SUNXI_MAD_WAKEUP_OTHER = 0x10,
  261. };
  262. struct sunxi_mad_priv {
  263. struct sunxi_mad_info *sunxi_mad;
  264. unsigned int mad_bind;
  265. unsigned int mad_suspend;
  266. /* mad params */
  267. unsigned int sample_rate;
  268. unsigned int lpsd_chan_sel;
  269. unsigned int standby_chan_sel;
  270. unsigned int audio_src_chan_num;
  271. };
  272. struct sunxi_mad_info {
  273. hal_clk_id_t mad_clk;
  274. hal_clk_id_t mad_cfg_clk;
  275. hal_clk_id_t mad_ad_clk;
  276. hal_clk_id_t lpsd_clk;
  277. hal_clk_id_t pll_clk;
  278. hal_clk_id_t hosc_clk;
  279. freert_spinlock_t resume_spin;
  280. unsigned int pll_audio_src_used;
  281. unsigned int hosc_src_used;
  282. void *mem_base;
  283. unsigned int mad_irq;
  284. unsigned int lpsd_irq;
  285. QueueHandle_t irq_queue;
  286. TaskHandle_t pxMadIrqTask;
  287. unsigned int sram_rd_point;
  288. unsigned int audio_src_path;
  289. unsigned int mad_bind;
  290. int status;
  291. unsigned int wakeup_flag;
  292. unsigned int suspend_flag;
  293. unsigned int sram_reset_flag;
  294. int standby_sram_type;
  295. int wakeup_irq_en;
  296. unsigned int ref_count;
  297. struct sunxi_mad_priv mad_priv;
  298. void *private_data;
  299. };
  300. int sunxi_mad_sram_set_reset_flag(enum sunxi_mad_sram_reset_flag reset_flag);
  301. enum sunxi_mad_sram_reset_flag sunxi_mad_sram_get_reset_flag(void);
  302. int sunxi_mad_sram_wait_reset_flag(enum sunxi_mad_sram_reset_flag reset_flag,
  303. unsigned int time_out_msecond);
  304. void sunxi_mad_sram_chan_params(unsigned int mad_channels);
  305. struct sunxi_mad_info *sunxi_mad_get_mad_info(void);
  306. void sunxi_mad_clk_enable(bool val);
  307. void sunxi_mad_ad_clk_enable(bool val);
  308. void sunxi_mad_cfg_clk_enable(bool val);
  309. void sunxi_mad_module_clk_enable(bool val);
  310. void sunxi_lpsd_clk_enable(bool val);
  311. /* for mad interrupt */
  312. void sunxi_lpsd_int_stat_clr(void);
  313. void sunxi_mad_set_lpsd_req(bool enable);
  314. void sunxi_mad_set_data_req(bool enable);
  315. /* for mad init */
  316. int sunxi_mad_open(void);
  317. int sunxi_mad_close(void);
  318. void sunxi_mad_sram_init(void);
  319. void sunxi_mad_lpsd_init(void);
  320. void sunxi_sram_ahb1_threshole_init(void);
  321. void sunxi_mad_standby_chan_sel(unsigned int num);
  322. void sunxi_lpsd_chan_sel(unsigned int num);
  323. void sunxi_mad_audio_src_chan_num(unsigned int num);
  324. void sunxi_sram_dma_config(struct sunxi_dma_params *capture_dma_param);
  325. int sunxi_mad_hw_params(unsigned int mad_channels, unsigned int sample_rate);
  326. int sunxi_mad_audio_source_sel(unsigned int path_sel, unsigned int enable);
  327. int sunxi_mad_suspend_external(void);
  328. int sunxi_mad_resume_external(void);
  329. void sunxi_mad_dma_enable(bool enable);
  330. void sunxi_mad_dma_type(enum sunxi_mad_dma_type dma_type);
  331. int sunxi_mad_enable(bool enable);
  332. void sunxi_mad_set_go_on_sleep(bool enable);
  333. void sunxi_mad_sram_set_reset_bit(void);
  334. #ifdef CONFIG_SUNXI_MAD_DEBUG
  335. int sunxi_mad_schd_timeout(SemaphoreHandle_t semaphore, long ms);
  336. void sunxi_mad_schd_wakeup(SemaphoreHandle_t semaphore);
  337. #endif
  338. /* for probe mad module */
  339. int sunxi_mad_platform_probe(struct snd_platform *platform);
  340. int sunxi_mad_platform_remove(struct snd_platform *platform);
  341. #endif /* SUNXI_MAD_H */