msm-compress-q6-v2.c 64 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202
  1. /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
  2. *
  3. * This program is free software; you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License version 2 and
  5. * only version 2 as published by the Free Software Foundation.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. */
  12. #include <linux/init.h>
  13. #include <linux/err.h>
  14. #include <linux/module.h>
  15. #include <linux/moduleparam.h>
  16. #include <linux/time.h>
  17. #include <linux/math64.h>
  18. #include <linux/wait.h>
  19. #include <linux/platform_device.h>
  20. #include <linux/slab.h>
  21. #include <sound/core.h>
  22. #include <sound/soc.h>
  23. #include <sound/soc-dapm.h>
  24. #include <sound/pcm.h>
  25. #include <sound/initval.h>
  26. #include <sound/control.h>
  27. #include <sound/q6asm-v2.h>
  28. #include <sound/pcm_params.h>
  29. #include <asm/dma.h>
  30. #include <linux/dma-mapping.h>
  31. #include <linux/msm_audio_ion.h>
  32. #include <sound/timer.h>
  33. #include <sound/tlv.h>
  34. #include <sound/apr_audio-v2.h>
  35. #include <sound/q6asm-v2.h>
  36. #include <sound/compress_params.h>
  37. #include <sound/compress_offload.h>
  38. #include <sound/compress_driver.h>
  39. #include "msm-pcm-routing-v2.h"
  40. #include "audio_ocmem.h"
  41. #include "msm-audio-effects-q6-v2.h"
  42. #define DSP_PP_BUFFERING_IN_MSEC 25
  43. #define PARTIAL_DRAIN_ACK_EARLY_BY_MSEC 150
  44. #define MP3_OUTPUT_FRAME_SZ 1152
  45. #define AAC_OUTPUT_FRAME_SZ 1024
  46. #define AC3_OUTPUT_FRAME_SZ 1536
  47. #define EAC3_OUTPUT_FRAME_SZ 1536
  48. #define DSP_NUM_OUTPUT_FRAME_BUFFERED 2
  49. /* decoder parameter length */
  50. #define DDP_DEC_MAX_NUM_PARAM 18
  51. /* Default values used if user space does not set */
  52. #define COMPR_PLAYBACK_MIN_FRAGMENT_SIZE (8 * 1024)
  53. #define COMPR_PLAYBACK_MAX_FRAGMENT_SIZE (128 * 1024)
  54. #define COMPR_PLAYBACK_MIN_NUM_FRAGMENTS (4)
  55. #define COMPR_PLAYBACK_MAX_NUM_FRAGMENTS (16 * 4)
  56. #define COMPRESSED_LR_VOL_MAX_STEPS 0x2000
  57. const DECLARE_TLV_DB_LINEAR(msm_compr_vol_gain, 0,
  58. COMPRESSED_LR_VOL_MAX_STEPS);
  59. /*
  60. * LSB 8 bits is used as stream id for some DSP
  61. * commands for compressed playback.
  62. */
  63. #define STREAM_ID_FROM_TOKEN(i) (i & 0xFF)
  64. /* Stream id switches between 1 and 2 */
  65. #define NEXT_STREAM_ID(stream_id) ((stream_id & 1) + 1)
  66. #define STREAM_ARRAY_INDEX(stream_id) (stream_id - 1)
  67. #define MAX_NUMBER_OF_STREAMS 2
  68. struct msm_compr_gapless_state {
  69. bool set_next_stream_id;
  70. int32_t stream_opened[MAX_NUMBER_OF_STREAMS];
  71. uint32_t initial_samples_drop;
  72. uint32_t trailing_samples_drop;
  73. uint32_t gapless_transition;
  74. bool use_dsp_gapless_mode;
  75. };
  76. struct msm_compr_pdata {
  77. atomic_t audio_ocmem_req;
  78. struct snd_compr_stream *cstream[MSM_FRONTEND_DAI_MAX];
  79. uint32_t volume[MSM_FRONTEND_DAI_MAX][2]; /* For both L & R */
  80. struct msm_compr_audio_effects *audio_effects[MSM_FRONTEND_DAI_MAX];
  81. bool use_dsp_gapless_mode;
  82. struct msm_compr_dec_params *dec_params[MSM_FRONTEND_DAI_MAX];
  83. bool is_in_use[MSM_FRONTEND_DAI_MAX];
  84. };
  85. struct msm_compr_audio {
  86. struct snd_compr_stream *cstream;
  87. struct snd_compr_caps compr_cap;
  88. struct snd_compr_codec_caps codec_caps;
  89. struct snd_compr_params codec_param;
  90. struct audio_client *audio_client;
  91. uint32_t codec;
  92. void *buffer; /* virtual address */
  93. uint32_t buffer_paddr; /* physical address */
  94. uint32_t app_pointer;
  95. uint32_t buffer_size;
  96. uint32_t byte_offset;
  97. uint32_t copied_total; /* bytes consumed by DSP */
  98. uint32_t bytes_received; /* from userspace */
  99. uint32_t bytes_sent; /* to DSP */
  100. int32_t first_buffer;
  101. int32_t last_buffer;
  102. int32_t partial_drain_delay;
  103. uint16_t session_id;
  104. uint32_t sample_rate;
  105. uint32_t num_channels;
  106. uint32_t cmd_ack;
  107. uint32_t cmd_interrupt;
  108. uint32_t drain_ready;
  109. uint32_t stream_available;
  110. uint32_t next_stream;
  111. uint64_t marker_timestamp;
  112. struct msm_compr_gapless_state gapless_state;
  113. atomic_t start;
  114. atomic_t eos;
  115. atomic_t drain;
  116. atomic_t xrun;
  117. atomic_t close;
  118. atomic_t wait_on_close;
  119. atomic_t error;
  120. wait_queue_head_t eos_wait;
  121. wait_queue_head_t drain_wait;
  122. wait_queue_head_t flush_wait;
  123. wait_queue_head_t close_wait;
  124. wait_queue_head_t wait_for_stream_avail;
  125. spinlock_t lock;
  126. };
  127. struct msm_compr_audio_effects {
  128. struct bass_boost_params bass_boost;
  129. struct virtualizer_params virtualizer;
  130. struct reverb_params reverb;
  131. struct eq_params equalizer;
  132. };
  133. struct msm_compr_dec_params {
  134. struct snd_dec_ddp ddp_params;
  135. };
  136. static int msm_compr_set_volume(struct snd_compr_stream *cstream,
  137. uint32_t volume_l, uint32_t volume_r)
  138. {
  139. struct msm_compr_audio *prtd;
  140. int rc = 0;
  141. pr_debug("%s: volume_l %d volume_r %d\n",
  142. __func__, volume_l, volume_r);
  143. if (!cstream || !cstream->runtime) {
  144. pr_err("%s: session not active\n", __func__);
  145. return -EPERM;
  146. }
  147. prtd = cstream->runtime->private_data;
  148. if (prtd && prtd->audio_client) {
  149. if (volume_l != volume_r) {
  150. pr_debug("%s: call q6asm_set_lrgain\n", __func__);
  151. rc = q6asm_set_lrgain(prtd->audio_client,
  152. volume_l, volume_r);
  153. if (rc < 0) {
  154. pr_err("%s: set lrgain command failed rc=%d\n",
  155. __func__, rc);
  156. return rc;
  157. }
  158. /*
  159. * set master gain to unity so that only lr gain
  160. * is effective
  161. */
  162. rc = q6asm_set_volume(prtd->audio_client,
  163. COMPRESSED_LR_VOL_MAX_STEPS);
  164. } else {
  165. pr_debug("%s: call q6asm_set_volume\n", __func__);
  166. /*
  167. * set left and right channel gain to unity so that
  168. * only master gain is effective
  169. */
  170. rc = q6asm_set_lrgain(prtd->audio_client,
  171. COMPRESSED_LR_VOL_MAX_STEPS,
  172. COMPRESSED_LR_VOL_MAX_STEPS);
  173. if (rc < 0) {
  174. pr_err("%s: set lrgain command failed rc=%d\n",
  175. __func__, rc);
  176. return rc;
  177. }
  178. rc = q6asm_set_volume(prtd->audio_client, volume_l);
  179. }
  180. if (rc < 0) {
  181. pr_err("%s: Send Volume command failed rc=%d\n",
  182. __func__, rc);
  183. }
  184. }
  185. return rc;
  186. }
  187. static int msm_compr_send_ddp_cfg(struct audio_client *ac,
  188. struct snd_dec_ddp *ddp)
  189. {
  190. int i, rc;
  191. pr_debug("%s\n", __func__);
  192. for (i = 0; i < ddp->params_length; i++) {
  193. rc = q6asm_ds1_set_endp_params(ac, ddp->params_id[i],
  194. ddp->params_value[i]);
  195. if (rc) {
  196. pr_err("sending params_id: %d failed\n",
  197. ddp->params_id[i]);
  198. return rc;
  199. }
  200. }
  201. return 0;
  202. }
  203. static int msm_compr_send_buffer(struct msm_compr_audio *prtd)
  204. {
  205. int buffer_length;
  206. int bytes_available;
  207. struct audio_aio_write_param param;
  208. if (!atomic_read(&prtd->start)) {
  209. pr_err("%s: stream is not in started state\n", __func__);
  210. return -EINVAL;
  211. }
  212. if (atomic_read(&prtd->xrun)) {
  213. WARN(1, "%s called while xrun is true", __func__);
  214. return -EPERM;
  215. }
  216. pr_debug("%s: bytes_received = %d copied_total = %d\n",
  217. __func__, prtd->bytes_received, prtd->copied_total);
  218. if (prtd->first_buffer && prtd->gapless_state.use_dsp_gapless_mode)
  219. q6asm_stream_send_meta_data(prtd->audio_client,
  220. prtd->audio_client->stream_id,
  221. prtd->gapless_state.initial_samples_drop,
  222. prtd->gapless_state.trailing_samples_drop);
  223. buffer_length = prtd->codec_param.buffer.fragment_size;
  224. bytes_available = prtd->bytes_received - prtd->copied_total;
  225. if (bytes_available < prtd->codec_param.buffer.fragment_size)
  226. buffer_length = bytes_available;
  227. if (prtd->byte_offset + buffer_length > prtd->buffer_size) {
  228. buffer_length = (prtd->buffer_size - prtd->byte_offset);
  229. pr_debug("wrap around situation, send partial data %d now", buffer_length);
  230. }
  231. if (buffer_length)
  232. param.paddr = prtd->buffer_paddr + prtd->byte_offset;
  233. else
  234. param.paddr = prtd->buffer_paddr;
  235. WARN(param.paddr % 32 != 0, "param.paddr %lx not multiple of 32", param.paddr);
  236. param.len = buffer_length;
  237. param.msw_ts = 0;
  238. param.lsw_ts = 0;
  239. param.flags = NO_TIMESTAMP;
  240. param.uid = buffer_length;
  241. param.metadata_len = 0;
  242. param.last_buffer = prtd->last_buffer;
  243. pr_debug("%s: sending %d bytes to DSP byte_offset = %d\n",
  244. __func__, buffer_length, prtd->byte_offset);
  245. if (q6asm_async_write(prtd->audio_client, &param) < 0) {
  246. pr_err("%s:q6asm_async_write failed\n", __func__);
  247. } else {
  248. prtd->bytes_sent += buffer_length;
  249. if (prtd->first_buffer)
  250. prtd->first_buffer = 0;
  251. }
  252. return 0;
  253. }
  254. static void compr_event_handler(uint32_t opcode,
  255. uint32_t token, uint32_t *payload, void *priv)
  256. {
  257. struct msm_compr_audio *prtd = priv;
  258. struct snd_compr_stream *cstream = prtd->cstream;
  259. struct audio_client *ac = prtd->audio_client;
  260. uint32_t chan_mode = 0;
  261. uint32_t sample_rate = 0;
  262. int bytes_available, stream_id;
  263. uint32_t stream_index;
  264. unsigned long flags;
  265. pr_debug("%s opcode =%08x\n", __func__, opcode);
  266. switch (opcode) {
  267. case ASM_DATA_EVENT_WRITE_DONE_V2:
  268. spin_lock(&prtd->lock);
  269. if (payload[3]) {
  270. pr_err("WRITE FAILED w/ err 0x%x !, paddr 0x%x"
  271. " byte_offset = %d, copied_total = %d, token = %d\n",
  272. payload[3],
  273. payload[0],
  274. prtd->byte_offset, prtd->copied_total, token);
  275. atomic_set(&prtd->start, 0);
  276. } else {
  277. pr_debug("ASM_DATA_EVENT_WRITE_DONE_V2 offset %d, length %d\n",
  278. prtd->byte_offset, token);
  279. }
  280. prtd->byte_offset += token;
  281. prtd->copied_total += token;
  282. if (prtd->byte_offset >= prtd->buffer_size)
  283. prtd->byte_offset -= prtd->buffer_size;
  284. snd_compr_fragment_elapsed(cstream);
  285. if (!atomic_read(&prtd->start)) {
  286. /* Writes must be restarted from _copy() */
  287. pr_debug("write_done received while not started, treat as xrun");
  288. atomic_set(&prtd->xrun, 1);
  289. spin_unlock(&prtd->lock);
  290. break;
  291. }
  292. bytes_available = prtd->bytes_received - prtd->copied_total;
  293. if (bytes_available < cstream->runtime->fragment_size) {
  294. pr_debug("WRITE_DONE Insufficient data to send. break out\n");
  295. atomic_set(&prtd->xrun, 1);
  296. if (prtd->last_buffer)
  297. prtd->last_buffer = 0;
  298. if (atomic_read(&prtd->drain)) {
  299. pr_debug("wake up on drain\n");
  300. prtd->drain_ready = 1;
  301. wake_up(&prtd->drain_wait);
  302. atomic_set(&prtd->drain, 0);
  303. }
  304. } else if ((bytes_available == cstream->runtime->fragment_size)
  305. && atomic_read(&prtd->drain)) {
  306. prtd->last_buffer = 1;
  307. msm_compr_send_buffer(prtd);
  308. prtd->last_buffer = 0;
  309. } else
  310. msm_compr_send_buffer(prtd);
  311. spin_unlock(&prtd->lock);
  312. break;
  313. case ASM_DATA_EVENT_RENDERED_EOS:
  314. spin_lock(&prtd->lock);
  315. pr_debug("%s: ASM_DATA_CMDRSP_EOS token 0x%x,stream id %d\n",
  316. __func__, token, STREAM_ID_FROM_TOKEN(token));
  317. stream_id = STREAM_ID_FROM_TOKEN(token);
  318. if (atomic_read(&prtd->eos) &&
  319. !prtd->gapless_state.set_next_stream_id) {
  320. pr_debug("ASM_DATA_CMDRSP_EOS wake up\n");
  321. prtd->cmd_ack = 1;
  322. wake_up(&prtd->eos_wait);
  323. }
  324. atomic_set(&prtd->eos, 0);
  325. stream_index = STREAM_ARRAY_INDEX(stream_id);
  326. if (stream_index >= MAX_NUMBER_OF_STREAMS ||
  327. stream_index < 0) {
  328. pr_err("%s: Invalid stream index %d", __func__,
  329. stream_index);
  330. spin_unlock(&prtd->lock);
  331. break;
  332. }
  333. if (prtd->gapless_state.set_next_stream_id &&
  334. prtd->gapless_state.stream_opened[stream_index]) {
  335. pr_debug("%s: CMD_CLOSE stream_id %d\n",
  336. __func__, stream_id);
  337. q6asm_stream_cmd_nowait(ac, CMD_CLOSE, stream_id);
  338. atomic_set(&prtd->close, 1);
  339. prtd->gapless_state.stream_opened[stream_index] = 0;
  340. prtd->gapless_state.set_next_stream_id = false;
  341. }
  342. if (prtd->gapless_state.gapless_transition)
  343. prtd->gapless_state.gapless_transition = 0;
  344. spin_unlock(&prtd->lock);
  345. break;
  346. case ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY:
  347. case ASM_DATA_EVENT_ENC_SR_CM_CHANGE_NOTIFY: {
  348. pr_debug("ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY\n");
  349. chan_mode = payload[1] >> 16;
  350. sample_rate = payload[2] >> 16;
  351. if (prtd && (chan_mode != prtd->num_channels ||
  352. sample_rate != prtd->sample_rate)) {
  353. prtd->num_channels = chan_mode;
  354. prtd->sample_rate = sample_rate;
  355. }
  356. }
  357. case APR_BASIC_RSP_RESULT: {
  358. switch (payload[0]) {
  359. case ASM_SESSION_CMD_RUN_V2:
  360. /* check if the first buffer need to be sent to DSP */
  361. pr_debug("ASM_SESSION_CMD_RUN_V2\n");
  362. spin_lock(&prtd->lock);
  363. /* FIXME: A state is a much better way of dealing with this */
  364. if (prtd->bytes_sent == 0) {
  365. bytes_available = prtd->bytes_received - prtd->copied_total;
  366. if (bytes_available < cstream->runtime->fragment_size) {
  367. pr_debug("CMD_RUN_V2 Insufficient data to send. break out\n");
  368. atomic_set(&prtd->xrun, 1);
  369. } else
  370. msm_compr_send_buffer(prtd);
  371. }
  372. spin_unlock(&prtd->lock);
  373. break;
  374. case ASM_STREAM_CMD_FLUSH:
  375. pr_debug("%s: ASM_STREAM_CMD_FLUSH:", __func__);
  376. pr_debug("token 0x%x, stream id %d\n", token,
  377. STREAM_ID_FROM_TOKEN(token));
  378. prtd->cmd_ack = 1;
  379. wake_up(&prtd->flush_wait);
  380. break;
  381. case ASM_DATA_CMD_REMOVE_INITIAL_SILENCE:
  382. pr_debug("%s: ASM_DATA_CMD_REMOVE_INITIAL_SILENCE:",
  383. __func__);
  384. pr_debug("token 0x%x, stream id = %d\n", token,
  385. STREAM_ID_FROM_TOKEN(token));
  386. break;
  387. case ASM_DATA_CMD_REMOVE_TRAILING_SILENCE:
  388. pr_debug("%s: ASM_DATA_CMD_REMOVE_TRAILING_SILENCE:",
  389. __func__);
  390. pr_debug("token = 0x%x, stream id = %d\n", token,
  391. STREAM_ID_FROM_TOKEN(token));
  392. break;
  393. case ASM_STREAM_CMD_CLOSE:
  394. pr_debug("%s: ASM_DATA_CMD_CLOSE:", __func__);
  395. pr_debug("token 0x%x, stream id %d\n", token,
  396. STREAM_ID_FROM_TOKEN(token));
  397. /*
  398. * wakeup wait for stream avail on stream 3
  399. * after stream 1 ends.
  400. */
  401. if (prtd->next_stream) {
  402. pr_debug("%s:CLOSE:wakeup wait for stream\n",
  403. __func__);
  404. prtd->stream_available = 1;
  405. wake_up(&prtd->wait_for_stream_avail);
  406. prtd->next_stream = 0;
  407. }
  408. if (atomic_read(&prtd->close) &&
  409. atomic_read(&prtd->wait_on_close)) {
  410. prtd->cmd_ack = 1;
  411. wake_up(&prtd->close_wait);
  412. }
  413. atomic_set(&prtd->close, 0);
  414. break;
  415. default:
  416. break;
  417. }
  418. break;
  419. }
  420. case ASM_SESSION_CMDRSP_GET_SESSIONTIME_V3:
  421. pr_debug("%s: ASM_SESSION_CMDRSP_GET_SESSIONTIME_V3\n",
  422. __func__);
  423. break;
  424. case RESET_EVENTS:
  425. pr_err("%s: Received reset events CB, move to error state",
  426. __func__);
  427. spin_lock_irqsave(&prtd->lock, flags);
  428. snd_compr_fragment_elapsed(cstream);
  429. prtd->copied_total = prtd->bytes_received;
  430. atomic_set(&prtd->error, 1);
  431. wake_up(&prtd->drain_wait);
  432. if (atomic_read(&prtd->eos)) {
  433. pr_debug("%s:unblock eos wait queues", __func__);
  434. wake_up(&prtd->eos_wait);
  435. atomic_set(&prtd->eos, 0);
  436. }
  437. spin_unlock_irqrestore(&prtd->lock, flags);
  438. break;
  439. default:
  440. pr_debug("%s: Not Supported Event opcode[0x%x]\n",
  441. __func__, opcode);
  442. break;
  443. }
  444. }
  445. static void populate_codec_list(struct msm_compr_audio *prtd)
  446. {
  447. pr_debug("%s\n", __func__);
  448. prtd->compr_cap.direction = SND_COMPRESS_PLAYBACK;
  449. prtd->compr_cap.min_fragment_size =
  450. COMPR_PLAYBACK_MIN_FRAGMENT_SIZE;
  451. prtd->compr_cap.max_fragment_size =
  452. COMPR_PLAYBACK_MAX_FRAGMENT_SIZE;
  453. prtd->compr_cap.min_fragments =
  454. COMPR_PLAYBACK_MIN_NUM_FRAGMENTS;
  455. prtd->compr_cap.max_fragments =
  456. COMPR_PLAYBACK_MAX_NUM_FRAGMENTS;
  457. prtd->compr_cap.num_codecs = 5;
  458. prtd->compr_cap.codecs[0] = SND_AUDIOCODEC_MP3;
  459. prtd->compr_cap.codecs[1] = SND_AUDIOCODEC_AAC;
  460. prtd->compr_cap.codecs[2] = SND_AUDIOCODEC_AC3;
  461. prtd->compr_cap.codecs[3] = SND_AUDIOCODEC_EAC3;
  462. prtd->compr_cap.codecs[4] = SND_AUDIOCODEC_PCM;
  463. }
  464. static int msm_compr_send_media_format_block(struct snd_compr_stream *cstream,
  465. int stream_id)
  466. {
  467. struct snd_compr_runtime *runtime = cstream->runtime;
  468. struct msm_compr_audio *prtd = runtime->private_data;
  469. struct asm_aac_cfg aac_cfg;
  470. int ret = 0;
  471. uint16_t bit_width = 16;
  472. switch (prtd->codec) {
  473. case FORMAT_LINEAR_PCM:
  474. pr_debug("SND_AUDIOCODEC_PCM\n");
  475. if (prtd->codec_param.codec.format == SNDRV_PCM_FORMAT_S24_LE)
  476. bit_width = 24;
  477. ret = q6asm_media_format_block_pcm_format_support(
  478. prtd->audio_client,
  479. prtd->sample_rate,
  480. prtd->num_channels,
  481. bit_width);
  482. if (ret < 0)
  483. pr_err("%s: CMD Format block failed\n", __func__);
  484. break;
  485. case FORMAT_MP3:
  486. /* no media format block needed */
  487. break;
  488. case FORMAT_MPEG4_AAC:
  489. memset(&aac_cfg, 0x0, sizeof(struct asm_aac_cfg));
  490. aac_cfg.aot = AAC_ENC_MODE_EAAC_P;
  491. if (prtd->codec_param.codec.format ==
  492. SND_AUDIOSTREAMFORMAT_MP4ADTS)
  493. aac_cfg.format = 0x0;
  494. else
  495. aac_cfg.format = 0x03;
  496. aac_cfg.ch_cfg = prtd->num_channels;
  497. aac_cfg.sample_rate = prtd->sample_rate;
  498. ret = q6asm_stream_media_format_block_aac(prtd->audio_client,
  499. &aac_cfg, stream_id);
  500. if (ret < 0)
  501. pr_err("%s: CMD Format block failed\n", __func__);
  502. break;
  503. case FORMAT_AC3:
  504. break;
  505. case FORMAT_EAC3:
  506. break;
  507. default:
  508. pr_debug("%s, unsupported format, skip", __func__);
  509. break;
  510. }
  511. return ret;
  512. }
  513. static int msm_compr_configure_dsp(struct snd_compr_stream *cstream)
  514. {
  515. struct snd_compr_runtime *runtime = cstream->runtime;
  516. struct msm_compr_audio *prtd = runtime->private_data;
  517. struct snd_soc_pcm_runtime *soc_prtd = cstream->private_data;
  518. uint16_t bits_per_sample = 16;
  519. int dir = IN, ret = 0;
  520. struct audio_client *ac = prtd->audio_client;
  521. uint32_t stream_index;
  522. struct asm_softpause_params softpause = {
  523. .enable = SOFT_PAUSE_ENABLE,
  524. .period = SOFT_PAUSE_PERIOD,
  525. .step = SOFT_PAUSE_STEP,
  526. .rampingcurve = SOFT_PAUSE_CURVE_LINEAR,
  527. };
  528. struct asm_softvolume_params softvol = {
  529. .period = SOFT_VOLUME_PERIOD,
  530. .step = SOFT_VOLUME_STEP,
  531. .rampingcurve = SOFT_VOLUME_CURVE_LINEAR,
  532. };
  533. pr_debug("%s: stream_id %d\n", __func__, ac->stream_id);
  534. ret = q6asm_stream_open_write_v2(ac,
  535. prtd->codec, bits_per_sample,
  536. ac->stream_id,
  537. prtd->gapless_state.use_dsp_gapless_mode);
  538. if (ret < 0) {
  539. pr_err("%s: Session out open failed\n", __func__);
  540. return -ENOMEM;
  541. }
  542. stream_index = STREAM_ARRAY_INDEX(ac->stream_id);
  543. if (stream_index >= MAX_NUMBER_OF_STREAMS || stream_index < 0) {
  544. pr_err("%s: Invalid stream index:%d", __func__, stream_index);
  545. return -EINVAL;
  546. }
  547. prtd->gapless_state.stream_opened[stream_index] = 1;
  548. pr_debug("%s be_id %d\n", __func__, soc_prtd->dai_link->be_id);
  549. msm_pcm_routing_reg_phy_stream(soc_prtd->dai_link->be_id,
  550. ac->perf_mode,
  551. prtd->session_id,
  552. SNDRV_PCM_STREAM_PLAYBACK);
  553. ret = q6asm_set_softpause(ac, &softpause);
  554. if (ret < 0)
  555. pr_err("%s: Send SoftPause Param failed ret=%d\n",
  556. __func__, ret);
  557. /*
  558. * Setting the master volume gain to 0 while
  559. * configuring ASM session. This is to address
  560. * DSP pop noise issue where. This change is
  561. * there from begining may be DSP limitation
  562. */
  563. ret = msm_compr_set_volume(cstream, 0, 0);
  564. if (ret < 0)
  565. pr_err("%s : Set Volume failed : %d", __func__, ret);
  566. ret = q6asm_set_softvolume(ac, &softvol);
  567. if (ret < 0)
  568. pr_err("%s: Send SoftVolume Param failed ret=%d\n",
  569. __func__, ret);
  570. ret = q6asm_set_softpause(ac, &softpause);
  571. if (ret < 0)
  572. pr_err("%s: Send SoftPause Param failed ret=%d\n",
  573. __func__, ret);
  574. ret = q6asm_set_io_mode(ac, (COMPRESSED_STREAM_IO | ASYNC_IO_MODE));
  575. if (ret < 0) {
  576. pr_err("%s: Set IO mode failed\n", __func__);
  577. return -EINVAL;
  578. }
  579. runtime->fragments = prtd->codec_param.buffer.fragments;
  580. runtime->fragment_size = prtd->codec_param.buffer.fragment_size;
  581. pr_debug("allocate %d buffers each of size %d\n",
  582. runtime->fragments,
  583. runtime->fragment_size);
  584. ret = q6asm_audio_client_buf_alloc_contiguous(dir, ac,
  585. runtime->fragment_size,
  586. runtime->fragments);
  587. if (ret < 0) {
  588. pr_err("Audio Start: Buffer Allocation failed rc = %d\n", ret);
  589. return -ENOMEM;
  590. }
  591. prtd->byte_offset = 0;
  592. prtd->copied_total = 0;
  593. prtd->app_pointer = 0;
  594. prtd->bytes_received = 0;
  595. prtd->bytes_sent = 0;
  596. prtd->buffer = ac->port[dir].buf[0].data;
  597. prtd->buffer_paddr = ac->port[dir].buf[0].phys;
  598. prtd->buffer_size = runtime->fragments * runtime->fragment_size;
  599. ret = msm_compr_send_media_format_block(cstream, ac->stream_id);
  600. if (ret < 0)
  601. pr_err("%s, failed to send media format block\n", __func__);
  602. return ret;
  603. }
  604. static int msm_compr_open(struct snd_compr_stream *cstream)
  605. {
  606. struct snd_compr_runtime *runtime = cstream->runtime;
  607. struct snd_soc_pcm_runtime *rtd = cstream->private_data;
  608. struct msm_compr_audio *prtd = NULL;
  609. struct msm_compr_pdata *pdata =
  610. snd_soc_platform_get_drvdata(rtd->platform);
  611. pr_debug("%s\n", __func__);
  612. if (pdata->is_in_use[rtd->dai_link->be_id] == true) {
  613. pr_err("%s: %s is already in use,err: %d ",
  614. __func__, rtd->dai_link->cpu_dai_name, -EBUSY);
  615. return -EBUSY;
  616. }
  617. prtd = kzalloc(sizeof(struct msm_compr_audio), GFP_KERNEL);
  618. if (prtd == NULL) {
  619. pr_err("Failed to allocate memory for msm_compr_audio\n");
  620. return -ENOMEM;
  621. }
  622. prtd->cstream = cstream;
  623. pdata->cstream[rtd->dai_link->be_id] = cstream;
  624. pdata->audio_effects[rtd->dai_link->be_id] =
  625. kzalloc(sizeof(struct msm_compr_audio_effects), GFP_KERNEL);
  626. if (pdata->audio_effects[rtd->dai_link->be_id] == NULL) {
  627. pr_err("%s: Could not allocate memory for effects\n", __func__);
  628. pdata->cstream[rtd->dai_link->be_id] = NULL;
  629. kfree(prtd);
  630. return -ENOMEM;
  631. }
  632. pdata->dec_params[rtd->dai_link->be_id] =
  633. kzalloc(sizeof(struct msm_compr_dec_params), GFP_KERNEL);
  634. if (pdata->dec_params[rtd->dai_link->be_id] == NULL) {
  635. pr_err("%s: Could not allocate memory for dec params\n",
  636. __func__);
  637. kfree(pdata->audio_effects[rtd->dai_link->be_id]);
  638. pdata->audio_effects[rtd->dai_link->be_id] = NULL;
  639. pdata->cstream[rtd->dai_link->be_id] = NULL;
  640. kfree(prtd);
  641. return -ENOMEM;
  642. }
  643. prtd->audio_client = q6asm_audio_client_alloc(
  644. (app_cb)compr_event_handler, prtd);
  645. if (!prtd->audio_client) {
  646. pr_err("%s: Could not allocate memory for client\n", __func__);
  647. kfree(pdata->audio_effects[rtd->dai_link->be_id]);
  648. pdata->audio_effects[rtd->dai_link->be_id] = NULL;
  649. kfree(pdata->dec_params[rtd->dai_link->be_id]);
  650. pdata->dec_params[rtd->dai_link->be_id] = NULL;
  651. pdata->cstream[rtd->dai_link->be_id] = NULL;
  652. kfree(prtd);
  653. return -ENOMEM;
  654. }
  655. pr_debug("%s: session ID %d\n", __func__, prtd->audio_client->session);
  656. prtd->audio_client->perf_mode = false;
  657. prtd->session_id = prtd->audio_client->session;
  658. prtd->codec = FORMAT_MP3;
  659. prtd->bytes_received = 0;
  660. prtd->bytes_sent = 0;
  661. prtd->copied_total = 0;
  662. prtd->byte_offset = 0;
  663. prtd->sample_rate = 44100;
  664. prtd->num_channels = 2;
  665. prtd->drain_ready = 0;
  666. prtd->last_buffer = 0;
  667. prtd->first_buffer = 1;
  668. prtd->partial_drain_delay = 0;
  669. prtd->next_stream = 0;
  670. memset(&prtd->gapless_state, 0, sizeof(struct msm_compr_gapless_state));
  671. /*
  672. * Update the use_dsp_gapless_mode from gapless struture with the value
  673. * part of platform data.
  674. */
  675. prtd->gapless_state.use_dsp_gapless_mode = pdata->use_dsp_gapless_mode;
  676. pr_debug("%s: gapless mode %d", __func__, pdata->use_dsp_gapless_mode);
  677. spin_lock_init(&prtd->lock);
  678. atomic_set(&prtd->eos, 0);
  679. atomic_set(&prtd->start, 0);
  680. atomic_set(&prtd->drain, 0);
  681. atomic_set(&prtd->xrun, 0);
  682. atomic_set(&prtd->close, 0);
  683. atomic_set(&prtd->wait_on_close, 0);
  684. atomic_set(&prtd->error, 0);
  685. init_waitqueue_head(&prtd->eos_wait);
  686. init_waitqueue_head(&prtd->drain_wait);
  687. init_waitqueue_head(&prtd->flush_wait);
  688. init_waitqueue_head(&prtd->close_wait);
  689. init_waitqueue_head(&prtd->wait_for_stream_avail);
  690. runtime->private_data = prtd;
  691. populate_codec_list(prtd);
  692. if (cstream->direction == SND_COMPRESS_PLAYBACK) {
  693. if (!atomic_cmpxchg(&pdata->audio_ocmem_req, 0, 1))
  694. audio_ocmem_process_req(AUDIO, true);
  695. else
  696. atomic_inc(&pdata->audio_ocmem_req);
  697. pr_debug("%s: ocmem_req: %d\n", __func__,
  698. atomic_read(&pdata->audio_ocmem_req));
  699. } else {
  700. pr_err("%s: Unsupported stream type", __func__);
  701. }
  702. pdata->is_in_use[rtd->dai_link->be_id] = true;
  703. return 0;
  704. }
  705. static int msm_compr_free(struct snd_compr_stream *cstream)
  706. {
  707. struct snd_compr_runtime *runtime = cstream->runtime;
  708. struct msm_compr_audio *prtd = runtime->private_data;
  709. struct snd_soc_pcm_runtime *soc_prtd = cstream->private_data;
  710. struct msm_compr_pdata *pdata =
  711. snd_soc_platform_get_drvdata(soc_prtd->platform);
  712. struct audio_client *ac = prtd->audio_client;
  713. int dir = IN, ret = 0, stream_id;
  714. unsigned long flags;
  715. uint32_t stream_index;
  716. pr_debug("%s\n", __func__);
  717. if (atomic_read(&prtd->eos)) {
  718. ret = wait_event_timeout(prtd->eos_wait,
  719. prtd->cmd_ack, 5 * HZ);
  720. if (!ret)
  721. pr_err("%s: CMD_EOS failed\n", __func__);
  722. }
  723. if (atomic_read(&prtd->close)) {
  724. prtd->cmd_ack = 0;
  725. atomic_set(&prtd->wait_on_close, 1);
  726. ret = wait_event_timeout(prtd->close_wait,
  727. prtd->cmd_ack, 5 * HZ);
  728. if (!ret)
  729. pr_err("%s: CMD_CLOSE failed\n", __func__);
  730. }
  731. spin_lock_irqsave(&prtd->lock, flags);
  732. stream_id = ac->stream_id;
  733. stream_index = STREAM_ARRAY_INDEX(NEXT_STREAM_ID(stream_id));
  734. if ((stream_index < MAX_NUMBER_OF_STREAMS && stream_index >= 0) &&
  735. (prtd->gapless_state.stream_opened[stream_index])) {
  736. prtd->gapless_state.stream_opened[stream_index] = 0;
  737. spin_unlock_irqrestore(&prtd->lock, flags);
  738. pr_debug(" close stream %d", NEXT_STREAM_ID(stream_id));
  739. q6asm_stream_cmd(ac, CMD_CLOSE, NEXT_STREAM_ID(stream_id));
  740. spin_lock_irqsave(&prtd->lock, flags);
  741. }
  742. stream_index = STREAM_ARRAY_INDEX(stream_id);
  743. if ((stream_index < MAX_NUMBER_OF_STREAMS && stream_index >= 0) &&
  744. (prtd->gapless_state.stream_opened[stream_index])) {
  745. prtd->gapless_state.stream_opened[stream_index] = 0;
  746. spin_unlock_irqrestore(&prtd->lock, flags);
  747. pr_debug("close stream %d", stream_id);
  748. q6asm_stream_cmd(ac, CMD_CLOSE, stream_id);
  749. spin_lock_irqsave(&prtd->lock, flags);
  750. }
  751. spin_unlock_irqrestore(&prtd->lock, flags);
  752. pdata->cstream[soc_prtd->dai_link->be_id] = NULL;
  753. if (cstream->direction == SND_COMPRESS_PLAYBACK) {
  754. if (atomic_read(&pdata->audio_ocmem_req) > 1)
  755. atomic_dec(&pdata->audio_ocmem_req);
  756. else if (atomic_cmpxchg(&pdata->audio_ocmem_req, 1, 0))
  757. audio_ocmem_process_req(AUDIO, false);
  758. msm_pcm_routing_dereg_phy_stream(soc_prtd->dai_link->be_id,
  759. SNDRV_PCM_STREAM_PLAYBACK);
  760. }
  761. pr_debug("%s: ocmem_req: %d\n", __func__,
  762. atomic_read(&pdata->audio_ocmem_req));
  763. q6asm_audio_client_buf_free_contiguous(dir, ac);
  764. q6asm_audio_client_free(ac);
  765. if (pdata->audio_effects[soc_prtd->dai_link->be_id] != NULL) {
  766. kfree(pdata->audio_effects[soc_prtd->dai_link->be_id]);
  767. pdata->audio_effects[soc_prtd->dai_link->be_id] = NULL;
  768. }
  769. if (pdata->dec_params[soc_prtd->dai_link->be_id] != NULL) {
  770. kfree(pdata->dec_params[soc_prtd->dai_link->be_id]);
  771. pdata->dec_params[soc_prtd->dai_link->be_id] = NULL;
  772. }
  773. pdata->is_in_use[soc_prtd->dai_link->be_id] = false;
  774. kfree(prtd);
  775. runtime->private_data = NULL;
  776. return 0;
  777. }
  778. /* compress stream operations */
  779. static int msm_compr_set_params(struct snd_compr_stream *cstream,
  780. struct snd_compr_params *params)
  781. {
  782. struct snd_compr_runtime *runtime = cstream->runtime;
  783. struct msm_compr_audio *prtd = runtime->private_data;
  784. int ret = 0, frame_sz = 0, delay_time_ms = 0;
  785. pr_debug("%s\n", __func__);
  786. memcpy(&prtd->codec_param, params, sizeof(struct snd_compr_params));
  787. /* ToDo: remove duplicates */
  788. prtd->num_channels = prtd->codec_param.codec.ch_in;
  789. switch (prtd->codec_param.codec.sample_rate) {
  790. case SNDRV_PCM_RATE_8000:
  791. prtd->sample_rate = 8000;
  792. break;
  793. case SNDRV_PCM_RATE_11025:
  794. prtd->sample_rate = 11025;
  795. break;
  796. /* ToDo: What about 12K and 24K sample rates ? */
  797. case SNDRV_PCM_RATE_16000:
  798. prtd->sample_rate = 16000;
  799. break;
  800. case SNDRV_PCM_RATE_22050:
  801. prtd->sample_rate = 22050;
  802. break;
  803. case SNDRV_PCM_RATE_32000:
  804. prtd->sample_rate = 32000;
  805. break;
  806. case SNDRV_PCM_RATE_44100:
  807. prtd->sample_rate = 44100;
  808. break;
  809. case SNDRV_PCM_RATE_48000:
  810. prtd->sample_rate = 48000;
  811. break;
  812. }
  813. pr_debug("%s: sample_rate %d\n", __func__, prtd->sample_rate);
  814. switch (params->codec.id) {
  815. case SND_AUDIOCODEC_PCM: {
  816. pr_debug("SND_AUDIOCODEC_PCM\n");
  817. prtd->codec = FORMAT_LINEAR_PCM;
  818. break;
  819. }
  820. case SND_AUDIOCODEC_MP3: {
  821. pr_debug("SND_AUDIOCODEC_MP3\n");
  822. prtd->codec = FORMAT_MP3;
  823. frame_sz = MP3_OUTPUT_FRAME_SZ;
  824. break;
  825. }
  826. case SND_AUDIOCODEC_AAC: {
  827. pr_debug("SND_AUDIOCODEC_AAC\n");
  828. prtd->codec = FORMAT_MPEG4_AAC;
  829. frame_sz = AAC_OUTPUT_FRAME_SZ;
  830. break;
  831. }
  832. case SND_AUDIOCODEC_AC3: {
  833. prtd->codec = FORMAT_AC3;
  834. frame_sz = AC3_OUTPUT_FRAME_SZ;
  835. break;
  836. }
  837. case SND_AUDIOCODEC_EAC3: {
  838. prtd->codec = FORMAT_EAC3;
  839. frame_sz = EAC3_OUTPUT_FRAME_SZ;
  840. break;
  841. }
  842. default:
  843. pr_err("codec not supported, id =%d\n", params->codec.id);
  844. return -EINVAL;
  845. }
  846. delay_time_ms = ((DSP_NUM_OUTPUT_FRAME_BUFFERED * frame_sz * 1000) /
  847. prtd->sample_rate) + DSP_PP_BUFFERING_IN_MSEC;
  848. delay_time_ms = delay_time_ms > PARTIAL_DRAIN_ACK_EARLY_BY_MSEC ?
  849. delay_time_ms - PARTIAL_DRAIN_ACK_EARLY_BY_MSEC : 0;
  850. prtd->partial_drain_delay = delay_time_ms;
  851. ret = msm_compr_configure_dsp(cstream);
  852. return ret;
  853. }
  854. static int msm_compr_drain_buffer(struct msm_compr_audio *prtd,
  855. unsigned long *flags)
  856. {
  857. int rc = 0;
  858. atomic_set(&prtd->drain, 1);
  859. prtd->drain_ready = 0;
  860. spin_unlock_irqrestore(&prtd->lock, *flags);
  861. pr_debug("%s: wait for buffer to be drained\n", __func__);
  862. rc = wait_event_interruptible(prtd->drain_wait,
  863. prtd->drain_ready ||
  864. prtd->cmd_interrupt ||
  865. atomic_read(&prtd->xrun) ||
  866. atomic_read(&prtd->error));
  867. pr_debug("%s: out of buffer drain wait with ret %d\n", __func__, rc);
  868. spin_lock_irqsave(&prtd->lock, *flags);
  869. if (prtd->cmd_interrupt) {
  870. pr_debug("%s: buffer drain interrupted by flush)\n", __func__);
  871. rc = -EINTR;
  872. prtd->cmd_interrupt = 0;
  873. }
  874. if (atomic_read(&prtd->error)) {
  875. pr_err("%s: Got RESET EVENTS notification, return\n", __func__);
  876. rc = -ENETRESET;
  877. }
  878. return rc;
  879. }
  880. static int msm_compr_wait_for_stream_avail(struct msm_compr_audio *prtd,
  881. unsigned long *flags)
  882. {
  883. int rc = 0;
  884. pr_debug("next session is already in opened state\n");
  885. prtd->next_stream = 1;
  886. prtd->cmd_interrupt = 0;
  887. spin_unlock_irqrestore(&prtd->lock, *flags);
  888. /*
  889. * Wait for stream to be available, or the wait to be interrupted by
  890. * commands like flush or till a timeout of one second.
  891. */
  892. rc = wait_event_timeout(prtd->wait_for_stream_avail,
  893. prtd->stream_available || prtd->cmd_interrupt, 1 * HZ);
  894. pr_err("%s:prtd->stream_available %d, prtd->cmd_interrupt %d rc %d\n",
  895. __func__, prtd->stream_available, prtd->cmd_interrupt, rc);
  896. spin_lock_irqsave(&prtd->lock, *flags);
  897. if (rc == 0) {
  898. pr_err("%s: wait_for_stream_avail timed out\n",
  899. __func__);
  900. rc = -ETIMEDOUT;
  901. } else if (prtd->cmd_interrupt == 1) {
  902. /*
  903. * This scenario might not happen as we do not allow
  904. * flush in transition state.
  905. */
  906. pr_debug("%s: wait_for_stream_avail interrupted\n", __func__);
  907. prtd->cmd_interrupt = 0;
  908. prtd->stream_available = 0;
  909. rc = -EINTR;
  910. } else {
  911. prtd->stream_available = 0;
  912. rc = 0;
  913. }
  914. pr_debug("%s : rc = %d", __func__, rc);
  915. return rc;
  916. }
  917. static int msm_compr_trigger(struct snd_compr_stream *cstream, int cmd)
  918. {
  919. struct snd_compr_runtime *runtime = cstream->runtime;
  920. struct msm_compr_audio *prtd = runtime->private_data;
  921. struct snd_soc_pcm_runtime *rtd = cstream->private_data;
  922. struct msm_compr_pdata *pdata =
  923. snd_soc_platform_get_drvdata(rtd->platform);
  924. uint32_t *volume = pdata->volume[rtd->dai_link->be_id];
  925. struct audio_client *ac = prtd->audio_client;
  926. int rc = 0;
  927. int bytes_to_write;
  928. unsigned long flags;
  929. int stream_id;
  930. uint32_t stream_index;
  931. if (cstream->direction != SND_COMPRESS_PLAYBACK) {
  932. pr_err("%s: Unsupported stream type\n", __func__);
  933. return -EINVAL;
  934. }
  935. spin_lock_irqsave(&prtd->lock, flags);
  936. if (atomic_read(&prtd->error)) {
  937. pr_err("%s Got RESET EVENTS notification, return immediately", __func__);
  938. spin_unlock_irqrestore(&prtd->lock, flags);
  939. return 0;
  940. }
  941. spin_unlock_irqrestore(&prtd->lock, flags);
  942. switch (cmd) {
  943. case SNDRV_PCM_TRIGGER_START:
  944. pr_debug("%s: SNDRV_PCM_TRIGGER_START\n", __func__);
  945. atomic_set(&prtd->start, 1);
  946. q6asm_run_nowait(prtd->audio_client, 0, 0, 0);
  947. msm_compr_set_volume(cstream, volume[0], volume[1]);
  948. if (rc)
  949. pr_err("%s : Set Volume failed : %d\n",
  950. __func__, rc);
  951. break;
  952. case SNDRV_PCM_TRIGGER_STOP:
  953. spin_lock_irqsave(&prtd->lock, flags);
  954. pr_debug("%s: SNDRV_PCM_TRIGGER_STOP transition %d\n", __func__,
  955. prtd->gapless_state.gapless_transition);
  956. stream_id = ac->stream_id;
  957. atomic_set(&prtd->start, 0);
  958. if (prtd->next_stream) {
  959. pr_debug("%s: interrupt next track wait queues\n",
  960. __func__);
  961. prtd->cmd_interrupt = 1;
  962. wake_up(&prtd->wait_for_stream_avail);
  963. prtd->next_stream = 0;
  964. }
  965. if (atomic_read(&prtd->eos)) {
  966. pr_debug("%s: interrupt eos wait queues", __func__);
  967. prtd->cmd_interrupt = 1;
  968. wake_up(&prtd->eos_wait);
  969. atomic_set(&prtd->eos, 0);
  970. }
  971. if (atomic_read(&prtd->drain)) {
  972. pr_debug("%s: interrupt drain wait queues", __func__);
  973. prtd->cmd_interrupt = 1;
  974. prtd->drain_ready = 1;
  975. wake_up(&prtd->drain_wait);
  976. atomic_set(&prtd->drain, 0);
  977. }
  978. prtd->last_buffer = 0;
  979. prtd->cmd_ack = 0;
  980. if (!prtd->gapless_state.gapless_transition) {
  981. pr_debug("issue CMD_FLUSH stream_id %d\n", stream_id);
  982. spin_unlock_irqrestore(&prtd->lock, flags);
  983. rc = q6asm_stream_cmd(
  984. prtd->audio_client, CMD_FLUSH, stream_id);
  985. if (rc < 0) {
  986. pr_err("%s: flush cmd failed rc=%d\n",
  987. __func__, rc);
  988. return rc;
  989. }
  990. rc = wait_event_timeout(prtd->flush_wait,
  991. prtd->cmd_ack, 1 * HZ);
  992. if (!rc) {
  993. rc = -ETIMEDOUT;
  994. pr_err("Flush cmd timeout\n");
  995. } else {
  996. rc = 0; /* prtd->cmd_status == OK? 0 : -EPERM*/
  997. }
  998. spin_lock_irqsave(&prtd->lock, flags);
  999. } else {
  1000. prtd->first_buffer = 0;
  1001. }
  1002. /* FIXME. only reset if flush was successful */
  1003. prtd->byte_offset = 0;
  1004. prtd->copied_total = 0;
  1005. prtd->app_pointer = 0;
  1006. prtd->bytes_received = 0;
  1007. prtd->bytes_sent = 0;
  1008. prtd->marker_timestamp = 0;
  1009. atomic_set(&prtd->xrun, 0);
  1010. spin_unlock_irqrestore(&prtd->lock, flags);
  1011. break;
  1012. case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
  1013. pr_debug("SNDRV_PCM_TRIGGER_PAUSE_PUSH transition %d\n",
  1014. prtd->gapless_state.gapless_transition);
  1015. if (!prtd->gapless_state.gapless_transition) {
  1016. pr_debug("issue CMD_PAUSE stream_id %d\n",
  1017. ac->stream_id);
  1018. q6asm_stream_cmd_nowait(ac, CMD_PAUSE, ac->stream_id);
  1019. atomic_set(&prtd->start, 0);
  1020. }
  1021. break;
  1022. case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
  1023. pr_debug("SNDRV_PCM_TRIGGER_PAUSE_RELEASE transition %d\n",
  1024. prtd->gapless_state.gapless_transition);
  1025. if (!prtd->gapless_state.gapless_transition) {
  1026. atomic_set(&prtd->start, 1);
  1027. q6asm_run_nowait(prtd->audio_client, 0, 0, 0);
  1028. }
  1029. break;
  1030. case SND_COMPR_TRIGGER_PARTIAL_DRAIN:
  1031. pr_debug("%s: SND_COMPR_TRIGGER_PARTIAL_DRAIN\n", __func__);
  1032. if (!prtd->gapless_state.use_dsp_gapless_mode) {
  1033. pr_debug("%s: set partial drain as drain\n", __func__);
  1034. cmd = SND_COMPR_TRIGGER_DRAIN;
  1035. }
  1036. case SND_COMPR_TRIGGER_DRAIN:
  1037. pr_debug("%s: SNDRV_COMPRESS_DRAIN\n", __func__);
  1038. /* Make sure all the data is sent to DSP before sending EOS */
  1039. spin_lock_irqsave(&prtd->lock, flags);
  1040. if (!atomic_read(&prtd->start)) {
  1041. pr_err("%s: stream is not in started state\n",
  1042. __func__);
  1043. rc = -EPERM;
  1044. spin_unlock_irqrestore(&prtd->lock, flags);
  1045. break;
  1046. }
  1047. if (prtd->bytes_received > prtd->copied_total) {
  1048. pr_debug("%s: wait till all the data is sent to dsp\n",
  1049. __func__);
  1050. rc = msm_compr_drain_buffer(prtd, &flags);
  1051. if (rc || !atomic_read(&prtd->start)) {
  1052. rc = -EINTR;
  1053. spin_unlock_irqrestore(&prtd->lock, flags);
  1054. break;
  1055. }
  1056. /*
  1057. * FIXME: Bug.
  1058. * Write(32767)
  1059. * Start
  1060. * Drain <- Indefinite wait
  1061. * sol1 : if (prtd->copied_total) then wait?
  1062. * sol2 : prtd->cmd_interrupt || prtd->drain_ready || atomic_read(xrun)
  1063. */
  1064. bytes_to_write = prtd->bytes_received - prtd->copied_total;
  1065. WARN(bytes_to_write > runtime->fragment_size,
  1066. "last write %d cannot be > than fragment_size",
  1067. bytes_to_write);
  1068. if (bytes_to_write > 0) {
  1069. pr_debug("%s: send %d partial bytes at the end",
  1070. __func__, bytes_to_write);
  1071. atomic_set(&prtd->xrun, 0);
  1072. prtd->last_buffer = 1;
  1073. msm_compr_send_buffer(prtd);
  1074. }
  1075. }
  1076. if ((cmd == SND_COMPR_TRIGGER_PARTIAL_DRAIN) &&
  1077. (prtd->gapless_state.set_next_stream_id)) {
  1078. /* wait for the last buffer to be returned */
  1079. if (prtd->last_buffer) {
  1080. pr_debug("%s: last buffer drain\n", __func__);
  1081. rc = msm_compr_drain_buffer(prtd, &flags);
  1082. if (rc) {
  1083. spin_unlock_irqrestore(&prtd->lock, flags);
  1084. break;
  1085. }
  1086. }
  1087. /* send EOS */
  1088. prtd->cmd_ack = 0;
  1089. pr_debug("issue CMD_EOS stream_id %d\n", ac->stream_id);
  1090. q6asm_stream_cmd_nowait(ac, CMD_EOS, ac->stream_id);
  1091. pr_info("PARTIAL DRAIN, do not wait for EOS ack\n");
  1092. /* send a zero length buffer */
  1093. atomic_set(&prtd->xrun, 0);
  1094. msm_compr_send_buffer(prtd);
  1095. /* wait for the zero length buffer to be returned */
  1096. pr_debug("%s: zero length buffer drain\n", __func__);
  1097. rc = msm_compr_drain_buffer(prtd, &flags);
  1098. if (rc) {
  1099. spin_unlock_irqrestore(&prtd->lock, flags);
  1100. break;
  1101. }
  1102. /* sleep for additional duration partial drain */
  1103. atomic_set(&prtd->drain, 1);
  1104. prtd->drain_ready = 0;
  1105. pr_debug("%s, additional sleep: %d\n", __func__,
  1106. prtd->partial_drain_delay);
  1107. spin_unlock_irqrestore(&prtd->lock, flags);
  1108. rc = wait_event_timeout(prtd->drain_wait,
  1109. prtd->drain_ready || prtd->cmd_interrupt,
  1110. msecs_to_jiffies(prtd->partial_drain_delay));
  1111. pr_debug("%s: out of additional wait for low sample rate\n",
  1112. __func__);
  1113. spin_lock_irqsave(&prtd->lock, flags);
  1114. if (prtd->cmd_interrupt) {
  1115. pr_debug("%s: additional wait interrupted by flush)\n",
  1116. __func__);
  1117. rc = -EINTR;
  1118. prtd->cmd_interrupt = 0;
  1119. spin_unlock_irqrestore(&prtd->lock, flags);
  1120. break;
  1121. }
  1122. /* move to next stream and reset vars */
  1123. pr_debug("%s: Moving to next stream in gapless\n",
  1124. __func__);
  1125. ac->stream_id = NEXT_STREAM_ID(ac->stream_id);
  1126. prtd->byte_offset = 0;
  1127. prtd->app_pointer = 0;
  1128. prtd->first_buffer = 1;
  1129. prtd->last_buffer = 0;
  1130. prtd->gapless_state.gapless_transition = 1;
  1131. prtd->marker_timestamp = 0;
  1132. /*
  1133. Don't reset these as these vars map to
  1134. total_bytes_transferred and total_bytes_available
  1135. directly, only total_bytes_transferred will be updated
  1136. in the next avail() ioctl
  1137. prtd->copied_total = 0;
  1138. prtd->bytes_received = 0;
  1139. */
  1140. atomic_set(&prtd->drain, 0);
  1141. atomic_set(&prtd->xrun, 1);
  1142. pr_debug("%s: issue CMD_RUN", __func__);
  1143. q6asm_run_nowait(prtd->audio_client, 0, 0, 0);
  1144. spin_unlock_irqrestore(&prtd->lock, flags);
  1145. break;
  1146. }
  1147. /*
  1148. moving to next stream failed, so reset the gapless state
  1149. set next stream id for the same session so that the same
  1150. stream can be used for gapless playback
  1151. */
  1152. prtd->gapless_state.set_next_stream_id = false;
  1153. pr_debug("%s:CMD_EOS stream_id %d\n", __func__, ac->stream_id);
  1154. prtd->cmd_ack = 0;
  1155. atomic_set(&prtd->eos, 1);
  1156. q6asm_stream_cmd_nowait(ac, CMD_EOS, ac->stream_id);
  1157. spin_unlock_irqrestore(&prtd->lock, flags);
  1158. /* Wait indefinitely for DRAIN. Flush can also signal this*/
  1159. rc = wait_event_interruptible(prtd->eos_wait,
  1160. (prtd->cmd_ack ||
  1161. prtd->cmd_interrupt ||
  1162. atomic_read(&prtd->error)));
  1163. if (rc < 0)
  1164. pr_err("%s: EOS wait failed\n", __func__);
  1165. pr_debug("%s: SNDRV_COMPRESS_DRAIN out of wait for EOS\n",
  1166. __func__);
  1167. if (prtd->cmd_interrupt)
  1168. rc = -EINTR;
  1169. if (atomic_read(&prtd->error)) {
  1170. pr_err("%s: Got RESET EVENTS notification, return\n", __func__);
  1171. rc = -ENETRESET;
  1172. }
  1173. /*FIXME : what if a flush comes while PC is here */
  1174. if (rc == 0) {
  1175. /*
  1176. * Failed to open second stream in DSP for gapless
  1177. * so prepare the current stream in session for gapless playback
  1178. */
  1179. spin_lock_irqsave(&prtd->lock, flags);
  1180. pr_debug("%s:issue CMD_PAUSE stream_id %d",
  1181. __func__, ac->stream_id);
  1182. q6asm_stream_cmd_nowait(ac, CMD_PAUSE, ac->stream_id);
  1183. prtd->cmd_ack = 0;
  1184. spin_unlock_irqrestore(&prtd->lock, flags);
  1185. /*
  1186. * Cache this time as last known time
  1187. */
  1188. q6asm_get_session_time(prtd->audio_client,
  1189. &prtd->marker_timestamp);
  1190. spin_lock_irqsave(&prtd->lock, flags);
  1191. /*
  1192. * Don't reset these as these vars map to
  1193. * total_bytes_transferred and total_bytes_available.
  1194. * Just total_bytes_transferred will be updated
  1195. * in the next avail() ioctl.
  1196. * prtd->copied_total = 0;
  1197. * prtd->bytes_received = 0;
  1198. * do not reset prtd->bytes_sent as well as the same
  1199. * session is used for gapless playback
  1200. */
  1201. prtd->byte_offset = 0;
  1202. prtd->app_pointer = 0;
  1203. prtd->first_buffer = 1;
  1204. prtd->last_buffer = 0;
  1205. atomic_set(&prtd->drain, 0);
  1206. atomic_set(&prtd->xrun, 1);
  1207. spin_unlock_irqrestore(&prtd->lock, flags);
  1208. pr_debug("%s:issue CMD_FLUSH ac->stream_id %d",
  1209. __func__, ac->stream_id);
  1210. q6asm_stream_cmd(ac, CMD_FLUSH, ac->stream_id);
  1211. wait_event_timeout(prtd->flush_wait,
  1212. prtd->cmd_ack, 1 * HZ / 4);
  1213. q6asm_run_nowait(prtd->audio_client, 0, 0, 0);
  1214. }
  1215. prtd->cmd_interrupt = 0;
  1216. break;
  1217. case SND_COMPR_TRIGGER_NEXT_TRACK:
  1218. if (!prtd->gapless_state.use_dsp_gapless_mode) {
  1219. pr_debug("%s: ignore trigger next track\n", __func__);
  1220. rc = 0;
  1221. break;
  1222. }
  1223. pr_debug("%s: SND_COMPR_TRIGGER_NEXT_TRACK\n", __func__);
  1224. spin_lock_irqsave(&prtd->lock, flags);
  1225. rc = 0;
  1226. /* next stream in gapless */
  1227. stream_id = NEXT_STREAM_ID(ac->stream_id);
  1228. /*
  1229. * Wait if stream 1 has not completed before honoring next
  1230. * track for stream 3. Scenario happens if second clip is
  1231. * small and fills in one buffer so next track will be
  1232. * called immediately.
  1233. */
  1234. stream_index = STREAM_ARRAY_INDEX(stream_id);
  1235. if (stream_index >= MAX_NUMBER_OF_STREAMS ||
  1236. stream_index < 0) {
  1237. pr_err("%s: Invalid stream index: %d", __func__,
  1238. stream_index);
  1239. spin_unlock_irqrestore(&prtd->lock, flags);
  1240. rc = -EINVAL;
  1241. break;
  1242. }
  1243. if (prtd->gapless_state.stream_opened[stream_index]) {
  1244. if (prtd->gapless_state.gapless_transition) {
  1245. rc = msm_compr_wait_for_stream_avail(prtd,
  1246. &flags);
  1247. } else {
  1248. /*
  1249. * If session is already opened break out if
  1250. * the state is not gapless transition. This
  1251. * is when seek happens after the last buffer
  1252. * is sent to the driver. Next track would be
  1253. * called again after last buffer is sent.
  1254. */
  1255. pr_debug("next session is in opened state\n");
  1256. spin_unlock_irqrestore(&prtd->lock, flags);
  1257. break;
  1258. }
  1259. }
  1260. spin_unlock_irqrestore(&prtd->lock, flags);
  1261. if (rc < 0) {
  1262. /*
  1263. * if return type EINTR then reset to zero. Tiny
  1264. * compress treats EINTR as error and prevents PARTIAL
  1265. * DRAIN. EINTR is not an error. wait for stream avail
  1266. * is interrupted by some other command like FLUSH.
  1267. */
  1268. if (rc == -EINTR) {
  1269. pr_debug("%s: EINTR reset rc to 0\n", __func__);
  1270. rc = 0;
  1271. }
  1272. break;
  1273. }
  1274. pr_debug("%s: open_write stream_id %d", __func__, stream_id);
  1275. rc = q6asm_stream_open_write_v2(prtd->audio_client,
  1276. prtd->codec, 16,
  1277. stream_id,
  1278. prtd->gapless_state.use_dsp_gapless_mode);
  1279. if (rc < 0) {
  1280. pr_err("%s: Session out open failed for gapless\n",
  1281. __func__);
  1282. break;
  1283. }
  1284. rc = msm_compr_send_media_format_block(cstream, stream_id);
  1285. if (rc < 0) {
  1286. pr_err("%s, failed to send media format block\n",
  1287. __func__);
  1288. break;
  1289. }
  1290. spin_lock_irqsave(&prtd->lock, flags);
  1291. prtd->gapless_state.stream_opened[stream_index] = 1;
  1292. prtd->gapless_state.set_next_stream_id = true;
  1293. spin_unlock_irqrestore(&prtd->lock, flags);
  1294. break;
  1295. }
  1296. return rc;
  1297. }
  1298. static int msm_compr_pointer(struct snd_compr_stream *cstream,
  1299. struct snd_compr_tstamp *arg)
  1300. {
  1301. struct snd_compr_runtime *runtime = cstream->runtime;
  1302. struct msm_compr_audio *prtd = runtime->private_data;
  1303. struct snd_compr_tstamp tstamp;
  1304. uint64_t timestamp = 0;
  1305. int rc = 0, first_buffer;
  1306. unsigned long flags;
  1307. pr_debug("%s\n", __func__);
  1308. memset(&tstamp, 0x0, sizeof(struct snd_compr_tstamp));
  1309. spin_lock_irqsave(&prtd->lock, flags);
  1310. tstamp.sampling_rate = prtd->sample_rate;
  1311. tstamp.byte_offset = prtd->byte_offset;
  1312. tstamp.copied_total = prtd->copied_total;
  1313. first_buffer = prtd->first_buffer;
  1314. if (atomic_read(&prtd->error)) {
  1315. pr_err("%s Got RESET EVENTS notification, return error", __func__);
  1316. tstamp.pcm_io_frames = 0;
  1317. memcpy(arg, &tstamp, sizeof(struct snd_compr_tstamp));
  1318. spin_unlock_irqrestore(&prtd->lock, flags);
  1319. return -ENETRESET;
  1320. }
  1321. spin_unlock_irqrestore(&prtd->lock, flags);
  1322. /*
  1323. Query timestamp from DSP if some data is with it.
  1324. This prevents timeouts.
  1325. */
  1326. if (!first_buffer) {
  1327. rc = q6asm_get_session_time(prtd->audio_client, &timestamp);
  1328. if (rc < 0) {
  1329. pr_err("%s: Get Session Time return value =%lld\n",
  1330. __func__, timestamp);
  1331. if (atomic_read(&prtd->error))
  1332. return -ENETRESET;
  1333. else
  1334. return -EAGAIN;
  1335. }
  1336. } else {
  1337. timestamp = prtd->marker_timestamp;
  1338. }
  1339. /* DSP returns timestamp in usec */
  1340. pr_debug("%s: timestamp = %lld usec\n", __func__, timestamp);
  1341. timestamp *= prtd->sample_rate;
  1342. tstamp.pcm_io_frames = (snd_pcm_uframes_t)div64_u64(timestamp, 1000000);
  1343. memcpy(arg, &tstamp, sizeof(struct snd_compr_tstamp));
  1344. return 0;
  1345. }
  1346. static int msm_compr_ack(struct snd_compr_stream *cstream,
  1347. size_t count)
  1348. {
  1349. struct snd_compr_runtime *runtime = cstream->runtime;
  1350. struct msm_compr_audio *prtd = runtime->private_data;
  1351. void *src, *dstn;
  1352. size_t copy;
  1353. unsigned long flags;
  1354. WARN(1, "This path is untested");
  1355. return -EINVAL;
  1356. pr_debug("%s: count = %d\n", __func__, count);
  1357. if (!prtd->buffer) {
  1358. pr_err("%s: Buffer is not allocated yet ??\n", __func__);
  1359. return -EINVAL;
  1360. }
  1361. src = runtime->buffer + prtd->app_pointer;
  1362. dstn = prtd->buffer + prtd->app_pointer;
  1363. if (count < prtd->buffer_size - prtd->app_pointer) {
  1364. memcpy(dstn, src, count);
  1365. prtd->app_pointer += count;
  1366. } else {
  1367. copy = prtd->buffer_size - prtd->app_pointer;
  1368. memcpy(dstn, src, copy);
  1369. memcpy(prtd->buffer, runtime->buffer, count - copy);
  1370. prtd->app_pointer = count - copy;
  1371. }
  1372. /*
  1373. * If the stream is started and all the bytes received were
  1374. * copied to DSP, the newly received bytes should be
  1375. * sent right away
  1376. */
  1377. spin_lock_irqsave(&prtd->lock, flags);
  1378. if (atomic_read(&prtd->start) &&
  1379. prtd->bytes_received == prtd->copied_total) {
  1380. prtd->bytes_received += count;
  1381. msm_compr_send_buffer(prtd);
  1382. } else
  1383. prtd->bytes_received += count;
  1384. spin_unlock_irqrestore(&prtd->lock, flags);
  1385. return 0;
  1386. }
  1387. static int msm_compr_copy(struct snd_compr_stream *cstream,
  1388. char __user *buf, size_t count)
  1389. {
  1390. struct snd_compr_runtime *runtime = cstream->runtime;
  1391. struct msm_compr_audio *prtd = runtime->private_data;
  1392. void *dstn;
  1393. size_t copy;
  1394. size_t bytes_available = 0;
  1395. unsigned long flags;
  1396. pr_debug("%s: count = %d\n", __func__, count);
  1397. if (!prtd->buffer) {
  1398. pr_err("%s: Buffer is not allocated yet ??", __func__);
  1399. return 0;
  1400. }
  1401. spin_lock_irqsave(&prtd->lock, flags);
  1402. if (atomic_read(&prtd->error)) {
  1403. pr_err("%s Got RESET EVENTS notification", __func__);
  1404. spin_unlock_irqrestore(&prtd->lock, flags);
  1405. return -ENETRESET;
  1406. }
  1407. spin_unlock_irqrestore(&prtd->lock, flags);
  1408. dstn = prtd->buffer + prtd->app_pointer;
  1409. if (count < prtd->buffer_size - prtd->app_pointer) {
  1410. if (copy_from_user(dstn, buf, count))
  1411. return -EFAULT;
  1412. prtd->app_pointer += count;
  1413. } else {
  1414. copy = prtd->buffer_size - prtd->app_pointer;
  1415. if (copy_from_user(dstn, buf, copy))
  1416. return -EFAULT;
  1417. if (copy_from_user(prtd->buffer, buf + copy, count - copy))
  1418. return -EFAULT;
  1419. prtd->app_pointer = count - copy;
  1420. }
  1421. /*
  1422. * If stream is started and there has been an xrun,
  1423. * since the available bytes fits fragment_size, copy the data right away
  1424. */
  1425. spin_lock_irqsave(&prtd->lock, flags);
  1426. if (prtd->gapless_state.gapless_transition)
  1427. prtd->gapless_state.gapless_transition = 0;
  1428. prtd->bytes_received += count;
  1429. if (atomic_read(&prtd->start)) {
  1430. if (atomic_read(&prtd->xrun)) {
  1431. pr_debug("%s: in xrun, count = %d\n", __func__, count);
  1432. bytes_available = prtd->bytes_received - prtd->copied_total;
  1433. if (bytes_available >= runtime->fragment_size) {
  1434. pr_debug("%s: handle xrun, bytes_to_write = %d\n",
  1435. __func__,
  1436. bytes_available);
  1437. atomic_set(&prtd->xrun, 0);
  1438. msm_compr_send_buffer(prtd);
  1439. } /* else not sufficient data */
  1440. } /* writes will continue on the next write_done */
  1441. }
  1442. spin_unlock_irqrestore(&prtd->lock, flags);
  1443. return count;
  1444. }
  1445. static int msm_compr_get_caps(struct snd_compr_stream *cstream,
  1446. struct snd_compr_caps *arg)
  1447. {
  1448. struct snd_compr_runtime *runtime = cstream->runtime;
  1449. struct msm_compr_audio *prtd = runtime->private_data;
  1450. pr_debug("%s\n", __func__);
  1451. memcpy(arg, &prtd->compr_cap, sizeof(struct snd_compr_caps));
  1452. return 0;
  1453. }
  1454. static int msm_compr_get_codec_caps(struct snd_compr_stream *cstream,
  1455. struct snd_compr_codec_caps *codec)
  1456. {
  1457. pr_debug("%s\n", __func__);
  1458. switch (codec->codec) {
  1459. case SND_AUDIOCODEC_MP3:
  1460. codec->num_descriptors = 2;
  1461. codec->descriptor[0].max_ch = 2;
  1462. codec->descriptor[0].sample_rates = SNDRV_PCM_RATE_8000_48000;
  1463. codec->descriptor[0].bit_rate[0] = 320; /* 320kbps */
  1464. codec->descriptor[0].bit_rate[1] = 128;
  1465. codec->descriptor[0].num_bitrates = 2;
  1466. codec->descriptor[0].profiles = 0;
  1467. codec->descriptor[0].modes = SND_AUDIOCHANMODE_MP3_STEREO;
  1468. codec->descriptor[0].formats = 0;
  1469. break;
  1470. case SND_AUDIOCODEC_AAC:
  1471. codec->num_descriptors = 2;
  1472. codec->descriptor[1].max_ch = 2;
  1473. codec->descriptor[1].sample_rates = SNDRV_PCM_RATE_8000_48000;
  1474. codec->descriptor[1].bit_rate[0] = 320; /* 320kbps */
  1475. codec->descriptor[1].bit_rate[1] = 128;
  1476. codec->descriptor[1].num_bitrates = 2;
  1477. codec->descriptor[1].profiles = 0;
  1478. codec->descriptor[1].modes = 0;
  1479. codec->descriptor[1].formats =
  1480. (SND_AUDIOSTREAMFORMAT_MP4ADTS |
  1481. SND_AUDIOSTREAMFORMAT_RAW);
  1482. break;
  1483. case SND_AUDIOCODEC_AC3:
  1484. break;
  1485. case SND_AUDIOCODEC_EAC3:
  1486. break;
  1487. default:
  1488. pr_err("%s: Unsupported audio codec %d\n",
  1489. __func__, codec->codec);
  1490. return -EINVAL;
  1491. }
  1492. return 0;
  1493. }
  1494. static int msm_compr_set_metadata(struct snd_compr_stream *cstream,
  1495. struct snd_compr_metadata *metadata)
  1496. {
  1497. struct msm_compr_audio *prtd;
  1498. struct audio_client *ac;
  1499. pr_debug("%s\n", __func__);
  1500. if (!metadata || !cstream)
  1501. return -EINVAL;
  1502. prtd = cstream->runtime->private_data;
  1503. if (!prtd->audio_client && !prtd)
  1504. return -EINVAL;
  1505. ac = prtd->audio_client;
  1506. if (metadata->key == SNDRV_COMPRESS_ENCODER_PADDING) {
  1507. pr_debug("%s, got encoder padding %u", __func__, metadata->value[0]);
  1508. prtd->gapless_state.trailing_samples_drop = metadata->value[0];
  1509. } else if (metadata->key == SNDRV_COMPRESS_ENCODER_DELAY) {
  1510. pr_debug("%s, got encoder delay %u", __func__, metadata->value[0]);
  1511. prtd->gapless_state.initial_samples_drop = metadata->value[0];
  1512. }
  1513. return 0;
  1514. }
  1515. static int msm_compr_volume_put(struct snd_kcontrol *kcontrol,
  1516. struct snd_ctl_elem_value *ucontrol)
  1517. {
  1518. struct snd_soc_platform *platform = snd_kcontrol_chip(kcontrol);
  1519. unsigned long fe_id = kcontrol->private_value;
  1520. struct msm_compr_pdata *pdata = (struct msm_compr_pdata *)
  1521. snd_soc_platform_get_drvdata(platform);
  1522. struct snd_compr_stream *cstream = NULL;
  1523. uint32_t *volume = NULL;
  1524. if (fe_id >= MSM_FRONTEND_DAI_MAX) {
  1525. pr_err("%s Received out of bounds fe_id %lu\n",
  1526. __func__, fe_id);
  1527. return -EINVAL;
  1528. }
  1529. cstream = pdata->cstream[fe_id];
  1530. volume = pdata->volume[fe_id];
  1531. volume[0] = ucontrol->value.integer.value[0];
  1532. volume[1] = ucontrol->value.integer.value[1];
  1533. pr_debug("%s: fe_id %lu left_vol %d right_vol %d\n",
  1534. __func__, fe_id, volume[0], volume[1]);
  1535. if (cstream)
  1536. msm_compr_set_volume(cstream, volume[0], volume[1]);
  1537. return 0;
  1538. }
  1539. static int msm_compr_volume_get(struct snd_kcontrol *kcontrol,
  1540. struct snd_ctl_elem_value *ucontrol)
  1541. {
  1542. struct snd_soc_platform *platform = snd_kcontrol_chip(kcontrol);
  1543. unsigned long fe_id = kcontrol->private_value;
  1544. struct msm_compr_pdata *pdata =
  1545. snd_soc_platform_get_drvdata(platform);
  1546. uint32_t *volume = NULL;
  1547. if (fe_id >= MSM_FRONTEND_DAI_MAX) {
  1548. pr_err("%s Received out of bound fe_id %lu\n", __func__, fe_id);
  1549. return -EINVAL;
  1550. }
  1551. volume = pdata->volume[fe_id];
  1552. pr_debug("%s: fe_id %lu\n", __func__, fe_id);
  1553. ucontrol->value.integer.value[0] = volume[0];
  1554. ucontrol->value.integer.value[1] = volume[1];
  1555. return 0;
  1556. }
  1557. static int msm_compr_audio_effects_config_put(struct snd_kcontrol *kcontrol,
  1558. struct snd_ctl_elem_value *ucontrol)
  1559. {
  1560. struct snd_soc_platform *platform = snd_kcontrol_chip(kcontrol);
  1561. unsigned long fe_id = kcontrol->private_value;
  1562. struct msm_compr_pdata *pdata = (struct msm_compr_pdata *)
  1563. snd_soc_platform_get_drvdata(platform);
  1564. struct msm_compr_audio_effects *audio_effects = NULL;
  1565. struct snd_compr_stream *cstream = NULL;
  1566. struct msm_compr_audio *prtd = NULL;
  1567. long *values = &(ucontrol->value.integer.value[0]);
  1568. int effects_module;
  1569. pr_debug("%s\n", __func__);
  1570. if (fe_id >= MSM_FRONTEND_DAI_MAX) {
  1571. pr_err("%s Received out of bounds fe_id %lu\n",
  1572. __func__, fe_id);
  1573. return -EINVAL;
  1574. }
  1575. cstream = pdata->cstream[fe_id];
  1576. audio_effects = pdata->audio_effects[fe_id];
  1577. if (!cstream || !audio_effects) {
  1578. pr_err("%s: stream or effects inactive\n", __func__);
  1579. return -EINVAL;
  1580. }
  1581. prtd = cstream->runtime->private_data;
  1582. if (!prtd) {
  1583. pr_err("%s: cannot set audio effects\n", __func__);
  1584. return -EINVAL;
  1585. }
  1586. effects_module = *values++;
  1587. switch (effects_module) {
  1588. case VIRTUALIZER_MODULE:
  1589. pr_debug("%s: VIRTUALIZER_MODULE\n", __func__);
  1590. msm_audio_effects_virtualizer_handler(prtd->audio_client,
  1591. &(audio_effects->virtualizer),
  1592. values);
  1593. break;
  1594. case REVERB_MODULE:
  1595. pr_debug("%s: REVERB_MODULE\n", __func__);
  1596. msm_audio_effects_reverb_handler(prtd->audio_client,
  1597. &(audio_effects->reverb),
  1598. values);
  1599. break;
  1600. case BASS_BOOST_MODULE:
  1601. pr_debug("%s: BASS_BOOST_MODULE\n", __func__);
  1602. msm_audio_effects_bass_boost_handler(prtd->audio_client,
  1603. &(audio_effects->bass_boost),
  1604. values);
  1605. break;
  1606. case EQ_MODULE:
  1607. pr_debug("%s: EQ_MODULE\n", __func__);
  1608. msm_audio_effects_popless_eq_handler(prtd->audio_client,
  1609. &(audio_effects->equalizer),
  1610. values);
  1611. break;
  1612. default:
  1613. pr_err("%s Invalid effects config module\n", __func__);
  1614. return -EINVAL;
  1615. }
  1616. return 0;
  1617. }
  1618. static int msm_compr_audio_effects_config_get(struct snd_kcontrol *kcontrol,
  1619. struct snd_ctl_elem_value *ucontrol)
  1620. {
  1621. /* dummy function */
  1622. return 0;
  1623. }
  1624. static int msm_compr_dec_params_put(struct snd_kcontrol *kcontrol,
  1625. struct snd_ctl_elem_value *ucontrol)
  1626. {
  1627. struct snd_soc_platform *platform = snd_kcontrol_chip(kcontrol);
  1628. unsigned long fe_id = kcontrol->private_value;
  1629. struct msm_compr_pdata *pdata = (struct msm_compr_pdata *)
  1630. snd_soc_platform_get_drvdata(platform);
  1631. struct msm_compr_dec_params *dec_params = NULL;
  1632. struct snd_compr_stream *cstream = NULL;
  1633. struct msm_compr_audio *prtd = NULL;
  1634. long *values = &(ucontrol->value.integer.value[0]);
  1635. pr_debug("%s\n", __func__);
  1636. if (fe_id >= MSM_FRONTEND_DAI_MAX) {
  1637. pr_err("%s Received out of bounds fe_id %lu\n",
  1638. __func__, fe_id);
  1639. return -EINVAL;
  1640. }
  1641. cstream = pdata->cstream[fe_id];
  1642. dec_params = pdata->dec_params[fe_id];
  1643. if (!cstream || !dec_params) {
  1644. pr_err("%s: stream or dec_params inactive\n", __func__);
  1645. return -EINVAL;
  1646. }
  1647. prtd = cstream->runtime->private_data;
  1648. if (!prtd) {
  1649. pr_err("%s: cannot set dec_params\n", __func__);
  1650. return -EINVAL;
  1651. }
  1652. switch (prtd->codec) {
  1653. case FORMAT_MP3:
  1654. case FORMAT_MPEG4_AAC:
  1655. pr_debug("%s: no runtime parameters for codec: %d\n", __func__,
  1656. prtd->codec);
  1657. break;
  1658. case FORMAT_AC3:
  1659. case FORMAT_EAC3: {
  1660. struct snd_dec_ddp *ddp = &dec_params->ddp_params;
  1661. int cnt;
  1662. ddp->params_length = (*values++);
  1663. if (ddp->params_length > DDP_DEC_MAX_NUM_PARAM) {
  1664. pr_err("%s: invalid num of params:: %d\n", __func__,
  1665. ddp->params_length);
  1666. return -EINVAL;
  1667. }
  1668. for (cnt = 0; cnt < ddp->params_length; cnt++) {
  1669. ddp->params_id[cnt] = *values++;
  1670. ddp->params_value[cnt] = *values++;
  1671. }
  1672. if (msm_compr_send_ddp_cfg(prtd->audio_client, ddp) < 0)
  1673. pr_err("%s: DDP CMD CFG failed\n", __func__);
  1674. break;
  1675. }
  1676. default:
  1677. break;
  1678. }
  1679. return 0;
  1680. }
  1681. static int msm_compr_dec_params_get(struct snd_kcontrol *kcontrol,
  1682. struct snd_ctl_elem_value *ucontrol)
  1683. {
  1684. /* dummy function */
  1685. return 0;
  1686. }
  1687. static int msm_compr_probe(struct snd_soc_platform *platform)
  1688. {
  1689. struct msm_compr_pdata *pdata;
  1690. int i;
  1691. pr_debug("%s\n", __func__);
  1692. pdata = (struct msm_compr_pdata *)
  1693. kzalloc(sizeof(*pdata), GFP_KERNEL);
  1694. if (!pdata)
  1695. return -ENOMEM;
  1696. snd_soc_platform_set_drvdata(platform, pdata);
  1697. atomic_set(&pdata->audio_ocmem_req, 0);
  1698. for (i = 0; i < MSM_FRONTEND_DAI_MAX; i++) {
  1699. pdata->volume[i][0] = COMPRESSED_LR_VOL_MAX_STEPS;
  1700. pdata->volume[i][1] = COMPRESSED_LR_VOL_MAX_STEPS;
  1701. pdata->audio_effects[i] = NULL;
  1702. pdata->dec_params[i] = NULL;
  1703. pdata->cstream[i] = NULL;
  1704. pdata->is_in_use[i] = false;
  1705. }
  1706. /*
  1707. * use_dsp_gapless_mode part of platform data(pdata) is updated from HAL
  1708. * through a mixer control before compress driver is opened. The mixer
  1709. * control is used to decide if dsp gapless mode needs to be enabled.
  1710. * Gapless is disabled by default.
  1711. */
  1712. pdata->use_dsp_gapless_mode = false;
  1713. return 0;
  1714. }
  1715. static int msm_compr_volume_info(struct snd_kcontrol *kcontrol,
  1716. struct snd_ctl_elem_info *uinfo)
  1717. {
  1718. uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
  1719. uinfo->count = 2;
  1720. uinfo->value.integer.min = 0;
  1721. uinfo->value.integer.max = COMPRESSED_LR_VOL_MAX_STEPS;
  1722. return 0;
  1723. }
  1724. static int msm_compr_audio_effects_config_info(struct snd_kcontrol *kcontrol,
  1725. struct snd_ctl_elem_info *uinfo)
  1726. {
  1727. uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
  1728. uinfo->count = MAX_PP_PARAMS_SZ;
  1729. uinfo->value.integer.min = 0;
  1730. uinfo->value.integer.max = 0xFFFFFFFF;
  1731. return 0;
  1732. }
  1733. static int msm_compr_dec_params_info(struct snd_kcontrol *kcontrol,
  1734. struct snd_ctl_elem_info *uinfo)
  1735. {
  1736. uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
  1737. uinfo->count = 128;
  1738. uinfo->value.integer.min = 0;
  1739. uinfo->value.integer.max = 0xFFFFFFFF;
  1740. return 0;
  1741. }
  1742. static int msm_compr_add_volume_control(struct snd_soc_pcm_runtime *rtd)
  1743. {
  1744. const char *mixer_ctl_name = "Compress Playback";
  1745. const char *deviceNo = "NN";
  1746. const char *suffix = "Volume";
  1747. char *mixer_str = NULL;
  1748. int ctl_len;
  1749. struct snd_kcontrol_new fe_volume_control[1] = {
  1750. {
  1751. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  1752. .name = "?",
  1753. .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |
  1754. SNDRV_CTL_ELEM_ACCESS_READWRITE,
  1755. .info = msm_compr_volume_info,
  1756. .tlv.p = msm_compr_vol_gain,
  1757. .get = msm_compr_volume_get,
  1758. .put = msm_compr_volume_put,
  1759. .private_value = 0,
  1760. }
  1761. };
  1762. if (!rtd) {
  1763. pr_err("%s NULL rtd\n", __func__);
  1764. return 0;
  1765. }
  1766. pr_debug("%s: added new compr FE with name %s, id %d, cpu dai %s, device no %d\n",
  1767. __func__, rtd->dai_link->name, rtd->dai_link->be_id,
  1768. rtd->dai_link->cpu_dai_name, rtd->pcm->device);
  1769. ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1 +
  1770. strlen(suffix) + 1;
  1771. mixer_str = kzalloc(ctl_len, GFP_KERNEL);
  1772. if (!mixer_str) {
  1773. pr_err("failed to allocate mixer ctrl str of len %d", ctl_len);
  1774. return 0;
  1775. }
  1776. snprintf(mixer_str, ctl_len, "%s %d %s", mixer_ctl_name,
  1777. rtd->pcm->device, suffix);
  1778. fe_volume_control[0].name = mixer_str;
  1779. fe_volume_control[0].private_value = rtd->dai_link->be_id;
  1780. pr_debug("Registering new mixer ctl %s\n", mixer_str);
  1781. snd_soc_add_platform_controls(rtd->platform, fe_volume_control,
  1782. ARRAY_SIZE(fe_volume_control));
  1783. kfree(mixer_str);
  1784. return 0;
  1785. }
  1786. static int msm_compr_add_audio_effects_control(struct snd_soc_pcm_runtime *rtd)
  1787. {
  1788. const char *mixer_ctl_name = "Audio Effects Config";
  1789. const char *deviceNo = "NN";
  1790. char *mixer_str = NULL;
  1791. int ctl_len;
  1792. struct snd_kcontrol_new fe_audio_effects_config_control[1] = {
  1793. {
  1794. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  1795. .name = "?",
  1796. .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
  1797. .info = msm_compr_audio_effects_config_info,
  1798. .get = msm_compr_audio_effects_config_get,
  1799. .put = msm_compr_audio_effects_config_put,
  1800. .private_value = 0,
  1801. }
  1802. };
  1803. if (!rtd) {
  1804. pr_err("%s NULL rtd\n", __func__);
  1805. return 0;
  1806. }
  1807. pr_debug("%s: added new compr FE with name %s, id %d, cpu dai %s, device no %d\n",
  1808. __func__, rtd->dai_link->name, rtd->dai_link->be_id,
  1809. rtd->dai_link->cpu_dai_name, rtd->pcm->device);
  1810. ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1;
  1811. mixer_str = kzalloc(ctl_len, GFP_KERNEL);
  1812. if (!mixer_str) {
  1813. pr_err("failed to allocate mixer ctrl str of len %d", ctl_len);
  1814. return 0;
  1815. }
  1816. snprintf(mixer_str, ctl_len, "%s %d", mixer_ctl_name, rtd->pcm->device);
  1817. fe_audio_effects_config_control[0].name = mixer_str;
  1818. fe_audio_effects_config_control[0].private_value = rtd->dai_link->be_id;
  1819. pr_debug("Registering new mixer ctl %s\n", mixer_str);
  1820. snd_soc_add_platform_controls(rtd->platform,
  1821. fe_audio_effects_config_control,
  1822. ARRAY_SIZE(fe_audio_effects_config_control));
  1823. kfree(mixer_str);
  1824. return 0;
  1825. }
  1826. static int msm_compr_gapless_put(struct snd_kcontrol *kcontrol,
  1827. struct snd_ctl_elem_value *ucontrol)
  1828. {
  1829. struct snd_soc_platform *platform = snd_kcontrol_chip(kcontrol);
  1830. struct msm_compr_pdata *pdata = (struct msm_compr_pdata *)
  1831. snd_soc_platform_get_drvdata(platform);
  1832. pdata->use_dsp_gapless_mode = ucontrol->value.integer.value[0];
  1833. pr_debug("%s: value: %ld\n", __func__,
  1834. ucontrol->value.integer.value[0]);
  1835. return 0;
  1836. }
  1837. static int msm_compr_gapless_get(struct snd_kcontrol *kcontrol,
  1838. struct snd_ctl_elem_value *ucontrol)
  1839. {
  1840. struct snd_soc_platform *platform = snd_kcontrol_chip(kcontrol);
  1841. struct msm_compr_pdata *pdata =
  1842. snd_soc_platform_get_drvdata(platform);
  1843. pr_debug("%s:gapless mode %d\n", __func__, pdata->use_dsp_gapless_mode);
  1844. ucontrol->value.integer.value[0] = pdata->use_dsp_gapless_mode;
  1845. return 0;
  1846. }
  1847. static const struct snd_kcontrol_new msm_compr_gapless_controls[] = {
  1848. SOC_SINGLE_EXT("Compress Gapless Playback",
  1849. 0, 0, 1, 0,
  1850. msm_compr_gapless_get,
  1851. msm_compr_gapless_put),
  1852. };
  1853. static int msm_compr_add_dec_runtime_params_control(
  1854. struct snd_soc_pcm_runtime *rtd)
  1855. {
  1856. const char *mixer_ctl_name = "Audio Stream";
  1857. const char *deviceNo = "NN";
  1858. const char *suffix = "Dec Params";
  1859. char *mixer_str = NULL;
  1860. int ctl_len;
  1861. struct snd_kcontrol_new fe_dec_params_control[1] = {
  1862. {
  1863. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  1864. .name = "?",
  1865. .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
  1866. .info = msm_compr_dec_params_info,
  1867. .get = msm_compr_dec_params_get,
  1868. .put = msm_compr_dec_params_put,
  1869. .private_value = 0,
  1870. }
  1871. };
  1872. if (!rtd) {
  1873. pr_err("%s NULL rtd\n", __func__);
  1874. return 0;
  1875. }
  1876. pr_debug("%s: added new compr FE with name %s, id %d, cpu dai %s, device no %d\n",
  1877. __func__, rtd->dai_link->name, rtd->dai_link->be_id,
  1878. rtd->dai_link->cpu_dai_name, rtd->pcm->device);
  1879. ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1 +
  1880. strlen(suffix) + 1;
  1881. mixer_str = kzalloc(ctl_len, GFP_KERNEL);
  1882. if (!mixer_str) {
  1883. pr_err("failed to allocate mixer ctrl str of len %d", ctl_len);
  1884. return 0;
  1885. }
  1886. snprintf(mixer_str, ctl_len, "%s %d %s", mixer_ctl_name,
  1887. rtd->pcm->device, suffix);
  1888. fe_dec_params_control[0].name = mixer_str;
  1889. fe_dec_params_control[0].private_value = rtd->dai_link->be_id;
  1890. pr_debug("Registering new mixer ctl %s", mixer_str);
  1891. snd_soc_add_platform_controls(rtd->platform,
  1892. fe_dec_params_control,
  1893. ARRAY_SIZE(fe_dec_params_control));
  1894. kfree(mixer_str);
  1895. return 0;
  1896. }
  1897. static int msm_compr_new(struct snd_soc_pcm_runtime *rtd)
  1898. {
  1899. int rc;
  1900. rc = msm_compr_add_volume_control(rtd);
  1901. if (rc)
  1902. pr_err("%s: Could not add Compr Volume Control\n", __func__);
  1903. rc = msm_compr_add_audio_effects_control(rtd);
  1904. if (rc)
  1905. pr_err("%s: Could not add Compr Audio Effects Control\n",
  1906. __func__);
  1907. rc = msm_compr_add_dec_runtime_params_control(rtd);
  1908. if (rc)
  1909. pr_err("%s: Could not add Compr Dec runtime params Control\n",
  1910. __func__);
  1911. return 0;
  1912. }
  1913. static struct snd_compr_ops msm_compr_ops = {
  1914. .open = msm_compr_open,
  1915. .free = msm_compr_free,
  1916. .trigger = msm_compr_trigger,
  1917. .pointer = msm_compr_pointer,
  1918. .set_params = msm_compr_set_params,
  1919. .set_metadata = msm_compr_set_metadata,
  1920. .ack = msm_compr_ack,
  1921. .copy = msm_compr_copy,
  1922. .get_caps = msm_compr_get_caps,
  1923. .get_codec_caps = msm_compr_get_codec_caps,
  1924. };
  1925. static struct snd_soc_platform_driver msm_soc_platform = {
  1926. .probe = msm_compr_probe,
  1927. .compr_ops = &msm_compr_ops,
  1928. .pcm_new = msm_compr_new,
  1929. .controls = msm_compr_gapless_controls,
  1930. .num_controls = ARRAY_SIZE(msm_compr_gapless_controls),
  1931. };
  1932. static __devinit int msm_compr_dev_probe(struct platform_device *pdev)
  1933. {
  1934. if (pdev->dev.of_node)
  1935. dev_set_name(&pdev->dev, "%s", "msm-compress-dsp");
  1936. pr_debug("%s: dev name %s\n", __func__, dev_name(&pdev->dev));
  1937. return snd_soc_register_platform(&pdev->dev,
  1938. &msm_soc_platform);
  1939. }
  1940. static int msm_compr_remove(struct platform_device *pdev)
  1941. {
  1942. snd_soc_unregister_platform(&pdev->dev);
  1943. return 0;
  1944. }
  1945. static const struct of_device_id msm_compr_dt_match[] = {
  1946. {.compatible = "qcom,msm-compress-dsp"},
  1947. {}
  1948. };
  1949. MODULE_DEVICE_TABLE(of, msm_compr_dt_match);
  1950. static struct platform_driver msm_compr_driver = {
  1951. .driver = {
  1952. .name = "msm-compress-dsp",
  1953. .owner = THIS_MODULE,
  1954. .of_match_table = msm_compr_dt_match,
  1955. },
  1956. .probe = msm_compr_dev_probe,
  1957. .remove = __devexit_p(msm_compr_remove),
  1958. };
  1959. static int __init msm_soc_platform_init(void)
  1960. {
  1961. return platform_driver_register(&msm_compr_driver);
  1962. }
  1963. module_init(msm_soc_platform_init);
  1964. static void __exit msm_soc_platform_exit(void)
  1965. {
  1966. platform_driver_unregister(&msm_compr_driver);
  1967. }
  1968. module_exit(msm_soc_platform_exit);
  1969. MODULE_DESCRIPTION("Compress Offload platform driver");
  1970. MODULE_LICENSE("GPL v2");