Merge remote-tracking branch 'asoc/for-5.15' into asoc-linus
This commit is contained in:
commit
8e14329645
@ -34,6 +34,10 @@ properties:
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
AVDD-supply:
|
||||
description:
|
||||
Analogue power supply.
|
||||
|
||||
required:
|
||||
- "#sound-dai-cells"
|
||||
- compatible
|
||||
@ -41,6 +45,7 @@ required:
|
||||
- clocks
|
||||
- clock-names
|
||||
- resets
|
||||
- AVDD-supply
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
@ -56,4 +61,5 @@ examples:
|
||||
clocks = <&clkc CLKID_AUDIO_CODEC>;
|
||||
clock-names = "pclk";
|
||||
resets = <&reset RESET_AUDIO_CODEC>;
|
||||
AVDD-supply = <&vddao_1v8>;
|
||||
};
|
||||
|
@ -17883,7 +17883,8 @@ M: Olivier Moysan <olivier.moysan@foss.st.com>
|
||||
M: Arnaud Pouliquen <arnaud.pouliquen@foss.st.com>
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/iio/adc/st,stm32-*.yaml
|
||||
F: Documentation/devicetree/bindings/iio/adc/st,stm32-dfsdm-adc.yaml
|
||||
F: Documentation/devicetree/bindings/sound/st,stm32-*.yaml
|
||||
F: sound/soc/stm/
|
||||
|
||||
STM32 TIMER/LPTIMER DRIVERS
|
||||
|
@ -1583,6 +1583,7 @@ config SND_SOC_WCD938X_SDW
|
||||
tristate "WCD9380/WCD9385 Codec - SDW"
|
||||
select SND_SOC_WCD938X
|
||||
select SND_SOC_WCD_MBHC
|
||||
select REGMAP_IRQ
|
||||
depends on SOUNDWIRE
|
||||
select REGMAP_SOUNDWIRE
|
||||
help
|
||||
|
@ -41,7 +41,6 @@
|
||||
static const struct reg_default cs42l42_reg_defaults[] = {
|
||||
{ CS42L42_FRZ_CTL, 0x00 },
|
||||
{ CS42L42_SRC_CTL, 0x10 },
|
||||
{ CS42L42_MCLK_STATUS, 0x02 },
|
||||
{ CS42L42_MCLK_CTL, 0x02 },
|
||||
{ CS42L42_SFTRAMP_RATE, 0xA4 },
|
||||
{ CS42L42_I2C_DEBOUNCE, 0x88 },
|
||||
@ -53,15 +52,12 @@ static const struct reg_default cs42l42_reg_defaults[] = {
|
||||
{ CS42L42_RSENSE_CTL1, 0x40 },
|
||||
{ CS42L42_RSENSE_CTL2, 0x00 },
|
||||
{ CS42L42_OSC_SWITCH, 0x00 },
|
||||
{ CS42L42_OSC_SWITCH_STATUS, 0x05 },
|
||||
{ CS42L42_RSENSE_CTL3, 0x1B },
|
||||
{ CS42L42_TSENSE_CTL, 0x1B },
|
||||
{ CS42L42_TSRS_INT_DISABLE, 0x00 },
|
||||
{ CS42L42_TRSENSE_STATUS, 0x00 },
|
||||
{ CS42L42_HSDET_CTL1, 0x77 },
|
||||
{ CS42L42_HSDET_CTL2, 0x00 },
|
||||
{ CS42L42_HS_SWITCH_CTL, 0xF3 },
|
||||
{ CS42L42_HS_DET_STATUS, 0x00 },
|
||||
{ CS42L42_HS_CLAMP_DISABLE, 0x00 },
|
||||
{ CS42L42_MCLK_SRC_SEL, 0x00 },
|
||||
{ CS42L42_SPDIF_CLK_CFG, 0x00 },
|
||||
@ -75,25 +71,13 @@ static const struct reg_default cs42l42_reg_defaults[] = {
|
||||
{ CS42L42_IN_ASRC_CLK, 0x00 },
|
||||
{ CS42L42_OUT_ASRC_CLK, 0x00 },
|
||||
{ CS42L42_PLL_DIV_CFG1, 0x00 },
|
||||
{ CS42L42_ADC_OVFL_STATUS, 0x00 },
|
||||
{ CS42L42_MIXER_STATUS, 0x00 },
|
||||
{ CS42L42_SRC_STATUS, 0x00 },
|
||||
{ CS42L42_ASP_RX_STATUS, 0x00 },
|
||||
{ CS42L42_ASP_TX_STATUS, 0x00 },
|
||||
{ CS42L42_CODEC_STATUS, 0x00 },
|
||||
{ CS42L42_DET_INT_STATUS1, 0x00 },
|
||||
{ CS42L42_DET_INT_STATUS2, 0x00 },
|
||||
{ CS42L42_SRCPL_INT_STATUS, 0x00 },
|
||||
{ CS42L42_VPMON_STATUS, 0x00 },
|
||||
{ CS42L42_PLL_LOCK_STATUS, 0x00 },
|
||||
{ CS42L42_TSRS_PLUG_STATUS, 0x00 },
|
||||
{ CS42L42_ADC_OVFL_INT_MASK, 0x01 },
|
||||
{ CS42L42_MIXER_INT_MASK, 0x0F },
|
||||
{ CS42L42_SRC_INT_MASK, 0x0F },
|
||||
{ CS42L42_ASP_RX_INT_MASK, 0x1F },
|
||||
{ CS42L42_ASP_TX_INT_MASK, 0x0F },
|
||||
{ CS42L42_CODEC_INT_MASK, 0x03 },
|
||||
{ CS42L42_SRCPL_INT_MASK, 0xFF },
|
||||
{ CS42L42_SRCPL_INT_MASK, 0x7F },
|
||||
{ CS42L42_VPMON_INT_MASK, 0x01 },
|
||||
{ CS42L42_PLL_LOCK_INT_MASK, 0x01 },
|
||||
{ CS42L42_TSRS_PLUG_INT_MASK, 0x0F },
|
||||
@ -105,8 +89,6 @@ static const struct reg_default cs42l42_reg_defaults[] = {
|
||||
{ CS42L42_PLL_CTL3, 0x10 },
|
||||
{ CS42L42_PLL_CAL_RATIO, 0x80 },
|
||||
{ CS42L42_PLL_CTL4, 0x03 },
|
||||
{ CS42L42_LOAD_DET_RCSTAT, 0x00 },
|
||||
{ CS42L42_LOAD_DET_DONE, 0x00 },
|
||||
{ CS42L42_LOAD_DET_EN, 0x00 },
|
||||
{ CS42L42_HSBIAS_SC_AUTOCTL, 0x03 },
|
||||
{ CS42L42_WAKE_CTL, 0xC0 },
|
||||
@ -115,8 +97,6 @@ static const struct reg_default cs42l42_reg_defaults[] = {
|
||||
{ CS42L42_MISC_DET_CTL, 0x03 },
|
||||
{ CS42L42_MIC_DET_CTL1, 0x1F },
|
||||
{ CS42L42_MIC_DET_CTL2, 0x2F },
|
||||
{ CS42L42_DET_STATUS1, 0x00 },
|
||||
{ CS42L42_DET_STATUS2, 0x00 },
|
||||
{ CS42L42_DET_INT1_MASK, 0xE0 },
|
||||
{ CS42L42_DET_INT2_MASK, 0xFF },
|
||||
{ CS42L42_HS_BIAS_CTL, 0xC2 },
|
||||
@ -130,7 +110,7 @@ static const struct reg_default cs42l42_reg_defaults[] = {
|
||||
{ CS42L42_MIXER_CHA_VOL, 0x3F },
|
||||
{ CS42L42_MIXER_ADC_VOL, 0x3F },
|
||||
{ CS42L42_MIXER_CHB_VOL, 0x3F },
|
||||
{ CS42L42_EQ_COEF_IN0, 0x22 },
|
||||
{ CS42L42_EQ_COEF_IN0, 0x00 },
|
||||
{ CS42L42_EQ_COEF_IN1, 0x00 },
|
||||
{ CS42L42_EQ_COEF_IN2, 0x00 },
|
||||
{ CS42L42_EQ_COEF_IN3, 0x00 },
|
||||
@ -182,7 +162,6 @@ static const struct reg_default cs42l42_reg_defaults[] = {
|
||||
{ CS42L42_ASP_RX_DAI1_CH2_AP_RES, 0x03 },
|
||||
{ CS42L42_ASP_RX_DAI1_CH2_BIT_MSB, 0x00 },
|
||||
{ CS42L42_ASP_RX_DAI1_CH2_BIT_LSB, 0x00 },
|
||||
{ CS42L42_SUB_REVID, 0x03 },
|
||||
};
|
||||
|
||||
static bool cs42l42_readable_register(struct device *dev, unsigned int reg)
|
||||
@ -351,6 +330,7 @@ static bool cs42l42_volatile_register(struct device *dev, unsigned int reg)
|
||||
case CS42L42_DEVID_CD:
|
||||
case CS42L42_DEVID_E:
|
||||
case CS42L42_MCLK_STATUS:
|
||||
case CS42L42_OSC_SWITCH_STATUS:
|
||||
case CS42L42_TRSENSE_STATUS:
|
||||
case CS42L42_HS_DET_STATUS:
|
||||
case CS42L42_ADC_OVFL_STATUS:
|
||||
@ -455,10 +435,36 @@ static const struct snd_kcontrol_new cs42l42_snd_controls[] = {
|
||||
0x3f, 1, mixer_tlv)
|
||||
};
|
||||
|
||||
static int cs42l42_hp_adc_ev(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
|
||||
struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_PRE_PMU:
|
||||
cs42l42->hp_adc_up_pending = true;
|
||||
break;
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
/* Only need one delay if HP and ADC are both powering-up */
|
||||
if (cs42l42->hp_adc_up_pending) {
|
||||
usleep_range(CS42L42_HP_ADC_EN_TIME_US,
|
||||
CS42L42_HP_ADC_EN_TIME_US + 1000);
|
||||
cs42l42->hp_adc_up_pending = false;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct snd_soc_dapm_widget cs42l42_dapm_widgets[] = {
|
||||
/* Playback Path */
|
||||
SND_SOC_DAPM_OUTPUT("HP"),
|
||||
SND_SOC_DAPM_DAC("DAC", NULL, CS42L42_PWR_CTL1, CS42L42_HP_PDN_SHIFT, 1),
|
||||
SND_SOC_DAPM_DAC_E("DAC", NULL, CS42L42_PWR_CTL1, CS42L42_HP_PDN_SHIFT, 1,
|
||||
cs42l42_hp_adc_ev, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
|
||||
SND_SOC_DAPM_MIXER("MIXER", CS42L42_PWR_CTL1, CS42L42_MIXER_PDN_SHIFT, 1, NULL, 0),
|
||||
SND_SOC_DAPM_AIF_IN("SDIN1", NULL, 0, SND_SOC_NOPM, 0, 0),
|
||||
SND_SOC_DAPM_AIF_IN("SDIN2", NULL, 1, SND_SOC_NOPM, 0, 0),
|
||||
@ -468,7 +474,8 @@ static const struct snd_soc_dapm_widget cs42l42_dapm_widgets[] = {
|
||||
|
||||
/* Capture Path */
|
||||
SND_SOC_DAPM_INPUT("HS"),
|
||||
SND_SOC_DAPM_ADC("ADC", NULL, CS42L42_PWR_CTL1, CS42L42_ADC_PDN_SHIFT, 1),
|
||||
SND_SOC_DAPM_ADC_E("ADC", NULL, CS42L42_PWR_CTL1, CS42L42_ADC_PDN_SHIFT, 1,
|
||||
cs42l42_hp_adc_ev, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
|
||||
SND_SOC_DAPM_AIF_OUT("SDOUT1", NULL, 0, CS42L42_ASP_TX_CH_EN, CS42L42_ASP_TX0_CH1_SHIFT, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("SDOUT2", NULL, 1, CS42L42_ASP_TX_CH_EN, CS42L42_ASP_TX0_CH2_SHIFT, 0),
|
||||
|
||||
@ -517,12 +524,6 @@ static int cs42l42_set_jack(struct snd_soc_component *component, struct snd_soc_
|
||||
|
||||
cs42l42->jack = jk;
|
||||
|
||||
regmap_update_bits(cs42l42->regmap, CS42L42_TSRS_PLUG_INT_MASK,
|
||||
CS42L42_RS_PLUG_MASK | CS42L42_RS_UNPLUG_MASK |
|
||||
CS42L42_TS_PLUG_MASK | CS42L42_TS_UNPLUG_MASK,
|
||||
(1 << CS42L42_RS_PLUG_SHIFT) | (1 << CS42L42_RS_UNPLUG_SHIFT) |
|
||||
(0 << CS42L42_TS_PLUG_SHIFT) | (0 << CS42L42_TS_UNPLUG_SHIFT));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -569,7 +570,6 @@ static const struct reg_sequence cs42l42_to_osc_seq[] = {
|
||||
|
||||
struct cs42l42_pll_params {
|
||||
u32 sclk;
|
||||
u8 mclk_div;
|
||||
u8 mclk_src_sel;
|
||||
u8 sclk_prediv;
|
||||
u8 pll_div_int;
|
||||
@ -586,24 +586,24 @@ struct cs42l42_pll_params {
|
||||
* Table 4-5 from the Datasheet
|
||||
*/
|
||||
static const struct cs42l42_pll_params pll_ratio_table[] = {
|
||||
{ 1411200, 0, 1, 0x00, 0x80, 0x000000, 0x03, 0x10, 11289600, 128, 2},
|
||||
{ 1536000, 0, 1, 0x00, 0x7D, 0x000000, 0x03, 0x10, 12000000, 125, 2},
|
||||
{ 2304000, 0, 1, 0x00, 0x55, 0xC00000, 0x02, 0x10, 12288000, 85, 2},
|
||||
{ 2400000, 0, 1, 0x00, 0x50, 0x000000, 0x03, 0x10, 12000000, 80, 2},
|
||||
{ 2822400, 0, 1, 0x00, 0x40, 0x000000, 0x03, 0x10, 11289600, 128, 1},
|
||||
{ 3000000, 0, 1, 0x00, 0x40, 0x000000, 0x03, 0x10, 12000000, 128, 1},
|
||||
{ 3072000, 0, 1, 0x00, 0x3E, 0x800000, 0x03, 0x10, 12000000, 125, 1},
|
||||
{ 4000000, 0, 1, 0x00, 0x30, 0x800000, 0x03, 0x10, 12000000, 96, 1},
|
||||
{ 4096000, 0, 1, 0x00, 0x2E, 0xE00000, 0x03, 0x10, 12000000, 94, 1},
|
||||
{ 5644800, 0, 1, 0x01, 0x40, 0x000000, 0x03, 0x10, 11289600, 128, 1},
|
||||
{ 6000000, 0, 1, 0x01, 0x40, 0x000000, 0x03, 0x10, 12000000, 128, 1},
|
||||
{ 6144000, 0, 1, 0x01, 0x3E, 0x800000, 0x03, 0x10, 12000000, 125, 1},
|
||||
{ 11289600, 0, 0, 0, 0, 0, 0, 0, 11289600, 0, 1},
|
||||
{ 12000000, 0, 0, 0, 0, 0, 0, 0, 12000000, 0, 1},
|
||||
{ 12288000, 0, 0, 0, 0, 0, 0, 0, 12288000, 0, 1},
|
||||
{ 22579200, 1, 0, 0, 0, 0, 0, 0, 22579200, 0, 1},
|
||||
{ 24000000, 1, 0, 0, 0, 0, 0, 0, 24000000, 0, 1},
|
||||
{ 24576000, 1, 0, 0, 0, 0, 0, 0, 24576000, 0, 1}
|
||||
{ 1411200, 1, 0x00, 0x80, 0x000000, 0x03, 0x10, 11289600, 128, 2},
|
||||
{ 1536000, 1, 0x00, 0x7D, 0x000000, 0x03, 0x10, 12000000, 125, 2},
|
||||
{ 2304000, 1, 0x00, 0x55, 0xC00000, 0x02, 0x10, 12288000, 85, 2},
|
||||
{ 2400000, 1, 0x00, 0x50, 0x000000, 0x03, 0x10, 12000000, 80, 2},
|
||||
{ 2822400, 1, 0x00, 0x40, 0x000000, 0x03, 0x10, 11289600, 128, 1},
|
||||
{ 3000000, 1, 0x00, 0x40, 0x000000, 0x03, 0x10, 12000000, 128, 1},
|
||||
{ 3072000, 1, 0x00, 0x3E, 0x800000, 0x03, 0x10, 12000000, 125, 1},
|
||||
{ 4000000, 1, 0x00, 0x30, 0x800000, 0x03, 0x10, 12000000, 96, 1},
|
||||
{ 4096000, 1, 0x00, 0x2E, 0xE00000, 0x03, 0x10, 12000000, 94, 1},
|
||||
{ 5644800, 1, 0x01, 0x40, 0x000000, 0x03, 0x10, 11289600, 128, 1},
|
||||
{ 6000000, 1, 0x01, 0x40, 0x000000, 0x03, 0x10, 12000000, 128, 1},
|
||||
{ 6144000, 1, 0x01, 0x3E, 0x800000, 0x03, 0x10, 12000000, 125, 1},
|
||||
{ 11289600, 0, 0, 0, 0, 0, 0, 11289600, 0, 1},
|
||||
{ 12000000, 0, 0, 0, 0, 0, 0, 12000000, 0, 1},
|
||||
{ 12288000, 0, 0, 0, 0, 0, 0, 12288000, 0, 1},
|
||||
{ 22579200, 1, 0x03, 0x40, 0x000000, 0x03, 0x10, 11289600, 128, 1},
|
||||
{ 24000000, 1, 0x03, 0x40, 0x000000, 0x03, 0x10, 12000000, 128, 1},
|
||||
{ 24576000, 1, 0x03, 0x40, 0x000000, 0x03, 0x10, 12288000, 128, 1}
|
||||
};
|
||||
|
||||
static int cs42l42_pll_config(struct snd_soc_component *component)
|
||||
@ -618,6 +618,14 @@ static int cs42l42_pll_config(struct snd_soc_component *component)
|
||||
else
|
||||
clk = cs42l42->sclk;
|
||||
|
||||
/* Don't reconfigure if there is an audio stream running */
|
||||
if (cs42l42->stream_use) {
|
||||
if (pll_ratio_table[cs42l42->pll_config].sclk == clk)
|
||||
return 0;
|
||||
else
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(pll_ratio_table); i++) {
|
||||
if (pll_ratio_table[i].sclk == clk) {
|
||||
cs42l42->pll_config = i;
|
||||
@ -631,10 +639,6 @@ static int cs42l42_pll_config(struct snd_soc_component *component)
|
||||
24000000)) <<
|
||||
CS42L42_INTERNAL_FS_SHIFT);
|
||||
|
||||
snd_soc_component_update_bits(component, CS42L42_MCLK_SRC_SEL,
|
||||
CS42L42_MCLKDIV_MASK,
|
||||
(pll_ratio_table[i].mclk_div <<
|
||||
CS42L42_MCLKDIV_SHIFT));
|
||||
/* Set up the LRCLK */
|
||||
fsync = clk / cs42l42->srate;
|
||||
if (((fsync * cs42l42->srate) != clk)
|
||||
@ -668,22 +672,6 @@ static int cs42l42_pll_config(struct snd_soc_component *component)
|
||||
CS42L42_FSYNC_PULSE_WIDTH_MASK,
|
||||
CS42L42_FRAC1_VAL(fsync - 1) <<
|
||||
CS42L42_FSYNC_PULSE_WIDTH_SHIFT);
|
||||
/* Set the sample rates (96k or lower) */
|
||||
snd_soc_component_update_bits(component, CS42L42_FS_RATE_EN,
|
||||
CS42L42_FS_EN_MASK,
|
||||
(CS42L42_FS_EN_IASRC_96K |
|
||||
CS42L42_FS_EN_OASRC_96K) <<
|
||||
CS42L42_FS_EN_SHIFT);
|
||||
/* Set the input/output internal MCLK clock ~12 MHz */
|
||||
snd_soc_component_update_bits(component, CS42L42_IN_ASRC_CLK,
|
||||
CS42L42_CLK_IASRC_SEL_MASK,
|
||||
CS42L42_CLK_IASRC_SEL_12 <<
|
||||
CS42L42_CLK_IASRC_SEL_SHIFT);
|
||||
snd_soc_component_update_bits(component,
|
||||
CS42L42_OUT_ASRC_CLK,
|
||||
CS42L42_CLK_OASRC_SEL_MASK,
|
||||
CS42L42_CLK_OASRC_SEL_12 <<
|
||||
CS42L42_CLK_OASRC_SEL_SHIFT);
|
||||
if (pll_ratio_table[i].mclk_src_sel == 0) {
|
||||
/* Pass the clock straight through */
|
||||
snd_soc_component_update_bits(component,
|
||||
@ -746,6 +734,39 @@ static int cs42l42_pll_config(struct snd_soc_component *component)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static void cs42l42_src_config(struct snd_soc_component *component, unsigned int sample_rate)
|
||||
{
|
||||
struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component);
|
||||
unsigned int fs;
|
||||
|
||||
/* Don't reconfigure if there is an audio stream running */
|
||||
if (cs42l42->stream_use)
|
||||
return;
|
||||
|
||||
/* SRC MCLK must be as close as possible to 125 * sample rate */
|
||||
if (sample_rate <= 48000)
|
||||
fs = CS42L42_CLK_IASRC_SEL_6;
|
||||
else
|
||||
fs = CS42L42_CLK_IASRC_SEL_12;
|
||||
|
||||
/* Set the sample rates (96k or lower) */
|
||||
snd_soc_component_update_bits(component,
|
||||
CS42L42_FS_RATE_EN,
|
||||
CS42L42_FS_EN_MASK,
|
||||
(CS42L42_FS_EN_IASRC_96K |
|
||||
CS42L42_FS_EN_OASRC_96K) <<
|
||||
CS42L42_FS_EN_SHIFT);
|
||||
|
||||
snd_soc_component_update_bits(component,
|
||||
CS42L42_IN_ASRC_CLK,
|
||||
CS42L42_CLK_IASRC_SEL_MASK,
|
||||
fs << CS42L42_CLK_IASRC_SEL_SHIFT);
|
||||
snd_soc_component_update_bits(component,
|
||||
CS42L42_OUT_ASRC_CLK,
|
||||
CS42L42_CLK_OASRC_SEL_MASK,
|
||||
fs << CS42L42_CLK_OASRC_SEL_SHIFT);
|
||||
}
|
||||
|
||||
static int cs42l42_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
|
||||
{
|
||||
struct snd_soc_component *component = codec_dai->component;
|
||||
@ -824,7 +845,7 @@ static int cs42l42_dai_startup(struct snd_pcm_substream *substream, struct snd_s
|
||||
/* Machine driver has not set a SCLK, limit bottom end to 44.1 kHz */
|
||||
return snd_pcm_hw_constraint_minmax(substream->runtime,
|
||||
SNDRV_PCM_HW_PARAM_RATE,
|
||||
44100, 192000);
|
||||
44100, 96000);
|
||||
}
|
||||
|
||||
static int cs42l42_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
@ -836,6 +857,7 @@ static int cs42l42_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
unsigned int channels = params_channels(params);
|
||||
unsigned int width = (params_width(params) / 8) - 1;
|
||||
unsigned int val = 0;
|
||||
int ret;
|
||||
|
||||
cs42l42->srate = params_rate(params);
|
||||
cs42l42->bclk = snd_soc_params_to_bclk(params);
|
||||
@ -853,11 +875,10 @@ static int cs42l42_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
|
||||
switch(substream->stream) {
|
||||
case SNDRV_PCM_STREAM_CAPTURE:
|
||||
if (channels == 2) {
|
||||
val |= CS42L42_ASP_TX_CH2_AP_MASK;
|
||||
val |= width << CS42L42_ASP_TX_CH2_RES_SHIFT;
|
||||
}
|
||||
val |= width << CS42L42_ASP_TX_CH1_RES_SHIFT;
|
||||
/* channel 2 on high LRCLK */
|
||||
val = CS42L42_ASP_TX_CH2_AP_MASK |
|
||||
(width << CS42L42_ASP_TX_CH2_RES_SHIFT) |
|
||||
(width << CS42L42_ASP_TX_CH1_RES_SHIFT);
|
||||
|
||||
snd_soc_component_update_bits(component, CS42L42_ASP_TX_CH_AP_RES,
|
||||
CS42L42_ASP_TX_CH1_AP_MASK | CS42L42_ASP_TX_CH2_AP_MASK |
|
||||
@ -890,7 +911,13 @@ static int cs42l42_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
break;
|
||||
}
|
||||
|
||||
return cs42l42_pll_config(component);
|
||||
ret = cs42l42_pll_config(component);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
cs42l42_src_config(component, params_rate(params));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cs42l42_set_sysclk(struct snd_soc_dai *dai,
|
||||
@ -922,7 +949,6 @@ static int cs42l42_mute_stream(struct snd_soc_dai *dai, int mute, int stream)
|
||||
struct snd_soc_component *component = dai->component;
|
||||
struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component);
|
||||
unsigned int regval;
|
||||
u8 fullScaleVol;
|
||||
int ret;
|
||||
|
||||
if (mute) {
|
||||
@ -993,20 +1019,11 @@ static int cs42l42_mute_stream(struct snd_soc_dai *dai, int mute, int stream)
|
||||
cs42l42->stream_use |= 1 << stream;
|
||||
|
||||
if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||
/* Read the headphone load */
|
||||
regval = snd_soc_component_read(component, CS42L42_LOAD_DET_RCSTAT);
|
||||
if (((regval & CS42L42_RLA_STAT_MASK) >> CS42L42_RLA_STAT_SHIFT) ==
|
||||
CS42L42_RLA_STAT_15_OHM) {
|
||||
fullScaleVol = CS42L42_HP_FULL_SCALE_VOL_MASK;
|
||||
} else {
|
||||
fullScaleVol = 0;
|
||||
}
|
||||
|
||||
/* Un-mute the headphone, set the full scale volume flag */
|
||||
/* Un-mute the headphone */
|
||||
snd_soc_component_update_bits(component, CS42L42_HP_CTL,
|
||||
CS42L42_HP_ANA_AMUTE_MASK |
|
||||
CS42L42_HP_ANA_BMUTE_MASK |
|
||||
CS42L42_HP_FULL_SCALE_VOL_MASK, fullScaleVol);
|
||||
CS42L42_HP_ANA_BMUTE_MASK,
|
||||
0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1031,14 +1048,14 @@ static struct snd_soc_dai_driver cs42l42_dai = {
|
||||
.stream_name = "Playback",
|
||||
.channels_min = 1,
|
||||
.channels_max = 2,
|
||||
.rates = SNDRV_PCM_RATE_8000_192000,
|
||||
.rates = SNDRV_PCM_RATE_8000_96000,
|
||||
.formats = CS42L42_FORMATS,
|
||||
},
|
||||
.capture = {
|
||||
.stream_name = "Capture",
|
||||
.channels_min = 1,
|
||||
.channels_max = 2,
|
||||
.rates = SNDRV_PCM_RATE_8000_192000,
|
||||
.rates = SNDRV_PCM_RATE_8000_96000,
|
||||
.formats = CS42L42_FORMATS,
|
||||
},
|
||||
.symmetric_rate = 1,
|
||||
@ -1668,8 +1685,8 @@ static void cs42l42_set_interrupt_masks(struct cs42l42_private *cs42l42)
|
||||
CS42L42_TS_UNPLUG_MASK,
|
||||
(1 << CS42L42_RS_PLUG_SHIFT) |
|
||||
(1 << CS42L42_RS_UNPLUG_SHIFT) |
|
||||
(1 << CS42L42_TS_PLUG_SHIFT) |
|
||||
(1 << CS42L42_TS_UNPLUG_SHIFT));
|
||||
(0 << CS42L42_TS_PLUG_SHIFT) |
|
||||
(0 << CS42L42_TS_UNPLUG_SHIFT));
|
||||
}
|
||||
|
||||
static void cs42l42_setup_hs_type_detect(struct cs42l42_private *cs42l42)
|
||||
@ -1952,16 +1969,21 @@ static int cs42l42_i2c_probe(struct i2c_client *i2c_client,
|
||||
}
|
||||
usleep_range(CS42L42_BOOT_TIME_US, CS42L42_BOOT_TIME_US * 2);
|
||||
|
||||
/* Request IRQ */
|
||||
ret = devm_request_threaded_irq(&i2c_client->dev,
|
||||
i2c_client->irq,
|
||||
NULL, cs42l42_irq_thread,
|
||||
IRQF_ONESHOT | IRQF_TRIGGER_LOW,
|
||||
"cs42l42", cs42l42);
|
||||
|
||||
if (ret != 0)
|
||||
dev_err(&i2c_client->dev,
|
||||
"Failed to request IRQ: %d\n", ret);
|
||||
/* Request IRQ if one was specified */
|
||||
if (i2c_client->irq) {
|
||||
ret = devm_request_threaded_irq(&i2c_client->dev,
|
||||
i2c_client->irq,
|
||||
NULL, cs42l42_irq_thread,
|
||||
IRQF_ONESHOT | IRQF_TRIGGER_LOW,
|
||||
"cs42l42", cs42l42);
|
||||
if (ret == -EPROBE_DEFER) {
|
||||
goto err_disable;
|
||||
} else if (ret != 0) {
|
||||
dev_err(&i2c_client->dev,
|
||||
"Failed to request IRQ: %d\n", ret);
|
||||
goto err_disable;
|
||||
}
|
||||
}
|
||||
|
||||
/* initialize codec */
|
||||
devid = cirrus_read_device_id(cs42l42->regmap, CS42L42_DEVID_AB);
|
||||
@ -2032,7 +2054,9 @@ static int cs42l42_i2c_remove(struct i2c_client *i2c_client)
|
||||
{
|
||||
struct cs42l42_private *cs42l42 = i2c_get_clientdata(i2c_client);
|
||||
|
||||
devm_free_irq(&i2c_client->dev, i2c_client->irq, cs42l42);
|
||||
if (i2c_client->irq)
|
||||
devm_free_irq(&i2c_client->dev, i2c_client->irq, cs42l42);
|
||||
|
||||
pm_runtime_suspend(&i2c_client->dev);
|
||||
pm_runtime_disable(&i2c_client->dev);
|
||||
|
||||
|
@ -288,6 +288,7 @@
|
||||
#define CS42L42_IN_ASRC_CLK (CS42L42_PAGE_12 + 0x0A)
|
||||
#define CS42L42_CLK_IASRC_SEL_SHIFT 0
|
||||
#define CS42L42_CLK_IASRC_SEL_MASK (1 << CS42L42_CLK_IASRC_SEL_SHIFT)
|
||||
#define CS42L42_CLK_IASRC_SEL_6 0
|
||||
#define CS42L42_CLK_IASRC_SEL_12 1
|
||||
|
||||
#define CS42L42_OUT_ASRC_CLK (CS42L42_PAGE_12 + 0x0B)
|
||||
@ -761,6 +762,7 @@
|
||||
#define CS42L42_CLOCK_SWITCH_DELAY_US 150
|
||||
#define CS42L42_PLL_LOCK_POLL_US 250
|
||||
#define CS42L42_PLL_LOCK_TIMEOUT_US 1250
|
||||
#define CS42L42_HP_ADC_EN_TIME_US 20000
|
||||
|
||||
static const char *const cs42l42_supply_names[CS42L42_NUM_SUPPLIES] = {
|
||||
"VA",
|
||||
@ -794,6 +796,7 @@ struct cs42l42_private {
|
||||
u8 hs_bias_ramp_time;
|
||||
u8 hs_bias_sense_en;
|
||||
u8 stream_use;
|
||||
bool hp_adc_up_pending;
|
||||
};
|
||||
|
||||
#endif /* __CS42L42_H__ */
|
||||
|
@ -305,12 +305,19 @@ static int cs4341_spi_probe(struct spi_device *spi)
|
||||
return cs4341_probe(&spi->dev);
|
||||
}
|
||||
|
||||
static const struct spi_device_id cs4341_spi_ids[] = {
|
||||
{ "cs4341a" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(spi, cs4341_spi_ids);
|
||||
|
||||
static struct spi_driver cs4341_spi_driver = {
|
||||
.driver = {
|
||||
.name = "cs4341-spi",
|
||||
.of_match_table = of_match_ptr(cs4341_dt_ids),
|
||||
},
|
||||
.probe = cs4341_spi_probe,
|
||||
.id_table = cs4341_spi_ids,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
@ -867,8 +867,8 @@ static void nau8824_jdet_work(struct work_struct *work)
|
||||
struct regmap *regmap = nau8824->regmap;
|
||||
int adc_value, event = 0, event_mask = 0;
|
||||
|
||||
snd_soc_dapm_enable_pin(dapm, "MICBIAS");
|
||||
snd_soc_dapm_enable_pin(dapm, "SAR");
|
||||
snd_soc_dapm_force_enable_pin(dapm, "MICBIAS");
|
||||
snd_soc_dapm_force_enable_pin(dapm, "SAR");
|
||||
snd_soc_dapm_sync(dapm);
|
||||
|
||||
msleep(100);
|
||||
|
@ -36,6 +36,7 @@ static const struct of_device_id pcm179x_of_match[] = {
|
||||
MODULE_DEVICE_TABLE(of, pcm179x_of_match);
|
||||
|
||||
static const struct spi_device_id pcm179x_spi_ids[] = {
|
||||
{ "pcm1792a", 0 },
|
||||
{ "pcm179x", 0 },
|
||||
{ },
|
||||
};
|
||||
|
@ -116,6 +116,8 @@ static const struct reg_default pcm512x_reg_defaults[] = {
|
||||
{ PCM512x_FS_SPEED_MODE, 0x00 },
|
||||
{ PCM512x_IDAC_1, 0x01 },
|
||||
{ PCM512x_IDAC_2, 0x00 },
|
||||
{ PCM512x_I2S_1, 0x02 },
|
||||
{ PCM512x_I2S_2, 0x00 },
|
||||
};
|
||||
|
||||
static bool pcm512x_readable(struct device *dev, unsigned int reg)
|
||||
|
@ -4144,10 +4144,10 @@ static int wcd938x_codec_set_jack(struct snd_soc_component *comp,
|
||||
{
|
||||
struct wcd938x_priv *wcd = dev_get_drvdata(comp->dev);
|
||||
|
||||
if (!jack)
|
||||
if (jack)
|
||||
return wcd_mbhc_start(wcd->wcd_mbhc, &wcd->mbhc_cfg, jack);
|
||||
|
||||
wcd_mbhc_stop(wcd->wcd_mbhc);
|
||||
else
|
||||
wcd_mbhc_stop(wcd->wcd_mbhc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -742,9 +742,16 @@ static int wm8960_configure_clocking(struct snd_soc_component *component)
|
||||
int i, j, k;
|
||||
int ret;
|
||||
|
||||
if (!(iface1 & (1<<6))) {
|
||||
dev_dbg(component->dev,
|
||||
"Codec is slave mode, no need to configure clock\n");
|
||||
/*
|
||||
* For Slave mode clocking should still be configured,
|
||||
* so this if statement should be removed, but some platform
|
||||
* may not work if the sysclk is not configured, to avoid such
|
||||
* compatible issue, just add '!wm8960->sysclk' condition in
|
||||
* this if statement.
|
||||
*/
|
||||
if (!(iface1 & (1 << 6)) && !wm8960->sysclk) {
|
||||
dev_warn(component->dev,
|
||||
"slave mode, but proceeding with no clock configuration\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1073,6 +1073,16 @@ static int fsl_esai_probe(struct platform_device *pdev)
|
||||
if (ret < 0)
|
||||
goto err_pm_get_sync;
|
||||
|
||||
/*
|
||||
* Register platform component before registering cpu dai for there
|
||||
* is not defer probe for platform component in snd_soc_add_pcm_runtime().
|
||||
*/
|
||||
ret = imx_pcm_dma_init(pdev, IMX_ESAI_DMABUF_SIZE);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to init imx pcm dma: %d\n", ret);
|
||||
goto err_pm_get_sync;
|
||||
}
|
||||
|
||||
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_esai_component,
|
||||
&fsl_esai_dai, 1);
|
||||
if (ret) {
|
||||
@ -1082,12 +1092,6 @@ static int fsl_esai_probe(struct platform_device *pdev)
|
||||
|
||||
INIT_WORK(&esai_priv->work, fsl_esai_hw_reset);
|
||||
|
||||
ret = imx_pcm_dma_init(pdev, IMX_ESAI_DMABUF_SIZE);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to init imx pcm dma: %d\n", ret);
|
||||
goto err_pm_get_sync;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
err_pm_get_sync:
|
||||
|
@ -737,18 +737,23 @@ static int fsl_micfil_probe(struct platform_device *pdev)
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
regcache_cache_only(micfil->regmap, true);
|
||||
|
||||
/*
|
||||
* Register platform component before registering cpu dai for there
|
||||
* is not defer probe for platform component in snd_soc_add_pcm_runtime().
|
||||
*/
|
||||
ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to pcm register\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_micfil_component,
|
||||
&fsl_micfil_dai, 1);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to register component %s\n",
|
||||
fsl_micfil_component.name);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
|
||||
if (ret)
|
||||
dev_err(&pdev->dev, "failed to pcm register\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1152,11 +1152,10 @@ static int fsl_sai_probe(struct platform_device *pdev)
|
||||
if (ret < 0)
|
||||
goto err_pm_get_sync;
|
||||
|
||||
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_component,
|
||||
&sai->cpu_dai_drv, 1);
|
||||
if (ret)
|
||||
goto err_pm_get_sync;
|
||||
|
||||
/*
|
||||
* Register platform component before registering cpu dai for there
|
||||
* is not defer probe for platform component in snd_soc_add_pcm_runtime().
|
||||
*/
|
||||
if (sai->soc_data->use_imx_pcm) {
|
||||
ret = imx_pcm_dma_init(pdev, IMX_SAI_DMABUF_SIZE);
|
||||
if (ret)
|
||||
@ -1167,6 +1166,11 @@ static int fsl_sai_probe(struct platform_device *pdev)
|
||||
goto err_pm_get_sync;
|
||||
}
|
||||
|
||||
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_component,
|
||||
&sai->cpu_dai_drv, 1);
|
||||
if (ret)
|
||||
goto err_pm_get_sync;
|
||||
|
||||
return ret;
|
||||
|
||||
err_pm_get_sync:
|
||||
|
@ -1434,6 +1434,16 @@ static int fsl_spdif_probe(struct platform_device *pdev)
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
regcache_cache_only(spdif_priv->regmap, true);
|
||||
|
||||
/*
|
||||
* Register platform component before registering cpu dai for there
|
||||
* is not defer probe for platform component in snd_soc_add_pcm_runtime().
|
||||
*/
|
||||
ret = imx_pcm_dma_init(pdev, IMX_SPDIF_DMABUF_SIZE);
|
||||
if (ret) {
|
||||
dev_err_probe(&pdev->dev, ret, "imx_pcm_dma_init failed\n");
|
||||
goto err_pm_disable;
|
||||
}
|
||||
|
||||
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_spdif_component,
|
||||
&spdif_priv->cpu_dai_drv, 1);
|
||||
if (ret) {
|
||||
@ -1441,12 +1451,6 @@ static int fsl_spdif_probe(struct platform_device *pdev)
|
||||
goto err_pm_disable;
|
||||
}
|
||||
|
||||
ret = imx_pcm_dma_init(pdev, IMX_SPDIF_DMABUF_SIZE);
|
||||
if (ret) {
|
||||
dev_err_probe(&pdev->dev, ret, "imx_pcm_dma_init failed\n");
|
||||
goto err_pm_disable;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
err_pm_disable:
|
||||
|
@ -487,8 +487,9 @@ static int fsl_xcvr_prepare(struct snd_pcm_substream *substream,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* clear DPATH RESET */
|
||||
/* set DPATH RESET */
|
||||
m_ctl |= FSL_XCVR_EXT_CTRL_DPTH_RESET(tx);
|
||||
v_ctl |= FSL_XCVR_EXT_CTRL_DPTH_RESET(tx);
|
||||
ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_CTRL, m_ctl, v_ctl);
|
||||
if (ret < 0) {
|
||||
dev_err(dai->dev, "Error while setting EXT_CTRL: %d\n", ret);
|
||||
@ -590,10 +591,6 @@ static void fsl_xcvr_shutdown(struct snd_pcm_substream *substream,
|
||||
val |= FSL_XCVR_EXT_CTRL_CMDC_RESET(tx);
|
||||
}
|
||||
|
||||
/* set DPATH RESET */
|
||||
mask |= FSL_XCVR_EXT_CTRL_DPTH_RESET(tx);
|
||||
val |= FSL_XCVR_EXT_CTRL_DPTH_RESET(tx);
|
||||
|
||||
ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_CTRL, mask, val);
|
||||
if (ret < 0) {
|
||||
dev_err(dai->dev, "Err setting DPATH RESET: %d\n", ret);
|
||||
@ -643,6 +640,16 @@ static int fsl_xcvr_trigger(struct snd_pcm_substream *substream, int cmd,
|
||||
dev_err(dai->dev, "Failed to enable DMA: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* clear DPATH RESET */
|
||||
ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_CTRL,
|
||||
FSL_XCVR_EXT_CTRL_DPTH_RESET(tx),
|
||||
0);
|
||||
if (ret < 0) {
|
||||
dev_err(dai->dev, "Failed to clear DPATH RESET: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
break;
|
||||
case SNDRV_PCM_TRIGGER_STOP:
|
||||
case SNDRV_PCM_TRIGGER_SUSPEND:
|
||||
@ -1215,18 +1222,23 @@ static int fsl_xcvr_probe(struct platform_device *pdev)
|
||||
pm_runtime_enable(dev);
|
||||
regcache_cache_only(xcvr->regmap, true);
|
||||
|
||||
/*
|
||||
* Register platform component before registering cpu dai for there
|
||||
* is not defer probe for platform component in snd_soc_add_pcm_runtime().
|
||||
*/
|
||||
ret = devm_snd_dmaengine_pcm_register(dev, NULL, 0);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to pcm register\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = devm_snd_soc_register_component(dev, &fsl_xcvr_comp,
|
||||
&fsl_xcvr_dai, 1);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to register component %s\n",
|
||||
fsl_xcvr_comp.name);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = devm_snd_dmaengine_pcm_register(dev, NULL, 0);
|
||||
if (ret)
|
||||
dev_err(dev, "failed to pcm register\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -456,12 +456,12 @@ static const struct dmi_system_id byt_cht_es8316_quirk_table[] = {
|
||||
|
||||
static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
static const char * const mic_name[] = { "in1", "in2" };
|
||||
struct snd_soc_acpi_mach *mach = dev_get_platdata(dev);
|
||||
struct property_entry props[MAX_NO_PROPS] = {};
|
||||
struct byt_cht_es8316_private *priv;
|
||||
const struct dmi_system_id *dmi_id;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct snd_soc_acpi_mach *mach;
|
||||
struct fwnode_handle *fwnode;
|
||||
const char *platform_name;
|
||||
struct acpi_device *adev;
|
||||
@ -476,7 +476,6 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
|
||||
mach = dev->platform_data;
|
||||
/* fix index of codec dai */
|
||||
for (i = 0; i < ARRAY_SIZE(byt_cht_es8316_dais); i++) {
|
||||
if (!strcmp(byt_cht_es8316_dais[i].codecs->name,
|
||||
@ -494,7 +493,7 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
|
||||
put_device(&adev->dev);
|
||||
byt_cht_es8316_dais[dai_index].codecs->name = codec_name;
|
||||
} else {
|
||||
dev_err(&pdev->dev, "Error cannot find '%s' dev\n", mach->id);
|
||||
dev_err(dev, "Error cannot find '%s' dev\n", mach->id);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
@ -533,11 +532,8 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
|
||||
|
||||
/* get the clock */
|
||||
priv->mclk = devm_clk_get(dev, "pmc_plt_clk_3");
|
||||
if (IS_ERR(priv->mclk)) {
|
||||
ret = PTR_ERR(priv->mclk);
|
||||
dev_err(dev, "clk_get pmc_plt_clk_3 failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
if (IS_ERR(priv->mclk))
|
||||
return dev_err_probe(dev, PTR_ERR(priv->mclk), "clk_get pmc_plt_clk_3 failed\n");
|
||||
|
||||
/* get speaker enable GPIO */
|
||||
codec_dev = acpi_get_first_physical_node(adev);
|
||||
@ -567,22 +563,13 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
|
||||
|
||||
devm_acpi_dev_add_driver_gpios(codec_dev, byt_cht_es8316_gpios);
|
||||
priv->speaker_en_gpio =
|
||||
gpiod_get_index(codec_dev, "speaker-enable", 0,
|
||||
/* see comment in byt_cht_es8316_resume */
|
||||
GPIOD_OUT_LOW | GPIOD_FLAGS_BIT_NONEXCLUSIVE);
|
||||
|
||||
gpiod_get_optional(codec_dev, "speaker-enable",
|
||||
/* see comment in byt_cht_es8316_resume() */
|
||||
GPIOD_OUT_LOW | GPIOD_FLAGS_BIT_NONEXCLUSIVE);
|
||||
if (IS_ERR(priv->speaker_en_gpio)) {
|
||||
ret = PTR_ERR(priv->speaker_en_gpio);
|
||||
switch (ret) {
|
||||
case -ENOENT:
|
||||
priv->speaker_en_gpio = NULL;
|
||||
break;
|
||||
default:
|
||||
dev_err(dev, "get speaker GPIO failed: %d\n", ret);
|
||||
fallthrough;
|
||||
case -EPROBE_DEFER:
|
||||
goto err_put_codec;
|
||||
}
|
||||
ret = dev_err_probe(dev, PTR_ERR(priv->speaker_en_gpio),
|
||||
"get speaker GPIO failed\n");
|
||||
goto err_put_codec;
|
||||
}
|
||||
|
||||
snprintf(components_string, sizeof(components_string),
|
||||
@ -597,7 +584,7 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
|
||||
byt_cht_es8316_card.long_name = long_name;
|
||||
#endif
|
||||
|
||||
sof_parent = snd_soc_acpi_sof_parent(&pdev->dev);
|
||||
sof_parent = snd_soc_acpi_sof_parent(dev);
|
||||
|
||||
/* set card and driver name */
|
||||
if (sof_parent) {
|
||||
|
@ -929,6 +929,11 @@ static int create_sdw_dailink(struct snd_soc_card *card,
|
||||
cpus + *cpu_id, cpu_dai_num,
|
||||
codecs, codec_num,
|
||||
NULL, &sdw_ops);
|
||||
/*
|
||||
* SoundWire DAILINKs use 'stream' functions and Bank Switch operations
|
||||
* based on wait_for_completion(), tag them as 'nonatomic'.
|
||||
*/
|
||||
dai_links[*be_index].nonatomic = true;
|
||||
|
||||
ret = set_codec_init_func(card, link, dai_links + (*be_index)++,
|
||||
playback, group_id);
|
||||
|
@ -1,6 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
config SND_SOC_MEDIATEK
|
||||
tristate
|
||||
select REGMAP_MMIO
|
||||
|
||||
config SND_SOC_MT2701
|
||||
tristate "ASoC support for Mediatek MT2701 chip"
|
||||
@ -188,7 +189,9 @@ config SND_SOC_MT8192_MT6359_RT1015_RT5682
|
||||
config SND_SOC_MT8195
|
||||
tristate "ASoC support for Mediatek MT8195 chip"
|
||||
depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||
depends on COMMON_CLK
|
||||
select SND_SOC_MEDIATEK
|
||||
select MFD_SYSCON if SND_SOC_MT6359
|
||||
help
|
||||
This adds ASoC platform driver support for Mediatek MT8195 chip
|
||||
that can be used with other codecs.
|
||||
|
@ -334,9 +334,11 @@ int mtk_afe_suspend(struct snd_soc_component *component)
|
||||
devm_kcalloc(dev, afe->reg_back_up_list_num,
|
||||
sizeof(unsigned int), GFP_KERNEL);
|
||||
|
||||
for (i = 0; i < afe->reg_back_up_list_num; i++)
|
||||
regmap_read(regmap, afe->reg_back_up_list[i],
|
||||
&afe->reg_back_up[i]);
|
||||
if (afe->reg_back_up) {
|
||||
for (i = 0; i < afe->reg_back_up_list_num; i++)
|
||||
regmap_read(regmap, afe->reg_back_up_list[i],
|
||||
&afe->reg_back_up[i]);
|
||||
}
|
||||
|
||||
afe->suspended = true;
|
||||
afe->runtime_suspend(dev);
|
||||
@ -356,12 +358,13 @@ int mtk_afe_resume(struct snd_soc_component *component)
|
||||
|
||||
afe->runtime_resume(dev);
|
||||
|
||||
if (!afe->reg_back_up)
|
||||
if (!afe->reg_back_up) {
|
||||
dev_dbg(dev, "%s no reg_backup\n", __func__);
|
||||
|
||||
for (i = 0; i < afe->reg_back_up_list_num; i++)
|
||||
mtk_regmap_write(regmap, afe->reg_back_up_list[i],
|
||||
afe->reg_back_up[i]);
|
||||
} else {
|
||||
for (i = 0; i < afe->reg_back_up_list_num; i++)
|
||||
mtk_regmap_write(regmap, afe->reg_back_up_list[i],
|
||||
afe->reg_back_up[i]);
|
||||
}
|
||||
|
||||
afe->suspended = false;
|
||||
return 0;
|
||||
|
@ -424,8 +424,8 @@ static int mt8195_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd)
|
||||
return snd_soc_component_set_jack(cmpnt_codec, &priv->hdmi_jack, NULL);
|
||||
}
|
||||
|
||||
static int mt8195_hdmitx_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||
struct snd_pcm_hw_params *params)
|
||||
static int mt8195_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||
struct snd_pcm_hw_params *params)
|
||||
|
||||
{
|
||||
/* fix BE i2s format to 32bit, clean param mask first */
|
||||
@ -902,7 +902,7 @@ static struct snd_soc_dai_link mt8195_mt6359_rt1019_rt5682_dai_links[] = {
|
||||
.no_pcm = 1,
|
||||
.dpcm_playback = 1,
|
||||
.ops = &mt8195_dptx_ops,
|
||||
.be_hw_params_fixup = mt8195_hdmitx_dptx_hw_params_fixup,
|
||||
.be_hw_params_fixup = mt8195_dptx_hw_params_fixup,
|
||||
SND_SOC_DAILINK_REG(DPTX_BE),
|
||||
},
|
||||
[DAI_LINK_ETDM1_IN_BE] = {
|
||||
@ -953,7 +953,6 @@ static struct snd_soc_dai_link mt8195_mt6359_rt1019_rt5682_dai_links[] = {
|
||||
SND_SOC_DAIFMT_NB_NF |
|
||||
SND_SOC_DAIFMT_CBS_CFS,
|
||||
.dpcm_playback = 1,
|
||||
.be_hw_params_fixup = mt8195_hdmitx_dptx_hw_params_fixup,
|
||||
SND_SOC_DAILINK_REG(ETDM3_OUT_BE),
|
||||
},
|
||||
[DAI_LINK_PCM1_BE] = {
|
||||
|
@ -1,11 +1,10 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# ROCKCHIP Platform Support
|
||||
snd-soc-rockchip-i2s-objs := rockchip_i2s.o
|
||||
snd-soc-rockchip-pcm-objs := rockchip_pcm.o
|
||||
snd-soc-rockchip-pdm-objs := rockchip_pdm.o
|
||||
snd-soc-rockchip-spdif-objs := rockchip_spdif.o
|
||||
|
||||
obj-$(CONFIG_SND_SOC_ROCKCHIP_I2S) += snd-soc-rockchip-i2s.o snd-soc-rockchip-pcm.o
|
||||
obj-$(CONFIG_SND_SOC_ROCKCHIP_I2S) += snd-soc-rockchip-i2s.o
|
||||
obj-$(CONFIG_SND_SOC_ROCKCHIP_PDM) += snd-soc-rockchip-pdm.o
|
||||
obj-$(CONFIG_SND_SOC_ROCKCHIP_SPDIF) += snd-soc-rockchip-spdif.o
|
||||
|
||||
|
@ -20,7 +20,6 @@
|
||||
#include <sound/dmaengine_pcm.h>
|
||||
|
||||
#include "rockchip_i2s.h"
|
||||
#include "rockchip_pcm.h"
|
||||
|
||||
#define DRV_NAME "rockchip-i2s"
|
||||
|
||||
@ -756,7 +755,7 @@ static int rockchip_i2s_probe(struct platform_device *pdev)
|
||||
goto err_suspend;
|
||||
}
|
||||
|
||||
ret = rockchip_pcm_platform_register(&pdev->dev);
|
||||
ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Could not register PCM\n");
|
||||
goto err_suspend;
|
||||
|
@ -1,44 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2018 Rockchip Electronics Co. Ltd.
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <sound/core.h>
|
||||
#include <sound/pcm.h>
|
||||
#include <sound/soc.h>
|
||||
#include <sound/dmaengine_pcm.h>
|
||||
|
||||
#include "rockchip_pcm.h"
|
||||
|
||||
static const struct snd_pcm_hardware snd_rockchip_hardware = {
|
||||
.info = SNDRV_PCM_INFO_MMAP |
|
||||
SNDRV_PCM_INFO_MMAP_VALID |
|
||||
SNDRV_PCM_INFO_PAUSE |
|
||||
SNDRV_PCM_INFO_RESUME |
|
||||
SNDRV_PCM_INFO_INTERLEAVED,
|
||||
.period_bytes_min = 32,
|
||||
.period_bytes_max = 8192,
|
||||
.periods_min = 1,
|
||||
.periods_max = 52,
|
||||
.buffer_bytes_max = 64 * 1024,
|
||||
.fifo_size = 32,
|
||||
};
|
||||
|
||||
static const struct snd_dmaengine_pcm_config rk_dmaengine_pcm_config = {
|
||||
.pcm_hardware = &snd_rockchip_hardware,
|
||||
.prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config,
|
||||
.prealloc_buffer_size = 32 * 1024,
|
||||
};
|
||||
|
||||
int rockchip_pcm_platform_register(struct device *dev)
|
||||
{
|
||||
return devm_snd_dmaengine_pcm_register(dev, &rk_dmaengine_pcm_config,
|
||||
SND_DMAENGINE_PCM_FLAG_COMPAT);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rockchip_pcm_platform_register);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
@ -1,11 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2018 Rockchip Electronics Co. Ltd.
|
||||
*/
|
||||
|
||||
#ifndef _ROCKCHIP_PCM_H
|
||||
#define _ROCKCHIP_PCM_H
|
||||
|
||||
int rockchip_pcm_platform_register(struct device *dev);
|
||||
|
||||
#endif
|
@ -2599,6 +2599,7 @@ int snd_soc_component_initialize(struct snd_soc_component *component,
|
||||
INIT_LIST_HEAD(&component->dai_list);
|
||||
INIT_LIST_HEAD(&component->dobj_list);
|
||||
INIT_LIST_HEAD(&component->card_list);
|
||||
INIT_LIST_HEAD(&component->list);
|
||||
mutex_init(&component->io_mutex);
|
||||
|
||||
component->name = fmt_single_name(dev, &component->id);
|
||||
|
@ -2561,6 +2561,7 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
|
||||
const char *pin, int status)
|
||||
{
|
||||
struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
|
||||
int ret = 0;
|
||||
|
||||
dapm_assert_locked(dapm);
|
||||
|
||||
@ -2573,13 +2574,14 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
|
||||
dapm_mark_dirty(w, "pin configuration");
|
||||
dapm_widget_invalidate_input_paths(w);
|
||||
dapm_widget_invalidate_output_paths(w);
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
w->connected = status;
|
||||
if (status == 0)
|
||||
w->force = 0;
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -3583,14 +3585,15 @@ int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol,
|
||||
{
|
||||
struct snd_soc_card *card = snd_kcontrol_chip(kcontrol);
|
||||
const char *pin = (const char *)kcontrol->private_value;
|
||||
int ret;
|
||||
|
||||
if (ucontrol->value.integer.value[0])
|
||||
snd_soc_dapm_enable_pin(&card->dapm, pin);
|
||||
ret = snd_soc_dapm_enable_pin(&card->dapm, pin);
|
||||
else
|
||||
snd_soc_dapm_disable_pin(&card->dapm, pin);
|
||||
ret = snd_soc_dapm_disable_pin(&card->dapm, pin);
|
||||
|
||||
snd_soc_dapm_sync(&card->dapm);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_dapm_put_pin_switch);
|
||||
|
||||
@ -4023,7 +4026,7 @@ static int snd_soc_dapm_dai_link_put(struct snd_kcontrol *kcontrol,
|
||||
|
||||
rtd->params_select = ucontrol->value.enumerated.item[0];
|
||||
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -371,7 +371,6 @@ int snd_sof_device_remove(struct device *dev)
|
||||
dev_warn(dev, "error: %d failed to prepare DSP for device removal",
|
||||
ret);
|
||||
|
||||
snd_sof_fw_unload(sdev);
|
||||
snd_sof_ipc_free(sdev);
|
||||
snd_sof_free_debug(sdev);
|
||||
snd_sof_free_trace(sdev);
|
||||
@ -394,8 +393,7 @@ int snd_sof_device_remove(struct device *dev)
|
||||
snd_sof_remove(sdev);
|
||||
|
||||
/* release firmware */
|
||||
release_firmware(pdata->fw);
|
||||
pdata->fw = NULL;
|
||||
snd_sof_fw_unload(sdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -365,7 +365,14 @@ static int imx8_remove(struct snd_sof_dev *sdev)
|
||||
/* on i.MX8 there is 1 to 1 match between type and BAR idx */
|
||||
static int imx8_get_bar_index(struct snd_sof_dev *sdev, u32 type)
|
||||
{
|
||||
return type;
|
||||
/* Only IRAM and SRAM bars are valid */
|
||||
switch (type) {
|
||||
case SOF_FW_BLK_TYPE_IRAM:
|
||||
case SOF_FW_BLK_TYPE_SRAM:
|
||||
return type;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
static void imx8_ipc_msg_data(struct snd_sof_dev *sdev,
|
||||
|
@ -228,7 +228,14 @@ static int imx8m_remove(struct snd_sof_dev *sdev)
|
||||
/* on i.MX8 there is 1 to 1 match between type and BAR idx */
|
||||
static int imx8m_get_bar_index(struct snd_sof_dev *sdev, u32 type)
|
||||
{
|
||||
return type;
|
||||
/* Only IRAM and SRAM bars are valid */
|
||||
switch (type) {
|
||||
case SOF_FW_BLK_TYPE_IRAM:
|
||||
case SOF_FW_BLK_TYPE_SRAM:
|
||||
return type;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
static void imx8m_ipc_msg_data(struct snd_sof_dev *sdev,
|
||||
|
@ -729,10 +729,10 @@ int snd_sof_load_firmware_raw(struct snd_sof_dev *sdev)
|
||||
ret = request_firmware(&plat_data->fw, fw_filename, sdev->dev);
|
||||
|
||||
if (ret < 0) {
|
||||
dev_err(sdev->dev, "error: request firmware %s failed err: %d\n",
|
||||
fw_filename, ret);
|
||||
dev_err(sdev->dev,
|
||||
"you may need to download the firmware from https://github.com/thesofproject/sof-bin/\n");
|
||||
"error: sof firmware file is missing, you might need to\n");
|
||||
dev_err(sdev->dev,
|
||||
" download it from https://github.com/thesofproject/sof-bin/\n");
|
||||
goto err;
|
||||
} else {
|
||||
dev_dbg(sdev->dev, "request_firmware %s successful\n",
|
||||
@ -880,5 +880,7 @@ EXPORT_SYMBOL(snd_sof_run_firmware);
|
||||
void snd_sof_fw_unload(struct snd_sof_dev *sdev)
|
||||
{
|
||||
/* TODO: support module unloading at runtime */
|
||||
release_firmware(sdev->pdata->fw);
|
||||
sdev->pdata->fw = NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(snd_sof_fw_unload);
|
||||
|
@ -530,7 +530,6 @@ void snd_sof_trace_notify_for_error(struct snd_sof_dev *sdev)
|
||||
return;
|
||||
|
||||
if (sdev->dtrace_is_enabled) {
|
||||
dev_err(sdev->dev, "error: waking up any trace sleepers\n");
|
||||
sdev->dtrace_error = true;
|
||||
wake_up(&sdev->trace_sleep);
|
||||
}
|
||||
|
@ -122,9 +122,9 @@ static void xtensa_stack(struct snd_sof_dev *sdev, void *oops, u32 *stack,
|
||||
* 0x0049fbb0: 8000f2d0 0049fc00 6f6c6c61 00632e63
|
||||
*/
|
||||
for (i = 0; i < stack_words; i += 4) {
|
||||
hex_dump_to_buffer(stack + i * 4, 16, 16, 4,
|
||||
hex_dump_to_buffer(stack + i, 16, 16, 4,
|
||||
buf, sizeof(buf), false);
|
||||
dev_err(sdev->dev, "0x%08x: %s\n", stack_ptr + i, buf);
|
||||
dev_err(sdev->dev, "0x%08x: %s\n", stack_ptr + i * 4, buf);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user