Lines Matching +full:block +full:- +full:offset
1 // SPDX-License-Identifier: GPL-2.0
5 // Copyright 2024-2025 Texas Instruments, Inc.
19 #include <sound/tas2781-dsp.h>
22 #include "tas2781-spi.h"
44 /* should not include B0_P53_R44-R47 */
79 unsigned char offset; member
161 * receiver, games, audio-to-haptics, PMIC record, bypass mode, in tasdevice_add_config()
164 * ultrasonic application. In order to support these variable-numbers in tasdevice_add_config()
170 *status = -ENOMEM; in tasdevice_add_config()
174 if (tas_priv->rcabin.fw_hdr.binary_version_num >= 0x105) { in tasdevice_add_config()
176 *status = -EINVAL; in tasdevice_add_config()
177 dev_err(tas_priv->dev, "add conf: Out of boundary\n"); in tasdevice_add_config()
184 *status = -EINVAL; in tasdevice_add_config()
185 dev_err(tas_priv->dev, "add config: Out of boundary\n"); in tasdevice_add_config()
190 * convert data[offset], data[offset + 1], data[offset + 2] and in tasdevice_add_config()
191 * data[offset + 3] into host in tasdevice_add_config()
193 cfg_info->nblocks = get_unaligned_be32(&config_data[config_offset]); in tasdevice_add_config()
201 bk_da = cfg_info->blk_data = kcalloc(cfg_info->nblocks, in tasdevice_add_config()
204 *status = -ENOMEM; in tasdevice_add_config()
207 cfg_info->real_nblocks = 0; in tasdevice_add_config()
208 for (i = 0; i < cfg_info->nblocks; i++) { in tasdevice_add_config()
210 *status = -EINVAL; in tasdevice_add_config()
211 dev_err(tas_priv->dev, in tasdevice_add_config()
213 __func__, i, cfg_info->nblocks); in tasdevice_add_config()
218 *status = -ENOMEM; in tasdevice_add_config()
222 bk_da[i]->dev_idx = config_data[config_offset]; in tasdevice_add_config()
225 bk_da[i]->block_type = config_data[config_offset]; in tasdevice_add_config()
228 bk_da[i]->yram_checksum = in tasdevice_add_config()
231 bk_da[i]->block_size = in tasdevice_add_config()
235 bk_da[i]->n_subblks = in tasdevice_add_config()
240 if (config_offset + bk_da[i]->block_size > config_size) { in tasdevice_add_config()
241 *status = -EINVAL; in tasdevice_add_config()
242 dev_err(tas_priv->dev, in tasdevice_add_config()
244 __func__, i, cfg_info->nblocks); in tasdevice_add_config()
248 bk_da[i]->regdata = kmemdup(&config_data[config_offset], in tasdevice_add_config()
249 bk_da[i]->block_size, GFP_KERNEL); in tasdevice_add_config()
250 if (!bk_da[i]->regdata) { in tasdevice_add_config()
251 *status = -ENOMEM; in tasdevice_add_config()
256 config_offset += bk_da[i]->block_size; in tasdevice_add_config()
257 cfg_info->real_nblocks += 1; in tasdevice_add_config()
278 int offset = 0, ret = 0, i; in tasdevice_spi_rca_parser() local
281 rca = &tas_priv->rcabin; in tasdevice_spi_rca_parser()
282 fw_hdr = &rca->fw_hdr; in tasdevice_spi_rca_parser()
283 if (!fmw || !fmw->data) { in tasdevice_spi_rca_parser()
284 dev_err(tas_priv->dev, "Failed to read %s\n", in tasdevice_spi_rca_parser()
285 tas_priv->rca_binaryname); in tasdevice_spi_rca_parser()
286 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_spi_rca_parser()
287 return -EINVAL; in tasdevice_spi_rca_parser()
289 buf = (unsigned char *)fmw->data; in tasdevice_spi_rca_parser()
290 fw_hdr->img_sz = get_unaligned_be32(&buf[offset]); in tasdevice_spi_rca_parser()
291 offset += 4; in tasdevice_spi_rca_parser()
292 if (fw_hdr->img_sz != fmw->size) { in tasdevice_spi_rca_parser()
293 dev_err(tas_priv->dev, in tasdevice_spi_rca_parser()
294 "File size not match, %d %u", (int)fmw->size, in tasdevice_spi_rca_parser()
295 fw_hdr->img_sz); in tasdevice_spi_rca_parser()
296 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_spi_rca_parser()
297 return -EINVAL; in tasdevice_spi_rca_parser()
300 fw_hdr->checksum = get_unaligned_be32(&buf[offset]); in tasdevice_spi_rca_parser()
301 offset += 4; in tasdevice_spi_rca_parser()
302 fw_hdr->binary_version_num = get_unaligned_be32(&buf[offset]); in tasdevice_spi_rca_parser()
303 if (fw_hdr->binary_version_num < 0x103) { in tasdevice_spi_rca_parser()
304 dev_err(tas_priv->dev, "File version 0x%04x is too low", in tasdevice_spi_rca_parser()
305 fw_hdr->binary_version_num); in tasdevice_spi_rca_parser()
306 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_spi_rca_parser()
307 return -EINVAL; in tasdevice_spi_rca_parser()
309 offset += 4; in tasdevice_spi_rca_parser()
310 fw_hdr->drv_fw_version = get_unaligned_be32(&buf[offset]); in tasdevice_spi_rca_parser()
311 offset += 8; in tasdevice_spi_rca_parser()
312 fw_hdr->plat_type = buf[offset++]; in tasdevice_spi_rca_parser()
313 fw_hdr->dev_family = buf[offset++]; in tasdevice_spi_rca_parser()
314 fw_hdr->reserve = buf[offset++]; in tasdevice_spi_rca_parser()
315 fw_hdr->ndev = buf[offset++]; in tasdevice_spi_rca_parser()
316 if (offset + TASDEVICE_DEVICE_SUM > fw_hdr->img_sz) { in tasdevice_spi_rca_parser()
317 dev_err(tas_priv->dev, "rca_ready: Out of boundary!\n"); in tasdevice_spi_rca_parser()
318 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_spi_rca_parser()
319 return -EINVAL; in tasdevice_spi_rca_parser()
322 for (i = 0; i < TASDEVICE_DEVICE_SUM; i++, offset++) in tasdevice_spi_rca_parser()
323 fw_hdr->devs[i] = buf[offset]; in tasdevice_spi_rca_parser()
325 fw_hdr->nconfig = get_unaligned_be32(&buf[offset]); in tasdevice_spi_rca_parser()
326 offset += 4; in tasdevice_spi_rca_parser()
329 fw_hdr->config_size[i] = get_unaligned_be32(&buf[offset]); in tasdevice_spi_rca_parser()
330 offset += 4; in tasdevice_spi_rca_parser()
331 total_config_sz += fw_hdr->config_size[i]; in tasdevice_spi_rca_parser()
334 if (fw_hdr->img_sz - total_config_sz != (unsigned int)offset) { in tasdevice_spi_rca_parser()
335 dev_err(tas_priv->dev, "Bin file err %d - %d != %d!\n", in tasdevice_spi_rca_parser()
336 fw_hdr->img_sz, total_config_sz, (int)offset); in tasdevice_spi_rca_parser()
337 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_spi_rca_parser()
338 return -EINVAL; in tasdevice_spi_rca_parser()
341 cfg_info = kcalloc(fw_hdr->nconfig, sizeof(*cfg_info), GFP_KERNEL); in tasdevice_spi_rca_parser()
343 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_spi_rca_parser()
344 return -ENOMEM; in tasdevice_spi_rca_parser()
346 rca->cfg_info = cfg_info; in tasdevice_spi_rca_parser()
347 rca->ncfgs = 0; in tasdevice_spi_rca_parser()
348 for (i = 0; i < (int)fw_hdr->nconfig; i++) { in tasdevice_spi_rca_parser()
349 rca->ncfgs += 1; in tasdevice_spi_rca_parser()
350 cfg_info[i] = tasdevice_add_config(tas_priv, &buf[offset], in tasdevice_spi_rca_parser()
351 fw_hdr->config_size[i], &ret); in tasdevice_spi_rca_parser()
353 tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL; in tasdevice_spi_rca_parser()
356 offset += (int)fw_hdr->config_size[i]; in tasdevice_spi_rca_parser()
364 struct tasdev_blk *block) in map_dev_idx() argument
368 struct tasdevice_dspfw_hdr *fw_hdr = &tas_fmw->fw_hdr; in map_dev_idx()
369 struct tasdevice_fw_fixed_hdr *fw_fixed_hdr = &fw_hdr->fixed_hdr; in map_dev_idx()
373 if (fw_fixed_hdr->ppcver >= PPC3_VERSION_TAS2781) { in map_dev_idx()
376 } else if (fw_fixed_hdr->ppcver >= PPC3_VERSION) { in map_dev_idx()
382 if (block->type == p[i].blktyp) { in map_dev_idx()
391 /* Block parser function. */
393 struct tasdev_blk *block, const struct firmware *fmw, int offset) in fw_parse_block_data_kernel() argument
395 const unsigned char *data = fmw->data; in fw_parse_block_data_kernel()
397 if (offset + 16 > fmw->size) { in fw_parse_block_data_kernel()
398 dev_err(tas_fmw->dev, "%s: File Size error\n", __func__); in fw_parse_block_data_kernel()
399 return -EINVAL; in fw_parse_block_data_kernel()
403 * Convert data[offset], data[offset + 1], data[offset + 2] and in fw_parse_block_data_kernel()
404 * data[offset + 3] into host. in fw_parse_block_data_kernel()
406 block->type = get_unaligned_be32(&data[offset]); in fw_parse_block_data_kernel()
407 offset += 4; in fw_parse_block_data_kernel()
409 block->is_pchksum_present = data[offset++]; in fw_parse_block_data_kernel()
410 block->pchksum = data[offset++]; in fw_parse_block_data_kernel()
411 block->is_ychksum_present = data[offset++]; in fw_parse_block_data_kernel()
412 block->ychksum = data[offset++]; in fw_parse_block_data_kernel()
413 block->blk_size = get_unaligned_be32(&data[offset]); in fw_parse_block_data_kernel()
414 offset += 4; in fw_parse_block_data_kernel()
415 block->nr_subblocks = get_unaligned_be32(&data[offset]); in fw_parse_block_data_kernel()
416 offset += 4; in fw_parse_block_data_kernel()
421 * 2. storing the dev_idx as a member of block can reduce unnecessary in fw_parse_block_data_kernel()
423 * time the block data writing to the dsp. in fw_parse_block_data_kernel()
425 block->dev_idx = map_dev_idx(tas_fmw, block); in fw_parse_block_data_kernel()
427 if (offset + block->blk_size > fmw->size) { in fw_parse_block_data_kernel()
428 dev_err(tas_fmw->dev, "%s: nSublocks error\n", __func__); in fw_parse_block_data_kernel()
429 return -EINVAL; in fw_parse_block_data_kernel()
432 block->data = kmemdup(&data[offset], block->blk_size, GFP_KERNEL); in fw_parse_block_data_kernel()
433 if (!block->data) in fw_parse_block_data_kernel()
434 return -ENOMEM; in fw_parse_block_data_kernel()
436 offset += block->blk_size; in fw_parse_block_data_kernel()
438 return offset; in fw_parse_block_data_kernel()
441 /* Data of block parser function. */
444 int offset) in fw_parse_data_kernel() argument
446 const unsigned char *data = fmw->data; in fw_parse_data_kernel()
450 if (offset + 4 > fmw->size) { in fw_parse_data_kernel()
451 dev_err(tas_fmw->dev, "%s: File Size error\n", __func__); in fw_parse_data_kernel()
452 return -EINVAL; in fw_parse_data_kernel()
454 img_data->nr_blk = get_unaligned_be32(&data[offset]); in fw_parse_data_kernel()
455 offset += 4; in fw_parse_data_kernel()
457 img_data->dev_blks = kcalloc(img_data->nr_blk, in fw_parse_data_kernel()
459 if (!img_data->dev_blks) in fw_parse_data_kernel()
460 return -ENOMEM; in fw_parse_data_kernel()
462 for (i = 0; i < img_data->nr_blk; i++) { in fw_parse_data_kernel()
463 blk = &img_data->dev_blks[i]; in fw_parse_data_kernel()
464 offset = fw_parse_block_data_kernel( in fw_parse_data_kernel()
465 tas_fmw, blk, fmw, offset); in fw_parse_data_kernel()
466 if (offset < 0) { in fw_parse_data_kernel()
467 kfree(img_data->dev_blks); in fw_parse_data_kernel()
468 return -EINVAL; in fw_parse_data_kernel()
472 return offset; in fw_parse_data_kernel()
478 const struct firmware *fmw, int offset) in fw_parse_program_data_kernel() argument
483 for (i = 0; i < tas_fmw->nr_programs; i++) { in fw_parse_program_data_kernel()
484 program = &tas_fmw->programs[i]; in fw_parse_program_data_kernel()
485 if (offset + 72 > fmw->size) { in fw_parse_program_data_kernel()
486 dev_err(tas_priv->dev, "%s: mpName error\n", __func__); in fw_parse_program_data_kernel()
487 return -EINVAL; in fw_parse_program_data_kernel()
490 offset += 72; in fw_parse_program_data_kernel()
492 offset = fw_parse_data_kernel(tas_fmw, &program->dev_data, in fw_parse_program_data_kernel()
493 fmw, offset); in fw_parse_program_data_kernel()
494 if (offset < 0) in fw_parse_program_data_kernel()
498 return offset; in fw_parse_program_data_kernel()
503 struct tasdevice_fw *tas_fmw, const struct firmware *fmw, int offset) in fw_parse_configuration_data_kernel() argument
505 const unsigned char *data = fmw->data; in fw_parse_configuration_data_kernel()
509 for (i = 0; i < tas_fmw->nr_configurations; i++) { in fw_parse_configuration_data_kernel()
510 config = &tas_fmw->configs[i]; in fw_parse_configuration_data_kernel()
511 if (offset + 80 > fmw->size) { in fw_parse_configuration_data_kernel()
512 dev_err(tas_priv->dev, "%s: mpName error\n", __func__); in fw_parse_configuration_data_kernel()
513 return -EINVAL; in fw_parse_configuration_data_kernel()
515 memcpy(config->name, &data[offset], 64); in fw_parse_configuration_data_kernel()
517 offset += 80; in fw_parse_configuration_data_kernel()
519 offset = fw_parse_data_kernel(tas_fmw, &config->dev_data, in fw_parse_configuration_data_kernel()
520 fmw, offset); in fw_parse_configuration_data_kernel()
521 if (offset < 0) in fw_parse_configuration_data_kernel()
525 return offset; in fw_parse_configuration_data_kernel()
530 const struct firmware *fmw, int offset) in fw_parse_variable_header_kernel() argument
532 struct tasdevice_fw *tas_fmw = tas_priv->fmw; in fw_parse_variable_header_kernel()
533 struct tasdevice_dspfw_hdr *fw_hdr = &tas_fmw->fw_hdr; in fw_parse_variable_header_kernel()
536 const unsigned char *buf = fmw->data; in fw_parse_variable_header_kernel()
540 if (offset + 12 + 4 * TASDEVICE_MAXPROGRAM_NUM_KERNEL > fmw->size) { in fw_parse_variable_header_kernel()
541 dev_err(tas_priv->dev, "%s: File Size error\n", __func__); in fw_parse_variable_header_kernel()
542 return -EINVAL; in fw_parse_variable_header_kernel()
544 fw_hdr->device_family = get_unaligned_be16(&buf[offset]); in fw_parse_variable_header_kernel()
545 if (fw_hdr->device_family != 0) { in fw_parse_variable_header_kernel()
546 dev_err(tas_priv->dev, "%s:not TAS device\n", __func__); in fw_parse_variable_header_kernel()
547 return -EINVAL; in fw_parse_variable_header_kernel()
549 offset += 2; in fw_parse_variable_header_kernel()
550 fw_hdr->device = get_unaligned_be16(&buf[offset]); in fw_parse_variable_header_kernel()
551 if (fw_hdr->device >= TASDEVICE_DSP_TAS_MAX_DEVICE || in fw_parse_variable_header_kernel()
552 fw_hdr->device == 6) { in fw_parse_variable_header_kernel()
553 dev_err(tas_priv->dev, "Unsupported dev %d\n", fw_hdr->device); in fw_parse_variable_header_kernel()
554 return -EINVAL; in fw_parse_variable_header_kernel()
556 offset += 2; in fw_parse_variable_header_kernel()
558 tas_fmw->nr_programs = get_unaligned_be32(&buf[offset]); in fw_parse_variable_header_kernel()
559 offset += 4; in fw_parse_variable_header_kernel()
561 if (tas_fmw->nr_programs == 0 || in fw_parse_variable_header_kernel()
562 tas_fmw->nr_programs > TASDEVICE_MAXPROGRAM_NUM_KERNEL) { in fw_parse_variable_header_kernel()
563 dev_err(tas_priv->dev, "mnPrograms is invalid\n"); in fw_parse_variable_header_kernel()
564 return -EINVAL; in fw_parse_variable_header_kernel()
567 tas_fmw->programs = kcalloc(tas_fmw->nr_programs, in fw_parse_variable_header_kernel()
568 sizeof(*tas_fmw->programs), GFP_KERNEL); in fw_parse_variable_header_kernel()
569 if (!tas_fmw->programs) in fw_parse_variable_header_kernel()
570 return -ENOMEM; in fw_parse_variable_header_kernel()
572 for (i = 0; i < tas_fmw->nr_programs; i++) { in fw_parse_variable_header_kernel()
573 program = &tas_fmw->programs[i]; in fw_parse_variable_header_kernel()
574 program->prog_size = get_unaligned_be32(&buf[offset]); in fw_parse_variable_header_kernel()
575 offset += 4; in fw_parse_variable_header_kernel()
579 offset += 4 * (TASDEVICE_MAXPROGRAM_NUM_KERNEL - tas_fmw->nr_programs); in fw_parse_variable_header_kernel()
581 tas_fmw->nr_configurations = get_unaligned_be32(&buf[offset]); in fw_parse_variable_header_kernel()
582 offset += 4; in fw_parse_variable_header_kernel()
590 if (tas_fmw->nr_configurations == 0 || in fw_parse_variable_header_kernel()
591 tas_fmw->nr_configurations > max_confs) { in fw_parse_variable_header_kernel()
592 dev_err(tas_priv->dev, "%s: Conf is invalid\n", __func__); in fw_parse_variable_header_kernel()
593 kfree(tas_fmw->programs); in fw_parse_variable_header_kernel()
594 return -EINVAL; in fw_parse_variable_header_kernel()
597 if (offset + 4 * max_confs > fmw->size) { in fw_parse_variable_header_kernel()
598 dev_err(tas_priv->dev, "%s: mpConfigurations err\n", __func__); in fw_parse_variable_header_kernel()
599 kfree(tas_fmw->programs); in fw_parse_variable_header_kernel()
600 return -EINVAL; in fw_parse_variable_header_kernel()
603 tas_fmw->configs = kcalloc(tas_fmw->nr_configurations, in fw_parse_variable_header_kernel()
604 sizeof(*tas_fmw->configs), GFP_KERNEL); in fw_parse_variable_header_kernel()
605 if (!tas_fmw->configs) { in fw_parse_variable_header_kernel()
606 kfree(tas_fmw->programs); in fw_parse_variable_header_kernel()
607 return -ENOMEM; in fw_parse_variable_header_kernel()
610 for (i = 0; i < tas_fmw->nr_programs; i++) { in fw_parse_variable_header_kernel()
611 config = &tas_fmw->configs[i]; in fw_parse_variable_header_kernel()
612 config->cfg_size = get_unaligned_be32(&buf[offset]); in fw_parse_variable_header_kernel()
613 offset += 4; in fw_parse_variable_header_kernel()
617 offset += 4 * (max_confs - tas_fmw->nr_programs); in fw_parse_variable_header_kernel()
619 return offset; in fw_parse_variable_header_kernel()
623 * In sub-block data, have three type sub-block:
625 * 2. Multi-byte write.
639 dev_err(tas_priv->dev, "process_block: Out of boundary\n"); in tasdevice_single_byte_wr()
644 if (dev_idx == (tas_priv->index + 1) || dev_idx == 0) { in tasdevice_single_byte_wr()
651 dev_err(tas_priv->dev, in tasdevice_single_byte_wr()
663 * In sub-block data, have three type sub-block:
665 * 2. Multi-byte write.
668 * This function perform multi-write to device.
679 dev_err(tas_priv->dev, "%s: BST Out of boundary\n", __func__); in tasdevice_burst_wr()
683 dev_err(tas_priv->dev, "%s:Bst-len(%u)not div by 4\n", in tasdevice_burst_wr()
688 if (dev_idx == (tas_priv->index + 1) || dev_idx == 0) { in tasdevice_burst_wr()
695 dev_err(tas_priv->dev, "%s: bulk_write error = %d\n", in tasdevice_burst_wr()
713 dev_err(tas_priv->dev, "%s: delay Out of boundary\n", in tasdevice_delay()
717 if (dev_idx == (tas_priv->index + 1) || dev_idx == 0) { in tasdevice_delay()
727 * In sub-block data, have three type sub-block:
729 * 2. Multi-byte write.
741 dev_err(tas_priv->dev, "%s: bit write Out of boundary\n", in tasdevice_field_wr()
745 if (dev_idx == (tas_priv->index + 1) || dev_idx == 0) { in tasdevice_field_wr()
753 dev_err(tas_priv->dev, "%s: update_bits error = %d\n", in tasdevice_field_wr()
763 /* Data block process function. */
794 tas_priv->cur_prog = -1; in tasdevice_process_block()
795 tas_priv->cur_conf = -1; in tasdevice_process_block()
797 tas_priv->cur_conf = -1; in tasdevice_process_block()
812 struct tasdevice_rca *rca = &tas_priv->rcabin; in tasdevice_spi_select_cfg_blk()
813 struct tasdevice_config_info **cfg_info = rca->cfg_info; in tasdevice_spi_select_cfg_blk()
817 if (conf_no >= rca->ncfgs || conf_no < 0 || !cfg_info) { in tasdevice_spi_select_cfg_blk()
818 dev_err(tas_priv->dev, "conf_no should be not more than %u\n", in tasdevice_spi_select_cfg_blk()
819 rca->ncfgs); in tasdevice_spi_select_cfg_blk()
822 blk_data = cfg_info[conf_no]->blk_data; in tasdevice_spi_select_cfg_blk()
824 for (j = 0; j < cfg_info[conf_no]->real_nblocks; j++) { in tasdevice_spi_select_cfg_blk()
828 dev_err(tas_priv->dev, in tasdevice_spi_select_cfg_blk()
832 if (block_type != blk_data[j]->block_type) in tasdevice_spi_select_cfg_blk()
835 for (k = 0; k < blk_data[j]->n_subblks; k++) { in tasdevice_spi_select_cfg_blk()
836 tas_priv->is_loading = true; in tasdevice_spi_select_cfg_blk()
839 blk_data[j]->regdata + length, in tasdevice_spi_select_cfg_blk()
840 blk_data[j]->dev_idx, in tasdevice_spi_select_cfg_blk()
841 blk_data[j]->block_size - length); in tasdevice_spi_select_cfg_blk()
843 if (blk_data[j]->block_size < length) { in tasdevice_spi_select_cfg_blk()
844 dev_err(tas_priv->dev, in tasdevice_spi_select_cfg_blk()
847 blk_data[j]->block_size); in tasdevice_spi_select_cfg_blk()
851 if (length != blk_data[j]->block_size) in tasdevice_spi_select_cfg_blk()
852 dev_err(tas_priv->dev, "%s: %u %u size is not same\n", in tasdevice_spi_select_cfg_blk()
853 __func__, length, blk_data[j]->block_size); in tasdevice_spi_select_cfg_blk()
857 /* Block process function. */
859 struct tasdevice_priv *tasdevice, struct tasdev_blk *block) in tasdevice_load_block_kernel() argument
861 const unsigned int blk_size = block->blk_size; in tasdevice_load_block_kernel()
862 unsigned char *data = block->data; in tasdevice_load_block_kernel()
865 for (i = 0, length = 0; i < block->nr_subblocks; i++) { in tasdevice_load_block_kernel()
867 block->dev_idx, blk_size - length); in tasdevice_load_block_kernel()
869 dev_err(tasdevice->dev, in tasdevice_load_block_kernel()
876 dev_err(tasdevice->dev, "%s: %u %u out of boundary\n", in tasdevice_load_block_kernel()
878 rc = -ENOMEM; in tasdevice_load_block_kernel()
889 const struct firmware *fmw, int offset) in fw_parse_variable_hdr() argument
891 const unsigned char *buf = fmw->data; in fw_parse_variable_hdr()
892 int len = strlen((char *)&buf[offset]); in fw_parse_variable_hdr()
896 if (offset + len + 8 > fmw->size) { in fw_parse_variable_hdr()
897 dev_err(tas_priv->dev, "%s: File Size error\n", __func__); in fw_parse_variable_hdr()
898 return -EINVAL; in fw_parse_variable_hdr()
901 offset += len; in fw_parse_variable_hdr()
903 fw_hdr->device_family = get_unaligned_be32(&buf[offset]); in fw_parse_variable_hdr()
904 if (fw_hdr->device_family != 0) { in fw_parse_variable_hdr()
905 dev_err(tas_priv->dev, "%s: not TAS device\n", __func__); in fw_parse_variable_hdr()
906 return -EINVAL; in fw_parse_variable_hdr()
908 offset += 4; in fw_parse_variable_hdr()
910 fw_hdr->device = get_unaligned_be32(&buf[offset]); in fw_parse_variable_hdr()
911 if (fw_hdr->device >= TASDEVICE_DSP_TAS_MAX_DEVICE || in fw_parse_variable_hdr()
912 fw_hdr->device == 6) { in fw_parse_variable_hdr()
913 dev_err(tas_priv->dev, "Unsupported dev %d\n", fw_hdr->device); in fw_parse_variable_hdr()
914 return -EINVAL; in fw_parse_variable_hdr()
916 offset += 4; in fw_parse_variable_hdr()
917 fw_hdr->ndev = 1; in fw_parse_variable_hdr()
919 return offset; in fw_parse_variable_hdr()
924 *tas_priv, const struct firmware *fmw, int offset) in fw_parse_variable_header_git() argument
926 struct tasdevice_fw *tas_fmw = tas_priv->fmw; in fw_parse_variable_header_git()
927 struct tasdevice_dspfw_hdr *fw_hdr = &tas_fmw->fw_hdr; in fw_parse_variable_header_git()
929 offset = fw_parse_variable_hdr(tas_priv, fw_hdr, fmw, offset); in fw_parse_variable_header_git()
931 return offset; in fw_parse_variable_header_git()
934 /* DSP firmware file block parser function. */
936 struct tasdev_blk *block, const struct firmware *fmw, int offset) in fw_parse_block_data() argument
938 unsigned char *data = (unsigned char *)fmw->data; in fw_parse_block_data()
941 if (offset + 8 > fmw->size) { in fw_parse_block_data()
942 dev_err(tas_fmw->dev, "%s: Type error\n", __func__); in fw_parse_block_data()
943 return -EINVAL; in fw_parse_block_data()
945 block->type = get_unaligned_be32(&data[offset]); in fw_parse_block_data()
946 offset += 4; in fw_parse_block_data()
948 if (tas_fmw->fw_hdr.fixed_hdr.drv_ver >= PPC_DRIVER_CRCCHK) { in fw_parse_block_data()
949 if (offset + 8 > fmw->size) { in fw_parse_block_data()
950 dev_err(tas_fmw->dev, "PChkSumPresent error\n"); in fw_parse_block_data()
951 return -EINVAL; in fw_parse_block_data()
953 block->is_pchksum_present = data[offset]; in fw_parse_block_data()
954 offset++; in fw_parse_block_data()
956 block->pchksum = data[offset]; in fw_parse_block_data()
957 offset++; in fw_parse_block_data()
959 block->is_ychksum_present = data[offset]; in fw_parse_block_data()
960 offset++; in fw_parse_block_data()
962 block->ychksum = data[offset]; in fw_parse_block_data()
963 offset++; in fw_parse_block_data()
965 block->is_pchksum_present = 0; in fw_parse_block_data()
966 block->is_ychksum_present = 0; in fw_parse_block_data()
969 block->nr_cmds = get_unaligned_be32(&data[offset]); in fw_parse_block_data()
970 offset += 4; in fw_parse_block_data()
972 n = block->nr_cmds * 4; in fw_parse_block_data()
973 if (offset + n > fmw->size) { in fw_parse_block_data()
974 dev_err(tas_fmw->dev, in fw_parse_block_data()
975 "%s: File Size(%lu) error offset = %d n = %d\n", in fw_parse_block_data()
976 __func__, (unsigned long)fmw->size, offset, n); in fw_parse_block_data()
977 return -EINVAL; in fw_parse_block_data()
980 block->data = kmemdup(&data[offset], n, GFP_KERNEL); in fw_parse_block_data()
981 if (!block->data) in fw_parse_block_data()
982 return -ENOMEM; in fw_parse_block_data()
984 offset += n; in fw_parse_block_data()
986 return offset; in fw_parse_block_data()
995 int offset) in fw_parse_data() argument
997 const unsigned char *data = (unsigned char *)fmw->data; in fw_parse_data()
1001 if (offset + 64 > fmw->size) { in fw_parse_data()
1002 dev_err(tas_fmw->dev, "%s: Name error\n", __func__); in fw_parse_data()
1003 return -EINVAL; in fw_parse_data()
1005 memcpy(img_data->name, &data[offset], 64); in fw_parse_data()
1006 offset += 64; in fw_parse_data()
1008 n = strlen((char *)&data[offset]); in fw_parse_data()
1010 if (offset + n + 2 > fmw->size) { in fw_parse_data()
1011 dev_err(tas_fmw->dev, "%s: Description error\n", __func__); in fw_parse_data()
1012 return -EINVAL; in fw_parse_data()
1014 offset += n; in fw_parse_data()
1015 img_data->nr_blk = get_unaligned_be16(&data[offset]); in fw_parse_data()
1016 offset += 2; in fw_parse_data()
1018 img_data->dev_blks = kcalloc(img_data->nr_blk, in fw_parse_data()
1019 sizeof(*img_data->dev_blks), GFP_KERNEL); in fw_parse_data()
1020 if (!img_data->dev_blks) in fw_parse_data()
1021 return -ENOMEM; in fw_parse_data()
1023 for (i = 0; i < img_data->nr_blk; i++) { in fw_parse_data()
1024 blk = &img_data->dev_blks[i]; in fw_parse_data()
1025 offset = fw_parse_block_data(tas_fmw, blk, fmw, offset); in fw_parse_data()
1026 if (offset < 0) in fw_parse_data()
1027 return -EINVAL; in fw_parse_data()
1030 return offset; in fw_parse_data()
1038 struct tasdevice_fw *tas_fmw, const struct firmware *fmw, int offset) in fw_parse_program_data() argument
1040 unsigned char *buf = (unsigned char *)fmw->data; in fw_parse_program_data()
1044 if (offset + 2 > fmw->size) { in fw_parse_program_data()
1045 dev_err(tas_priv->dev, "%s: File Size error\n", __func__); in fw_parse_program_data()
1046 return -EINVAL; in fw_parse_program_data()
1048 tas_fmw->nr_programs = get_unaligned_be16(&buf[offset]); in fw_parse_program_data()
1049 offset += 2; in fw_parse_program_data()
1051 if (tas_fmw->nr_programs == 0) { in fw_parse_program_data()
1053 dev_dbg(tas_priv->dev, "%s: No Programs data, maybe calbin\n", in fw_parse_program_data()
1055 return offset; in fw_parse_program_data()
1058 tas_fmw->programs = in fw_parse_program_data()
1059 kcalloc(tas_fmw->nr_programs, sizeof(*tas_fmw->programs), in fw_parse_program_data()
1061 if (!tas_fmw->programs) in fw_parse_program_data()
1062 return -ENOMEM; in fw_parse_program_data()
1064 for (i = 0; i < tas_fmw->nr_programs; i++) { in fw_parse_program_data()
1067 program = &tas_fmw->programs[i]; in fw_parse_program_data()
1068 if (offset + 64 > fmw->size) { in fw_parse_program_data()
1069 dev_err(tas_priv->dev, "%s: mpName error\n", __func__); in fw_parse_program_data()
1070 return -EINVAL; in fw_parse_program_data()
1072 offset += 64; in fw_parse_program_data()
1074 n = strlen((char *)&buf[offset]); in fw_parse_program_data()
1077 if (offset + n > fmw->size) { in fw_parse_program_data()
1078 dev_err(tas_priv->dev, "Description err\n"); in fw_parse_program_data()
1079 return -EINVAL; in fw_parse_program_data()
1082 offset += n; in fw_parse_program_data()
1084 offset = fw_parse_data(tas_fmw, &program->dev_data, fmw, in fw_parse_program_data()
1085 offset); in fw_parse_program_data()
1086 if (offset < 0) in fw_parse_program_data()
1087 return offset; in fw_parse_program_data()
1090 return offset; in fw_parse_program_data()
1098 struct tasdevice_fw *tas_fmw, const struct firmware *fmw, int offset) in fw_parse_configuration_data() argument
1100 unsigned char *data = (unsigned char *)fmw->data; in fw_parse_configuration_data()
1104 if (offset + 2 > fmw->size) { in fw_parse_configuration_data()
1105 dev_err(tas_priv->dev, "%s: File Size error\n", __func__); in fw_parse_configuration_data()
1106 return -EINVAL; in fw_parse_configuration_data()
1108 tas_fmw->nr_configurations = get_unaligned_be16(&data[offset]); in fw_parse_configuration_data()
1109 offset += 2; in fw_parse_configuration_data()
1111 if (tas_fmw->nr_configurations == 0) { in fw_parse_configuration_data()
1112 dev_err(tas_priv->dev, "%s: Conf is zero\n", __func__); in fw_parse_configuration_data()
1114 return offset; in fw_parse_configuration_data()
1116 tas_fmw->configs = kcalloc(tas_fmw->nr_configurations, in fw_parse_configuration_data()
1117 sizeof(*tas_fmw->configs), GFP_KERNEL); in fw_parse_configuration_data()
1118 if (!tas_fmw->configs) in fw_parse_configuration_data()
1119 return -ENOMEM; in fw_parse_configuration_data()
1120 for (i = 0; i < tas_fmw->nr_configurations; i++) { in fw_parse_configuration_data()
1121 config = &tas_fmw->configs[i]; in fw_parse_configuration_data()
1122 if (offset + 64 > fmw->size) { in fw_parse_configuration_data()
1123 dev_err(tas_priv->dev, "File Size err\n"); in fw_parse_configuration_data()
1124 return -EINVAL; in fw_parse_configuration_data()
1126 memcpy(config->name, &data[offset], 64); in fw_parse_configuration_data()
1127 offset += 64; in fw_parse_configuration_data()
1129 n = strlen((char *)&data[offset]); in fw_parse_configuration_data()
1131 if (offset + n > fmw->size) { in fw_parse_configuration_data()
1132 dev_err(tas_priv->dev, "Description err\n"); in fw_parse_configuration_data()
1133 return -EINVAL; in fw_parse_configuration_data()
1135 offset += n; in fw_parse_configuration_data()
1136 offset = fw_parse_data(tas_fmw, &config->dev_data, in fw_parse_configuration_data()
1137 fmw, offset); in fw_parse_configuration_data()
1138 if (offset < 0) in fw_parse_configuration_data()
1142 return offset; in fw_parse_configuration_data()
1154 cd->len = TAS2781_YRAM5_END_REG - reg + 1; in check_inpage_yram_rg()
1156 cd->len = len; in check_inpage_yram_rg()
1157 cd->offset = reg; in check_inpage_yram_rg()
1161 cd->offset = TAS2781_YRAM5_START_REG; in check_inpage_yram_rg()
1162 cd->len = len - TAS2781_YRAM5_START_REG + reg; in check_inpage_yram_rg()
1170 /* DSP firmware yram block check. */
1178 cd->offset = reg; in check_inpage_yram_bk1()
1179 cd->len = len; in check_inpage_yram_bk1()
1182 cd->offset = TAS2781_YRAM1_START_REG; in check_inpage_yram_bk1()
1183 cd->len = len - TAS2781_YRAM1_START_REG + reg; in check_inpage_yram_bk1()
1195 * true -- the registers are in the inpage yram
1196 * false -- the registers are NOT in the inpage yram
1223 cd->offset = reg; in check_inblock_yram_bk()
1224 cd->len = len; in check_inblock_yram_bk()
1227 if (reg + len - 1 >= TAS2781_YRAM2_START_REG) { in check_inblock_yram_bk()
1228 cd->offset = TAS2781_YRAM2_START_REG; in check_inblock_yram_bk()
1229 cd->len = reg + len - TAS2781_YRAM2_START_REG; in check_inblock_yram_bk()
1240 * true -- the registers are in the inblock yram
1241 * false -- the registers are NOT in the inblock yram
1267 /* Checksum for data block. */
1278 if ((reg + len - 1) > 127) { in tasdev_multibytes_chksum()
1279 ret = -EINVAL; in tasdev_multibytes_chksum()
1280 dev_err(tasdevice->dev, "firmware error\n"); in tasdev_multibytes_chksum()
1298 dev_err(tasdevice->dev, "firmware error\n"); in tasdev_multibytes_chksum()
1299 ret = -EINVAL; in tasdev_multibytes_chksum()
1304 TASDEVICE_REG(book, page, crc_data.offset), in tasdev_multibytes_chksum()
1312 ((i + crc_data.offset) >= in tasdev_multibytes_chksum()
1314 ((i + crc_data.offset) <= in tasdev_multibytes_chksum()
1319 crc_chksum += crc8(tasdevice->crc8_lkp_tbl, &nBuf1[i], in tasdev_multibytes_chksum()
1355 dev_err(tasdevice->dev, in do_singlereg_checksum()
1358 tasdevice->err_code |= ERROR_YRAM_CRCCHK; in do_singlereg_checksum()
1359 return -EAGAIN; in do_singlereg_checksum()
1362 ret = crc8(tasdevice->crc8_lkp_tbl, &val, 1, 0); in do_singlereg_checksum()
1367 /* Block type check. */
1373 p->cur_prog = -1; in set_err_prg_cfg()
1375 p->cur_conf = -1; in set_err_prg_cfg()
1380 struct tasdev_blk *block, unsigned char book, in tasdev_bytes_chksum() argument
1397 if (ret != -EAGAIN) in tasdev_bytes_chksum()
1400 block->nr_retry--; in tasdev_bytes_chksum()
1401 if (block->nr_retry > 0) in tasdev_bytes_chksum()
1404 set_err_prg_cfg(block->type, tas_priv); in tasdev_bytes_chksum()
1410 /* Multi-data byte write. */
1412 struct tasdev_blk *block, unsigned char book, in tasdev_multibytes_wr() argument
1424 if (block->is_ychksum_present) in tasdev_multibytes_wr()
1425 ret = tasdev_bytes_chksum(tas_priv, block, in tasdev_multibytes_wr()
1432 if (block->is_ychksum_present) in tasdev_multibytes_wr()
1433 ret = tasdev_bytes_chksum(tas_priv, block, book, in tasdev_multibytes_wr()
1437 if (!block->is_ychksum_present || ret >= 0) { in tasdev_multibytes_wr()
1440 *nr_cmds += ((len - 2) / 4) + 1; in tasdev_multibytes_wr()
1446 /* Checksum for block. */
1448 struct tasdev_blk *block) in tasdev_block_chksum() argument
1455 dev_err(tas_priv->dev, "%s: read error %d.\n", __func__, ret); in tasdev_block_chksum()
1456 set_err_prg_cfg(block->type, tas_priv); in tasdev_block_chksum()
1460 if ((nr_value & 0xff) != block->pchksum) { in tasdev_block_chksum()
1461 dev_err(tas_priv->dev, "%s: PChkSum err %d ", __func__, ret); in tasdev_block_chksum()
1462 dev_err(tas_priv->dev, "PChkSum = 0x%x, Reg = 0x%x\n", in tasdev_block_chksum()
1463 block->pchksum, (nr_value & 0xff)); in tasdev_block_chksum()
1464 tas_priv->err_code |= ERROR_PRAM_CRCCHK; in tasdev_block_chksum()
1465 ret = -EAGAIN; in tasdev_block_chksum()
1466 block->nr_retry--; in tasdev_block_chksum()
1468 if (block->nr_retry <= 0) in tasdev_block_chksum()
1469 set_err_prg_cfg(block->type, tas_priv); in tasdev_block_chksum()
1471 tas_priv->err_code &= ~ERROR_PRAM_CRCCHK; in tasdev_block_chksum()
1477 /* Firmware block load function. */
1479 struct tasdev_blk *block) in tasdev_load_blk() argument
1482 unsigned char offset, book, page, val; in tasdev_load_blk() local
1483 unsigned char *data = block->data; in tasdev_load_blk()
1487 while (block->nr_retry > 0) { in tasdev_load_blk()
1488 if (block->is_pchksum_present) { in tasdev_load_blk()
1495 if (block->is_ychksum_present) in tasdev_load_blk()
1500 while (nr_cmds < block->nr_cmds) { in tasdev_load_blk()
1501 data = block->data + nr_cmds * 4; in tasdev_load_blk()
1505 offset = data[2]; in tasdev_load_blk()
1510 if (offset <= 0x7F) { in tasdev_load_blk()
1512 TASDEVICE_REG(book, page, offset), in tasdev_load_blk()
1516 if (block->is_ychksum_present) { in tasdev_load_blk()
1518 block, book, page, offset, in tasdev_load_blk()
1526 if (offset == 0x81) { in tasdev_load_blk()
1527 /* book -- data[0] page -- data[1] */ in tasdev_load_blk()
1533 if (offset == 0x85) { in tasdev_load_blk()
1538 offset = data[2]; in tasdev_load_blk()
1540 block, book, page, offset, data, in tasdev_load_blk()
1546 if (ret == -EAGAIN) { in tasdev_load_blk()
1547 if (block->nr_retry > 0) in tasdev_load_blk()
1554 if (block->is_pchksum_present) { in tasdev_load_blk()
1555 ret = tasdev_block_chksum(tas_priv, block); in tasdev_load_blk()
1556 if (ret == -EAGAIN) { in tasdev_load_blk()
1557 if (block->nr_retry > 0) in tasdev_load_blk()
1565 if (block->is_ychksum_present) { in tasdev_load_blk()
1567 dev_err(tas_priv->dev, in tasdev_load_blk()
1569 block->ychksum, crc_chksum); in tasdev_load_blk()
1571 tas_priv->err_code &= in tasdev_load_blk()
1582 /* Firmware block load function. */
1584 struct tasdev_blk *block) in tasdevice_load_block() argument
1588 block->nr_retry = 6; in tasdevice_load_block()
1589 if (tas_priv->is_loading == false) in tasdevice_load_block()
1591 ret = tasdev_load_blk(tas_priv, block); in tasdevice_load_block()
1593 dev_err(tas_priv->dev, "Blk (%d) load error\n", block->type); in tasdevice_load_block()
1609 tas_priv->fw_parse_variable_header = in dspfw_default_callback()
1611 tas_priv->fw_parse_program_data = in dspfw_default_callback()
1613 tas_priv->fw_parse_configuration_data = in dspfw_default_callback()
1615 tas_priv->tasdevice_load_block = in dspfw_default_callback()
1618 tas_priv->fw_parse_variable_header = in dspfw_default_callback()
1620 tas_priv->fw_parse_program_data = in dspfw_default_callback()
1622 tas_priv->fw_parse_configuration_data = in dspfw_default_callback()
1624 tas_priv->tasdevice_load_block = in dspfw_default_callback()
1627 dev_err(tas_priv->dev, in dspfw_default_callback()
1629 rc = -EINVAL; in dspfw_default_callback()
1632 dev_err(tas_priv->dev, "Wrong DrvVer : 0x%02x\n", drv_ver); in dspfw_default_callback()
1633 rc = -EINVAL; in dspfw_default_callback()
1641 struct tasdevice_fw *tas_fmw, const struct firmware *fmw, int offset) in fw_parse_header() argument
1643 struct tasdevice_dspfw_hdr *fw_hdr = &tas_fmw->fw_hdr; in fw_parse_header()
1644 struct tasdevice_fw_fixed_hdr *fw_fixed_hdr = &fw_hdr->fixed_hdr; in fw_parse_header()
1646 const unsigned char *buf = (unsigned char *)fmw->data; in fw_parse_header()
1648 if (offset + 92 > fmw->size) { in fw_parse_header()
1649 dev_err(tas_priv->dev, "%s: File Size error\n", __func__); in fw_parse_header()
1650 offset = -EINVAL; in fw_parse_header()
1653 if (memcmp(&buf[offset], magic_number, 4)) { in fw_parse_header()
1654 dev_err(tas_priv->dev, "%s: Magic num NOT match\n", __func__); in fw_parse_header()
1655 offset = -EINVAL; in fw_parse_header()
1658 offset += 4; in fw_parse_header()
1661 * Convert data[offset], data[offset + 1], data[offset + 2] and in fw_parse_header()
1662 * data[offset + 3] into host in fw_parse_header()
1664 fw_fixed_hdr->fwsize = get_unaligned_be32(&buf[offset]); in fw_parse_header()
1665 offset += 4; in fw_parse_header()
1666 if (fw_fixed_hdr->fwsize != fmw->size) { in fw_parse_header()
1667 dev_err(tas_priv->dev, "File size not match, %lu %u", in fw_parse_header()
1668 (unsigned long)fmw->size, fw_fixed_hdr->fwsize); in fw_parse_header()
1669 offset = -EINVAL; in fw_parse_header()
1672 offset += 4; in fw_parse_header()
1673 fw_fixed_hdr->ppcver = get_unaligned_be32(&buf[offset]); in fw_parse_header()
1674 offset += 8; in fw_parse_header()
1675 fw_fixed_hdr->drv_ver = get_unaligned_be32(&buf[offset]); in fw_parse_header()
1676 offset += 72; in fw_parse_header()
1679 return offset; in fw_parse_header()
1688 int offset = 0, ret = 0; in tasdevice_dspfw_ready() local
1690 if (!fmw || !fmw->data) { in tasdevice_dspfw_ready()
1691 dev_err(tas_priv->dev, "%s: Failed to read firmware %s\n", in tasdevice_dspfw_ready()
1692 __func__, tas_priv->coef_binaryname); in tasdevice_dspfw_ready()
1693 return -EINVAL; in tasdevice_dspfw_ready()
1696 tas_priv->fmw = kzalloc(sizeof(*tas_priv->fmw), GFP_KERNEL); in tasdevice_dspfw_ready()
1697 if (!tas_priv->fmw) in tasdevice_dspfw_ready()
1698 return -ENOMEM; in tasdevice_dspfw_ready()
1699 tas_fmw = tas_priv->fmw; in tasdevice_dspfw_ready()
1700 tas_fmw->dev = tas_priv->dev; in tasdevice_dspfw_ready()
1701 offset = fw_parse_header(tas_priv, tas_fmw, fmw, offset); in tasdevice_dspfw_ready()
1703 if (offset == -EINVAL) in tasdevice_dspfw_ready()
1704 return -EINVAL; in tasdevice_dspfw_ready()
1706 fw_fixed_hdr = &tas_fmw->fw_hdr.fixed_hdr; in tasdevice_dspfw_ready()
1708 switch (fw_fixed_hdr->drv_ver) { in tasdevice_dspfw_ready()
1713 tas_priv->fw_parse_variable_header = in tasdevice_dspfw_ready()
1715 tas_priv->fw_parse_program_data = in tasdevice_dspfw_ready()
1717 tas_priv->fw_parse_configuration_data = in tasdevice_dspfw_ready()
1719 tas_priv->tasdevice_load_block = in tasdevice_dspfw_ready()
1724 tas_priv->fw_parse_variable_header = in tasdevice_dspfw_ready()
1726 tas_priv->fw_parse_program_data = in tasdevice_dspfw_ready()
1728 tas_priv->fw_parse_configuration_data = in tasdevice_dspfw_ready()
1730 tas_priv->tasdevice_load_block = in tasdevice_dspfw_ready()
1735 fw_fixed_hdr->drv_ver, fw_fixed_hdr->ppcver); in tasdevice_dspfw_ready()
1741 offset = tas_priv->fw_parse_variable_header(tas_priv, fmw, offset); in tasdevice_dspfw_ready()
1742 if (offset < 0) in tasdevice_dspfw_ready()
1743 return offset; in tasdevice_dspfw_ready()
1745 offset = tas_priv->fw_parse_program_data(tas_priv, tas_fmw, fmw, in tasdevice_dspfw_ready()
1746 offset); in tasdevice_dspfw_ready()
1747 if (offset < 0) in tasdevice_dspfw_ready()
1748 return offset; in tasdevice_dspfw_ready()
1750 offset = tas_priv->fw_parse_configuration_data(tas_priv, in tasdevice_dspfw_ready()
1751 tas_fmw, fmw, offset); in tasdevice_dspfw_ready()
1752 if (offset < 0) in tasdevice_dspfw_ready()
1753 ret = offset; in tasdevice_dspfw_ready()
1765 ret = request_firmware(&fw_entry, tas_priv->coef_binaryname, in tasdevice_spi_dsp_parser()
1766 tas_priv->dev); in tasdevice_spi_dsp_parser()
1768 dev_err(tas_priv->dev, "%s: load %s error\n", __func__, in tasdevice_spi_dsp_parser()
1769 tas_priv->coef_binaryname); in tasdevice_spi_dsp_parser()
1780 /* DSP firmware program block data remove function. */
1790 tas_dt = &prog->dev_data; in tasdev_dsp_prog_blk_remove()
1792 if (!tas_dt->dev_blks) in tasdev_dsp_prog_blk_remove()
1795 for (i = 0; i < tas_dt->nr_blk; i++) { in tasdev_dsp_prog_blk_remove()
1796 blk = &tas_dt->dev_blks[i]; in tasdev_dsp_prog_blk_remove()
1797 kfree(blk->data); in tasdev_dsp_prog_blk_remove()
1799 kfree(tas_dt->dev_blks); in tasdev_dsp_prog_blk_remove()
1802 /* DSP firmware program block data remove function. */
1813 /* DSP firmware config block data remove function. */
1821 tas_dt = &cfg->dev_data; in tasdev_dsp_cfg_blk_remove()
1823 if (!tas_dt->dev_blks) in tasdev_dsp_cfg_blk_remove()
1826 for (i = 0; i < tas_dt->nr_blk; i++) { in tasdev_dsp_cfg_blk_remove()
1827 blk = &tas_dt->dev_blks[i]; in tasdev_dsp_cfg_blk_remove()
1828 kfree(blk->data); in tasdev_dsp_cfg_blk_remove()
1830 kfree(tas_dt->dev_blks); in tasdev_dsp_cfg_blk_remove()
1850 if (!tas_dev->fmw) in tasdevice_spi_dsp_remove()
1853 if (tas_dev->fmw->programs) in tasdevice_spi_dsp_remove()
1854 tasdev_dsp_prog_remove(tas_dev->fmw->programs, in tasdevice_spi_dsp_remove()
1855 tas_dev->fmw->nr_programs); in tasdevice_spi_dsp_remove()
1856 if (tas_dev->fmw->configs) in tasdevice_spi_dsp_remove()
1857 tasdev_dsp_cfg_remove(tas_dev->fmw->configs, in tasdevice_spi_dsp_remove()
1858 tas_dev->fmw->nr_configurations); in tasdevice_spi_dsp_remove()
1859 kfree(tas_dev->fmw); in tasdevice_spi_dsp_remove()
1860 tas_dev->fmw = NULL; in tasdevice_spi_dsp_remove()
1867 struct tasdev_blk *block; in tas2781_clear_calfirmware() local
1871 if (!tas_fmw->calibrations) in tas2781_clear_calfirmware()
1874 for (i = 0; i < tas_fmw->nr_calibrations; i++) { in tas2781_clear_calfirmware()
1875 calibration = &tas_fmw->calibrations[i]; in tas2781_clear_calfirmware()
1879 if (!calibration->dev_data.dev_blks) in tas2781_clear_calfirmware()
1882 for (blks = 0; blks < calibration->dev_data.nr_blk; blks++) { in tas2781_clear_calfirmware()
1883 block = &calibration->dev_data.dev_blks[blks]; in tas2781_clear_calfirmware()
1884 if (!block) in tas2781_clear_calfirmware()
1886 kfree(block->data); in tas2781_clear_calfirmware()
1888 kfree(calibration->dev_data.dev_blks); in tas2781_clear_calfirmware()
1890 kfree(tas_fmw->calibrations); in tas2781_clear_calfirmware()
1900 if (tas_priv->cali_data_fmw) { in tasdevice_spi_calbin_remove()
1901 tas2781_clear_calfirmware(tas_priv->cali_data_fmw); in tasdevice_spi_calbin_remove()
1902 tas_priv->cali_data_fmw = NULL; in tasdevice_spi_calbin_remove()
1910 struct tasdevice_rca *rca = &tas_priv->rcabin; in tasdevice_spi_config_info_remove()
1911 struct tasdevice_config_info **ci = rca->cfg_info; in tasdevice_spi_config_info_remove()
1916 for (i = 0; i < rca->ncfgs; i++) { in tasdevice_spi_config_info_remove()
1919 if (ci[i]->blk_data) { in tasdevice_spi_config_info_remove()
1920 for (j = 0; j < ci[i]->real_nblocks; j++) { in tasdevice_spi_config_info_remove()
1921 if (!ci[i]->blk_data[j]) in tasdevice_spi_config_info_remove()
1923 kfree(ci[i]->blk_data[j]->regdata); in tasdevice_spi_config_info_remove()
1924 kfree(ci[i]->blk_data[j]); in tasdevice_spi_config_info_remove()
1926 kfree(ci[i]->blk_data); in tasdevice_spi_config_info_remove()
1933 /* DSP firmware program block data load function. */
1937 struct tasdev_blk *block; in tasdevice_load_data() local
1941 for (i = 0; i < dev_data->nr_blk; i++) { in tasdevice_load_data()
1942 block = &dev_data->dev_blks[i]; in tasdevice_load_data()
1943 ret = tas_priv->tasdevice_load_block(tas_priv, block); in tasdevice_load_data()
1955 struct tasdevice_fw *tas_fmw = tas_priv->fmw; in tasdevice_spi_prmg_load()
1961 dev_err(tas_priv->dev, "%s: Firmware is NULL\n", __func__); in tasdevice_spi_prmg_load()
1962 return -EINVAL; in tasdevice_spi_prmg_load()
1964 if (prm_no >= 0 && prm_no <= tas_fmw->nr_programs) { in tasdevice_spi_prmg_load()
1965 tas_priv->cur_conf = 0; in tasdevice_spi_prmg_load()
1966 tas_priv->is_loading = true; in tasdevice_spi_prmg_load()
1967 program = &tas_fmw->programs[prm_no]; in tasdevice_spi_prmg_load()
1968 ret = tasdevice_load_data(tas_priv, &program->dev_data); in tasdevice_spi_prmg_load()
1970 dev_err(tas_priv->dev, "Program failed %d.\n", ret); in tasdevice_spi_prmg_load()
1973 tas_priv->cur_prog = prm_no; in tasdevice_spi_prmg_load()
1975 conf = &tas_fmw->configs[tas_priv->cur_conf]; in tasdevice_spi_prmg_load()
1976 ret = tasdevice_load_data(tas_priv, &conf->dev_data); in tasdevice_spi_prmg_load()
1978 dev_err(tas_priv->dev, "Config failed %d.\n", ret); in tasdevice_spi_prmg_load()
1980 dev_err(tas_priv->dev, in tasdevice_spi_prmg_load()
1982 __func__, prm_no, tas_fmw->nr_programs); in tasdevice_spi_prmg_load()
1983 return -EINVAL; in tasdevice_spi_prmg_load()
1993 int profile_cfg_id = tas_priv->rcabin.profile_cfg_id; in tasdevice_spi_tuning_switch()
1995 if (tas_priv->fw_state == TASDEVICE_DSP_FW_FAIL) { in tasdevice_spi_tuning_switch()
1996 dev_err(tas_priv->dev, "DSP bin file not loaded\n"); in tasdevice_spi_tuning_switch()