audio_hwacc_effects.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778
  1. /*
  2. * Copyright (c) 2014-2017, The Linux Foundation. All rights reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License version 2 and
  6. * only version 2 as published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. */
  13. #include <linux/msm_audio.h>
  14. #include <linux/compat.h>
  15. #include "q6audio_common.h"
  16. #include <dsp/msm-audio-effects-q6-v2.h>
  17. #include "audio_utils_aio.h"
  18. #define MAX_CHANNELS_SUPPORTED 8
  19. #define WAIT_TIMEDOUT_DURATION_SECS 1
  20. struct q6audio_effects {
  21. wait_queue_head_t read_wait;
  22. wait_queue_head_t write_wait;
  23. struct audio_client *ac;
  24. struct msm_hwacc_effects_config config;
  25. struct mutex lock;
  26. atomic_t in_count;
  27. atomic_t out_count;
  28. int opened;
  29. int started;
  30. int buf_alloc;
  31. struct msm_nt_eff_all_config audio_effects;
  32. };
  33. static void audio_effects_init_pp(struct audio_client *ac)
  34. {
  35. int ret = 0;
  36. struct asm_softvolume_params softvol = {
  37. .period = SOFT_VOLUME_PERIOD,
  38. .step = SOFT_VOLUME_STEP,
  39. .rampingcurve = SOFT_VOLUME_CURVE_LINEAR,
  40. };
  41. if (!ac) {
  42. pr_err("%s: audio client null to init pp\n", __func__);
  43. return;
  44. }
  45. ret = q6asm_set_softvolume_v2(ac, &softvol,
  46. SOFT_VOLUME_INSTANCE_1);
  47. if (ret < 0)
  48. pr_err("%s: Send SoftVolume Param failed ret=%d\n",
  49. __func__, ret);
  50. }
  51. static void audio_effects_deinit_pp(struct audio_client *ac)
  52. {
  53. if (!ac) {
  54. pr_err("%s: audio client null to deinit pp\n", __func__);
  55. return;
  56. }
  57. }
  58. static void audio_effects_event_handler(uint32_t opcode, uint32_t token,
  59. uint32_t *payload, void *priv)
  60. {
  61. struct q6audio_effects *effects;
  62. if (!payload || !priv) {
  63. pr_err("%s: invalid data to handle events, payload: %pK, priv: %pK\n",
  64. __func__, payload, priv);
  65. return;
  66. }
  67. effects = (struct q6audio_effects *)priv;
  68. switch (opcode) {
  69. case ASM_DATA_EVENT_WRITE_DONE_V2: {
  70. atomic_inc(&effects->out_count);
  71. wake_up(&effects->write_wait);
  72. break;
  73. }
  74. case ASM_DATA_EVENT_READ_DONE_V2: {
  75. atomic_inc(&effects->in_count);
  76. wake_up(&effects->read_wait);
  77. break;
  78. }
  79. case APR_BASIC_RSP_RESULT: {
  80. pr_debug("%s: APR_BASIC_RSP_RESULT Cmd[0x%x] Status[0x%x]\n",
  81. __func__, payload[0], payload[1]);
  82. switch (payload[0]) {
  83. case ASM_SESSION_CMD_RUN_V2:
  84. pr_debug("ASM_SESSION_CMD_RUN_V2\n");
  85. break;
  86. default:
  87. pr_debug("%s: Payload = [0x%x] stat[0x%x]\n",
  88. __func__, payload[0], payload[1]);
  89. break;
  90. }
  91. break;
  92. }
  93. default:
  94. pr_debug("%s: Unhandled Event 0x%x token = 0x%x\n",
  95. __func__, opcode, token);
  96. break;
  97. }
  98. }
  99. static int audio_effects_shared_ioctl(struct file *file, unsigned int cmd,
  100. unsigned long arg)
  101. {
  102. struct q6audio_effects *effects = file->private_data;
  103. int rc = 0;
  104. switch (cmd) {
  105. case AUDIO_START: {
  106. pr_debug("%s: AUDIO_START\n", __func__);
  107. mutex_lock(&effects->lock);
  108. rc = q6asm_open_read_write_v2(effects->ac,
  109. FORMAT_LINEAR_PCM,
  110. FORMAT_MULTI_CHANNEL_LINEAR_PCM,
  111. effects->config.meta_mode_enabled,
  112. effects->config.output.bits_per_sample,
  113. true /*overwrite topology*/,
  114. ASM_STREAM_POSTPROC_TOPO_ID_HPX_MASTER);
  115. if (rc < 0) {
  116. pr_err("%s: Open failed for hw accelerated effects:rc=%d\n",
  117. __func__, rc);
  118. rc = -EINVAL;
  119. mutex_unlock(&effects->lock);
  120. goto ioctl_fail;
  121. }
  122. effects->opened = 1;
  123. pr_debug("%s: dec buf size: %d, num_buf: %d, enc buf size: %d, num_buf: %d\n",
  124. __func__, effects->config.output.buf_size,
  125. effects->config.output.num_buf,
  126. effects->config.input.buf_size,
  127. effects->config.input.num_buf);
  128. rc = q6asm_audio_client_buf_alloc_contiguous(IN, effects->ac,
  129. effects->config.output.buf_size,
  130. effects->config.output.num_buf);
  131. if (rc < 0) {
  132. pr_err("%s: Write buffer Allocation failed rc = %d\n",
  133. __func__, rc);
  134. rc = -ENOMEM;
  135. mutex_unlock(&effects->lock);
  136. goto ioctl_fail;
  137. }
  138. atomic_set(&effects->in_count, effects->config.input.num_buf);
  139. rc = q6asm_audio_client_buf_alloc_contiguous(OUT, effects->ac,
  140. effects->config.input.buf_size,
  141. effects->config.input.num_buf);
  142. if (rc < 0) {
  143. pr_err("%s: Read buffer Allocation failed rc = %d\n",
  144. __func__, rc);
  145. rc = -ENOMEM;
  146. mutex_unlock(&effects->lock);
  147. goto readbuf_fail;
  148. }
  149. atomic_set(&effects->out_count, effects->config.output.num_buf);
  150. effects->buf_alloc = 1;
  151. pr_debug("%s: enc: sample_rate: %d, num_channels: %d\n",
  152. __func__, effects->config.input.sample_rate,
  153. effects->config.input.num_channels);
  154. rc = q6asm_enc_cfg_blk_pcm(effects->ac,
  155. effects->config.input.sample_rate,
  156. effects->config.input.num_channels);
  157. if (rc < 0) {
  158. pr_err("%s: pcm read block config failed\n", __func__);
  159. rc = -EINVAL;
  160. mutex_unlock(&effects->lock);
  161. goto cfg_fail;
  162. }
  163. pr_debug("%s: dec: sample_rate: %d, num_channels: %d, bit_width: %d\n",
  164. __func__, effects->config.output.sample_rate,
  165. effects->config.output.num_channels,
  166. effects->config.output.bits_per_sample);
  167. rc = q6asm_media_format_block_pcm_format_support(
  168. effects->ac, effects->config.output.sample_rate,
  169. effects->config.output.num_channels,
  170. effects->config.output.bits_per_sample);
  171. if (rc < 0) {
  172. pr_err("%s: pcm write format block config failed\n",
  173. __func__);
  174. rc = -EINVAL;
  175. mutex_unlock(&effects->lock);
  176. goto cfg_fail;
  177. }
  178. audio_effects_init_pp(effects->ac);
  179. rc = q6asm_run(effects->ac, 0x00, 0x00, 0x00);
  180. if (!rc)
  181. effects->started = 1;
  182. else {
  183. effects->started = 0;
  184. pr_err("%s: ASM run state failed\n", __func__);
  185. }
  186. mutex_unlock(&effects->lock);
  187. break;
  188. }
  189. case AUDIO_EFFECTS_WRITE: {
  190. char *bufptr = NULL;
  191. uint32_t idx = 0;
  192. uint32_t size = 0;
  193. mutex_lock(&effects->lock);
  194. if (!effects->started) {
  195. rc = -EFAULT;
  196. mutex_unlock(&effects->lock);
  197. goto ioctl_fail;
  198. }
  199. rc = wait_event_timeout(effects->write_wait,
  200. atomic_read(&effects->out_count),
  201. WAIT_TIMEDOUT_DURATION_SECS * HZ);
  202. if (!rc) {
  203. pr_err("%s: write wait_event_timeout\n", __func__);
  204. rc = -EFAULT;
  205. mutex_unlock(&effects->lock);
  206. goto ioctl_fail;
  207. }
  208. if (!atomic_read(&effects->out_count)) {
  209. pr_err("%s: pcm stopped out_count 0\n", __func__);
  210. rc = -EFAULT;
  211. mutex_unlock(&effects->lock);
  212. goto ioctl_fail;
  213. }
  214. bufptr = q6asm_is_cpu_buf_avail(IN, effects->ac, &size, &idx);
  215. if (bufptr) {
  216. if ((effects->config.buf_cfg.output_len > size) ||
  217. copy_from_user(bufptr, (void *)arg,
  218. effects->config.buf_cfg.output_len)) {
  219. rc = -EFAULT;
  220. mutex_unlock(&effects->lock);
  221. goto ioctl_fail;
  222. }
  223. rc = q6asm_write(effects->ac,
  224. effects->config.buf_cfg.output_len,
  225. 0, 0, NO_TIMESTAMP);
  226. if (rc < 0) {
  227. rc = -EFAULT;
  228. mutex_unlock(&effects->lock);
  229. goto ioctl_fail;
  230. }
  231. atomic_dec(&effects->out_count);
  232. } else {
  233. pr_err("%s: AUDIO_EFFECTS_WRITE: Buffer dropped\n",
  234. __func__);
  235. }
  236. mutex_unlock(&effects->lock);
  237. break;
  238. }
  239. case AUDIO_EFFECTS_READ: {
  240. char *bufptr = NULL;
  241. uint32_t idx = 0;
  242. uint32_t size = 0;
  243. mutex_lock(&effects->lock);
  244. if (!effects->started) {
  245. rc = -EFAULT;
  246. mutex_unlock(&effects->lock);
  247. goto ioctl_fail;
  248. }
  249. atomic_set(&effects->in_count, 0);
  250. q6asm_read_v2(effects->ac, effects->config.buf_cfg.input_len);
  251. /* Read might fail initially, don't error out */
  252. if (rc < 0)
  253. pr_err("%s: read failed\n", __func__);
  254. rc = wait_event_timeout(effects->read_wait,
  255. atomic_read(&effects->in_count),
  256. WAIT_TIMEDOUT_DURATION_SECS * HZ);
  257. if (!rc) {
  258. pr_err("%s: read wait_event_timeout\n", __func__);
  259. rc = -EFAULT;
  260. mutex_unlock(&effects->lock);
  261. goto ioctl_fail;
  262. }
  263. if (!atomic_read(&effects->in_count)) {
  264. pr_err("%s: pcm stopped in_count 0\n", __func__);
  265. rc = -EFAULT;
  266. mutex_unlock(&effects->lock);
  267. goto ioctl_fail;
  268. }
  269. bufptr = q6asm_is_cpu_buf_avail(OUT, effects->ac, &size, &idx);
  270. if (bufptr) {
  271. if (!((void *)arg)) {
  272. rc = -EFAULT;
  273. mutex_unlock(&effects->lock);
  274. goto ioctl_fail;
  275. }
  276. if ((effects->config.buf_cfg.input_len > size) ||
  277. copy_to_user((void *)arg, bufptr,
  278. effects->config.buf_cfg.input_len)) {
  279. rc = -EFAULT;
  280. mutex_unlock(&effects->lock);
  281. goto ioctl_fail;
  282. }
  283. }
  284. mutex_unlock(&effects->lock);
  285. break;
  286. }
  287. default:
  288. pr_err("%s: Invalid effects config module\n", __func__);
  289. rc = -EINVAL;
  290. break;
  291. }
  292. ioctl_fail:
  293. return rc;
  294. readbuf_fail:
  295. q6asm_audio_client_buf_free_contiguous(IN,
  296. effects->ac);
  297. return rc;
  298. cfg_fail:
  299. q6asm_audio_client_buf_free_contiguous(IN,
  300. effects->ac);
  301. q6asm_audio_client_buf_free_contiguous(OUT,
  302. effects->ac);
  303. effects->buf_alloc = 0;
  304. return rc;
  305. }
  306. static long audio_effects_set_pp_param(struct q6audio_effects *effects,
  307. long *values)
  308. {
  309. int rc = 0;
  310. int effects_module = values[0];
  311. switch (effects_module) {
  312. case VIRTUALIZER_MODULE:
  313. pr_debug("%s: VIRTUALIZER_MODULE\n", __func__);
  314. if (msm_audio_effects_is_effmodule_supp_in_top(
  315. effects_module, effects->ac->topology))
  316. msm_audio_effects_virtualizer_handler(
  317. effects->ac,
  318. &(effects->audio_effects.virtualizer),
  319. (long *)&values[1]);
  320. break;
  321. case REVERB_MODULE:
  322. pr_debug("%s: REVERB_MODULE\n", __func__);
  323. if (msm_audio_effects_is_effmodule_supp_in_top(
  324. effects_module, effects->ac->topology))
  325. msm_audio_effects_reverb_handler(effects->ac,
  326. &(effects->audio_effects.reverb),
  327. (long *)&values[1]);
  328. break;
  329. case BASS_BOOST_MODULE:
  330. pr_debug("%s: BASS_BOOST_MODULE\n", __func__);
  331. if (msm_audio_effects_is_effmodule_supp_in_top(
  332. effects_module, effects->ac->topology))
  333. msm_audio_effects_bass_boost_handler(
  334. effects->ac,
  335. &(effects->audio_effects.bass_boost),
  336. (long *)&values[1]);
  337. break;
  338. case PBE_MODULE:
  339. pr_debug("%s: PBE_MODULE\n", __func__);
  340. if (msm_audio_effects_is_effmodule_supp_in_top(
  341. effects_module, effects->ac->topology))
  342. msm_audio_effects_pbe_handler(
  343. effects->ac,
  344. &(effects->audio_effects.pbe),
  345. (long *)&values[1]);
  346. break;
  347. case EQ_MODULE:
  348. pr_debug("%s: EQ_MODULE\n", __func__);
  349. if (msm_audio_effects_is_effmodule_supp_in_top(
  350. effects_module, effects->ac->topology))
  351. msm_audio_effects_popless_eq_handler(
  352. effects->ac,
  353. &(effects->audio_effects.equalizer),
  354. (long *)&values[1]);
  355. break;
  356. case SOFT_VOLUME_MODULE:
  357. pr_debug("%s: SA PLUS VOLUME_MODULE\n", __func__);
  358. msm_audio_effects_volume_handler_v2(effects->ac,
  359. &(effects->audio_effects.saplus_vol),
  360. (long *)&values[1], SOFT_VOLUME_INSTANCE_1);
  361. break;
  362. case SOFT_VOLUME2_MODULE:
  363. pr_debug("%s: TOPOLOGY SWITCH VOLUME MODULE\n",
  364. __func__);
  365. if (msm_audio_effects_is_effmodule_supp_in_top(
  366. effects_module, effects->ac->topology))
  367. msm_audio_effects_volume_handler_v2(effects->ac,
  368. &(effects->audio_effects.topo_switch_vol),
  369. (long *)&values[1], SOFT_VOLUME_INSTANCE_2);
  370. break;
  371. default:
  372. pr_err("%s: Invalid effects config module\n", __func__);
  373. rc = -EINVAL;
  374. }
  375. return rc;
  376. }
  377. static long audio_effects_ioctl(struct file *file, unsigned int cmd,
  378. unsigned long arg)
  379. {
  380. struct q6audio_effects *effects = file->private_data;
  381. int rc = 0;
  382. long argvalues[MAX_PP_PARAMS_SZ] = {0};
  383. switch (cmd) {
  384. case AUDIO_SET_EFFECTS_CONFIG: {
  385. pr_debug("%s: AUDIO_SET_EFFECTS_CONFIG\n", __func__);
  386. mutex_lock(&effects->lock);
  387. memset(&effects->config, 0, sizeof(effects->config));
  388. if (copy_from_user(&effects->config, (void *)arg,
  389. sizeof(effects->config))) {
  390. pr_err("%s: copy from user for AUDIO_SET_EFFECTS_CONFIG failed\n",
  391. __func__);
  392. rc = -EFAULT;
  393. }
  394. pr_debug("%s: write buf_size: %d, num_buf: %d, sample_rate: %d, channel: %d\n",
  395. __func__, effects->config.output.buf_size,
  396. effects->config.output.num_buf,
  397. effects->config.output.sample_rate,
  398. effects->config.output.num_channels);
  399. pr_debug("%s: read buf_size: %d, num_buf: %d, sample_rate: %d, channel: %d\n",
  400. __func__, effects->config.input.buf_size,
  401. effects->config.input.num_buf,
  402. effects->config.input.sample_rate,
  403. effects->config.input.num_channels);
  404. mutex_unlock(&effects->lock);
  405. break;
  406. }
  407. case AUDIO_EFFECTS_SET_BUF_LEN: {
  408. mutex_lock(&effects->lock);
  409. if (copy_from_user(&effects->config.buf_cfg, (void *)arg,
  410. sizeof(effects->config.buf_cfg))) {
  411. pr_err("%s: copy from user for AUDIO_EFFECTS_SET_BUF_LEN failed\n",
  412. __func__);
  413. rc = -EFAULT;
  414. }
  415. pr_debug("%s: write buf len: %d, read buf len: %d\n",
  416. __func__, effects->config.buf_cfg.output_len,
  417. effects->config.buf_cfg.input_len);
  418. mutex_unlock(&effects->lock);
  419. break;
  420. }
  421. case AUDIO_EFFECTS_GET_BUF_AVAIL: {
  422. struct msm_hwacc_buf_avail buf_avail;
  423. buf_avail.input_num_avail = atomic_read(&effects->in_count);
  424. buf_avail.output_num_avail = atomic_read(&effects->out_count);
  425. mutex_lock(&effects->lock);
  426. pr_debug("%s: write buf avail: %d, read buf avail: %d\n",
  427. __func__, buf_avail.output_num_avail,
  428. buf_avail.input_num_avail);
  429. if (copy_to_user((void *)arg, &buf_avail,
  430. sizeof(buf_avail))) {
  431. pr_err("%s: copy to user for AUDIO_EFFECTS_GET_NUM_BUF_AVAIL failed\n",
  432. __func__);
  433. rc = -EFAULT;
  434. }
  435. mutex_unlock(&effects->lock);
  436. break;
  437. }
  438. case AUDIO_EFFECTS_SET_PP_PARAMS: {
  439. mutex_lock(&effects->lock);
  440. if (copy_from_user(argvalues, (void *)arg,
  441. MAX_PP_PARAMS_SZ*sizeof(long))) {
  442. pr_err("%s: copy from user for pp params failed\n",
  443. __func__);
  444. mutex_unlock(&effects->lock);
  445. return -EFAULT;
  446. }
  447. rc = audio_effects_set_pp_param(effects, argvalues);
  448. mutex_unlock(&effects->lock);
  449. break;
  450. }
  451. default:
  452. pr_debug("%s: Calling shared ioctl\n", __func__);
  453. rc = audio_effects_shared_ioctl(file, cmd, arg);
  454. break;
  455. }
  456. if (rc)
  457. pr_err("%s: cmd 0x%x failed\n", __func__, cmd);
  458. return rc;
  459. }
  460. #ifdef CONFIG_COMPAT
  461. struct msm_hwacc_data_config32 {
  462. __u32 buf_size;
  463. __u32 num_buf;
  464. __u32 num_channels;
  465. __u8 channel_map[MAX_CHANNELS_SUPPORTED];
  466. __u32 sample_rate;
  467. __u32 bits_per_sample;
  468. };
  469. struct msm_hwacc_buf_cfg32 {
  470. __u32 input_len;
  471. __u32 output_len;
  472. };
  473. struct msm_hwacc_buf_avail32 {
  474. __u32 input_num_avail;
  475. __u32 output_num_avail;
  476. };
  477. struct msm_hwacc_effects_config32 {
  478. struct msm_hwacc_data_config32 input;
  479. struct msm_hwacc_data_config32 output;
  480. struct msm_hwacc_buf_cfg32 buf_cfg;
  481. __u32 meta_mode_enabled;
  482. __u32 overwrite_topology;
  483. __s32 topology;
  484. };
  485. enum {
  486. AUDIO_SET_EFFECTS_CONFIG32 = _IOW(AUDIO_IOCTL_MAGIC, 99,
  487. struct msm_hwacc_effects_config32),
  488. AUDIO_EFFECTS_SET_BUF_LEN32 = _IOW(AUDIO_IOCTL_MAGIC, 100,
  489. struct msm_hwacc_buf_cfg32),
  490. AUDIO_EFFECTS_GET_BUF_AVAIL32 = _IOW(AUDIO_IOCTL_MAGIC, 101,
  491. struct msm_hwacc_buf_avail32),
  492. AUDIO_EFFECTS_WRITE32 = _IOW(AUDIO_IOCTL_MAGIC, 102, compat_uptr_t),
  493. AUDIO_EFFECTS_READ32 = _IOWR(AUDIO_IOCTL_MAGIC, 103, compat_uptr_t),
  494. AUDIO_EFFECTS_SET_PP_PARAMS32 = _IOW(AUDIO_IOCTL_MAGIC, 104,
  495. compat_uptr_t),
  496. AUDIO_START32 = _IOW(AUDIO_IOCTL_MAGIC, 0, unsigned int),
  497. };
  498. static long audio_effects_compat_ioctl(struct file *file, unsigned int cmd,
  499. unsigned long arg)
  500. {
  501. struct q6audio_effects *effects = file->private_data;
  502. int rc = 0, i;
  503. switch (cmd) {
  504. case AUDIO_SET_EFFECTS_CONFIG32: {
  505. struct msm_hwacc_effects_config32 config32;
  506. struct msm_hwacc_effects_config *config = &effects->config;
  507. mutex_lock(&effects->lock);
  508. memset(&effects->config, 0, sizeof(effects->config));
  509. if (copy_from_user(&config32, (void *)arg,
  510. sizeof(config32))) {
  511. pr_err("%s: copy to user for AUDIO_SET_EFFECTS_CONFIG failed\n",
  512. __func__);
  513. rc = -EFAULT;
  514. mutex_unlock(&effects->lock);
  515. break;
  516. }
  517. config->input.buf_size = config32.input.buf_size;
  518. config->input.num_buf = config32.input.num_buf;
  519. config->input.num_channels = config32.input.num_channels;
  520. config->input.sample_rate = config32.input.sample_rate;
  521. config->input.bits_per_sample = config32.input.bits_per_sample;
  522. config->input.buf_size = config32.input.buf_size;
  523. for (i = 0; i < MAX_CHANNELS_SUPPORTED; i++)
  524. config->input.channel_map[i] =
  525. config32.input.channel_map[i];
  526. config->output.buf_size = config32.output.buf_size;
  527. config->output.num_buf = config32.output.num_buf;
  528. config->output.num_channels = config32.output.num_channels;
  529. config->output.sample_rate = config32.output.sample_rate;
  530. config->output.bits_per_sample =
  531. config32.output.bits_per_sample;
  532. config->output.buf_size = config32.output.buf_size;
  533. for (i = 0; i < MAX_CHANNELS_SUPPORTED; i++)
  534. config->output.channel_map[i] =
  535. config32.output.channel_map[i];
  536. config->buf_cfg.input_len = config32.buf_cfg.input_len;
  537. config->buf_cfg.output_len = config32.buf_cfg.output_len;
  538. config->meta_mode_enabled = config32.meta_mode_enabled;
  539. config->overwrite_topology = config32.overwrite_topology;
  540. config->topology = config32.topology;
  541. pr_debug("%s: write buf_size: %d, num_buf: %d, sample_rate: %d, channels: %d\n",
  542. __func__, effects->config.output.buf_size,
  543. effects->config.output.num_buf,
  544. effects->config.output.sample_rate,
  545. effects->config.output.num_channels);
  546. pr_debug("%s: read buf_size: %d, num_buf: %d, sample_rate: %d, channels: %d\n",
  547. __func__, effects->config.input.buf_size,
  548. effects->config.input.num_buf,
  549. effects->config.input.sample_rate,
  550. effects->config.input.num_channels);
  551. mutex_unlock(&effects->lock);
  552. break;
  553. }
  554. case AUDIO_EFFECTS_SET_BUF_LEN32: {
  555. struct msm_hwacc_buf_cfg32 buf_cfg32;
  556. struct msm_hwacc_effects_config *config = &effects->config;
  557. mutex_lock(&effects->lock);
  558. if (copy_from_user(&buf_cfg32, (void *)arg,
  559. sizeof(buf_cfg32))) {
  560. pr_err("%s: copy from user for AUDIO_EFFECTS_SET_BUF_LEN failed\n",
  561. __func__);
  562. rc = -EFAULT;
  563. mutex_unlock(&effects->lock);
  564. break;
  565. }
  566. config->buf_cfg.input_len = buf_cfg32.input_len;
  567. config->buf_cfg.output_len = buf_cfg32.output_len;
  568. pr_debug("%s: write buf len: %d, read buf len: %d\n",
  569. __func__, effects->config.buf_cfg.output_len,
  570. effects->config.buf_cfg.input_len);
  571. mutex_unlock(&effects->lock);
  572. break;
  573. }
  574. case AUDIO_EFFECTS_GET_BUF_AVAIL32: {
  575. struct msm_hwacc_buf_avail32 buf_avail;
  576. memset(&buf_avail, 0, sizeof(buf_avail));
  577. mutex_lock(&effects->lock);
  578. buf_avail.input_num_avail = atomic_read(&effects->in_count);
  579. buf_avail.output_num_avail = atomic_read(&effects->out_count);
  580. pr_debug("%s: write buf avail: %d, read buf avail: %d\n",
  581. __func__, buf_avail.output_num_avail,
  582. buf_avail.input_num_avail);
  583. if (copy_to_user((void *)arg, &buf_avail,
  584. sizeof(buf_avail))) {
  585. pr_err("%s: copy to user for AUDIO_EFFECTS_GET_NUM_BUF_AVAIL failed\n",
  586. __func__);
  587. rc = -EFAULT;
  588. }
  589. mutex_unlock(&effects->lock);
  590. break;
  591. }
  592. case AUDIO_EFFECTS_SET_PP_PARAMS32: {
  593. long argvalues[MAX_PP_PARAMS_SZ] = {0};
  594. int argvalues32[MAX_PP_PARAMS_SZ] = {0};
  595. mutex_lock(&effects->lock);
  596. if (copy_from_user(argvalues32, (void *)arg,
  597. MAX_PP_PARAMS_SZ*sizeof(int))) {
  598. pr_err("%s: copy from user failed for pp params\n",
  599. __func__);
  600. mutex_unlock(&effects->lock);
  601. return -EFAULT;
  602. }
  603. for (i = 0; i < MAX_PP_PARAMS_SZ; i++)
  604. argvalues[i] = argvalues32[i];
  605. rc = audio_effects_set_pp_param(effects, argvalues);
  606. mutex_unlock(&effects->lock);
  607. break;
  608. }
  609. case AUDIO_START32: {
  610. rc = audio_effects_shared_ioctl(file, AUDIO_START, arg);
  611. break;
  612. }
  613. case AUDIO_EFFECTS_WRITE32: {
  614. rc = audio_effects_shared_ioctl(file, AUDIO_EFFECTS_WRITE, arg);
  615. break;
  616. }
  617. case AUDIO_EFFECTS_READ32: {
  618. rc = audio_effects_shared_ioctl(file, AUDIO_EFFECTS_READ, arg);
  619. break;
  620. }
  621. default:
  622. pr_debug("%s: unhandled ioctl\n", __func__);
  623. rc = -EINVAL;
  624. break;
  625. }
  626. return rc;
  627. }
  628. #endif
  629. static int audio_effects_release(struct inode *inode, struct file *file)
  630. {
  631. struct q6audio_effects *effects = file->private_data;
  632. int rc = 0;
  633. if (!effects) {
  634. pr_err("%s: effect is NULL\n", __func__);
  635. return -EINVAL;
  636. }
  637. if (effects->opened) {
  638. rc = wait_event_timeout(effects->write_wait,
  639. atomic_read(&effects->out_count),
  640. WAIT_TIMEDOUT_DURATION_SECS * HZ);
  641. if (!rc)
  642. pr_err("%s: write wait_event_timeout failed\n",
  643. __func__);
  644. rc = wait_event_timeout(effects->read_wait,
  645. atomic_read(&effects->in_count),
  646. WAIT_TIMEDOUT_DURATION_SECS * HZ);
  647. if (!rc)
  648. pr_err("%s: read wait_event_timeout failed\n",
  649. __func__);
  650. rc = q6asm_cmd(effects->ac, CMD_CLOSE);
  651. if (rc < 0)
  652. pr_err("%s[%pK]:Failed to close the session rc=%d\n",
  653. __func__, effects, rc);
  654. effects->opened = 0;
  655. effects->started = 0;
  656. audio_effects_deinit_pp(effects->ac);
  657. }
  658. if (effects->buf_alloc) {
  659. q6asm_audio_client_buf_free_contiguous(IN, effects->ac);
  660. q6asm_audio_client_buf_free_contiguous(OUT, effects->ac);
  661. }
  662. q6asm_audio_client_free(effects->ac);
  663. mutex_destroy(&effects->lock);
  664. kfree(effects);
  665. pr_debug("%s: close session success\n", __func__);
  666. return rc;
  667. }
  668. static int audio_effects_open(struct inode *inode, struct file *file)
  669. {
  670. struct q6audio_effects *effects;
  671. int rc = 0;
  672. effects = kzalloc(sizeof(struct q6audio_effects), GFP_KERNEL);
  673. if (!effects)
  674. return -ENOMEM;
  675. effects->ac = q6asm_audio_client_alloc(
  676. (app_cb)audio_effects_event_handler,
  677. (void *)effects);
  678. if (!effects->ac) {
  679. pr_err("%s: Could not allocate memory for audio client\n",
  680. __func__);
  681. kfree(effects);
  682. return -ENOMEM;
  683. }
  684. init_waitqueue_head(&effects->read_wait);
  685. init_waitqueue_head(&effects->write_wait);
  686. mutex_init(&effects->lock);
  687. effects->opened = 0;
  688. effects->started = 0;
  689. effects->buf_alloc = 0;
  690. file->private_data = effects;
  691. pr_debug("%s: open session success\n", __func__);
  692. return rc;
  693. }
  694. static const struct file_operations audio_effects_fops = {
  695. .owner = THIS_MODULE,
  696. .open = audio_effects_open,
  697. .release = audio_effects_release,
  698. .unlocked_ioctl = audio_effects_ioctl,
  699. #ifdef CONFIG_COMPAT
  700. .compat_ioctl = audio_effects_compat_ioctl,
  701. #endif
  702. };
  703. struct miscdevice audio_effects_misc = {
  704. .minor = MISC_DYNAMIC_MINOR,
  705. .name = "msm_hweffects",
  706. .fops = &audio_effects_fops,
  707. };
  708. static int __init audio_effects_init(void)
  709. {
  710. return misc_register(&audio_effects_misc);
  711. }
  712. device_initcall(audio_effects_init);
  713. MODULE_DESCRIPTION("Audio hardware accelerated effects driver");
  714. MODULE_LICENSE("GPL v2");