Commit 351cf744 authored by Mark Brown's avatar Mark Brown

Merge branch 'for-5.8' of...

Merge branch 'for-5.8' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into asoc-5.9
parents f10b6c99 3f31f7d9
...@@ -12,6 +12,7 @@ struct rt5670_platform_data { ...@@ -12,6 +12,7 @@ struct rt5670_platform_data {
int jd_mode; int jd_mode;
bool in2_diff; bool in2_diff;
bool dev_gpio; bool dev_gpio;
bool gpio1_is_ext_spk_en;
bool dmic_en; bool dmic_en;
unsigned int dmic1_data_pin; unsigned int dmic1_data_pin;
......
...@@ -208,8 +208,8 @@ static const struct config_entry config_table[] = { ...@@ -208,8 +208,8 @@ static const struct config_entry config_table[] = {
}, },
#endif #endif
#if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE)
/* Cometlake-LP */ /* Cometlake-LP */
#if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_LP)
{ {
.flags = FLAG_SOF, .flags = FLAG_SOF,
.device = 0x02c8, .device = 0x02c8,
...@@ -240,9 +240,7 @@ static const struct config_entry config_table[] = { ...@@ -240,9 +240,7 @@ static const struct config_entry config_table[] = {
.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
.device = 0x02c8, .device = 0x02c8,
}, },
#endif
/* Cometlake-H */ /* Cometlake-H */
#if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_H)
{ {
.flags = FLAG_SOF, .flags = FLAG_SOF,
.device = 0x06c8, .device = 0x06c8,
......
...@@ -342,11 +342,34 @@ static int acp3x_dma_close(struct snd_soc_component *component, ...@@ -342,11 +342,34 @@ static int acp3x_dma_close(struct snd_soc_component *component,
{ {
struct snd_soc_pcm_runtime *prtd; struct snd_soc_pcm_runtime *prtd;
struct i2s_dev_data *adata; struct i2s_dev_data *adata;
struct i2s_stream_instance *ins;
prtd = substream->private_data; prtd = substream->private_data;
component = snd_soc_rtdcom_lookup(prtd, DRV_NAME); component = snd_soc_rtdcom_lookup(prtd, DRV_NAME);
adata = dev_get_drvdata(component->dev); adata = dev_get_drvdata(component->dev);
ins = substream->runtime->private_data;
if (!ins)
return -EINVAL;
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
switch (ins->i2s_instance) {
case I2S_BT_INSTANCE:
adata->play_stream = NULL;
break;
case I2S_SP_INSTANCE:
default:
adata->i2ssp_play_stream = NULL;
}
} else {
switch (ins->i2s_instance) {
case I2S_BT_INSTANCE:
adata->capture_stream = NULL;
break;
case I2S_SP_INSTANCE:
default:
adata->i2ssp_capture_stream = NULL;
}
}
/* Disable ACP irq, when the current stream is being closed and /* Disable ACP irq, when the current stream is being closed and
* another stream is also not active. * another stream is also not active.
...@@ -354,13 +377,6 @@ static int acp3x_dma_close(struct snd_soc_component *component, ...@@ -354,13 +377,6 @@ static int acp3x_dma_close(struct snd_soc_component *component,
if (!adata->play_stream && !adata->capture_stream && if (!adata->play_stream && !adata->capture_stream &&
!adata->i2ssp_play_stream && !adata->i2ssp_capture_stream) !adata->i2ssp_play_stream && !adata->i2ssp_capture_stream)
rv_writel(0, adata->acp3x_base + mmACP_EXTERNAL_INTR_ENB); rv_writel(0, adata->acp3x_base + mmACP_EXTERNAL_INTR_ENB);
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
adata->play_stream = NULL;
adata->i2ssp_play_stream = NULL;
} else {
adata->capture_stream = NULL;
adata->i2ssp_capture_stream = NULL;
}
return 0; return 0;
} }
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
# Renoir platform Support # Renoir platform Support
snd-rn-pci-acp3x-objs := rn-pci-acp3x.o snd-rn-pci-acp3x-objs := rn-pci-acp3x.o
snd-acp3x-pdm-dma-objs := acp3x-pdm-dma.o snd-acp3x-pdm-dma-objs := acp3x-pdm-dma.o
obj-$(CONFIG_SND_SOC_AMD_RENOIR) += snd-rn-pci-acp3x.o snd-acp3x-rn-objs := acp3x-rn.o
obj-$(CONFIG_SND_SOC_AMD_RENOIR) += snd-acp3x-pdm-dma.o obj-$(CONFIG_SND_SOC_AMD_RENOIR) += snd-rn-pci-acp3x.o
obj-$(CONFIG_SND_SOC_AMD_RENOIR_MACH) += acp3x-rn.o obj-$(CONFIG_SND_SOC_AMD_RENOIR) += snd-acp3x-pdm-dma.o
obj-$(CONFIG_SND_SOC_AMD_RENOIR_MACH) += snd-acp3x-rn.o
...@@ -441,13 +441,13 @@ static int hdac_hda_codec_probe(struct snd_soc_component *component) ...@@ -441,13 +441,13 @@ static int hdac_hda_codec_probe(struct snd_soc_component *component)
ret = snd_hda_codec_set_name(hcodec, hcodec->preset->name); ret = snd_hda_codec_set_name(hcodec, hcodec->preset->name);
if (ret < 0) { if (ret < 0) {
dev_err(&hdev->dev, "name failed %s\n", hcodec->preset->name); dev_err(&hdev->dev, "name failed %s\n", hcodec->preset->name);
goto error; goto error_pm;
} }
ret = snd_hdac_regmap_init(&hcodec->core); ret = snd_hdac_regmap_init(&hcodec->core);
if (ret < 0) { if (ret < 0) {
dev_err(&hdev->dev, "regmap init failed\n"); dev_err(&hdev->dev, "regmap init failed\n");
goto error; goto error_pm;
} }
patch = (hda_codec_patch_t)hcodec->preset->driver_data; patch = (hda_codec_patch_t)hcodec->preset->driver_data;
...@@ -455,7 +455,7 @@ static int hdac_hda_codec_probe(struct snd_soc_component *component) ...@@ -455,7 +455,7 @@ static int hdac_hda_codec_probe(struct snd_soc_component *component)
ret = patch(hcodec); ret = patch(hcodec);
if (ret < 0) { if (ret < 0) {
dev_err(&hdev->dev, "patch failed %d\n", ret); dev_err(&hdev->dev, "patch failed %d\n", ret);
goto error; goto error_regmap;
} }
} else { } else {
dev_dbg(&hdev->dev, "no patch file found\n"); dev_dbg(&hdev->dev, "no patch file found\n");
...@@ -467,7 +467,7 @@ static int hdac_hda_codec_probe(struct snd_soc_component *component) ...@@ -467,7 +467,7 @@ static int hdac_hda_codec_probe(struct snd_soc_component *component)
ret = snd_hda_codec_parse_pcms(hcodec); ret = snd_hda_codec_parse_pcms(hcodec);
if (ret < 0) { if (ret < 0) {
dev_err(&hdev->dev, "unable to map pcms to dai %d\n", ret); dev_err(&hdev->dev, "unable to map pcms to dai %d\n", ret);
goto error; goto error_regmap;
} }
/* HDMI controls need to be created in machine drivers */ /* HDMI controls need to be created in machine drivers */
...@@ -476,7 +476,7 @@ static int hdac_hda_codec_probe(struct snd_soc_component *component) ...@@ -476,7 +476,7 @@ static int hdac_hda_codec_probe(struct snd_soc_component *component)
if (ret < 0) { if (ret < 0) {
dev_err(&hdev->dev, "unable to create controls %d\n", dev_err(&hdev->dev, "unable to create controls %d\n",
ret); ret);
goto error; goto error_regmap;
} }
} }
...@@ -496,7 +496,9 @@ static int hdac_hda_codec_probe(struct snd_soc_component *component) ...@@ -496,7 +496,9 @@ static int hdac_hda_codec_probe(struct snd_soc_component *component)
return 0; return 0;
error: error_regmap:
snd_hdac_regmap_exit(hdev);
error_pm:
pm_runtime_put(&hdev->dev); pm_runtime_put(&hdev->dev);
error_no_pm: error_no_pm:
snd_hdac_ext_bus_link_put(hdev->bus, hlink); snd_hdac_ext_bus_link_put(hdev->bus, hlink);
...@@ -518,6 +520,8 @@ static void hdac_hda_codec_remove(struct snd_soc_component *component) ...@@ -518,6 +520,8 @@ static void hdac_hda_codec_remove(struct snd_soc_component *component)
pm_runtime_disable(&hdev->dev); pm_runtime_disable(&hdev->dev);
snd_hdac_ext_bus_link_put(hdev->bus, hlink); snd_hdac_ext_bus_link_put(hdev->bus, hlink);
snd_hdac_regmap_exit(hdev);
} }
static const struct snd_soc_dapm_route hdac_hda_dapm_routes[] = { static const struct snd_soc_dapm_route hdac_hda_dapm_routes[] = {
......
...@@ -31,18 +31,19 @@ ...@@ -31,18 +31,19 @@
#include "rt5670.h" #include "rt5670.h"
#include "rt5670-dsp.h" #include "rt5670-dsp.h"
#define RT5670_DEV_GPIO BIT(0) #define RT5670_DEV_GPIO BIT(0)
#define RT5670_IN2_DIFF BIT(1) #define RT5670_IN2_DIFF BIT(1)
#define RT5670_DMIC_EN BIT(2) #define RT5670_DMIC_EN BIT(2)
#define RT5670_DMIC1_IN2P BIT(3) #define RT5670_DMIC1_IN2P BIT(3)
#define RT5670_DMIC1_GPIO6 BIT(4) #define RT5670_DMIC1_GPIO6 BIT(4)
#define RT5670_DMIC1_GPIO7 BIT(5) #define RT5670_DMIC1_GPIO7 BIT(5)
#define RT5670_DMIC2_INR BIT(6) #define RT5670_DMIC2_INR BIT(6)
#define RT5670_DMIC2_GPIO8 BIT(7) #define RT5670_DMIC2_GPIO8 BIT(7)
#define RT5670_DMIC3_GPIO5 BIT(8) #define RT5670_DMIC3_GPIO5 BIT(8)
#define RT5670_JD_MODE1 BIT(9) #define RT5670_JD_MODE1 BIT(9)
#define RT5670_JD_MODE2 BIT(10) #define RT5670_JD_MODE2 BIT(10)
#define RT5670_JD_MODE3 BIT(11) #define RT5670_JD_MODE3 BIT(11)
#define RT5670_GPIO1_IS_EXT_SPK_EN BIT(12)
static unsigned long rt5670_quirk; static unsigned long rt5670_quirk;
static unsigned int quirk_override; static unsigned int quirk_override;
...@@ -602,9 +603,9 @@ int rt5670_set_jack_detect(struct snd_soc_component *component, ...@@ -602,9 +603,9 @@ int rt5670_set_jack_detect(struct snd_soc_component *component,
EXPORT_SYMBOL_GPL(rt5670_set_jack_detect); EXPORT_SYMBOL_GPL(rt5670_set_jack_detect);
static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0); static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0);
static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -65625, 375, 0); static const DECLARE_TLV_DB_MINMAX(dac_vol_tlv, -6562, 0);
static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0); static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0);
static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -17625, 375, 0); static const DECLARE_TLV_DB_MINMAX(adc_vol_tlv, -1762, 3000);
static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0); static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0);
/* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */ /* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */
...@@ -1447,6 +1448,33 @@ static int rt5670_hp_event(struct snd_soc_dapm_widget *w, ...@@ -1447,6 +1448,33 @@ static int rt5670_hp_event(struct snd_soc_dapm_widget *w,
return 0; return 0;
} }
static int rt5670_spk_event(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 rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component);
if (!rt5670->pdata.gpio1_is_ext_spk_en)
return 0;
switch (event) {
case SND_SOC_DAPM_POST_PMU:
regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL2,
RT5670_GP1_OUT_MASK, RT5670_GP1_OUT_HI);
break;
case SND_SOC_DAPM_PRE_PMD:
regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL2,
RT5670_GP1_OUT_MASK, RT5670_GP1_OUT_LO);
break;
default:
return 0;
}
return 0;
}
static int rt5670_bst1_event(struct snd_soc_dapm_widget *w, static int rt5670_bst1_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event) struct snd_kcontrol *kcontrol, int event)
{ {
...@@ -1860,7 +1888,9 @@ static const struct snd_soc_dapm_widget rt5670_specific_dapm_widgets[] = { ...@@ -1860,7 +1888,9 @@ static const struct snd_soc_dapm_widget rt5670_specific_dapm_widgets[] = {
}; };
static const struct snd_soc_dapm_widget rt5672_specific_dapm_widgets[] = { static const struct snd_soc_dapm_widget rt5672_specific_dapm_widgets[] = {
SND_SOC_DAPM_PGA("SPO Amp", SND_SOC_NOPM, 0, 0, NULL, 0), SND_SOC_DAPM_PGA_E("SPO Amp", SND_SOC_NOPM, 0, 0, NULL, 0,
rt5670_spk_event, SND_SOC_DAPM_PRE_PMD |
SND_SOC_DAPM_POST_PMU),
SND_SOC_DAPM_OUTPUT("SPOLP"), SND_SOC_DAPM_OUTPUT("SPOLP"),
SND_SOC_DAPM_OUTPUT("SPOLN"), SND_SOC_DAPM_OUTPUT("SPOLN"),
SND_SOC_DAPM_OUTPUT("SPORP"), SND_SOC_DAPM_OUTPUT("SPORP"),
...@@ -2857,14 +2887,14 @@ static const struct dmi_system_id dmi_platform_intel_quirks[] = { ...@@ -2857,14 +2887,14 @@ static const struct dmi_system_id dmi_platform_intel_quirks[] = {
}, },
{ {
.callback = rt5670_quirk_cb, .callback = rt5670_quirk_cb,
.ident = "Lenovo Thinkpad Tablet 10", .ident = "Lenovo Miix 2 10",
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Miix 2 10"), DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Miix 2 10"),
}, },
.driver_data = (unsigned long *)(RT5670_DMIC_EN | .driver_data = (unsigned long *)(RT5670_DMIC_EN |
RT5670_DMIC1_IN2P | RT5670_DMIC1_IN2P |
RT5670_DEV_GPIO | RT5670_GPIO1_IS_EXT_SPK_EN |
RT5670_JD_MODE2), RT5670_JD_MODE2),
}, },
{ {
...@@ -2924,6 +2954,10 @@ static int rt5670_i2c_probe(struct i2c_client *i2c, ...@@ -2924,6 +2954,10 @@ static int rt5670_i2c_probe(struct i2c_client *i2c,
rt5670->pdata.dev_gpio = true; rt5670->pdata.dev_gpio = true;
dev_info(&i2c->dev, "quirk dev_gpio\n"); dev_info(&i2c->dev, "quirk dev_gpio\n");
} }
if (rt5670_quirk & RT5670_GPIO1_IS_EXT_SPK_EN) {
rt5670->pdata.gpio1_is_ext_spk_en = true;
dev_info(&i2c->dev, "quirk GPIO1 is external speaker enable\n");
}
if (rt5670_quirk & RT5670_IN2_DIFF) { if (rt5670_quirk & RT5670_IN2_DIFF) {
rt5670->pdata.in2_diff = true; rt5670->pdata.in2_diff = true;
dev_info(&i2c->dev, "quirk IN2_DIFF\n"); dev_info(&i2c->dev, "quirk IN2_DIFF\n");
...@@ -3023,6 +3057,13 @@ static int rt5670_i2c_probe(struct i2c_client *i2c, ...@@ -3023,6 +3057,13 @@ static int rt5670_i2c_probe(struct i2c_client *i2c,
RT5670_GP1_PF_MASK, RT5670_GP1_PF_OUT); RT5670_GP1_PF_MASK, RT5670_GP1_PF_OUT);
} }
if (rt5670->pdata.gpio1_is_ext_spk_en) {
regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL1,
RT5670_GP1_PIN_MASK, RT5670_GP1_PIN_GPIO1);
regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL2,
RT5670_GP1_PF_MASK, RT5670_GP1_PF_OUT);
}
if (rt5670->pdata.jd_mode) { if (rt5670->pdata.jd_mode) {
regmap_update_bits(rt5670->regmap, RT5670_GLB_CLK, regmap_update_bits(rt5670->regmap, RT5670_GLB_CLK,
RT5670_SCLK_SRC_MASK, RT5670_SCLK_SRC_RCCLK); RT5670_SCLK_SRC_MASK, RT5670_SCLK_SRC_RCCLK);
......
...@@ -757,7 +757,7 @@ ...@@ -757,7 +757,7 @@
#define RT5670_PWR_VREF2_BIT 4 #define RT5670_PWR_VREF2_BIT 4
#define RT5670_PWR_FV2 (0x1 << 3) #define RT5670_PWR_FV2 (0x1 << 3)
#define RT5670_PWR_FV2_BIT 3 #define RT5670_PWR_FV2_BIT 3
#define RT5670_LDO_SEL_MASK (0x3) #define RT5670_LDO_SEL_MASK (0x7)
#define RT5670_LDO_SEL_SFT 0 #define RT5670_LDO_SEL_SFT 0
/* Power Management for Analog 2 (0x64) */ /* Power Management for Analog 2 (0x64) */
......
...@@ -932,7 +932,9 @@ int rt5682_headset_detect(struct snd_soc_component *component, int jack_insert) ...@@ -932,7 +932,9 @@ int rt5682_headset_detect(struct snd_soc_component *component, int jack_insert)
RT5682_PWR_ANLG_1, RT5682_PWR_FV2, RT5682_PWR_FV2); RT5682_PWR_ANLG_1, RT5682_PWR_FV2, RT5682_PWR_FV2);
snd_soc_component_update_bits(component, RT5682_PWR_ANLG_3, snd_soc_component_update_bits(component, RT5682_PWR_ANLG_3,
RT5682_PWR_CBJ, RT5682_PWR_CBJ); RT5682_PWR_CBJ, RT5682_PWR_CBJ);
snd_soc_component_update_bits(component,
RT5682_HP_CHARGE_PUMP_1,
RT5682_OSW_L_MASK | RT5682_OSW_R_MASK, 0);
snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1, snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
RT5682_TRIG_JD_MASK, RT5682_TRIG_JD_HIGH); RT5682_TRIG_JD_MASK, RT5682_TRIG_JD_HIGH);
...@@ -956,6 +958,11 @@ int rt5682_headset_detect(struct snd_soc_component *component, int jack_insert) ...@@ -956,6 +958,11 @@ int rt5682_headset_detect(struct snd_soc_component *component, int jack_insert)
rt5682->jack_type = SND_JACK_HEADPHONE; rt5682->jack_type = SND_JACK_HEADPHONE;
break; break;
} }
snd_soc_component_update_bits(component,
RT5682_HP_CHARGE_PUMP_1,
RT5682_OSW_L_MASK | RT5682_OSW_R_MASK,
RT5682_OSW_L_EN | RT5682_OSW_R_EN);
} else { } else {
rt5682_enable_push_button_irq(component, false); rt5682_enable_push_button_irq(component, false);
snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1, snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
......
...@@ -265,12 +265,20 @@ static int fsl_mqs_remove(struct platform_device *pdev) ...@@ -265,12 +265,20 @@ static int fsl_mqs_remove(struct platform_device *pdev)
static int fsl_mqs_runtime_resume(struct device *dev) static int fsl_mqs_runtime_resume(struct device *dev)
{ {
struct fsl_mqs *mqs_priv = dev_get_drvdata(dev); struct fsl_mqs *mqs_priv = dev_get_drvdata(dev);
int ret;
if (mqs_priv->ipg) ret = clk_prepare_enable(mqs_priv->ipg);
clk_prepare_enable(mqs_priv->ipg); if (ret) {
dev_err(dev, "failed to enable ipg clock\n");
return ret;
}
if (mqs_priv->mclk) ret = clk_prepare_enable(mqs_priv->mclk);
clk_prepare_enable(mqs_priv->mclk); if (ret) {
dev_err(dev, "failed to enable mclk clock\n");
clk_disable_unprepare(mqs_priv->ipg);
return ret;
}
if (mqs_priv->use_gpr) if (mqs_priv->use_gpr)
regmap_write(mqs_priv->regmap, IOMUXC_GPR2, regmap_write(mqs_priv->regmap, IOMUXC_GPR2,
...@@ -292,11 +300,8 @@ static int fsl_mqs_runtime_suspend(struct device *dev) ...@@ -292,11 +300,8 @@ static int fsl_mqs_runtime_suspend(struct device *dev)
regmap_read(mqs_priv->regmap, REG_MQS_CTRL, regmap_read(mqs_priv->regmap, REG_MQS_CTRL,
&mqs_priv->reg_mqs_ctrl); &mqs_priv->reg_mqs_ctrl);
if (mqs_priv->mclk) clk_disable_unprepare(mqs_priv->mclk);
clk_disable_unprepare(mqs_priv->mclk); clk_disable_unprepare(mqs_priv->ipg);
if (mqs_priv->ipg)
clk_disable_unprepare(mqs_priv->ipg);
return 0; return 0;
} }
......
...@@ -678,8 +678,9 @@ static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream, ...@@ -678,8 +678,9 @@ static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream,
struct regmap *regs = ssi->regs; struct regmap *regs = ssi->regs;
u32 pm = 999, div2, psr, stccr, mask, afreq, factor, i; u32 pm = 999, div2, psr, stccr, mask, afreq, factor, i;
unsigned long clkrate, baudrate, tmprate; unsigned long clkrate, baudrate, tmprate;
unsigned int slots = params_channels(hw_params); unsigned int channels = params_channels(hw_params);
unsigned int slot_width = 32; unsigned int slot_width = params_width(hw_params);
unsigned int slots = 2;
u64 sub, savesub = 100000; u64 sub, savesub = 100000;
unsigned int freq; unsigned int freq;
bool baudclk_is_used; bool baudclk_is_used;
...@@ -688,10 +689,14 @@ static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream, ...@@ -688,10 +689,14 @@ static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream,
/* Override slots and slot_width if being specifically set... */ /* Override slots and slot_width if being specifically set... */
if (ssi->slots) if (ssi->slots)
slots = ssi->slots; slots = ssi->slots;
/* ...but keep 32 bits if slots is 2 -- I2S Master mode */ if (ssi->slot_width)
if (ssi->slot_width && slots != 2)
slot_width = ssi->slot_width; slot_width = ssi->slot_width;
/* ...but force 32 bits for stereo audio using I2S Master Mode */
if (channels == 2 &&
(ssi->i2s_net & SSI_SCR_I2S_MODE_MASK) == SSI_SCR_I2S_MODE_MASTER)
slot_width = 32;
/* Generate bit clock based on the slot number and slot width */ /* Generate bit clock based on the slot number and slot width */
freq = slots * slot_width * params_rate(hw_params); freq = slots * slot_width * params_rate(hw_params);
......
...@@ -492,7 +492,7 @@ config SND_SOC_INTEL_SOF_PCM512x_MACH ...@@ -492,7 +492,7 @@ config SND_SOC_INTEL_SOF_PCM512x_MACH
endif ## SND_SOC_SOF_HDA_LINK || SND_SOC_SOF_BAYTRAIL endif ## SND_SOC_SOF_HDA_LINK || SND_SOC_SOF_BAYTRAIL
if (SND_SOC_SOF_COMETLAKE_LP && SND_SOC_SOF_HDA_LINK) if (SND_SOC_SOF_COMETLAKE && SND_SOC_SOF_HDA_LINK)
config SND_SOC_INTEL_CML_LP_DA7219_MAX98357A_MACH config SND_SOC_INTEL_CML_LP_DA7219_MAX98357A_MACH
tristate "CML_LP with DA7219 and MAX98357A in I2S Mode" tristate "CML_LP with DA7219 and MAX98357A in I2S Mode"
...@@ -520,7 +520,7 @@ config SND_SOC_INTEL_SOF_CML_RT1011_RT5682_MACH ...@@ -520,7 +520,7 @@ config SND_SOC_INTEL_SOF_CML_RT1011_RT5682_MACH
Say Y if you have such a device. Say Y if you have such a device.
If unsure select "N". If unsure select "N".
endif ## SND_SOC_SOF_COMETLAKE_LP && SND_SOC_SOF_HDA_LINK endif ## SND_SOC_SOF_COMETLAKE && SND_SOC_SOF_HDA_LINK
if SND_SOC_SOF_JASPERLAKE if SND_SOC_SOF_JASPERLAKE
......
...@@ -253,21 +253,20 @@ static int cht_codec_fixup(struct snd_soc_pcm_runtime *rtd, ...@@ -253,21 +253,20 @@ static int cht_codec_fixup(struct snd_soc_pcm_runtime *rtd,
params_set_format(params, SNDRV_PCM_FORMAT_S24_LE); params_set_format(params, SNDRV_PCM_FORMAT_S24_LE);
/* /*
* Default mode for SSP configuration is TDM 4 slot * Default mode for SSP configuration is TDM 4 slot. One board/design,
* the Lenovo Miix 2 10 uses not 1 but 2 codecs connected to SSP2. The
* second piggy-backed, output-only codec is inside the keyboard-dock
* (which has extra speakers). Unlike the main rt5672 codec, we cannot
* configure this codec, it is hard coded to use 2 channel 24 bit I2S.
* Since we only support 2 channels anyways, there is no need for TDM
* on any cht-bsw-rt5672 designs. So we simply use I2S 2ch everywhere.
*/ */
ret = snd_soc_dai_set_fmt(asoc_rtd_to_codec(rtd, 0), ret = snd_soc_dai_set_fmt(asoc_rtd_to_cpu(rtd, 0),
SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_I2S |
SND_SOC_DAIFMT_IB_NF | SND_SOC_DAIFMT_NB_NF |
SND_SOC_DAIFMT_CBS_CFS); SND_SOC_DAIFMT_CBS_CFS);
if (ret < 0) { if (ret < 0) {
dev_err(rtd->dev, "can't set format to TDM %d\n", ret); dev_err(rtd->dev, "can't set format to I2S, err %d\n", ret);
return ret;
}
/* TDM 4 slots 24 bit, set Rx & Tx bitmask to 4 active slots */
ret = snd_soc_dai_set_tdm_slot(asoc_rtd_to_codec(rtd, 0), 0xF, 0xF, 4, 24);
if (ret < 0) {
dev_err(rtd->dev, "can't set codec TDM slot %d\n", ret);
return ret; return ret;
} }
......
...@@ -72,7 +72,7 @@ config SND_SOC_QDSP6_ASM_DAI ...@@ -72,7 +72,7 @@ config SND_SOC_QDSP6_ASM_DAI
config SND_SOC_QDSP6 config SND_SOC_QDSP6
tristate "SoC ALSA audio driver for QDSP6" tristate "SoC ALSA audio driver for QDSP6"
depends on QCOM_APR && HAS_DMA depends on QCOM_APR
select SND_SOC_QDSP6_COMMON select SND_SOC_QDSP6_COMMON
select SND_SOC_QDSP6_CORE select SND_SOC_QDSP6_CORE
select SND_SOC_QDSP6_AFE select SND_SOC_QDSP6_AFE
......
...@@ -590,8 +590,10 @@ static int rockchip_pdm_resume(struct device *dev) ...@@ -590,8 +590,10 @@ static int rockchip_pdm_resume(struct device *dev)
int ret; int ret;
ret = pm_runtime_get_sync(dev); ret = pm_runtime_get_sync(dev);
if (ret < 0) if (ret < 0) {
pm_runtime_put(dev);
return ret; return ret;
}
ret = regcache_sync(pdm->regmap); ret = regcache_sync(pdm->regmap);
......
...@@ -25,8 +25,7 @@ config SND_SOC_SOF_INTEL_PCI ...@@ -25,8 +25,7 @@ config SND_SOC_SOF_INTEL_PCI
select SND_SOC_SOF_CANNONLAKE if SND_SOC_SOF_CANNONLAKE_SUPPORT select SND_SOC_SOF_CANNONLAKE if SND_SOC_SOF_CANNONLAKE_SUPPORT
select SND_SOC_SOF_COFFEELAKE if SND_SOC_SOF_COFFEELAKE_SUPPORT select SND_SOC_SOF_COFFEELAKE if SND_SOC_SOF_COFFEELAKE_SUPPORT
select SND_SOC_SOF_ICELAKE if SND_SOC_SOF_ICELAKE_SUPPORT select SND_SOC_SOF_ICELAKE if SND_SOC_SOF_ICELAKE_SUPPORT
select SND_SOC_SOF_COMETLAKE_LP if SND_SOC_SOF_COMETLAKE_LP_SUPPORT select SND_SOC_SOF_COMETLAKE if SND_SOC_SOF_COMETLAKE_SUPPORT
select SND_SOC_SOF_COMETLAKE_H if SND_SOC_SOF_COMETLAKE_H_SUPPORT
select SND_SOC_SOF_TIGERLAKE if SND_SOC_SOF_TIGERLAKE_SUPPORT select SND_SOC_SOF_TIGERLAKE if SND_SOC_SOF_TIGERLAKE_SUPPORT
select SND_SOC_SOF_ELKHARTLAKE if SND_SOC_SOF_ELKHARTLAKE_SUPPORT select SND_SOC_SOF_ELKHARTLAKE if SND_SOC_SOF_ELKHARTLAKE_SUPPORT
select SND_SOC_SOF_JASPERLAKE if SND_SOC_SOF_JASPERLAKE_SUPPORT select SND_SOC_SOF_JASPERLAKE if SND_SOC_SOF_JASPERLAKE_SUPPORT
...@@ -201,34 +200,22 @@ config SND_SOC_SOF_ICELAKE ...@@ -201,34 +200,22 @@ config SND_SOC_SOF_ICELAKE
This option is not user-selectable but automagically handled by This option is not user-selectable but automagically handled by
'select' statements at a higher level 'select' statements at a higher level
config SND_SOC_SOF_COMETLAKE_LP config SND_SOC_SOF_COMETLAKE
tristate tristate
select SND_SOC_SOF_HDA_COMMON select SND_SOC_SOF_HDA_COMMON
help help
This option is not user-selectable but automagically handled by This option is not user-selectable but automagically handled by
'select' statements at a higher level 'select' statements at a higher level
config SND_SOC_SOF_COMETLAKE_LP_SUPPORT config SND_SOC_SOF_COMETLAKE_SUPPORT
bool "SOF support for CometLake-LP" bool
help
This adds support for Sound Open Firmware for Intel(R) platforms
using the Cometlake-LP processors.
Say Y if you have such a device.
If unsure select "N".
config SND_SOC_SOF_COMETLAKE_H config SND_SOC_SOF_COMETLAKE_LP_SUPPORT
tristate bool "SOF support for CometLake"
select SND_SOC_SOF_HDA_COMMON select SND_SOC_SOF_COMETLAKE_SUPPORT
help
This option is not user-selectable but automagically handled by
'select' statements at a higher level
config SND_SOC_SOF_COMETLAKE_H_SUPPORT
bool "SOF support for CometLake-H"
help help
This adds support for Sound Open Firmware for Intel(R) platforms This adds support for Sound Open Firmware for Intel(R) platforms
using the Cometlake-H processors. using the Cometlake processors.
Say Y if you have such a device.
If unsure select "N". If unsure select "N".
config SND_SOC_SOF_TIGERLAKE_SUPPORT config SND_SOC_SOF_TIGERLAKE_SUPPORT
......
...@@ -151,9 +151,7 @@ static const struct sof_dev_desc cfl_desc = { ...@@ -151,9 +151,7 @@ static const struct sof_dev_desc cfl_desc = {
}; };
#endif #endif
#if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_LP) || \ #if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE)
IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_H)
static const struct sof_dev_desc cml_desc = { static const struct sof_dev_desc cml_desc = {
.machines = snd_soc_acpi_intel_cml_machines, .machines = snd_soc_acpi_intel_cml_machines,
.alt_machines = snd_soc_acpi_intel_cml_sdw_machines, .alt_machines = snd_soc_acpi_intel_cml_sdw_machines,
...@@ -411,8 +409,11 @@ static const struct pci_device_id sof_pci_ids[] = { ...@@ -411,8 +409,11 @@ static const struct pci_device_id sof_pci_ids[] = {
.driver_data = (unsigned long)&cfl_desc}, .driver_data = (unsigned long)&cfl_desc},
#endif #endif
#if IS_ENABLED(CONFIG_SND_SOC_SOF_ICELAKE) #if IS_ENABLED(CONFIG_SND_SOC_SOF_ICELAKE)
{ PCI_DEVICE(0x8086, 0x34C8), { PCI_DEVICE(0x8086, 0x34C8), /* ICL-LP */
.driver_data = (unsigned long)&icl_desc},
{ PCI_DEVICE(0x8086, 0x3dc8), /* ICL-H */
.driver_data = (unsigned long)&icl_desc}, .driver_data = (unsigned long)&icl_desc},
#endif #endif
#if IS_ENABLED(CONFIG_SND_SOC_SOF_JASPERLAKE) #if IS_ENABLED(CONFIG_SND_SOC_SOF_JASPERLAKE)
{ PCI_DEVICE(0x8086, 0x38c8), { PCI_DEVICE(0x8086, 0x38c8),
...@@ -420,17 +421,20 @@ static const struct pci_device_id sof_pci_ids[] = { ...@@ -420,17 +421,20 @@ static const struct pci_device_id sof_pci_ids[] = {
{ PCI_DEVICE(0x8086, 0x4dc8), { PCI_DEVICE(0x8086, 0x4dc8),
.driver_data = (unsigned long)&jsl_desc}, .driver_data = (unsigned long)&jsl_desc},
#endif #endif
#if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_LP) #if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE)
{ PCI_DEVICE(0x8086, 0x02c8), { PCI_DEVICE(0x8086, 0x02c8), /* CML-LP */
.driver_data = (unsigned long)&cml_desc}, .driver_data = (unsigned long)&cml_desc},
#endif { PCI_DEVICE(0x8086, 0x06c8), /* CML-H */
#if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_H) .driver_data = (unsigned long)&cml_desc},
{ PCI_DEVICE(0x8086, 0x06c8), { PCI_DEVICE(0x8086, 0xa3f0), /* CML-S */
.driver_data = (unsigned long)&cml_desc}, .driver_data = (unsigned long)&cml_desc},
#endif #endif
#if IS_ENABLED(CONFIG_SND_SOC_SOF_TIGERLAKE) #if IS_ENABLED(CONFIG_SND_SOC_SOF_TIGERLAKE)
{ PCI_DEVICE(0x8086, 0xa0c8), { PCI_DEVICE(0x8086, 0xa0c8), /* TGL-LP */
.driver_data = (unsigned long)&tgl_desc},
{ PCI_DEVICE(0x8086, 0x43c8), /* TGL-H */
.driver_data = (unsigned long)&tgl_desc}, .driver_data = (unsigned long)&tgl_desc},
#endif #endif
#if IS_ENABLED(CONFIG_SND_SOC_SOF_ELKHARTLAKE) #if IS_ENABLED(CONFIG_SND_SOC_SOF_ELKHARTLAKE)
{ PCI_DEVICE(0x8086, 0x4b55), { PCI_DEVICE(0x8086, 0x4b55),
......
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