Lines Matching +full:block +full:- +full:offset

1 // SPDX-License-Identifier: GPL-2.0
3 // tas2781-fmwlib.c -- TASDEVICE firmware support
5 // Copyright 2023 - 2025 Texas Instruments, Inc.
7 // Author: Shenghao Ding <shenghao-ding@ti.com>
44 /*should not include B0_P53_R44-R47 */
79 unsigned char offset; member
159 * receiver, games, audio-to-haptics, PMIC record, bypass mode, in tasdevice_add_config()
162 * ultrasonic application. In order to support these variable-numbers in tasdevice_add_config()
168 *status = -ENOMEM; in tasdevice_add_config()
172 if (tas_priv->rcabin.fw_hdr.binary_version_num >= 0x105) { in tasdevice_add_config()
174 *status = -EINVAL; in tasdevice_add_config()
175 dev_err(tas_priv->dev, "add conf: Out of boundary\n"); in tasdevice_add_config()
182 *status = -EINVAL; in tasdevice_add_config()
183 dev_err(tas_priv->dev, "add config: Out of boundary\n"); in tasdevice_add_config()
187 /* convert data[offset], data[offset + 1], data[offset + 2] and in tasdevice_add_config()
188 * data[offset + 3] into host in tasdevice_add_config()
190 cfg_info->nblocks = get_unaligned_be32(&config_data[config_offset]); in tasdevice_add_config()
197 bk_da = cfg_info->blk_data = kcalloc(cfg_info->nblocks, in tasdevice_add_config()
200 *status = -ENOMEM; in tasdevice_add_config()
203 cfg_info->real_nblocks = 0; in tasdevice_add_config()
204 for (i = 0; i < cfg_info->nblocks; i++) { in tasdevice_add_config()
206 *status = -EINVAL; in tasdevice_add_config()
207 dev_err(tas_priv->dev, in tasdevice_add_config()
209 __func__, i, cfg_info->nblocks); in tasdevice_add_config()
214 *status = -ENOMEM; in tasdevice_add_config()
218 bk_da[i]->dev_idx = config_data[config_offset]; in tasdevice_add_config()
221 bk_da[i]->block_type = config_data[config_offset]; in tasdevice_add_config()
224 if (bk_da[i]->block_type == TASDEVICE_BIN_BLK_PRE_POWER_UP) { in tasdevice_add_config()
225 if (bk_da[i]->dev_idx == 0) in tasdevice_add_config()
226 cfg_info->active_dev = in tasdevice_add_config()
227 (1 << tas_priv->ndev) - 1; in tasdevice_add_config()
229 cfg_info->active_dev |= 1 << in tasdevice_add_config()
230 (bk_da[i]->dev_idx - 1); in tasdevice_add_config()
233 bk_da[i]->yram_checksum = in tasdevice_add_config()
236 bk_da[i]->block_size = in tasdevice_add_config()
240 bk_da[i]->n_subblks = in tasdevice_add_config()
245 if (config_offset + bk_da[i]->block_size > config_size) { in tasdevice_add_config()
246 *status = -EINVAL; in tasdevice_add_config()
247 dev_err(tas_priv->dev, in tasdevice_add_config()
249 __func__, i, cfg_info->nblocks); in tasdevice_add_config()
253 bk_da[i]->regdata = kmemdup(&config_data[config_offset], in tasdevice_add_config()
254 bk_da[i]->block_size, GFP_KERNEL); in tasdevice_add_config()
255 if (!bk_da[i]->regdata) { in tasdevice_add_config()
256 *status = -ENOMEM; in tasdevice_add_config()
260 config_offset += bk_da[i]->block_size; in tasdevice_add_config()
261 cfg_info->real_nblocks += 1; in tasdevice_add_config()
276 int offset = 0; in tasdevice_rca_parser() local
280 rca = &(tas_priv->rcabin); in tasdevice_rca_parser()
281 fw_hdr = &(rca->fw_hdr); in tasdevice_rca_parser()
282 if (!fmw || !fmw->data) { in tasdevice_rca_parser()
283 dev_err(tas_priv->dev, "Failed to read %s\n", in tasdevice_rca_parser()
284 tas_priv->rca_binaryname); in tasdevice_rca_parser()
285 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_rca_parser()
286 ret = -EINVAL; in tasdevice_rca_parser()
289 buf = (unsigned char *)fmw->data; in tasdevice_rca_parser()
291 fw_hdr->img_sz = get_unaligned_be32(&buf[offset]); in tasdevice_rca_parser()
292 offset += 4; in tasdevice_rca_parser()
293 if (fw_hdr->img_sz != fmw->size) { in tasdevice_rca_parser()
294 dev_err(tas_priv->dev, in tasdevice_rca_parser()
295 "File size not match, %d %u", (int)fmw->size, in tasdevice_rca_parser()
296 fw_hdr->img_sz); in tasdevice_rca_parser()
297 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_rca_parser()
298 ret = -EINVAL; in tasdevice_rca_parser()
302 fw_hdr->checksum = get_unaligned_be32(&buf[offset]); in tasdevice_rca_parser()
303 offset += 4; in tasdevice_rca_parser()
304 fw_hdr->binary_version_num = get_unaligned_be32(&buf[offset]); in tasdevice_rca_parser()
305 if (fw_hdr->binary_version_num < 0x103) { in tasdevice_rca_parser()
306 dev_err(tas_priv->dev, "File version 0x%04x is too low", in tasdevice_rca_parser()
307 fw_hdr->binary_version_num); in tasdevice_rca_parser()
308 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_rca_parser()
309 ret = -EINVAL; in tasdevice_rca_parser()
312 offset += 4; in tasdevice_rca_parser()
313 fw_hdr->drv_fw_version = get_unaligned_be32(&buf[offset]); in tasdevice_rca_parser()
314 offset += 8; in tasdevice_rca_parser()
315 fw_hdr->plat_type = buf[offset]; in tasdevice_rca_parser()
316 offset += 1; in tasdevice_rca_parser()
317 fw_hdr->dev_family = buf[offset]; in tasdevice_rca_parser()
318 offset += 1; in tasdevice_rca_parser()
319 fw_hdr->reserve = buf[offset]; in tasdevice_rca_parser()
320 offset += 1; in tasdevice_rca_parser()
321 fw_hdr->ndev = buf[offset]; in tasdevice_rca_parser()
322 offset += 1; in tasdevice_rca_parser()
323 if (fw_hdr->ndev != tas_priv->ndev) { in tasdevice_rca_parser()
324 dev_err(tas_priv->dev, in tasdevice_rca_parser()
326 fw_hdr->ndev, tas_priv->ndev); in tasdevice_rca_parser()
327 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_rca_parser()
328 ret = -EINVAL; in tasdevice_rca_parser()
331 if (offset + TASDEVICE_DEVICE_SUM > fw_hdr->img_sz) { in tasdevice_rca_parser()
332 dev_err(tas_priv->dev, "rca_ready: Out of boundary!\n"); in tasdevice_rca_parser()
333 ret = -EINVAL; in tasdevice_rca_parser()
334 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_rca_parser()
338 for (i = 0; i < TASDEVICE_DEVICE_SUM; i++, offset++) in tasdevice_rca_parser()
339 fw_hdr->devs[i] = buf[offset]; in tasdevice_rca_parser()
341 fw_hdr->nconfig = get_unaligned_be32(&buf[offset]); in tasdevice_rca_parser()
342 offset += 4; in tasdevice_rca_parser()
345 fw_hdr->config_size[i] = get_unaligned_be32(&buf[offset]); in tasdevice_rca_parser()
346 offset += 4; in tasdevice_rca_parser()
347 total_config_sz += fw_hdr->config_size[i]; in tasdevice_rca_parser()
350 if (fw_hdr->img_sz - total_config_sz != (unsigned int)offset) { in tasdevice_rca_parser()
351 dev_err(tas_priv->dev, "Bin file error!\n"); in tasdevice_rca_parser()
352 ret = -EINVAL; in tasdevice_rca_parser()
353 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_rca_parser()
357 cfg_info = kcalloc(fw_hdr->nconfig, sizeof(*cfg_info), GFP_KERNEL); in tasdevice_rca_parser()
359 ret = -ENOMEM; in tasdevice_rca_parser()
360 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_rca_parser()
363 rca->cfg_info = cfg_info; in tasdevice_rca_parser()
364 rca->ncfgs = 0; in tasdevice_rca_parser()
365 for (i = 0; i < (int)fw_hdr->nconfig; i++) { in tasdevice_rca_parser()
366 rca->ncfgs += 1; in tasdevice_rca_parser()
367 cfg_info[i] = tasdevice_add_config(tas_priv, &buf[offset], in tasdevice_rca_parser()
368 fw_hdr->config_size[i], &ret); in tasdevice_rca_parser()
370 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_rca_parser()
373 offset += (int)fw_hdr->config_size[i]; in tasdevice_rca_parser()
382 struct tasdev_blk *block) in map_dev_idx() argument
387 struct tasdevice_dspfw_hdr *fw_hdr = &(tas_fmw->fw_hdr); in map_dev_idx()
388 struct tasdevice_fw_fixed_hdr *fw_fixed_hdr = &(fw_hdr->fixed_hdr); in map_dev_idx()
393 if (fw_fixed_hdr->ppcver >= PPC3_VERSION_TAS2781_BASIC_MIN) { in map_dev_idx()
396 } else if (fw_fixed_hdr->ppcver >= PPC3_VERSION_BASE) { in map_dev_idx()
402 if (block->type == p[i].blktyp) { in map_dev_idx()
412 struct tasdev_blk *block, const struct firmware *fmw, int offset) in fw_parse_block_data_kernel() argument
414 const unsigned char *data = fmw->data; in fw_parse_block_data_kernel()
416 if (offset + 16 > fmw->size) { in fw_parse_block_data_kernel()
417 dev_err(tas_fmw->dev, "%s: File Size error\n", __func__); in fw_parse_block_data_kernel()
418 offset = -EINVAL; in fw_parse_block_data_kernel()
422 /* convert data[offset], data[offset + 1], data[offset + 2] and in fw_parse_block_data_kernel()
423 * data[offset + 3] into host in fw_parse_block_data_kernel()
425 block->type = get_unaligned_be32(&data[offset]); in fw_parse_block_data_kernel()
426 offset += 4; in fw_parse_block_data_kernel()
428 block->is_pchksum_present = data[offset]; in fw_parse_block_data_kernel()
429 offset++; in fw_parse_block_data_kernel()
431 block->pchksum = data[offset]; in fw_parse_block_data_kernel()
432 offset++; in fw_parse_block_data_kernel()
434 block->is_ychksum_present = data[offset]; in fw_parse_block_data_kernel()
435 offset++; in fw_parse_block_data_kernel()
437 block->ychksum = data[offset]; in fw_parse_block_data_kernel()
438 offset++; in fw_parse_block_data_kernel()
440 block->blk_size = get_unaligned_be32(&data[offset]); in fw_parse_block_data_kernel()
441 offset += 4; in fw_parse_block_data_kernel()
443 block->nr_subblocks = get_unaligned_be32(&data[offset]); in fw_parse_block_data_kernel()
444 offset += 4; in fw_parse_block_data_kernel()
448 * 2. storing the dev_idx as a member of block can reduce unnecessary in fw_parse_block_data_kernel()
450 * time the block data writing to the dsp. in fw_parse_block_data_kernel()
452 block->dev_idx = map_dev_idx(tas_fmw, block); in fw_parse_block_data_kernel()
454 if (offset + block->blk_size > fmw->size) { in fw_parse_block_data_kernel()
455 dev_err(tas_fmw->dev, "%s: nSublocks error\n", __func__); in fw_parse_block_data_kernel()
456 offset = -EINVAL; in fw_parse_block_data_kernel()
460 block->data = kmemdup(&data[offset], block->blk_size, GFP_KERNEL); in fw_parse_block_data_kernel()
461 if (!block->data) { in fw_parse_block_data_kernel()
462 offset = -ENOMEM; in fw_parse_block_data_kernel()
465 offset += block->blk_size; in fw_parse_block_data_kernel()
468 return offset; in fw_parse_block_data_kernel()
473 int offset) in fw_parse_data_kernel() argument
475 const unsigned char *data = fmw->data; in fw_parse_data_kernel()
479 if (offset + 4 > fmw->size) { in fw_parse_data_kernel()
480 dev_err(tas_fmw->dev, "%s: File Size error\n", __func__); in fw_parse_data_kernel()
481 offset = -EINVAL; in fw_parse_data_kernel()
484 img_data->nr_blk = get_unaligned_be32(&data[offset]); in fw_parse_data_kernel()
485 offset += 4; in fw_parse_data_kernel()
487 img_data->dev_blks = kcalloc(img_data->nr_blk, in fw_parse_data_kernel()
489 if (!img_data->dev_blks) { in fw_parse_data_kernel()
490 offset = -ENOMEM; in fw_parse_data_kernel()
494 for (i = 0; i < img_data->nr_blk; i++) { in fw_parse_data_kernel()
495 blk = &(img_data->dev_blks[i]); in fw_parse_data_kernel()
496 offset = fw_parse_block_data_kernel(tas_fmw, blk, fmw, offset); in fw_parse_data_kernel()
497 if (offset < 0) { in fw_parse_data_kernel()
498 offset = -EINVAL; in fw_parse_data_kernel()
504 return offset; in fw_parse_data_kernel()
509 const struct firmware *fmw, int offset) in fw_parse_program_data_kernel() argument
514 for (i = 0; i < tas_fmw->nr_programs; i++) { in fw_parse_program_data_kernel()
515 program = &(tas_fmw->programs[i]); in fw_parse_program_data_kernel()
516 if (offset + 72 > fmw->size) { in fw_parse_program_data_kernel()
517 dev_err(tas_priv->dev, "%s: mpName error\n", __func__); in fw_parse_program_data_kernel()
518 offset = -EINVAL; in fw_parse_program_data_kernel()
522 offset += 72; in fw_parse_program_data_kernel()
524 offset = fw_parse_data_kernel(tas_fmw, &(program->dev_data), in fw_parse_program_data_kernel()
525 fmw, offset); in fw_parse_program_data_kernel()
526 if (offset < 0) in fw_parse_program_data_kernel()
531 return offset; in fw_parse_program_data_kernel()
536 struct tasdevice_fw *tas_fmw, const struct firmware *fmw, int offset) in fw_parse_configuration_data_kernel() argument
538 const unsigned char *data = fmw->data; in fw_parse_configuration_data_kernel()
542 for (i = 0; i < tas_fmw->nr_configurations; i++) { in fw_parse_configuration_data_kernel()
543 config = &(tas_fmw->configs[i]); in fw_parse_configuration_data_kernel()
544 if (offset + 80 > fmw->size) { in fw_parse_configuration_data_kernel()
545 dev_err(tas_priv->dev, "%s: mpName error\n", __func__); in fw_parse_configuration_data_kernel()
546 offset = -EINVAL; in fw_parse_configuration_data_kernel()
549 memcpy(config->name, &data[offset], 64); in fw_parse_configuration_data_kernel()
551 offset += 80; in fw_parse_configuration_data_kernel()
553 offset = fw_parse_data_kernel(tas_fmw, &(config->dev_data), in fw_parse_configuration_data_kernel()
554 fmw, offset); in fw_parse_configuration_data_kernel()
555 if (offset < 0) in fw_parse_configuration_data_kernel()
560 return offset; in fw_parse_configuration_data_kernel()
566 struct fct_param_address *p = &tas_fmw->fct_par_addr; in fct_param_address_parser()
572 * will reseve 20*24-byte space for fct params. In some cases, the in fct_param_address_parser()
581 * Offset (1 byte) in fct_param_address_parser()
584 * if (20 - fct_param_num) in fct_param_address_parser()
585 * 24*(20 - fct_param_num) pieces of '0' as stuffing in fct_param_address_parser()
588 * umg_SsmKEGCye = Book, Page, Offset, CoeffLength in fct_param_address_parser()
589 * iks_E0 = Book, Page, Offset, CoeffLength in fct_param_address_parser()
590 * yep_LsqM0 = Book, Page, Offset, CoeffLength in fct_param_address_parser()
591 * oyz_U0_ujx = Book, Page, Offset, CoeffLength in fct_param_address_parser()
592 * iks_GC_GMgq = Book, Page, Offset, CoeffLength in fct_param_address_parser()
593 * gou_Yao = Book, Page, Offset, CoeffLength in fct_param_address_parser()
594 * kgd_Wsc_Qsbp = Book, Page, Offset, CoeffLength in fct_param_address_parser()
595 * yec_CqseSsqs = Book, Page, Offset, CoeffLength in fct_param_address_parser()
596 * iks_SogkGgog2 = Book, Page, Offset, CoeffLength in fct_param_address_parser()
597 * yec_Sae_Y = Book, Page, Offset, CoeffLength in fct_param_address_parser()
598 * Re_Int = Book, Page, Offset, CoeffLength in fct_param_address_parser()
599 * SigFlag = Book, Page, Offset, CoeffLength in fct_param_address_parser()
600 * a1_Int = Book, Page, Offset, CoeffLength in fct_param_address_parser()
601 * a2_Int = Book, Page, Offset, CoeffLength in fct_param_address_parser()
613 r->pow_reg = TASDEVICE_REG(dat[20], dat[21], dat[22]); in fct_param_address_parser()
614 /* high 32-bit of real-time spk impedance */ in fct_param_address_parser()
616 r->r0_reg = TASDEVICE_REG(dat[20], dat[21], dat[22]); in fct_param_address_parser()
617 /* inverse of real-time spk impedance */ in fct_param_address_parser()
619 r->invr0_reg = in fct_param_address_parser()
621 /* low 32-bit of real-time spk impedance */ in fct_param_address_parser()
623 r->r0_low_reg = in fct_param_address_parser()
627 r->tlimit_reg = in fct_param_address_parser()
631 memcpy(p->thr, &dat[20], 3); in fct_param_address_parser()
634 memcpy(p->plt_flg, &dat[20], 3); in fct_param_address_parser()
637 memcpy(p->sin_gn, &dat[20], 3); in fct_param_address_parser()
640 memcpy(p->sin_gn2, &dat[20], 3); in fct_param_address_parser()
643 memcpy(p->thr2, &dat[20], 3); in fct_param_address_parser()
644 /* Spk Equivalent Resistance in fixed-point format */ in fct_param_address_parser()
646 memcpy(p->r0_reg, &dat[20], 3); in fct_param_address_parser()
649 memcpy(p->tf_reg, &dat[20], 3); in fct_param_address_parser()
652 memcpy(p->a1_reg, &dat[20], 3); in fct_param_address_parser()
655 memcpy(p->a2_reg, &dat[20], 3); in fct_param_address_parser()
660 struct tasdevice_fw *tas_fmw, const struct firmware *fmw, int offset) in fw_parse_fct_param_address() argument
662 struct calidata *cali_data = &tas_priv->cali_data; in fw_parse_fct_param_address()
663 struct cali_reg *r = &cali_data->cali_reg_array; in fw_parse_fct_param_address()
664 const unsigned char *data = fmw->data; in fw_parse_fct_param_address()
666 if (offset + 520 > fmw->size) { in fw_parse_fct_param_address()
667 dev_err(tas_priv->dev, "%s: File Size error\n", __func__); in fw_parse_fct_param_address()
668 return -EINVAL; in fw_parse_fct_param_address()
672 offset += 40; in fw_parse_fct_param_address()
674 fct_param_address_parser(r, tas_fmw, &data[offset]); in fw_parse_fct_param_address()
676 offset += 480; in fw_parse_fct_param_address()
678 return offset; in fw_parse_fct_param_address()
683 int offset) in fw_parse_variable_header_kernel() argument
685 struct tasdevice_fw *tas_fmw = tas_priv->fmw; in fw_parse_variable_header_kernel()
686 struct tasdevice_dspfw_hdr *fw_hdr = &(tas_fmw->fw_hdr); in fw_parse_variable_header_kernel()
689 const unsigned char *buf = fmw->data; in fw_parse_variable_header_kernel()
693 if (offset + 12 + 4 * TASDEVICE_MAXPROGRAM_NUM_KERNEL > fmw->size) { in fw_parse_variable_header_kernel()
694 dev_err(tas_priv->dev, "%s: File Size error\n", __func__); in fw_parse_variable_header_kernel()
695 offset = -EINVAL; in fw_parse_variable_header_kernel()
698 fw_hdr->device_family = get_unaligned_be16(&buf[offset]); in fw_parse_variable_header_kernel()
699 if (fw_hdr->device_family != 0) { in fw_parse_variable_header_kernel()
700 dev_err(tas_priv->dev, "%s:not TAS device\n", __func__); in fw_parse_variable_header_kernel()
701 offset = -EINVAL; in fw_parse_variable_header_kernel()
704 offset += 2; in fw_parse_variable_header_kernel()
705 fw_hdr->device = get_unaligned_be16(&buf[offset]); in fw_parse_variable_header_kernel()
706 if (fw_hdr->device >= TASDEVICE_DSP_TAS_MAX_DEVICE || in fw_parse_variable_header_kernel()
707 fw_hdr->device == 6) { in fw_parse_variable_header_kernel()
708 dev_err(tas_priv->dev, "Unsupported dev %d\n", fw_hdr->device); in fw_parse_variable_header_kernel()
709 offset = -EINVAL; in fw_parse_variable_header_kernel()
712 offset += 2; in fw_parse_variable_header_kernel()
713 fw_hdr->ndev = deviceNumber[fw_hdr->device]; in fw_parse_variable_header_kernel()
715 if (fw_hdr->ndev != tas_priv->ndev) { in fw_parse_variable_header_kernel()
716 dev_err(tas_priv->dev, in fw_parse_variable_header_kernel()
718 __func__, fw_hdr->ndev, tas_priv->ndev); in fw_parse_variable_header_kernel()
719 offset = -EINVAL; in fw_parse_variable_header_kernel()
723 tas_fmw->nr_programs = get_unaligned_be32(&buf[offset]); in fw_parse_variable_header_kernel()
724 offset += 4; in fw_parse_variable_header_kernel()
726 if (tas_fmw->nr_programs == 0 || tas_fmw->nr_programs > in fw_parse_variable_header_kernel()
728 dev_err(tas_priv->dev, "mnPrograms is invalid\n"); in fw_parse_variable_header_kernel()
729 offset = -EINVAL; in fw_parse_variable_header_kernel()
733 tas_fmw->programs = kcalloc(tas_fmw->nr_programs, in fw_parse_variable_header_kernel()
735 if (!tas_fmw->programs) { in fw_parse_variable_header_kernel()
736 offset = -ENOMEM; in fw_parse_variable_header_kernel()
740 for (i = 0; i < tas_fmw->nr_programs; i++) { in fw_parse_variable_header_kernel()
741 program = &(tas_fmw->programs[i]); in fw_parse_variable_header_kernel()
742 program->prog_size = get_unaligned_be32(&buf[offset]); in fw_parse_variable_header_kernel()
743 offset += 4; in fw_parse_variable_header_kernel()
747 offset += 4 * (TASDEVICE_MAXPROGRAM_NUM_KERNEL - tas_fmw->nr_programs); in fw_parse_variable_header_kernel()
749 tas_fmw->nr_configurations = get_unaligned_be32(&buf[offset]); in fw_parse_variable_header_kernel()
750 offset += 4; in fw_parse_variable_header_kernel()
756 max_confs = (fw_hdr->ndev >= 4) ? in fw_parse_variable_header_kernel()
759 if (tas_fmw->nr_configurations == 0 || in fw_parse_variable_header_kernel()
760 tas_fmw->nr_configurations > max_confs) { in fw_parse_variable_header_kernel()
761 dev_err(tas_priv->dev, "%s: Conf is invalid\n", __func__); in fw_parse_variable_header_kernel()
762 offset = -EINVAL; in fw_parse_variable_header_kernel()
766 if (offset + 4 * max_confs > fmw->size) { in fw_parse_variable_header_kernel()
767 dev_err(tas_priv->dev, "%s: mpConfigurations err\n", __func__); in fw_parse_variable_header_kernel()
768 offset = -EINVAL; in fw_parse_variable_header_kernel()
772 tas_fmw->configs = kcalloc(tas_fmw->nr_configurations, in fw_parse_variable_header_kernel()
774 if (!tas_fmw->configs) { in fw_parse_variable_header_kernel()
775 offset = -ENOMEM; in fw_parse_variable_header_kernel()
779 for (i = 0; i < tas_fmw->nr_programs; i++) { in fw_parse_variable_header_kernel()
780 config = &(tas_fmw->configs[i]); in fw_parse_variable_header_kernel()
781 config->cfg_size = get_unaligned_be32(&buf[offset]); in fw_parse_variable_header_kernel()
782 offset += 4; in fw_parse_variable_header_kernel()
786 offset += 4 * (max_confs - tas_fmw->nr_programs); in fw_parse_variable_header_kernel()
789 return offset; in fw_parse_variable_header_kernel()
803 chn = idx - 1; in tasdevice_process_block()
807 chnend = tas_priv->ndev; in tasdevice_process_block()
811 if (tas_priv->tasdevice[chn].is_loading == false) in tasdevice_process_block()
823 dev_err(tas_priv->dev, in tasdevice_process_block()
837 dev_err(tas_priv->dev, in tasdevice_process_block()
849 dev_err(tas_priv->dev, in tasdevice_process_block()
856 dev_err(tas_priv->dev, in tasdevice_process_block()
857 "%s:Bst-len(%u)not div by 4\n", in tasdevice_process_block()
869 dev_err(tas_priv->dev, in tasdevice_process_block()
880 dev_err(tas_priv->dev, in tasdevice_process_block()
893 dev_err(tas_priv->dev, in tasdevice_process_block()
907 dev_err(tas_priv->dev, in tasdevice_process_block()
918 tas_priv->tasdevice[chn].cur_prog = -1; in tasdevice_process_block()
919 tas_priv->tasdevice[chn].cur_conf = -1; in tasdevice_process_block()
921 tas_priv->tasdevice[chn].cur_conf = -1; in tasdevice_process_block()
932 struct tasdevice_rca *rca = &(tas_priv->rcabin); in tasdevice_select_cfg_blk()
933 struct tasdevice_config_info **cfg_info = rca->cfg_info; in tasdevice_select_cfg_blk()
937 if (conf_no >= rca->ncfgs || conf_no < 0 || !cfg_info) { in tasdevice_select_cfg_blk()
938 dev_err(tas_priv->dev, "conf_no should be not more than %u\n", in tasdevice_select_cfg_blk()
939 rca->ncfgs); in tasdevice_select_cfg_blk()
942 blk_data = cfg_info[conf_no]->blk_data; in tasdevice_select_cfg_blk()
944 for (j = 0; j < (int)cfg_info[conf_no]->real_nblocks; j++) { in tasdevice_select_cfg_blk()
948 dev_err(tas_priv->dev, in tasdevice_select_cfg_blk()
952 if (block_type != blk_data[j]->block_type) in tasdevice_select_cfg_blk()
955 for (k = 0; k < (int)blk_data[j]->n_subblks; k++) { in tasdevice_select_cfg_blk()
956 if (blk_data[j]->dev_idx) { in tasdevice_select_cfg_blk()
957 chn = blk_data[j]->dev_idx - 1; in tasdevice_select_cfg_blk()
958 chnend = blk_data[j]->dev_idx; in tasdevice_select_cfg_blk()
961 chnend = tas_priv->ndev; in tasdevice_select_cfg_blk()
964 tas_priv->tasdevice[chn].is_loading = true; in tasdevice_select_cfg_blk()
967 blk_data[j]->regdata + length, in tasdevice_select_cfg_blk()
968 blk_data[j]->dev_idx, in tasdevice_select_cfg_blk()
969 blk_data[j]->block_size - length); in tasdevice_select_cfg_blk()
971 if (blk_data[j]->block_size < length) { in tasdevice_select_cfg_blk()
972 dev_err(tas_priv->dev, in tasdevice_select_cfg_blk()
975 blk_data[j]->block_size); in tasdevice_select_cfg_blk()
979 if (length != blk_data[j]->block_size) in tasdevice_select_cfg_blk()
980 dev_err(tas_priv->dev, "%s: %u %u size is not same\n", in tasdevice_select_cfg_blk()
981 __func__, length, blk_data[j]->block_size); in tasdevice_select_cfg_blk()
987 struct tasdevice_priv *tasdevice, struct tasdev_blk *block) in tasdevice_load_block_kernel() argument
989 const unsigned int blk_size = block->blk_size; in tasdevice_load_block_kernel()
991 unsigned char *data = block->data; in tasdevice_load_block_kernel()
993 for (i = 0, length = 0; i < block->nr_subblocks; i++) { in tasdevice_load_block_kernel()
995 block->dev_idx, blk_size - length); in tasdevice_load_block_kernel()
997 dev_err(tasdevice->dev, in tasdevice_load_block_kernel()
1004 dev_err(tasdevice->dev, "%s: %u %u out of boundary\n", in tasdevice_load_block_kernel()
1015 const struct firmware *fmw, int offset) in fw_parse_variable_hdr() argument
1017 const unsigned char *buf = fmw->data; in fw_parse_variable_hdr()
1018 int len = strlen((char *)&buf[offset]); in fw_parse_variable_hdr()
1022 if (offset + len + 8 > fmw->size) { in fw_parse_variable_hdr()
1023 dev_err(tas_priv->dev, "%s: File Size error\n", __func__); in fw_parse_variable_hdr()
1024 offset = -EINVAL; in fw_parse_variable_hdr()
1028 offset += len; in fw_parse_variable_hdr()
1030 fw_hdr->device_family = get_unaligned_be32(&buf[offset]); in fw_parse_variable_hdr()
1031 if (fw_hdr->device_family != 0) { in fw_parse_variable_hdr()
1032 dev_err(tas_priv->dev, "%s: not TAS device\n", __func__); in fw_parse_variable_hdr()
1033 offset = -EINVAL; in fw_parse_variable_hdr()
1036 offset += 4; in fw_parse_variable_hdr()
1038 fw_hdr->device = get_unaligned_be32(&buf[offset]); in fw_parse_variable_hdr()
1039 if (fw_hdr->device >= TASDEVICE_DSP_TAS_MAX_DEVICE || in fw_parse_variable_hdr()
1040 fw_hdr->device == 6) { in fw_parse_variable_hdr()
1041 dev_err(tas_priv->dev, "Unsupported dev %d\n", fw_hdr->device); in fw_parse_variable_hdr()
1042 offset = -EINVAL; in fw_parse_variable_hdr()
1045 offset += 4; in fw_parse_variable_hdr()
1046 fw_hdr->ndev = deviceNumber[fw_hdr->device]; in fw_parse_variable_hdr()
1049 return offset; in fw_parse_variable_hdr()
1053 *tas_priv, const struct firmware *fmw, int offset) in fw_parse_variable_header_git() argument
1055 struct tasdevice_fw *tas_fmw = tas_priv->fmw; in fw_parse_variable_header_git()
1056 struct tasdevice_dspfw_hdr *fw_hdr = &(tas_fmw->fw_hdr); in fw_parse_variable_header_git()
1058 offset = fw_parse_variable_hdr(tas_priv, fw_hdr, fmw, offset); in fw_parse_variable_header_git()
1059 if (offset < 0) in fw_parse_variable_header_git()
1061 if (fw_hdr->ndev != tas_priv->ndev) { in fw_parse_variable_header_git()
1062 dev_err(tas_priv->dev, in fw_parse_variable_header_git()
1064 __func__, fw_hdr->ndev, tas_priv->ndev); in fw_parse_variable_header_git()
1065 offset = -EINVAL; in fw_parse_variable_header_git()
1069 return offset; in fw_parse_variable_header_git()
1073 struct tasdev_blk *block, const struct firmware *fmw, int offset) in fw_parse_block_data() argument
1075 unsigned char *data = (unsigned char *)fmw->data; in fw_parse_block_data()
1078 if (offset + 8 > fmw->size) { in fw_parse_block_data()
1079 dev_err(tas_fmw->dev, "%s: Type error\n", __func__); in fw_parse_block_data()
1080 offset = -EINVAL; in fw_parse_block_data()
1083 block->type = get_unaligned_be32(&data[offset]); in fw_parse_block_data()
1084 offset += 4; in fw_parse_block_data()
1086 if (tas_fmw->fw_hdr.fixed_hdr.drv_ver >= PPC_DRIVER_CRCCHK) { in fw_parse_block_data()
1087 if (offset + 8 > fmw->size) { in fw_parse_block_data()
1088 dev_err(tas_fmw->dev, "PChkSumPresent error\n"); in fw_parse_block_data()
1089 offset = -EINVAL; in fw_parse_block_data()
1092 block->is_pchksum_present = data[offset]; in fw_parse_block_data()
1093 offset++; in fw_parse_block_data()
1095 block->pchksum = data[offset]; in fw_parse_block_data()
1096 offset++; in fw_parse_block_data()
1098 block->is_ychksum_present = data[offset]; in fw_parse_block_data()
1099 offset++; in fw_parse_block_data()
1101 block->ychksum = data[offset]; in fw_parse_block_data()
1102 offset++; in fw_parse_block_data()
1104 block->is_pchksum_present = 0; in fw_parse_block_data()
1105 block->is_ychksum_present = 0; in fw_parse_block_data()
1108 block->nr_cmds = get_unaligned_be32(&data[offset]); in fw_parse_block_data()
1109 offset += 4; in fw_parse_block_data()
1111 n = block->nr_cmds * 4; in fw_parse_block_data()
1112 if (offset + n > fmw->size) { in fw_parse_block_data()
1113 dev_err(tas_fmw->dev, in fw_parse_block_data()
1114 "%s: File Size(%lu) error offset = %d n = %d\n", in fw_parse_block_data()
1115 __func__, (unsigned long)fmw->size, offset, n); in fw_parse_block_data()
1116 offset = -EINVAL; in fw_parse_block_data()
1120 block->data = kmemdup(&data[offset], n, GFP_KERNEL); in fw_parse_block_data()
1121 if (!block->data) { in fw_parse_block_data()
1122 offset = -ENOMEM; in fw_parse_block_data()
1125 offset += n; in fw_parse_block_data()
1128 return offset; in fw_parse_block_data()
1136 int offset) in fw_parse_data() argument
1138 const unsigned char *data = (unsigned char *)fmw->data; in fw_parse_data()
1143 if (offset + 64 > fmw->size) { in fw_parse_data()
1144 dev_err(tas_fmw->dev, "%s: Name error\n", __func__); in fw_parse_data()
1145 offset = -EINVAL; in fw_parse_data()
1148 memcpy(img_data->name, &data[offset], 64); in fw_parse_data()
1149 offset += 64; in fw_parse_data()
1151 n = strlen((char *)&data[offset]); in fw_parse_data()
1153 if (offset + n + 2 > fmw->size) { in fw_parse_data()
1154 dev_err(tas_fmw->dev, "%s: Description error\n", __func__); in fw_parse_data()
1155 offset = -EINVAL; in fw_parse_data()
1158 offset += n; in fw_parse_data()
1159 img_data->nr_blk = get_unaligned_be16(&data[offset]); in fw_parse_data()
1160 offset += 2; in fw_parse_data()
1162 img_data->dev_blks = kcalloc(img_data->nr_blk, in fw_parse_data()
1164 if (!img_data->dev_blks) { in fw_parse_data()
1165 offset = -ENOMEM; in fw_parse_data()
1168 for (i = 0; i < img_data->nr_blk; i++) { in fw_parse_data()
1169 blk = &(img_data->dev_blks[i]); in fw_parse_data()
1170 offset = fw_parse_block_data(tas_fmw, blk, fmw, offset); in fw_parse_data()
1171 if (offset < 0) { in fw_parse_data()
1172 offset = -EINVAL; in fw_parse_data()
1178 return offset; in fw_parse_data()
1185 struct tasdevice_fw *tas_fmw, const struct firmware *fmw, int offset) in fw_parse_program_data() argument
1187 unsigned char *buf = (unsigned char *)fmw->data; in fw_parse_program_data()
1191 if (offset + 2 > fmw->size) { in fw_parse_program_data()
1192 dev_err(tas_priv->dev, "%s: File Size error\n", __func__); in fw_parse_program_data()
1193 offset = -EINVAL; in fw_parse_program_data()
1196 tas_fmw->nr_programs = get_unaligned_be16(&buf[offset]); in fw_parse_program_data()
1197 offset += 2; in fw_parse_program_data()
1199 if (tas_fmw->nr_programs == 0) { in fw_parse_program_data()
1201 dev_info(tas_priv->dev, "%s: No Programs data, maybe calbin\n", in fw_parse_program_data()
1206 tas_fmw->programs = in fw_parse_program_data()
1207 kcalloc(tas_fmw->nr_programs, sizeof(struct tasdevice_prog), in fw_parse_program_data()
1209 if (!tas_fmw->programs) { in fw_parse_program_data()
1210 offset = -ENOMEM; in fw_parse_program_data()
1213 for (i = 0; i < tas_fmw->nr_programs; i++) { in fw_parse_program_data()
1216 program = &(tas_fmw->programs[i]); in fw_parse_program_data()
1217 if (offset + 64 > fmw->size) { in fw_parse_program_data()
1218 dev_err(tas_priv->dev, "%s: mpName error\n", __func__); in fw_parse_program_data()
1219 offset = -EINVAL; in fw_parse_program_data()
1222 offset += 64; in fw_parse_program_data()
1224 n = strlen((char *)&buf[offset]); in fw_parse_program_data()
1227 if (offset + n > fmw->size) { in fw_parse_program_data()
1228 dev_err(tas_priv->dev, "Description err\n"); in fw_parse_program_data()
1229 offset = -EINVAL; in fw_parse_program_data()
1233 offset += n; in fw_parse_program_data()
1235 offset = fw_parse_data(tas_fmw, &(program->dev_data), fmw, in fw_parse_program_data()
1236 offset); in fw_parse_program_data()
1237 if (offset < 0) in fw_parse_program_data()
1242 return offset; in fw_parse_program_data()
1251 const struct firmware *fmw, int offset) in fw_parse_configuration_data() argument
1253 unsigned char *data = (unsigned char *)fmw->data; in fw_parse_configuration_data()
1258 if (offset + 2 > fmw->size) { in fw_parse_configuration_data()
1259 dev_err(tas_priv->dev, "%s: File Size error\n", __func__); in fw_parse_configuration_data()
1260 offset = -EINVAL; in fw_parse_configuration_data()
1263 tas_fmw->nr_configurations = get_unaligned_be16(&data[offset]); in fw_parse_configuration_data()
1264 offset += 2; in fw_parse_configuration_data()
1266 if (tas_fmw->nr_configurations == 0) { in fw_parse_configuration_data()
1267 dev_err(tas_priv->dev, "%s: Conf is zero\n", __func__); in fw_parse_configuration_data()
1271 tas_fmw->configs = kcalloc(tas_fmw->nr_configurations, in fw_parse_configuration_data()
1273 if (!tas_fmw->configs) { in fw_parse_configuration_data()
1274 offset = -ENOMEM; in fw_parse_configuration_data()
1277 for (i = 0; i < tas_fmw->nr_configurations; i++) { in fw_parse_configuration_data()
1278 config = &(tas_fmw->configs[i]); in fw_parse_configuration_data()
1279 if (offset + 64 > fmw->size) { in fw_parse_configuration_data()
1280 dev_err(tas_priv->dev, "File Size err\n"); in fw_parse_configuration_data()
1281 offset = -EINVAL; in fw_parse_configuration_data()
1284 memcpy(config->name, &data[offset], 64); in fw_parse_configuration_data()
1285 offset += 64; in fw_parse_configuration_data()
1287 n = strlen((char *)&data[offset]); in fw_parse_configuration_data()
1289 if (offset + n > fmw->size) { in fw_parse_configuration_data()
1290 dev_err(tas_priv->dev, "Description err\n"); in fw_parse_configuration_data()
1291 offset = -EINVAL; in fw_parse_configuration_data()
1295 offset += n; in fw_parse_configuration_data()
1297 offset = fw_parse_data(tas_fmw, &(config->dev_data), in fw_parse_configuration_data()
1298 fmw, offset); in fw_parse_configuration_data()
1299 if (offset < 0) in fw_parse_configuration_data()
1304 return offset; in fw_parse_configuration_data()
1316 cd->len = TAS2781_YRAM5_END_REG - reg + 1; in check_inpage_yram_rg()
1318 cd->len = len; in check_inpage_yram_rg()
1319 cd->offset = reg; in check_inpage_yram_rg()
1323 cd->offset = TAS2781_YRAM5_START_REG; in check_inpage_yram_rg()
1324 cd->len = len - TAS2781_YRAM5_START_REG + reg; in check_inpage_yram_rg()
1339 cd->offset = reg; in check_inpage_yram_bk1()
1340 cd->len = len; in check_inpage_yram_bk1()
1343 cd->offset = TAS2781_YRAM1_START_REG; in check_inpage_yram_bk1()
1344 cd->len = len - TAS2781_YRAM1_START_REG + reg; in check_inpage_yram_bk1()
1354 * true -- the registers are in the inpage yram
1355 * false -- the registers are NOT in the inpage yram
1384 cd->offset = reg; in check_inblock_yram_bk()
1385 cd->len = len; in check_inblock_yram_bk()
1388 if (reg + len - 1 >= TAS2781_YRAM2_START_REG) { in check_inblock_yram_bk()
1389 cd->offset = TAS2781_YRAM2_START_REG; in check_inblock_yram_bk()
1390 cd->len = reg + len - TAS2781_YRAM2_START_REG; in check_inblock_yram_bk()
1400 * true -- the registers are in the inblock yram
1401 * false -- the registers are NOT in the inblock yram
1439 if ((reg + len - 1) > 127) { in tasdev_multibytes_chksum()
1440 ret = -EINVAL; in tasdev_multibytes_chksum()
1441 dev_err(tasdevice->dev, "firmware error\n"); in tasdev_multibytes_chksum()
1459 dev_err(tasdevice->dev, "firmware error\n"); in tasdev_multibytes_chksum()
1460 ret = -EINVAL; in tasdev_multibytes_chksum()
1465 TASDEVICE_REG(book, page, crc_data.offset), in tasdev_multibytes_chksum()
1474 && ((i + crc_data.offset) in tasdev_multibytes_chksum()
1476 && ((i + crc_data.offset) in tasdev_multibytes_chksum()
1482 crc_chksum += crc8(tasdevice->crc8_lkp_tbl, &nBuf1[i], in tasdev_multibytes_chksum()
1520 dev_err(tasdevice->dev, in do_singlereg_checksum()
1523 tasdevice->tasdevice[chl].err_code |= ERROR_YRAM_CRCCHK; in do_singlereg_checksum()
1524 ret = -EAGAIN; in do_singlereg_checksum()
1528 ret = crc8(tasdevice->crc8_lkp_tbl, &val, 1, 0); in do_singlereg_checksum()
1539 dev->cur_prog = -1; in set_err_prg_cfg()
1541 dev->cur_conf = -1; in set_err_prg_cfg()
1545 struct tasdev_blk *block, int chn, unsigned char book, in tasdev_bytes_chksum() argument
1563 if (ret != -EAGAIN) in tasdev_bytes_chksum()
1566 block->nr_retry--; in tasdev_bytes_chksum()
1567 if (block->nr_retry > 0) in tasdev_bytes_chksum()
1570 set_err_prg_cfg(block->type, &tas_priv->tasdevice[chn]); in tasdev_bytes_chksum()
1577 struct tasdev_blk *block, int chn, unsigned char book, in tasdev_multibytes_wr() argument
1589 if (block->is_ychksum_present) in tasdev_multibytes_wr()
1590 ret = tasdev_bytes_chksum(tas_priv, block, chn, in tasdev_multibytes_wr()
1597 if (block->is_ychksum_present) in tasdev_multibytes_wr()
1598 ret = tasdev_bytes_chksum(tas_priv, block, chn, book, in tasdev_multibytes_wr()
1602 if (!block->is_ychksum_present || ret >= 0) { in tasdev_multibytes_wr()
1605 *nr_cmds += ((len - 2) / 4) + 1; in tasdev_multibytes_wr()
1613 struct tasdev_blk *block, int chn) in tasdev_block_chksum() argument
1621 dev_err(tas_priv->dev, "%s: Chn %d\n", __func__, chn); in tasdev_block_chksum()
1622 set_err_prg_cfg(block->type, &tas_priv->tasdevice[chn]); in tasdev_block_chksum()
1626 if ((nr_value & 0xff) != block->pchksum) { in tasdev_block_chksum()
1627 dev_err(tas_priv->dev, "%s: Blk PChkSum Chn %d ", __func__, in tasdev_block_chksum()
1629 dev_err(tas_priv->dev, "PChkSum = 0x%x, Reg = 0x%x\n", in tasdev_block_chksum()
1630 block->pchksum, (nr_value & 0xff)); in tasdev_block_chksum()
1631 tas_priv->tasdevice[chn].err_code |= ERROR_PRAM_CRCCHK; in tasdev_block_chksum()
1632 ret = -EAGAIN; in tasdev_block_chksum()
1633 block->nr_retry--; in tasdev_block_chksum()
1635 if (block->nr_retry <= 0) in tasdev_block_chksum()
1636 set_err_prg_cfg(block->type, in tasdev_block_chksum()
1637 &tas_priv->tasdevice[chn]); in tasdev_block_chksum()
1639 tas_priv->tasdevice[chn].err_code &= ~ERROR_PRAM_CRCCHK; in tasdev_block_chksum()
1646 struct tasdev_blk *block, int chn) in tasdev_load_blk() argument
1653 unsigned char offset; in tasdev_load_blk() local
1659 while (block->nr_retry > 0) { in tasdev_load_blk()
1660 if (block->is_pchksum_present) { in tasdev_load_blk()
1667 if (block->is_ychksum_present) in tasdev_load_blk()
1672 while (nr_cmds < block->nr_cmds) { in tasdev_load_blk()
1673 data = block->data + nr_cmds * 4; in tasdev_load_blk()
1677 offset = data[2]; in tasdev_load_blk()
1682 if (offset <= 0x7F) { in tasdev_load_blk()
1684 TASDEVICE_REG(book, page, offset), in tasdev_load_blk()
1688 if (block->is_ychksum_present) { in tasdev_load_blk()
1690 block, chn, book, page, offset, in tasdev_load_blk()
1698 if (offset == 0x81) { in tasdev_load_blk()
1699 /*book -- data[0] page -- data[1]*/ in tasdev_load_blk()
1705 if (offset == 0x85) { in tasdev_load_blk()
1710 offset = data[2]; in tasdev_load_blk()
1712 block, chn, book, page, offset, data, in tasdev_load_blk()
1718 if (ret == -EAGAIN) { in tasdev_load_blk()
1719 if (block->nr_retry > 0) in tasdev_load_blk()
1724 if (block->is_pchksum_present) { in tasdev_load_blk()
1725 ret = tasdev_block_chksum(tas_priv, block, chn); in tasdev_load_blk()
1726 if (ret == -EAGAIN) { in tasdev_load_blk()
1727 if (block->nr_retry > 0) in tasdev_load_blk()
1733 if (block->is_ychksum_present) { in tasdev_load_blk()
1735 dev_err(tas_priv->dev, in tasdev_load_blk()
1737 block->ychksum, crc_chksum); in tasdev_load_blk()
1739 tas_priv->tasdevice[chn].err_code &= in tasdev_load_blk()
1752 struct tasdev_blk *block) in tasdevice_load_block() argument
1759 switch (block->type) { in tasdevice_load_block()
1762 chnend = tas_priv->ndev; in tasdevice_load_block()
1789 dev_dbg(tas_priv->dev, "load blk: Other Type = 0x%02x\n", in tasdevice_load_block()
1790 block->type); in tasdevice_load_block()
1795 block->nr_retry = 6; in tasdevice_load_block()
1796 if (tas_priv->tasdevice[chn].is_loading == false) in tasdevice_load_block()
1798 ret = tasdev_load_blk(tas_priv, block, chn); in tasdevice_load_block()
1800 dev_err(tas_priv->dev, "dev %d, Blk (%d) load error\n", in tasdevice_load_block()
1801 chn, block->type); in tasdevice_load_block()
1813 tas_priv->dspbin_typ = TASDEV_BETA; in dspbin_type_check()
1815 tas_priv->dspbin_typ = TASDEV_BASIC; in dspbin_type_check()
1817 tas_priv->dspbin_typ = TASDEV_ALPHA; in dspbin_type_check()
1819 if (tas_priv->dspbin_typ != TASDEV_BASIC) in dspbin_type_check()
1820 tas_priv->fw_parse_fct_param_address = in dspbin_type_check()
1831 tas_priv->fw_parse_variable_header = in dspfw_default_callback()
1833 tas_priv->fw_parse_program_data = in dspfw_default_callback()
1835 tas_priv->fw_parse_configuration_data = in dspfw_default_callback()
1837 tas_priv->tasdevice_load_block = in dspfw_default_callback()
1843 tas_priv->fw_parse_variable_header = in dspfw_default_callback()
1845 tas_priv->fw_parse_program_data = in dspfw_default_callback()
1847 tas_priv->fw_parse_configuration_data = in dspfw_default_callback()
1849 tas_priv->tasdevice_load_block = in dspfw_default_callback()
1853 dev_err(tas_priv->dev, in dspfw_default_callback()
1856 dev_err(tas_priv->dev, " Current:0x%02x\n", in dspfw_default_callback()
1858 rc = -EINVAL; in dspfw_default_callback()
1863 dev_err(tas_priv->dev, in dspfw_default_callback()
1865 dev_err(tas_priv->dev, "current is 0x%02x\n", drv_ver); in dspfw_default_callback()
1866 rc = -EINVAL; in dspfw_default_callback()
1875 struct tasdev_blk *block; in load_calib_data() local
1879 for (i = 0; i < dev_data->nr_blk; i++) { in load_calib_data()
1880 block = &(dev_data->dev_blks[i]); in load_calib_data()
1881 ret = tasdevice_load_block(tas_priv, block); in load_calib_data()
1890 struct tasdevice_fw *tas_fmw, const struct firmware *fmw, int offset) in fw_parse_header() argument
1892 struct tasdevice_dspfw_hdr *fw_hdr = &(tas_fmw->fw_hdr); in fw_parse_header()
1893 struct tasdevice_fw_fixed_hdr *fw_fixed_hdr = &(fw_hdr->fixed_hdr); in fw_parse_header()
1895 const unsigned char *buf = (unsigned char *)fmw->data; in fw_parse_header()
1897 if (offset + 92 > fmw->size) { in fw_parse_header()
1898 dev_err(tas_priv->dev, "%s: File Size error\n", __func__); in fw_parse_header()
1899 offset = -EINVAL; in fw_parse_header()
1902 if (memcmp(&buf[offset], magic_number, 4)) { in fw_parse_header()
1903 dev_err(tas_priv->dev, "%s: Magic num NOT match\n", __func__); in fw_parse_header()
1904 offset = -EINVAL; in fw_parse_header()
1907 offset += 4; in fw_parse_header()
1909 /* Convert data[offset], data[offset + 1], data[offset + 2] and in fw_parse_header()
1910 * data[offset + 3] into host in fw_parse_header()
1912 fw_fixed_hdr->fwsize = get_unaligned_be32(&buf[offset]); in fw_parse_header()
1913 offset += 4; in fw_parse_header()
1914 if (fw_fixed_hdr->fwsize != fmw->size) { in fw_parse_header()
1915 dev_err(tas_priv->dev, "File size not match, %lu %u", in fw_parse_header()
1916 (unsigned long)fmw->size, fw_fixed_hdr->fwsize); in fw_parse_header()
1917 offset = -EINVAL; in fw_parse_header()
1920 offset += 4; in fw_parse_header()
1921 fw_fixed_hdr->ppcver = get_unaligned_be32(&buf[offset]); in fw_parse_header()
1922 offset += 8; in fw_parse_header()
1923 fw_fixed_hdr->drv_ver = get_unaligned_be32(&buf[offset]); in fw_parse_header()
1924 offset += 72; in fw_parse_header()
1927 return offset; in fw_parse_header()
1931 struct tasdevice_fw *tas_fmw, const struct firmware *fmw, int offset) in fw_parse_variable_hdr_cal() argument
1933 struct tasdevice_dspfw_hdr *fw_hdr = &(tas_fmw->fw_hdr); in fw_parse_variable_hdr_cal()
1935 offset = fw_parse_variable_hdr(tas_priv, fw_hdr, fmw, offset); in fw_parse_variable_hdr_cal()
1936 if (offset < 0) in fw_parse_variable_hdr_cal()
1938 if (fw_hdr->ndev != 1) { in fw_parse_variable_hdr_cal()
1939 dev_err(tas_priv->dev, in fw_parse_variable_hdr_cal()
1941 __func__, fw_hdr->ndev); in fw_parse_variable_hdr_cal()
1942 offset = -EINVAL; in fw_parse_variable_hdr_cal()
1946 return offset; in fw_parse_variable_hdr_cal()
1954 struct tasdevice_fw *tas_fmw, const struct firmware *fmw, int offset) in fw_parse_calibration_data() argument
1957 unsigned char *data = (unsigned char *)fmw->data; in fw_parse_calibration_data()
1960 if (offset + 2 > fmw->size) { in fw_parse_calibration_data()
1961 dev_err(tas_priv->dev, "%s: Calibrations error\n", __func__); in fw_parse_calibration_data()
1962 offset = -EINVAL; in fw_parse_calibration_data()
1965 tas_fmw->nr_calibrations = get_unaligned_be16(&data[offset]); in fw_parse_calibration_data()
1966 offset += 2; in fw_parse_calibration_data()
1968 if (tas_fmw->nr_calibrations != 1) { in fw_parse_calibration_data()
1969 dev_err(tas_priv->dev, in fw_parse_calibration_data()
1971 __func__, tas_fmw->nr_calibrations); in fw_parse_calibration_data()
1975 tas_fmw->calibrations = kcalloc(tas_fmw->nr_calibrations, in fw_parse_calibration_data()
1977 if (!tas_fmw->calibrations) { in fw_parse_calibration_data()
1978 offset = -ENOMEM; in fw_parse_calibration_data()
1981 for (i = 0; i < tas_fmw->nr_calibrations; i++) { in fw_parse_calibration_data()
1982 if (offset + 64 > fmw->size) { in fw_parse_calibration_data()
1983 dev_err(tas_priv->dev, "Calibrations error\n"); in fw_parse_calibration_data()
1984 offset = -EINVAL; in fw_parse_calibration_data()
1987 calibration = &(tas_fmw->calibrations[i]); in fw_parse_calibration_data()
1988 offset += 64; in fw_parse_calibration_data()
1990 n = strlen((char *)&data[offset]); in fw_parse_calibration_data()
1993 if (offset + n > fmw->size) { in fw_parse_calibration_data()
1994 dev_err(tas_priv->dev, "Description err\n"); in fw_parse_calibration_data()
1995 offset = -EINVAL; in fw_parse_calibration_data()
1998 offset += n; in fw_parse_calibration_data()
2000 offset = fw_parse_data(tas_fmw, &(calibration->dev_data), fmw, in fw_parse_calibration_data()
2001 offset); in fw_parse_calibration_data()
2002 if (offset < 0) in fw_parse_calibration_data()
2007 return offset; in fw_parse_calibration_data()
2014 struct tasdevice *tasdev = &(tas_priv->tasdevice[i]); in tas2781_load_calibration()
2018 int offset = 0; in tas2781_load_calibration() local
2021 ret = request_firmware(&fw_entry, file_name, tas_priv->dev); in tas2781_load_calibration()
2023 dev_err(tas_priv->dev, "%s: Request firmware %s failed\n", in tas2781_load_calibration()
2028 if (!fw_entry->size) { in tas2781_load_calibration()
2029 dev_err(tas_priv->dev, "%s: file read error: size = %lu\n", in tas2781_load_calibration()
2030 __func__, (unsigned long)fw_entry->size); in tas2781_load_calibration()
2031 ret = -EINVAL; in tas2781_load_calibration()
2034 fmw.size = fw_entry->size; in tas2781_load_calibration()
2035 fmw.data = fw_entry->data; in tas2781_load_calibration()
2037 tas_fmw = tasdev->cali_data_fmw = kzalloc(sizeof(struct tasdevice_fw), in tas2781_load_calibration()
2039 if (!tasdev->cali_data_fmw) { in tas2781_load_calibration()
2040 ret = -ENOMEM; in tas2781_load_calibration()
2043 tas_fmw->dev = tas_priv->dev; in tas2781_load_calibration()
2044 offset = fw_parse_header(tas_priv, tas_fmw, &fmw, offset); in tas2781_load_calibration()
2045 if (offset == -EINVAL) { in tas2781_load_calibration()
2046 dev_err(tas_priv->dev, "fw_parse_header EXIT!\n"); in tas2781_load_calibration()
2047 ret = offset; in tas2781_load_calibration()
2050 offset = fw_parse_variable_hdr_cal(tas_priv, tas_fmw, &fmw, offset); in tas2781_load_calibration()
2051 if (offset == -EINVAL) { in tas2781_load_calibration()
2052 dev_err(tas_priv->dev, in tas2781_load_calibration()
2054 ret = offset; in tas2781_load_calibration()
2057 offset = fw_parse_program_data(tas_priv, tas_fmw, &fmw, offset); in tas2781_load_calibration()
2058 if (offset < 0) { in tas2781_load_calibration()
2059 dev_err(tas_priv->dev, "fw_parse_program_data EXIT!\n"); in tas2781_load_calibration()
2060 ret = offset; in tas2781_load_calibration()
2063 offset = fw_parse_configuration_data(tas_priv, tas_fmw, &fmw, offset); in tas2781_load_calibration()
2064 if (offset < 0) { in tas2781_load_calibration()
2065 dev_err(tas_priv->dev, "fw_parse_configuration_data EXIT!\n"); in tas2781_load_calibration()
2066 ret = offset; in tas2781_load_calibration()
2069 offset = fw_parse_calibration_data(tas_priv, tas_fmw, &fmw, offset); in tas2781_load_calibration()
2070 if (offset < 0) { in tas2781_load_calibration()
2071 dev_err(tas_priv->dev, "fw_parse_calibration_data EXIT!\n"); in tas2781_load_calibration()
2072 ret = offset; in tas2781_load_calibration()
2090 int offset = 0; in tasdevice_dspfw_ready() local
2093 if (!fmw || !fmw->data) { in tasdevice_dspfw_ready()
2094 dev_err(tas_priv->dev, "%s: Failed to read firmware %s\n", in tasdevice_dspfw_ready()
2095 __func__, tas_priv->coef_binaryname); in tasdevice_dspfw_ready()
2096 return -EINVAL; in tasdevice_dspfw_ready()
2099 tas_priv->fmw = kzalloc(sizeof(struct tasdevice_fw), GFP_KERNEL); in tasdevice_dspfw_ready()
2100 if (!tas_priv->fmw) in tasdevice_dspfw_ready()
2101 return -ENOMEM; in tasdevice_dspfw_ready()
2103 tas_fmw = tas_priv->fmw; in tasdevice_dspfw_ready()
2104 tas_fmw->dev = tas_priv->dev; in tasdevice_dspfw_ready()
2105 offset = fw_parse_header(tas_priv, tas_fmw, fmw, offset); in tasdevice_dspfw_ready()
2107 if (offset == -EINVAL) in tasdevice_dspfw_ready()
2108 return -EINVAL; in tasdevice_dspfw_ready()
2110 fw_fixed_hdr = &(tas_fmw->fw_hdr.fixed_hdr); in tasdevice_dspfw_ready()
2112 switch (fw_fixed_hdr->drv_ver) { in tasdevice_dspfw_ready()
2117 tas_priv->fw_parse_variable_header = in tasdevice_dspfw_ready()
2119 tas_priv->fw_parse_program_data = in tasdevice_dspfw_ready()
2121 tas_priv->fw_parse_configuration_data = in tasdevice_dspfw_ready()
2123 tas_priv->tasdevice_load_block = in tasdevice_dspfw_ready()
2129 tas_priv->fw_parse_variable_header = in tasdevice_dspfw_ready()
2131 tas_priv->fw_parse_program_data = in tasdevice_dspfw_ready()
2133 tas_priv->fw_parse_configuration_data = in tasdevice_dspfw_ready()
2135 tas_priv->tasdevice_load_block = in tasdevice_dspfw_ready()
2140 fw_fixed_hdr->drv_ver, fw_fixed_hdr->ppcver); in tasdevice_dspfw_ready()
2146 offset = tas_priv->fw_parse_variable_header(tas_priv, fmw, offset); in tasdevice_dspfw_ready()
2147 if (offset < 0) in tasdevice_dspfw_ready()
2148 return offset; in tasdevice_dspfw_ready()
2150 offset = tas_priv->fw_parse_program_data(tas_priv, tas_fmw, fmw, in tasdevice_dspfw_ready()
2151 offset); in tasdevice_dspfw_ready()
2152 if (offset < 0) in tasdevice_dspfw_ready()
2153 return offset; in tasdevice_dspfw_ready()
2155 offset = tas_priv->fw_parse_configuration_data(tas_priv, in tasdevice_dspfw_ready()
2156 tas_fmw, fmw, offset); in tasdevice_dspfw_ready()
2157 if (offset < 0) in tasdevice_dspfw_ready()
2158 return offset; in tasdevice_dspfw_ready()
2160 if (tas_priv->fw_parse_fct_param_address) { in tasdevice_dspfw_ready()
2161 offset = tas_priv->fw_parse_fct_param_address(tas_priv, in tasdevice_dspfw_ready()
2162 tas_fmw, fmw, offset); in tasdevice_dspfw_ready()
2163 if (offset < 0) in tasdevice_dspfw_ready()
2164 return offset; in tasdevice_dspfw_ready()
2176 ret = request_firmware(&fw_entry, tas_priv->coef_binaryname, in tasdevice_dsp_parser()
2177 tas_priv->dev); in tasdevice_dsp_parser()
2179 dev_err(tas_priv->dev, "%s: load %s error\n", __func__, in tasdevice_dsp_parser()
2180 tas_priv->coef_binaryname); in tasdevice_dsp_parser()
2196 struct tasdev_blk *block; in tas2781_clear_calfirmware() local
2201 if (!tas_fmw->calibrations) in tas2781_clear_calfirmware()
2204 for (i = 0; i < tas_fmw->nr_calibrations; i++) { in tas2781_clear_calfirmware()
2205 calibration = &(tas_fmw->calibrations[i]); in tas2781_clear_calfirmware()
2209 im = &(calibration->dev_data); in tas2781_clear_calfirmware()
2211 if (!im->dev_blks) in tas2781_clear_calfirmware()
2214 for (blks = 0; blks < im->nr_blk; blks++) { in tas2781_clear_calfirmware()
2215 block = &(im->dev_blks[blks]); in tas2781_clear_calfirmware()
2216 if (!block) in tas2781_clear_calfirmware()
2218 kfree(block->data); in tas2781_clear_calfirmware()
2220 kfree(im->dev_blks); in tas2781_clear_calfirmware()
2222 kfree(tas_fmw->calibrations); in tas2781_clear_calfirmware()
2236 for (i = 0; i < tas_priv->ndev; i++) { in tasdevice_calbin_remove()
2237 tasdev = &(tas_priv->tasdevice[i]); in tasdevice_calbin_remove()
2238 if (!tasdev->cali_data_fmw) in tasdevice_calbin_remove()
2240 tas2781_clear_calfirmware(tasdev->cali_data_fmw); in tasdevice_calbin_remove()
2241 tasdev->cali_data_fmw = NULL; in tasdevice_calbin_remove()
2249 struct tasdevice_rca *rca = &(tas_priv->rcabin); in tasdevice_config_info_remove()
2250 struct tasdevice_config_info **ci = rca->cfg_info; in tasdevice_config_info_remove()
2255 for (i = 0; i < rca->ncfgs; i++) { in tasdevice_config_info_remove()
2258 if (ci[i]->blk_data) { in tasdevice_config_info_remove()
2259 for (j = 0; j < (int)ci[i]->real_nblocks; j++) { in tasdevice_config_info_remove()
2260 if (!ci[i]->blk_data[j]) in tasdevice_config_info_remove()
2262 kfree(ci[i]->blk_data[j]->regdata); in tasdevice_config_info_remove()
2263 kfree(ci[i]->blk_data[j]); in tasdevice_config_info_remove()
2265 kfree(ci[i]->blk_data); in tasdevice_config_info_remove()
2276 struct tasdev_blk *block; in tasdevice_load_data() local
2280 for (i = 0; i < dev_data->nr_blk; i++) { in tasdevice_load_data()
2281 block = &(dev_data->dev_blks[i]); in tasdevice_load_data()
2282 ret = tas_priv->tasdevice_load_block(tas_priv, block); in tasdevice_load_data()
2292 struct tasdevice_fw *cal_fmw = priv->tasdevice[i].cali_data_fmw; in tasdev_load_calibrated_data()
2293 struct calidata *cali_data = &priv->cali_data; in tasdev_load_calibrated_data()
2294 struct cali_reg *p = &cali_data->cali_reg_array; in tasdev_load_calibrated_data()
2295 unsigned char *data = cali_data->data; in tasdev_load_calibrated_data()
2297 int k = i * (cali_data->cali_dat_sz_per_dev + 1); in tasdev_load_calibrated_data()
2301 if (!priv->is_user_space_calidata && cal_fmw) { in tasdev_load_calibrated_data()
2302 cal = cal_fmw->calibrations; in tasdev_load_calibrated_data()
2305 load_calib_data(priv, &cal->dev_data); in tasdev_load_calibrated_data()
2308 if (!priv->is_user_space_calidata) in tasdev_load_calibrated_data()
2312 dev_err(priv->dev, "%s: no cal-data for dev %d from usr-spc\n", in tasdev_load_calibrated_data()
2318 rc = tasdevice_dev_bulk_write(priv, i, p->r0_reg, &(data[k]), 4); in tasdev_load_calibrated_data()
2320 dev_err(priv->dev, "chn %d r0_reg bulk_wr err = %d\n", i, rc); in tasdev_load_calibrated_data()
2324 rc = tasdevice_dev_bulk_write(priv, i, p->r0_low_reg, &(data[k]), 4); in tasdev_load_calibrated_data()
2326 dev_err(priv->dev, "chn %d r0_low_reg err = %d\n", i, rc); in tasdev_load_calibrated_data()
2330 rc = tasdevice_dev_bulk_write(priv, i, p->invr0_reg, &(data[k]), 4); in tasdev_load_calibrated_data()
2332 dev_err(priv->dev, "chn %d invr0_reg err = %d\n", i, rc); in tasdev_load_calibrated_data()
2336 rc = tasdevice_dev_bulk_write(priv, i, p->pow_reg, &(data[k]), 4); in tasdev_load_calibrated_data()
2338 dev_err(priv->dev, "chn %d pow_reg bulk_wr err = %d\n", i, rc); in tasdev_load_calibrated_data()
2342 rc = tasdevice_dev_bulk_write(priv, i, p->tlimit_reg, &(data[k]), 4); in tasdev_load_calibrated_data()
2344 dev_err(priv->dev, "chn %d tlimit_reg err = %d\n", i, rc); in tasdev_load_calibrated_data()
2353 struct tasdevice_rca *rca = &(tas_priv->rcabin); in tasdevice_select_tuningprm_cfg()
2354 struct tasdevice_config_info **cfg_info = rca->cfg_info; in tasdevice_select_tuningprm_cfg()
2355 struct tasdevice_fw *tas_fmw = tas_priv->fmw; in tasdevice_select_tuningprm_cfg()
2362 dev_err(tas_priv->dev, "%s: Firmware is NULL\n", __func__); in tasdevice_select_tuningprm_cfg()
2366 if (cfg_no >= tas_fmw->nr_configurations) { in tasdevice_select_tuningprm_cfg()
2367 dev_err(tas_priv->dev, in tasdevice_select_tuningprm_cfg()
2369 __func__, cfg_no, tas_fmw->nr_configurations); in tasdevice_select_tuningprm_cfg()
2373 if (prm_no >= tas_fmw->nr_programs) { in tasdevice_select_tuningprm_cfg()
2374 dev_err(tas_priv->dev, in tasdevice_select_tuningprm_cfg()
2376 __func__, prm_no, tas_fmw->nr_programs); in tasdevice_select_tuningprm_cfg()
2380 if (rca_conf_no >= rca->ncfgs || rca_conf_no < 0 || in tasdevice_select_tuningprm_cfg()
2382 dev_err(tas_priv->dev, in tasdevice_select_tuningprm_cfg()
2384 rca_conf_no, rca->ncfgs-1); in tasdevice_select_tuningprm_cfg()
2388 for (i = 0, prog_status = 0; i < tas_priv->ndev; i++) { in tasdevice_select_tuningprm_cfg()
2389 if (cfg_info[rca_conf_no]->active_dev & (1 << i)) { in tasdevice_select_tuningprm_cfg()
2391 && (tas_priv->tasdevice[i].cur_prog != prm_no in tasdevice_select_tuningprm_cfg()
2392 || tas_priv->force_fwload_status)) { in tasdevice_select_tuningprm_cfg()
2393 tas_priv->tasdevice[i].cur_conf = -1; in tasdevice_select_tuningprm_cfg()
2394 tas_priv->tasdevice[i].is_loading = true; in tasdevice_select_tuningprm_cfg()
2398 tas_priv->tasdevice[i].is_loading = false; in tasdevice_select_tuningprm_cfg()
2399 tas_priv->tasdevice[i].is_loaderr = false; in tasdevice_select_tuningprm_cfg()
2403 program = &(tas_fmw->programs[prm_no]); in tasdevice_select_tuningprm_cfg()
2404 tasdevice_load_data(tas_priv, &(program->dev_data)); in tasdevice_select_tuningprm_cfg()
2405 for (i = 0; i < tas_priv->ndev; i++) { in tasdevice_select_tuningprm_cfg()
2406 if (tas_priv->tasdevice[i].is_loaderr == true) in tasdevice_select_tuningprm_cfg()
2408 if (tas_priv->tasdevice[i].is_loaderr == false && in tasdevice_select_tuningprm_cfg()
2409 tas_priv->tasdevice[i].is_loading == true) in tasdevice_select_tuningprm_cfg()
2410 tas_priv->tasdevice[i].cur_prog = prm_no; in tasdevice_select_tuningprm_cfg()
2414 for (i = 0, status = 0; i < tas_priv->ndev; i++) { in tasdevice_select_tuningprm_cfg()
2416 && tas_priv->tasdevice[i].cur_conf != cfg_no in tasdevice_select_tuningprm_cfg()
2417 && (cfg_info[rca_conf_no]->active_dev & (1 << i)) in tasdevice_select_tuningprm_cfg()
2418 && (tas_priv->tasdevice[i].is_loaderr == false)) { in tasdevice_select_tuningprm_cfg()
2420 tas_priv->tasdevice[i].is_loading = true; in tasdevice_select_tuningprm_cfg()
2422 tas_priv->tasdevice[i].is_loading = false; in tasdevice_select_tuningprm_cfg()
2426 conf = &(tas_fmw->configs[cfg_no]); in tasdevice_select_tuningprm_cfg()
2428 tasdevice_load_data(tas_priv, &(conf->dev_data)); in tasdevice_select_tuningprm_cfg()
2429 for (i = 0; i < tas_priv->ndev; i++) { in tasdevice_select_tuningprm_cfg()
2430 if (tas_priv->tasdevice[i].is_loaderr == true) { in tasdevice_select_tuningprm_cfg()
2435 if (tas_priv->tasdevice[i].is_loaderr == false && in tasdevice_select_tuningprm_cfg()
2436 tas_priv->tasdevice[i].is_loading == true) { in tasdevice_select_tuningprm_cfg()
2438 tas_priv->tasdevice[i].cur_conf = cfg_no; in tasdevice_select_tuningprm_cfg()
2442 dev_dbg(tas_priv->dev, "%s: Unneeded loading dsp conf %d\n", in tasdevice_select_tuningprm_cfg()
2446 status |= cfg_info[rca_conf_no]->active_dev; in tasdevice_select_tuningprm_cfg()
2456 struct tasdevice_fw *tas_fmw = tas_priv->fmw; in tasdevice_prmg_load()
2462 dev_err(tas_priv->dev, "%s: Firmware is NULL\n", __func__); in tasdevice_prmg_load()
2466 if (prm_no >= tas_fmw->nr_programs) { in tasdevice_prmg_load()
2467 dev_err(tas_priv->dev, in tasdevice_prmg_load()
2469 __func__, prm_no, tas_fmw->nr_programs); in tasdevice_prmg_load()
2473 for (i = 0, prog_status = 0; i < tas_priv->ndev; i++) { in tasdevice_prmg_load()
2474 if (prm_no >= 0 && tas_priv->tasdevice[i].cur_prog != prm_no) { in tasdevice_prmg_load()
2475 tas_priv->tasdevice[i].cur_conf = -1; in tasdevice_prmg_load()
2476 tas_priv->tasdevice[i].is_loading = true; in tasdevice_prmg_load()
2482 program = &(tas_fmw->programs[prm_no]); in tasdevice_prmg_load()
2483 tasdevice_load_data(tas_priv, &(program->dev_data)); in tasdevice_prmg_load()
2484 for (i = 0; i < tas_priv->ndev; i++) { in tasdevice_prmg_load()
2485 if (tas_priv->tasdevice[i].is_loaderr == true) in tasdevice_prmg_load()
2487 else if (tas_priv->tasdevice[i].is_loaderr == false in tasdevice_prmg_load()
2488 && tas_priv->tasdevice[i].is_loading == true) in tasdevice_prmg_load()
2489 tas_priv->tasdevice[i].cur_prog = prm_no; in tasdevice_prmg_load()
2501 struct tasdevice_fw *tas_fmw = tas_priv->fmw; in tasdevice_tuning_switch()
2502 int profile_cfg_id = tas_priv->rcabin.profile_cfg_id; in tasdevice_tuning_switch()
2505 * Only RCA-based Playback can still work with no dsp program running in tasdevice_tuning_switch()
2508 switch (tas_priv->fw_state) { in tasdevice_tuning_switch()
2517 if (tas_fmw && tas_priv->cur_prog < tas_fmw->nr_programs) { in tasdevice_tuning_switch()
2519 profile_cfg_id = tas_priv->rcabin.profile_cfg_id; in tasdevice_tuning_switch()
2521 tas_priv->cur_prog, tas_priv->cur_conf, in tasdevice_tuning_switch()
2535 MODULE_AUTHOR("Shenghao Ding, TI, <shenghao-ding@ti.com>");