Commit 2a9ad0cc authored by Mark Brown's avatar Mark Brown

Merge existing fixes from asoc/for-6.1 into new branch

parents 9abf2313 c9a3545b
...@@ -1629,6 +1629,7 @@ config SND_SOC_TFA989X ...@@ -1629,6 +1629,7 @@ config SND_SOC_TFA989X
config SND_SOC_TLV320ADC3XXX config SND_SOC_TLV320ADC3XXX
tristate "Texas Instruments TLV320ADC3001/3101 audio ADC" tristate "Texas Instruments TLV320ADC3001/3101 audio ADC"
depends on I2C depends on I2C
depends on GPIOLIB
help help
Enable support for Texas Instruments TLV320ADC3001 and TLV320ADC3101 Enable support for Texas Instruments TLV320ADC3001 and TLV320ADC3101
ADCs. ADCs.
......
...@@ -177,7 +177,7 @@ ...@@ -177,7 +177,7 @@
#define CX2072X_PLBK_DRC_PARM_LEN 9 #define CX2072X_PLBK_DRC_PARM_LEN 9
#define CX2072X_CLASSD_AMP_LEN 6 #define CX2072X_CLASSD_AMP_LEN 6
/* DAI interfae type */ /* DAI interface type */
#define CX2072X_DAI_HIFI 1 #define CX2072X_DAI_HIFI 1
#define CX2072X_DAI_DSP 2 #define CX2072X_DAI_DSP 2
#define CX2072X_DAI_DSP_PWM 3 /* 4 ch, including mic and AEC */ #define CX2072X_DAI_DSP_PWM 3 /* 4 ch, including mic and AEC */
......
...@@ -503,14 +503,14 @@ static int mt6660_i2c_probe(struct i2c_client *client) ...@@ -503,14 +503,14 @@ static int mt6660_i2c_probe(struct i2c_client *client)
dev_err(chip->dev, "read chip revision fail\n"); dev_err(chip->dev, "read chip revision fail\n");
goto probe_fail; goto probe_fail;
} }
pm_runtime_set_active(chip->dev);
pm_runtime_enable(chip->dev);
ret = devm_snd_soc_register_component(chip->dev, ret = devm_snd_soc_register_component(chip->dev,
&mt6660_component_driver, &mt6660_component_driver,
&mt6660_codec_dai, 1); &mt6660_codec_dai, 1);
if (!ret) { if (ret)
pm_runtime_set_active(chip->dev); pm_runtime_disable(chip->dev);
pm_runtime_enable(chip->dev);
}
return ret; return ret;
......
...@@ -391,18 +391,18 @@ static int rt1019_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, ...@@ -391,18 +391,18 @@ static int rt1019_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
unsigned int rx_mask, int slots, int slot_width) unsigned int rx_mask, int slots, int slot_width)
{ {
struct snd_soc_component *component = dai->component; struct snd_soc_component *component = dai->component;
unsigned int val = 0, rx_slotnum; unsigned int cn = 0, cl = 0, rx_slotnum;
int ret = 0, first_bit; int ret = 0, first_bit;
switch (slots) { switch (slots) {
case 4: case 4:
val |= RT1019_I2S_TX_4CH; cn = RT1019_I2S_TX_4CH;
break; break;
case 6: case 6:
val |= RT1019_I2S_TX_6CH; cn = RT1019_I2S_TX_6CH;
break; break;
case 8: case 8:
val |= RT1019_I2S_TX_8CH; cn = RT1019_I2S_TX_8CH;
break; break;
case 2: case 2:
break; break;
...@@ -412,16 +412,16 @@ static int rt1019_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, ...@@ -412,16 +412,16 @@ static int rt1019_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
switch (slot_width) { switch (slot_width) {
case 20: case 20:
val |= RT1019_I2S_DL_20; cl = RT1019_TDM_CL_20;
break; break;
case 24: case 24:
val |= RT1019_I2S_DL_24; cl = RT1019_TDM_CL_24;
break; break;
case 32: case 32:
val |= RT1019_I2S_DL_32; cl = RT1019_TDM_CL_32;
break; break;
case 8: case 8:
val |= RT1019_I2S_DL_8; cl = RT1019_TDM_CL_8;
break; break;
case 16: case 16:
break; break;
...@@ -470,8 +470,10 @@ static int rt1019_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, ...@@ -470,8 +470,10 @@ static int rt1019_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
goto _set_tdm_err_; goto _set_tdm_err_;
} }
snd_soc_component_update_bits(component, RT1019_TDM_1,
RT1019_TDM_CL_MASK, cl);
snd_soc_component_update_bits(component, RT1019_TDM_2, snd_soc_component_update_bits(component, RT1019_TDM_2,
RT1019_I2S_CH_TX_MASK | RT1019_I2S_DF_MASK, val); RT1019_I2S_CH_TX_MASK, cn);
_set_tdm_err_: _set_tdm_err_:
return ret; return ret;
......
...@@ -95,6 +95,12 @@ ...@@ -95,6 +95,12 @@
#define RT1019_TDM_BCLK_MASK (0x1 << 6) #define RT1019_TDM_BCLK_MASK (0x1 << 6)
#define RT1019_TDM_BCLK_NORM (0x0 << 6) #define RT1019_TDM_BCLK_NORM (0x0 << 6)
#define RT1019_TDM_BCLK_INV (0x1 << 6) #define RT1019_TDM_BCLK_INV (0x1 << 6)
#define RT1019_TDM_CL_MASK (0x7)
#define RT1019_TDM_CL_8 (0x4)
#define RT1019_TDM_CL_32 (0x3)
#define RT1019_TDM_CL_24 (0x2)
#define RT1019_TDM_CL_20 (0x1)
#define RT1019_TDM_CL_16 (0x0)
/* 0x0401 TDM Control-2 */ /* 0x0401 TDM Control-2 */
#define RT1019_I2S_CH_TX_MASK (0x3 << 6) #define RT1019_I2S_CH_TX_MASK (0x3 << 6)
......
...@@ -1981,7 +1981,7 @@ static int rt5682s_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, ...@@ -1981,7 +1981,7 @@ static int rt5682s_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
unsigned int rx_mask, int slots, int slot_width) unsigned int rx_mask, int slots, int slot_width)
{ {
struct snd_soc_component *component = dai->component; struct snd_soc_component *component = dai->component;
unsigned int cl, val = 0; unsigned int cl, val = 0, tx_slotnum;
if (tx_mask || rx_mask) if (tx_mask || rx_mask)
snd_soc_component_update_bits(component, snd_soc_component_update_bits(component,
...@@ -1990,6 +1990,16 @@ static int rt5682s_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, ...@@ -1990,6 +1990,16 @@ static int rt5682s_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
snd_soc_component_update_bits(component, snd_soc_component_update_bits(component,
RT5682S_TDM_ADDA_CTRL_2, RT5682S_TDM_EN, 0); RT5682S_TDM_ADDA_CTRL_2, RT5682S_TDM_EN, 0);
/* Tx slot configuration */
tx_slotnum = hweight_long(tx_mask);
if (tx_slotnum) {
if (tx_slotnum > slots) {
dev_err(component->dev, "Invalid or oversized Tx slots.\n");
return -EINVAL;
}
val |= (tx_slotnum - 1) << RT5682S_TDM_ADC_DL_SFT;
}
switch (slots) { switch (slots) {
case 4: case 4:
val |= RT5682S_TDM_TX_CH_4; val |= RT5682S_TDM_TX_CH_4;
...@@ -2010,7 +2020,8 @@ static int rt5682s_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, ...@@ -2010,7 +2020,8 @@ static int rt5682s_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
} }
snd_soc_component_update_bits(component, RT5682S_TDM_CTRL, snd_soc_component_update_bits(component, RT5682S_TDM_CTRL,
RT5682S_TDM_TX_CH_MASK | RT5682S_TDM_RX_CH_MASK, val); RT5682S_TDM_TX_CH_MASK | RT5682S_TDM_RX_CH_MASK |
RT5682S_TDM_ADC_DL_MASK, val);
switch (slot_width) { switch (slot_width) {
case 8: case 8:
......
...@@ -899,6 +899,7 @@ ...@@ -899,6 +899,7 @@
#define RT5682S_TDM_RX_CH_8 (0x3 << 8) #define RT5682S_TDM_RX_CH_8 (0x3 << 8)
#define RT5682S_TDM_ADC_LCA_MASK (0x7 << 4) #define RT5682S_TDM_ADC_LCA_MASK (0x7 << 4)
#define RT5682S_TDM_ADC_LCA_SFT 4 #define RT5682S_TDM_ADC_LCA_SFT 4
#define RT5682S_TDM_ADC_DL_MASK (0x3 << 0)
#define RT5682S_TDM_ADC_DL_SFT 0 #define RT5682S_TDM_ADC_DL_SFT 0
/* TDM control 2 (0x007a) */ /* TDM control 2 (0x007a) */
......
...@@ -2099,6 +2099,9 @@ static int wm5102_probe(struct platform_device *pdev) ...@@ -2099,6 +2099,9 @@ static int wm5102_probe(struct platform_device *pdev)
regmap_update_bits(arizona->regmap, wm5102_digital_vu[i], regmap_update_bits(arizona->regmap, wm5102_digital_vu[i],
WM5102_DIG_VU, WM5102_DIG_VU); WM5102_DIG_VU, WM5102_DIG_VU);
pm_runtime_enable(&pdev->dev);
pm_runtime_idle(&pdev->dev);
ret = arizona_request_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, ret = arizona_request_irq(arizona, ARIZONA_IRQ_DSP_IRQ1,
"ADSP2 Compressed IRQ", wm5102_adsp2_irq, "ADSP2 Compressed IRQ", wm5102_adsp2_irq,
wm5102); wm5102);
...@@ -2131,9 +2134,6 @@ static int wm5102_probe(struct platform_device *pdev) ...@@ -2131,9 +2134,6 @@ static int wm5102_probe(struct platform_device *pdev)
goto err_spk_irqs; goto err_spk_irqs;
} }
pm_runtime_enable(&pdev->dev);
pm_runtime_idle(&pdev->dev);
return ret; return ret;
err_spk_irqs: err_spk_irqs:
...@@ -2142,6 +2142,7 @@ static int wm5102_probe(struct platform_device *pdev) ...@@ -2142,6 +2142,7 @@ static int wm5102_probe(struct platform_device *pdev)
arizona_set_irq_wake(arizona, ARIZONA_IRQ_DSP_IRQ1, 0); arizona_set_irq_wake(arizona, ARIZONA_IRQ_DSP_IRQ1, 0);
arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, wm5102); arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, wm5102);
err_jack_codec_dev: err_jack_codec_dev:
pm_runtime_disable(&pdev->dev);
arizona_jack_codec_dev_remove(&wm5102->core); arizona_jack_codec_dev_remove(&wm5102->core);
return ret; return ret;
......
...@@ -2457,6 +2457,9 @@ static int wm5110_probe(struct platform_device *pdev) ...@@ -2457,6 +2457,9 @@ static int wm5110_probe(struct platform_device *pdev)
regmap_update_bits(arizona->regmap, wm5110_digital_vu[i], regmap_update_bits(arizona->regmap, wm5110_digital_vu[i],
WM5110_DIG_VU, WM5110_DIG_VU); WM5110_DIG_VU, WM5110_DIG_VU);
pm_runtime_enable(&pdev->dev);
pm_runtime_idle(&pdev->dev);
ret = arizona_request_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, ret = arizona_request_irq(arizona, ARIZONA_IRQ_DSP_IRQ1,
"ADSP2 Compressed IRQ", wm5110_adsp2_irq, "ADSP2 Compressed IRQ", wm5110_adsp2_irq,
wm5110); wm5110);
...@@ -2489,9 +2492,6 @@ static int wm5110_probe(struct platform_device *pdev) ...@@ -2489,9 +2492,6 @@ static int wm5110_probe(struct platform_device *pdev)
goto err_spk_irqs; goto err_spk_irqs;
} }
pm_runtime_enable(&pdev->dev);
pm_runtime_idle(&pdev->dev);
return ret; return ret;
err_spk_irqs: err_spk_irqs:
...@@ -2500,6 +2500,7 @@ static int wm5110_probe(struct platform_device *pdev) ...@@ -2500,6 +2500,7 @@ static int wm5110_probe(struct platform_device *pdev)
arizona_set_irq_wake(arizona, ARIZONA_IRQ_DSP_IRQ1, 0); arizona_set_irq_wake(arizona, ARIZONA_IRQ_DSP_IRQ1, 0);
arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, wm5110); arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, wm5110);
err_jack_codec_dev: err_jack_codec_dev:
pm_runtime_disable(&pdev->dev);
arizona_jack_codec_dev_remove(&wm5110->core); arizona_jack_codec_dev_remove(&wm5110->core);
return ret; return ret;
......
...@@ -1840,6 +1840,49 @@ SOC_SINGLE_TLV("SPKOUTR Mixer DACR Volume", WM8962_SPEAKER_MIXER_5, ...@@ -1840,6 +1840,49 @@ SOC_SINGLE_TLV("SPKOUTR Mixer DACR Volume", WM8962_SPEAKER_MIXER_5,
4, 1, 0, inmix_tlv), 4, 1, 0, inmix_tlv),
}; };
static int tp_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event)
{
int ret, reg, val, mask;
struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
ret = pm_runtime_resume_and_get(component->dev);
if (ret < 0) {
dev_err(component->dev, "Failed to resume device: %d\n", ret);
return ret;
}
reg = WM8962_ADDITIONAL_CONTROL_4;
if (!strcmp(w->name, "TEMP_HP")) {
mask = WM8962_TEMP_ENA_HP_MASK;
val = WM8962_TEMP_ENA_HP;
} else if (!strcmp(w->name, "TEMP_SPK")) {
mask = WM8962_TEMP_ENA_SPK_MASK;
val = WM8962_TEMP_ENA_SPK;
} else {
pm_runtime_put(component->dev);
return -EINVAL;
}
switch (event) {
case SND_SOC_DAPM_POST_PMD:
val = 0;
fallthrough;
case SND_SOC_DAPM_POST_PMU:
ret = snd_soc_component_update_bits(component, reg, mask, val);
break;
default:
WARN(1, "Invalid event %d\n", event);
pm_runtime_put(component->dev);
return -EINVAL;
}
pm_runtime_put(component->dev);
return 0;
}
static int cp_event(struct snd_soc_dapm_widget *w, static int cp_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event) struct snd_kcontrol *kcontrol, int event)
{ {
...@@ -2140,8 +2183,10 @@ SND_SOC_DAPM_SUPPLY("TOCLK", WM8962_ADDITIONAL_CONTROL_1, 0, 0, NULL, 0), ...@@ -2140,8 +2183,10 @@ SND_SOC_DAPM_SUPPLY("TOCLK", WM8962_ADDITIONAL_CONTROL_1, 0, 0, NULL, 0),
SND_SOC_DAPM_SUPPLY_S("DSP2", 1, WM8962_DSP2_POWER_MANAGEMENT, SND_SOC_DAPM_SUPPLY_S("DSP2", 1, WM8962_DSP2_POWER_MANAGEMENT,
WM8962_DSP2_ENA_SHIFT, 0, dsp2_event, WM8962_DSP2_ENA_SHIFT, 0, dsp2_event,
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
SND_SOC_DAPM_SUPPLY("TEMP_HP", WM8962_ADDITIONAL_CONTROL_4, 2, 0, NULL, 0), SND_SOC_DAPM_SUPPLY("TEMP_HP", SND_SOC_NOPM, 0, 0, tp_event,
SND_SOC_DAPM_SUPPLY("TEMP_SPK", WM8962_ADDITIONAL_CONTROL_4, 1, 0, NULL, 0), SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_SUPPLY("TEMP_SPK", SND_SOC_NOPM, 0, 0, tp_event,
SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MIXER("INPGAL", WM8962_LEFT_INPUT_PGA_CONTROL, 4, 0, SND_SOC_DAPM_MIXER("INPGAL", WM8962_LEFT_INPUT_PGA_CONTROL, 4, 0,
inpgal, ARRAY_SIZE(inpgal)), inpgal, ARRAY_SIZE(inpgal)),
...@@ -3763,6 +3808,11 @@ static int wm8962_i2c_probe(struct i2c_client *i2c) ...@@ -3763,6 +3808,11 @@ static int wm8962_i2c_probe(struct i2c_client *i2c)
if (ret < 0) if (ret < 0)
goto err_pm_runtime; goto err_pm_runtime;
regmap_update_bits(wm8962->regmap, WM8962_ADDITIONAL_CONTROL_4,
WM8962_TEMP_ENA_HP_MASK, 0);
regmap_update_bits(wm8962->regmap, WM8962_ADDITIONAL_CONTROL_4,
WM8962_TEMP_ENA_SPK_MASK, 0);
regcache_cache_only(wm8962->regmap, true); regcache_cache_only(wm8962->regmap, true);
/* The drivers should power up as needed */ /* The drivers should power up as needed */
......
...@@ -1161,6 +1161,9 @@ static int wm8997_probe(struct platform_device *pdev) ...@@ -1161,6 +1161,9 @@ static int wm8997_probe(struct platform_device *pdev)
regmap_update_bits(arizona->regmap, wm8997_digital_vu[i], regmap_update_bits(arizona->regmap, wm8997_digital_vu[i],
WM8997_DIG_VU, WM8997_DIG_VU); WM8997_DIG_VU, WM8997_DIG_VU);
pm_runtime_enable(&pdev->dev);
pm_runtime_idle(&pdev->dev);
arizona_init_common(arizona); arizona_init_common(arizona);
ret = arizona_init_vol_limit(arizona); ret = arizona_init_vol_limit(arizona);
...@@ -1179,14 +1182,12 @@ static int wm8997_probe(struct platform_device *pdev) ...@@ -1179,14 +1182,12 @@ static int wm8997_probe(struct platform_device *pdev)
goto err_spk_irqs; goto err_spk_irqs;
} }
pm_runtime_enable(&pdev->dev);
pm_runtime_idle(&pdev->dev);
return ret; return ret;
err_spk_irqs: err_spk_irqs:
arizona_free_spk_irqs(arizona); arizona_free_spk_irqs(arizona);
err_jack_codec_dev: err_jack_codec_dev:
pm_runtime_disable(&pdev->dev);
arizona_jack_codec_dev_remove(&wm8997->core); arizona_jack_codec_dev_remove(&wm8997->core);
return ret; return ret;
......
...@@ -782,10 +782,18 @@ static bool lpass_hdmi_regmap_volatile(struct device *dev, unsigned int reg) ...@@ -782,10 +782,18 @@ static bool lpass_hdmi_regmap_volatile(struct device *dev, unsigned int reg)
return true; return true;
if (reg == LPASS_HDMI_TX_LEGACY_ADDR(v)) if (reg == LPASS_HDMI_TX_LEGACY_ADDR(v))
return true; return true;
if (reg == LPASS_HDMI_TX_VBIT_CTL_ADDR(v))
return true;
for (i = 0; i < v->hdmi_rdma_channels; ++i) { for (i = 0; i < v->hdmi_rdma_channels; ++i) {
if (reg == LPAIF_HDMI_RDMACURR_REG(v, i)) if (reg == LPAIF_HDMI_RDMACURR_REG(v, i))
return true; return true;
if (reg == LPASS_HDMI_TX_DMA_ADDR(v, i))
return true;
if (reg == LPASS_HDMI_TX_CH_LSB_ADDR(v, i))
return true;
if (reg == LPASS_HDMI_TX_CH_MSB_ADDR(v, i))
return true;
} }
return false; return false;
} }
......
...@@ -1213,9 +1213,11 @@ int snd_soc_pcm_component_pm_runtime_get(struct snd_soc_pcm_runtime *rtd, ...@@ -1213,9 +1213,11 @@ int snd_soc_pcm_component_pm_runtime_get(struct snd_soc_pcm_runtime *rtd,
int i; int i;
for_each_rtd_components(rtd, i, component) { for_each_rtd_components(rtd, i, component) {
int ret = pm_runtime_resume_and_get(component->dev); int ret = pm_runtime_get_sync(component->dev);
if (ret < 0 && ret != -EACCES) if (ret < 0 && ret != -EACCES) {
pm_runtime_put_noidle(component->dev);
return soc_component_ret(component, ret); return soc_component_ret(component, ret);
}
/* mark stream if succeeded */ /* mark stream if succeeded */
soc_component_mark_push(component, stream, pm); soc_component_mark_push(component, stream, pm);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment