blob: c8532df2712472a59b8305e13d2e8c4e8b709f2b [file] [log] [blame]
Aditya Bavanari9960d262019-04-26 14:38:29 +05301/* Copyright (c) 2013-2017, 2019, The Linux Foundation. All rights reserved.
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302 *
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
13#include <linux/slab.h>
Aditya Bavanari9960d262019-04-26 14:38:29 +053014#include <linux/ratelimit.h>
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053015#include <sound/compress_params.h>
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053016#include <sound/devdep_params.h>
Laxminath Kasam605b42f2017-08-01 22:02:15 +053017#include <dsp/apr_audio-v2.h>
18#include <dsp/q6asm-v2.h>
19#include <dsp/msm-audio-effects-q6-v2.h>
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053020
21#define MAX_ENABLE_CMD_SIZE 32
22
23#define GET_NEXT(ptr, upper_limit, rc) \
24({ \
25 if (((ptr) + 1) > (upper_limit)) { \
Aditya Bavanari9960d262019-04-26 14:38:29 +053026 pr_err_ratelimited("%s: param list out of boundary\n", \
27 __func__); \
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053028 (rc) = -EINVAL; \
29 } \
30 ((rc) == 0) ? *(ptr)++ : -EINVAL; \
31})
32
33#define CHECK_PARAM_LEN(len, max_len, tag, rc) \
34do { \
35 if ((len) > (max_len)) { \
Aditya Bavanari9960d262019-04-26 14:38:29 +053036 pr_err_ratelimited("%s: params length overflows\n", \
37 (tag)); \
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053038 (rc) = -EINVAL; \
39 } \
40} while (0)
41
42
Laxminath Kasam8b1366a2017-10-05 01:44:16 +053043/**
44 * msm_audio_effects_is_effmodule_supp_in_top -
45 * Checks if given topology and module in effects
46 *
47 */
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053048bool msm_audio_effects_is_effmodule_supp_in_top(int effect_module,
49 int topology)
50{
51 switch (effect_module) {
52 case VIRTUALIZER_MODULE:
53 case REVERB_MODULE:
54 case BASS_BOOST_MODULE:
55 case PBE_MODULE:
56 case EQ_MODULE:
57 switch (topology) {
58 case ASM_STREAM_POSTPROC_TOPO_ID_SA_PLUS:
59 return true;
60 default:
61 return false;
62 }
63 default:
64 return false;
65 }
66}
Laxminath Kasam8b1366a2017-10-05 01:44:16 +053067EXPORT_SYMBOL(msm_audio_effects_is_effmodule_supp_in_top);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053068
69int msm_audio_effects_enable_extn(struct audio_client *ac,
70 struct msm_nt_eff_all_config *effects,
71 bool flag)
72{
73 uint32_t updt_params[MAX_ENABLE_CMD_SIZE] = {0};
74 uint32_t params_length;
75 int rc = 0;
76
77 pr_debug("%s\n", __func__);
78 if (!ac) {
79 pr_err("%s: cannot set audio effects\n", __func__);
80 return -EINVAL;
81 }
82 params_length = 0;
83 updt_params[0] = AUDPROC_MODULE_ID_VIRTUALIZER;
84 updt_params[1] = AUDPROC_PARAM_ID_ENABLE;
85 updt_params[2] = VIRTUALIZER_ENABLE_PARAM_SZ;
86 updt_params[3] = flag;
87 params_length += COMMAND_PAYLOAD_SZ + VIRTUALIZER_ENABLE_PARAM_SZ;
88 if (effects->virtualizer.enable_flag)
89 q6asm_send_audio_effects_params(ac, (char *)&updt_params[0],
90 params_length);
91 memset(updt_params, 0, MAX_ENABLE_CMD_SIZE);
92 params_length = 0;
93 updt_params[0] = AUDPROC_MODULE_ID_BASS_BOOST;
94 updt_params[1] = AUDPROC_PARAM_ID_ENABLE;
95 updt_params[2] = BASS_BOOST_ENABLE_PARAM_SZ;
96 updt_params[3] = flag;
97 params_length += COMMAND_PAYLOAD_SZ + BASS_BOOST_ENABLE_PARAM_SZ;
98 if (effects->bass_boost.enable_flag)
99 q6asm_send_audio_effects_params(ac, (char *)&updt_params[0],
100 params_length);
101 memset(updt_params, 0, MAX_ENABLE_CMD_SIZE);
102 params_length = 0;
103 updt_params[0] = AUDPROC_MODULE_ID_POPLESS_EQUALIZER;
104 updt_params[1] = AUDPROC_PARAM_ID_ENABLE;
105 updt_params[2] = EQ_ENABLE_PARAM_SZ;
106 updt_params[3] = flag;
107 params_length += COMMAND_PAYLOAD_SZ + EQ_ENABLE_PARAM_SZ;
108 if (effects->equalizer.enable_flag)
109 q6asm_send_audio_effects_params(ac, (char *)&updt_params[0],
110 params_length);
111 return rc;
112}
113
Laxminath Kasam8b1366a2017-10-05 01:44:16 +0530114/**
115 * msm_audio_effects_virtualizer_handler -
116 * Audio effects handler for virtualizer
117 *
118 * @ac: audio client handle
119 * @pbe: virtualizer params
120 * @values: values to be updated
121 *
122 * Return 0 on success or error on failure
123 */
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530124int msm_audio_effects_virtualizer_handler(struct audio_client *ac,
125 struct virtualizer_params *virtualizer,
126 long *values)
127{
128 long *param_max_offset = values + MAX_PP_PARAMS_SZ - 1;
129 char *params = NULL;
130 int rc = 0;
131 int devices = GET_NEXT(values, param_max_offset, rc);
132 int num_commands = GET_NEXT(values, param_max_offset, rc);
133 int *updt_params, i, prev_enable_flag;
134 uint32_t params_length = (MAX_INBAND_PARAM_SZ);
135
136 pr_debug("%s\n", __func__);
137 if (!ac || (devices == -EINVAL) || (num_commands == -EINVAL)) {
138 pr_err("%s: cannot set audio effects\n", __func__);
139 return -EINVAL;
140 }
141 params = kzalloc(params_length, GFP_KERNEL);
142 if (!params)
143 return -ENOMEM;
144
145 pr_debug("%s: device: %d\n", __func__, devices);
146 updt_params = (int *)params;
147 params_length = 0;
148 for (i = 0; i < num_commands; i++) {
149 uint32_t command_id =
150 GET_NEXT(values, param_max_offset, rc);
151 uint32_t command_config_state =
152 GET_NEXT(values, param_max_offset, rc);
153 uint32_t index_offset =
154 GET_NEXT(values, param_max_offset, rc);
155 uint32_t length =
156 GET_NEXT(values, param_max_offset, rc);
157 switch (command_id) {
158 case VIRTUALIZER_ENABLE:
159 if (length != 1 || index_offset != 0) {
160 pr_err("VIRT ENABLE:invalid params\n");
161 rc = -EINVAL;
162 goto invalid_config;
163 }
164 prev_enable_flag = virtualizer->enable_flag;
165 virtualizer->enable_flag =
166 GET_NEXT(values, param_max_offset, rc);
167 pr_debug("%s:VIRT ENABLE prev:%d, new:%d\n", __func__,
168 prev_enable_flag, virtualizer->enable_flag);
169 if (prev_enable_flag != virtualizer->enable_flag) {
170 params_length += COMMAND_PAYLOAD_SZ +
171 VIRTUALIZER_ENABLE_PARAM_SZ;
172 CHECK_PARAM_LEN(params_length,
173 MAX_INBAND_PARAM_SZ,
174 "VIRT ENABLE", rc);
175 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530176 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530177 *updt_params++ =
178 AUDPROC_MODULE_ID_VIRTUALIZER;
179 *updt_params++ =
180 AUDPROC_PARAM_ID_VIRTUALIZER_ENABLE;
181 *updt_params++ =
182 VIRTUALIZER_ENABLE_PARAM_SZ;
183 *updt_params++ =
184 virtualizer->enable_flag;
185 }
186 break;
187 case VIRTUALIZER_STRENGTH:
188 if (length != 1 || index_offset != 0) {
189 pr_err("VIRT STRENGTH:invalid params\n");
190 rc = -EINVAL;
191 goto invalid_config;
192 }
193 virtualizer->strength =
194 GET_NEXT(values, param_max_offset, rc);
195 pr_debug("%s: VIRT STRENGTH val: %d\n",
196 __func__, virtualizer->strength);
197 if (command_config_state == CONFIG_SET) {
198 params_length += COMMAND_PAYLOAD_SZ +
199 VIRTUALIZER_STRENGTH_PARAM_SZ;
200 CHECK_PARAM_LEN(params_length,
201 MAX_INBAND_PARAM_SZ,
202 "VIRT STRENGTH", rc);
203 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530204 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530205 *updt_params++ =
206 AUDPROC_MODULE_ID_VIRTUALIZER;
207 *updt_params++ =
208 AUDPROC_PARAM_ID_VIRTUALIZER_STRENGTH;
209 *updt_params++ =
210 VIRTUALIZER_STRENGTH_PARAM_SZ;
211 *updt_params++ =
212 virtualizer->strength;
213 }
214 break;
215 case VIRTUALIZER_OUT_TYPE:
216 if (length != 1 || index_offset != 0) {
217 pr_err("VIRT OUT_TYPE:invalid params\n");
218 rc = -EINVAL;
219 goto invalid_config;
220 }
221 virtualizer->out_type =
222 GET_NEXT(values, param_max_offset, rc);
223 pr_debug("%s: VIRT OUT_TYPE val:%d\n",
224 __func__, virtualizer->out_type);
225 if (command_config_state == CONFIG_SET) {
226 params_length += COMMAND_PAYLOAD_SZ +
227 VIRTUALIZER_OUT_TYPE_PARAM_SZ;
228 CHECK_PARAM_LEN(params_length,
229 MAX_INBAND_PARAM_SZ,
230 "VIRT OUT_TYPE", rc);
231 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530232 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530233 *updt_params++ =
234 AUDPROC_MODULE_ID_VIRTUALIZER;
235 *updt_params++ =
236 AUDPROC_PARAM_ID_VIRTUALIZER_OUT_TYPE;
237 *updt_params++ =
238 VIRTUALIZER_OUT_TYPE_PARAM_SZ;
239 *updt_params++ =
240 virtualizer->out_type;
241 }
242 break;
243 case VIRTUALIZER_GAIN_ADJUST:
244 if (length != 1 || index_offset != 0) {
245 pr_err("VIRT GAIN_ADJUST: invalid params\n");
246 rc = -EINVAL;
247 goto invalid_config;
248 }
249 virtualizer->gain_adjust =
250 GET_NEXT(values, param_max_offset, rc);
251 pr_debug("%s: VIRT GAIN_ADJUST val:%d\n",
252 __func__, virtualizer->gain_adjust);
253 if (command_config_state == CONFIG_SET) {
254 params_length += COMMAND_PAYLOAD_SZ +
255 VIRTUALIZER_GAIN_ADJUST_PARAM_SZ;
256 CHECK_PARAM_LEN(params_length,
257 MAX_INBAND_PARAM_SZ,
258 "VIRT GAIN_ADJUST", rc);
259 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530260 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530261 *updt_params++ =
262 AUDPROC_MODULE_ID_VIRTUALIZER;
263 *updt_params++ =
264 AUDPROC_PARAM_ID_VIRTUALIZER_GAIN_ADJUST;
265 *updt_params++ =
266 VIRTUALIZER_GAIN_ADJUST_PARAM_SZ;
267 *updt_params++ =
268 virtualizer->gain_adjust;
269 }
270 break;
271 default:
Aditya Bavanari9960d262019-04-26 14:38:29 +0530272 pr_err_ratelimited("%s: Invalid command to set config\n",
273 __func__);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530274 break;
275 }
276 }
277 if (params_length && (rc == 0))
278 q6asm_send_audio_effects_params(ac, params,
279 params_length);
280 else
281 pr_debug("%s: did not send pp params\n", __func__);
282invalid_config:
283 kfree(params);
284 return rc;
285}
Laxminath Kasam8b1366a2017-10-05 01:44:16 +0530286EXPORT_SYMBOL(msm_audio_effects_virtualizer_handler);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530287
Laxminath Kasam8b1366a2017-10-05 01:44:16 +0530288/**
289 * msm_audio_effects_reverb_handler -
290 * Audio effects handler for reverb
291 *
292 * @ac: audio client handle
293 * @pbe: reverb params
294 * @values: values to be updated
295 *
296 * Return 0 on success or error on failure
297 */
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530298int msm_audio_effects_reverb_handler(struct audio_client *ac,
299 struct reverb_params *reverb,
300 long *values)
301{
302 long *param_max_offset = values + MAX_PP_PARAMS_SZ - 1;
303 char *params = NULL;
304 int rc = 0;
305 int devices = GET_NEXT(values, param_max_offset, rc);
306 int num_commands = GET_NEXT(values, param_max_offset, rc);
307 int *updt_params, i, prev_enable_flag;
308 uint32_t params_length = (MAX_INBAND_PARAM_SZ);
309
310 pr_debug("%s\n", __func__);
311 if (!ac || (devices == -EINVAL) || (num_commands == -EINVAL)) {
312 pr_err("%s: cannot set audio effects\n", __func__);
313 return -EINVAL;
314 }
315 params = kzalloc(params_length, GFP_KERNEL);
316 if (!params)
317 return -ENOMEM;
318
319 pr_debug("%s: device: %d\n", __func__, devices);
320 updt_params = (int *)params;
321 params_length = 0;
322 for (i = 0; i < num_commands; i++) {
323 uint32_t command_id =
324 GET_NEXT(values, param_max_offset, rc);
325 uint32_t command_config_state =
326 GET_NEXT(values, param_max_offset, rc);
327 uint32_t index_offset =
328 GET_NEXT(values, param_max_offset, rc);
329 uint32_t length =
330 GET_NEXT(values, param_max_offset, rc);
331 switch (command_id) {
332 case REVERB_ENABLE:
333 if (length != 1 || index_offset != 0) {
334 pr_err("REVERB_ENABLE:invalid params\n");
335 rc = -EINVAL;
336 goto invalid_config;
337 }
338 prev_enable_flag = reverb->enable_flag;
339 reverb->enable_flag =
340 GET_NEXT(values, param_max_offset, rc);
341 pr_debug("%s:REVERB_ENABLE prev:%d,new:%d\n", __func__,
342 prev_enable_flag, reverb->enable_flag);
343 if (prev_enable_flag != reverb->enable_flag) {
344 params_length += COMMAND_PAYLOAD_SZ +
345 REVERB_ENABLE_PARAM_SZ;
346 CHECK_PARAM_LEN(params_length,
347 MAX_INBAND_PARAM_SZ,
348 "REVERB_ENABLE", rc);
349 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530350 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530351 *updt_params++ =
352 AUDPROC_MODULE_ID_REVERB;
353 *updt_params++ =
354 AUDPROC_PARAM_ID_REVERB_ENABLE;
355 *updt_params++ =
356 REVERB_ENABLE_PARAM_SZ;
357 *updt_params++ =
358 reverb->enable_flag;
359 }
360 break;
361 case REVERB_MODE:
362 if (length != 1 || index_offset != 0) {
363 pr_err("REVERB_MODE:invalid params\n");
364 rc = -EINVAL;
365 goto invalid_config;
366 }
367 reverb->mode =
368 GET_NEXT(values, param_max_offset, rc);
369 pr_debug("%s: REVERB_MODE val:%d\n",
370 __func__, reverb->mode);
371 if (command_config_state == CONFIG_SET) {
372 params_length += COMMAND_PAYLOAD_SZ +
373 REVERB_MODE_PARAM_SZ;
374 CHECK_PARAM_LEN(params_length,
375 MAX_INBAND_PARAM_SZ,
376 "REVERB_MODE", rc);
377 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530378 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530379 *updt_params++ =
380 AUDPROC_MODULE_ID_REVERB;
381 *updt_params++ =
382 AUDPROC_PARAM_ID_REVERB_MODE;
383 *updt_params++ =
384 REVERB_MODE_PARAM_SZ;
385 *updt_params++ =
386 reverb->mode;
387 }
388 break;
389 case REVERB_PRESET:
390 if (length != 1 || index_offset != 0) {
391 pr_err("REVERB_PRESET:invalid params\n");
392 rc = -EINVAL;
393 goto invalid_config;
394 }
395 reverb->preset =
396 GET_NEXT(values, param_max_offset, rc);
397 pr_debug("%s: REVERB_PRESET val:%d\n",
398 __func__, reverb->preset);
399 if (command_config_state == CONFIG_SET) {
400 params_length += COMMAND_PAYLOAD_SZ +
401 REVERB_PRESET_PARAM_SZ;
402 CHECK_PARAM_LEN(params_length,
403 MAX_INBAND_PARAM_SZ,
404 "REVERB_PRESET", rc);
405 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530406 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530407 *updt_params++ =
408 AUDPROC_MODULE_ID_REVERB;
409 *updt_params++ =
410 AUDPROC_PARAM_ID_REVERB_PRESET;
411 *updt_params++ =
412 REVERB_PRESET_PARAM_SZ;
413 *updt_params++ =
414 reverb->preset;
415 }
416 break;
417 case REVERB_WET_MIX:
418 if (length != 1 || index_offset != 0) {
419 pr_err("REVERB_WET_MIX:invalid params\n");
420 rc = -EINVAL;
421 goto invalid_config;
422 }
423 reverb->wet_mix =
424 GET_NEXT(values, param_max_offset, rc);
425 pr_debug("%s: REVERB_WET_MIX val:%d\n",
426 __func__, reverb->wet_mix);
427 if (command_config_state == CONFIG_SET) {
428 params_length += COMMAND_PAYLOAD_SZ +
429 REVERB_WET_MIX_PARAM_SZ;
430 CHECK_PARAM_LEN(params_length,
431 MAX_INBAND_PARAM_SZ,
432 "REVERB_WET_MIX", rc);
433 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530434 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530435 *updt_params++ =
436 AUDPROC_MODULE_ID_REVERB;
437 *updt_params++ =
438 AUDPROC_PARAM_ID_REVERB_WET_MIX;
439 *updt_params++ =
440 REVERB_WET_MIX_PARAM_SZ;
441 *updt_params++ =
442 reverb->wet_mix;
443 }
444 break;
445 case REVERB_GAIN_ADJUST:
446 if (length != 1 || index_offset != 0) {
447 pr_err("REVERB_GAIN_ADJUST:invalid params\n");
448 rc = -EINVAL;
449 goto invalid_config;
450 }
451 reverb->gain_adjust =
452 GET_NEXT(values, param_max_offset, rc);
453 pr_debug("%s: REVERB_GAIN_ADJUST val:%d\n",
454 __func__, reverb->gain_adjust);
455 if (command_config_state == CONFIG_SET) {
456 params_length += COMMAND_PAYLOAD_SZ +
457 REVERB_GAIN_ADJUST_PARAM_SZ;
458 CHECK_PARAM_LEN(params_length,
459 MAX_INBAND_PARAM_SZ,
460 "REVERB_GAIN_ADJUST", rc);
461 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530462 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530463 *updt_params++ =
464 AUDPROC_MODULE_ID_REVERB;
465 *updt_params++ =
466 AUDPROC_PARAM_ID_REVERB_GAIN_ADJUST;
467 *updt_params++ =
468 REVERB_GAIN_ADJUST_PARAM_SZ;
469 *updt_params++ =
470 reverb->gain_adjust;
471 }
472 break;
473 case REVERB_ROOM_LEVEL:
474 if (length != 1 || index_offset != 0) {
475 pr_err("REVERB_ROOM_LEVEL:invalid params\n");
476 rc = -EINVAL;
477 goto invalid_config;
478 }
479 reverb->room_level =
480 GET_NEXT(values, param_max_offset, rc);
481 pr_debug("%s: REVERB_ROOM_LEVEL val:%d\n",
482 __func__, reverb->room_level);
483 if (command_config_state == CONFIG_SET) {
484 params_length += COMMAND_PAYLOAD_SZ +
485 REVERB_ROOM_LEVEL_PARAM_SZ;
486 CHECK_PARAM_LEN(params_length,
487 MAX_INBAND_PARAM_SZ,
488 "REVERB_ROOM_LEVEL", rc);
489 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530490 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530491 *updt_params++ =
492 AUDPROC_MODULE_ID_REVERB;
493 *updt_params++ =
494 AUDPROC_PARAM_ID_REVERB_ROOM_LEVEL;
495 *updt_params++ =
496 REVERB_ROOM_LEVEL_PARAM_SZ;
497 *updt_params++ =
498 reverb->room_level;
499 }
500 break;
501 case REVERB_ROOM_HF_LEVEL:
502 if (length != 1 || index_offset != 0) {
503 pr_err("REVERB_ROOM_HF_LEVEL:invalid params\n");
504 rc = -EINVAL;
505 goto invalid_config;
506 }
507 reverb->room_hf_level =
508 GET_NEXT(values, param_max_offset, rc);
509 pr_debug("%s: REVERB_ROOM_HF_LEVEL val%d\n",
510 __func__, reverb->room_hf_level);
511 if (command_config_state == CONFIG_SET) {
512 params_length += COMMAND_PAYLOAD_SZ +
513 REVERB_ROOM_HF_LEVEL_PARAM_SZ;
514 CHECK_PARAM_LEN(params_length,
515 MAX_INBAND_PARAM_SZ,
516 "REVERB_ROOM_HF_LEVEL", rc);
517 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530518 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530519 *updt_params++ =
520 AUDPROC_MODULE_ID_REVERB;
521 *updt_params++ =
522 AUDPROC_PARAM_ID_REVERB_ROOM_HF_LEVEL;
523 *updt_params++ =
524 REVERB_ROOM_HF_LEVEL_PARAM_SZ;
525 *updt_params++ =
526 reverb->room_hf_level;
527 }
528 break;
529 case REVERB_DECAY_TIME:
530 if (length != 1 || index_offset != 0) {
531 pr_err("REVERB_DECAY_TIME:invalid params\n");
532 rc = -EINVAL;
533 goto invalid_config;
534 }
535 reverb->decay_time =
536 GET_NEXT(values, param_max_offset, rc);
537 pr_debug("%s: REVERB_DECAY_TIME val:%d\n",
538 __func__, reverb->decay_time);
539 if (command_config_state == CONFIG_SET) {
540 params_length += COMMAND_PAYLOAD_SZ +
541 REVERB_DECAY_TIME_PARAM_SZ;
542 CHECK_PARAM_LEN(params_length,
543 MAX_INBAND_PARAM_SZ,
544 "REVERB_DECAY_TIME", rc);
545 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530546 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530547 *updt_params++ =
548 AUDPROC_MODULE_ID_REVERB;
549 *updt_params++ =
550 AUDPROC_PARAM_ID_REVERB_DECAY_TIME;
551 *updt_params++ =
552 REVERB_DECAY_TIME_PARAM_SZ;
553 *updt_params++ =
554 reverb->decay_time;
555 }
556 break;
557 case REVERB_DECAY_HF_RATIO:
558 if (length != 1 || index_offset != 0) {
559 pr_err("REVERB_DECAY_HF_RATIOinvalid params\n");
560 rc = -EINVAL;
561 goto invalid_config;
562 }
563 reverb->decay_hf_ratio =
564 GET_NEXT(values, param_max_offset, rc);
565 pr_debug("%s: REVERB_DECAY_HF_RATIO val%d\n",
566 __func__, reverb->decay_hf_ratio);
567 if (command_config_state == CONFIG_SET) {
568 params_length += COMMAND_PAYLOAD_SZ +
569 REVERB_DECAY_HF_RATIO_PARAM_SZ;
570 CHECK_PARAM_LEN(params_length,
571 MAX_INBAND_PARAM_SZ,
572 "REVERB_DECAY_HF_RATIO", rc);
573 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530574 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530575 *updt_params++ =
576 AUDPROC_MODULE_ID_REVERB;
577 *updt_params++ =
578 AUDPROC_PARAM_ID_REVERB_DECAY_HF_RATIO;
579 *updt_params++ =
580 REVERB_DECAY_HF_RATIO_PARAM_SZ;
581 *updt_params++ =
582 reverb->decay_hf_ratio;
583 }
584 break;
585 case REVERB_REFLECTIONS_LEVEL:
586 if (length != 1 || index_offset != 0) {
587 pr_err("REVERB_REFLECTION_LVLinvalid params\n");
588 rc = -EINVAL;
589 goto invalid_config;
590 }
591 reverb->reflections_level =
592 GET_NEXT(values, param_max_offset, rc);
593 pr_debug("%s: REVERB_REFLECTIONS_LEVEL val:%d\n",
594 __func__, reverb->reflections_level);
595 if (command_config_state == CONFIG_SET) {
596 params_length += COMMAND_PAYLOAD_SZ +
597 REVERB_REFLECTIONS_LEVEL_PARAM_SZ;
598 CHECK_PARAM_LEN(params_length,
599 MAX_INBAND_PARAM_SZ,
600 "REVERB_REFLECTIONS_LEVEL", rc);
601 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530602 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530603 *updt_params++ =
604 AUDPROC_MODULE_ID_REVERB;
605 *updt_params++ =
606 AUDPROC_PARAM_ID_REVERB_REFLECTIONS_LEVEL;
607 *updt_params++ =
608 REVERB_REFLECTIONS_LEVEL_PARAM_SZ;
609 *updt_params++ =
610 reverb->reflections_level;
611 }
612 break;
613 case REVERB_REFLECTIONS_DELAY:
614 if (length != 1 || index_offset != 0) {
615 pr_err("REVERB_REFLECTION_DLYinvalid params\n");
616 rc = -EINVAL;
617 goto invalid_config;
618 }
619 reverb->reflections_delay =
620 GET_NEXT(values, param_max_offset, rc);
621 pr_debug("%s: REVERB_REFLECTIONS_DELAY val:%d\n",
622 __func__, reverb->reflections_delay);
623 if (command_config_state == CONFIG_SET) {
624 params_length += COMMAND_PAYLOAD_SZ +
625 REVERB_REFLECTIONS_DELAY_PARAM_SZ;
626 CHECK_PARAM_LEN(params_length,
627 MAX_INBAND_PARAM_SZ,
628 "REVERB_REFLECTIONS_DELAY", rc);
629 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530630 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530631 *updt_params++ =
632 AUDPROC_MODULE_ID_REVERB;
633 *updt_params++ =
634 AUDPROC_PARAM_ID_REVERB_REFLECTIONS_DELAY;
635 *updt_params++ =
636 REVERB_REFLECTIONS_DELAY_PARAM_SZ;
637 *updt_params++ =
638 reverb->reflections_delay;
639 }
640 break;
641 case REVERB_LEVEL:
642 if (length != 1 || index_offset != 0) {
643 pr_err("REVERB_LEVEL:invalid params\n");
644 rc = -EINVAL;
645 goto invalid_config;
646 }
647 reverb->level =
648 GET_NEXT(values, param_max_offset, rc);
649 pr_debug("%s: REVERB_LEVEL val:%d\n",
650 __func__, reverb->level);
651 if (command_config_state == CONFIG_SET) {
652 params_length += COMMAND_PAYLOAD_SZ +
653 REVERB_LEVEL_PARAM_SZ;
654 CHECK_PARAM_LEN(params_length,
655 MAX_INBAND_PARAM_SZ,
656 "REVERB_LEVEL", rc);
657 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530658 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530659 *updt_params++ =
660 AUDPROC_MODULE_ID_REVERB;
661 *updt_params++ =
662 AUDPROC_PARAM_ID_REVERB_LEVEL;
663 *updt_params++ =
664 REVERB_LEVEL_PARAM_SZ;
665 *updt_params++ =
666 reverb->level;
667 }
668 break;
669 case REVERB_DELAY:
670 if (length != 1 || index_offset != 0) {
671 pr_err("REVERB_DELAY:invalid params\n");
672 rc = -EINVAL;
673 goto invalid_config;
674 }
675 reverb->delay =
676 GET_NEXT(values, param_max_offset, rc);
677 pr_debug("%s:REVERB_DELAY val:%d\n",
678 __func__, reverb->delay);
679 if (command_config_state == CONFIG_SET) {
680 params_length += COMMAND_PAYLOAD_SZ +
681 REVERB_DELAY_PARAM_SZ;
682 CHECK_PARAM_LEN(params_length,
683 MAX_INBAND_PARAM_SZ,
684 "REVERB_DELAY", rc);
685 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530686 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530687 *updt_params++ =
688 AUDPROC_MODULE_ID_REVERB;
689 *updt_params++ =
690 AUDPROC_PARAM_ID_REVERB_DELAY;
691 *updt_params++ =
692 REVERB_DELAY_PARAM_SZ;
693 *updt_params++ =
694 reverb->delay;
695 }
696 break;
697 case REVERB_DIFFUSION:
698 if (length != 1 || index_offset != 0) {
699 pr_err("REVERB_DIFFUSION:invalid params\n");
700 rc = -EINVAL;
701 goto invalid_config;
702 }
703 reverb->diffusion =
704 GET_NEXT(values, param_max_offset, rc);
705 pr_debug("%s: REVERB_DIFFUSION val:%d\n",
706 __func__, reverb->diffusion);
707 if (command_config_state == CONFIG_SET) {
708 params_length += COMMAND_PAYLOAD_SZ +
709 REVERB_DIFFUSION_PARAM_SZ;
710 CHECK_PARAM_LEN(params_length,
711 MAX_INBAND_PARAM_SZ,
712 "REVERB_DIFFUSION", rc);
713 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530714 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530715 *updt_params++ =
716 AUDPROC_MODULE_ID_REVERB;
717 *updt_params++ =
718 AUDPROC_PARAM_ID_REVERB_DIFFUSION;
719 *updt_params++ =
720 REVERB_DIFFUSION_PARAM_SZ;
721 *updt_params++ =
722 reverb->diffusion;
723 }
724 break;
725 case REVERB_DENSITY:
726 if (length != 1 || index_offset != 0) {
727 pr_err("REVERB_DENSITY:invalid params\n");
728 rc = -EINVAL;
729 goto invalid_config;
730 }
731 reverb->density =
732 GET_NEXT(values, param_max_offset, rc);
733 pr_debug("%s: REVERB_DENSITY val:%d\n",
734 __func__, reverb->density);
735 if (command_config_state == CONFIG_SET) {
736 params_length += COMMAND_PAYLOAD_SZ +
737 REVERB_DENSITY_PARAM_SZ;
738 CHECK_PARAM_LEN(params_length,
739 MAX_INBAND_PARAM_SZ,
740 "REVERB_DENSITY", rc);
741 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530742 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530743 *updt_params++ =
744 AUDPROC_MODULE_ID_REVERB;
745 *updt_params++ =
746 AUDPROC_PARAM_ID_REVERB_DENSITY;
747 *updt_params++ =
748 REVERB_DENSITY_PARAM_SZ;
749 *updt_params++ =
750 reverb->density;
751 }
752 break;
753 default:
Aditya Bavanari9960d262019-04-26 14:38:29 +0530754 pr_err_ratelimited("%s: Invalid command to set config\n",
755 __func__);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530756 break;
757 }
758 }
759 if (params_length && (rc == 0))
760 q6asm_send_audio_effects_params(ac, params,
761 params_length);
762 else
763 pr_debug("%s: did not send pp params\n", __func__);
764invalid_config:
765 kfree(params);
766 return rc;
767}
Laxminath Kasam8b1366a2017-10-05 01:44:16 +0530768EXPORT_SYMBOL(msm_audio_effects_reverb_handler);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530769
Laxminath Kasam8b1366a2017-10-05 01:44:16 +0530770/**
771 * msm_audio_effects_bass_boost_handler -
772 * Audio effects handler for bass_boost
773 *
774 * @ac: audio client handle
775 * @bass_boost: bass_boost params
776 * @values: values to be updated
777 *
778 * Return 0 on success or error on failure
779 */
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530780int msm_audio_effects_bass_boost_handler(struct audio_client *ac,
781 struct bass_boost_params *bass_boost,
782 long *values)
783{
784 long *param_max_offset = values + MAX_PP_PARAMS_SZ - 1;
785 char *params = NULL;
786 int rc = 0;
787 int devices = GET_NEXT(values, param_max_offset, rc);
788 int num_commands = GET_NEXT(values, param_max_offset, rc);
789 int *updt_params, i, prev_enable_flag;
790 uint32_t params_length = (MAX_INBAND_PARAM_SZ);
791
792 pr_debug("%s\n", __func__);
793 if (!ac || (devices == -EINVAL) || (num_commands == -EINVAL)) {
794 pr_err("%s: cannot set audio effects\n", __func__);
795 return -EINVAL;
796 }
797 params = kzalloc(params_length, GFP_KERNEL);
798 if (!params)
799 return -ENOMEM;
800
801 pr_debug("%s: device: %d\n", __func__, devices);
802 updt_params = (int *)params;
803 params_length = 0;
804 for (i = 0; i < num_commands; i++) {
805 uint32_t command_id =
806 GET_NEXT(values, param_max_offset, rc);
807 uint32_t command_config_state =
808 GET_NEXT(values, param_max_offset, rc);
809 uint32_t index_offset =
810 GET_NEXT(values, param_max_offset, rc);
811 uint32_t length =
812 GET_NEXT(values, param_max_offset, rc);
813 switch (command_id) {
814 case BASS_BOOST_ENABLE:
815 if (length != 1 || index_offset != 0) {
816 pr_err("BASS_BOOST_ENABLE:invalid params\n");
817 rc = -EINVAL;
818 goto invalid_config;
819 }
820 prev_enable_flag = bass_boost->enable_flag;
821 bass_boost->enable_flag =
822 GET_NEXT(values, param_max_offset, rc);
823 pr_debug("%s: BASS_BOOST_ENABLE prev:%d new:%d\n",
824 __func__, prev_enable_flag,
825 bass_boost->enable_flag);
826 if (prev_enable_flag != bass_boost->enable_flag) {
827 params_length += COMMAND_PAYLOAD_SZ +
828 BASS_BOOST_ENABLE_PARAM_SZ;
829 CHECK_PARAM_LEN(params_length,
830 MAX_INBAND_PARAM_SZ,
831 "BASS_BOOST_ENABLE", rc);
832 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530833 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530834 *updt_params++ =
835 AUDPROC_MODULE_ID_BASS_BOOST;
836 *updt_params++ =
837 AUDPROC_PARAM_ID_BASS_BOOST_ENABLE;
838 *updt_params++ =
839 BASS_BOOST_ENABLE_PARAM_SZ;
840 *updt_params++ =
841 bass_boost->enable_flag;
842 }
843 break;
844 case BASS_BOOST_MODE:
845 if (length != 1 || index_offset != 0) {
846 pr_err("BASS_BOOST_MODE:invalid params\n");
847 rc = -EINVAL;
848 goto invalid_config;
849 }
850 bass_boost->mode =
851 GET_NEXT(values, param_max_offset, rc);
852 pr_debug("%s: BASS_BOOST_MODE val:%d\n",
853 __func__, bass_boost->mode);
854 if (command_config_state == CONFIG_SET) {
855 params_length += COMMAND_PAYLOAD_SZ +
856 BASS_BOOST_MODE_PARAM_SZ;
857 CHECK_PARAM_LEN(params_length,
858 MAX_INBAND_PARAM_SZ,
859 "BASS_BOOST_MODE", rc);
860 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530861 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530862 *updt_params++ =
863 AUDPROC_MODULE_ID_BASS_BOOST;
864 *updt_params++ =
865 AUDPROC_PARAM_ID_BASS_BOOST_MODE;
866 *updt_params++ =
867 BASS_BOOST_MODE_PARAM_SZ;
868 *updt_params++ =
869 bass_boost->mode;
870 }
871 break;
872 case BASS_BOOST_STRENGTH:
873 if (length != 1 || index_offset != 0) {
874 pr_err("BASS_BOOST_STRENGTH:invalid params\n");
875 rc = -EINVAL;
876 goto invalid_config;
877 }
878 bass_boost->strength =
879 GET_NEXT(values, param_max_offset, rc);
880 pr_debug("%s: BASS_BOOST_STRENGTH val:%d\n",
881 __func__, bass_boost->strength);
882 if (command_config_state == CONFIG_SET) {
883 params_length += COMMAND_PAYLOAD_SZ +
884 BASS_BOOST_STRENGTH_PARAM_SZ;
885 CHECK_PARAM_LEN(params_length,
886 MAX_INBAND_PARAM_SZ,
887 "BASS_BOOST_STRENGTH", rc);
888 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530889 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530890 *updt_params++ =
891 AUDPROC_MODULE_ID_BASS_BOOST;
892 *updt_params++ =
893 AUDPROC_PARAM_ID_BASS_BOOST_STRENGTH;
894 *updt_params++ =
895 BASS_BOOST_STRENGTH_PARAM_SZ;
896 *updt_params++ =
897 bass_boost->strength;
898 }
899 break;
900 default:
Aditya Bavanari9960d262019-04-26 14:38:29 +0530901 pr_err_ratelimited("%s: Invalid command to set config\n",
902 __func__);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530903 break;
904 }
905 }
906 if (params_length && (rc == 0))
907 q6asm_send_audio_effects_params(ac, params,
908 params_length);
909 else
910 pr_debug("%s: did not send pp params\n", __func__);
911invalid_config:
912 kfree(params);
913 return rc;
914}
Laxminath Kasam8b1366a2017-10-05 01:44:16 +0530915EXPORT_SYMBOL(msm_audio_effects_bass_boost_handler);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530916
Laxminath Kasam8b1366a2017-10-05 01:44:16 +0530917/**
918 * msm_audio_effects_pbe_handler -
919 * Audio effects handler for pbe
920 *
921 * @ac: audio client handle
922 * @pbe: pbe params
923 * @values: values to be updated
924 *
925 * Return 0 on success or error on failure
926 */
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530927int msm_audio_effects_pbe_handler(struct audio_client *ac,
928 struct pbe_params *pbe,
929 long *values)
930{
931 long *param_max_offset = values + MAX_PP_PARAMS_SZ - 1;
932 char *params = NULL;
933 int rc = 0;
934 int devices = GET_NEXT(values, param_max_offset, rc);
935 int num_commands = GET_NEXT(values, param_max_offset, rc);
936 int *updt_params, i, j, prev_enable_flag;
937 uint32_t params_length = (MAX_INBAND_PARAM_SZ);
938
939 pr_debug("%s\n", __func__);
940 if (!ac || (devices == -EINVAL) || (num_commands == -EINVAL)) {
941 pr_err("%s: cannot set audio effects\n", __func__);
942 return -EINVAL;
943 }
944 params = kzalloc(params_length, GFP_KERNEL);
945 if (!params)
946 return -ENOMEM;
947
948 pr_debug("%s: device: %d\n", __func__, devices);
949 updt_params = (int *)params;
950 params_length = 0;
951 for (i = 0; i < num_commands; i++) {
952 uint32_t command_id =
953 GET_NEXT(values, param_max_offset, rc);
954 uint32_t command_config_state =
955 GET_NEXT(values, param_max_offset, rc);
956 uint32_t index_offset =
957 GET_NEXT(values, param_max_offset, rc);
958 uint32_t length =
959 GET_NEXT(values, param_max_offset, rc);
960 switch (command_id) {
961 case PBE_ENABLE:
962 pr_debug("%s: PBE_ENABLE\n", __func__);
963 if (length != 1 || index_offset != 0) {
964 pr_err("no valid params\n");
965 rc = -EINVAL;
966 goto invalid_config;
967 }
968 prev_enable_flag = pbe->enable_flag;
969 pbe->enable_flag =
970 GET_NEXT(values, param_max_offset, rc);
971 if (prev_enable_flag != pbe->enable_flag) {
972 params_length += COMMAND_PAYLOAD_SZ +
973 PBE_ENABLE_PARAM_SZ;
974 CHECK_PARAM_LEN(params_length,
975 MAX_INBAND_PARAM_SZ,
976 "PBE_ENABLE", rc);
977 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +0530978 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530979 *updt_params++ =
980 AUDPROC_MODULE_ID_PBE;
981 *updt_params++ =
982 AUDPROC_PARAM_ID_PBE_ENABLE;
983 *updt_params++ =
984 PBE_ENABLE_PARAM_SZ;
985 *updt_params++ =
986 pbe->enable_flag;
987 }
988 break;
989 case PBE_CONFIG:
990 pr_debug("%s: PBE_PARAM length %u\n", __func__, length);
991 if (length > sizeof(struct pbe_config_t) ||
992 length < PBE_CONFIG_PARAM_LEN ||
993 index_offset != 0) {
994 pr_err("no valid params, len %d\n", length);
995 rc = -EINVAL;
996 goto invalid_config;
997 }
998 if (command_config_state == CONFIG_SET) {
999 params_length += COMMAND_PAYLOAD_SZ + length;
1000 CHECK_PARAM_LEN(params_length,
1001 MAX_INBAND_PARAM_SZ,
1002 "PBE_PARAM", rc);
1003 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +05301004 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301005 *updt_params++ =
1006 AUDPROC_MODULE_ID_PBE;
1007 *updt_params++ =
1008 AUDPROC_PARAM_ID_PBE_PARAM_CONFIG;
1009 *updt_params++ =
1010 length;
1011 for (j = 0; j < length; ) {
1012 j += sizeof(*updt_params);
1013 *updt_params++ =
1014 GET_NEXT(
1015 values,
1016 param_max_offset,
1017 rc);
1018 }
1019 }
1020 break;
1021 default:
Aditya Bavanari9960d262019-04-26 14:38:29 +05301022 pr_err_ratelimited("%s: Invalid command to set config\n",
1023 __func__);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301024 break;
1025 }
1026 }
1027 if (params_length && (rc == 0))
1028 q6asm_send_audio_effects_params(ac, params,
1029 params_length);
1030invalid_config:
1031 kfree(params);
1032 return rc;
1033}
Laxminath Kasam8b1366a2017-10-05 01:44:16 +05301034EXPORT_SYMBOL(msm_audio_effects_pbe_handler);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301035
Laxminath Kasam8b1366a2017-10-05 01:44:16 +05301036/**
1037 * msm_audio_effects_popless_eq_handler -
1038 * Audio effects handler for popless equalizer
1039 *
1040 * @ac: audio client handle
1041 * @eq: equalizer params
1042 * @values: values to be updated
1043 *
1044 * Return 0 on success or error on failure
1045 */
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301046int msm_audio_effects_popless_eq_handler(struct audio_client *ac,
1047 struct eq_params *eq,
1048 long *values)
1049{
1050 long *param_max_offset = values + MAX_PP_PARAMS_SZ - 1;
1051 char *params = NULL;
1052 int rc = 0;
1053 int devices = GET_NEXT(values, param_max_offset, rc);
1054 int num_commands = GET_NEXT(values, param_max_offset, rc);
1055 int *updt_params, i, prev_enable_flag;
1056 uint32_t params_length = (MAX_INBAND_PARAM_SZ);
1057
1058 pr_debug("%s\n", __func__);
1059 if (!ac || (devices == -EINVAL) || (num_commands == -EINVAL)) {
1060 pr_err("%s: cannot set audio effects\n", __func__);
1061 return -EINVAL;
1062 }
1063 params = kzalloc(params_length, GFP_KERNEL);
1064 if (!params)
1065 return -ENOMEM;
1066
1067 pr_debug("%s: device: %d\n", __func__, devices);
1068 updt_params = (int *)params;
1069 params_length = 0;
1070 for (i = 0; i < num_commands; i++) {
1071 uint32_t command_id =
1072 GET_NEXT(values, param_max_offset, rc);
1073 uint32_t command_config_state =
1074 GET_NEXT(values, param_max_offset, rc);
1075 uint32_t index_offset =
1076 GET_NEXT(values, param_max_offset, rc);
1077 uint32_t length =
1078 GET_NEXT(values, param_max_offset, rc);
1079 uint32_t idx;
1080 int j;
1081
1082 switch (command_id) {
1083 case EQ_ENABLE:
1084 if (length != 1 || index_offset != 0) {
1085 pr_err("EQ_ENABLE:invalid params\n");
1086 rc = -EINVAL;
1087 goto invalid_config;
1088 }
1089 prev_enable_flag = eq->enable_flag;
1090 eq->enable_flag =
1091 GET_NEXT(values, param_max_offset, rc);
1092 pr_debug("%s: EQ_ENABLE prev:%d new:%d\n", __func__,
1093 prev_enable_flag, eq->enable_flag);
1094 if (prev_enable_flag != eq->enable_flag) {
1095 params_length += COMMAND_PAYLOAD_SZ +
1096 EQ_ENABLE_PARAM_SZ;
1097 CHECK_PARAM_LEN(params_length,
1098 MAX_INBAND_PARAM_SZ,
1099 "EQ_ENABLE", rc);
1100 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +05301101 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301102 *updt_params++ =
1103 AUDPROC_MODULE_ID_POPLESS_EQUALIZER;
1104 *updt_params++ =
1105 AUDPROC_PARAM_ID_EQ_ENABLE;
1106 *updt_params++ =
1107 EQ_ENABLE_PARAM_SZ;
1108 *updt_params++ =
1109 eq->enable_flag;
1110 }
1111 break;
1112 case EQ_CONFIG:
1113 if (length < EQ_CONFIG_PARAM_LEN || index_offset != 0) {
1114 pr_err("EQ_CONFIG:invalid params\n");
1115 rc = -EINVAL;
1116 goto invalid_config;
1117 }
1118 pr_debug("%s: EQ_CONFIG bands:%d, pgain:%d, pset:%d\n",
1119 __func__, eq->config.num_bands,
1120 eq->config.eq_pregain, eq->config.preset_id);
1121 for (idx = 0; idx < MAX_EQ_BANDS; idx++)
1122 eq->per_band_cfg[idx].band_idx = -1;
1123 eq->config.eq_pregain =
1124 GET_NEXT(values, param_max_offset, rc);
1125 eq->config.preset_id =
1126 GET_NEXT(values, param_max_offset, rc);
1127 eq->config.num_bands =
1128 GET_NEXT(values, param_max_offset, rc);
1129 if (eq->config.num_bands > MAX_EQ_BANDS) {
1130 pr_err("EQ_CONFIG:invalid num of bands\n");
1131 rc = -EINVAL;
1132 goto invalid_config;
1133 }
1134 if (eq->config.num_bands &&
1135 (((length - EQ_CONFIG_PARAM_LEN)/
1136 EQ_CONFIG_PER_BAND_PARAM_LEN)
1137 != eq->config.num_bands)) {
1138 pr_err("EQ_CONFIG:invalid length per band\n");
1139 rc = -EINVAL;
1140 goto invalid_config;
1141 }
1142 for (j = 0; j < eq->config.num_bands; j++) {
1143 idx = GET_NEXT(values, param_max_offset, rc);
1144 if (idx >= MAX_EQ_BANDS) {
1145 pr_err("EQ_CONFIG:invalid band index\n");
1146 rc = -EINVAL;
1147 goto invalid_config;
1148 }
1149 eq->per_band_cfg[idx].band_idx = idx;
1150 eq->per_band_cfg[idx].filter_type =
1151 GET_NEXT(values, param_max_offset, rc);
1152 eq->per_band_cfg[idx].freq_millihertz =
1153 GET_NEXT(values, param_max_offset, rc);
1154 eq->per_band_cfg[idx].gain_millibels =
1155 GET_NEXT(values, param_max_offset, rc);
1156 eq->per_band_cfg[idx].quality_factor =
1157 GET_NEXT(values, param_max_offset, rc);
1158 }
1159 if (command_config_state == CONFIG_SET) {
1160 int config_param_length = EQ_CONFIG_PARAM_SZ +
1161 (EQ_CONFIG_PER_BAND_PARAM_SZ*
1162 eq->config.num_bands);
1163 params_length += COMMAND_PAYLOAD_SZ +
1164 config_param_length;
1165 CHECK_PARAM_LEN(params_length,
1166 MAX_INBAND_PARAM_SZ,
1167 "EQ_CONFIG", rc);
1168 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +05301169 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301170 *updt_params++ =
1171 AUDPROC_MODULE_ID_POPLESS_EQUALIZER;
1172 *updt_params++ =
1173 AUDPROC_PARAM_ID_EQ_CONFIG;
1174 *updt_params++ =
1175 config_param_length;
1176 *updt_params++ =
1177 eq->config.eq_pregain;
1178 *updt_params++ =
1179 eq->config.preset_id;
1180 *updt_params++ =
1181 eq->config.num_bands;
1182 for (idx = 0; idx < MAX_EQ_BANDS; idx++) {
1183 if (eq->per_band_cfg[idx].band_idx < 0)
1184 continue;
1185 *updt_params++ =
1186 eq->per_band_cfg[idx].filter_type;
1187 *updt_params++ =
1188 eq->per_band_cfg[idx].freq_millihertz;
1189 *updt_params++ =
1190 eq->per_band_cfg[idx].gain_millibels;
1191 *updt_params++ =
1192 eq->per_band_cfg[idx].quality_factor;
1193 *updt_params++ =
1194 eq->per_band_cfg[idx].band_idx;
1195 }
1196 }
1197 break;
1198 case EQ_BAND_INDEX:
1199 if (length != 1 || index_offset != 0) {
1200 pr_err("EQ_BAND_INDEX:invalid params\n");
1201 rc = -EINVAL;
1202 goto invalid_config;
1203 }
1204 idx = GET_NEXT(values, param_max_offset, rc);
1205 if (idx > MAX_EQ_BANDS) {
1206 pr_err("EQ_BAND_INDEX:invalid band index\n");
1207 rc = -EINVAL;
1208 goto invalid_config;
1209 }
1210 eq->band_index = idx;
1211 pr_debug("%s: EQ_BAND_INDEX val:%d\n",
1212 __func__, eq->band_index);
1213 if (command_config_state == CONFIG_SET) {
1214 params_length += COMMAND_PAYLOAD_SZ +
1215 EQ_BAND_INDEX_PARAM_SZ;
1216 CHECK_PARAM_LEN(params_length,
1217 MAX_INBAND_PARAM_SZ,
1218 "EQ_BAND_INDEX", rc);
1219 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +05301220 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301221 *updt_params++ =
1222 AUDPROC_MODULE_ID_POPLESS_EQUALIZER;
1223 *updt_params++ =
1224 AUDPROC_PARAM_ID_EQ_BAND_INDEX;
1225 *updt_params++ =
1226 EQ_BAND_INDEX_PARAM_SZ;
1227 *updt_params++ =
1228 eq->band_index;
1229 }
1230 break;
1231 case EQ_SINGLE_BAND_FREQ:
1232 if (length != 1 || index_offset != 0) {
1233 pr_err("EQ_SINGLE_BAND_FREQ:invalid params\n");
1234 rc = -EINVAL;
1235 goto invalid_config;
1236 }
1237 if (eq->band_index > MAX_EQ_BANDS) {
1238 pr_err("EQ_SINGLE_BAND_FREQ:invalid index\n");
1239 break;
1240 }
1241 eq->freq_millihertz =
1242 GET_NEXT(values, param_max_offset, rc);
1243 pr_debug("%s: EQ_SINGLE_BAND_FREQ idx:%d, val:%d\n",
1244 __func__, eq->band_index, eq->freq_millihertz);
1245 if (command_config_state == CONFIG_SET) {
1246 params_length += COMMAND_PAYLOAD_SZ +
1247 EQ_SINGLE_BAND_FREQ_PARAM_SZ;
1248 CHECK_PARAM_LEN(params_length,
1249 MAX_INBAND_PARAM_SZ,
1250 "EQ_SINGLE_BAND_FREQ", rc);
1251 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +05301252 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301253 *updt_params++ =
1254 AUDPROC_MODULE_ID_POPLESS_EQUALIZER;
1255 *updt_params++ =
1256 AUDPROC_PARAM_ID_EQ_SINGLE_BAND_FREQ;
1257 *updt_params++ =
1258 EQ_SINGLE_BAND_FREQ_PARAM_SZ;
1259 *updt_params++ =
1260 eq->freq_millihertz;
1261 }
1262 break;
1263 default:
Aditya Bavanari9960d262019-04-26 14:38:29 +05301264 pr_err_ratelimited("%s: Invalid command to set config\n",
1265 __func__);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301266 break;
1267 }
1268 }
1269 if (params_length && (rc == 0))
1270 q6asm_send_audio_effects_params(ac, params,
1271 params_length);
1272 else
1273 pr_debug("%s: did not send pp params\n", __func__);
1274invalid_config:
1275 kfree(params);
1276 return rc;
1277}
Laxminath Kasam8b1366a2017-10-05 01:44:16 +05301278EXPORT_SYMBOL(msm_audio_effects_popless_eq_handler);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301279
1280static int __msm_audio_effects_volume_handler(struct audio_client *ac,
1281 struct soft_volume_params *vol,
1282 long *values,
1283 int instance)
1284{
1285 int devices;
1286 int num_commands;
1287 char *params = NULL;
1288 int *updt_params, i;
1289 uint32_t params_length = (MAX_INBAND_PARAM_SZ);
1290 long *param_max_offset;
1291 int rc = 0;
1292
1293 pr_debug("%s: instance: %d\n", __func__, instance);
1294 if (!values) {
1295 pr_err("%s: set audio effects failed, no valid data\n",
1296 __func__);
1297 return -EINVAL;
1298 }
1299 param_max_offset = values + MAX_PP_PARAMS_SZ - 1;
1300 devices = GET_NEXT(values, param_max_offset, rc);
1301 num_commands = GET_NEXT(values, param_max_offset, rc);
1302 if (!ac || (devices == -EINVAL) || (num_commands == -EINVAL)) {
1303 pr_err("%s: cannot set audio effects\n", __func__);
1304 return -EINVAL;
1305 }
1306 params = kzalloc(params_length, GFP_KERNEL);
1307 if (!params)
1308 return -ENOMEM;
1309
1310 updt_params = (int *)params;
1311 params_length = 0;
1312 for (i = 0; i < num_commands; i++) {
1313 uint32_t command_id =
1314 GET_NEXT(values, param_max_offset, rc);
1315 uint32_t command_config_state =
1316 GET_NEXT(values, param_max_offset, rc);
1317 uint32_t index_offset =
1318 GET_NEXT(values, param_max_offset, rc);
1319 uint32_t length =
1320 GET_NEXT(values, param_max_offset, rc);
1321 switch (command_id) {
1322 case SOFT_VOLUME_GAIN_2CH:
1323 case SOFT_VOLUME2_GAIN_2CH:
1324 if (length != 2 || index_offset != 0) {
1325 pr_err("VOLUME_GAIN_2CH: invalid params\n");
1326 rc = -EINVAL;
1327 goto invalid_config;
1328 }
1329 vol->left_gain = GET_NEXT(values, param_max_offset, rc);
1330 vol->right_gain =
1331 GET_NEXT(values, param_max_offset, rc);
1332 vol->master_gain = 0x2000;
1333 if (command_config_state == CONFIG_SET) {
1334 params_length += COMMAND_PAYLOAD_SZ +
1335 SOFT_VOLUME_GAIN_2CH_PARAM_SZ;
1336 params_length += COMMAND_PAYLOAD_SZ +
1337 SOFT_VOLUME_GAIN_MASTER_PARAM_SZ;
1338 CHECK_PARAM_LEN(params_length,
1339 MAX_INBAND_PARAM_SZ,
1340 "VOLUME/VOLUME2_GAIN_2CH",
1341 rc);
1342 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +05301343 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301344 if (instance == SOFT_VOLUME_INSTANCE_2)
1345 *updt_params++ =
1346 ASM_MODULE_ID_VOL_CTRL2;
1347 else
1348 *updt_params++ =
1349 ASM_MODULE_ID_VOL_CTRL;
1350 *updt_params++ =
1351 ASM_PARAM_ID_VOL_CTRL_LR_CHANNEL_GAIN;
1352 *updt_params++ =
1353 SOFT_VOLUME_GAIN_2CH_PARAM_SZ;
1354 *updt_params++ =
1355 (vol->left_gain << 16) |
1356 vol->right_gain;
1357 if (instance == SOFT_VOLUME_INSTANCE_2)
1358 *updt_params++ =
1359 ASM_MODULE_ID_VOL_CTRL2;
1360 else
1361 *updt_params++ =
1362 ASM_MODULE_ID_VOL_CTRL;
1363 *updt_params++ =
1364 ASM_PARAM_ID_VOL_CTRL_MASTER_GAIN;
1365 *updt_params++ =
1366 SOFT_VOLUME_GAIN_MASTER_PARAM_SZ;
1367 *updt_params++ =
1368 vol->master_gain;
1369 }
1370 break;
1371 case SOFT_VOLUME_GAIN_MASTER:
1372 case SOFT_VOLUME2_GAIN_MASTER:
1373 if (length != 1 || index_offset != 0) {
1374 pr_err("VOLUME_GAIN_MASTER: invalid params\n");
1375 rc = -EINVAL;
1376 goto invalid_config;
1377 }
1378 vol->left_gain = 0x2000;
1379 vol->right_gain = 0x2000;
1380 vol->master_gain =
1381 GET_NEXT(values, param_max_offset, rc);
1382 if (command_config_state == CONFIG_SET) {
1383 params_length += COMMAND_PAYLOAD_SZ +
1384 SOFT_VOLUME_GAIN_2CH_PARAM_SZ;
1385 params_length += COMMAND_PAYLOAD_SZ +
1386 SOFT_VOLUME_GAIN_MASTER_PARAM_SZ;
1387 CHECK_PARAM_LEN(params_length,
1388 MAX_INBAND_PARAM_SZ,
1389 "VOLUME/VOLUME2_GAIN_MASTER",
1390 rc);
1391 if (rc != 0)
Laxminath Kasam38070be2017-08-17 18:21:59 +05301392 goto invalid_config;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301393 if (instance == SOFT_VOLUME_INSTANCE_2)
1394 *updt_params++ =
1395 ASM_MODULE_ID_VOL_CTRL2;
1396 else
1397 *updt_params++ =
1398 ASM_MODULE_ID_VOL_CTRL;
1399 *updt_params++ =
1400 ASM_PARAM_ID_VOL_CTRL_LR_CHANNEL_GAIN;
1401 *updt_params++ =
1402 SOFT_VOLUME_GAIN_2CH_PARAM_SZ;
1403 *updt_params++ =
1404 (vol->left_gain << 16) |
1405 vol->right_gain;
1406 if (instance == SOFT_VOLUME_INSTANCE_2)
1407 *updt_params++ =
1408 ASM_MODULE_ID_VOL_CTRL2;
1409 else
1410 *updt_params++ =
1411 ASM_MODULE_ID_VOL_CTRL;
1412 *updt_params++ =
1413 ASM_PARAM_ID_VOL_CTRL_MASTER_GAIN;
1414 *updt_params++ =
1415 SOFT_VOLUME_GAIN_MASTER_PARAM_SZ;
1416 *updt_params++ =
1417 vol->master_gain;
1418 }
1419 break;
1420 default:
Aditya Bavanari9960d262019-04-26 14:38:29 +05301421 pr_err_ratelimited("%s: Invalid command id: %d to set config\n",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301422 __func__, command_id);
1423 break;
1424 }
1425 }
1426 if (params_length && (rc == 0))
1427 q6asm_send_audio_effects_params(ac, params,
1428 params_length);
1429invalid_config:
1430 kfree(params);
1431 return rc;
1432}
1433
1434int msm_audio_effects_volume_handler(struct audio_client *ac,
1435 struct soft_volume_params *vol,
1436 long *values)
1437{
1438 return __msm_audio_effects_volume_handler(ac, vol, values,
1439 SOFT_VOLUME_INSTANCE_1);
1440}
1441
Laxminath Kasam8b1366a2017-10-05 01:44:16 +05301442/**
1443 * msm_audio_effects_volume_handler_v2 -
1444 * Audio effects handler for volume
1445 *
1446 * @ac: audio client handle
1447 * @vol: volume params
1448 * @values: values to be updated
1449 * @instance: instance to update
1450 *
1451 * Return 0 on success or error on failure
1452 */
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301453int msm_audio_effects_volume_handler_v2(struct audio_client *ac,
1454 struct soft_volume_params *vol,
1455 long *values, int instance)
1456{
1457 return __msm_audio_effects_volume_handler(ac, vol, values, instance);
1458}
Laxminath Kasam8b1366a2017-10-05 01:44:16 +05301459EXPORT_SYMBOL(msm_audio_effects_volume_handler_v2);