ASoC: Fixes for v5.10
A batch of driver specific fixes that have come up since the merge window, nothing particularly major here but all good to have. -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAl+kBYgACgkQJNaLcl1U h9BDHQf9HDn/narvcVdfCBdWI0uI/P5sETaQUw69J1PquiCtn8P2MzyaIofTGJbX IiWEQE+Z1FnUgcs/KAQwKuvlp5UQ+L/6VlTPATgxEOcnNb82rN1riJjHI4C+5UXj +KShaJy0afLcva3HL1NOuzUPvj1TZ+j07JiW7uqhEd3H/+O3VlXvUFWlZeXcDiNn 5hd+r4fKybfYrydR/kpE2JBW7E+0JhcOgztBhw/p3K0js+ovaDolSDVgonwcOtPE /yDhISEkSzQ7wWYc4FjROryQJ5e4HtLEc9RumiqHVDXVg51uT3z8U/aEttlXVKR9 lEGZw+xNlnqDi/LDqYvJn1CER6iklw== =Pe6G -----END PGP SIGNATURE----- Merge tag 'asoc-fix-v5.10-rc2' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus ASoC: Fixes for v5.10 A batch of driver specific fixes that have come up since the merge window, nothing particularly major here but all good to have.
This commit is contained in:
Коммит
a6c96672a6
|
@ -487,7 +487,6 @@ static int mchp_spdiftx_hw_params(struct snd_pcm_substream *substream,
|
|||
}
|
||||
mchp_spdiftx_channel_status_write(dev);
|
||||
spin_unlock_irqrestore(&ctrl->lock, flags);
|
||||
mr |= SPDIFTX_MR_VALID1 | SPDIFTX_MR_VALID2;
|
||||
|
||||
if (dev->gclk_enabled) {
|
||||
clk_disable_unprepare(dev->gclk);
|
||||
|
|
|
@ -254,8 +254,28 @@ static const struct snd_soc_dapm_widget cs42l51_dapm_widgets[] = {
|
|||
&cs42l51_adcr_mux_controls),
|
||||
};
|
||||
|
||||
static int mclk_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
|
||||
struct cs42l51_private *cs42l51 = snd_soc_component_get_drvdata(comp);
|
||||
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_PRE_PMU:
|
||||
return clk_prepare_enable(cs42l51->mclk_handle);
|
||||
case SND_SOC_DAPM_POST_PMD:
|
||||
/* Delay mclk shutdown to fulfill power-down sequence requirements */
|
||||
msleep(20);
|
||||
clk_disable_unprepare(cs42l51->mclk_handle);
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct snd_soc_dapm_widget cs42l51_dapm_mclk_widgets[] = {
|
||||
SND_SOC_DAPM_CLOCK_SUPPLY("MCLK")
|
||||
SND_SOC_DAPM_SUPPLY("MCLK", SND_SOC_NOPM, 0, 0, mclk_event,
|
||||
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route cs42l51_routes[] = {
|
||||
|
|
|
@ -618,7 +618,7 @@ static const char * const sb_tx8_mux_text[] = {
|
|||
"ZERO", "RX_MIX_TX8", "DEC8", "DEC8_192"
|
||||
};
|
||||
|
||||
static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0);
|
||||
static const DECLARE_TLV_DB_SCALE(digital_gain, -8400, 100, -8400);
|
||||
static const DECLARE_TLV_DB_SCALE(line_gain, 0, 7, 1);
|
||||
static const DECLARE_TLV_DB_SCALE(analog_gain, 0, 25, 1);
|
||||
static const DECLARE_TLV_DB_SCALE(ear_pa_gain, 0, 150, 0);
|
||||
|
|
|
@ -551,7 +551,7 @@ struct wcd_iir_filter_ctl {
|
|||
struct soc_bytes_ext bytes_ext;
|
||||
};
|
||||
|
||||
static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0);
|
||||
static const DECLARE_TLV_DB_SCALE(digital_gain, -8400, 100, -8400);
|
||||
static const DECLARE_TLV_DB_SCALE(line_gain, 0, 7, 1);
|
||||
static const DECLARE_TLV_DB_SCALE(analog_gain, 0, 25, 1);
|
||||
static const DECLARE_TLV_DB_SCALE(ear_pa_gain, 0, 150, 0);
|
||||
|
|
|
@ -1026,6 +1026,8 @@ static struct snd_soc_dai_driver wsa881x_dais[] = {
|
|||
.id = 0,
|
||||
.playback = {
|
||||
.stream_name = "SPKR Playback",
|
||||
.rates = SNDRV_PCM_RATE_48000,
|
||||
.formats = SNDRV_PCM_FMTBIT_S16_LE,
|
||||
.rate_max = 48000,
|
||||
.rate_min = 48000,
|
||||
.channels_min = 1,
|
||||
|
|
|
@ -15,22 +15,6 @@ config SND_SOC_INTEL_SST_TOPLEVEL
|
|||
|
||||
if SND_SOC_INTEL_SST_TOPLEVEL
|
||||
|
||||
config SND_SST_IPC
|
||||
tristate
|
||||
# This option controls the IPC core for HiFi2 platforms
|
||||
|
||||
config SND_SST_IPC_PCI
|
||||
tristate
|
||||
select SND_SST_IPC
|
||||
# This option controls the PCI-based IPC for HiFi2 platforms
|
||||
# (Medfield, Merrifield).
|
||||
|
||||
config SND_SST_IPC_ACPI
|
||||
tristate
|
||||
select SND_SST_IPC
|
||||
# This option controls the ACPI-based IPC for HiFi2 platforms
|
||||
# (Baytrail, Cherrytrail)
|
||||
|
||||
config SND_SOC_INTEL_SST
|
||||
tristate
|
||||
|
||||
|
@ -57,7 +41,6 @@ config SND_SST_ATOM_HIFI2_PLATFORM
|
|||
config SND_SST_ATOM_HIFI2_PLATFORM_PCI
|
||||
tristate "PCI HiFi2 (Merrifield) Platforms"
|
||||
depends on X86 && PCI
|
||||
select SND_SST_IPC_PCI
|
||||
select SND_SST_ATOM_HIFI2_PLATFORM
|
||||
help
|
||||
If you have a Intel Merrifield/Edison platform, then
|
||||
|
@ -70,7 +53,6 @@ config SND_SST_ATOM_HIFI2_PLATFORM_ACPI
|
|||
tristate "ACPI HiFi2 (Baytrail, Cherrytrail) Platforms"
|
||||
default ACPI
|
||||
depends on X86 && ACPI && PCI
|
||||
select SND_SST_IPC_ACPI
|
||||
select SND_SST_ATOM_HIFI2_PLATFORM
|
||||
select SND_SOC_ACPI_INTEL_MATCH
|
||||
select IOSF_MBI
|
||||
|
|
|
@ -6,4 +6,4 @@ snd-soc-sst-atom-hifi2-platform-objs := sst-mfld-platform-pcm.o \
|
|||
obj-$(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM) += snd-soc-sst-atom-hifi2-platform.o
|
||||
|
||||
# DSP driver
|
||||
obj-$(CONFIG_SND_SST_IPC) += sst/
|
||||
obj-$(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM) += sst/
|
||||
|
|
|
@ -3,6 +3,6 @@ snd-intel-sst-core-objs := sst.o sst_ipc.o sst_stream.o sst_drv_interface.o sst_
|
|||
snd-intel-sst-pci-objs += sst_pci.o
|
||||
snd-intel-sst-acpi-objs += sst_acpi.o
|
||||
|
||||
obj-$(CONFIG_SND_SST_IPC) += snd-intel-sst-core.o
|
||||
obj-$(CONFIG_SND_SST_IPC_PCI) += snd-intel-sst-pci.o
|
||||
obj-$(CONFIG_SND_SST_IPC_ACPI) += snd-intel-sst-acpi.o
|
||||
obj-$(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM) += snd-intel-sst-core.o
|
||||
obj-$(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_PCI) += snd-intel-sst-pci.o
|
||||
obj-$(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) += snd-intel-sst-acpi.o
|
||||
|
|
|
@ -401,17 +401,40 @@ static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd,
|
|||
struct snd_interval *chan = hw_param_interval(params,
|
||||
SNDRV_PCM_HW_PARAM_CHANNELS);
|
||||
struct snd_mask *fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
|
||||
struct snd_soc_dpcm *dpcm = container_of(
|
||||
params, struct snd_soc_dpcm, hw_params);
|
||||
struct snd_soc_dai_link *fe_dai_link = dpcm->fe->dai_link;
|
||||
struct snd_soc_dai_link *be_dai_link = dpcm->be->dai_link;
|
||||
struct snd_soc_dpcm *dpcm, *rtd_dpcm = NULL;
|
||||
|
||||
/*
|
||||
* The following loop will be called only for playback stream
|
||||
* In this platform, there is only one playback device on every SSP
|
||||
*/
|
||||
for_each_dpcm_fe(rtd, SNDRV_PCM_STREAM_PLAYBACK, dpcm) {
|
||||
rtd_dpcm = dpcm;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* This following loop will be called only for capture stream
|
||||
* In this platform, there is only one capture device on every SSP
|
||||
*/
|
||||
for_each_dpcm_fe(rtd, SNDRV_PCM_STREAM_CAPTURE, dpcm) {
|
||||
rtd_dpcm = dpcm;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!rtd_dpcm)
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* The above 2 loops are mutually exclusive based on the stream direction,
|
||||
* thus rtd_dpcm variable will never be overwritten
|
||||
*/
|
||||
|
||||
/*
|
||||
* The ADSP will convert the FE rate to 48k, stereo, 24 bit
|
||||
*/
|
||||
if (!strcmp(fe_dai_link->name, "Kbl Audio Port") ||
|
||||
!strcmp(fe_dai_link->name, "Kbl Audio Headset Playback") ||
|
||||
!strcmp(fe_dai_link->name, "Kbl Audio Capture Port")) {
|
||||
if (!strcmp(rtd_dpcm->fe->dai_link->name, "Kbl Audio Port") ||
|
||||
!strcmp(rtd_dpcm->fe->dai_link->name, "Kbl Audio Headset Playback") ||
|
||||
!strcmp(rtd_dpcm->fe->dai_link->name, "Kbl Audio Capture Port")) {
|
||||
rate->min = rate->max = 48000;
|
||||
chan->min = chan->max = 2;
|
||||
snd_mask_none(fmt);
|
||||
|
@ -421,7 +444,7 @@ static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd,
|
|||
* The speaker on the SSP0 supports S16_LE and not S24_LE.
|
||||
* thus changing the mask here
|
||||
*/
|
||||
if (!strcmp(be_dai_link->name, "SSP0-Codec"))
|
||||
if (!strcmp(rtd_dpcm->be->dai_link->name, "SSP0-Codec"))
|
||||
snd_mask_set_format(fmt, SNDRV_PCM_FORMAT_S16_LE);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -267,9 +267,12 @@ static int catpt_dsp_select_lpclock(struct catpt_dev *cdev, bool lp, bool waiti)
|
|||
reg, (reg & CATPT_ISD_DCPWM),
|
||||
500, 10000);
|
||||
if (ret) {
|
||||
dev_err(cdev->dev, "await WAITI timeout\n");
|
||||
mutex_unlock(&cdev->clk_mutex);
|
||||
return ret;
|
||||
dev_warn(cdev->dev, "await WAITI timeout\n");
|
||||
/* no signal - only high clock selection allowed */
|
||||
if (lp) {
|
||||
mutex_unlock(&cdev->clk_mutex);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -667,7 +667,17 @@ static int catpt_dai_pcm_new(struct snd_soc_pcm_runtime *rtm,
|
|||
break;
|
||||
}
|
||||
|
||||
/* see if this is a new configuration */
|
||||
if (!memcmp(&cdev->devfmt[devfmt.iface], &devfmt, sizeof(devfmt)))
|
||||
return 0;
|
||||
|
||||
pm_runtime_get_sync(cdev->dev);
|
||||
|
||||
ret = catpt_ipc_set_device_format(cdev, &devfmt);
|
||||
|
||||
pm_runtime_mark_last_busy(cdev->dev);
|
||||
pm_runtime_put_autosuspend(cdev->dev);
|
||||
|
||||
if (ret)
|
||||
return CATPT_IPC_ERROR(ret);
|
||||
|
||||
|
|
|
@ -630,15 +630,34 @@ static struct snd_soc_codec_conf mt8183_da7219_rt1015_codec_conf[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new mt8183_da7219_rt1015_snd_controls[] = {
|
||||
SOC_DAPM_PIN_SWITCH("Left Spk"),
|
||||
SOC_DAPM_PIN_SWITCH("Right Spk"),
|
||||
};
|
||||
|
||||
static const
|
||||
struct snd_soc_dapm_widget mt8183_da7219_rt1015_dapm_widgets[] = {
|
||||
SND_SOC_DAPM_SPK("Left Spk", NULL),
|
||||
SND_SOC_DAPM_SPK("Right Spk", NULL),
|
||||
SND_SOC_DAPM_PINCTRL("TDM_OUT_PINCTRL",
|
||||
"aud_tdm_out_on", "aud_tdm_out_off"),
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route mt8183_da7219_rt1015_dapm_routes[] = {
|
||||
{"Left Spk", NULL, "Left SPO"},
|
||||
{"Right Spk", NULL, "Right SPO"},
|
||||
{"I2S Playback", NULL, "TDM_OUT_PINCTRL"},
|
||||
};
|
||||
|
||||
static struct snd_soc_card mt8183_da7219_rt1015_card = {
|
||||
.name = "mt8183_da7219_rt1015",
|
||||
.owner = THIS_MODULE,
|
||||
.controls = mt8183_da7219_max98357_snd_controls,
|
||||
.num_controls = ARRAY_SIZE(mt8183_da7219_max98357_snd_controls),
|
||||
.dapm_widgets = mt8183_da7219_max98357_dapm_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(mt8183_da7219_max98357_dapm_widgets),
|
||||
.dapm_routes = mt8183_da7219_max98357_dapm_routes,
|
||||
.num_dapm_routes = ARRAY_SIZE(mt8183_da7219_max98357_dapm_routes),
|
||||
.controls = mt8183_da7219_rt1015_snd_controls,
|
||||
.num_controls = ARRAY_SIZE(mt8183_da7219_rt1015_snd_controls),
|
||||
.dapm_widgets = mt8183_da7219_rt1015_dapm_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(mt8183_da7219_rt1015_dapm_widgets),
|
||||
.dapm_routes = mt8183_da7219_rt1015_dapm_routes,
|
||||
.num_dapm_routes = ARRAY_SIZE(mt8183_da7219_rt1015_dapm_routes),
|
||||
.dai_link = mt8183_da7219_dai_links,
|
||||
.num_links = ARRAY_SIZE(mt8183_da7219_dai_links),
|
||||
.aux_dev = &mt8183_da7219_max98357_headset_dev,
|
||||
|
|
|
@ -80,6 +80,12 @@ static int lpass_cpu_daiops_startup(struct snd_pcm_substream *substream,
|
|||
dev_err(dai->dev, "error in enabling mi2s osr clk: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
ret = clk_prepare(drvdata->mi2s_bit_clk[dai->driver->id]);
|
||||
if (ret) {
|
||||
dev_err(dai->dev, "error in enabling mi2s bit clk: %d\n", ret);
|
||||
clk_disable_unprepare(drvdata->mi2s_osr_clk[dai->driver->id]);
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -88,9 +94,8 @@ static void lpass_cpu_daiops_shutdown(struct snd_pcm_substream *substream,
|
|||
{
|
||||
struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai);
|
||||
|
||||
clk_disable_unprepare(drvdata->mi2s_bit_clk[dai->driver->id]);
|
||||
|
||||
clk_disable_unprepare(drvdata->mi2s_osr_clk[dai->driver->id]);
|
||||
clk_unprepare(drvdata->mi2s_bit_clk[dai->driver->id]);
|
||||
}
|
||||
|
||||
static int lpass_cpu_daiops_hw_params(struct snd_pcm_substream *substream,
|
||||
|
@ -303,10 +308,10 @@ static int lpass_cpu_daiops_trigger(struct snd_pcm_substream *substream,
|
|||
dev_err(dai->dev, "error writing to i2sctl reg: %d\n",
|
||||
ret);
|
||||
|
||||
ret = clk_prepare_enable(drvdata->mi2s_bit_clk[id]);
|
||||
ret = clk_enable(drvdata->mi2s_bit_clk[id]);
|
||||
if (ret) {
|
||||
dev_err(dai->dev, "error in enabling mi2s bit clk: %d\n", ret);
|
||||
clk_disable_unprepare(drvdata->mi2s_osr_clk[id]);
|
||||
clk_disable(drvdata->mi2s_osr_clk[id]);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -324,6 +329,7 @@ static int lpass_cpu_daiops_trigger(struct snd_pcm_substream *substream,
|
|||
if (ret)
|
||||
dev_err(dai->dev, "error writing to i2sctl reg: %d\n",
|
||||
ret);
|
||||
clk_disable(drvdata->mi2s_bit_clk[dai->driver->id]);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -188,7 +188,7 @@ static struct lpass_variant sc7180_data = {
|
|||
.micmode = REG_FIELD_ID(0x1000, 4, 8, 3, 0x1000),
|
||||
.micmono = REG_FIELD_ID(0x1000, 3, 3, 3, 0x1000),
|
||||
.wssrc = REG_FIELD_ID(0x1000, 2, 2, 3, 0x1000),
|
||||
.bitwidth = REG_FIELD_ID(0x1000, 0, 0, 3, 0x1000),
|
||||
.bitwidth = REG_FIELD_ID(0x1000, 0, 1, 3, 0x1000),
|
||||
|
||||
.rdma_dyncclk = REG_FIELD_ID(0xC000, 21, 21, 5, 0x1000),
|
||||
.rdma_bursten = REG_FIELD_ID(0xC000, 20, 20, 5, 0x1000),
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include "qdsp6/q6afe.h"
|
||||
#include "../codecs/rt5663.h"
|
||||
|
||||
#define DRIVER_NAME "sdm845"
|
||||
#define DEFAULT_SAMPLE_RATE_48K 48000
|
||||
#define DEFAULT_MCLK_RATE 24576000
|
||||
#define TDM_BCLK_RATE 6144000
|
||||
|
@ -552,6 +553,7 @@ static int sdm845_snd_platform_probe(struct platform_device *pdev)
|
|||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
card->driver_name = DRIVER_NAME;
|
||||
card->dapm_widgets = sdm845_snd_widgets;
|
||||
card->num_dapm_widgets = ARRAY_SIZE(sdm845_snd_widgets);
|
||||
card->dev = dev;
|
||||
|
|
|
@ -118,6 +118,11 @@ int snd_sof_fw_parse_ext_data(struct snd_sof_dev *sdev, u32 bar, u32 offset)
|
|||
case SOF_IPC_EXT_CC_INFO:
|
||||
ret = get_cc_info(sdev, ext_hdr);
|
||||
break;
|
||||
case SOF_IPC_EXT_UNUSED:
|
||||
case SOF_IPC_EXT_PROBE_INFO:
|
||||
case SOF_IPC_EXT_USER_ABI_INFO:
|
||||
/* They are supported but we don't do anything here */
|
||||
break;
|
||||
default:
|
||||
dev_warn(sdev->dev, "warning: unknown ext header type %d size 0x%x\n",
|
||||
ext_hdr->type, ext_hdr->hdr.size);
|
||||
|
|
Загрузка…
Ссылка в новой задаче