mirror of
https://github.com/alsa-project/alsa-utils
synced 2024-10-06 04:27:59 +02:00
Merge d8e8f75537
into fbde4f8c10
This commit is contained in:
commit
a02ab41e09
4 changed files with 240 additions and 62 deletions
|
@ -13,32 +13,41 @@
|
||||||
|
|
||||||
#ifdef NHLT_DEBUG
|
#ifdef NHLT_DEBUG
|
||||||
|
|
||||||
void ssp_print_calculated(struct intel_ssp_params *ssp)
|
static void ssp_print_blob10(struct intel_ssp_params *ssp, int i)
|
||||||
{
|
{
|
||||||
struct ssp_intel_config_data *blob;
|
struct ssp_intel_config_data *blob;
|
||||||
struct ssp_intel_config_data_1_5 *blob15;
|
|
||||||
struct ssp_aux_blob *blob_aux;
|
|
||||||
int ssp_index = ssp->ssp_count;
|
int ssp_index = ssp->ssp_count;
|
||||||
uint32_t *ptr;
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
fprintf(stdout, "printing ssp nhlt calculated data:\n");
|
blob = &ssp->ssp_blob[ssp_index][i];
|
||||||
|
fprintf(stdout, "gateway_attributes %u\n", blob->gateway_attributes);
|
||||||
|
fprintf(stdout, "ts_group[0] 0x%08x\n", blob->ts_group[0]);
|
||||||
|
fprintf(stdout, "ts_group[1] 0x%08x\n", blob->ts_group[1]);
|
||||||
|
fprintf(stdout, "ts_group[2] 0x%08x\n", blob->ts_group[2]);
|
||||||
|
fprintf(stdout, "ts_group[3] 0x%08x\n", blob->ts_group[3]);
|
||||||
|
fprintf(stdout, "ts_group[4] 0x%08x\n", blob->ts_group[4]);
|
||||||
|
fprintf(stdout, "ts_group[5] 0x%08x\n", blob->ts_group[5]);
|
||||||
|
fprintf(stdout, "ts_group[6] 0x%08x\n", blob->ts_group[6]);
|
||||||
|
fprintf(stdout, "ts_group[7] 0x%08x\n", blob->ts_group[7]);
|
||||||
|
fprintf(stdout, "ssc0 0x%08x\n", blob->ssc0);
|
||||||
|
fprintf(stdout, "ssc1 0x%08x\n", blob->ssc1);
|
||||||
|
fprintf(stdout, "sscto 0x%08x\n", blob->sscto);
|
||||||
|
fprintf(stdout, "sspsp 0x%08x\n", blob->sspsp);
|
||||||
|
fprintf(stdout, "sstsa 0x%08x\n", blob->sstsa);
|
||||||
|
fprintf(stdout, "ssrsa 0x%08x\n", blob->ssrsa);
|
||||||
|
fprintf(stdout, "ssc2 0x%08x\n", blob->ssc2);
|
||||||
|
fprintf(stdout, "sspsp2 0x%08x\n", blob->sspsp2);
|
||||||
|
fprintf(stdout, "ssc3 0x%08x\n", blob->ssc3);
|
||||||
|
fprintf(stdout, "ssioc 0x%08x\n", blob->ssioc);
|
||||||
|
fprintf(stdout, "mdivc 0x%08x\n", blob->mdivc);
|
||||||
|
fprintf(stdout, "mdivr 0x%08x\n", blob->mdivr);
|
||||||
|
}
|
||||||
|
|
||||||
/* top level struct */
|
static void ssp_print_blob15(struct intel_ssp_params *ssp, int i)
|
||||||
fprintf(stdout, "ssp index %d\n", ssp_index);
|
{
|
||||||
|
struct ssp_intel_config_data_1_5 *blob15;
|
||||||
|
int ssp_index = ssp->ssp_count;
|
||||||
|
uint32_t j;
|
||||||
|
|
||||||
fprintf(stdout, "ssp %d dai_index: %u\n", ssp_index, ssp->ssp_dai_index[ssp_index]);
|
|
||||||
|
|
||||||
fprintf(stdout, "ssp blob version %u\n", ssp->ssp_prm[ssp_index].version);
|
|
||||||
|
|
||||||
fprintf(stdout, "ssp %d hw_config_count: %u\n", ssp_index,
|
|
||||||
ssp->ssp_hw_config_count[ssp_index]);
|
|
||||||
|
|
||||||
fprintf(stdout, "\n");
|
|
||||||
|
|
||||||
for (i = 0; i < ssp->ssp_hw_config_count[ssp_index]; i++) {
|
|
||||||
fprintf(stdout, "ssp blob %d hw_config %d\n", ssp->ssp_count, i);
|
|
||||||
if (ssp->ssp_prm[ssp_index].version == SSP_BLOB_VER_1_5) {
|
|
||||||
blob15 = &ssp->ssp_blob_1_5[ssp_index][i];
|
blob15 = &ssp->ssp_blob_1_5[ssp_index][i];
|
||||||
fprintf(stdout, "gateway_attributes %u\n", blob15->gateway_attributes);
|
fprintf(stdout, "gateway_attributes %u\n", blob15->gateway_attributes);
|
||||||
fprintf(stdout, "version %u\n", blob15->version);
|
fprintf(stdout, "version %u\n", blob15->version);
|
||||||
|
@ -66,30 +75,84 @@ void ssp_print_calculated(struct intel_ssp_params *ssp)
|
||||||
for (j = 0; j < blob15->mdivrcnt; j++)
|
for (j = 0; j < blob15->mdivrcnt; j++)
|
||||||
fprintf(stdout, "mdivr 0x%08x\n",
|
fprintf(stdout, "mdivr 0x%08x\n",
|
||||||
ssp->ssp_prm[ssp_index].mdivr[i].mdivrs[j]);
|
ssp->ssp_prm[ssp_index].mdivr[i].mdivrs[j]);
|
||||||
} else {
|
}
|
||||||
blob = &ssp->ssp_blob[ssp_index][i];
|
|
||||||
fprintf(stdout, "gateway_attributes %u\n", blob->gateway_attributes);
|
static void ssp_print_blob30(struct intel_ssp_params *ssp, int i)
|
||||||
fprintf(stdout, "ts_group[0] 0x%08x\n", blob->ts_group[0]);
|
{
|
||||||
fprintf(stdout, "ts_group[1] 0x%08x\n", blob->ts_group[1]);
|
struct ssp_intel_config_data_3_0 *blob30;
|
||||||
fprintf(stdout, "ts_group[2] 0x%08x\n", blob->ts_group[2]);
|
int ssp_index = ssp->ssp_count;
|
||||||
fprintf(stdout, "ts_group[3] 0x%08x\n", blob->ts_group[3]);
|
uint32_t j;
|
||||||
fprintf(stdout, "ts_group[4] 0x%08x\n", blob->ts_group[4]);
|
|
||||||
fprintf(stdout, "ts_group[5] 0x%08x\n", blob->ts_group[5]);
|
blob30 = &ssp->ssp_blob_3_0[ssp_index][i];
|
||||||
fprintf(stdout, "ts_group[6] 0x%08x\n", blob->ts_group[6]);
|
fprintf(stdout, "gateway_attributes %u\n", blob30->gateway_attributes);
|
||||||
fprintf(stdout, "ts_group[7] 0x%08x\n", blob->ts_group[7]);
|
fprintf(stdout, "version %u\n", blob30->version);
|
||||||
fprintf(stdout, "ssc0 0x%08x\n", blob->ssc0);
|
fprintf(stdout, "size %u\n", blob30->size);
|
||||||
fprintf(stdout, "ssc1 0x%08x\n", blob->ssc1);
|
fprintf(stdout, "ts_group[0] 0x%08x\n", blob30->ts_group[0]);
|
||||||
fprintf(stdout, "sscto 0x%08x\n", blob->sscto);
|
fprintf(stdout, "ts_group[1] 0x%08x\n", blob30->ts_group[1]);
|
||||||
fprintf(stdout, "sspsp 0x%08x\n", blob->sspsp);
|
fprintf(stdout, "ts_group[2] 0x%08x\n", blob30->ts_group[2]);
|
||||||
fprintf(stdout, "sstsa 0x%08x\n", blob->sstsa);
|
fprintf(stdout, "ts_group[3] 0x%08x\n", blob30->ts_group[3]);
|
||||||
fprintf(stdout, "ssrsa 0x%08x\n", blob->ssrsa);
|
fprintf(stdout, "ts_group[4] 0x%08x\n", blob30->ts_group[4]);
|
||||||
fprintf(stdout, "ssc2 0x%08x\n", blob->ssc2);
|
fprintf(stdout, "ts_group[5] 0x%08x\n", blob30->ts_group[5]);
|
||||||
fprintf(stdout, "sspsp2 0x%08x\n", blob->sspsp2);
|
fprintf(stdout, "ts_group[6] 0x%08x\n", blob30->ts_group[6]);
|
||||||
fprintf(stdout, "ssc3 0x%08x\n", blob->ssc3);
|
fprintf(stdout, "ts_group[7] 0x%08x\n", blob30->ts_group[7]);
|
||||||
fprintf(stdout, "ssioc 0x%08x\n", blob->ssioc);
|
fprintf(stdout, "ssc0 0x%08x\n", blob30->ssc0);
|
||||||
fprintf(stdout, "mdivc 0x%08x\n", blob->mdivc);
|
fprintf(stdout, "ssc1 0x%08x\n", blob30->ssc1);
|
||||||
fprintf(stdout, "mdivr 0x%08x\n", blob->mdivr);
|
fprintf(stdout, "sscto 0x%08x\n", blob30->sscto);
|
||||||
|
fprintf(stdout, "sspsp 0x%08x\n", blob30->sspsp);
|
||||||
|
fprintf(stdout, "ssc2 0x%08x\n", blob30->ssc2);
|
||||||
|
fprintf(stdout, "sspsp2 0x%08x\n", blob30->sspsp2);
|
||||||
|
fprintf(stdout, "rsvd2 0x%08x\n", blob30->rsvd2);
|
||||||
|
fprintf(stdout, "ssioc 0x%08x\n", blob30->ssioc);
|
||||||
|
for (j = 0; j < I2SIPCMC; j++) {
|
||||||
|
fprintf(stdout, "rx_dir[%d] 0x%08x\n", j * 2, (uint32_t)(blob30->rx_dir[j].ssmidytsa & 0xffffffff));
|
||||||
|
fprintf(stdout, "rx_dir[%d] 0x%08x\n", j * 2 + 1, (uint32_t)(blob30->rx_dir[j].ssmidytsa >> 32));
|
||||||
}
|
}
|
||||||
|
for (j = 0; j < I2SOPCMC; j++) {
|
||||||
|
fprintf(stdout, "tx_dir[%d] 0x%08x\n", j * 2, (uint32_t)(blob30->tx_dir[j].ssmodytsa & 0xffffffff));
|
||||||
|
fprintf(stdout, "tx_dir[%d] 0x%08x\n", j * 2 + 1, (uint32_t)(blob30->tx_dir[j].ssmodytsa >> 32));
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout, "mdivc 0x%08x\n", blob30->mdivctlr);
|
||||||
|
fprintf(stdout, "mdivr count 0x%08x\n", blob30->mdivrcnt);
|
||||||
|
for (j = 0; j < blob30->mdivrcnt; j++)
|
||||||
|
fprintf(stdout, "mdivr 0x%08x\n",
|
||||||
|
ssp->ssp_prm[ssp_index].mdivr[i].mdivrs[j]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ssp_print_calculated(struct intel_ssp_params *ssp)
|
||||||
|
{
|
||||||
|
struct ssp_aux_blob *blob_aux;
|
||||||
|
int ssp_index = ssp->ssp_count;
|
||||||
|
uint32_t *ptr;
|
||||||
|
uint32_t i, j;
|
||||||
|
|
||||||
|
fprintf(stdout, "printing ssp nhlt calculated data:\n");
|
||||||
|
|
||||||
|
/* top level struct */
|
||||||
|
fprintf(stdout, "ssp index %d\n", ssp_index);
|
||||||
|
|
||||||
|
fprintf(stdout, "ssp %d dai_index: %u\n", ssp_index, ssp->ssp_dai_index[ssp_index]);
|
||||||
|
|
||||||
|
fprintf(stdout, "ssp blob version %u\n", ssp->ssp_prm[ssp_index].version);
|
||||||
|
|
||||||
|
fprintf(stdout, "ssp %d hw_config_count: %u\n", ssp_index,
|
||||||
|
ssp->ssp_hw_config_count[ssp_index]);
|
||||||
|
|
||||||
|
fprintf(stdout, "\n");
|
||||||
|
|
||||||
|
for (i = 0; i < ssp->ssp_hw_config_count[ssp_index]; i++) {
|
||||||
|
fprintf(stdout, "ssp blob %d hw_config %d\n", ssp->ssp_count, i);
|
||||||
|
switch (ssp->ssp_prm[ssp_index].version) {
|
||||||
|
case SSP_BLOB_VER_1_5:
|
||||||
|
ssp_print_blob15(ssp, i);
|
||||||
|
break;
|
||||||
|
case SSP_BLOB_VER_3_0:
|
||||||
|
ssp_print_blob30(ssp, i);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ssp_print_blob10(ssp, i);
|
||||||
|
}
|
||||||
|
|
||||||
blob_aux = (struct ssp_aux_blob *)&(ssp->ssp_blob_ext[ssp_index][i]);
|
blob_aux = (struct ssp_aux_blob *)&(ssp->ssp_blob_ext[ssp_index][i]);
|
||||||
fprintf(stdout, "aux_blob size %u\n", blob_aux->size);
|
fprintf(stdout, "aux_blob size %u\n", blob_aux->size);
|
||||||
for (j = 0; j < blob_aux->size; j += 4) {
|
for (j = 0; j < blob_aux->size; j += 4) {
|
||||||
|
@ -115,7 +178,7 @@ void ssp_print_internal(struct intel_ssp_params *ssp)
|
||||||
struct ssp_config_dai *dai;
|
struct ssp_config_dai *dai;
|
||||||
struct ssp_config_hw *hw_conf;
|
struct ssp_config_hw *hw_conf;
|
||||||
uint32_t enabled;
|
uint32_t enabled;
|
||||||
int i, j;
|
uint32_t i, j;
|
||||||
|
|
||||||
dai = &ssp->ssp_prm[ssp->ssp_count];
|
dai = &ssp->ssp_prm[ssp->ssp_count];
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@ struct ssp_intel_config_data {
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
#define SSP_BLOB_VER_1_5 0xEE000105
|
#define SSP_BLOB_VER_1_5 0xEE000105
|
||||||
|
#define SSP_BLOB_VER_3_0 0xEE000300
|
||||||
|
|
||||||
struct ssp_intel_config_data_1_5 {
|
struct ssp_intel_config_data_1_5 {
|
||||||
uint32_t gateway_attributes;
|
uint32_t gateway_attributes;
|
||||||
|
@ -52,6 +53,37 @@ struct ssp_intel_config_data_1_5 {
|
||||||
uint32_t mdivr[];
|
uint32_t mdivr[];
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
#define I2SIPCMC 8
|
||||||
|
#define I2SOPCMC 8
|
||||||
|
|
||||||
|
struct ssp_rx_dir {
|
||||||
|
uint64_t ssmidytsa;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
struct ssp_tx_dir {
|
||||||
|
uint64_t ssmodytsa;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
struct ssp_intel_config_data_3_0 {
|
||||||
|
uint32_t gateway_attributes;
|
||||||
|
uint32_t version;
|
||||||
|
uint32_t size;
|
||||||
|
uint32_t ts_group[8];
|
||||||
|
uint32_t ssc0;
|
||||||
|
uint32_t ssc1;
|
||||||
|
uint32_t sscto;
|
||||||
|
uint32_t sspsp;
|
||||||
|
uint32_t ssc2;
|
||||||
|
uint32_t sspsp2;
|
||||||
|
uint32_t rsvd2;
|
||||||
|
uint32_t ssioc;
|
||||||
|
struct ssp_rx_dir rx_dir[I2SIPCMC];
|
||||||
|
struct ssp_tx_dir tx_dir[I2SOPCMC];
|
||||||
|
uint32_t mdivctlr;
|
||||||
|
uint32_t mdivrcnt;
|
||||||
|
uint32_t mdivr[];
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
struct ssp_intel_aux_tlv {
|
struct ssp_intel_aux_tlv {
|
||||||
uint32_t type;
|
uint32_t type;
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
|
|
|
@ -147,6 +147,7 @@ struct intel_ssp_params {
|
||||||
/* ssp vendor blob structs */
|
/* ssp vendor blob structs */
|
||||||
struct ssp_intel_config_data ssp_blob[SSP_MAX_DAIS][SSP_MAX_HW_CONFIG];
|
struct ssp_intel_config_data ssp_blob[SSP_MAX_DAIS][SSP_MAX_HW_CONFIG];
|
||||||
struct ssp_intel_config_data_1_5 ssp_blob_1_5[SSP_MAX_DAIS][SSP_MAX_HW_CONFIG];
|
struct ssp_intel_config_data_1_5 ssp_blob_1_5[SSP_MAX_DAIS][SSP_MAX_HW_CONFIG];
|
||||||
|
struct ssp_intel_config_data_3_0 ssp_blob_3_0[SSP_MAX_DAIS][SSP_MAX_HW_CONFIG];
|
||||||
struct ssp_aux_blob ssp_blob_ext[SSP_MAX_DAIS][SSP_MAX_HW_CONFIG];
|
struct ssp_aux_blob ssp_blob_ext[SSP_MAX_DAIS][SSP_MAX_HW_CONFIG];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,47 @@ static int popcount(uint32_t value)
|
||||||
return bits_set;
|
return bits_set;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ssp_calculate_intern_v30(struct intel_nhlt_params *nhlt, int hwi)
|
||||||
|
{
|
||||||
|
struct intel_ssp_params *ssp = (struct intel_ssp_params *)nhlt->ssp_params;
|
||||||
|
int di = ssp->ssp_count;;
|
||||||
|
struct ssp_intel_config_data_3_0 *blob30 = &ssp->ssp_blob_3_0[di][hwi];
|
||||||
|
struct ssp_intel_config_data *blob = &ssp->ssp_blob[di][hwi];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
blob30->gateway_attributes = blob->gateway_attributes;
|
||||||
|
blob30->version = SSP_BLOB_VER_3_0;
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
blob30->ts_group[i] = blob->ts_group[i];
|
||||||
|
|
||||||
|
blob30->ssc0 = blob->ssc0;
|
||||||
|
blob30->ssc1 = blob->ssc1;
|
||||||
|
blob30->sscto = blob->sscto;
|
||||||
|
blob30->sspsp = blob->sspsp;
|
||||||
|
blob30->ssc2 = blob->ssc2;
|
||||||
|
blob30->sspsp2 = blob->sspsp2;
|
||||||
|
blob30->rsvd2 = 0;
|
||||||
|
blob30->ssioc = blob->ssioc;
|
||||||
|
|
||||||
|
blob30->rx_dir[0].ssmidytsa = 3;
|
||||||
|
for (i = 1; i < I2SIPCMC; i++)
|
||||||
|
blob30->rx_dir[i].ssmidytsa = 0;
|
||||||
|
|
||||||
|
blob30->tx_dir[0].ssmodytsa = 3;
|
||||||
|
for (i = 1; i < I2SOPCMC; i++)
|
||||||
|
blob30->tx_dir[i].ssmodytsa = 0;
|
||||||
|
|
||||||
|
/* mdivr count is always 1 */
|
||||||
|
blob30->mdivctlr = blob->mdivc;
|
||||||
|
ssp->ssp_prm[di].mdivr[hwi].count = 1;
|
||||||
|
blob30->mdivrcnt = ssp->ssp_prm[di].mdivr[hwi].count;
|
||||||
|
ssp->ssp_prm[di].mdivr[hwi].mdivrs[0] = blob->mdivr;
|
||||||
|
|
||||||
|
blob30->size = sizeof(struct ssp_intel_config_data_3_0) +
|
||||||
|
blob30->mdivrcnt * sizeof(uint32_t) +
|
||||||
|
ssp->ssp_blob_ext[di][hwi].size;
|
||||||
|
}
|
||||||
|
|
||||||
static void ssp_calculate_intern_v15(struct intel_nhlt_params *nhlt, int hwi)
|
static void ssp_calculate_intern_v15(struct intel_nhlt_params *nhlt, int hwi)
|
||||||
{
|
{
|
||||||
struct intel_ssp_params *ssp = (struct intel_ssp_params *)nhlt->ssp_params;
|
struct intel_ssp_params *ssp = (struct intel_ssp_params *)nhlt->ssp_params;
|
||||||
|
@ -115,11 +156,17 @@ static int ssp_calculate_intern(struct intel_nhlt_params *nhlt, int hwi)
|
||||||
|
|
||||||
/* reset SSP settings */
|
/* reset SSP settings */
|
||||||
/* sscr0 dynamic settings are DSS, EDSS, SCR, FRDC, ECS */
|
/* sscr0 dynamic settings are DSS, EDSS, SCR, FRDC, ECS */
|
||||||
ssp->ssp_blob[di][hwi].ssc0 = SSCR0_PSP | SSCR0_RIM | SSCR0_TIM;
|
ssp->ssp_blob[di][hwi].ssc0 = SSCR0_MOD | SSCR0_PSP | SSCR0_RIM | SSCR0_TIM;
|
||||||
|
|
||||||
/* sscr1 dynamic settings are SFRMDIR, SCLKDIR, SCFR */
|
/* sscr1 dynamic settings are SFRMDIR, SCLKDIR, SCFR */
|
||||||
ssp->ssp_blob[di][hwi].ssc1 = SSCR1_TTE | SSCR1_TTELP | SSCR1_TRAIL | SSCR1_RSRE |
|
if (ssp->ssp_prm[di].version == SSP_BLOB_VER_3_0)
|
||||||
SSCR1_TSRE;
|
/* bits 21 and 20, TSRE and RSRE do not exist in ACE3.x
|
||||||
|
* Note: Assuming SSP_BLOB_VER_3_0 is ACE3.x
|
||||||
|
*/
|
||||||
|
ssp->ssp_blob[di][hwi].ssc1 = SSCR1_TTE | SSCR1_TTELP | SSCR1_TRAIL;
|
||||||
|
else
|
||||||
|
ssp->ssp_blob[di][hwi].ssc1 = SSCR1_TTE | SSCR1_TTELP | SSCR1_TRAIL |
|
||||||
|
SSCR1_RSRE | SSCR1_TSRE;
|
||||||
|
|
||||||
/* sscr2 dynamic setting is LJDFD */
|
/* sscr2 dynamic setting is LJDFD */
|
||||||
ssp->ssp_blob[di][hwi].ssc2 = SSCR2_SDFD | SSCR2_TURM1;
|
ssp->ssp_blob[di][hwi].ssc2 = SSCR2_SDFD | SSCR2_TURM1;
|
||||||
|
@ -197,7 +244,13 @@ static int ssp_calculate_intern(struct intel_nhlt_params *nhlt, int hwi)
|
||||||
ssp->ssp_blob[di][hwi].sspsp |= SSPSP_SCMODE(inverted_bclk);
|
ssp->ssp_blob[di][hwi].sspsp |= SSPSP_SCMODE(inverted_bclk);
|
||||||
}
|
}
|
||||||
|
|
||||||
ssp->ssp_blob[di][hwi].ssc0 |= SSCR0_MOD | SSCR0_ACS;
|
/* Note: ACS as SSCR0(30) does not exist in any ACE version, or cAVS2.x. This disables
|
||||||
|
* it for ACE3.x. It might be good to fix later for other platforms. In cAVS this is 30:29
|
||||||
|
* reserved, in ACE1.x this is DLE as 30:29, in ACE2.x this is RSVD30 as 30:29, in ACE3.x this
|
||||||
|
* is DLE as 30:29.
|
||||||
|
*/
|
||||||
|
if (ssp->ssp_prm[di].version != SSP_BLOB_VER_3_0)
|
||||||
|
ssp->ssp_blob[di][hwi].ssc0 |= SSCR0_ACS;
|
||||||
|
|
||||||
/* Additional hardware settings */
|
/* Additional hardware settings */
|
||||||
|
|
||||||
|
@ -538,12 +591,22 @@ static int ssp_calculate_intern(struct intel_nhlt_params *nhlt, int hwi)
|
||||||
|
|
||||||
ssp->ssp_blob[di][hwi].mdivr = clk_div;
|
ssp->ssp_blob[di][hwi].mdivr = clk_div;
|
||||||
/* clock will always go through the divider */
|
/* clock will always go through the divider */
|
||||||
|
|
||||||
|
/* Note: There is no SSC0(6) ECS in ACE3.x but RSVD6 in same bit position
|
||||||
|
* that must be set to one.
|
||||||
|
*/
|
||||||
ssp->ssp_blob[di][hwi].ssc0 |= SSCR0_ECS;
|
ssp->ssp_blob[di][hwi].ssc0 |= SSCR0_ECS;
|
||||||
|
|
||||||
/* enable divider for this clock id */
|
/* enable divider for this clock id */
|
||||||
ssp->ssp_blob[di][hwi].mdivc |= BIT(ssp->ssp_prm[di].mclk_id);
|
ssp->ssp_blob[di][hwi].mdivc |= BIT(ssp->ssp_prm[di].mclk_id);
|
||||||
/* set mclk source always for audio cardinal clock */
|
/* set mclk source always for audio cardinal clock */
|
||||||
ssp->ssp_blob[di][hwi].mdivc |= MCDSS(SSP_CLOCK_AUDIO_CARDINAL);
|
ssp->ssp_blob[di][hwi].mdivc |= MCDSS(SSP_CLOCK_AUDIO_CARDINAL);
|
||||||
/* set bclk source for audio cardinal clock */
|
/* set bclk source for audio cardinal clock
|
||||||
|
* Note: There is no MDIVXCTRL(21:20) MNDSS in any ACE version 1.x - 3.x. MNDSS
|
||||||
|
* exists in cAVS2.x. This removes the set for ACE3.x. May need to address other
|
||||||
|
* ACE platforms later.
|
||||||
|
*/
|
||||||
|
if (ssp->ssp_prm[di].version != SSP_BLOB_VER_3_0)
|
||||||
ssp->ssp_blob[di][hwi].mdivc |= MNDSS(SSP_CLOCK_AUDIO_CARDINAL);
|
ssp->ssp_blob[di][hwi].mdivc |= MNDSS(SSP_CLOCK_AUDIO_CARDINAL);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -748,6 +811,9 @@ int ssp_calculate(struct intel_nhlt_params *nhlt)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
/* v15 blob is made from legacy blob, so it can't fail */
|
/* v15 blob is made from legacy blob, so it can't fail */
|
||||||
ssp_calculate_intern_v15(nhlt, i);
|
ssp_calculate_intern_v15(nhlt, i);
|
||||||
|
|
||||||
|
/* v30 blob is made from legacy blob, so it can't fail */
|
||||||
|
ssp_calculate_intern_v30(nhlt, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
ssp_print_internal(ssp);
|
ssp_print_internal(ssp);
|
||||||
|
@ -826,6 +892,8 @@ int ssp_get_vendor_blob_size(struct intel_nhlt_params *nhlt, int dai_index,
|
||||||
/* set size for the blob */
|
/* set size for the blob */
|
||||||
if (ssp->ssp_prm[dai_index].version == SSP_BLOB_VER_1_5)
|
if (ssp->ssp_prm[dai_index].version == SSP_BLOB_VER_1_5)
|
||||||
*size = ssp->ssp_blob_1_5[dai_index][hw_config_index].size;
|
*size = ssp->ssp_blob_1_5[dai_index][hw_config_index].size;
|
||||||
|
else if (ssp->ssp_prm[dai_index].version == SSP_BLOB_VER_3_0)
|
||||||
|
*size = ssp->ssp_blob_3_0[dai_index][hw_config_index].size;
|
||||||
else
|
else
|
||||||
/* legacy */
|
/* legacy */
|
||||||
*size = sizeof(struct ssp_intel_config_data) +
|
*size = sizeof(struct ssp_intel_config_data) +
|
||||||
|
@ -867,8 +935,19 @@ int ssp_get_vendor_blob(struct intel_nhlt_params *nhlt, uint8_t *vendor_blob,
|
||||||
memcpy(vendor_blob + basic_len + clock_len,
|
memcpy(vendor_blob + basic_len + clock_len,
|
||||||
ssp->ssp_blob_ext[dai_index][hw_config_index].aux_blob,
|
ssp->ssp_blob_ext[dai_index][hw_config_index].aux_blob,
|
||||||
ssp->ssp_blob_ext[dai_index][hw_config_index].size);
|
ssp->ssp_blob_ext[dai_index][hw_config_index].size);
|
||||||
}
|
} else if (ssp->ssp_prm[dai_index].version == SSP_BLOB_VER_3_0) {
|
||||||
else {
|
basic_len = sizeof(struct ssp_intel_config_data_3_0);
|
||||||
|
clock_len = sizeof(uint32_t) * ssp->ssp_prm[dai_index].mdivr[hw_config_index].count;
|
||||||
|
/* basic data */
|
||||||
|
memcpy(vendor_blob, &ssp->ssp_blob_3_0[dai_index][hw_config_index], basic_len);
|
||||||
|
/* clock data */
|
||||||
|
memcpy(vendor_blob + basic_len,
|
||||||
|
&ssp->ssp_prm[dai_index].mdivr[hw_config_index].mdivrs[0], clock_len);
|
||||||
|
/* ext data */
|
||||||
|
memcpy(vendor_blob + basic_len + clock_len,
|
||||||
|
ssp->ssp_blob_ext[dai_index][hw_config_index].aux_blob,
|
||||||
|
ssp->ssp_blob_ext[dai_index][hw_config_index].size);
|
||||||
|
} else {
|
||||||
basic_len = sizeof(struct ssp_intel_config_data);
|
basic_len = sizeof(struct ssp_intel_config_data);
|
||||||
/*basic data */
|
/*basic data */
|
||||||
memcpy(vendor_blob, &ssp->ssp_blob[dai_index][hw_config_index], basic_len);
|
memcpy(vendor_blob, &ssp->ssp_blob[dai_index][hw_config_index], basic_len);
|
||||||
|
@ -914,6 +993,9 @@ int ssp_set_params(struct intel_nhlt_params *nhlt, const char *dir, int dai_inde
|
||||||
/* let's compare the lower 16 bits as we don't send the signature from topology */
|
/* let's compare the lower 16 bits as we don't send the signature from topology */
|
||||||
if (version == (SSP_BLOB_VER_1_5 & ((1 << 16) - 1)))
|
if (version == (SSP_BLOB_VER_1_5 & ((1 << 16) - 1)))
|
||||||
ssp->ssp_prm[ssp->ssp_count].version = SSP_BLOB_VER_1_5;
|
ssp->ssp_prm[ssp->ssp_count].version = SSP_BLOB_VER_1_5;
|
||||||
|
else if (version == (SSP_BLOB_VER_3_0 & ((1 << 16) - 1)))
|
||||||
|
ssp->ssp_prm[ssp->ssp_count].version = SSP_BLOB_VER_3_0;
|
||||||
|
|
||||||
if (tdm_padding_per_slot && !strcmp(tdm_padding_per_slot, "true"))
|
if (tdm_padding_per_slot && !strcmp(tdm_padding_per_slot, "true"))
|
||||||
ssp->ssp_prm[ssp->ssp_count].tdm_per_slot_padding_flag = 1;
|
ssp->ssp_prm[ssp->ssp_count].tdm_per_slot_padding_flag = 1;
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in a new issue