ASoC: tas2781: fixed compiling issue in m68k
authorShenghao Ding <shenghao-ding@ti.com>
Mon, 2 Oct 2023 09:04:33 +0000 (17:04 +0800)
committerMark Brown <broonie@kernel.org>
Mon, 2 Oct 2023 13:06:27 +0000 (14:06 +0100)
fixed m68k compiling issue: mapping table can save code field; storing the
dev_idx as a member of block can reduce unnecessary  time and system
resource comsumption of dev_idx mapping every time the block data writing
to the dsp.

Signed-off-by: Shenghao Ding <shenghao-ding@ti.com>
Link: https://lore.kernel.org/r/20231002090434.1896-1-shenghao-ding@ti.com
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/tas2781-dsp.h
sound/soc/codecs/tas2781-fmwlib.c

index bd1b72bf47a5e4859e26bb16e29156529f05e241..ea9af2726a53ffec6fc36273d7ced8fc2d3759db 100644 (file)
@@ -77,6 +77,11 @@ struct tasdev_blk {
        unsigned int nr_cmds;
        unsigned int blk_size;
        unsigned int nr_subblocks;
+       /* fixed m68k compiling issue, storing the dev_idx as a member of block
+        * can reduce unnecessary timeand system resource comsumption of
+        * dev_idx mapping every time the block data writing to the dsp.
+        */
+       unsigned char dev_idx;
        unsigned char *data;
 };
 
index eb55abae0d7bbb336e3c0b9d0d7bd3da2441481f..e27775d834e90e92cb719a62237850bab7046a33 100644 (file)
@@ -80,10 +80,72 @@ struct tas_crc {
        unsigned char len;
 };
 
+struct blktyp_devidx_map {
+       unsigned char blktyp;
+       unsigned char dev_idx;
+};
+
 static const char deviceNumber[TASDEVICE_DSP_TAS_MAX_DEVICE] = {
        1, 2, 1, 2, 1, 1, 0, 2, 4, 3, 1, 2, 3, 4
 };
 
+/* fixed m68k compiling issue: mapping table can save code field */
+static const struct blktyp_devidx_map ppc3_tas2781_mapping_table[] = {
+       { MAIN_ALL_DEVICES_1X, 0x80 },
+       { MAIN_DEVICE_A_1X, 0x81 },
+       { COEFF_DEVICE_A_1X, 0xC1 },
+       { PRE_DEVICE_A_1X, 0xC1 },
+       { PRE_SOFTWARE_RESET_DEVICE_A, 0xC1 },
+       { POST_SOFTWARE_RESET_DEVICE_A, 0xC1 },
+       { MAIN_DEVICE_B_1X, 0x82 },
+       { COEFF_DEVICE_B_1X, 0xC2 },
+       { PRE_DEVICE_B_1X, 0xC2 },
+       { PRE_SOFTWARE_RESET_DEVICE_B, 0xC2 },
+       { POST_SOFTWARE_RESET_DEVICE_B, 0xC2 },
+       { MAIN_DEVICE_C_1X, 0x83 },
+       { COEFF_DEVICE_C_1X, 0xC3 },
+       { PRE_DEVICE_C_1X, 0xC3 },
+       { PRE_SOFTWARE_RESET_DEVICE_C, 0xC3 },
+       { POST_SOFTWARE_RESET_DEVICE_C, 0xC3 },
+       { MAIN_DEVICE_D_1X, 0x84 },
+       { COEFF_DEVICE_D_1X, 0xC4 },
+       { PRE_DEVICE_D_1X, 0xC4 },
+       { PRE_SOFTWARE_RESET_DEVICE_D, 0xC4 },
+       { POST_SOFTWARE_RESET_DEVICE_D, 0xC4 },
+};
+
+static const struct blktyp_devidx_map ppc3_mapping_table[] = {
+       { MAIN_ALL_DEVICES_1X, 0x80 },
+       { MAIN_DEVICE_A_1X, 0x81 },
+       { COEFF_DEVICE_A_1X, 0xC1 },
+       { PRE_DEVICE_A_1X, 0xC1 },
+       { MAIN_DEVICE_B_1X, 0x82 },
+       { COEFF_DEVICE_B_1X, 0xC2 },
+       { PRE_DEVICE_B_1X, 0xC2 },
+       { MAIN_DEVICE_C_1X, 0x83 },
+       { COEFF_DEVICE_C_1X, 0xC3 },
+       { PRE_DEVICE_C_1X, 0xC3 },
+       { MAIN_DEVICE_D_1X, 0x84 },
+       { COEFF_DEVICE_D_1X, 0xC4 },
+       { PRE_DEVICE_D_1X, 0xC4 },
+};
+
+static const struct blktyp_devidx_map non_ppc3_mapping_table[] = {
+       { MAIN_ALL_DEVICES, 0x80 },
+       { MAIN_DEVICE_A, 0x81 },
+       { COEFF_DEVICE_A, 0xC1 },
+       { PRE_DEVICE_A, 0xC1 },
+       { MAIN_DEVICE_B, 0x82 },
+       { COEFF_DEVICE_B, 0xC2 },
+       { PRE_DEVICE_B, 0xC2 },
+       { MAIN_DEVICE_C, 0x83 },
+       { COEFF_DEVICE_C, 0xC3 },
+       { PRE_DEVICE_C, 0xC3 },
+       { MAIN_DEVICE_D, 0x84 },
+       { COEFF_DEVICE_D, 0xC4 },
+       { PRE_DEVICE_D, 0xC4 },
+};
+
 static struct tasdevice_config_info *tasdevice_add_config(
        struct tasdevice_priv *tas_priv, unsigned char *config_data,
        unsigned int config_size, int *status)
