Merge remote-tracking branches 'asoc/fix/davinci', 'asoc/fix/es8328', 'asoc/fix/fsl-sai', 'asoc/fix/rockchip', 'asoc/fix/sgtl5000' and 'asoc/fix/wm8974' into asoc-linus
This commit is contained in:
commit
3dd5fc0eeb
|
@ -85,7 +85,15 @@ static const DECLARE_TLV_DB_SCALE(pga_tlv, 0, 300, 0);
|
|||
static const DECLARE_TLV_DB_SCALE(bypass_tlv, -1500, 300, 0);
|
||||
static const DECLARE_TLV_DB_SCALE(mic_tlv, 0, 300, 0);
|
||||
|
||||
static const int deemph_settings[] = { 0, 32000, 44100, 48000 };
|
||||
static const struct {
|
||||
int rate;
|
||||
unsigned int val;
|
||||
} deemph_settings[] = {
|
||||
{ 0, ES8328_DACCONTROL6_DEEMPH_OFF },
|
||||
{ 32000, ES8328_DACCONTROL6_DEEMPH_32k },
|
||||
{ 44100, ES8328_DACCONTROL6_DEEMPH_44_1k },
|
||||
{ 48000, ES8328_DACCONTROL6_DEEMPH_48k },
|
||||
};
|
||||
|
||||
static int es8328_set_deemph(struct snd_soc_codec *codec)
|
||||
{
|
||||
|
@ -97,21 +105,22 @@ static int es8328_set_deemph(struct snd_soc_codec *codec)
|
|||
* rate.
|
||||
*/
|
||||
if (es8328->deemph) {
|
||||
best = 1;
|
||||
for (i = 2; i < ARRAY_SIZE(deemph_settings); i++) {
|
||||
if (abs(deemph_settings[i] - es8328->playback_fs) <
|
||||
abs(deemph_settings[best] - es8328->playback_fs))
|
||||
best = 0;
|
||||
for (i = 1; i < ARRAY_SIZE(deemph_settings); i++) {
|
||||
if (abs(deemph_settings[i].rate - es8328->playback_fs) <
|
||||
abs(deemph_settings[best].rate - es8328->playback_fs))
|
||||
best = i;
|
||||
}
|
||||
|
||||
val = best << 1;
|
||||
val = deemph_settings[best].val;
|
||||
} else {
|
||||
val = 0;
|
||||
val = ES8328_DACCONTROL6_DEEMPH_OFF;
|
||||
}
|
||||
|
||||
dev_dbg(codec->dev, "Set deemphasis %d\n", val);
|
||||
|
||||
return snd_soc_update_bits(codec, ES8328_DACCONTROL6, 0x6, val);
|
||||
return snd_soc_update_bits(codec, ES8328_DACCONTROL6,
|
||||
ES8328_DACCONTROL6_DEEMPH_MASK, val);
|
||||
}
|
||||
|
||||
static int es8328_get_deemph(struct snd_kcontrol *kcontrol,
|
||||
|
|
|
@ -153,6 +153,7 @@ int es8328_probe(struct device *dev, struct regmap *regmap);
|
|||
#define ES8328_DACCONTROL6_CLICKFREE (1 << 3)
|
||||
#define ES8328_DACCONTROL6_DAC_INVR (1 << 4)
|
||||
#define ES8328_DACCONTROL6_DAC_INVL (1 << 5)
|
||||
#define ES8328_DACCONTROL6_DEEMPH_MASK (3 << 6)
|
||||
#define ES8328_DACCONTROL6_DEEMPH_OFF (0 << 6)
|
||||
#define ES8328_DACCONTROL6_DEEMPH_32k (1 << 6)
|
||||
#define ES8328_DACCONTROL6_DEEMPH_44_1k (2 << 6)
|
||||
|
|
|
@ -189,6 +189,7 @@ static int power_vag_event(struct snd_soc_dapm_widget *w,
|
|||
case SND_SOC_DAPM_POST_PMU:
|
||||
snd_soc_update_bits(codec, SGTL5000_CHIP_ANA_POWER,
|
||||
SGTL5000_VAG_POWERUP, SGTL5000_VAG_POWERUP);
|
||||
msleep(400);
|
||||
break;
|
||||
|
||||
case SND_SOC_DAPM_PRE_PMD:
|
||||
|
|
|
@ -574,6 +574,7 @@ static const struct regmap_config wm8974_regmap = {
|
|||
.max_register = WM8974_MONOMIX,
|
||||
.reg_defaults = wm8974_reg_defaults,
|
||||
.num_reg_defaults = ARRAY_SIZE(wm8974_reg_defaults),
|
||||
.cache_type = REGCACHE_FLAT,
|
||||
};
|
||||
|
||||
static int wm8974_probe(struct snd_soc_codec *codec)
|
||||
|
|
|
@ -223,8 +223,8 @@ static void mcasp_start_tx(struct davinci_mcasp *mcasp)
|
|||
|
||||
/* wait for XDATA to be cleared */
|
||||
cnt = 0;
|
||||
while (!(mcasp_get_reg(mcasp, DAVINCI_MCASP_TXSTAT_REG) &
|
||||
~XRDATA) && (cnt < 100000))
|
||||
while ((mcasp_get_reg(mcasp, DAVINCI_MCASP_TXSTAT_REG) & XRDATA) &&
|
||||
(cnt < 100000))
|
||||
cnt++;
|
||||
|
||||
/* Release TX state machine */
|
||||
|
|
|
@ -505,6 +505,24 @@ static int fsl_sai_trigger(struct snd_pcm_substream *substream, int cmd,
|
|||
FSL_SAI_CSR_FR, FSL_SAI_CSR_FR);
|
||||
regmap_update_bits(sai->regmap, FSL_SAI_RCSR,
|
||||
FSL_SAI_CSR_FR, FSL_SAI_CSR_FR);
|
||||
|
||||
/*
|
||||
* For sai master mode, after several open/close sai,
|
||||
* there will be no frame clock, and can't recover
|
||||
* anymore. Add software reset to fix this issue.
|
||||
* This is a hardware bug, and will be fix in the
|
||||
* next sai version.
|
||||
*/
|
||||
if (!sai->is_slave_mode) {
|
||||
/* Software Reset for both Tx and Rx */
|
||||
regmap_write(sai->regmap,
|
||||
FSL_SAI_TCSR, FSL_SAI_CSR_SR);
|
||||
regmap_write(sai->regmap,
|
||||
FSL_SAI_RCSR, FSL_SAI_CSR_SR);
|
||||
/* Clear SR bit to finish the reset */
|
||||
regmap_write(sai->regmap, FSL_SAI_TCSR, 0);
|
||||
regmap_write(sai->regmap, FSL_SAI_RCSR, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -152,8 +152,10 @@ static int rk_spdif_trigger(struct snd_pcm_substream *substream,
|
|||
case SNDRV_PCM_TRIGGER_RESUME:
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
||||
ret = regmap_update_bits(spdif->regmap, SPDIF_DMACR,
|
||||
SPDIF_DMACR_TDE_ENABLE,
|
||||
SPDIF_DMACR_TDE_ENABLE);
|
||||
SPDIF_DMACR_TDE_ENABLE |
|
||||
SPDIF_DMACR_TDL_MASK,
|
||||
SPDIF_DMACR_TDE_ENABLE |
|
||||
SPDIF_DMACR_TDL(16));
|
||||
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
|
||||
#define SPDIF_DMACR_TDL_SHIFT 0
|
||||
#define SPDIF_DMACR_TDL(x) ((x) << SPDIF_DMACR_TDL_SHIFT)
|
||||
#define SPDIF_DMACR_TDL_MASK (0x1f << SDPIF_DMACR_TDL_SHIFT)
|
||||
#define SPDIF_DMACR_TDL_MASK (0x1f << SPDIF_DMACR_TDL_SHIFT)
|
||||
|
||||
/*
|
||||
* XFER
|
||||
|
|
Loading…
Reference in New Issue