[alsa-devel] [RFC 6/7] ASoC: hda: Add support for SSP register settings

Vinod Koul vinod.koul at intel.com
Sat Apr 18 22:57:32 CEST 2015


From: Jeeja KP <jeeja.kp at intel.com>

SSP registers needs to be updated for the SSP copier module. Add support to
update the registers based on dai configuration.

Signed-off-by: Hardik T Shah <hardik.t.shah at intel.com>
Signed-off-by: Jeeja KP <jeeja.kp at intel.com>
Signed-off-by: Vinod Koul <vinod.koul at intel.com>
---
 sound/soc/hda/hda_dsp_ssp_config.c |  285 ++++++++++++++++++++++++
 sound/soc/hda/hda_dsp_ssp_config.h |  423 ++++++++++++++++++++++++++++++++++++
 2 files changed, 708 insertions(+)
 create mode 100644 sound/soc/hda/hda_dsp_ssp_config.c
 create mode 100644 sound/soc/hda/hda_dsp_ssp_config.h

diff --git a/sound/soc/hda/hda_dsp_ssp_config.c b/sound/soc/hda/hda_dsp_ssp_config.c
new file mode 100644
index 000000000000..8b79777fb8be
--- /dev/null
+++ b/sound/soc/hda/hda_dsp_ssp_config.c
@@ -0,0 +1,285 @@
+/*
+ *  hda_dsp_ssp_config.c - HDA DSP SSP register configuration functionality
+ *
+ *  Copyright (C) 2015 Intel Corp
+ *  Author:  Hardik Shah <hardik.t.shah at intel.com>
+ *
+ *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; version 2 of the License.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  General Public License for more details.
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ */
+#include "hda_dsp_ssp_config.h"
+#include "hda_skl.h"
+
+#define HDA_SSP_MAX_FREQ_192 19200000
+
+struct hda_ssp_regs {
+	u32 hda_ssc0;
+	u32 hda_ssc1;
+	u32 hda_ssto;
+	u32 hda_sspsp;
+	u32 hda_sstsa;
+	u32 hda_ssrsa;
+	u32 hda_ssc2;
+	u32 hda_sspsp2;
+	u32 hda_ssc3;
+	u32 hda_ssioc;
+};
+
+
+static void azx_set_default_ssp_regs_v1(struct hda_ssp_regs *regs)
+{
+	regs->hda_ssc0 = 0;
+	regs->hda_ssc0 = (HDA_SSC0_FRF_DEF_V1 << HDA_SSC0_FRF_SHIFT) |
+			(HDA_SSC0_ECS_DEF_V1 << HDA_SSC0_ECS_SHIFT) |
+			(HDA_SSC0_SSE_DEF_V1 << HDA_SSC0_SSE_SHIFT) |
+			(HDA_SSC0_NCS_DEF_V1 << HDA_SSC0_NCS_SHIFT) |
+			(HDA_SSC0_RIM_DEF_V1 << HDA_SSC0_RIM_SHIFT) |
+			(HDA_SSC0_ACS_DEF_V1 << HDA_SSC0_ACS_SHIFT) |
+			(HDA_SSC0_MOD_DEF_V1 << HDA_SSC0_MOD_SHIFT);
+
+	regs->hda_ssc1 = 0;
+	regs->hda_ssc1 = (HDA_SSC1_RIE_DEF_V1 << HDA_SSC1_RIE_SHIFT) |
+			(HDA_SSC1_TIE_DEF_V1 << HDA_SSC1_TIE_SHIFT) |
+			(HDA_SSC1_LBM_DEF_V1 << HDA_SSC1_LBM_SHIFT) |
+			(HDA_SSC1_SPO_DEF_V1 << HDA_SSC1_SPO_SHIFT) |
+			(HDA_SSC1_SPH_DEF_V1 << HDA_SSC1_SPH_SHIFT) |
+			(HDA_SSC1_MWDS_DEF_V1 << HDA_SSC1_MWDS_SHIFT) |
+			(HDA_SSC1_EFWR_DEF_V1 << HDA_SSC1_EFWR_SHIFT) |
+			(HDA_SSC1_STRF_DEF_V1 << HDA_SSC1_STRF_SHIFT) |
+			(HDA_SSC1_IFS_DEF_V1 << HDA_SSC1_IFS_SHIFT) |
+			(HDA_SSC1_PINTE_DEF_V1 << HDA_SSC1_PINTE_SHIFT) |
+			(HDA_SSC1_TINTE_DEF_V1 << HDA_SSC1_TINTE_SHIFT) |
+			(HDA_SSC1_RSRE_DEF_V1 << HDA_SSC1_RSRE_SHIFT) |
+			(HDA_SSC1_TSRE_DEF_V1 << HDA_SSC1_TSRE_SHIFT) |
+			(HDA_SSC1_TRAIL_DEF_V1 << HDA_SSC1_TRAIL_SHIFT) |
+			(HDA_SSC1_RWOT_DEF_V1 << HDA_SSC1_RWOT_SHIFT) |
+			(HDA_SSC1_ECRB_DEF_V1 << HDA_SSC1_ECRB_SHIFT) |
+			(HDA_SSC1_ECRA_DEF_V1 << HDA_SSC1_ECRA_SHIFT) |
+			(HDA_SSC1_SCFR_DEF_V1 << HDA_SSC1_SCFR_SHIFT) |
+			(HDA_SSC1_EBCEI_DEF_V1 << HDA_SSC1_EBCEI_SHIFT) |
+			(HDA_SSC1_TTE_DEF_V1 << HDA_SSC1_TTE_SHIFT) |
+			(HDA_SSC1_TTELP_DEF_V1 << HDA_SSC1_TTELP_SHIFT);
+
+	regs->hda_ssto = 0;
+	regs->hda_ssto = HDA_SST0_TIMEOUT_DEF_V1 << HDA_SST0_TIMEOUT_SHIFT;
+
+	regs->hda_sspsp = 0;
+	regs->hda_sspsp = (HDA_SSPSP_ETDS_DEF_V1 << HDA_SSPSP_ETDS_SHIFT) |
+			(HDA_SSPSP_STRTDLY_DEF_V1 << HDA_SSPSP_STRTDLY_SHIFT) |
+			(HDA_SSPSP_DMYSTRT_DEF_V1 << HDA_SSPSP_DMYSTRT_SHIFT) |
+			(HDA_SSPSP_SFRMDLY_DEF_V1 << HDA_SSPSP_SFRMDLY_SHIFT) |
+			(HDA_SSPSP_DMYSTOP_DEF_V1 << HDA_SSPSP_DMYSTOP_SHIFT) |
+			(HDA_SSPSP_EDMYSTOP_DEF_V1 << HDA_SSPSP_EDMYSTOP_SHIFT);
+
+	regs->hda_sstsa = 0;
+	regs->hda_sstsa = (HDA_SSTSA_TXEN_DEF_V1 << HDA_SSTSA_TXEN_SHIFT) |
+			(HDA_SSTSA_TTSA_DEF_V1 << HDA_SSTSA_TTSA_SHIFT);
+
+	regs->hda_ssrsa = 0;
+	regs->hda_ssrsa = (HDA_SSRSA_RXEN_DEF_V1 << HDA_SSRSA_RXEN_SHIFT) |
+			(HDA_SSTSA_RTSA_DEF_V1 << HDA_SSRSA_RTSA_SHIFT);
+
+	regs->hda_ssc2 = 0;
+	regs->hda_ssc2 = (HDA_SSC2_TURM0_DEF_V1 << HDA_SSC2_TURM0_SHIFT) |
+		(HDA_SSC2_TURM1_DEF_V1 << HDA_SSC2_TURM1_SHIFT) |
+		(HDA_SSC2_PSPMB2BFMFD_DEF_V1 << HDA_SSC2_PSPMB2BFMFD_SHIFT) |
+		(HDA_SSC2_PSPSRWFDFD_DEF_V1 << HDA_SSC2_PSPSRWFDFD_SHIFT) |
+		(HDA_SSC2_PSPSTWFDFD_DEF_V1 << HDA_SSC2_PSPSTWFDFD_SHIFT) |
+		(HDA_SSC2_PSPMFSRTPFD_DEF_V1 << HDA_SSC2_PSPMFSRTPFD_SHIFT) |
+		(HDA_SSC2_ROFD_DEF_V1 << HDA_SSC2_ROFD_SHIFT) |
+		(HDA_SSC2_C2DFFD_DEF_V1 << HDA_SSC2_C2DFFD_SHIFT) |
+		(HDA_SSC2_TSAFD_DEF_V1 << HDA_SSC2_TSAFD_SHIFT) |
+		(HDA_SSC2_RSAFD_DEF_V1 << HDA_SSC2_RSAFD_SHIFT) |
+		(HDA_SSC2_RMFGFD_DEF_V1 << HDA_SSC2_RMFGFD_SHIFT) |
+		(HDA_SSC2_TURFD_DEF_V1 << HDA_SSC2_TURFD_SHIFT) |
+		(HDA_SSC2_TUDFD_DEF_V1 << HDA_SSC2_TUDFD_SHIFT) |
+		(HDA_SSC2_BCEFD_DEF_V1 << HDA_SSC2_BCEFD_SHIFT) |
+		(HDA_SSC2_SDFD_DEF_V1 << HDA_SSC2_SDFD_SHIFT) |
+		(HDA_SSC2_SDHFD_DEF_V1 << HDA_SSC2_SDHFD_SHIFT) |
+		(HDA_SSC2_SDPM_DEF_V1 << HDA_SSC2_SDPM_SHIFT) |
+		(HDA_SSC2_LJDFD_DEF_V1 << HDA_SSC2_LJDFD_SHIFT) |
+		(HDA_SSC2_MMRATF_DEF_V1 << HDA_SSC2_MMRATF_SHIFT) |
+		(HDA_SSC2_SMTATF_DEF_V1 << HDA_SSC2_SMTATF_SHIFT);
+
+	regs->hda_ssc3 = 0;
+	regs->hda_ssc3 = (HDA_SSC3_TFT_DEF_V1 << HDA_SSC3_TFT_SHIFT) |
+			(HDA_SSC3_RFT_DEF_V1 << HDA_SSC3_RFT_SHIFT);
+
+	regs->hda_ssioc = 0;
+	regs->hda_ssioc = (HDA_SSIOC_RXDPDEB_DEF_V1 << HDA_SSIOC_RXDPDEB_SHIFT) |
+		(HDA_SSIOC_TXDPDEB_DEF_V1 << HDA_SSIOC_TXDPDEB_SHIFT) |
+		(HDA_SSIOC_SFRMPDEB_DEF_V1 << HDA_SSIOC_SFRMPDEB_SHIFT) |
+		(HDA_SSIOC_SCLKPDEB_DEF_V1 << HDA_SSIOC_SCLKPDEB_SHIFT) |
+		(HDA_SSIOC_SFCR_DEF_V1 << HDA_SSIOC_SFCR_SHIFT) |
+		(HDA_SSIOC_SCOE_DEF_V1 << HDA_SSIOC_SCOE_SHIFT);
+
+	regs->hda_sspsp2 = 0;
+
+}
+
+static void azx_print_ssp_regs(struct sst_dsp_ctx *ctx,
+						struct hda_ssp_regs *regs)
+{
+	dev_dbg(ctx->dev, "ssc0\t\t %x\n", regs->hda_ssc0);
+	dev_dbg(ctx->dev, "ssc1\t\t %x\n", regs->hda_ssc1);
+	dev_dbg(ctx->dev, "sst0\t\t %x\n", regs->hda_ssto);
+	dev_dbg(ctx->dev, "sspsp\t\t %x\n", regs->hda_sspsp);
+	dev_dbg(ctx->dev, "sstsa\t\t %x\n", regs->hda_sstsa);
+	dev_dbg(ctx->dev, "ssrsa\t\t %x\n", regs->hda_ssrsa);
+	dev_dbg(ctx->dev, "ssc2\t\t %x\n", regs->hda_ssc2);
+	dev_dbg(ctx->dev, "sspsp2\t\t %x\n", regs->hda_sspsp2);
+	dev_dbg(ctx->dev, "ssc3\t\t %x\n", regs->hda_ssc3);
+	dev_dbg(ctx->dev, "ssioc\t\t %x\n", regs->hda_ssioc);
+}
+
+static int azx_find_ssp_clk_divisor(struct sst_dsp_ctx *ctx, int fs,
+			int slots, int s_fmt, int *div, int *dummy_bits)
+{
+	int divisor, mod;
+	int found = 0;
+	int req_bclk;
+	int dummy = 0;
+
+	dev_dbg(ctx->dev, "fs = %d, slots = %d s_fmt = %d\n", fs, slots, s_fmt);
+	req_bclk = fs * slots * s_fmt;
+	if (req_bclk == 0) {
+		dev_err(ctx->dev, "Required bit clock = 0\n");
+		return -EINVAL;
+	}
+	if (req_bclk > HDA_SSP_MAX_FREQ_192) {
+		dev_err(ctx->dev, "Bit clock is %d, greater than max SSP freq\n", req_bclk);
+		return -EINVAL;
+	}
+	dummy = 0;
+	/* Find the lowest bit clock possible for particular configuration */
+	do {
+		req_bclk = ((s_fmt * fs * slots) + (fs * dummy));
+		mod = HDA_SSP_MAX_FREQ_192 % req_bclk;
+		divisor = HDA_SSP_MAX_FREQ_192 / req_bclk;
+		if (!mod) {
+			found = 1;
+			break;
+		}
+		/* Dont add odd number of dummy bits, since I2S requires
+		 * dummy bit after each slot/channel
+		 */
+		dummy += 2;
+		if (dummy > (HDA_SSPSP2_FEP_MASK >> HDA_SSPSP2_FEP_SHIFT)) {
+			dev_err(ctx->dev, "Dummy bit greater than what SSP can support\n");
+			return -EINVAL;
+		}
+
+	} while (divisor > 0);
+	if (found) {
+		*div = divisor;
+		*dummy_bits = dummy;
+		return 0;
+	}
+	dev_err(ctx->dev, "Suitable divisor not found for SSP configuration\n");
+
+	return -EINVAL;
+}
+int azx_calculate_ssp_regs(struct sst_dsp_ctx *ctx, struct azx_dai_config *cfg,
+						void *ssp_regs)
+{
+	struct hda_ssp_regs regs;
+	int ret = 0;
+	int div, dummy;
+	int dss, edss;
+	int edmystop, dmystop;
+	struct azx_ssp_dai_config *ssp_cfg = &cfg->ssp_dai_config;
+
+	azx_set_default_ssp_regs_v1(&regs);
+	dev_dbg(ctx->dev, "Default value of registers set to:\n");
+	azx_print_ssp_regs(ctx, &regs);
+
+	if (ssp_cfg->fs_slave)
+		regs.hda_ssc1 |= HDA_SSC1_SFRMDIR_MASK;
+	if (ssp_cfg->bclk_slave)
+		regs.hda_ssc1 |= HDA_SSC1_SCLKDIR_MASK;
+	if (!ssp_cfg->fs_invert)
+		regs.hda_sspsp |= ((0x1 << HDA_SSPSP_SFRMP_SHIFT) &
+				HDA_SSPSP_SFRMP_MASK);
+	if (ssp_cfg->bclk_invert)
+		regs.hda_sspsp |= ((0x1 << HDA_SSPSP_SCMODE_SHIFT) &
+				HDA_SSPSP_SCMODE_MASK);
+
+	if (ssp_cfg->ssp_mode == HDA_SSP_MODE_I2S)
+		/* I2S mode, means 2 slots */
+		ssp_cfg->slots = 2;
+
+	ret = azx_find_ssp_clk_divisor(ctx, cfg->sampling_rate, ssp_cfg->slots,
+					cfg->s_fmt, &div, &dummy);
+	if (ret) {
+		dev_err(ctx->dev, "Clock disior not possible\n");
+		return -EINVAL;
+	}
+	/* Program dividier */
+	regs.hda_ssc0 |= ((div - 1) << HDA_SSC0_SRC_SHIFT) & HDA_SSC0_SCR_MASK;
+
+
+	if (ssp_cfg->slot_width != cfg->s_fmt) {
+		dev_err(ctx->dev, "slot_width must be equal to format bits\n");
+		return -EINVAL;
+	}
+
+	if (cfg->s_fmt > 16) {
+		edss = 1;
+		dss = cfg->s_fmt - 16;
+	} else {
+		edss = 0;
+		dss = cfg->s_fmt;
+	}
+	dss -= 1;
+	regs.hda_ssc0 |= ((dss << HDA_SSC0_DSS_SHIFT) & HDA_SSC0_DSS_MASK);
+	regs.hda_ssc0 |= ((edss << HDA_SSC0_EDSS_SHIFT) & HDA_SSC0_EDSS_MASK);
+
+	if (ssp_cfg->ssp_mode != HDA_SSP_MODE_I2S) {
+		regs.hda_sspsp2 |= (dummy << HDA_SSPSP2_FEP_SHIFT) &
+							HDA_SSPSP2_FEP_MASK;
+		regs.hda_sspsp |= (0x1 << HDA_SSPSP_SFRMWDTH_SHIFT) &
+					HDA_SSPSP_SFRMWDTH_MASK;
+		if (ssp_cfg->ssp_mode == HDA_SSP_MODE_DSP_A)
+			regs.hda_sspsp |= (0x1 << HDA_SSPSP_FSRT_SHIFT) &
+					HDA_SSPSP_FSRT_MASK;
+		else
+			regs.hda_sspsp &= ~(HDA_SSPSP_FSRT_MASK);
+	} else {
+		/* Divide dummy bits / 2 */
+		regs.hda_sspsp |= (0x1 << HDA_SSPSP_FSRT_SHIFT) &
+				HDA_SSPSP_FSRT_MASK;
+		dummy = dummy >> 1;
+		dmystop = dummy & 0x3;
+		edmystop = (dummy >> 2);
+		regs.hda_sspsp |= (dmystop << HDA_SSPSP_DMYSTOP_SHIFT) &
+							HDA_SSPSP_DMYSTOP_MASK;
+		regs.hda_sspsp |= (edmystop << HDA_SSPSP_EDMYSTOP_SHIFT) &
+						HDA_SSPSP_EDMYSTOP_MASK;
+		regs.hda_sspsp |= ((cfg->s_fmt + dummy) << HDA_SSPSP_SFRMWDTH_SHIFT) &
+							HDA_SSPSP_SFRMWDTH_MASK;
+		ssp_cfg->slots = 2;
+	}
+	if (ssp_cfg->slots > HDA_SSP_MAX_SLOTS) {
+		dev_err(ctx->dev, "Max slots = %d\n", HDA_SSP_MAX_SLOTS);
+		return -EINVAL;
+	}
+	regs.hda_ssc0 |= ((ssp_cfg->slots - 1) << HDA_SSC0_FRDC_SHIFT) &
+			HDA_SSC0_FRDC_MASK;
+
+	memcpy(ssp_regs, &regs, sizeof(struct hda_ssp_regs));
+	dev_dbg(ctx->dev, "Registers updated to\n");
+	azx_print_ssp_regs(ctx, &regs);
+	return 0;
+
+}
diff --git a/sound/soc/hda/hda_dsp_ssp_config.h b/sound/soc/hda/hda_dsp_ssp_config.h
new file mode 100644
index 000000000000..3d056d2da1ca
--- /dev/null
+++ b/sound/soc/hda/hda_dsp_ssp_config.h
@@ -0,0 +1,423 @@
+/*
+ *  hda_dsp_ssp_config.h - HDA DSP SSP register definition file.
+ *
+ *  Copyright (C) 2015 Intel Corp
+ *  Author: Hardik Shah <hardik.t.shah at intel.com>
+ *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; version 2 of the License.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  General Public License for more details.
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ */
+
+
+#ifndef _INTEL_SSP_CONFIG_H_
+#define _INTEL_SSP_CONFIG_H_
+
+#define HDA_SSC0_DSS_MASK                          0xF
+#define HDA_SSC0_DSS_SHIFT                         0
+#define HDA_SSC0_FRF_MASK                          0x30
+#define HDA_SSC0_FRF_SHIFT                         4
+#define HDA_SSC0_ECS_MASK                          0x40
+#define HDA_SSC0_ECS_SHIFT                         6
+#define HDA_SSC0_SSE_MASK                          0x80
+#define HDA_SSC0_SSE_SHIFT                         7
+#define HDA_SSC0_SCR_MASK                          0xFFF00
+#define HDA_SSC0_SRC_SHIFT                         8
+#define HDA_SSC0_EDSS_MASK                         0x100000
+#define HDA_SSC0_EDSS_SHIFT                        20
+#define HDA_SSC0_NCS_MASK                          0x200000
+#define HDA_SSC0_NCS_SHIFT                         21
+#define HDA_SSC0_RIM_MASK                          0x400000
+#define HDA_SSC0_RIM_SHIFT                         22
+#define HDA_SSC0_TIM_MASK                          0x800000
+#define HDA_SSC0_TIM_SHIFT                         23
+#define HDA_SSC0_FRDC_MASK                         0x7000000
+#define HDA_SSC0_FRDC_SHIFT                        24
+#define HDA_SSC0_ACS_MASK                          0x40000000
+#define HDA_SSC0_ACS_SHIFT                         30
+#define HDA_SSC0_MOD_MASK                          0x80000000
+#define HDA_SSC0_MOD_SHIFT                         31
+
+#define HDA_SSC1_RIE_MASK                          0x1
+#define HDA_SSC1_RIE_SHIFT                         0
+#define HDA_SSC1_TIE_MASK                          0x2
+#define HDA_SSC1_TIE_SHIFT                         1
+#define HDA_SSC1_LBM_MASK                          0x4
+#define HDA_SSC1_LBM_SHIFT                         2
+#define HDA_SSC1_SPO_MASK                          0x8
+#define HDA_SSC1_SPO_SHIFT                         3
+#define HDA_SSC1_SPH_MASK                          0x10
+#define HDA_SSC1_SPH_SHIFT                         4
+#define HDA_SSC1_MWDS_MASK                         0x20
+#define HDA_SSC1_MWDS_SHIFT                        5
+#define HDA_SSC1_EFWR_MASK                         0x4000
+#define HDA_SSC1_EFWR_SHIFT                        14
+#define HDA_SSC1_STRF_MASK                         0x8000
+#define HDA_SSC1_STRF_SHIFT                        15
+#define HDA_SSC1_IFS_MASK                          0x10000
+#define HDA_SSC1_IFS_SHIFT                         16
+#define HDA_SSC1_PINTE_MASK                        0x40000
+#define HDA_SSC1_PINTE_SHIFT                       18
+#define HDA_SSC1_TINTE_MASK                        0x80000
+#define HDA_SSC1_TINTE_SHIFT                       19
+#define HDA_SSC1_RSRE_MASK                         0x100000
+#define HDA_SSC1_RSRE_SHIFT                        20
+#define HDA_SSC1_TSRE_MASK                         0x200000
+#define HDA_SSC1_TSRE_SHIFT                        21
+#define HDA_SSC1_TRAIL_MASK                        0x400000
+#define HDA_SSC1_TRAIL_SHIFT                       22
+#define HDA_SSC1_RWOT_MASK                         0x800000
+#define HDA_SSC1_RWOT_SHIFT                        23
+#define HDA_SSC1_SFRMDIR_MASK                      0x1000000
+#define HDA_SSC1_SFRMDIR_SHIFT                     24
+#define HDA_SSC1_SCLKDIR_MASK                      0x2000000
+#define HDA_SSC1_SCLKDIR_SHIFT                     25
+#define HDA_SSC1_ECRB_MASK                         0x4000000
+#define HDA_SSC1_ECRB_SHIFT                        26
+#define HDA_SSC1_ECRA_MASK                         0x8000000
+#define HDA_SSC1_ECRA_SHIFT                        27
+#define HDA_SSC1_SCFR_MASK                         0x10000000
+#define HDA_SSC1_SCFR_SHIFT                        28
+#define HDA_SSC1_EBCEI_MASK                        0x20000000
+#define HDA_SSC1_EBCEI_SHIFT                       29
+#define HDA_SSC1_TTE_MASK                          0x40000000
+#define HDA_SSC1_TTE_SHIFT                         30
+#define HDA_SSC1_TTELP_MASK                        0x80000000
+#define HDA_SSC1_TTELP_SHIFT                       31
+
+#define HDA_SST0_TIMEOUT_MASK                      0xFFFFFF
+#define HDA_SST0_TIMEOUT_SHIFT                     0
+
+#define HDA_SSPSP_SCMODE_MASK                      0x3
+#define HDA_SSPSP_SCMODE_SHIFT                     0
+#define HDA_SSPSP_SFRMP_MASK                       0x4
+#define HDA_SSPSP_SFRMP_SHIFT                      2
+#define HDA_SSPSP_ETDS_MASK                        0x8
+#define HDA_SSPSP_ETDS_SHIFT                       3
+#define HDA_SSPSP_STRTDLY_MASK                     0x70
+#define HDA_SSPSP_STRTDLY_SHIFT                    4
+#define HDA_SSPSP_DMYSTRT_MASK                     0x180
+#define HDA_SSPSP_DMYSTRT_SHIFT                    7
+#define HDA_SSPSP_SFRMDLY_MASK                     0xFE00
+#define HDA_SSPSP_SFRMDLY_SHIFT                    9
+#define HDA_SSPSP_SFRMWDTH_MASK                    0x3F0000
+#define HDA_SSPSP_SFRMWDTH_SHIFT                   16
+#define HDA_SSPSP_DMYSTOP_MASK                     0x1800000
+#define HDA_SSPSP_DMYSTOP_SHIFT                    23
+#define HDA_SSPSP_FSRT_MASK                        0x2000000
+#define HDA_SSPSP_FSRT_SHIFT                       25
+#define HDA_SSPSP_EDMYSTOP_MASK                    0x1C000000
+#define HDA_SSPSP_EDMYSTOP_SHIFT                   26
+
+#define HDA_SSTSA_TTSA_MASK                        0xFF
+#define HDA_SSTSA_TTSA_SHIFT                       0
+#define HDA_SSTSA_TXEN_MASK                        0x100
+#define HDA_SSTSA_TXEN_SHIFT                       8
+
+#define HDA_SSRSA_RTSA_MASK                        0xFF
+#define HDA_SSRSA_RTSA_SHIFT                       0
+#define HDA_SSRSA_RXEN_MASK                        0x100
+#define HDA_SSRSA_RXEN_SHIFT                       8
+
+#define HDA_SSC2_TURM0_MASK                        0x1
+#define HDA_SSC2_TURM0_SHIFT                       0
+#define HDA_SSC2_TURM1_MASK                        0x2
+#define HDA_SSC2_TURM1_SHIFT                       1
+#define HDA_SSC2_PSPMB2BFMFD_MASK                  0x4
+#define HDA_SSC2_PSPMB2BFMFD_SHIFT                 2
+#define HDA_SSC2_PSPSRWFDFD_MASK                   0x8
+#define HDA_SSC2_PSPSRWFDFD_SHIFT                  3
+#define HDA_SSC2_PSPSTWFDFD_MASK                   0x10
+#define HDA_SSC2_PSPSTWFDFD_SHIFT                  4
+#define HDA_SSC2_PSPMFSRTPFD_MASK                  0x20
+#define HDA_SSC2_PSPMFSRTPFD_SHIFT                 5
+#define HDA_SSC2_ROFD_MASK                         0x40
+#define HDA_SSC2_ROFD_SHIFT                        6
+#define HDA_SSC2_C2DFFD_MASK                       0x80
+#define HDA_SSC2_C2DFFD_SHIFT                      7
+#define HDA_SSC2_TSAFD_MASK                        0x100
+#define HDA_SSC2_TSAFD_SHIFT                       8
+#define HDA_SSC2_RSAFD_MASK                        0x200
+#define HDA_SSC2_RSAFD_SHIFT                       9
+#define HDA_SSC2_RMFGFD_MASK                       0x400
+#define HDA_SSC2_RMFGFD_SHIFT                      10
+#define HDA_SSC2_TURFD_MASK                        0x800
+#define HDA_SSC2_TURFD_SHIFT                       11
+#define HDA_SSC2_TUDFD_MASK                        0x1000
+#define HDA_SSC2_TUDFD_SHIFT                       12
+#define HDA_SSC2_BCEFD_MASK                        0x2000
+#define HDA_SSC2_BCEFD_SHIFT                       13
+
+#define HDA_SSC2_SDFD_MASK                         0x4000
+#define HDA_SSC2_SDFD_SHIFT                        14
+#define HDA_SSC2_SDHFD_MASK                        0x8000
+#define HDA_SSC2_SDHFD_SHIFT                       15
+#define HDA_SSC2_SDPM_MASK                         0x10000
+#define HDA_SSC2_SDPM_SHIFT                        16
+#define HDA_SSC2_LJDFD_MASK                        0x20000
+#define HDA_SSC2_LJDFD_SHIFT                       17
+#define HDA_SSC2_MMRATF_MASK                       0x40000
+#define HDA_SSC2_MMRATF_SHIFT                      18
+#define HDA_SSC2_SMTATF_MASK                       0x80000
+#define HDA_SSC2_SMTATF_SHIFT                      19
+
+#define HDA_SSPSP2_FEP_MASK                        0xFF
+#define HDA_SSPSP2_FEP_SHIFT                       0
+
+#define HDA_SSC3_TFL_MASK                          0x3F
+#define HDA_SSC3_TFL_SHIFT                         0
+#define HDA_SSC3_RFL_MASK                          0x3F00
+#define HDA_SSC3_RFL_SHIFT                         8
+#define HDA_SSC3_TFT_MASK                          0x3F0000
+#define HDA_SSC3_TFT_SHIFT                         16
+#define HDA_SSC3_RFT_MASK                          0x3F000000
+#define HDA_SSC3_RFT_SHIFT                         24
+
+#define HDA_SSIOC_RXDPDEB_MASK                     0x1
+#define HDA_SSIOC_RXDPDEB_SHIFT                    0
+#define HDA_SSIOC_TXDPDEB_MASK                     0x2
+#define HDA_SSIOC_TXDPDEB_SHIFT                    1
+#define HDA_SSIOC_SFRMPDEB_MASK                    0x4
+#define HDA_SSIOC_SFRMPDEB_SHIFT                   2
+#define HDA_SSIOC_SCLKPDEB_MASK                    0x8
+#define HDA_SSIOC_SCLKPDEB_SHIFT                   3
+#define HDA_SSIOC_SFCR_MASK                        0x10
+#define HDA_SSIOC_SFCR_SHIFT                       4
+#define HDA_SSIOC_SCOE_MASK                        0x20
+#define HDA_SSIOC_SCOE_SHIFT                       5
+
+
+
+
+
+
+/* Default Frame format is PSP */
+#define HDA_SSC0_FRF_DEF_V1				0x3
+/* On-chip clock used to derive SSP clock */
+#define HDA_SSC0_ECS_DEF_V1				0x0
+/* Modified by firmware */
+#define HDA_SSC0_SSE_DEF_V1				0x0
+/* Local clock use for bclk, instead of network clock */
+#define HDA_SSC0_NCS_DEF_V1					0x0
+/* Interrupt not required by firmware */
+#define HDA_SSC0_RIM_DEF_V1					0x0
+/* Interrupt not required by firmware */
+#define HDA_SSC0_TIM_DEF_V1					0x0
+/* Clock selectiion  by ECS and NCS bit */
+#define HDA_SSC0_ACS_DEF_V1					0x0
+/* SSP in network mode. */
+#define HDA_SSC0_MOD_DEF_V1					0x1
+
+/* Receive FIFO level interrupt is disabled, F/W int not req. */
+#define HDA_SSC1_RIE_DEF_V1					0x0
+/* Transmit FIFO level interrupt is disabled, F/W int not req. */
+#define HDA_SSC1_TIE_DEF_V1					0x0
+/* Normal serial port operation enable */
+#define HDA_SSC1_LBM_DEF_V1					0x0
+/* The inactive or idle state of SCLK is low */
+#define HDA_SSC1_SPO_DEF_V1					0x0
+/* SCLK is inactive one cycle at the start of a
+ * frame and 1/2 cycle at the end of a frame
+ */
+#define HDA_SSC1_SPH_DEF_V1					0x0
+/* 8 bit command words are transmitted */
+#define HDA_SSC1_MWDS_DEF_V1				0x0
+/* FIFO write / read special function is disabled
+ *(normal SSP operational mode)
+ */
+#define HDA_SSC1_EFWR_DEF_V1				0x0
+/* Transmit FIFO is selected for both writes and reads
+ * through the SSP Data register
+ */
+#define HDA_SSC1_STRF_DEF_V1				0x0
+/* Frame polarity is determined by SSP format and PSP polarity */
+#define HDA_SSC1_IFS_DEF_V1					0x0
+/* Peripheral Trailing Byte Interrupts are disabled, F/W int not req. */
+#define HDA_SSC1_PINTE_DEF_V1				0x0
+/* Receiver Time-out interrupts are disabled, F/W int not req. */
+#define HDA_SSC1_TINTE_DEF_V1				0x0
+/* Modified by firmware */
+#define HDA_SSC1_RSRE_DEF_V1				0x1
+/* Modified by firmware */
+#define HDA_SSC1_TSRE_DEF_V1				0x1
+/* DMA based, trailing bytes are handled by DMA. */
+#define HDA_SSC1_TRAIL_DEF_V1				0x1
+/* Transmit / Receive mode. */
+#define HDA_SSC1_RWOT_DEF_V1				0x0
+/* Clock request from other SSP is disabled */
+#define HDA_SSC1_ECRB_DEF_V1				0x0
+/* Clock request from other SSP is disabled */
+#define HDA_SSC1_ECRA_DEF_V1				0x0
+/* Clock input to SCLK is continuously running. (SSP slave mode) */
+#define HDA_SSC1_SCFR_DEF_V1				0x0
+/* Interrupt due to a bit count error is disabled, F/W int not req. */
+#define HDA_SSC1_EBCEI_DEF_V1				0x0
+/* TXD line will be tri-stated when not transmitting data */
+#define HDA_SSC1_TTE_DEF_V1				0x1
+/* TXD line will be tri-stated 1/2 clock edge after TXD is to be flopped */
+#define HDA_SSC1_TTELP_DEF_V1				0x1
+
+/* Value defines the time-out interval given by TIMEOUT/peripheral
+ * clock frequency.
+ */
+#define HDA_SST0_TIMEOUT_DEF_V1				0x0
+
+/* End of Transfer Data State 0: Low 1: Last value */
+#define HDA_SSPSP_ETDS_DEF_V1				0x0
+/* Programmed value sets start delay that is used to set the idle time
+ * of SCLK between transfers
+ */
+#define HDA_SSPSP_STRTDLY_DEF_V1				0x0
+/* Programmed value sets the number of SCLK after STRTDLY is complete
+ * that precede the transmit / receive data.
+ */
+#define HDA_SSPSP_DMYSTRT_DEF_V1				0x0
+/* Programmed value sets the number of half SCLK cycle from TXD / RXD
+ * being driven to SFRM being asserted
+ */
+#define HDA_SSPSP_SFRMDLY_DEF_V1				0x0
+/* With EDMYSTOP as higher order bits, the concatenated programmed value
+ * sets the number of SCLK cycles that follow the transmitted data.
+ * Concatenated dummy stop value of 0 . 31 is allowed.
+ */
+#define HDA_SSPSP_DMYSTOP_DEF_V1				0x0
+/* With EDMYSTOP as higher order bits, the concatenated programmed value
+ * sets the number of SCLK cycles that follow the transmitted data.
+ * Concatenated dummy stop value of 0 . 31 is allowed.
+ */
+#define HDA_SSPSP_EDMYSTOP_DEF_V1				0x0
+
+/* Firmware controls this at correct time */
+#define HDA_SSTSA_TXEN_DEF_V1				0x0
+/* SSP TX Time Slot Active */
+#define HDA_SSTSA_TTSA_DEF_V1				0xf
+
+/* Firmware controls this at correct time */
+#define HDA_SSRSA_RXEN_DEF_V1				0x0
+/* SSP RX Time Slot Active */
+#define HDA_SSTSA_RTSA_DEF_V1				0xf
+
+
+/* Mode 0 of transmit underrun fix.  In this mode, new data will always
+ * start at slot 0.  This function is only applied to SSP and PSP modes.
+ * 0: Disable mode 0.
+ * 1: Enable mode 0.
+ */
+#define HDA_SSC2_TURM0_DEF_V1				0x0
+/* Mode 1 of transmit underrun fix.  In this mode, new data will always
+ * start on the underrun slot.  This function is only applied to SSP
+ * and PSP modes.
+ * 0: Disable mode 1.
+ * 1: Enable mode 1.
+ * If both underrun modes are enabled, mode 1 has higher priority.
+ */
+#define HDA_SSC2_TURM1_DEF_V1				0x1
+/* Set to 1 to disable the fix for PSP master mode back to back frame
+ * assertion masking in network mode.
+ */
+#define HDA_SSC2_PSPMB2BFMFD_DEF_V1				0x0
+/* Set to 1 to disable the fix for PSP slave mode RXD wait for frame
+ * de-assertion before starting the second channel.
+ */
+#define HDA_SSC2_PSPSRWFDFD_DEF_V1				0x0
+/* Set to 1 to disable the fix for PSP slave mode TXD wait for frame
+ * de-assertion before starting the second channel.
+ */
+#define HDA_SSC2_PSPSTWFDFD_DEF_V1				0x0
+/* Set to 1 to disable the fix for PSP master mode FSRT with dummy
+ * stop & frame end padding capability.
+ */
+#define HDA_SSC2_PSPMFSRTPFD_DEF_V1				0x0
+/* When set to 1, new data will always start on the overflow slot when
+ * RX FIFO becomes free again.  When cleared to 0, new data may start
+ * on any slot when RX FIFO becomes free again.
+ * This function is only applied to SSP and PSP modes.
+ */
+#define HDA_SSC2_ROFD_DEF_V1				0x0
+/* Set to 1 to disable the fix for combi -> double flop clock crossing. */
+#define HDA_SSC2_C2DFFD_DEF_V1				0x0
+/* When cleared to 0, TX slot defined in SSTSA.TTSA is only enabled in the
+ * next frame after TX Enable (TXEN) bit set, with the enabled slot.
+ * When set to 1, TX Enable (TXEN) bit has no effect.
+ */
+#define HDA_SSC2_TSAFD_DEF_V1				0x0
+/* When cleared to 0, RX slot defined in SSRSA.RTSA is only enabled in the
+ * next frame after RX Enable (RXEN) bit set.  When set to 1,
+ * RX Enable (RXEN) bit has no effect.
+ */
+#define HDA_SSC2_RSAFD_DEF_V1				0x0
+/* When cleared to 0, SSP starts driving SFRM in master mode if RXEN
+ * is set, to allow RX only half duplex operation in master mode.
+ * When set to 1, RX Enable (RXEN) bit has no effect on the master mode
+ * SFRM generation.
+ */
+#define HDA_SSC2_RMFGFD_DEF_V1				0x0
+/* When cleared to 0, SSP will report an underrun if new data is written
+ * to an empty TX FIFO within 2 link clocks from the transmission of
+ * 1st data bit.  Set to 1 to disable fix.
+ */
+#define HDA_SSC2_TURFD_DEF_V1				0x0
+/* When cleared to 0, TX data will be masked to 0 when SSP underrun in the
+ * case of new data written to empty TX FIFO within 2 link clocks from the
+ * transmission of 1st data bit.  Set to 1 to disable fix.
+ */
+#define HDA_SSC2_TUDFD_DEF_V1				0x0
+/* Set to 1 to disable fix for bit count error bug at the beginning of
+ * SSP enabling.
+ */
+#define HDA_SSC2_BCEFD_DEF_V1				0x0
+/* Disable DMA finish function for SSP.  */
+#define HDA_SSC2_SDFD_DEF_V1				0x1
+/* For DMA HW Handshake fix.
+ * 1 . use original DMA request logic
+ * 0 . enable HW HS
+ */
+#define HDA_SSC2_SDHFD_DEF_V1				0x0
+/* When 1, SSP can be accessed by PIO else DMAC.  */
+#define HDA_SSC2_SDPM_DEF_V1				0x0
+/* Set to 1 to disable the fix for left justified I2S/PCM. */
+#define HDA_SSC2_LJDFD_DEF_V1				0x0
+/* Set to 1 for receive data to be sampled at the opposite clock edge
+ * specified in SSPSP.SCMODE[1:0]
+ */
+#define HDA_SSC2_MMRATF_DEF_V1				0x0
+/* Set to 1 for transmit data to be driven at the opposite clock edge
+ * specified in SSPSP.SCMODE[1:0]
+ */
+#define HDA_SSC2_SMTATF_DEF_V1				0x0
+
+
+/* Sets threshold level at which transmit FIFO asserts interrupt.
+ * This level should be set to the desired threshold value minus 1.
+ */
+#define HDA_SSC3_TFT_DEF_V1					0x7
+/* Sets threshold level at which receive FIFO asserts interrupt.
+ * This level should be set to the desired threshold value minus 1.
+ */
+#define HDA_SSC3_RFT_DEF_V1					0x7
+
+
+/* Clear to 0 to enable pull down on the SSPxRXD I/O buffer. */
+#define HDA_SSIOC_RXDPDEB_DEF_V1				0x0
+/* Clear to 0 to enable pull down on the SSPxTXD I/O buffer. */
+#define HDA_SSIOC_TXDPDEB_DEF_V1				0x0
+/* Clear to 0 to enable pull down on the SSPxSFRM I/O buffer. */
+#define HDA_SSIOC_SFRMPDEB_DEF_V1				0x0
+/* Clear to 0 to enable pull down on the SSPxSCLK I/O buffer. */
+#define HDA_SSIOC_SCLKPDEB_DEF_V1				0x0
+/* External Enable to force SSPSCLK to keep running. */
+#define HDA_SSIOC_SFCR_DEF_V1				0x0
+/* Enable the SSP SCLK I/O buffer output */
+#define HDA_SSIOC_SCOE_DEF_V1				0x1
+
+
+#endif /*_SOC_HDA_SSP_CONFIG_H_*/
-- 
1.7.9.5



More information about the Alsa-devel mailing list