OSDN Git Service

ASoC: msm: qdsp6v2: Add TDM support for PCM compressed mode
authorJosh Kirsch <jkirsch@codeaurora.org>
Thu, 5 Jan 2017 01:59:30 +0000 (17:59 -0800)
committerKarthikeyan Mani <kmani@codeaurora.org>
Mon, 13 Feb 2017 09:08:43 +0000 (01:08 -0800)
Add support for 352800 sampling rates and 32 bps for the TDM.
Add support for PCM compress passthough mode with mixer controls.

CRs-fixed: 1116515
Change-Id: Iab059a5a6b6ce8f57717023467677a399a60032e
Signed-off-by: Josh Kirsch <jkirsch@codeaurora.org>
Signed-off-by: Karthikeyan Mani <kmani@codeaurora.org>
include/sound/apr_audio-v2.h
include/sound/q6afe-v2.h
include/sound/q6asm-v2.h
sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c
sound/soc/msm/qdsp6v2/msm-pcm-q6-v2.c
sound/soc/msm/qdsp6v2/msm-pcm-q6-v2.h
sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c
sound/soc/msm/qdsp6v2/q6afe.c
sound/soc/msm/qdsp6v2/q6asm.c

index 3d3a202..db55e9b 100644 (file)
@@ -1818,11 +1818,14 @@ struct afe_port_data_cmd_rt_proxy_port_read_v2 {
 #define AFE_PORT_SAMPLE_RATE_16K          16000
 #define AFE_PORT_SAMPLE_RATE_48K          48000
 #define AFE_PORT_SAMPLE_RATE_96K          96000
+#define AFE_PORT_SAMPLE_RATE_176P4K       176400
 #define AFE_PORT_SAMPLE_RATE_192K         192000
+#define AFE_PORT_SAMPLE_RATE_352P8K       352800
 #define AFE_LINEAR_PCM_DATA                            0x0
 #define AFE_NON_LINEAR_DATA                            0x1
 #define AFE_LINEAR_PCM_DATA_PACKED_60958 0x2
 #define AFE_NON_LINEAR_DATA_PACKED_60958 0x3
+#define AFE_GENERIC_COMPRESSED           0x8
 
 /* This param id is used to configure I2S interface */
 #define AFE_PARAM_ID_I2S_CONFIG        0x0001020D
@@ -2755,25 +2758,31 @@ struct afe_param_id_tdm_cfg {
        - #AFE_PORT_SAMPLE_RATE_16K
        - #AFE_PORT_SAMPLE_RATE_24K
        - #AFE_PORT_SAMPLE_RATE_32K
-       - #AFE_PORT_SAMPLE_RATE_48K @tablebulletend */
+       - #AFE_PORT_SAMPLE_RATE_48K
+       - #AFE_PORT_SAMPLE_RATE_176P4K
+       - #AFE_PORT_SAMPLE_RATE_352P8K @tablebulletend
+       */
 
        u32     bit_width;
        /**< Bit width of the sample.
-       @values 16, 24 */
+       * @values 16, 24, 32
+       */
 
        u16     data_format;
-       /**< Data format: linear and compressed
-
+       /**< Data format: linear ,compressed, generic compresssed
        @values
        - #AFE_LINEAR_PCM_DATA
-       - #AFE_NON_LINEAR_DATA @tablebulletend */
+       - #AFE_NON_LINEAR_DATA
+       - #AFE_GENERIC_COMPRESSED
+       */
 
        u16     sync_mode;
        /**< TDM synchronization setting.
        @values (short, long, slot) sync mode
        - #AFE_PORT_TDM_SHORT_SYNC_BIT_MODE
        - #AFE_PORT_TDM_LONG_SYNC_MODE
-       - #AFE_PORT_TDM_SHORT_SYNC_SLOT_MODE @tablebulletend */
+       - #AFE_PORT_TDM_SHORT_SYNC_SLOT_MODE @tablebulletend
+       */
 
        u16     sync_src;
        /**< Synchronization source.
@@ -3629,7 +3638,7 @@ struct afe_lpass_core_shared_clk_config_command {
 #define DEFAULT_COPP_TOPOLOGY                          0x00010314
 #define DEFAULT_POPP_TOPOLOGY                          0x00010BE4
 #define COMPRESSED_PASSTHROUGH_DEFAULT_TOPOLOGY         0x0001076B
-#define COMPRESS_PASSTHROUGH_NONE_TOPOLOGY      0x00010774
+#define COMPRESSED_PASSTHROUGH_NONE_TOPOLOGY            0x00010774
 #define VPM_TX_SM_ECNS_COPP_TOPOLOGY                   0x00010F71
 #define VPM_TX_DM_FLUENCE_COPP_TOPOLOGY                        0x00010F72
 #define VPM_TX_QMIC_FLUENCE_COPP_TOPOLOGY              0x00010F75
@@ -3935,6 +3944,8 @@ struct asm_softvolume_params {
 
 #define ASM_MEDIA_FMT_EVRCWB_FS 0x00010BF0
 
+#define ASM_MEDIA_FMT_GENERIC_COMPRESSED  0x00013212
+
 #define ASM_MAX_EQ_BANDS 12
 
 #define ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2 0x00010D98
@@ -3944,6 +3955,40 @@ u32                    fmt_blk_size;
        /* Media format block size in bytes.*/
 }  __packed;
 
+struct asm_generic_compressed_fmt_blk_t {
+       struct apr_hdr hdr;
+       struct asm_data_cmd_media_fmt_update_v2 fmt_blk;
+
+       /*
+        * Channel mapping array of bitstream output.
+        * Channel[i] mapping describes channel i inside the buffer, where
+        * i < num_channels. All valid used channels must be
+        * present at the beginning of the array.
+        */
+       uint8_t channel_mapping[8];
+
+       /*
+        * Number of channels of the incoming bitstream.
+        * Supported values: 1,2,3,4,5,6,7,8
+        */
+       uint16_t num_channels;
+
+       /*
+        * Nominal bits per sample value of the incoming bitstream.
+        * Supported values: 16, 32
+        */
+       uint16_t bits_per_sample;
+
+       /*
+        * Nominal sampling rate of the incoming bitstream.
+        * Supported values: 8000, 11025, 16000, 22050, 24000, 32000,
+        *                   44100, 48000, 88200, 96000, 176400, 192000,
+        *                   352800, 384000
+        */
+       uint32_t sampling_rate;
+
+} __packed;
+
 struct asm_multi_channel_pcm_fmt_blk_v2 {
        struct apr_hdr hdr;
        struct asm_data_cmd_media_fmt_update_v2 fmt_blk;
@@ -10203,6 +10248,7 @@ enum {
        COMPRESSED_PASSTHROUGH_CONVERT,
        COMPRESSED_PASSTHROUGH_DSD,
        LISTEN,
+       COMPRESSED_PASSTHROUGH_GEN,
 };
 
 #define AUDPROC_MODULE_ID_COMPRESSED_MUTE                0x00010770
index e4033e7..51ece4d 100644 (file)
@@ -364,6 +364,6 @@ int afe_send_custom_tdm_header_cfg(
        struct afe_param_id_custom_tdm_header_cfg *custom_tdm_header_cfg,
        u16 port_id);
 int afe_tdm_port_start(u16 port_id, struct afe_tdm_port_config *tdm_port,
-               u32 rate);
+                      u32 rate, u16 num_groups);
 void afe_set_routing_callback(routing_cb);
 #endif /* __Q6AFE_V2_H__ */
index 9a3db9a..76bb795 100644 (file)
@@ -54,6 +54,7 @@
 #define FORMAT_DTS          0x001c
 #define FORMAT_DSD          0x001d
 #define FORMAT_APTX         0x001e
+#define FORMAT_GEN_COMPR    0x001f
 
 #define ENCDEC_SBCBITRATE   0x0001
 #define ENCDEC_IMMEDIATE_DECODE 0x0002
@@ -500,6 +501,11 @@ int q6asm_media_format_block_multi_ch_pcm_v2(
                        uint32_t rate, uint32_t channels,
                        bool use_default_chmap, char *channel_map,
                        uint16_t bits_per_sample);
+int q6asm_media_format_block_gen_compr(
+                       struct audio_client *ac,
+                       uint32_t rate, uint32_t channels,
+                       bool use_default_chmap, char *channel_map,
+                       uint16_t bits_per_sample);
 
 int q6asm_media_format_block_multi_ch_pcm_v3(struct audio_client *ac,
                                             uint32_t rate, uint32_t channels,
index f081ef0..19e2fad 100644 (file)
@@ -219,6 +219,7 @@ struct msm_dai_q6_tdm_dai_data {
        u32 rate;
        u32 channels;
        u32 bitwidth;
+       u32 num_group_ports;
        struct afe_clk_set clk_set; /* hold LPASS clock config. */
        union afe_port_group_config group_cfg; /* hold tdm group config */
        struct afe_tdm_port_config port_cfg; /* hold tdm config */
@@ -260,6 +261,7 @@ static const struct soc_enum sb_config_enum[] = {
 static const char *const tdm_data_format[] = {
        "LPCM",
        "Compr",
+       "Gen Compr"
 };
 
 static const char *const tdm_header_type[] = {
@@ -269,8 +271,8 @@ static const char *const tdm_header_type[] = {
 };
 
 static const struct soc_enum tdm_config_enum[] = {
-       SOC_ENUM_SINGLE_EXT(2, tdm_data_format),
-       SOC_ENUM_SINGLE_EXT(3, tdm_header_type),
+       SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tdm_data_format), tdm_data_format),
+       SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tdm_header_type), tdm_header_type),
 };
 
 static DEFINE_MUTEX(tdm_mutex);
@@ -298,6 +300,8 @@ static struct afe_param_id_group_device_tdm_cfg tdm_group_cfg = {
        0xFF,
 };
 
+static u32 num_tdm_group_ports;
+
 static struct afe_clk_set tdm_clk_set = {
        AFE_API_VERSION_CLOCK_SET,
        Q6AFE_LPASS_CLK_ID_QUAD_TDM_EBIT,
@@ -4981,7 +4985,6 @@ static struct platform_driver msm_dai_q6_spdif_driver = {
 static int msm_dai_tdm_q6_probe(struct platform_device *pdev)
 {
        int rc = 0;
-       u32 num_ports = 0;
        const uint32_t *port_id_array = NULL;
        uint32_t array_length = 0;
        int i = 0;
@@ -5004,18 +5007,19 @@ static int msm_dai_tdm_q6_probe(struct platform_device *pdev)
 
        rc = of_property_read_u32(pdev->dev.of_node,
                "qcom,msm-cpudai-tdm-group-num-ports",
-               &num_ports);
+               &num_tdm_group_ports);
        if (rc) {
                dev_err(&pdev->dev, "%s: Group Num Ports from DT file %s\n",
                        __func__, "qcom,msm-cpudai-tdm-group-num-ports");
                goto rtn;
        }
        dev_dbg(&pdev->dev, "%s: Group Num Ports from DT file 0x%x\n",
-               __func__, num_ports);
+               __func__, num_tdm_group_ports);
 
-       if (num_ports > AFE_GROUP_DEVICE_NUM_PORTS) {
+       if (num_tdm_group_ports > AFE_GROUP_DEVICE_NUM_PORTS) {
                dev_err(&pdev->dev, "%s Group Num Ports %d greater than Max %d\n",
-                       __func__, num_ports, AFE_GROUP_DEVICE_NUM_PORTS);
+                       __func__, num_tdm_group_ports,
+                       AFE_GROUP_DEVICE_NUM_PORTS);
                rc = -EINVAL;
                goto rtn;
        }
@@ -5029,18 +5033,19 @@ static int msm_dai_tdm_q6_probe(struct platform_device *pdev)
                rc = -EINVAL;
                goto rtn;
        }
-       if (array_length != sizeof(uint32_t) * num_ports) {
+       if (array_length != sizeof(uint32_t) * num_tdm_group_ports) {
                dev_err(&pdev->dev, "%s array_length is %d, expected is %zd\n",
-                       __func__, array_length, sizeof(uint32_t) * num_ports);
+                       __func__, array_length,
+                       sizeof(uint32_t) * num_tdm_group_ports);
                rc = -EINVAL;
                goto rtn;
        }
 
-       for (i = 0; i < num_ports; i++)
+       for (i = 0; i < num_tdm_group_ports; i++)
                tdm_group_cfg.port_id[i] =
                        (u16)be32_to_cpu(port_id_array[i]);
        /* Unused index should be filled with 0 or AFE_PORT_INVALID */
-       for (i = num_ports; i < AFE_GROUP_DEVICE_NUM_PORTS; i++)
+       for (i = num_tdm_group_ports; i < AFE_GROUP_DEVICE_NUM_PORTS; i++)
                tdm_group_cfg.port_id[i] =
                        AFE_PORT_INVALID;
 
@@ -5107,7 +5112,20 @@ static int msm_dai_q6_tdm_data_format_put(struct snd_kcontrol *kcontrol,
        struct msm_dai_q6_tdm_dai_data *dai_data = kcontrol->private_data;
        int value = ucontrol->value.integer.value[0];
 
-       dai_data->port_cfg.tdm.data_format = value;
+       switch (value) {
+       case 0:
+         dai_data->port_cfg.tdm.data_format = AFE_LINEAR_PCM_DATA;
+         break;
+       case 1:
+         dai_data->port_cfg.tdm.data_format = AFE_NON_LINEAR_DATA;
+         break;
+       case 2:
+         dai_data->port_cfg.tdm.data_format = AFE_GENERIC_COMPRESSED;
+         break;
+       default:
+         pr_err("%s: data_format invalid\n", __func__);
+         break;
+       }
        pr_debug("%s: data_format = %d\n",
                __func__, dai_data->port_cfg.tdm.data_format);
        return 0;
@@ -6047,6 +6065,9 @@ static int msm_dai_q6_tdm_set_tdm_slot(struct snd_soc_dai *dai,
 
        /* HW only supports 16 and 8 slots configuration */
        switch (slots) {
+       case 2:
+               cap_mask = 0x03;
+               break;
        case 8:
                cap_mask = 0xFF;
                break;
@@ -6465,17 +6486,25 @@ static int msm_dai_q6_tdm_prepare(struct snd_pcm_substream *substream,
                                        __func__, dai->id);
                                goto rtn;
                        }
-                       rc = afe_port_group_enable(group_id,
-                               &dai_data->group_cfg, true);
-                       if (IS_ERR_VALUE(rc)) {
-                               dev_err(dai->dev, "%s: fail to enable AFE group 0x%x\n",
+
+                       /*
+                        * if only one port, don't do group enable as there
+                        * is no group need for only one port
+                        */
+                       if (dai_data->num_group_ports > 1) {
+                               rc = afe_port_group_enable(group_id,
+                                       &dai_data->group_cfg, true);
+                               if (IS_ERR_VALUE(rc)) {
+                                       dev_err(dai->dev,
+                                       "%s: fail to enable AFE group 0x%x\n",
                                        __func__, group_id);
-                               goto rtn;
+                                       goto rtn;
+                               }
                        }
                }
 
                rc = afe_tdm_port_start(dai->id, &dai_data->port_cfg,
-                       dai_data->rate);
+                       dai_data->rate, dai_data->num_group_ports);
                if (IS_ERR_VALUE(rc)) {
                        if (atomic_read(group_ref) == 0) {
                                afe_port_group_enable(group_id,
@@ -6569,13 +6598,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Primary TDM0 Playback",
                        .aif_name = "PRI_TDM_RX_0",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_PRIMARY_TDM_RX,
@@ -6587,13 +6618,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Primary TDM1 Playback",
                        .aif_name = "PRI_TDM_RX_1",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_PRIMARY_TDM_RX_1,
@@ -6605,13 +6638,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Primary TDM2 Playback",
                        .aif_name = "PRI_TDM_RX_2",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_PRIMARY_TDM_RX_2,
@@ -6623,13 +6658,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Primary TDM3 Playback",
                        .aif_name = "PRI_TDM_RX_3",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_PRIMARY_TDM_RX_3,
@@ -6641,13 +6678,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Primary TDM4 Playback",
                        .aif_name = "PRI_TDM_RX_4",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_PRIMARY_TDM_RX_4,
@@ -6659,13 +6698,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Primary TDM5 Playback",
                        .aif_name = "PRI_TDM_RX_5",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_PRIMARY_TDM_RX_5,
@@ -6677,13 +6718,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Primary TDM6 Playback",
                        .aif_name = "PRI_TDM_RX_6",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_PRIMARY_TDM_RX_6,
@@ -6695,13 +6738,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Primary TDM7 Playback",
                        .aif_name = "PRI_TDM_RX_7",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_PRIMARY_TDM_RX_7,
@@ -6713,13 +6758,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Primary TDM0 Capture",
                        .aif_name = "PRI_TDM_TX_0",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_PRIMARY_TDM_TX,
@@ -6731,13 +6778,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Primary TDM1 Capture",
                        .aif_name = "PRI_TDM_TX_1",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_PRIMARY_TDM_TX_1,
@@ -6749,13 +6798,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Primary TDM2 Capture",
                        .aif_name = "PRI_TDM_TX_2",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_PRIMARY_TDM_TX_2,
@@ -6767,13 +6818,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Primary TDM3 Capture",
                        .aif_name = "PRI_TDM_TX_3",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_PRIMARY_TDM_TX_3,
@@ -6785,13 +6838,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Primary TDM4 Capture",
                        .aif_name = "PRI_TDM_TX_4",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_PRIMARY_TDM_TX_4,
@@ -6803,13 +6858,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Primary TDM5 Capture",
                        .aif_name = "PRI_TDM_TX_5",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_PRIMARY_TDM_TX_5,
@@ -6821,13 +6878,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Primary TDM6 Capture",
                        .aif_name = "PRI_TDM_TX_6",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_PRIMARY_TDM_TX_6,
@@ -6839,13 +6898,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Primary TDM7 Capture",
                        .aif_name = "PRI_TDM_TX_7",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_PRIMARY_TDM_TX_7,
@@ -6857,13 +6918,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Secondary TDM0 Playback",
                        .aif_name = "SEC_TDM_RX_0",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_SECONDARY_TDM_RX,
@@ -6875,13 +6938,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Secondary TDM1 Playback",
                        .aif_name = "SEC_TDM_RX_1",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_SECONDARY_TDM_RX_1,
@@ -6893,13 +6958,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Secondary TDM2 Playback",
                        .aif_name = "SEC_TDM_RX_2",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_SECONDARY_TDM_RX_2,
@@ -6911,13 +6978,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Secondary TDM3 Playback",
                        .aif_name = "SEC_TDM_RX_3",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_SECONDARY_TDM_RX_3,
@@ -6929,13 +6998,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Secondary TDM4 Playback",
                        .aif_name = "SEC_TDM_RX_4",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_SECONDARY_TDM_RX_4,
@@ -6947,13 +7018,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Secondary TDM5 Playback",
                        .aif_name = "SEC_TDM_RX_5",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_SECONDARY_TDM_RX_5,
@@ -6965,13 +7038,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Secondary TDM6 Playback",
                        .aif_name = "SEC_TDM_RX_6",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_SECONDARY_TDM_RX_6,
@@ -6983,13 +7058,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Secondary TDM7 Playback",
                        .aif_name = "SEC_TDM_RX_7",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_SECONDARY_TDM_RX_7,
@@ -7001,13 +7078,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Secondary TDM0 Capture",
                        .aif_name = "SEC_TDM_TX_0",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_SECONDARY_TDM_TX,
@@ -7019,13 +7098,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Secondary TDM1 Capture",
                        .aif_name = "SEC_TDM_TX_1",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_SECONDARY_TDM_TX_1,
@@ -7037,13 +7118,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Secondary TDM2 Capture",
                        .aif_name = "SEC_TDM_TX_2",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_SECONDARY_TDM_TX_2,
@@ -7055,13 +7138,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Secondary TDM3 Capture",
                        .aif_name = "SEC_TDM_TX_3",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_SECONDARY_TDM_TX_3,
@@ -7073,13 +7158,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Secondary TDM4 Capture",
                        .aif_name = "SEC_TDM_TX_4",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_SECONDARY_TDM_TX_4,
@@ -7091,13 +7178,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Secondary TDM5 Capture",
                        .aif_name = "SEC_TDM_TX_5",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_SECONDARY_TDM_TX_5,
@@ -7109,13 +7198,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Secondary TDM6 Capture",
                        .aif_name = "SEC_TDM_TX_6",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_SECONDARY_TDM_TX_6,
@@ -7127,13 +7218,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Secondary TDM7 Capture",
                        .aif_name = "SEC_TDM_TX_7",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_SECONDARY_TDM_TX_7,
@@ -7145,13 +7238,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Tertiary TDM0 Playback",
                        .aif_name = "TERT_TDM_RX_0",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_TERTIARY_TDM_RX,
@@ -7163,13 +7258,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Tertiary TDM1 Playback",
                        .aif_name = "TERT_TDM_RX_1",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_TERTIARY_TDM_RX_1,
@@ -7181,13 +7278,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Tertiary TDM2 Playback",
                        .aif_name = "TERT_TDM_RX_2",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_TERTIARY_TDM_RX_2,
@@ -7199,13 +7298,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Tertiary TDM3 Playback",
                        .aif_name = "TERT_TDM_RX_3",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_TERTIARY_TDM_RX_3,
@@ -7217,13 +7318,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Tertiary TDM4 Playback",
                        .aif_name = "TERT_TDM_RX_4",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_TERTIARY_TDM_RX_4,
@@ -7235,13 +7338,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Tertiary TDM5 Playback",
                        .aif_name = "TERT_TDM_RX_5",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_TERTIARY_TDM_RX_5,
@@ -7253,13 +7358,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Tertiary TDM6 Playback",
                        .aif_name = "TERT_TDM_RX_6",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_TERTIARY_TDM_RX_6,
@@ -7271,13 +7378,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Tertiary TDM7 Playback",
                        .aif_name = "TERT_TDM_RX_7",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_TERTIARY_TDM_RX_7,
@@ -7289,13 +7398,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Tertiary TDM0 Capture",
                        .aif_name = "TERT_TDM_TX_0",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_TERTIARY_TDM_TX,
@@ -7307,13 +7418,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Tertiary TDM1 Capture",
                        .aif_name = "TERT_TDM_TX_1",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_TERTIARY_TDM_TX_1,
@@ -7325,13 +7438,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Tertiary TDM2 Capture",
                        .aif_name = "TERT_TDM_TX_2",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_TERTIARY_TDM_TX_2,
@@ -7343,13 +7458,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Tertiary TDM3 Capture",
                        .aif_name = "TERT_TDM_TX_3",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_TERTIARY_TDM_TX_3,
@@ -7361,13 +7478,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Tertiary TDM4 Capture",
                        .aif_name = "TERT_TDM_TX_4",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_TERTIARY_TDM_TX_4,
@@ -7379,13 +7498,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Tertiary TDM5 Capture",
                        .aif_name = "TERT_TDM_TX_5",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_TERTIARY_TDM_TX_5,
@@ -7397,13 +7518,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Tertiary TDM6 Capture",
                        .aif_name = "TERT_TDM_TX_6",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_TERTIARY_TDM_TX_6,
@@ -7415,13 +7538,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Tertiary TDM7 Capture",
                        .aif_name = "TERT_TDM_TX_7",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_TERTIARY_TDM_TX_7,
@@ -7433,13 +7558,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Quaternary TDM0 Playback",
                        .aif_name = "QUAT_TDM_RX_0",
                        .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 |
-                               SNDRV_PCM_RATE_16000,
+                               SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_QUATERNARY_TDM_RX,
@@ -7451,13 +7578,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Quaternary TDM1 Playback",
                        .aif_name = "QUAT_TDM_RX_1",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_QUATERNARY_TDM_RX_1,
@@ -7469,13 +7598,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Quaternary TDM2 Playback",
                        .aif_name = "QUAT_TDM_RX_2",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_QUATERNARY_TDM_RX_2,
@@ -7487,13 +7618,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Quaternary TDM3 Playback",
                        .aif_name = "QUAT_TDM_RX_3",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_QUATERNARY_TDM_RX_3,
@@ -7505,13 +7638,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Quaternary TDM4 Playback",
                        .aif_name = "QUAT_TDM_RX_4",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_QUATERNARY_TDM_RX_4,
@@ -7523,13 +7658,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Quaternary TDM5 Playback",
                        .aif_name = "QUAT_TDM_RX_5",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_QUATERNARY_TDM_RX_5,
@@ -7541,13 +7678,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Quaternary TDM6 Playback",
                        .aif_name = "QUAT_TDM_RX_6",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_QUATERNARY_TDM_RX_6,
@@ -7559,13 +7698,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Quaternary TDM7 Playback",
                        .aif_name = "QUAT_TDM_RX_7",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_QUATERNARY_TDM_RX_7,
@@ -7577,13 +7718,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Quaternary TDM0 Capture",
                        .aif_name = "QUAT_TDM_TX_0",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_QUATERNARY_TDM_TX,
@@ -7595,13 +7738,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Quaternary TDM1 Capture",
                        .aif_name = "QUAT_TDM_TX_1",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_QUATERNARY_TDM_TX_1,
@@ -7613,13 +7758,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Quaternary TDM2 Capture",
                        .aif_name = "QUAT_TDM_TX_2",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_QUATERNARY_TDM_TX_2,
@@ -7631,13 +7778,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Quaternary TDM3 Capture",
                        .aif_name = "QUAT_TDM_TX_3",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_QUATERNARY_TDM_TX_3,
@@ -7649,13 +7798,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Quaternary TDM4 Capture",
                        .aif_name = "QUAT_TDM_TX_4",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_QUATERNARY_TDM_TX_4,
@@ -7667,13 +7818,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Quaternary TDM5 Capture",
                        .aif_name = "QUAT_TDM_TX_5",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_QUATERNARY_TDM_TX_5,
@@ -7685,13 +7838,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Quaternary TDM6 Capture",
                        .aif_name = "QUAT_TDM_TX_6",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_QUATERNARY_TDM_TX_6,
@@ -7703,13 +7858,15 @@ static struct snd_soc_dai_driver msm_dai_q6_tdm_dai[] = {
                        .stream_name = "Quaternary TDM7 Capture",
                        .aif_name = "QUAT_TDM_TX_7",
                        .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
-                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
+                               SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+                               SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
                        .formats = SNDRV_PCM_FMTBIT_S16_LE |
-                               SNDRV_PCM_FMTBIT_S24_LE,
+                                  SNDRV_PCM_FMTBIT_S24_LE |
+                                  SNDRV_PCM_FMTBIT_S32_LE,
                        .channels_min = 1,
                        .channels_max = 8,
                        .rate_min = 8000,
-                       .rate_max = 48000,
+                       .rate_max = 352800,
                },
                .ops = &msm_dai_q6_tdm_ops,
                .id = AFE_PORT_ID_QUATERNARY_TDM_TX_7,
@@ -7902,6 +8059,9 @@ static int msm_dai_q6_tdm_dev_probe(struct platform_device *pdev)
        dai_data->clk_set = tdm_clk_set;
        /* copy static group cfg per parent node */
        dai_data->group_cfg.tdm_cfg = tdm_group_cfg;
+       /* copy static num group ports per parent node */
+       dai_data->num_group_ports = num_tdm_group_ports;
+
 
        dev_set_drvdata(&pdev->dev, dai_data);
 
index e2f662f..e14f410 100644 (file)
@@ -110,7 +110,7 @@ static struct snd_pcm_hardware msm_pcm_hardware_playback = {
 /* Conventional and unconventional sample rate supported */
 static unsigned int supported_sample_rates[] = {
        8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000,
-       88200, 96000, 176400, 192000, 384000
+       88200, 96000, 176400, 192000, 352800, 384000
 };
 
 static struct snd_pcm_hw_constraint_list constraints_sample_rates = {
@@ -285,6 +285,7 @@ static int msm_pcm_playback_prepare(struct snd_pcm_substream *substream)
        struct msm_plat_data *pdata;
        struct snd_pcm_hw_params *params;
        int ret;
+       uint32_t fmt_type = FORMAT_LINEAR_PCM;
        uint16_t bits_per_sample;
        uint16_t sample_word_size;
 
@@ -333,38 +334,67 @@ static int msm_pcm_playback_prepare(struct snd_pcm_substream *substream)
                sample_word_size = 16;
                break;
        }
+       if (prtd->compress_enable) {
+               fmt_type = FORMAT_GEN_COMPR;
+               pr_debug("%s: Compressed enabled!\n", __func__);
+               ret = q6asm_open_write_compressed(prtd->audio_client, fmt_type,
+                               COMPRESSED_PASSTHROUGH_GEN);
+               if (ret < 0) {
+                       pr_err("%s: q6asm_open_write_compressed failed (%d)\n",
+                       __func__, ret);
+                       q6asm_audio_client_free(prtd->audio_client);
+                       prtd->audio_client = NULL;
+                       return -ENOMEM;
+               }
+       } else {
+               ret = q6asm_open_write_v4(prtd->audio_client,
+                       fmt_type, bits_per_sample);
 
-       ret = q6asm_open_write_v4(prtd->audio_client,
-                                 FORMAT_LINEAR_PCM, bits_per_sample);
+               if (ret < 0) {
+                       pr_err("%s: q6asm_open_write_v4 failed (%d)\n",
+                       __func__, ret);
+                       q6asm_audio_client_free(prtd->audio_client);
+                       prtd->audio_client = NULL;
+                       return -ENOMEM;
+               }
 
-       if (ret < 0) {
-               pr_err("%s: q6asm_open_write_v2 failed\n", __func__);
-               q6asm_audio_client_free(prtd->audio_client);
-               prtd->audio_client = NULL;
-               return -ENOMEM;
+               ret = q6asm_send_cal(prtd->audio_client);
+               if (ret < 0)
+                       pr_debug("%s : Send cal failed : %d", __func__, ret);
        }
-
-       ret = q6asm_send_cal(prtd->audio_client);
-       if (ret < 0)
-               pr_debug("%s : Send cal failed : %d", __func__, ret);
-
        pr_debug("%s: session ID %d\n", __func__,
                        prtd->audio_client->session);
        prtd->session_id = prtd->audio_client->session;
-       ret = msm_pcm_routing_reg_phy_stream(soc_prtd->dai_link->be_id,
+
+       if (prtd->compress_enable) {
+               ret = msm_pcm_routing_reg_phy_compr_stream(
+                               soc_prtd->dai_link->be_id,
+                               prtd->audio_client->perf_mode,
+                               prtd->session_id,
+                               SNDRV_PCM_STREAM_PLAYBACK,
+                               COMPRESSED_PASSTHROUGH_GEN);
+       } else {
+               ret = msm_pcm_routing_reg_phy_stream(soc_prtd->dai_link->be_id,
                        prtd->audio_client->perf_mode,
                        prtd->session_id, substream->stream);
+       }
        if (ret) {
                pr_err("%s: stream reg failed ret:%d\n", __func__, ret);
                return ret;
        }
-
-       ret = q6asm_media_format_block_multi_ch_pcm_v4(
+       if (prtd->compress_enable) {
+               ret = q6asm_media_format_block_gen_compr(
+                       prtd->audio_client, runtime->rate,
+                       runtime->channels, !prtd->set_channel_map,
+                       prtd->channel_map, bits_per_sample);
+       } else {
+               ret = q6asm_media_format_block_multi_ch_pcm_v4(
                                prtd->audio_client, runtime->rate,
                                runtime->channels, !prtd->set_channel_map,
                                prtd->channel_map, bits_per_sample,
                                sample_word_size, ASM_LITTLE_ENDIAN,
                                DEFAULT_QF);
+       }
        if (ret < 0)
                pr_info("%s: CMD Format block failed\n", __func__);
 
@@ -1091,6 +1121,136 @@ static int msm_pcm_add_volume_control(struct snd_soc_pcm_runtime *rtd)
        return 0;
 }
 
+static int msm_pcm_compress_ctl_info(struct snd_kcontrol *kcontrol,
+                               struct snd_ctl_elem_info *uinfo)
+{
+       uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
+       uinfo->count = 1;
+       uinfo->value.integer.min = 0;
+       uinfo->value.integer.max = 0x2000;
+       return 0;
+}
+
+static int msm_pcm_compress_ctl_get(struct snd_kcontrol *kcontrol,
+                     struct snd_ctl_elem_value *ucontrol)
+{
+       struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol);
+       struct snd_soc_platform *platform = snd_soc_component_to_platform(comp);
+       struct msm_plat_data *pdata = dev_get_drvdata(platform->dev);
+       struct snd_pcm_substream *substream;
+       struct msm_audio *prtd;
+
+       if (!pdata) {
+               pr_err("%s pdata is NULL\n", __func__);
+               return -ENODEV;
+       }
+       substream = pdata->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream;
+       if (!substream) {
+               pr_err("%s substream not found\n", __func__);
+               return -EINVAL;
+       }
+       if (!substream->runtime) {
+               pr_err("%s substream runtime not found\n", __func__);
+               return 0;
+       }
+       prtd = substream->runtime->private_data;
+       if (prtd)
+               ucontrol->value.integer.value[0] = prtd->compress_enable;
+       return 0;
+}
+
+static int msm_pcm_compress_ctl_put(struct snd_kcontrol *kcontrol,
+                               struct snd_ctl_elem_value *ucontrol)
+{
+       int rc = 0;
+       struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol);
+       struct snd_soc_platform *platform = snd_soc_component_to_platform(comp);
+       struct msm_plat_data *pdata = dev_get_drvdata(platform->dev);
+       struct snd_pcm_substream *substream;
+       struct msm_audio *prtd;
+       int compress = ucontrol->value.integer.value[0];
+
+       if (!pdata) {
+               pr_err("%s pdata is NULL\n", __func__);
+               return -ENODEV;
+       }
+       substream = pdata->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream;
+       pr_debug("%s: compress : 0x%x\n", __func__, compress);
+       if (!substream) {
+               pr_err("%s substream not found\n", __func__);
+               return -EINVAL;
+       }
+       if (!substream->runtime) {
+               pr_err("%s substream runtime not found\n", __func__);
+               return 0;
+       }
+       prtd = substream->runtime->private_data;
+       if (prtd) {
+               pr_debug("%s: setting compress flag to 0x%x\n",
+               __func__, compress);
+               prtd->compress_enable = compress;
+       }
+       return rc;
+}
+
+static int msm_pcm_add_compress_control(struct snd_soc_pcm_runtime *rtd)
+{
+       const char *mixer_ctl_name = "Playback ";
+       const char *mixer_ctl_end_name = " Compress";
+       const char *deviceNo = "NN";
+       char *mixer_str = NULL;
+       int ctl_len;
+       int ret = 0;
+       struct msm_plat_data *pdata;
+       struct snd_kcontrol_new pcm_compress_control[1] = {
+               {
+               .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+               .name = "?",
+               .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+               .info = msm_pcm_compress_ctl_info,
+               .get = msm_pcm_compress_ctl_get,
+               .put = msm_pcm_compress_ctl_put,
+               .private_value = 0,
+               }
+       };
+
+       if (!rtd) {
+               pr_err("%s: NULL rtd\n", __func__);
+               return -EINVAL;
+       }
+
+       ctl_len = strlen(mixer_ctl_name) + strlen(deviceNo) +
+                 strlen(mixer_ctl_end_name) + 1;
+       mixer_str = kzalloc(ctl_len, GFP_KERNEL);
+
+       if (!mixer_str)
+               return -ENOMEM;
+
+       snprintf(mixer_str, ctl_len, "%s%d%s", mixer_ctl_name,
+                       rtd->pcm->device, mixer_ctl_end_name);
+
+       pcm_compress_control[0].name = mixer_str;
+       pcm_compress_control[0].private_value = rtd->dai_link->be_id;
+       pr_debug("%s: Registering new mixer ctl %s\n", __func__, mixer_str);
+       pdata = dev_get_drvdata(rtd->platform->dev);
+       if (pdata) {
+               if (!pdata->pcm) {
+                       pdata->pcm = rtd->pcm;
+                       snd_soc_add_platform_controls(rtd->platform,
+                                                     pcm_compress_control,
+                                                     ARRAY_SIZE
+                                                     (pcm_compress_control));
+                       pr_debug("%s: add control success plt = %pK\n",
+                                __func__, rtd->platform);
+               }
+       } else {
+               pr_err("%s: NULL pdata\n", __func__);
+               ret = -EINVAL;
+       }
+       kfree(mixer_str);
+       return ret;
+}
+
 static int msm_pcm_chmap_ctl_put(struct snd_kcontrol *kcontrol,
                                struct snd_ctl_elem_value *ucontrol)
 {
@@ -1381,6 +1541,11 @@ static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd)
                pr_err("%s: Could not add pcm Volume Control %d\n",
                        __func__, ret);
 
+       ret = msm_pcm_add_compress_control(rtd);
+       if (ret)
+               pr_err("%s: Could not add pcm Compress Control %d\n",
+                       __func__, ret);
+
        return ret;
 }
 
index 8fe3139..f5ff63f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 2008 Google, Inc.
  * Copyright (C) 2008 HTC Corporation
- * Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
  *
  * This software is licensed under the terms of the GNU General Public
  * License version 2, as published by the Free Software Foundation, and
@@ -109,6 +109,7 @@ struct msm_audio {
        int cmd_interrupt;
        bool meta_data_mode;
        uint32_t volume;
+       bool compress_enable;
        /* array of frame info */
        struct msm_audio_in_frame_info in_frame_info[CAPTURE_MAX_NUM_PERIODS];
 };
@@ -123,6 +124,7 @@ struct output_meta_data_st {
 
 struct msm_plat_data {
        int perf_mode;
+       struct snd_pcm *pcm;
 };
 
 #endif /*_MSM_PCM_H*/
index e93d46b..cfade42 100644 (file)
@@ -1143,8 +1143,10 @@ int msm_pcm_routing_reg_phy_compr_stream(int fe_id, int perf_mode,
                        topology = msm_routing_get_adm_topology(fe_id,
                                                                session_type,
                                                                i);
-                       if (passthr_mode == COMPRESSED_PASSTHROUGH_DSD)
-                               topology = COMPRESS_PASSTHROUGH_NONE_TOPOLOGY;
+                       if ((passthr_mode == COMPRESSED_PASSTHROUGH_DSD)
+                            || (passthr_mode ==
+                            COMPRESSED_PASSTHROUGH_GEN))
+                               topology = COMPRESSED_PASSTHROUGH_NONE_TOPOLOGY;
                        pr_debug("%s: Before adm open topology %d\n", __func__,
                                topology);
 
@@ -1194,7 +1196,9 @@ int msm_pcm_routing_reg_phy_compr_stream(int fe_id, int perf_mode,
                                        num_copps++;
                                }
                        }
-                       if (passthr_mode != COMPRESSED_PASSTHROUGH_DSD) {
+                       if (passthr_mode != COMPRESSED_PASSTHROUGH_DSD
+                           && passthr_mode !=
+                           COMPRESSED_PASSTHROUGH_GEN) {
                                msm_routing_send_device_pp_params(
                                msm_bedais[i].port_id,
                                copp_idx);
@@ -12175,6 +12179,42 @@ static const struct snd_soc_dapm_route intercon[] = {
        {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia16", "MM_DL16"},
        {"QUAT_TDM_RX_0", NULL, "QUAT_TDM_RX_0 Audio Mixer"},
 
+       {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"},
+       {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"},
+       {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"},
+       {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia4", "MM_DL4"},
+       {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia5", "MM_DL5"},
+       {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia6", "MM_DL6"},
+       {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia7", "MM_DL7"},
+       {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia8", "MM_DL8"},
+       {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia9", "MM_DL9"},
+       {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia10", "MM_DL10"},
+       {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia11", "MM_DL11"},
+       {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia12", "MM_DL12"},
+       {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia13", "MM_DL13"},
+       {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia14", "MM_DL14"},
+       {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia15", "MM_DL15"},
+       {"PRI_TDM_RX_0 Audio Mixer", "MultiMedia16", "MM_DL16"},
+       {"PRI_TDM_RX_0", NULL, "PRI_TDM_RX_0 Audio Mixer"},
+
+       {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"},
+       {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"},
+       {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"},
+       {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia4", "MM_DL4"},
+       {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia5", "MM_DL5"},
+       {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia6", "MM_DL6"},
+       {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia7", "MM_DL7"},
+       {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia8", "MM_DL8"},
+       {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia9", "MM_DL9"},
+       {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia10", "MM_DL10"},
+       {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia11", "MM_DL11"},
+       {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia12", "MM_DL12"},
+       {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia13", "MM_DL13"},
+       {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia14", "MM_DL14"},
+       {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia15", "MM_DL15"},
+       {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia16", "MM_DL16"},
+       {"SEC_TDM_RX_0", NULL, "SEC_TDM_RX_0 Audio Mixer"},
+
        {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia1", "MM_DL1"},
        {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia2", "MM_DL2"},
        {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia3", "MM_DL3"},
index be5437a..2b612c9 100644 (file)
@@ -2541,7 +2541,7 @@ fail_cmd:
 }
 
 int afe_tdm_port_start(u16 port_id, struct afe_tdm_port_config *tdm_port,
-               u32 rate)
+                      u32 rate, u16 num_groups)
 {
        struct afe_audioif_config_command config;
        int ret = 0;
@@ -2581,9 +2581,10 @@ int afe_tdm_port_start(u16 port_id, struct afe_tdm_port_config *tdm_port,
                        this_afe.dev_acdb_id[index] = this_afe.rt_cb(port_id);
        }
 
-       /* Also send the topology id here: */
+       /* Also send the topology id here if multiple ports: */
        port_index = afe_get_port_index(port_id);
-       if (!(this_afe.afe_cal_mode[port_index] == AFE_CAL_MODE_NONE)) {
+       if (!(this_afe.afe_cal_mode[port_index] == AFE_CAL_MODE_NONE) &&
+           num_groups > 1) {
                /* One time call: only for first time */
                afe_send_custom_topology();
                afe_send_port_topology_id(port_id);
@@ -2645,11 +2646,14 @@ int afe_tdm_port_start(u16 port_id, struct afe_tdm_port_config *tdm_port,
                ret = -EINVAL;
                goto fail_cmd;
        }
-
-       ret = afe_send_slot_mapping_cfg(&tdm_port->slot_mapping, port_id);
-       if (ret < 0) {
-               pr_err("%s: afe send failed %d\n", __func__, ret);
-               goto fail_cmd;
+       /* slot mapping is not need if there is only one group */
+       if (num_groups > 1) {
+               ret = afe_send_slot_mapping_cfg(&tdm_port->slot_mapping,
+                                               port_id);
+               if (ret < 0) {
+                       pr_err("%s: afe send failed %d\n", __func__, ret);
+                       goto fail_cmd;
+               }
        }
 
        if (tdm_port->custom_tdm_header.header_type) {
index 74fbe98..d55c28f 100644 (file)
@@ -2490,6 +2490,10 @@ int q6asm_open_write_compressed(struct audio_client *ac, uint32_t format,
        case FORMAT_DSD:
                open.fmt_id = ASM_MEDIA_FMT_DSD;
                break;
+       case FORMAT_GEN_COMPR:
+               open.fmt_id = ASM_MEDIA_FMT_GENERIC_COMPRESSED;
+               break;
+
        default:
                pr_err("%s: Invalid format[%d]\n", __func__, format);
                rc = -EINVAL;
@@ -2498,7 +2502,8 @@ int q6asm_open_write_compressed(struct audio_client *ac, uint32_t format,
        /*Below flag indicates the DSP that Compressed audio input
        stream is not IEC 61937 or IEC 60958 packetizied*/
        if (passthrough_flag == COMPRESSED_PASSTHROUGH ||
-               passthrough_flag == COMPRESSED_PASSTHROUGH_DSD) {
+               passthrough_flag == COMPRESSED_PASSTHROUGH_DSD ||
+               passthrough_flag == COMPRESSED_PASSTHROUGH_GEN) {
                open.flags = 0x0;
                pr_debug("%s: Flag 0 COMPRESSED_PASSTHROUGH\n", __func__);
        } else if (passthrough_flag == COMPRESSED_PASSTHROUGH_CONVERT) {
@@ -2665,6 +2670,9 @@ static int __q6asm_open_write(struct audio_client *ac, uint32_t format,
        case FORMAT_APTX:
                open.dec_fmt_id = ASM_MEDIA_FMT_APTX;
                break;
+       case FORMAT_GEN_COMPR:
+               open.dec_fmt_id = ASM_MEDIA_FMT_GENERIC_COMPRESSED;
+               break;
        default:
                pr_err("%s: Invalid format 0x%x\n", __func__, format);
                rc = -EINVAL;
@@ -5191,6 +5199,82 @@ int q6asm_media_format_block_multi_ch_pcm_v4(struct audio_client *ac,
 }
 EXPORT_SYMBOL(q6asm_media_format_block_multi_ch_pcm_v4);
 
+/*
+ * q6asm_media_format_block_gen_compr - set up generic compress format params
+ *
+ * @ac: Client session handle
+ * @rate: sample rate
+ * @channels: number of channels
+ * @use_default_chmap: true if default channel map to be used
+ * @channel_map: input channel map
+ * @bits_per_sample: bit width of gen compress stream
+ */
+int q6asm_media_format_block_gen_compr(struct audio_client *ac,
+                               uint32_t rate, uint32_t channels,
+                               bool use_default_chmap, char *channel_map,
+                               uint16_t bits_per_sample)
+{
+       struct asm_generic_compressed_fmt_blk_t fmt;
+       u8 *channel_mapping;
+       int rc = 0;
+
+       pr_debug("%s: session[%d]rate[%d]ch[%d]bps[%d]\n",
+                __func__, ac->session, rate,
+                channels, bits_per_sample);
+
+       memset(&fmt, 0, sizeof(fmt));
+       q6asm_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE);
+
+       fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2;
+       fmt.fmt_blk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) -
+                                       sizeof(fmt.fmt_blk);
+       fmt.num_channels = channels;
+       fmt.bits_per_sample = bits_per_sample;
+       fmt.sampling_rate = rate;
+
+       channel_mapping = fmt.channel_mapping;
+
+       memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL);
+
+       if (use_default_chmap) {
+               if (q6asm_map_channels(channel_mapping, channels, false)) {
+                       pr_err("%s: map channels failed %d\n",
+                               __func__, channels);
+                       return -EINVAL;
+               }
+       } else {
+               memcpy(channel_mapping, channel_map,
+                      PCM_FORMAT_MAX_NUM_CHANNEL);
+       }
+
+       atomic_set(&ac->cmd_state, -1);
+       rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt);
+       if (rc < 0) {
+               pr_err("%s: Comamnd open failed %d\n", __func__, rc);
+               rc = -EINVAL;
+               goto fail_cmd;
+       }
+       rc = wait_event_timeout(ac->cmd_wait,
+                       (atomic_read(&ac->cmd_state) >= 0), 5*HZ);
+       if (!rc) {
+               pr_err("%s: timeout. waited for format update\n", __func__);
+               rc = -ETIMEDOUT;
+               goto fail_cmd;
+       }
+
+       if (atomic_read(&ac->cmd_state) > 0) {
+               pr_err("%s: DSP returned error[%s]\n",
+                       __func__, adsp_err_get_err_str(
+                       atomic_read(&ac->cmd_state)));
+               rc = adsp_err_get_lnx_err_code(
+                               atomic_read(&ac->cmd_state));
+       }
+       return 0;
+fail_cmd:
+       return rc;
+}
+EXPORT_SYMBOL(q6asm_media_format_block_gen_compr);
+
 static int __q6asm_media_format_block_multi_aac(struct audio_client *ac,
                                struct asm_aac_cfg *cfg, int stream_id)
 {