1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Greybus audio driver 4 * Copyright 2015-2016 Google Inc. 5 * Copyright 2015-2016 Linaro Ltd. 6 */ 7 8 #include <linux/greybus.h> 9 #include "audio_codec.h" 10 11 #define GBAUDIO_INVALID_ID 0xFF 12 13 /* mixer control */ 14 struct gb_mixer_control { 15 int min, max; 16 unsigned int reg, rreg, shift, rshift, invert; 17 }; 18 19 struct gbaudio_ctl_pvt { 20 unsigned int ctl_id; 21 unsigned int data_cport; 22 unsigned int access; 23 unsigned int vcount; 24 struct gb_audio_ctl_elem_info *info; 25 }; 26 27 static struct gbaudio_module_info *find_gb_module( 28 struct gbaudio_codec_info *codec, 29 char const *name) 30 { 31 int dev_id; 32 char begin[NAME_SIZE]; 33 struct gbaudio_module_info *module; 34 35 if (!name) 36 return NULL; 37 38 if (sscanf(name, "%s %d", begin, &dev_id) != 2) 39 return NULL; 40 41 dev_dbg(codec->dev, "%s:Find module#%d\n", __func__, dev_id); 42 43 mutex_lock(&codec->lock); 44 list_for_each_entry(module, &codec->module_list, list) { 45 if (module->dev_id == dev_id) { 46 mutex_unlock(&codec->lock); 47 return module; 48 } 49 } 50 mutex_unlock(&codec->lock); 51 dev_warn(codec->dev, "%s: module#%d missing in codec list\n", name, 52 dev_id); 53 return NULL; 54 } 55 56 static const char *gbaudio_map_controlid(struct gbaudio_module_info *module, 57 __u8 control_id, __u8 index) 58 { 59 struct gbaudio_control *control; 60 61 if (control_id == GBAUDIO_INVALID_ID) 62 return NULL; 63 64 list_for_each_entry(control, &module->ctl_list, list) { 65 if (control->id == control_id) { 66 if (index == GBAUDIO_INVALID_ID) 67 return control->name; 68 if (index >= control->items) 69 return NULL; 70 return control->texts[index]; 71 } 72 } 73 list_for_each_entry(control, &module->widget_ctl_list, list) { 74 if (control->id == control_id) { 75 if (index == GBAUDIO_INVALID_ID) 76 return control->name; 77 if (index >= control->items) 78 return NULL; 79 return control->texts[index]; 80 } 81 } 82 return NULL; 83 } 84 85 static int gbaudio_map_controlname(struct gbaudio_module_info *module, 86 const char *name) 87 { 88 struct gbaudio_control *control; 89 90 list_for_each_entry(control, &module->ctl_list, list) { 91 if (!strncmp(control->name, name, NAME_SIZE)) 92 return control->id; 93 } 94 95 dev_warn(module->dev, "%s: missing in modules controls list\n", name); 96 97 return -EINVAL; 98 } 99 100 static int gbaudio_map_wcontrolname(struct gbaudio_module_info *module, 101 const char *name) 102 { 103 struct gbaudio_control *control; 104 105 list_for_each_entry(control, &module->widget_ctl_list, list) { 106 if (!strncmp(control->wname, name, NAME_SIZE)) 107 return control->id; 108 } 109 dev_warn(module->dev, "%s: missing in modules controls list\n", name); 110 111 return -EINVAL; 112 } 113 114 static int gbaudio_map_widgetname(struct gbaudio_module_info *module, 115 const char *name) 116 { 117 struct gbaudio_widget *widget; 118 119 list_for_each_entry(widget, &module->widget_list, list) { 120 if (!strncmp(widget->name, name, NAME_SIZE)) 121 return widget->id; 122 } 123 dev_warn(module->dev, "%s: missing in modules widgets list\n", name); 124 125 return -EINVAL; 126 } 127 128 static const char *gbaudio_map_widgetid(struct gbaudio_module_info *module, 129 __u8 widget_id) 130 { 131 struct gbaudio_widget *widget; 132 133 list_for_each_entry(widget, &module->widget_list, list) { 134 if (widget->id == widget_id) 135 return widget->name; 136 } 137 return NULL; 138 } 139 140 static const char **gb_generate_enum_strings(struct gbaudio_module_info *gb, 141 struct gb_audio_enumerated *gbenum) 142 { 143 const char **strings; 144 int i; 145 unsigned int items; 146 __u8 *data; 147 148 items = le32_to_cpu(gbenum->items); 149 strings = devm_kcalloc(gb->dev, items, sizeof(char *), GFP_KERNEL); 150 data = gbenum->names; 151 152 for (i = 0; i < items; i++) { 153 strings[i] = (const char *)data; 154 while (*data != '\0') 155 data++; 156 data++; 157 } 158 159 return strings; 160 } 161 162 static int gbcodec_mixer_ctl_info(struct snd_kcontrol *kcontrol, 163 struct snd_ctl_elem_info *uinfo) 164 { 165 unsigned int max; 166 const char *name; 167 struct gbaudio_ctl_pvt *data; 168 struct gb_audio_ctl_elem_info *info; 169 struct gbaudio_module_info *module; 170 struct snd_soc_component *comp = snd_soc_kcontrol_component(kcontrol); 171 struct gbaudio_codec_info *gbcodec = snd_soc_component_get_drvdata(comp); 172 173 dev_dbg(comp->dev, "Entered %s:%s\n", __func__, kcontrol->id.name); 174 data = (struct gbaudio_ctl_pvt *)kcontrol->private_value; 175 info = (struct gb_audio_ctl_elem_info *)data->info; 176 177 if (!info) { 178 dev_err(comp->dev, "NULL info for %s\n", uinfo->id.name); 179 return -EINVAL; 180 } 181 182 /* update uinfo */ 183 uinfo->access = data->access; 184 uinfo->count = data->vcount; 185 uinfo->type = (__force snd_ctl_elem_type_t)info->type; 186 187 switch (info->type) { 188 case GB_AUDIO_CTL_ELEM_TYPE_BOOLEAN: 189 case GB_AUDIO_CTL_ELEM_TYPE_INTEGER: 190 uinfo->value.integer.min = le32_to_cpu(info->value.integer.min); 191 uinfo->value.integer.max = le32_to_cpu(info->value.integer.max); 192 break; 193 case GB_AUDIO_CTL_ELEM_TYPE_ENUMERATED: 194 max = le32_to_cpu(info->value.enumerated.items); 195 uinfo->value.enumerated.items = max; 196 if (uinfo->value.enumerated.item > max - 1) 197 uinfo->value.enumerated.item = max - 1; 198 module = find_gb_module(gbcodec, kcontrol->id.name); 199 if (!module) 200 return -EINVAL; 201 name = gbaudio_map_controlid(module, data->ctl_id, 202 uinfo->value.enumerated.item); 203 strscpy(uinfo->value.enumerated.name, name, sizeof(uinfo->value.enumerated.name)); 204 break; 205 default: 206 dev_err(comp->dev, "Invalid type: %d for %s:kcontrol\n", 207 info->type, kcontrol->id.name); 208 break; 209 } 210 return 0; 211 } 212 213 static int gbcodec_mixer_ctl_get(struct snd_kcontrol *kcontrol, 214 struct snd_ctl_elem_value *ucontrol) 215 { 216 int ret; 217 struct gb_audio_ctl_elem_info *info; 218 struct gbaudio_ctl_pvt *data; 219 struct gb_audio_ctl_elem_value gbvalue; 220 struct gbaudio_module_info *module; 221 struct snd_soc_component *comp = snd_soc_kcontrol_component(kcontrol); 222 struct gbaudio_codec_info *gb = snd_soc_component_get_drvdata(comp); 223 struct gb_bundle *bundle; 224 225 dev_dbg(comp->dev, "Entered %s:%s\n", __func__, kcontrol->id.name); 226 module = find_gb_module(gb, kcontrol->id.name); 227 if (!module) 228 return -EINVAL; 229 230 data = (struct gbaudio_ctl_pvt *)kcontrol->private_value; 231 info = (struct gb_audio_ctl_elem_info *)data->info; 232 bundle = to_gb_bundle(module->dev); 233 234 ret = gb_pm_runtime_get_sync(bundle); 235 if (ret) 236 return ret; 237 238 ret = gb_audio_gb_get_control(module->mgmt_connection, data->ctl_id, 239 GB_AUDIO_INVALID_INDEX, &gbvalue); 240 241 gb_pm_runtime_put_autosuspend(bundle); 242 243 if (ret) { 244 dev_err_ratelimited(comp->dev, "%d:Error in %s for %s\n", ret, 245 __func__, kcontrol->id.name); 246 return ret; 247 } 248 249 /* update ucontrol */ 250 switch (info->type) { 251 case GB_AUDIO_CTL_ELEM_TYPE_BOOLEAN: 252 case GB_AUDIO_CTL_ELEM_TYPE_INTEGER: 253 ucontrol->value.integer.value[0] = 254 le32_to_cpu(gbvalue.value.integer_value[0]); 255 if (data->vcount == 2) 256 ucontrol->value.integer.value[1] = 257 le32_to_cpu(gbvalue.value.integer_value[1]); 258 break; 259 case GB_AUDIO_CTL_ELEM_TYPE_ENUMERATED: 260 ucontrol->value.enumerated.item[0] = 261 le32_to_cpu(gbvalue.value.enumerated_item[0]); 262 if (data->vcount == 2) 263 ucontrol->value.enumerated.item[1] = 264 le32_to_cpu(gbvalue.value.enumerated_item[1]); 265 break; 266 default: 267 dev_err(comp->dev, "Invalid type: %d for %s:kcontrol\n", 268 info->type, kcontrol->id.name); 269 ret = -EINVAL; 270 break; 271 } 272 return ret; 273 } 274 275 static int gbcodec_mixer_ctl_put(struct snd_kcontrol *kcontrol, 276 struct snd_ctl_elem_value *ucontrol) 277 { 278 int ret = 0; 279 struct gb_audio_ctl_elem_info *info; 280 struct gbaudio_ctl_pvt *data; 281 struct gb_audio_ctl_elem_value gbvalue; 282 struct gbaudio_module_info *module; 283 struct snd_soc_component *comp = snd_soc_kcontrol_component(kcontrol); 284 struct gbaudio_codec_info *gb = snd_soc_component_get_drvdata(comp); 285 struct gb_bundle *bundle; 286 287 dev_dbg(comp->dev, "Entered %s:%s\n", __func__, kcontrol->id.name); 288 module = find_gb_module(gb, kcontrol->id.name); 289 if (!module) 290 return -EINVAL; 291 292 data = (struct gbaudio_ctl_pvt *)kcontrol->private_value; 293 info = (struct gb_audio_ctl_elem_info *)data->info; 294 bundle = to_gb_bundle(module->dev); 295 296 /* update ucontrol */ 297 switch (info->type) { 298 case GB_AUDIO_CTL_ELEM_TYPE_BOOLEAN: 299 case GB_AUDIO_CTL_ELEM_TYPE_INTEGER: 300 gbvalue.value.integer_value[0] = 301 cpu_to_le32(ucontrol->value.integer.value[0]); 302 if (data->vcount == 2) 303 gbvalue.value.integer_value[1] = 304 cpu_to_le32(ucontrol->value.integer.value[1]); 305 break; 306 case GB_AUDIO_CTL_ELEM_TYPE_ENUMERATED: 307 gbvalue.value.enumerated_item[0] = 308 cpu_to_le32(ucontrol->value.enumerated.item[0]); 309 if (data->vcount == 2) 310 gbvalue.value.enumerated_item[1] = 311 cpu_to_le32(ucontrol->value.enumerated.item[1]); 312 break; 313 default: 314 dev_err(comp->dev, "Invalid type: %d for %s:kcontrol\n", 315 info->type, kcontrol->id.name); 316 ret = -EINVAL; 317 break; 318 } 319 320 if (ret) 321 return ret; 322 323 ret = gb_pm_runtime_get_sync(bundle); 324 if (ret) 325 return ret; 326 327 ret = gb_audio_gb_set_control(module->mgmt_connection, data->ctl_id, 328 GB_AUDIO_INVALID_INDEX, &gbvalue); 329 330 gb_pm_runtime_put_autosuspend(bundle); 331 332 if (ret) { 333 dev_err_ratelimited(comp->dev, "%d:Error in %s for %s\n", ret, 334 __func__, kcontrol->id.name); 335 } 336 337 return ret; 338 } 339 340 #define SOC_MIXER_GB(xname, kcount, data) \ 341 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ 342 .count = kcount, .info = gbcodec_mixer_ctl_info, \ 343 .get = gbcodec_mixer_ctl_get, .put = gbcodec_mixer_ctl_put, \ 344 .private_value = (unsigned long)data } 345 346 /* 347 * although below callback functions seems redundant to above functions. 348 * same are kept to allow provision for different handling in case 349 * of DAPM related sequencing, etc. 350 */ 351 static int gbcodec_mixer_dapm_ctl_info(struct snd_kcontrol *kcontrol, 352 struct snd_ctl_elem_info *uinfo) 353 { 354 int platform_max, platform_min; 355 struct gbaudio_ctl_pvt *data; 356 struct gb_audio_ctl_elem_info *info; 357 358 data = (struct gbaudio_ctl_pvt *)kcontrol->private_value; 359 info = (struct gb_audio_ctl_elem_info *)data->info; 360 361 /* update uinfo */ 362 platform_max = le32_to_cpu(info->value.integer.max); 363 platform_min = le32_to_cpu(info->value.integer.min); 364 365 if (platform_max == 1 && 366 !strnstr(kcontrol->id.name, " Volume", sizeof(kcontrol->id.name))) 367 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; 368 else 369 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 370 371 uinfo->count = data->vcount; 372 uinfo->value.integer.min = platform_min; 373 uinfo->value.integer.max = platform_max; 374 375 return 0; 376 } 377 378 static int gbcodec_mixer_dapm_ctl_get(struct snd_kcontrol *kcontrol, 379 struct snd_ctl_elem_value *ucontrol) 380 { 381 int ret; 382 struct gbaudio_ctl_pvt *data; 383 struct gb_audio_ctl_elem_value gbvalue; 384 struct gbaudio_module_info *module; 385 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol); 386 struct snd_soc_dapm_widget *widget = wlist->widgets[0]; 387 struct device *codec_dev = widget->dapm->dev; 388 struct gbaudio_codec_info *gb = dev_get_drvdata(codec_dev); 389 struct gb_bundle *bundle; 390 391 dev_dbg(codec_dev, "Entered %s:%s\n", __func__, kcontrol->id.name); 392 module = find_gb_module(gb, kcontrol->id.name); 393 if (!module) 394 return -EINVAL; 395 396 data = (struct gbaudio_ctl_pvt *)kcontrol->private_value; 397 bundle = to_gb_bundle(module->dev); 398 399 if (data->vcount == 2) 400 dev_warn(widget->dapm->dev, 401 "GB: Control '%s' is stereo, which is not supported\n", 402 kcontrol->id.name); 403 404 ret = gb_pm_runtime_get_sync(bundle); 405 if (ret) 406 return ret; 407 408 ret = gb_audio_gb_get_control(module->mgmt_connection, data->ctl_id, 409 GB_AUDIO_INVALID_INDEX, &gbvalue); 410 411 gb_pm_runtime_put_autosuspend(bundle); 412 413 if (ret) { 414 dev_err_ratelimited(codec_dev, "%d:Error in %s for %s\n", ret, 415 __func__, kcontrol->id.name); 416 return ret; 417 } 418 /* update ucontrol */ 419 ucontrol->value.integer.value[0] = 420 le32_to_cpu(gbvalue.value.integer_value[0]); 421 422 return ret; 423 } 424 425 static int gbcodec_mixer_dapm_ctl_put(struct snd_kcontrol *kcontrol, 426 struct snd_ctl_elem_value *ucontrol) 427 { 428 int ret, wi, max, connect; 429 unsigned int mask, val; 430 struct gb_audio_ctl_elem_info *info; 431 struct gbaudio_ctl_pvt *data; 432 struct gb_audio_ctl_elem_value gbvalue; 433 struct gbaudio_module_info *module; 434 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol); 435 struct snd_soc_dapm_widget *widget = wlist->widgets[0]; 436 struct device *codec_dev = widget->dapm->dev; 437 struct gbaudio_codec_info *gb = dev_get_drvdata(codec_dev); 438 struct gb_bundle *bundle; 439 440 dev_dbg(codec_dev, "Entered %s:%s\n", __func__, kcontrol->id.name); 441 module = find_gb_module(gb, kcontrol->id.name); 442 if (!module) 443 return -EINVAL; 444 445 data = (struct gbaudio_ctl_pvt *)kcontrol->private_value; 446 info = (struct gb_audio_ctl_elem_info *)data->info; 447 bundle = to_gb_bundle(module->dev); 448 449 if (data->vcount == 2) 450 dev_warn(widget->dapm->dev, 451 "GB: Control '%s' is stereo, which is not supported\n", 452 kcontrol->id.name); 453 454 max = le32_to_cpu(info->value.integer.max); 455 mask = (1 << fls(max)) - 1; 456 val = ucontrol->value.integer.value[0] & mask; 457 connect = !!val; 458 459 ret = gb_pm_runtime_get_sync(bundle); 460 if (ret) 461 return ret; 462 463 ret = gb_audio_gb_get_control(module->mgmt_connection, data->ctl_id, 464 GB_AUDIO_INVALID_INDEX, &gbvalue); 465 if (ret) 466 goto exit; 467 468 /* update ucontrol */ 469 if (le32_to_cpu(gbvalue.value.integer_value[0]) != val) { 470 for (wi = 0; wi < wlist->num_widgets; wi++) { 471 widget = wlist->widgets[wi]; 472 snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 473 connect, NULL); 474 } 475 gbvalue.value.integer_value[0] = 476 cpu_to_le32(ucontrol->value.integer.value[0]); 477 478 ret = gb_audio_gb_set_control(module->mgmt_connection, 479 data->ctl_id, 480 GB_AUDIO_INVALID_INDEX, &gbvalue); 481 } 482 483 exit: 484 gb_pm_runtime_put_autosuspend(bundle); 485 if (ret) 486 dev_err_ratelimited(codec_dev, "%d:Error in %s for %s\n", ret, 487 __func__, kcontrol->id.name); 488 return ret; 489 } 490 491 #define SOC_DAPM_MIXER_GB(xname, kcount, data) \ 492 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ 493 .count = kcount, .info = gbcodec_mixer_dapm_ctl_info, \ 494 .get = gbcodec_mixer_dapm_ctl_get, .put = gbcodec_mixer_dapm_ctl_put, \ 495 .private_value = (unsigned long)data} 496 497 static int gbcodec_event_spk(struct snd_soc_dapm_widget *w, 498 struct snd_kcontrol *k, int event) 499 { 500 /* Ensure GB speaker is connected */ 501 502 return 0; 503 } 504 505 static int gbcodec_event_hp(struct snd_soc_dapm_widget *w, 506 struct snd_kcontrol *k, int event) 507 { 508 /* Ensure GB module supports jack slot */ 509 510 return 0; 511 } 512 513 static int gbcodec_event_int_mic(struct snd_soc_dapm_widget *w, 514 struct snd_kcontrol *k, int event) 515 { 516 /* Ensure GB module supports jack slot */ 517 518 return 0; 519 } 520 521 static int gbaudio_validate_kcontrol_count(struct gb_audio_widget *w) 522 { 523 int ret = 0; 524 525 switch (w->type) { 526 case snd_soc_dapm_spk: 527 case snd_soc_dapm_hp: 528 case snd_soc_dapm_mic: 529 case snd_soc_dapm_output: 530 case snd_soc_dapm_input: 531 if (w->ncontrols) 532 ret = -EINVAL; 533 break; 534 case snd_soc_dapm_switch: 535 case snd_soc_dapm_mux: 536 if (w->ncontrols != 1) 537 ret = -EINVAL; 538 break; 539 default: 540 break; 541 } 542 543 return ret; 544 } 545 546 static int gbcodec_enum_ctl_get(struct snd_kcontrol *kcontrol, 547 struct snd_ctl_elem_value *ucontrol) 548 { 549 int ret, ctl_id; 550 struct snd_soc_component *comp = snd_soc_kcontrol_component(kcontrol); 551 struct gbaudio_codec_info *gb = snd_soc_component_get_drvdata(comp); 552 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 553 struct gb_audio_ctl_elem_value gbvalue; 554 struct gbaudio_module_info *module; 555 struct gb_bundle *bundle; 556 557 module = find_gb_module(gb, kcontrol->id.name); 558 if (!module) 559 return -EINVAL; 560 561 ctl_id = gbaudio_map_controlname(module, kcontrol->id.name); 562 if (ctl_id < 0) 563 return -EINVAL; 564 565 bundle = to_gb_bundle(module->dev); 566 567 ret = gb_pm_runtime_get_sync(bundle); 568 if (ret) 569 return ret; 570 571 ret = gb_audio_gb_get_control(module->mgmt_connection, ctl_id, 572 GB_AUDIO_INVALID_INDEX, &gbvalue); 573 574 gb_pm_runtime_put_autosuspend(bundle); 575 576 if (ret) { 577 dev_err_ratelimited(comp->dev, "%d:Error in %s for %s\n", ret, 578 __func__, kcontrol->id.name); 579 return ret; 580 } 581 582 ucontrol->value.enumerated.item[0] = 583 le32_to_cpu(gbvalue.value.enumerated_item[0]); 584 if (e->shift_l != e->shift_r) 585 ucontrol->value.enumerated.item[1] = 586 le32_to_cpu(gbvalue.value.enumerated_item[1]); 587 588 return 0; 589 } 590 591 static int gbcodec_enum_ctl_put(struct snd_kcontrol *kcontrol, 592 struct snd_ctl_elem_value *ucontrol) 593 { 594 int ret, ctl_id; 595 struct snd_soc_component *comp = snd_soc_kcontrol_component(kcontrol); 596 struct gbaudio_codec_info *gb = snd_soc_component_get_drvdata(comp); 597 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 598 struct gb_audio_ctl_elem_value gbvalue; 599 struct gbaudio_module_info *module; 600 struct gb_bundle *bundle; 601 602 module = find_gb_module(gb, kcontrol->id.name); 603 if (!module) 604 return -EINVAL; 605 606 ctl_id = gbaudio_map_controlname(module, kcontrol->id.name); 607 if (ctl_id < 0) 608 return -EINVAL; 609 610 if (ucontrol->value.enumerated.item[0] > e->items - 1) 611 return -EINVAL; 612 gbvalue.value.enumerated_item[0] = 613 cpu_to_le32(ucontrol->value.enumerated.item[0]); 614 615 if (e->shift_l != e->shift_r) { 616 if (ucontrol->value.enumerated.item[1] > e->items - 1) 617 return -EINVAL; 618 gbvalue.value.enumerated_item[1] = 619 cpu_to_le32(ucontrol->value.enumerated.item[1]); 620 } 621 622 bundle = to_gb_bundle(module->dev); 623 624 ret = gb_pm_runtime_get_sync(bundle); 625 if (ret) 626 return ret; 627 628 ret = gb_audio_gb_set_control(module->mgmt_connection, ctl_id, 629 GB_AUDIO_INVALID_INDEX, &gbvalue); 630 631 gb_pm_runtime_put_autosuspend(bundle); 632 633 if (ret) { 634 dev_err_ratelimited(comp->dev, "%d:Error in %s for %s\n", 635 ret, __func__, kcontrol->id.name); 636 } 637 638 return ret; 639 } 640 641 static int gbaudio_tplg_create_enum_kctl(struct gbaudio_module_info *gb, 642 struct snd_kcontrol_new *kctl, 643 struct gb_audio_control *ctl) 644 { 645 struct soc_enum *gbe; 646 struct gb_audio_enumerated *gb_enum; 647 int i; 648 649 gbe = devm_kzalloc(gb->dev, sizeof(*gbe), GFP_KERNEL); 650 if (!gbe) 651 return -ENOMEM; 652 653 gb_enum = &ctl->info.value.enumerated; 654 655 /* since count=1, and reg is dummy */ 656 gbe->items = le32_to_cpu(gb_enum->items); 657 gbe->texts = gb_generate_enum_strings(gb, gb_enum); 658 659 /* debug enum info */ 660 dev_dbg(gb->dev, "Max:%d, name_length:%d\n", gbe->items, 661 le16_to_cpu(gb_enum->names_length)); 662 for (i = 0; i < gbe->items; i++) 663 dev_dbg(gb->dev, "src[%d]: %s\n", i, gbe->texts[i]); 664 665 *kctl = (struct snd_kcontrol_new) 666 SOC_ENUM_EXT(ctl->name, *gbe, gbcodec_enum_ctl_get, 667 gbcodec_enum_ctl_put); 668 return 0; 669 } 670 671 static int gbaudio_tplg_create_kcontrol(struct gbaudio_module_info *gb, 672 struct snd_kcontrol_new *kctl, 673 struct gb_audio_control *ctl) 674 { 675 int ret = 0; 676 struct gbaudio_ctl_pvt *ctldata; 677 678 switch (ctl->iface) { 679 case (__force int)SNDRV_CTL_ELEM_IFACE_MIXER: 680 switch (ctl->info.type) { 681 case GB_AUDIO_CTL_ELEM_TYPE_ENUMERATED: 682 ret = gbaudio_tplg_create_enum_kctl(gb, kctl, ctl); 683 break; 684 default: 685 ctldata = devm_kzalloc(gb->dev, 686 sizeof(struct gbaudio_ctl_pvt), 687 GFP_KERNEL); 688 if (!ctldata) 689 return -ENOMEM; 690 ctldata->ctl_id = ctl->id; 691 ctldata->data_cport = le16_to_cpu(ctl->data_cport); 692 ctldata->access = le32_to_cpu(ctl->access); 693 ctldata->vcount = ctl->count_values; 694 ctldata->info = &ctl->info; 695 *kctl = (struct snd_kcontrol_new) 696 SOC_MIXER_GB(ctl->name, ctl->count, ctldata); 697 ctldata = NULL; 698 break; 699 } 700 break; 701 default: 702 return -EINVAL; 703 } 704 705 dev_dbg(gb->dev, "%s:%d control created\n", ctl->name, ctl->id); 706 return ret; 707 } 708 709 static int gbcodec_enum_dapm_ctl_get(struct snd_kcontrol *kcontrol, 710 struct snd_ctl_elem_value *ucontrol) 711 { 712 int ret, ctl_id; 713 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol); 714 struct snd_soc_dapm_widget *widget = wlist->widgets[0]; 715 struct gbaudio_module_info *module; 716 struct gb_audio_ctl_elem_value gbvalue; 717 struct device *codec_dev = widget->dapm->dev; 718 struct gbaudio_codec_info *gb = dev_get_drvdata(codec_dev); 719 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 720 struct gb_bundle *bundle; 721 722 module = find_gb_module(gb, kcontrol->id.name); 723 if (!module) 724 return -EINVAL; 725 726 ctl_id = gbaudio_map_wcontrolname(module, kcontrol->id.name); 727 if (ctl_id < 0) 728 return -EINVAL; 729 730 bundle = to_gb_bundle(module->dev); 731 732 ret = gb_pm_runtime_get_sync(bundle); 733 if (ret) 734 return ret; 735 736 ret = gb_audio_gb_get_control(module->mgmt_connection, ctl_id, 737 GB_AUDIO_INVALID_INDEX, &gbvalue); 738 739 gb_pm_runtime_put_autosuspend(bundle); 740 741 if (ret) { 742 dev_err_ratelimited(codec_dev, "%d:Error in %s for %s\n", ret, 743 __func__, kcontrol->id.name); 744 return ret; 745 } 746 747 ucontrol->value.enumerated.item[0] = le32_to_cpu(gbvalue.value.enumerated_item[0]); 748 if (e->shift_l != e->shift_r) 749 ucontrol->value.enumerated.item[1] = 750 le32_to_cpu(gbvalue.value.enumerated_item[1]); 751 752 return 0; 753 } 754 755 static int gbcodec_enum_dapm_ctl_put(struct snd_kcontrol *kcontrol, 756 struct snd_ctl_elem_value *ucontrol) 757 { 758 int ret, wi, ctl_id; 759 unsigned int val, mux, change; 760 unsigned int mask; 761 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol); 762 struct snd_soc_dapm_widget *widget = wlist->widgets[0]; 763 struct gb_audio_ctl_elem_value gbvalue; 764 struct gbaudio_module_info *module; 765 struct device *codec_dev = widget->dapm->dev; 766 struct gbaudio_codec_info *gb = dev_get_drvdata(codec_dev); 767 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 768 struct gb_bundle *bundle; 769 770 if (ucontrol->value.enumerated.item[0] > e->items - 1) 771 return -EINVAL; 772 773 module = find_gb_module(gb, kcontrol->id.name); 774 if (!module) 775 return -EINVAL; 776 777 ctl_id = gbaudio_map_wcontrolname(module, kcontrol->id.name); 778 if (ctl_id < 0) 779 return -EINVAL; 780 781 change = 0; 782 bundle = to_gb_bundle(module->dev); 783 784 ret = gb_pm_runtime_get_sync(bundle); 785 if (ret) 786 return ret; 787 788 ret = gb_audio_gb_get_control(module->mgmt_connection, ctl_id, 789 GB_AUDIO_INVALID_INDEX, &gbvalue); 790 791 gb_pm_runtime_put_autosuspend(bundle); 792 793 if (ret) { 794 dev_err_ratelimited(codec_dev, "%d:Error in %s for %s\n", ret, 795 __func__, kcontrol->id.name); 796 return ret; 797 } 798 799 mux = ucontrol->value.enumerated.item[0]; 800 val = mux << e->shift_l; 801 mask = e->mask << e->shift_l; 802 803 if (le32_to_cpu(gbvalue.value.enumerated_item[0]) != 804 ucontrol->value.enumerated.item[0]) { 805 change = 1; 806 gbvalue.value.enumerated_item[0] = 807 cpu_to_le32(ucontrol->value.enumerated.item[0]); 808 } 809 810 if (e->shift_l != e->shift_r) { 811 if (ucontrol->value.enumerated.item[1] > e->items - 1) 812 return -EINVAL; 813 val |= ucontrol->value.enumerated.item[1] << e->shift_r; 814 mask |= e->mask << e->shift_r; 815 if (le32_to_cpu(gbvalue.value.enumerated_item[1]) != 816 ucontrol->value.enumerated.item[1]) { 817 change = 1; 818 gbvalue.value.enumerated_item[1] = 819 cpu_to_le32(ucontrol->value.enumerated.item[1]); 820 } 821 } 822 823 if (change) { 824 ret = gb_pm_runtime_get_sync(bundle); 825 if (ret) 826 return ret; 827 828 ret = gb_audio_gb_set_control(module->mgmt_connection, ctl_id, 829 GB_AUDIO_INVALID_INDEX, &gbvalue); 830 831 gb_pm_runtime_put_autosuspend(bundle); 832 833 if (ret) { 834 dev_err_ratelimited(codec_dev, 835 "%d:Error in %s for %s\n", ret, 836 __func__, kcontrol->id.name); 837 } 838 for (wi = 0; wi < wlist->num_widgets; wi++) { 839 widget = wlist->widgets[wi]; 840 snd_soc_dapm_mux_update_power(widget->dapm, kcontrol, 841 val, e, NULL); 842 } 843 } 844 845 return change; 846 } 847 848 static int gbaudio_tplg_create_enum_ctl(struct gbaudio_module_info *gb, 849 struct snd_kcontrol_new *kctl, 850 struct gb_audio_control *ctl) 851 { 852 struct soc_enum *gbe; 853 struct gb_audio_enumerated *gb_enum; 854 int i; 855 856 gbe = devm_kzalloc(gb->dev, sizeof(*gbe), GFP_KERNEL); 857 if (!gbe) 858 return -ENOMEM; 859 860 gb_enum = &ctl->info.value.enumerated; 861 862 /* since count=1, and reg is dummy */ 863 gbe->items = le32_to_cpu(gb_enum->items); 864 gbe->texts = gb_generate_enum_strings(gb, gb_enum); 865 866 /* debug enum info */ 867 dev_dbg(gb->dev, "Max:%d, name_length:%d\n", gbe->items, 868 le16_to_cpu(gb_enum->names_length)); 869 for (i = 0; i < gbe->items; i++) 870 dev_dbg(gb->dev, "src[%d]: %s\n", i, gbe->texts[i]); 871 872 *kctl = (struct snd_kcontrol_new) 873 SOC_DAPM_ENUM_EXT(ctl->name, *gbe, gbcodec_enum_dapm_ctl_get, 874 gbcodec_enum_dapm_ctl_put); 875 return 0; 876 } 877 878 static int gbaudio_tplg_create_mixer_ctl(struct gbaudio_module_info *gb, 879 struct snd_kcontrol_new *kctl, 880 struct gb_audio_control *ctl) 881 { 882 struct gbaudio_ctl_pvt *ctldata; 883 884 ctldata = devm_kzalloc(gb->dev, sizeof(struct gbaudio_ctl_pvt), 885 GFP_KERNEL); 886 if (!ctldata) 887 return -ENOMEM; 888 ctldata->ctl_id = ctl->id; 889 ctldata->data_cport = le16_to_cpu(ctl->data_cport); 890 ctldata->access = le32_to_cpu(ctl->access); 891 ctldata->vcount = ctl->count_values; 892 ctldata->info = &ctl->info; 893 *kctl = (struct snd_kcontrol_new) 894 SOC_DAPM_MIXER_GB(ctl->name, ctl->count, ctldata); 895 896 return 0; 897 } 898 899 static int gbaudio_tplg_create_wcontrol(struct gbaudio_module_info *gb, 900 struct snd_kcontrol_new *kctl, 901 struct gb_audio_control *ctl) 902 { 903 int ret; 904 905 switch (ctl->iface) { 906 case (__force int)SNDRV_CTL_ELEM_IFACE_MIXER: 907 switch (ctl->info.type) { 908 case GB_AUDIO_CTL_ELEM_TYPE_ENUMERATED: 909 ret = gbaudio_tplg_create_enum_ctl(gb, kctl, ctl); 910 break; 911 default: 912 ret = gbaudio_tplg_create_mixer_ctl(gb, kctl, ctl); 913 break; 914 } 915 break; 916 default: 917 return -EINVAL; 918 } 919 920 dev_dbg(gb->dev, "%s:%d DAPM control created, ret:%d\n", ctl->name, 921 ctl->id, ret); 922 return ret; 923 } 924 925 static int gbaudio_widget_event(struct snd_soc_dapm_widget *w, 926 struct snd_kcontrol *kcontrol, int event) 927 { 928 int wid; 929 int ret; 930 struct device *codec_dev = w->dapm->dev; 931 struct gbaudio_codec_info *gbcodec = dev_get_drvdata(codec_dev); 932 struct gbaudio_module_info *module; 933 struct gb_bundle *bundle; 934 935 dev_dbg(codec_dev, "%s %s %d\n", __func__, w->name, event); 936 937 /* Find relevant module */ 938 module = find_gb_module(gbcodec, w->name); 939 if (!module) 940 return -EINVAL; 941 942 /* map name to widget id */ 943 wid = gbaudio_map_widgetname(module, w->name); 944 if (wid < 0) { 945 dev_err(codec_dev, "Invalid widget name:%s\n", w->name); 946 return -EINVAL; 947 } 948 949 bundle = to_gb_bundle(module->dev); 950 951 ret = gb_pm_runtime_get_sync(bundle); 952 if (ret) 953 return ret; 954 955 switch (event) { 956 case SND_SOC_DAPM_PRE_PMU: 957 ret = gb_audio_gb_enable_widget(module->mgmt_connection, wid); 958 if (!ret) 959 ret = gbaudio_module_update(gbcodec, w, module, 1); 960 break; 961 case SND_SOC_DAPM_POST_PMD: 962 ret = gb_audio_gb_disable_widget(module->mgmt_connection, wid); 963 if (!ret) 964 ret = gbaudio_module_update(gbcodec, w, module, 0); 965 break; 966 } 967 if (ret) 968 dev_err_ratelimited(codec_dev, 969 "%d: widget, event:%d failed:%d\n", wid, 970 event, ret); 971 972 gb_pm_runtime_put_autosuspend(bundle); 973 974 return ret; 975 } 976 977 static int gbaudio_tplg_create_widget(struct gbaudio_module_info *module, 978 struct snd_soc_dapm_widget *dw, 979 struct gb_audio_widget *w, int *w_size) 980 { 981 int i, ret, csize; 982 struct snd_kcontrol_new *widget_kctls; 983 struct gb_audio_control *curr; 984 struct gbaudio_control *control, *_control; 985 size_t size; 986 char temp_name[NAME_SIZE]; 987 988 ret = gbaudio_validate_kcontrol_count(w); 989 if (ret) { 990 dev_err(module->dev, "Invalid kcontrol count=%d for %s\n", 991 w->ncontrols, w->name); 992 return ret; 993 } 994 995 /* allocate memory for kcontrol */ 996 if (w->ncontrols) { 997 size = sizeof(struct snd_kcontrol_new) * w->ncontrols; 998 widget_kctls = devm_kzalloc(module->dev, size, GFP_KERNEL); 999 if (!widget_kctls) 1000 return -ENOMEM; 1001 } 1002 1003 *w_size = sizeof(struct gb_audio_widget); 1004 1005 /* create relevant kcontrols */ 1006 curr = w->ctl; 1007 for (i = 0; i < w->ncontrols; i++) { 1008 ret = gbaudio_tplg_create_wcontrol(module, &widget_kctls[i], 1009 curr); 1010 if (ret) { 1011 dev_err(module->dev, 1012 "%s:%d type widget_ctl not supported\n", 1013 curr->name, curr->iface); 1014 goto error; 1015 } 1016 control = devm_kzalloc(module->dev, 1017 sizeof(struct gbaudio_control), 1018 GFP_KERNEL); 1019 if (!control) { 1020 ret = -ENOMEM; 1021 goto error; 1022 } 1023 control->id = curr->id; 1024 control->name = curr->name; 1025 control->wname = w->name; 1026 1027 if (curr->info.type == GB_AUDIO_CTL_ELEM_TYPE_ENUMERATED) { 1028 struct gb_audio_enumerated *gbenum = 1029 &curr->info.value.enumerated; 1030 1031 csize = offsetof(struct gb_audio_control, info); 1032 csize += offsetof(struct gb_audio_ctl_elem_info, value); 1033 csize += offsetof(struct gb_audio_enumerated, names); 1034 csize += le16_to_cpu(gbenum->names_length); 1035 control->texts = (const char * const *) 1036 gb_generate_enum_strings(module, gbenum); 1037 control->items = le32_to_cpu(gbenum->items); 1038 } else { 1039 csize = sizeof(struct gb_audio_control); 1040 } 1041 1042 *w_size += csize; 1043 curr = (void *)curr + csize; 1044 list_add(&control->list, &module->widget_ctl_list); 1045 dev_dbg(module->dev, "%s: control of type %d created\n", 1046 widget_kctls[i].name, widget_kctls[i].iface); 1047 } 1048 1049 /* Prefix dev_id to widget control_name */ 1050 strscpy(temp_name, w->name, sizeof(temp_name)); 1051 snprintf(w->name, sizeof(w->name), "GB %d %s", module->dev_id, temp_name); 1052 1053 switch (w->type) { 1054 case snd_soc_dapm_spk: 1055 *dw = (struct snd_soc_dapm_widget) 1056 SND_SOC_DAPM_SPK(w->name, gbcodec_event_spk); 1057 module->op_devices |= GBAUDIO_DEVICE_OUT_SPEAKER; 1058 break; 1059 case snd_soc_dapm_hp: 1060 *dw = (struct snd_soc_dapm_widget) 1061 SND_SOC_DAPM_HP(w->name, gbcodec_event_hp); 1062 module->op_devices |= (GBAUDIO_DEVICE_OUT_WIRED_HEADSET 1063 | GBAUDIO_DEVICE_OUT_WIRED_HEADPHONE); 1064 module->ip_devices |= GBAUDIO_DEVICE_IN_WIRED_HEADSET; 1065 break; 1066 case snd_soc_dapm_mic: 1067 *dw = (struct snd_soc_dapm_widget) 1068 SND_SOC_DAPM_MIC(w->name, gbcodec_event_int_mic); 1069 module->ip_devices |= GBAUDIO_DEVICE_IN_BUILTIN_MIC; 1070 break; 1071 case snd_soc_dapm_output: 1072 *dw = (struct snd_soc_dapm_widget)SND_SOC_DAPM_OUTPUT(w->name); 1073 break; 1074 case snd_soc_dapm_input: 1075 *dw = (struct snd_soc_dapm_widget)SND_SOC_DAPM_INPUT(w->name); 1076 break; 1077 case snd_soc_dapm_switch: 1078 *dw = (struct snd_soc_dapm_widget) 1079 SND_SOC_DAPM_SWITCH_E(w->name, SND_SOC_NOPM, 0, 0, 1080 widget_kctls, 1081 gbaudio_widget_event, 1082 SND_SOC_DAPM_PRE_PMU | 1083 SND_SOC_DAPM_POST_PMD); 1084 break; 1085 case snd_soc_dapm_pga: 1086 *dw = (struct snd_soc_dapm_widget) 1087 SND_SOC_DAPM_PGA_E(w->name, SND_SOC_NOPM, 0, 0, NULL, 0, 1088 gbaudio_widget_event, 1089 SND_SOC_DAPM_PRE_PMU | 1090 SND_SOC_DAPM_POST_PMD); 1091 break; 1092 case snd_soc_dapm_mixer: 1093 *dw = (struct snd_soc_dapm_widget) 1094 SND_SOC_DAPM_MIXER_E(w->name, SND_SOC_NOPM, 0, 0, NULL, 1095 0, gbaudio_widget_event, 1096 SND_SOC_DAPM_PRE_PMU | 1097 SND_SOC_DAPM_POST_PMD); 1098 break; 1099 case snd_soc_dapm_mux: 1100 *dw = (struct snd_soc_dapm_widget) 1101 SND_SOC_DAPM_MUX_E(w->name, SND_SOC_NOPM, 0, 0, 1102 widget_kctls, gbaudio_widget_event, 1103 SND_SOC_DAPM_PRE_PMU | 1104 SND_SOC_DAPM_POST_PMD); 1105 break; 1106 case snd_soc_dapm_aif_in: 1107 *dw = (struct snd_soc_dapm_widget) 1108 SND_SOC_DAPM_AIF_IN_E(w->name, w->sname, 0, 1109 SND_SOC_NOPM, 1110 0, 0, gbaudio_widget_event, 1111 SND_SOC_DAPM_PRE_PMU | 1112 SND_SOC_DAPM_POST_PMD); 1113 break; 1114 case snd_soc_dapm_aif_out: 1115 *dw = (struct snd_soc_dapm_widget) 1116 SND_SOC_DAPM_AIF_OUT_E(w->name, w->sname, 0, 1117 SND_SOC_NOPM, 1118 0, 0, gbaudio_widget_event, 1119 SND_SOC_DAPM_PRE_PMU | 1120 SND_SOC_DAPM_POST_PMD); 1121 break; 1122 default: 1123 ret = -EINVAL; 1124 goto error; 1125 } 1126 1127 dev_dbg(module->dev, "%s: widget of type %d created\n", dw->name, 1128 dw->id); 1129 return 0; 1130 error: 1131 list_for_each_entry_safe(control, _control, &module->widget_ctl_list, 1132 list) { 1133 list_del(&control->list); 1134 devm_kfree(module->dev, control); 1135 } 1136 return ret; 1137 } 1138 1139 static int gbaudio_tplg_process_kcontrols(struct gbaudio_module_info *module, 1140 struct gb_audio_control *controls) 1141 { 1142 int i, csize, ret; 1143 struct snd_kcontrol_new *dapm_kctls; 1144 struct gb_audio_control *curr; 1145 struct gbaudio_control *control, *_control; 1146 size_t size; 1147 char temp_name[NAME_SIZE]; 1148 1149 size = sizeof(struct snd_kcontrol_new) * module->num_controls; 1150 dapm_kctls = devm_kzalloc(module->dev, size, GFP_KERNEL); 1151 if (!dapm_kctls) 1152 return -ENOMEM; 1153 1154 curr = controls; 1155 for (i = 0; i < module->num_controls; i++) { 1156 ret = gbaudio_tplg_create_kcontrol(module, &dapm_kctls[i], 1157 curr); 1158 if (ret) { 1159 dev_err(module->dev, "%s:%d type not supported\n", 1160 curr->name, curr->iface); 1161 goto error; 1162 } 1163 control = devm_kzalloc(module->dev, sizeof(struct 1164 gbaudio_control), 1165 GFP_KERNEL); 1166 if (!control) { 1167 ret = -ENOMEM; 1168 goto error; 1169 } 1170 control->id = curr->id; 1171 /* Prefix dev_id to widget_name */ 1172 strscpy(temp_name, curr->name, sizeof(temp_name)); 1173 snprintf(curr->name, sizeof(curr->name), "GB %d %s", module->dev_id, 1174 temp_name); 1175 control->name = curr->name; 1176 if (curr->info.type == GB_AUDIO_CTL_ELEM_TYPE_ENUMERATED) { 1177 struct gb_audio_enumerated *gbenum = 1178 &curr->info.value.enumerated; 1179 1180 csize = offsetof(struct gb_audio_control, info); 1181 csize += offsetof(struct gb_audio_ctl_elem_info, value); 1182 csize += offsetof(struct gb_audio_enumerated, names); 1183 csize += le16_to_cpu(gbenum->names_length); 1184 control->texts = (const char * const *) 1185 gb_generate_enum_strings(module, gbenum); 1186 control->items = le32_to_cpu(gbenum->items); 1187 } else { 1188 csize = sizeof(struct gb_audio_control); 1189 } 1190 1191 list_add(&control->list, &module->ctl_list); 1192 dev_dbg(module->dev, "%d:%s created of type %d\n", curr->id, 1193 curr->name, curr->info.type); 1194 curr = (void *)curr + csize; 1195 } 1196 module->controls = dapm_kctls; 1197 1198 return 0; 1199 error: 1200 list_for_each_entry_safe(control, _control, &module->ctl_list, 1201 list) { 1202 list_del(&control->list); 1203 devm_kfree(module->dev, control); 1204 } 1205 devm_kfree(module->dev, dapm_kctls); 1206 return ret; 1207 } 1208 1209 static int gbaudio_tplg_process_widgets(struct gbaudio_module_info *module, 1210 struct gb_audio_widget *widgets) 1211 { 1212 int i, ret, w_size; 1213 struct snd_soc_dapm_widget *dapm_widgets; 1214 struct gb_audio_widget *curr; 1215 struct gbaudio_widget *widget, *_widget; 1216 size_t size; 1217 1218 size = sizeof(struct snd_soc_dapm_widget) * module->num_dapm_widgets; 1219 dapm_widgets = devm_kzalloc(module->dev, size, GFP_KERNEL); 1220 if (!dapm_widgets) 1221 return -ENOMEM; 1222 1223 curr = widgets; 1224 for (i = 0; i < module->num_dapm_widgets; i++) { 1225 ret = gbaudio_tplg_create_widget(module, &dapm_widgets[i], 1226 curr, &w_size); 1227 if (ret) { 1228 dev_err(module->dev, "%s:%d type not supported\n", 1229 curr->name, curr->type); 1230 goto error; 1231 } 1232 widget = devm_kzalloc(module->dev, sizeof(struct 1233 gbaudio_widget), 1234 GFP_KERNEL); 1235 if (!widget) { 1236 ret = -ENOMEM; 1237 goto error; 1238 } 1239 widget->id = curr->id; 1240 widget->name = curr->name; 1241 list_add(&widget->list, &module->widget_list); 1242 curr = (void *)curr + w_size; 1243 } 1244 module->dapm_widgets = dapm_widgets; 1245 1246 return 0; 1247 1248 error: 1249 list_for_each_entry_safe(widget, _widget, &module->widget_list, 1250 list) { 1251 list_del(&widget->list); 1252 devm_kfree(module->dev, widget); 1253 } 1254 devm_kfree(module->dev, dapm_widgets); 1255 return ret; 1256 } 1257 1258 static int gbaudio_tplg_process_routes(struct gbaudio_module_info *module, 1259 struct gb_audio_route *routes) 1260 { 1261 int i, ret; 1262 struct snd_soc_dapm_route *dapm_routes; 1263 struct gb_audio_route *curr; 1264 size_t size; 1265 1266 size = sizeof(struct snd_soc_dapm_route) * module->num_dapm_routes; 1267 dapm_routes = devm_kzalloc(module->dev, size, GFP_KERNEL); 1268 if (!dapm_routes) 1269 return -ENOMEM; 1270 1271 module->dapm_routes = dapm_routes; 1272 curr = routes; 1273 1274 for (i = 0; i < module->num_dapm_routes; i++) { 1275 dapm_routes->sink = 1276 gbaudio_map_widgetid(module, curr->destination_id); 1277 if (!dapm_routes->sink) { 1278 dev_err(module->dev, "%d:%d:%d:%d - Invalid sink\n", 1279 curr->source_id, curr->destination_id, 1280 curr->control_id, curr->index); 1281 ret = -EINVAL; 1282 goto error; 1283 } 1284 dapm_routes->source = 1285 gbaudio_map_widgetid(module, curr->source_id); 1286 if (!dapm_routes->source) { 1287 dev_err(module->dev, "%d:%d:%d:%d - Invalid source\n", 1288 curr->source_id, curr->destination_id, 1289 curr->control_id, curr->index); 1290 ret = -EINVAL; 1291 goto error; 1292 } 1293 dapm_routes->control = 1294 gbaudio_map_controlid(module, 1295 curr->control_id, 1296 curr->index); 1297 if ((curr->control_id != GBAUDIO_INVALID_ID) && 1298 !dapm_routes->control) { 1299 dev_err(module->dev, "%d:%d:%d:%d - Invalid control\n", 1300 curr->source_id, curr->destination_id, 1301 curr->control_id, curr->index); 1302 ret = -EINVAL; 1303 goto error; 1304 } 1305 dev_dbg(module->dev, "Route {%s, %s, %s}\n", dapm_routes->sink, 1306 (dapm_routes->control) ? dapm_routes->control : "NULL", 1307 dapm_routes->source); 1308 dapm_routes++; 1309 curr++; 1310 } 1311 1312 return 0; 1313 1314 error: 1315 devm_kfree(module->dev, module->dapm_routes); 1316 return ret; 1317 } 1318 1319 static int gbaudio_tplg_process_header(struct gbaudio_module_info *module, 1320 struct gb_audio_topology *tplg_data) 1321 { 1322 /* fetch no. of kcontrols, widgets & routes */ 1323 module->num_controls = tplg_data->num_controls; 1324 module->num_dapm_widgets = tplg_data->num_widgets; 1325 module->num_dapm_routes = tplg_data->num_routes; 1326 1327 /* update block offset */ 1328 module->dai_offset = (unsigned long)&tplg_data->data; 1329 module->control_offset = module->dai_offset + 1330 le32_to_cpu(tplg_data->size_dais); 1331 module->widget_offset = module->control_offset + 1332 le32_to_cpu(tplg_data->size_controls); 1333 module->route_offset = module->widget_offset + 1334 le32_to_cpu(tplg_data->size_widgets); 1335 1336 dev_dbg(module->dev, "DAI offset is 0x%lx\n", module->dai_offset); 1337 dev_dbg(module->dev, "control offset is %lx\n", 1338 module->control_offset); 1339 dev_dbg(module->dev, "widget offset is %lx\n", module->widget_offset); 1340 dev_dbg(module->dev, "route offset is %lx\n", module->route_offset); 1341 1342 return 0; 1343 } 1344 1345 int gbaudio_tplg_parse_data(struct gbaudio_module_info *module, 1346 struct gb_audio_topology *tplg_data) 1347 { 1348 int ret; 1349 struct gb_audio_control *controls; 1350 struct gb_audio_widget *widgets; 1351 struct gb_audio_route *routes; 1352 unsigned int jack_type; 1353 1354 if (!tplg_data) 1355 return -EINVAL; 1356 1357 ret = gbaudio_tplg_process_header(module, tplg_data); 1358 if (ret) { 1359 dev_err(module->dev, "%d: Error in parsing topology header\n", 1360 ret); 1361 return ret; 1362 } 1363 1364 /* process control */ 1365 controls = (struct gb_audio_control *)module->control_offset; 1366 ret = gbaudio_tplg_process_kcontrols(module, controls); 1367 if (ret) { 1368 dev_err(module->dev, 1369 "%d: Error in parsing controls data\n", ret); 1370 return ret; 1371 } 1372 dev_dbg(module->dev, "Control parsing finished\n"); 1373 1374 /* process widgets */ 1375 widgets = (struct gb_audio_widget *)module->widget_offset; 1376 ret = gbaudio_tplg_process_widgets(module, widgets); 1377 if (ret) { 1378 dev_err(module->dev, 1379 "%d: Error in parsing widgets data\n", ret); 1380 return ret; 1381 } 1382 dev_dbg(module->dev, "Widget parsing finished\n"); 1383 1384 /* process route */ 1385 routes = (struct gb_audio_route *)module->route_offset; 1386 ret = gbaudio_tplg_process_routes(module, routes); 1387 if (ret) { 1388 dev_err(module->dev, 1389 "%d: Error in parsing routes data\n", ret); 1390 return ret; 1391 } 1392 dev_dbg(module->dev, "Route parsing finished\n"); 1393 1394 /* parse jack capabilities */ 1395 jack_type = le32_to_cpu(tplg_data->jack_type); 1396 if (jack_type) { 1397 module->jack_mask = jack_type & GBCODEC_JACK_MASK; 1398 module->button_mask = jack_type & GBCODEC_JACK_BUTTON_MASK; 1399 } 1400 1401 return ret; 1402 } 1403 1404 void gbaudio_tplg_release(struct gbaudio_module_info *module) 1405 { 1406 struct gbaudio_control *control, *_control; 1407 struct gbaudio_widget *widget, *_widget; 1408 1409 if (!module->topology) 1410 return; 1411 1412 /* release kcontrols */ 1413 list_for_each_entry_safe(control, _control, &module->ctl_list, 1414 list) { 1415 list_del(&control->list); 1416 devm_kfree(module->dev, control); 1417 } 1418 if (module->controls) 1419 devm_kfree(module->dev, module->controls); 1420 1421 /* release widget controls */ 1422 list_for_each_entry_safe(control, _control, &module->widget_ctl_list, 1423 list) { 1424 list_del(&control->list); 1425 devm_kfree(module->dev, control); 1426 } 1427 1428 /* release widgets */ 1429 list_for_each_entry_safe(widget, _widget, &module->widget_list, 1430 list) { 1431 list_del(&widget->list); 1432 devm_kfree(module->dev, widget); 1433 } 1434 if (module->dapm_widgets) 1435 devm_kfree(module->dev, module->dapm_widgets); 1436 1437 /* release routes */ 1438 if (module->dapm_routes) 1439 devm_kfree(module->dev, module->dapm_routes); 1440 } 1441