ark1668e_i2s.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. /*
  2. * ark1668e_i2s.c -- ALSA SoC Audio Layer
  3. */
  4. #include <linux/init.h>
  5. #include <linux/module.h>
  6. #include <linux/io.h>
  7. #include <linux/slab.h>
  8. #include <linux/delay.h>
  9. #include <sound/core.h>
  10. #include <sound/pcm.h>
  11. #include <sound/pcm_params.h>
  12. #include <sound/soc.h>
  13. #include <sound/dmaengine_pcm.h>
  14. #include <linux/clk.h>
  15. #include "ark1668e_i2s.h"
  16. #define DRV_NAME "ark1668e-i2s"
  17. //struct ark1668e_i2s1_data_in i2s_data;
  18. int master_status = SLAVE_ON;////only for junjie
  19. struct ark1668e_i2s_dev {
  20. struct device *dev;
  21. void __iomem *base; //i2s_base
  22. void __iomem *sys_base; //sys_base
  23. struct clk *clk;
  24. int irq;
  25. u32 nco_reg;
  26. struct snd_dmaengine_dai_dma_data capture_dma_data;
  27. struct snd_dmaengine_dai_dma_data playback_dma_data;
  28. int master;
  29. u32 fmt;
  30. int extdac;
  31. int extadc;
  32. };
  33. static void i2s_poweron(struct ark1668e_i2s_dev *i2s)
  34. {
  35. return;
  36. }
  37. #define ARK1668E_SYS_BASE 0xe4900000
  38. static int ark1668e_i2s_startup(
  39. struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
  40. {
  41. struct ark1668e_i2s_dev *i2s = snd_soc_dai_get_drvdata(dai);
  42. unsigned int sacr0 = 0;
  43. unsigned int val;
  44. // void __iomem *Sys_base;
  45. // Sys_base = ioremap(SYS_BASE, 0x1000);
  46. // if(!Sys_base)
  47. // goto unmap_sysreg;
  48. /*external codecs:ark1668e-i2s-Master*/
  49. //unsigned int i2s_master = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS;
  50. //snd_soc_dai_set_fmt(dai, i2s_master);
  51. /*default:internal codec:ark1668e-i2s-slave*/
  52. if(!i2s->extdac){
  53. unsigned int i2s_slave = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM;
  54. snd_soc_dai_set_fmt(dai, i2s_slave);
  55. }
  56. /* reset */
  57. writel(SACR0_RST, i2s->base + I2S_SACR0);
  58. udelay(1);
  59. writel(0, i2s->base + I2S_SACR0);
  60. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
  61. sacr0 = SACR0_TLFIRST | SACR0_CH_LOCK | SACR0_TFTH(15) | SACR0_TDMAEN;
  62. #ifdef CONFIG_ARK1668E_I2S_FULL_DUPLEX_MODE
  63. sacr0 |= SACR0_RLFIRST | SACR0_CH_LOCK | SACR0_RFTH(16) | SACR0_RDMAEN;//add 20211120
  64. #endif
  65. if (i2s->master)
  66. sacr0 |= SACR0_BCKD | SACR0_SYNCD;//ark1668e-i2s:Master
  67. else
  68. sacr0 &= ~(SACR0_BCKD | SACR0_SYNCD);//ark1668e-i2s:slave
  69. writel(sacr0, i2s->base + I2S_SACR0);
  70. writel(SAIMR_TUR, i2s->base + I2S_SAIMR);
  71. #ifdef CONFIG_ARK1668E_I2S_FULL_DUPLEX_MODE
  72. writel(SAIMR_ROR, i2s->base + I2S_SAIMR);//add 20211120
  73. #endif
  74. writel(0x7f, i2s->base + I2S_SAICR);
  75. writel(0, i2s->base + I2S_SAICR);
  76. if(i2s->extdac){
  77. //printk("----->external-dac<-----\n");
  78. val = readl(i2s->sys_base+ rSYS_DEVICE_CLK_CFG3);
  79. val &= ~(0xff<<1);
  80. val |=(0x1<<2)|(0x1<<6)|(0x1<<7);
  81. //val &= ~(0xff<<0);
  82. //val |=(0x1<<2);
  83. //val &= ~(0x1<<3);
  84. writel(val,i2s->sys_base +rSYS_DEVICE_CLK_CFG3);
  85. val = readl(i2s->sys_base + rSYS_PLL_RFCK_CTL);
  86. val |=(0x1<<17);//IntI2S1Clk_pre
  87. writel(val, i2s->sys_base + rSYS_PLL_RFCK_CTL);
  88. val = readl(i2s->sys_base + rSYS_PAD_CTRL0F);
  89. val &= ~(0x1<<12);//0:i2s1_sadata_out 1: 0
  90. val |= (0x1<<15)|(0x1<<14)|(0x1<<13)|(0x1<<11)|(0x0<<12);
  91. val &= ~(0x1<<29);
  92. writel(val, i2s->sys_base + rSYS_PAD_CTRL0F);
  93. }
  94. } else if(substream->stream == SNDRV_PCM_STREAM_CAPTURE){
  95. #ifdef CONFIG_ARK1668E_I2S_FULL_DUPLEX_MODE
  96. sacr0 = SACR0_TLFIRST | SACR0_CH_LOCK | SACR0_TFTH(15) | SACR0_TDMAEN;//add 20211120
  97. #endif
  98. sacr0 |= SACR0_RLFIRST | SACR0_CH_LOCK | SACR0_RFTH(16) | SACR0_RDMAEN;
  99. if (i2s->master)
  100. sacr0 |= SACR0_BCKD | SACR0_SYNCD;//ark1668e-i2s:Master
  101. else
  102. sacr0 &= ~(SACR0_BCKD | SACR0_SYNCD);//ark1668e-i2s:slave
  103. writel(sacr0, i2s->base + I2S_SACR0);
  104. #ifdef CONFIG_ARK1668E_I2S_FULL_DUPLEX_MODE
  105. writel(SAIMR_TUR, i2s->base + I2S_SAIMR);//add 20211120
  106. #endif
  107. writel(SAIMR_ROR, i2s->base + I2S_SAIMR);
  108. writel(0x7f, i2s->base + I2S_SAICR);
  109. writel(0, i2s->base + I2S_SAICR);
  110. ///////////////
  111. if(i2s->extadc)
  112. {
  113. //printk("----->external-adc<-----\n");
  114. val = readl(i2s->sys_base + rSYS_DEVICE_CLK_CFG3);
  115. val &= ~(0xff<<1);
  116. val |= (1<<6);//I2S1CLK
  117. val |=(0x1<<0)|(1<<6)|(0x1<<7)|(0x1<<2);
  118. writel(val, i2s->sys_base + rSYS_DEVICE_CLK_CFG3);
  119. val = readl(i2s->sys_base + rSYS_PLL_RFCK_CTL);
  120. //val &= ~(1<<16);//IntI2SClk_pre
  121. val |=(0x1<<17);//IntI2S1Clk_pre
  122. writel(val, i2s->sys_base + rSYS_PLL_RFCK_CTL);
  123. val = readl(i2s->sys_base + rSYS_PAD_CTRL0F);
  124. val &= ~(1<<28);
  125. val |= (0xf<<8);
  126. writel(val, i2s->sys_base + rSYS_PAD_CTRL0F);
  127. }
  128. }
  129. #ifdef CONFIG_ARK1668E_I2S_FULL_DUPLEX_MODE
  130. //i2s controller
  131. val = readl(i2s->base + I2S_SACR0);
  132. //val |=((1<<2)|(1<<1));//ark1668e-i2s:Master
  133. val |=(5<<8)|1;
  134. writel(val, i2s->base + I2S_SACR0);
  135. val = readl(i2s->base + I2S_SACR0);
  136. val &= ~(0x1f<<8);
  137. val |= (0xf<<8);//|(0x1<<23);
  138. //val |= (0x1<<5);
  139. writel(val, i2s->base + I2S_SACR0);
  140. val = readl(i2s->base + I2S_SACR1);
  141. val &= ~SACR1_DISABLE_REPLAYING;
  142. val &= ~SACR1_DISABLE_RECORD;
  143. writel(val, i2s->base + I2S_SACR1);
  144. //val = readl(i2s->base + I2S_SACR0);
  145. //val |= (0x1 << 3)|(0x1<<6);//DMA
  146. //writel(val, i2s->base + I2S_SACR0);
  147. val = readl(i2s->base + I2S_SAICR);
  148. val = 0xFFFFFFFF;
  149. writel(val, i2s->base + I2S_SAICR);
  150. val = readl(i2s->base + I2S_SAICR);
  151. val = 0;
  152. writel(val, i2s->base + I2S_SAICR);
  153. #endif
  154. udelay(1);
  155. sacr0 &= ~SACR0_CH_LOCK;
  156. writel(sacr0, i2s->base + I2S_SACR0);
  157. //unmap_sysreg:
  158. // iounmap(Sys_base);
  159. return 0;
  160. }
  161. static int ark1668e_i2s_hw_params(
  162. struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params,
  163. struct snd_soc_dai *dai)
  164. {
  165. struct ark1668e_i2s_dev *i2s = snd_soc_dai_get_drvdata(dai);
  166. u32 val;
  167. #ifndef BOARD_ARK1668E_FPGA
  168. u32 rate = params_rate(params);
  169. u32 step = 256 * 2, modulo;
  170. u32 freq;
  171. void *sysreg;
  172. if (!i2s->nco_reg)
  173. return 0;
  174. /* mclk = rate * 256, mclk = freq * step / (2 * modulo) */
  175. freq = clk_get_rate(i2s->clk);
  176. modulo = freq / rate;
  177. val = (step << 16) | modulo;
  178. sysreg = ioremap(i2s->nco_reg, 0x10);
  179. if (sysreg) {
  180. writel(val, sysreg);
  181. iounmap(sysreg);
  182. }
  183. #endif
  184. val = readl(i2s->base + I2S_SACR0);
  185. switch (params_format(params)) {
  186. case SNDRV_PCM_FORMAT_S16_LE:
  187. val &= ~SACR0_32BIT_MODE;
  188. break;
  189. case SNDRV_PCM_FORMAT_S24_LE:
  190. case SNDRV_PCM_FORMAT_S32_LE:
  191. val |= SACR0_32BIT_MODE;
  192. val &= ~(SACR0_RFTH_MASK | SACR0_TFTH_MASK);
  193. val |= SACR0_TFTH(7) | SACR0_RFTH(8);
  194. break;
  195. default:
  196. return -EINVAL;
  197. }
  198. if (params_channels(params) == 1)
  199. val |= SACR0_MOLO_MODE;
  200. writel(val, i2s->base + I2S_SACR0);
  201. return 0;
  202. }
  203. static int ark1668e_i2s_trigger(
  204. struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai)
  205. {
  206. struct ark1668e_i2s_dev *i2s = snd_soc_dai_get_drvdata(dai);
  207. int ret = 0;
  208. switch (cmd) {
  209. case SNDRV_PCM_TRIGGER_START:
  210. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
  211. writel(readl(i2s->base + I2S_SACR1) & ~SACR1_DRPL, i2s->base + I2S_SACR1);
  212. else
  213. writel(readl(i2s->base + I2S_SACR1) & ~SACR1_DREC, i2s->base + I2S_SACR1);
  214. writel(readl(i2s->base + I2S_SACR0) | SACR0_ENB, i2s->base + I2S_SACR0);
  215. break;
  216. case SNDRV_PCM_TRIGGER_STOP:
  217. /* if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
  218. writel(readl(i2s->base + I2S_SACR1) | SACR1_DRPL, i2s->base + I2S_SACR1);
  219. else
  220. writel(readl(i2s->base + I2S_SACR1) | SACR1_DREC, i2s->base + I2S_SACR1);
  221. writel(readl(i2s->base + I2S_SACR0) & ~SACR0_ENB, i2s->base + I2S_SACR0); */
  222. break;
  223. case SNDRV_PCM_TRIGGER_RESUME:
  224. case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
  225. case SNDRV_PCM_TRIGGER_SUSPEND:
  226. case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
  227. break;
  228. default:
  229. ret = -EINVAL;
  230. }
  231. return ret;
  232. }
  233. static int ark1668e_i2s_set_fmt(
  234. struct snd_soc_dai *dai, unsigned int fmt)
  235. {
  236. struct ark1668e_i2s_dev *i2s =snd_soc_dai_get_drvdata(dai);
  237. /* interface format */
  238. switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
  239. case SND_SOC_DAIFMT_I2S:
  240. i2s->fmt = 0;
  241. break;
  242. }
  243. switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
  244. case SND_SOC_DAIFMT_CBS_CFS:
  245. dev_dbg(i2s->dev, "i2s master.\n");
  246. i2s->master = 1;
  247. break;
  248. case SND_SOC_DAIFMT_CBM_CFM:
  249. dev_dbg(i2s->dev, "i2s slave.\n");
  250. i2s->master = 0;
  251. break;
  252. default:
  253. break;
  254. }
  255. return 0;
  256. }
  257. static int ark1668e_i2s_probe(struct snd_soc_dai *dai)
  258. {
  259. struct ark1668e_i2s_dev *i2s = snd_soc_dai_get_drvdata(dai);
  260. dai->capture_dma_data = &i2s->capture_dma_data;
  261. dai->playback_dma_data = &i2s->playback_dma_data;
  262. return 0;
  263. }
  264. /* I2S supported rate and format */
  265. #define ARK1668E_I2S_RATES \
  266. (SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | \
  267. SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | \
  268. SNDRV_PCM_RATE_64000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | \
  269. SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_8000)
  270. static const struct snd_soc_dai_ops ark1668e_i2s_dai_ops = {
  271. .startup = ark1668e_i2s_startup,
  272. .trigger = ark1668e_i2s_trigger,
  273. .hw_params = ark1668e_i2s_hw_params,
  274. .set_fmt = ark1668e_i2s_set_fmt,
  275. };
  276. static struct snd_soc_dai_driver ark1668e_i2s_dai = {
  277. .probe = ark1668e_i2s_probe,
  278. .playback = {
  279. .channels_min = 1,
  280. .channels_max = 2,
  281. .rates = ARK1668E_I2S_RATES,
  282. .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE |
  283. SNDRV_PCM_FMTBIT_S32_LE,},
  284. .capture = {
  285. .channels_min = 2,
  286. .channels_max = 2,
  287. .rates = ARK1668E_I2S_RATES,
  288. .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE |
  289. SNDRV_PCM_FMTBIT_S32_LE,},
  290. .ops = &ark1668e_i2s_dai_ops,
  291. .symmetric_rates = 1,
  292. };
  293. static struct snd_pcm_hardware ark1668e_pcm_hardware = {
  294. .info = (SNDRV_PCM_INFO_MMAP |
  295. SNDRV_PCM_INFO_MMAP_VALID |
  296. SNDRV_PCM_INFO_PAUSE |
  297. SNDRV_PCM_INFO_RESUME |
  298. SNDRV_PCM_INFO_INTERLEAVED |
  299. SNDRV_PCM_INFO_BLOCK_TRANSFER),
  300. .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE |
  301. SNDRV_PCM_FMTBIT_S32_LE,
  302. .rates = (SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 |
  303. SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 |
  304. SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |
  305. SNDRV_PCM_RATE_64000 | SNDRV_PCM_RATE_88200 |
  306. SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 |
  307. SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_8000),
  308. .rate_min = 8000,
  309. .rate_max = 192000,
  310. .channels_min = 1,
  311. .channels_max = 2,
  312. .buffer_bytes_max = 64 * 65536,
  313. .period_bytes_min = 64,
  314. .period_bytes_max = 65536,
  315. .periods_min = 1,
  316. .periods_max = 64,
  317. };
  318. static const struct snd_dmaengine_pcm_config
  319. ark1668e_i2s_dmaengine_pcm_config = {
  320. .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config,
  321. .pcm_hardware = &ark1668e_pcm_hardware,
  322. };
  323. static const struct snd_soc_component_driver ark1668e_i2s_component = {
  324. .name = DRV_NAME,
  325. };
  326. static irqreturn_t ark1668e_i2s_interrupt(int irq, void *dev_id)
  327. {
  328. struct ark1668e_i2s_dev *i2s = dev_id;
  329. u32 status;
  330. status = readl(i2s->base + I2S_SASR0);
  331. dev_dbg(i2s->dev, "ark1668e_i2s_interrupt status=0x%x.0x%x.\n", status, readl(i2s->base + I2S_SACR0));
  332. writel(status, i2s->base + I2S_SAICR);
  333. writel(0, i2s->base + I2S_SAICR);
  334. return IRQ_HANDLED;
  335. }
  336. static int ark1668e_i2s_drv_probe(struct platform_device *pdev)
  337. {
  338. struct ark1668e_i2s_dev *i2s;
  339. struct resource *res;
  340. u32 val;
  341. int ret = 0;
  342. struct resource *map = NULL;
  343. i2s = devm_kzalloc(&pdev->dev, sizeof(struct ark1668e_i2s_dev), GFP_KERNEL);
  344. if (!i2s)
  345. return -ENOMEM;
  346. i2s->dev = &pdev->dev;
  347. //i2s resource
  348. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  349. i2s->base = devm_ioremap_resource(&pdev->dev, res);
  350. if (IS_ERR(i2s->base))
  351. return PTR_ERR(i2s->base);
  352. //sys resource
  353. map = platform_get_resource(pdev, IORESOURCE_MEM, 1);
  354. //printk("==============[resource_size = 0x%08x]\n",resource_size(res));
  355. i2s->sys_base = ioremap(map->start, resource_size(map));
  356. if (IS_ERR(i2s->sys_base))
  357. return PTR_ERR(i2s->sys_base);
  358. if (!of_property_read_u32(pdev->dev.of_node, "nco-reg", &val))
  359. i2s->nco_reg = val;
  360. if (of_property_read_bool(pdev->dev.of_node, "external-adc"))
  361. i2s->extadc = 1;
  362. //printk(">>>>>>>>>>>>>>>>>>i2s->extadc = %d \n",i2s->extadc);
  363. if (of_property_read_bool(pdev->dev.of_node, "external-dac"))
  364. i2s->extdac = 1;
  365. //printk(">>>>>>>>>>>>>>>>>>i2s->extdac = %d \n",i2s->extdac);
  366. i2s->clk = of_clk_get(pdev->dev.of_node, 0);
  367. if (IS_ERR(i2s->clk))
  368. return PTR_ERR(i2s->clk);
  369. i2s->irq = platform_get_irq(pdev, 0);
  370. if (i2s->irq < 0)
  371. return i2s->irq;
  372. ret = devm_request_irq(i2s->dev, i2s->irq, ark1668e_i2s_interrupt,
  373. IRQF_SHARED, KBUILD_MODNAME, i2s);
  374. if (ret)
  375. return ret;
  376. /* DMA parameters */
  377. i2s->playback_dma_data.addr = res->start + I2S_SADR;
  378. i2s->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
  379. i2s->playback_dma_data.maxburst = 16;
  380. i2s->capture_dma_data.addr = res->start + I2S_SADR;
  381. i2s->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
  382. i2s->capture_dma_data.maxburst = 16;
  383. dev_set_drvdata(&pdev->dev, i2s);
  384. ret = devm_snd_soc_register_component(&pdev->dev,
  385. &ark1668e_i2s_component,
  386. &ark1668e_i2s_dai, 1);
  387. if (ret) {
  388. dev_err(&pdev->dev, "Could not register DAI\n");
  389. return ret;
  390. }
  391. i2s_poweron(i2s);
  392. ret = devm_snd_dmaengine_pcm_register(&pdev->dev,
  393. &ark1668e_i2s_dmaengine_pcm_config,
  394. 0);
  395. if (ret) {
  396. dev_err(&pdev->dev, "Could not register PCM\n");
  397. return ret;
  398. }
  399. return 0;
  400. }
  401. static const struct of_device_id ark1668e_i2s_match[] = {
  402. { .compatible = "arkmicro,ark1668e-i2s", },
  403. {},
  404. };
  405. static struct platform_driver ark1668e_i2s_driver = {
  406. .probe = ark1668e_i2s_drv_probe,
  407. .driver = {
  408. .name = DRV_NAME,
  409. .of_match_table = of_match_ptr(ark1668e_i2s_match),
  410. },
  411. };
  412. module_platform_driver(ark1668e_i2s_driver);
  413. MODULE_DESCRIPTION("ARK I2S SoC Interface");
  414. MODULE_ALIAS("platform:" DRV_NAME);
  415. MODULE_AUTHOR("Sim");
  416. MODULE_LICENSE("GPL v2");