davinci-mcasp.c 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403
  1. /*
  2. * ALSA SoC McASP Audio Layer for TI DAVINCI processor
  3. *
  4. * Multi-channel Audio Serial Port Driver
  5. *
  6. * Author: Nirmal Pandey <n-pandey@ti.com>,
  7. * Suresh Rajashekara <suresh.r@ti.com>
  8. * Steve Chen <schen@.mvista.com>
  9. *
  10. * Copyright: (C) 2009 MontaVista Software, Inc., <source@mvista.com>
  11. * Copyright: (C) 2009 Texas Instruments, India
  12. *
  13. * This program is free software; you can redistribute it and/or modify
  14. * it under the terms of the GNU General Public License version 2 as
  15. * published by the Free Software Foundation.
  16. */
  17. #include <linux/init.h>
  18. #include <linux/module.h>
  19. #include <linux/device.h>
  20. #include <linux/slab.h>
  21. #include <linux/delay.h>
  22. #include <linux/io.h>
  23. #include <linux/clk.h>
  24. #include <linux/pm_runtime.h>
  25. #include <linux/of.h>
  26. #include <linux/of_platform.h>
  27. #include <linux/of_device.h>
  28. #include <sound/asoundef.h>
  29. #include <sound/core.h>
  30. #include <sound/pcm.h>
  31. #include <sound/pcm_params.h>
  32. #include <sound/initval.h>
  33. #include <sound/soc.h>
  34. #include <sound/dmaengine_pcm.h>
  35. #include <sound/omap-pcm.h>
  36. #include "davinci-pcm.h"
  37. #include "edma-pcm.h"
  38. #include "davinci-mcasp.h"
  39. #define MCASP_MAX_AFIFO_DEPTH 64
  40. static u32 context_regs[] = {
  41. DAVINCI_MCASP_TXFMCTL_REG,
  42. DAVINCI_MCASP_RXFMCTL_REG,
  43. DAVINCI_MCASP_TXFMT_REG,
  44. DAVINCI_MCASP_RXFMT_REG,
  45. DAVINCI_MCASP_ACLKXCTL_REG,
  46. DAVINCI_MCASP_ACLKRCTL_REG,
  47. DAVINCI_MCASP_AHCLKXCTL_REG,
  48. DAVINCI_MCASP_AHCLKRCTL_REG,
  49. DAVINCI_MCASP_PDIR_REG,
  50. DAVINCI_MCASP_RXMASK_REG,
  51. DAVINCI_MCASP_TXMASK_REG,
  52. DAVINCI_MCASP_RXTDM_REG,
  53. DAVINCI_MCASP_TXTDM_REG,
  54. };
  55. struct davinci_mcasp_context {
  56. u32 config_regs[ARRAY_SIZE(context_regs)];
  57. u32 afifo_regs[2]; /* for read/write fifo control registers */
  58. u32 *xrsr_regs; /* for serializer configuration */
  59. };
  60. struct davinci_mcasp {
  61. struct davinci_pcm_dma_params dma_params[2];
  62. struct snd_dmaengine_dai_dma_data dma_data[2];
  63. void __iomem *base;
  64. u32 fifo_base;
  65. struct device *dev;
  66. /* McASP specific data */
  67. int tdm_slots;
  68. u8 op_mode;
  69. u8 num_serializer;
  70. u8 *serial_dir;
  71. u8 version;
  72. u8 bclk_div;
  73. u16 bclk_lrclk_ratio;
  74. int streams;
  75. int sysclk_freq;
  76. bool bclk_master;
  77. /* McASP FIFO related */
  78. u8 txnumevt;
  79. u8 rxnumevt;
  80. bool dat_port;
  81. #ifdef CONFIG_PM_SLEEP
  82. struct davinci_mcasp_context context;
  83. #endif
  84. };
  85. static inline void mcasp_set_bits(struct davinci_mcasp *mcasp, u32 offset,
  86. u32 val)
  87. {
  88. void __iomem *reg = mcasp->base + offset;
  89. __raw_writel(__raw_readl(reg) | val, reg);
  90. }
  91. static inline void mcasp_clr_bits(struct davinci_mcasp *mcasp, u32 offset,
  92. u32 val)
  93. {
  94. void __iomem *reg = mcasp->base + offset;
  95. __raw_writel((__raw_readl(reg) & ~(val)), reg);
  96. }
  97. static inline void mcasp_mod_bits(struct davinci_mcasp *mcasp, u32 offset,
  98. u32 val, u32 mask)
  99. {
  100. void __iomem *reg = mcasp->base + offset;
  101. __raw_writel((__raw_readl(reg) & ~mask) | val, reg);
  102. }
  103. static inline void mcasp_set_reg(struct davinci_mcasp *mcasp, u32 offset,
  104. u32 val)
  105. {
  106. __raw_writel(val, mcasp->base + offset);
  107. }
  108. static inline u32 mcasp_get_reg(struct davinci_mcasp *mcasp, u32 offset)
  109. {
  110. return (u32)__raw_readl(mcasp->base + offset);
  111. }
  112. static void mcasp_set_ctl_reg(struct davinci_mcasp *mcasp, u32 ctl_reg, u32 val)
  113. {
  114. int i = 0;
  115. mcasp_set_bits(mcasp, ctl_reg, val);
  116. /* programming GBLCTL needs to read back from GBLCTL and verfiy */
  117. /* loop count is to avoid the lock-up */
  118. for (i = 0; i < 1000; i++) {
  119. if ((mcasp_get_reg(mcasp, ctl_reg) & val) == val)
  120. break;
  121. }
  122. if (i == 1000 && ((mcasp_get_reg(mcasp, ctl_reg) & val) != val))
  123. printk(KERN_ERR "GBLCTL write error\n");
  124. }
  125. static bool mcasp_is_synchronous(struct davinci_mcasp *mcasp)
  126. {
  127. u32 rxfmctl = mcasp_get_reg(mcasp, DAVINCI_MCASP_RXFMCTL_REG);
  128. u32 aclkxctl = mcasp_get_reg(mcasp, DAVINCI_MCASP_ACLKXCTL_REG);
  129. return !(aclkxctl & TX_ASYNC) && rxfmctl & AFSRE;
  130. }
  131. static void mcasp_start_rx(struct davinci_mcasp *mcasp)
  132. {
  133. mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXHCLKRST);
  134. mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXCLKRST);
  135. /*
  136. * When ASYNC == 0 the transmit and receive sections operate
  137. * synchronously from the transmit clock and frame sync. We need to make
  138. * sure that the TX signlas are enabled when starting reception.
  139. */
  140. if (mcasp_is_synchronous(mcasp)) {
  141. mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXHCLKRST);
  142. mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXCLKRST);
  143. }
  144. mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXSERCLR);
  145. mcasp_set_reg(mcasp, DAVINCI_MCASP_RXBUF_REG, 0);
  146. mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXSMRST);
  147. mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXFSRST);
  148. mcasp_set_reg(mcasp, DAVINCI_MCASP_RXBUF_REG, 0);
  149. mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXSMRST);
  150. mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXFSRST);
  151. if (mcasp_is_synchronous(mcasp))
  152. mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXFSRST);
  153. }
  154. static void mcasp_start_tx(struct davinci_mcasp *mcasp)
  155. {
  156. u8 offset = 0, i;
  157. u32 cnt;
  158. mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXHCLKRST);
  159. mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXCLKRST);
  160. mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXSERCLR);
  161. mcasp_set_reg(mcasp, DAVINCI_MCASP_TXBUF_REG, 0);
  162. mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXSMRST);
  163. mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXFSRST);
  164. mcasp_set_reg(mcasp, DAVINCI_MCASP_TXBUF_REG, 0);
  165. for (i = 0; i < mcasp->num_serializer; i++) {
  166. if (mcasp->serial_dir[i] == TX_MODE) {
  167. offset = i;
  168. break;
  169. }
  170. }
  171. /* wait for TX ready */
  172. cnt = 0;
  173. while (!(mcasp_get_reg(mcasp, DAVINCI_MCASP_XRSRCTL_REG(offset)) &
  174. TXSTATE) && (cnt < 100000))
  175. cnt++;
  176. mcasp_set_reg(mcasp, DAVINCI_MCASP_TXBUF_REG, 0);
  177. }
  178. static void davinci_mcasp_start(struct davinci_mcasp *mcasp, int stream)
  179. {
  180. u32 reg;
  181. mcasp->streams++;
  182. if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
  183. if (mcasp->txnumevt) { /* enable FIFO */
  184. reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
  185. mcasp_clr_bits(mcasp, reg, FIFO_ENABLE);
  186. mcasp_set_bits(mcasp, reg, FIFO_ENABLE);
  187. }
  188. mcasp_start_tx(mcasp);
  189. } else {
  190. if (mcasp->rxnumevt) { /* enable FIFO */
  191. reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
  192. mcasp_clr_bits(mcasp, reg, FIFO_ENABLE);
  193. mcasp_set_bits(mcasp, reg, FIFO_ENABLE);
  194. }
  195. mcasp_start_rx(mcasp);
  196. }
  197. }
  198. static void mcasp_stop_rx(struct davinci_mcasp *mcasp)
  199. {
  200. /*
  201. * In synchronous mode stop the TX clocks if no other stream is
  202. * running
  203. */
  204. if (mcasp_is_synchronous(mcasp) && !mcasp->streams)
  205. mcasp_set_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, 0);
  206. mcasp_set_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, 0);
  207. mcasp_set_reg(mcasp, DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF);
  208. }
  209. static void mcasp_stop_tx(struct davinci_mcasp *mcasp)
  210. {
  211. u32 val = 0;
  212. /*
  213. * In synchronous mode keep TX clocks running if the capture stream is
  214. * still running.
  215. */
  216. if (mcasp_is_synchronous(mcasp) && mcasp->streams)
  217. val = TXHCLKRST | TXCLKRST | TXFSRST;
  218. mcasp_set_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, val);
  219. mcasp_set_reg(mcasp, DAVINCI_MCASP_TXSTAT_REG, 0xFFFFFFFF);
  220. }
  221. static void davinci_mcasp_stop(struct davinci_mcasp *mcasp, int stream)
  222. {
  223. u32 reg;
  224. mcasp->streams--;
  225. if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
  226. if (mcasp->txnumevt) { /* disable FIFO */
  227. reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
  228. mcasp_clr_bits(mcasp, reg, FIFO_ENABLE);
  229. }
  230. mcasp_stop_tx(mcasp);
  231. } else {
  232. if (mcasp->rxnumevt) { /* disable FIFO */
  233. reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
  234. mcasp_clr_bits(mcasp, reg, FIFO_ENABLE);
  235. }
  236. mcasp_stop_rx(mcasp);
  237. }
  238. }
  239. static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
  240. unsigned int fmt)
  241. {
  242. struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
  243. int ret = 0;
  244. u32 data_delay;
  245. bool fs_pol_rising;
  246. bool inv_fs = false;
  247. pm_runtime_get_sync(mcasp->dev);
  248. switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
  249. case SND_SOC_DAIFMT_DSP_A:
  250. mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
  251. mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
  252. /* 1st data bit occur one ACLK cycle after the frame sync */
  253. data_delay = 1;
  254. break;
  255. case SND_SOC_DAIFMT_DSP_B:
  256. case SND_SOC_DAIFMT_AC97:
  257. mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
  258. mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
  259. /* No delay after FS */
  260. data_delay = 0;
  261. break;
  262. case SND_SOC_DAIFMT_I2S:
  263. /* configure a full-word SYNC pulse (LRCLK) */
  264. mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
  265. mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
  266. /* 1st data bit occur one ACLK cycle after the frame sync */
  267. data_delay = 1;
  268. /* FS need to be inverted */
  269. inv_fs = true;
  270. break;
  271. case SND_SOC_DAIFMT_LEFT_J:
  272. /* configure a full-word SYNC pulse (LRCLK) */
  273. mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
  274. mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
  275. /* No delay after FS */
  276. data_delay = 0;
  277. break;
  278. default:
  279. ret = -EINVAL;
  280. goto out;
  281. }
  282. mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, FSXDLY(data_delay),
  283. FSXDLY(3));
  284. mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, FSRDLY(data_delay),
  285. FSRDLY(3));
  286. switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
  287. case SND_SOC_DAIFMT_CBS_CFS:
  288. /* codec is clock and frame slave */
  289. mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
  290. mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
  291. mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
  292. mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
  293. mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, ACLKX | ACLKR);
  294. mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AFSX | AFSR);
  295. mcasp->bclk_master = 1;
  296. break;
  297. case SND_SOC_DAIFMT_CBM_CFS:
  298. /* codec is clock master and frame slave */
  299. mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
  300. mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
  301. mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
  302. mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
  303. mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG, ACLKX | ACLKR);
  304. mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AFSX | AFSR);
  305. mcasp->bclk_master = 0;
  306. break;
  307. case SND_SOC_DAIFMT_CBM_CFM:
  308. /* codec is clock and frame master */
  309. mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
  310. mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
  311. mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
  312. mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
  313. mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG,
  314. ACLKX | AHCLKX | AFSX | ACLKR | AHCLKR | AFSR);
  315. mcasp->bclk_master = 0;
  316. break;
  317. default:
  318. ret = -EINVAL;
  319. goto out;
  320. }
  321. switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
  322. case SND_SOC_DAIFMT_IB_NF:
  323. mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
  324. mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
  325. fs_pol_rising = true;
  326. break;
  327. case SND_SOC_DAIFMT_NB_IF:
  328. mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
  329. mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
  330. fs_pol_rising = false;
  331. break;
  332. case SND_SOC_DAIFMT_IB_IF:
  333. mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
  334. mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
  335. fs_pol_rising = false;
  336. break;
  337. case SND_SOC_DAIFMT_NB_NF:
  338. mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
  339. mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
  340. fs_pol_rising = true;
  341. break;
  342. default:
  343. ret = -EINVAL;
  344. goto out;
  345. }
  346. if (inv_fs)
  347. fs_pol_rising = !fs_pol_rising;
  348. if (fs_pol_rising) {
  349. mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
  350. mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
  351. } else {
  352. mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
  353. mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
  354. }
  355. out:
  356. pm_runtime_put_sync(mcasp->dev);
  357. return ret;
  358. }
  359. static int __davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id,
  360. int div, bool explicit)
  361. {
  362. struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
  363. switch (div_id) {
  364. case 0: /* MCLK divider */
  365. mcasp_mod_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG,
  366. AHCLKXDIV(div - 1), AHCLKXDIV_MASK);
  367. mcasp_mod_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG,
  368. AHCLKRDIV(div - 1), AHCLKRDIV_MASK);
  369. break;
  370. case 1: /* BCLK divider */
  371. mcasp_mod_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG,
  372. ACLKXDIV(div - 1), ACLKXDIV_MASK);
  373. mcasp_mod_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG,
  374. ACLKRDIV(div - 1), ACLKRDIV_MASK);
  375. if (explicit)
  376. mcasp->bclk_div = div;
  377. break;
  378. case 2: /* BCLK/LRCLK ratio */
  379. mcasp->bclk_lrclk_ratio = div;
  380. break;
  381. default:
  382. return -EINVAL;
  383. }
  384. return 0;
  385. }
  386. static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id,
  387. int div)
  388. {
  389. return __davinci_mcasp_set_clkdiv(dai, div_id, div, 1);
  390. }
  391. static int davinci_mcasp_set_sysclk(struct snd_soc_dai *dai, int clk_id,
  392. unsigned int freq, int dir)
  393. {
  394. struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
  395. if (dir == SND_SOC_CLOCK_OUT) {
  396. mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXE);
  397. mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG, AHCLKRE);
  398. mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AHCLKX);
  399. } else {
  400. mcasp_clr_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXE);
  401. mcasp_clr_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG, AHCLKRE);
  402. mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AHCLKX);
  403. }
  404. mcasp->sysclk_freq = freq;
  405. return 0;
  406. }
  407. static int davinci_config_channel_size(struct davinci_mcasp *mcasp,
  408. int word_length)
  409. {
  410. u32 fmt;
  411. u32 tx_rotate = (word_length / 4) & 0x7;
  412. u32 mask = (1ULL << word_length) - 1;
  413. /*
  414. * For captured data we should not rotate, inversion and masking is
  415. * enoguh to get the data to the right position:
  416. * Format data from bus after reverse (XRBUF)
  417. * S16_LE: |LSB|MSB|xxx|xxx| |xxx|xxx|MSB|LSB|
  418. * S24_3LE: |LSB|DAT|MSB|xxx| |xxx|MSB|DAT|LSB|
  419. * S24_LE: |LSB|DAT|MSB|xxx| |xxx|MSB|DAT|LSB|
  420. * S32_LE: |LSB|DAT|DAT|MSB| |MSB|DAT|DAT|LSB|
  421. */
  422. u32 rx_rotate = 0;
  423. /*
  424. * if s BCLK-to-LRCLK ratio has been configured via the set_clkdiv()
  425. * callback, take it into account here. That allows us to for example
  426. * send 32 bits per channel to the codec, while only 16 of them carry
  427. * audio payload.
  428. * The clock ratio is given for a full period of data (for I2S format
  429. * both left and right channels), so it has to be divided by number of
  430. * tdm-slots (for I2S - divided by 2).
  431. */
  432. if (mcasp->bclk_lrclk_ratio)
  433. word_length = mcasp->bclk_lrclk_ratio / mcasp->tdm_slots;
  434. /* mapping of the XSSZ bit-field as described in the datasheet */
  435. fmt = (word_length >> 1) - 1;
  436. if (mcasp->op_mode != DAVINCI_MCASP_DIT_MODE) {
  437. mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, RXSSZ(fmt),
  438. RXSSZ(0x0F));
  439. mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXSSZ(fmt),
  440. TXSSZ(0x0F));
  441. mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXROT(tx_rotate),
  442. TXROT(7));
  443. mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, RXROT(rx_rotate),
  444. RXROT(7));
  445. mcasp_set_reg(mcasp, DAVINCI_MCASP_RXMASK_REG, mask);
  446. }
  447. mcasp_set_reg(mcasp, DAVINCI_MCASP_TXMASK_REG, mask);
  448. return 0;
  449. }
  450. static int mcasp_common_hw_param(struct davinci_mcasp *mcasp, int stream,
  451. int period_words, int channels)
  452. {
  453. struct davinci_pcm_dma_params *dma_params = &mcasp->dma_params[stream];
  454. struct snd_dmaengine_dai_dma_data *dma_data = &mcasp->dma_data[stream];
  455. int i;
  456. u8 tx_ser = 0;
  457. u8 rx_ser = 0;
  458. u8 slots = mcasp->tdm_slots;
  459. u8 max_active_serializers = (channels + slots - 1) / slots;
  460. int active_serializers, numevt, n;
  461. u32 reg;
  462. /* Default configuration */
  463. if (mcasp->version < MCASP_VERSION_3)
  464. mcasp_set_bits(mcasp, DAVINCI_MCASP_PWREMUMGT_REG, MCASP_SOFT);
  465. /* All PINS as McASP */
  466. mcasp_set_reg(mcasp, DAVINCI_MCASP_PFUNC_REG, 0x00000000);
  467. if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
  468. mcasp_set_reg(mcasp, DAVINCI_MCASP_TXSTAT_REG, 0xFFFFFFFF);
  469. mcasp_clr_bits(mcasp, DAVINCI_MCASP_XEVTCTL_REG, TXDATADMADIS);
  470. } else {
  471. mcasp_set_reg(mcasp, DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF);
  472. mcasp_clr_bits(mcasp, DAVINCI_MCASP_REVTCTL_REG, RXDATADMADIS);
  473. }
  474. for (i = 0; i < mcasp->num_serializer; i++) {
  475. mcasp_set_bits(mcasp, DAVINCI_MCASP_XRSRCTL_REG(i),
  476. mcasp->serial_dir[i]);
  477. if (mcasp->serial_dir[i] == TX_MODE &&
  478. tx_ser < max_active_serializers) {
  479. mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AXR(i));
  480. tx_ser++;
  481. } else if (mcasp->serial_dir[i] == RX_MODE &&
  482. rx_ser < max_active_serializers) {
  483. mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AXR(i));
  484. rx_ser++;
  485. } else {
  486. mcasp_mod_bits(mcasp, DAVINCI_MCASP_XRSRCTL_REG(i),
  487. SRMOD_INACTIVE, SRMOD_MASK);
  488. }
  489. }
  490. if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
  491. active_serializers = tx_ser;
  492. numevt = mcasp->txnumevt;
  493. reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
  494. } else {
  495. active_serializers = rx_ser;
  496. numevt = mcasp->rxnumevt;
  497. reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
  498. }
  499. if (active_serializers < max_active_serializers) {
  500. dev_warn(mcasp->dev, "stream has more channels (%d) than are "
  501. "enabled in mcasp (%d)\n", channels,
  502. active_serializers * slots);
  503. return -EINVAL;
  504. }
  505. /* AFIFO is not in use */
  506. if (!numevt) {
  507. /* Configure the burst size for platform drivers */
  508. if (active_serializers > 1) {
  509. /*
  510. * If more than one serializers are in use we have one
  511. * DMA request to provide data for all serializers.
  512. * For example if three serializers are enabled the DMA
  513. * need to transfer three words per DMA request.
  514. */
  515. dma_params->fifo_level = active_serializers;
  516. dma_data->maxburst = active_serializers;
  517. } else {
  518. dma_params->fifo_level = 0;
  519. dma_data->maxburst = 0;
  520. }
  521. return 0;
  522. }
  523. if (period_words % active_serializers) {
  524. dev_err(mcasp->dev, "Invalid combination of period words and "
  525. "active serializers: %d, %d\n", period_words,
  526. active_serializers);
  527. return -EINVAL;
  528. }
  529. /*
  530. * Calculate the optimal AFIFO depth for platform side:
  531. * The number of words for numevt need to be in steps of active
  532. * serializers.
  533. */
  534. n = numevt % active_serializers;
  535. if (n)
  536. numevt += (active_serializers - n);
  537. while (period_words % numevt && numevt > 0)
  538. numevt -= active_serializers;
  539. if (numevt <= 0)
  540. numevt = active_serializers;
  541. mcasp_mod_bits(mcasp, reg, active_serializers, NUMDMA_MASK);
  542. mcasp_mod_bits(mcasp, reg, NUMEVT(numevt), NUMEVT_MASK);
  543. /* Configure the burst size for platform drivers */
  544. if (numevt == 1)
  545. numevt = 0;
  546. dma_params->fifo_level = numevt;
  547. dma_data->maxburst = numevt;
  548. return 0;
  549. }
  550. static int mcasp_i2s_hw_param(struct davinci_mcasp *mcasp, int stream)
  551. {
  552. int i, active_slots;
  553. u32 mask = 0;
  554. u32 busel = 0;
  555. if ((mcasp->tdm_slots < 2) || (mcasp->tdm_slots > 32)) {
  556. dev_err(mcasp->dev, "tdm slot %d not supported\n",
  557. mcasp->tdm_slots);
  558. return -EINVAL;
  559. }
  560. active_slots = (mcasp->tdm_slots > 31) ? 32 : mcasp->tdm_slots;
  561. for (i = 0; i < active_slots; i++)
  562. mask |= (1 << i);
  563. mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, TX_ASYNC);
  564. if (!mcasp->dat_port)
  565. busel = TXSEL;
  566. mcasp_set_reg(mcasp, DAVINCI_MCASP_TXTDM_REG, mask);
  567. mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, busel | TXORD);
  568. mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG,
  569. FSXMOD(mcasp->tdm_slots), FSXMOD(0x1FF));
  570. mcasp_set_reg(mcasp, DAVINCI_MCASP_RXTDM_REG, mask);
  571. mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, busel | RXORD);
  572. mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG,
  573. FSRMOD(mcasp->tdm_slots), FSRMOD(0x1FF));
  574. return 0;
  575. }
  576. /* S/PDIF */
  577. static int mcasp_dit_hw_param(struct davinci_mcasp *mcasp,
  578. unsigned int rate)
  579. {
  580. u32 cs_value = 0;
  581. u8 *cs_bytes = (u8*) &cs_value;
  582. /* Set the TX format : 24 bit right rotation, 32 bit slot, Pad 0
  583. and LSB first */
  584. mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXROT(6) | TXSSZ(15));
  585. /* Set TX frame synch : DIT Mode, 1 bit width, internal, rising edge */
  586. mcasp_set_reg(mcasp, DAVINCI_MCASP_TXFMCTL_REG, AFSXE | FSXMOD(0x180));
  587. /* Set the TX tdm : for all the slots */
  588. mcasp_set_reg(mcasp, DAVINCI_MCASP_TXTDM_REG, 0xFFFFFFFF);
  589. /* Set the TX clock controls : div = 1 and internal */
  590. mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE | TX_ASYNC);
  591. mcasp_clr_bits(mcasp, DAVINCI_MCASP_XEVTCTL_REG, TXDATADMADIS);
  592. /* Only 44100 and 48000 are valid, both have the same setting */
  593. mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXDIV(3));
  594. /* Enable the DIT */
  595. mcasp_set_bits(mcasp, DAVINCI_MCASP_TXDITCTL_REG, DITEN);
  596. /* Set S/PDIF channel status bits */
  597. cs_bytes[0] = IEC958_AES0_CON_NOT_COPYRIGHT;
  598. cs_bytes[1] = IEC958_AES1_CON_PCM_CODER;
  599. switch (rate) {
  600. case 22050:
  601. cs_bytes[3] |= IEC958_AES3_CON_FS_22050;
  602. break;
  603. case 24000:
  604. cs_bytes[3] |= IEC958_AES3_CON_FS_24000;
  605. break;
  606. case 32000:
  607. cs_bytes[3] |= IEC958_AES3_CON_FS_32000;
  608. break;
  609. case 44100:
  610. cs_bytes[3] |= IEC958_AES3_CON_FS_44100;
  611. break;
  612. case 48000:
  613. cs_bytes[3] |= IEC958_AES3_CON_FS_48000;
  614. break;
  615. case 88200:
  616. cs_bytes[3] |= IEC958_AES3_CON_FS_88200;
  617. break;
  618. case 96000:
  619. cs_bytes[3] |= IEC958_AES3_CON_FS_96000;
  620. break;
  621. case 176400:
  622. cs_bytes[3] |= IEC958_AES3_CON_FS_176400;
  623. break;
  624. case 192000:
  625. cs_bytes[3] |= IEC958_AES3_CON_FS_192000;
  626. break;
  627. default:
  628. printk(KERN_WARNING "unsupported sampling rate: %d\n", rate);
  629. return -EINVAL;
  630. }
  631. mcasp_set_reg(mcasp, DAVINCI_MCASP_DITCSRA_REG, cs_value);
  632. mcasp_set_reg(mcasp, DAVINCI_MCASP_DITCSRB_REG, cs_value);
  633. return 0;
  634. }
  635. static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
  636. struct snd_pcm_hw_params *params,
  637. struct snd_soc_dai *cpu_dai)
  638. {
  639. struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
  640. struct davinci_pcm_dma_params *dma_params =
  641. &mcasp->dma_params[substream->stream];
  642. int word_length;
  643. int channels = params_channels(params);
  644. int period_size = params_period_size(params);
  645. int ret;
  646. /*
  647. * If mcasp is BCLK master, and a BCLK divider was not provided by
  648. * the machine driver, we need to calculate the ratio.
  649. */
  650. if (mcasp->bclk_master && mcasp->bclk_div == 0 && mcasp->sysclk_freq) {
  651. unsigned int bclk_freq = snd_soc_params_to_bclk(params);
  652. unsigned int div = mcasp->sysclk_freq / bclk_freq;
  653. if (mcasp->sysclk_freq % bclk_freq != 0) {
  654. if (((mcasp->sysclk_freq / div) - bclk_freq) >
  655. (bclk_freq - (mcasp->sysclk_freq / (div+1))))
  656. div++;
  657. dev_warn(mcasp->dev,
  658. "Inaccurate BCLK: %u Hz / %u != %u Hz\n",
  659. mcasp->sysclk_freq, div, bclk_freq);
  660. }
  661. __davinci_mcasp_set_clkdiv(cpu_dai, 1, div, 0);
  662. }
  663. ret = mcasp_common_hw_param(mcasp, substream->stream,
  664. period_size * channels, channels);
  665. if (ret)
  666. return ret;
  667. if (mcasp->op_mode == DAVINCI_MCASP_DIT_MODE)
  668. ret = mcasp_dit_hw_param(mcasp, params_rate(params));
  669. else
  670. ret = mcasp_i2s_hw_param(mcasp, substream->stream);
  671. if (ret)
  672. return ret;
  673. switch (params_format(params)) {
  674. case SNDRV_PCM_FORMAT_U8:
  675. case SNDRV_PCM_FORMAT_S8:
  676. dma_params->data_type = 1;
  677. word_length = 8;
  678. break;
  679. case SNDRV_PCM_FORMAT_U16_LE:
  680. case SNDRV_PCM_FORMAT_S16_LE:
  681. dma_params->data_type = 2;
  682. word_length = 16;
  683. break;
  684. case SNDRV_PCM_FORMAT_U24_3LE:
  685. case SNDRV_PCM_FORMAT_S24_3LE:
  686. dma_params->data_type = 3;
  687. word_length = 24;
  688. break;
  689. case SNDRV_PCM_FORMAT_U24_LE:
  690. case SNDRV_PCM_FORMAT_S24_LE:
  691. dma_params->data_type = 4;
  692. word_length = 24;
  693. break;
  694. case SNDRV_PCM_FORMAT_U32_LE:
  695. case SNDRV_PCM_FORMAT_S32_LE:
  696. dma_params->data_type = 4;
  697. word_length = 32;
  698. break;
  699. default:
  700. printk(KERN_WARNING "davinci-mcasp: unsupported PCM format");
  701. return -EINVAL;
  702. }
  703. if (mcasp->version == MCASP_VERSION_2 && !dma_params->fifo_level)
  704. dma_params->acnt = 4;
  705. else
  706. dma_params->acnt = dma_params->data_type;
  707. davinci_config_channel_size(mcasp, word_length);
  708. return 0;
  709. }
  710. static int davinci_mcasp_trigger(struct snd_pcm_substream *substream,
  711. int cmd, struct snd_soc_dai *cpu_dai)
  712. {
  713. struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
  714. int ret = 0;
  715. switch (cmd) {
  716. case SNDRV_PCM_TRIGGER_RESUME:
  717. case SNDRV_PCM_TRIGGER_START:
  718. case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
  719. davinci_mcasp_start(mcasp, substream->stream);
  720. break;
  721. case SNDRV_PCM_TRIGGER_SUSPEND:
  722. case SNDRV_PCM_TRIGGER_STOP:
  723. case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
  724. davinci_mcasp_stop(mcasp, substream->stream);
  725. break;
  726. default:
  727. ret = -EINVAL;
  728. }
  729. return ret;
  730. }
  731. static const struct snd_soc_dai_ops davinci_mcasp_dai_ops = {
  732. .trigger = davinci_mcasp_trigger,
  733. .hw_params = davinci_mcasp_hw_params,
  734. .set_fmt = davinci_mcasp_set_dai_fmt,
  735. .set_clkdiv = davinci_mcasp_set_clkdiv,
  736. .set_sysclk = davinci_mcasp_set_sysclk,
  737. };
  738. static int davinci_mcasp_dai_probe(struct snd_soc_dai *dai)
  739. {
  740. struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
  741. if (mcasp->version >= MCASP_VERSION_3) {
  742. /* Using dmaengine PCM */
  743. dai->playback_dma_data =
  744. &mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK];
  745. dai->capture_dma_data =
  746. &mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE];
  747. } else {
  748. /* Using davinci-pcm */
  749. dai->playback_dma_data = mcasp->dma_params;
  750. dai->capture_dma_data = mcasp->dma_params;
  751. }
  752. return 0;
  753. }
  754. #ifdef CONFIG_PM_SLEEP
  755. static int davinci_mcasp_suspend(struct snd_soc_dai *dai)
  756. {
  757. struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
  758. struct davinci_mcasp_context *context = &mcasp->context;
  759. u32 reg;
  760. int i;
  761. for (i = 0; i < ARRAY_SIZE(context_regs); i++)
  762. context->config_regs[i] = mcasp_get_reg(mcasp, context_regs[i]);
  763. if (mcasp->txnumevt) {
  764. reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
  765. context->afifo_regs[0] = mcasp_get_reg(mcasp, reg);
  766. }
  767. if (mcasp->rxnumevt) {
  768. reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
  769. context->afifo_regs[1] = mcasp_get_reg(mcasp, reg);
  770. }
  771. for (i = 0; i < mcasp->num_serializer; i++)
  772. context->xrsr_regs[i] = mcasp_get_reg(mcasp,
  773. DAVINCI_MCASP_XRSRCTL_REG(i));
  774. return 0;
  775. }
  776. static int davinci_mcasp_resume(struct snd_soc_dai *dai)
  777. {
  778. struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
  779. struct davinci_mcasp_context *context = &mcasp->context;
  780. u32 reg;
  781. int i;
  782. for (i = 0; i < ARRAY_SIZE(context_regs); i++)
  783. mcasp_set_reg(mcasp, context_regs[i], context->config_regs[i]);
  784. if (mcasp->txnumevt) {
  785. reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
  786. mcasp_set_reg(mcasp, reg, context->afifo_regs[0]);
  787. }
  788. if (mcasp->rxnumevt) {
  789. reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
  790. mcasp_set_reg(mcasp, reg, context->afifo_regs[1]);
  791. }
  792. for (i = 0; i < mcasp->num_serializer; i++)
  793. mcasp_set_reg(mcasp, DAVINCI_MCASP_XRSRCTL_REG(i),
  794. context->xrsr_regs[i]);
  795. return 0;
  796. }
  797. #else
  798. #define davinci_mcasp_suspend NULL
  799. #define davinci_mcasp_resume NULL
  800. #endif
  801. #define DAVINCI_MCASP_RATES SNDRV_PCM_RATE_8000_192000
  802. #define DAVINCI_MCASP_PCM_FMTS (SNDRV_PCM_FMTBIT_S8 | \
  803. SNDRV_PCM_FMTBIT_U8 | \
  804. SNDRV_PCM_FMTBIT_S16_LE | \
  805. SNDRV_PCM_FMTBIT_U16_LE | \
  806. SNDRV_PCM_FMTBIT_S24_LE | \
  807. SNDRV_PCM_FMTBIT_U24_LE | \
  808. SNDRV_PCM_FMTBIT_S24_3LE | \
  809. SNDRV_PCM_FMTBIT_U24_3LE | \
  810. SNDRV_PCM_FMTBIT_S32_LE | \
  811. SNDRV_PCM_FMTBIT_U32_LE)
  812. static struct snd_soc_dai_driver davinci_mcasp_dai[] = {
  813. {
  814. .name = "davinci-mcasp.0",
  815. .probe = davinci_mcasp_dai_probe,
  816. .suspend = davinci_mcasp_suspend,
  817. .resume = davinci_mcasp_resume,
  818. .playback = {
  819. .channels_min = 2,
  820. .channels_max = 32 * 16,
  821. .rates = DAVINCI_MCASP_RATES,
  822. .formats = DAVINCI_MCASP_PCM_FMTS,
  823. },
  824. .capture = {
  825. .channels_min = 2,
  826. .channels_max = 32 * 16,
  827. .rates = DAVINCI_MCASP_RATES,
  828. .formats = DAVINCI_MCASP_PCM_FMTS,
  829. },
  830. .ops = &davinci_mcasp_dai_ops,
  831. },
  832. {
  833. .name = "davinci-mcasp.1",
  834. .probe = davinci_mcasp_dai_probe,
  835. .playback = {
  836. .channels_min = 1,
  837. .channels_max = 384,
  838. .rates = DAVINCI_MCASP_RATES,
  839. .formats = DAVINCI_MCASP_PCM_FMTS,
  840. },
  841. .ops = &davinci_mcasp_dai_ops,
  842. },
  843. };
  844. static const struct snd_soc_component_driver davinci_mcasp_component = {
  845. .name = "davinci-mcasp",
  846. };
  847. /* Some HW specific values and defaults. The rest is filled in from DT. */
  848. static struct davinci_mcasp_pdata dm646x_mcasp_pdata = {
  849. .tx_dma_offset = 0x400,
  850. .rx_dma_offset = 0x400,
  851. .asp_chan_q = EVENTQ_0,
  852. .version = MCASP_VERSION_1,
  853. };
  854. static struct davinci_mcasp_pdata da830_mcasp_pdata = {
  855. .tx_dma_offset = 0x2000,
  856. .rx_dma_offset = 0x2000,
  857. .asp_chan_q = EVENTQ_0,
  858. .version = MCASP_VERSION_2,
  859. };
  860. static struct davinci_mcasp_pdata am33xx_mcasp_pdata = {
  861. .tx_dma_offset = 0,
  862. .rx_dma_offset = 0,
  863. .asp_chan_q = EVENTQ_0,
  864. .version = MCASP_VERSION_3,
  865. };
  866. static struct davinci_mcasp_pdata dra7_mcasp_pdata = {
  867. .tx_dma_offset = 0x200,
  868. .rx_dma_offset = 0x284,
  869. .asp_chan_q = EVENTQ_0,
  870. .version = MCASP_VERSION_4,
  871. };
  872. static const struct of_device_id mcasp_dt_ids[] = {
  873. {
  874. .compatible = "ti,dm646x-mcasp-audio",
  875. .data = &dm646x_mcasp_pdata,
  876. },
  877. {
  878. .compatible = "ti,da830-mcasp-audio",
  879. .data = &da830_mcasp_pdata,
  880. },
  881. {
  882. .compatible = "ti,am33xx-mcasp-audio",
  883. .data = &am33xx_mcasp_pdata,
  884. },
  885. {
  886. .compatible = "ti,dra7-mcasp-audio",
  887. .data = &dra7_mcasp_pdata,
  888. },
  889. { /* sentinel */ }
  890. };
  891. MODULE_DEVICE_TABLE(of, mcasp_dt_ids);
  892. static int mcasp_reparent_fck(struct platform_device *pdev)
  893. {
  894. struct device_node *node = pdev->dev.of_node;
  895. struct clk *gfclk, *parent_clk;
  896. const char *parent_name;
  897. int ret;
  898. if (!node)
  899. return 0;
  900. parent_name = of_get_property(node, "fck_parent", NULL);
  901. if (!parent_name)
  902. return 0;
  903. gfclk = clk_get(&pdev->dev, "fck");
  904. if (IS_ERR(gfclk)) {
  905. dev_err(&pdev->dev, "failed to get fck\n");
  906. return PTR_ERR(gfclk);
  907. }
  908. parent_clk = clk_get(NULL, parent_name);
  909. if (IS_ERR(parent_clk)) {
  910. dev_err(&pdev->dev, "failed to get parent clock\n");
  911. ret = PTR_ERR(parent_clk);
  912. goto err1;
  913. }
  914. ret = clk_set_parent(gfclk, parent_clk);
  915. if (ret) {
  916. dev_err(&pdev->dev, "failed to reparent fck\n");
  917. goto err2;
  918. }
  919. err2:
  920. clk_put(parent_clk);
  921. err1:
  922. clk_put(gfclk);
  923. return ret;
  924. }
  925. static struct davinci_mcasp_pdata *davinci_mcasp_set_pdata_from_of(
  926. struct platform_device *pdev)
  927. {
  928. struct device_node *np = pdev->dev.of_node;
  929. struct davinci_mcasp_pdata *pdata = NULL;
  930. const struct of_device_id *match =
  931. of_match_device(mcasp_dt_ids, &pdev->dev);
  932. struct of_phandle_args dma_spec;
  933. const u32 *of_serial_dir32;
  934. u32 val;
  935. int i, ret = 0;
  936. if (pdev->dev.platform_data) {
  937. pdata = pdev->dev.platform_data;
  938. return pdata;
  939. } else if (match) {
  940. pdata = (struct davinci_mcasp_pdata*) match->data;
  941. } else {
  942. /* control shouldn't reach here. something is wrong */
  943. ret = -EINVAL;
  944. goto nodata;
  945. }
  946. ret = of_property_read_u32(np, "op-mode", &val);
  947. if (ret >= 0)
  948. pdata->op_mode = val;
  949. ret = of_property_read_u32(np, "tdm-slots", &val);
  950. if (ret >= 0) {
  951. if (val < 2 || val > 32) {
  952. dev_err(&pdev->dev,
  953. "tdm-slots must be in rage [2-32]\n");
  954. ret = -EINVAL;
  955. goto nodata;
  956. }
  957. pdata->tdm_slots = val;
  958. }
  959. of_serial_dir32 = of_get_property(np, "serial-dir", &val);
  960. val /= sizeof(u32);
  961. if (of_serial_dir32) {
  962. u8 *of_serial_dir = devm_kzalloc(&pdev->dev,
  963. (sizeof(*of_serial_dir) * val),
  964. GFP_KERNEL);
  965. if (!of_serial_dir) {
  966. ret = -ENOMEM;
  967. goto nodata;
  968. }
  969. for (i = 0; i < val; i++)
  970. of_serial_dir[i] = be32_to_cpup(&of_serial_dir32[i]);
  971. pdata->num_serializer = val;
  972. pdata->serial_dir = of_serial_dir;
  973. }
  974. ret = of_property_match_string(np, "dma-names", "tx");
  975. if (ret < 0)
  976. goto nodata;
  977. ret = of_parse_phandle_with_args(np, "dmas", "#dma-cells", ret,
  978. &dma_spec);
  979. if (ret < 0)
  980. goto nodata;
  981. pdata->tx_dma_channel = dma_spec.args[0];
  982. ret = of_property_match_string(np, "dma-names", "rx");
  983. if (ret < 0)
  984. goto nodata;
  985. ret = of_parse_phandle_with_args(np, "dmas", "#dma-cells", ret,
  986. &dma_spec);
  987. if (ret < 0)
  988. goto nodata;
  989. pdata->rx_dma_channel = dma_spec.args[0];
  990. ret = of_property_read_u32(np, "tx-num-evt", &val);
  991. if (ret >= 0)
  992. pdata->txnumevt = val;
  993. ret = of_property_read_u32(np, "rx-num-evt", &val);
  994. if (ret >= 0)
  995. pdata->rxnumevt = val;
  996. ret = of_property_read_u32(np, "sram-size-playback", &val);
  997. if (ret >= 0)
  998. pdata->sram_size_playback = val;
  999. ret = of_property_read_u32(np, "sram-size-capture", &val);
  1000. if (ret >= 0)
  1001. pdata->sram_size_capture = val;
  1002. return pdata;
  1003. nodata:
  1004. if (ret < 0) {
  1005. dev_err(&pdev->dev, "Error populating platform data, err %d\n",
  1006. ret);
  1007. pdata = NULL;
  1008. }
  1009. return pdata;
  1010. }
  1011. static int davinci_mcasp_probe(struct platform_device *pdev)
  1012. {
  1013. struct davinci_pcm_dma_params *dma_params;
  1014. struct snd_dmaengine_dai_dma_data *dma_data;
  1015. struct resource *mem, *ioarea, *res, *dat;
  1016. struct davinci_mcasp_pdata *pdata;
  1017. struct davinci_mcasp *mcasp;
  1018. int ret;
  1019. if (!pdev->dev.platform_data && !pdev->dev.of_node) {
  1020. dev_err(&pdev->dev, "No platform data supplied\n");
  1021. return -EINVAL;
  1022. }
  1023. mcasp = devm_kzalloc(&pdev->dev, sizeof(struct davinci_mcasp),
  1024. GFP_KERNEL);
  1025. if (!mcasp)
  1026. return -ENOMEM;
  1027. pdata = davinci_mcasp_set_pdata_from_of(pdev);
  1028. if (!pdata) {
  1029. dev_err(&pdev->dev, "no platform data\n");
  1030. return -EINVAL;
  1031. }
  1032. mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mpu");
  1033. if (!mem) {
  1034. dev_warn(mcasp->dev,
  1035. "\"mpu\" mem resource not found, using index 0\n");
  1036. mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  1037. if (!mem) {
  1038. dev_err(&pdev->dev, "no mem resource?\n");
  1039. return -ENODEV;
  1040. }
  1041. }
  1042. ioarea = devm_request_mem_region(&pdev->dev, mem->start,
  1043. resource_size(mem), pdev->name);
  1044. if (!ioarea) {
  1045. dev_err(&pdev->dev, "Audio region already claimed\n");
  1046. return -EBUSY;
  1047. }
  1048. pm_runtime_enable(&pdev->dev);
  1049. ret = pm_runtime_get_sync(&pdev->dev);
  1050. if (IS_ERR_VALUE(ret)) {
  1051. dev_err(&pdev->dev, "pm_runtime_get_sync() failed\n");
  1052. return ret;
  1053. }
  1054. mcasp->base = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
  1055. if (!mcasp->base) {
  1056. dev_err(&pdev->dev, "ioremap failed\n");
  1057. ret = -ENOMEM;
  1058. goto err;
  1059. }
  1060. mcasp->op_mode = pdata->op_mode;
  1061. mcasp->tdm_slots = pdata->tdm_slots;
  1062. mcasp->num_serializer = pdata->num_serializer;
  1063. #ifdef CONFIG_PM_SLEEP
  1064. mcasp->context.xrsr_regs = devm_kzalloc(&pdev->dev,
  1065. sizeof(u32) * mcasp->num_serializer,
  1066. GFP_KERNEL);
  1067. #endif
  1068. mcasp->serial_dir = pdata->serial_dir;
  1069. mcasp->version = pdata->version;
  1070. mcasp->txnumevt = pdata->txnumevt;
  1071. mcasp->rxnumevt = pdata->rxnumevt;
  1072. mcasp->dev = &pdev->dev;
  1073. dat = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dat");
  1074. if (dat)
  1075. mcasp->dat_port = true;
  1076. dma_params = &mcasp->dma_params[SNDRV_PCM_STREAM_PLAYBACK];
  1077. dma_data = &mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK];
  1078. dma_params->asp_chan_q = pdata->asp_chan_q;
  1079. dma_params->ram_chan_q = pdata->ram_chan_q;
  1080. dma_params->sram_pool = pdata->sram_pool;
  1081. dma_params->sram_size = pdata->sram_size_playback;
  1082. if (dat)
  1083. dma_params->dma_addr = dat->start;
  1084. else
  1085. dma_params->dma_addr = mem->start + pdata->tx_dma_offset;
  1086. /* Unconditional dmaengine stuff */
  1087. dma_data->addr = dma_params->dma_addr;
  1088. res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
  1089. if (res)
  1090. dma_params->channel = res->start;
  1091. else
  1092. dma_params->channel = pdata->tx_dma_channel;
  1093. /* dmaengine filter data for DT and non-DT boot */
  1094. if (pdev->dev.of_node)
  1095. dma_data->filter_data = "tx";
  1096. else
  1097. dma_data->filter_data = &dma_params->channel;
  1098. dma_params = &mcasp->dma_params[SNDRV_PCM_STREAM_CAPTURE];
  1099. dma_data = &mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE];
  1100. dma_params->asp_chan_q = pdata->asp_chan_q;
  1101. dma_params->ram_chan_q = pdata->ram_chan_q;
  1102. dma_params->sram_pool = pdata->sram_pool;
  1103. dma_params->sram_size = pdata->sram_size_capture;
  1104. if (dat)
  1105. dma_params->dma_addr = dat->start;
  1106. else
  1107. dma_params->dma_addr = mem->start + pdata->rx_dma_offset;
  1108. /* Unconditional dmaengine stuff */
  1109. dma_data->addr = dma_params->dma_addr;
  1110. if (mcasp->version < MCASP_VERSION_3) {
  1111. mcasp->fifo_base = DAVINCI_MCASP_V2_AFIFO_BASE;
  1112. /* dma_params->dma_addr is pointing to the data port address */
  1113. mcasp->dat_port = true;
  1114. } else {
  1115. mcasp->fifo_base = DAVINCI_MCASP_V3_AFIFO_BASE;
  1116. }
  1117. res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
  1118. if (res)
  1119. dma_params->channel = res->start;
  1120. else
  1121. dma_params->channel = pdata->rx_dma_channel;
  1122. /* dmaengine filter data for DT and non-DT boot */
  1123. if (pdev->dev.of_node)
  1124. dma_data->filter_data = "rx";
  1125. else
  1126. dma_data->filter_data = &dma_params->channel;
  1127. dev_set_drvdata(&pdev->dev, mcasp);
  1128. mcasp_reparent_fck(pdev);
  1129. ret = devm_snd_soc_register_component(&pdev->dev,
  1130. &davinci_mcasp_component,
  1131. &davinci_mcasp_dai[pdata->op_mode], 1);
  1132. if (ret != 0)
  1133. goto err;
  1134. switch (mcasp->version) {
  1135. #if IS_BUILTIN(CONFIG_SND_DAVINCI_SOC) || \
  1136. (IS_MODULE(CONFIG_SND_DAVINCI_SOC_MCASP) && \
  1137. IS_MODULE(CONFIG_SND_DAVINCI_SOC))
  1138. case MCASP_VERSION_1:
  1139. case MCASP_VERSION_2:
  1140. ret = davinci_soc_platform_register(&pdev->dev);
  1141. break;
  1142. #endif
  1143. #if IS_BUILTIN(CONFIG_SND_EDMA_SOC) || \
  1144. (IS_MODULE(CONFIG_SND_DAVINCI_SOC_MCASP) && \
  1145. IS_MODULE(CONFIG_SND_EDMA_SOC))
  1146. case MCASP_VERSION_3:
  1147. ret = edma_pcm_platform_register(&pdev->dev);
  1148. break;
  1149. #endif
  1150. #if IS_BUILTIN(CONFIG_SND_OMAP_SOC) || \
  1151. (IS_MODULE(CONFIG_SND_DAVINCI_SOC_MCASP) && \
  1152. IS_MODULE(CONFIG_SND_OMAP_SOC))
  1153. case MCASP_VERSION_4:
  1154. ret = omap_pcm_platform_register(&pdev->dev);
  1155. break;
  1156. #endif
  1157. default:
  1158. dev_err(&pdev->dev, "Invalid McASP version: %d\n",
  1159. mcasp->version);
  1160. ret = -EINVAL;
  1161. break;
  1162. }
  1163. if (ret) {
  1164. dev_err(&pdev->dev, "register PCM failed: %d\n", ret);
  1165. goto err;
  1166. }
  1167. return 0;
  1168. err:
  1169. pm_runtime_put_sync(&pdev->dev);
  1170. pm_runtime_disable(&pdev->dev);
  1171. return ret;
  1172. }
  1173. static int davinci_mcasp_remove(struct platform_device *pdev)
  1174. {
  1175. pm_runtime_put_sync(&pdev->dev);
  1176. pm_runtime_disable(&pdev->dev);
  1177. return 0;
  1178. }
  1179. static struct platform_driver davinci_mcasp_driver = {
  1180. .probe = davinci_mcasp_probe,
  1181. .remove = davinci_mcasp_remove,
  1182. .driver = {
  1183. .name = "davinci-mcasp",
  1184. .owner = THIS_MODULE,
  1185. .of_match_table = mcasp_dt_ids,
  1186. },
  1187. };
  1188. module_platform_driver(davinci_mcasp_driver);
  1189. MODULE_AUTHOR("Steve Chen");
  1190. MODULE_DESCRIPTION("TI DAVINCI McASP SoC Interface");
  1191. MODULE_LICENSE("GPL");