@@ -316,6 +378,37 @@ out:
 }
 EXPORT_SYMBOL_NS_GPL(tasdevice_rca_parser, SND_SOC_TAS2781_FMWLIB);
 
+/* fixed m68k compiling issue: mapping table can save code field */
+static unsigned char map_dev_idx(struct tasdevice_fw *tas_fmw,
+       struct tasdev_blk *block)
+{
+
+       struct blktyp_devidx_map *p =
+               (struct blktyp_devidx_map *)non_ppc3_mapping_table;
+       struct tasdevice_dspfw_hdr *fw_hdr = &(tas_fmw->fw_hdr);
+       struct tasdevice_fw_fixed_hdr *fw_fixed_hdr = &(fw_hdr->fixed_hdr);
+
+       int i, n = ARRAY_SIZE(non_ppc3_mapping_table);
+       unsigned char dev_idx = 0;
+
+       if (fw_fixed_hdr->ppcver >= PPC3_VERSION_TAS2781) {
+               p = (struct blktyp_devidx_map *)ppc3_tas2781_mapping_table;
+               n = ARRAY_SIZE(ppc3_tas2781_mapping_table);
+       } else if (fw_fixed_hdr->ppcver >= PPC3_VERSION) {
+               p = (struct blktyp_devidx_map *)ppc3_mapping_table;
+               n = ARRAY_SIZE(ppc3_mapping_table);
+       }
+
+       for (i = 0; i < n; i++) {
+               if (block->type == p[i].blktyp) {
+                       dev_idx = p[i].dev_idx;
+                       break;
+               }
+       }
+
+       return dev_idx;
+}
+
 static int fw_parse_block_data_kernel(struct tasdevice_fw *tas_fmw,
        struct tasdev_blk *block, const struct firmware *fmw, int offset)
 {
@@ -351,6 +444,14 @@ static int fw_parse_block_data_kernel(struct tasdevice_fw *tas_fmw,
        block->nr_subblocks = be32_to_cpup((__be32 *)&data[offset]);
        offset += 4;
 
+       /* fixed m68k compiling issue:
+        * 1. mapping table can save code field.
+        * 2. storing the dev_idx as a member of block can reduce unnecessary
+        *    time and system resource comsumption of dev_idx mapping every
+        *    time the block data writing to the dsp.
+        */
+       block->dev_idx = map_dev_idx(tas_fmw, block);
+
        if (offset + block->blk_size > fmw->size) {
                dev_err(tas_fmw->dev, "%s: nSublocks error\n", __func__);
                offset = -EINVAL;
@@ -768,144 +869,13 @@ EXPORT_SYMBOL_NS_GPL(tasdevice_select_cfg_blk, SND_SOC_TAS2781_FMWLIB);
 static int tasdevice_load_block_kernel(
        struct tasdevice_priv *tasdevice, struct tasdev_blk *block)
 {
-       struct tasdevice_dspfw_hdr *fw_hdr = &(tasdevice->fmw->fw_hdr);
-       struct tasdevice_fw_fixed_hdr *fw_fixed_hdr = &(fw_hdr->fixed_hdr);
        const unsigned int blk_size = block->blk_size;
        unsigned int i, length;
        unsigned char *data = block->data;
-       unsigned char dev_idx = 0;
-
-       if (fw_fixed_hdr->ppcver >= PPC3_VERSION_TAS2781) {
-               switch (block->type) {
-               case MAIN_ALL_DEVICES_1X:
-                       dev_idx = 0x80;
-                       break;
-               case MAIN_DEVICE_A_1X:
-                       dev_idx = 0x81;
-                       break;
-               case COEFF_DEVICE_A_1X:
-               case PRE_DEVICE_A_1X:
-               case PRE_SOFTWARE_RESET_DEVICE_A:
-               case POST_SOFTWARE_RESET_DEVICE_A:
-                       dev_idx = 0xC1;
-                       break;
-               case MAIN_DEVICE_B_1X:
-                       dev_idx = 0x82;
-                       break;
-               case COEFF_DEVICE_B_1X:
-               case PRE_DEVICE_B_1X:
-               case PRE_SOFTWARE_RESET_DEVICE_B:
-               case POST_SOFTWARE_RESET_DEVICE_B:
-                       dev_idx = 0xC2;
-                       break;
-               case MAIN_DEVICE_C_1X:
-                       dev_idx = 0x83;
-                       break;
-               case COEFF_DEVICE_C_1X:
-               case PRE_DEVICE_C_1X:
-               case PRE_SOFTWARE_RESET_DEVICE_C:
-               case POST_SOFTWARE_RESET_DEVICE_C:
-                       dev_idx = 0xC3;
-                       break;
-               case MAIN_DEVICE_D_1X:
-                       dev_idx = 0x84;
-                       break;
-               case COEFF_DEVICE_D_1X:
-               case PRE_DEVICE_D_1X:
-               case PRE_SOFTWARE_RESET_DEVICE_D:
-               case POST_SOFTWARE_RESET_DEVICE_D:
-                       dev_idx = 0xC4;
-                       break;
-               default:
-                       dev_info(tasdevice->dev,
-                               "%s: load block: Other Type = 0x%02x\n",
-                               __func__, block->type);
-                       break;
-               }
-       } else if (fw_fixed_hdr->ppcver >=
-       PPC3_VERSION) {
-               switch (block->type) {
-               case MAIN_ALL_DEVICES_1X:
-                       dev_idx = 0x80;
-                       break;
-               case MAIN_DEVICE_A_1X:
-                       dev_idx = 0x81;
-                       break;
-               case COEFF_DEVICE_A_1X:
-               case PRE_DEVICE_A_1X:
-                       dev_idx = 0xC1;
-                       break;
-               case MAIN_DEVICE_B_1X:
-                       dev_idx = 0x82;
-                       break;
-               case COEFF_DEVICE_B_1X:
-               case PRE_DEVICE_B_1X:
-                       dev_idx = 0xC2;
-                       break;
-               case MAIN_DEVICE_C_1X:
-                       dev_idx = 0x83;
-                       break;
-               case COEFF_DEVICE_C_1X:
-               case PRE_DEVICE_C_1X:
-                       dev_idx = 0xC3;
-                       break;
-               case MAIN_DEVICE_D_1X:
-                       dev_idx = 0x84;
-                       break;
-               case COEFF_DEVICE_D_1X:
-               case PRE_DEVICE_D_1X:
-                       dev_idx = 0xC4;
-                       break;
-               default:
-                       dev_info(tasdevice->dev,
-                               "%s: load block: Other Type = 0x%02x\n",
-                               __func__, block->type);
-                       break;
-               }
-       } else {
-               switch (block->type) {
-               case MAIN_ALL_DEVICES:
-                       dev_idx = 0|0x80;
-                       break;
-               case MAIN_DEVICE_A:
-                       dev_idx = 0x81;
-                       break;
-               case COEFF_DEVICE_A:
-               case PRE_DEVICE_A:
-                       dev_idx = 0xC1;
-                       break;
-               case MAIN_DEVICE_B:
-                       dev_idx = 0x82;
-                       break;
-               case COEFF_DEVICE_B:
-               case PRE_DEVICE_B:
-                       dev_idx = 0xC2;
-                       break;
-               case MAIN_DEVICE_C:
-                       dev_idx = 0x83;
-                       break;
-               case COEFF_DEVICE_C:
-               case PRE_DEVICE_C:
-                       dev_idx = 0xC3;
-                       break;
-               case MAIN_DEVICE_D:
-                       dev_idx = 0x84;
-                       break;
-               case COEFF_DEVICE_D:
-               case PRE_DEVICE_D:
-                       dev_idx = 0xC4;
-                       break;
-               default:
-                       dev_info(tasdevice->dev,
-                               "%s: load block: Other Type = 0x%02x\n",
-                               __func__, block->type);
-                       break;
-               }
-       }
 
        for (i = 0, length = 0; i < block->nr_subblocks; i++) {
                int rc = tasdevice_process_block(tasdevice, data + length,
-                       dev_idx, blk_size - length);
+                       block->dev_idx, blk_size - length);
                if (rc < 0) {
                        dev_err(tasdevice->dev,
                                "%s: %u %u sublock write error\n",