forked from Minki/linux
ASoC: Fixes for v5.5
This is mostly driver specific fixes, plus an error handling fix in the core. There is a rather large diffstat for the stm32 SAI driver, this is a very large but mostly mechanical update which wraps every register access in the driver to allow a fix to the locking which avoids circular locks, the active change is much smaller and more reasonably sized. -----BEGIN PGP SIGNATURE----- iQFHBAABCgAxFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAl4gVcMTHGJyb29uaWVA a2VybmVsLm9yZwAKCRAk1otyXVSH0IMOB/wJszUsDT3K46IvCg0qKJhsW+vsFsuo bjk03Fsbi/v6ukcrIbRxBl50saqut8MFibSgrMTlDCkCOvQbz3C+S2N96N9SKWSX gfEYd6PzdxVkZCx8xqybB82WGXjNBzoJue7lIYe2ytCIwjasPZtBjfNW9E+6KNkC zOGoRLGSDepZRovDQM8JbALhKHw4z5a19fDOGiESuDfp3kjsTKAe8R+UXRvcsIDc mqBblGMcKOZtRw87MDlDK2iKLPJEKAS3ndr6/a8+iX02hJMb3Yu6NbMmU4/0kHfC 3xc7xoyTZW8GVnhsLchJhOBaz+TFizTqBJTCr1tjkEjPB504SZm+/Wtx =/nsR -----END PGP SIGNATURE----- gpgsig -----BEGIN PGP SIGNATURE----- iQFHBAABCgAxFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAl4h1RITHGJyb29uaWVA a2VybmVsLm9yZwAKCRAk1otyXVSH0AjyB/41oCDts2pMZqxyt9PNBE3p4TDrRmxE Ocbtn+ygKWCaqEX+Ecy8rPMtXEM1Ziz4o57+iOUWlpLd63uXDxBwF+t8+oXtbvCP qfAO4IV7Fnw6CZTDvl5VFkSJKz+8woqP+ucqRIZSQLgqjuXXm26NVvZR93VY9av4 gdHregixNNxLk1lElp9ZKyos3FvhkAFf/Fl4oNEgAH/7mP8yj82sJPd/RQYiaeNu t1vMC++Rh6cqt4X8gMWz8yET4LjqIWzQVMdyGJ9BP9mUtGUtuwK3kkQKpCpu1dMc b2y1G5uUPFBT9bgIOWyPqXIqsqdBSauuD5/e1jCz2Tgeq961C47qAiBC =khtD -----END PGP SIGNATURE----- Merge tag 'asoc-fix-v5.5-rc6' into asoc-5.6 ASoC: Fixes for v5.5 This is mostly driver specific fixes, plus an error handling fix in the core. There is a rather large diffstat for the stm32 SAI driver, this is a very large but mostly mechanical update which wraps every register access in the driver to allow a fix to the locking which avoids circular locks, the active change is much smaller and more reasonably sized.
This commit is contained in:
commit
ea3f0ce756
@ -10,6 +10,7 @@
|
||||
|
||||
#include <crypto/hash.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/io.h>
|
||||
@ -1047,10 +1048,17 @@ static const struct of_device_id cros_ec_codec_of_match[] = {
|
||||
MODULE_DEVICE_TABLE(of, cros_ec_codec_of_match);
|
||||
#endif
|
||||
|
||||
static const struct acpi_device_id cros_ec_codec_acpi_id[] = {
|
||||
{ "GOOG0013", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, cros_ec_codec_acpi_id);
|
||||
|
||||
static struct platform_driver cros_ec_codec_platform_driver = {
|
||||
.driver = {
|
||||
.name = "cros-ec-codec",
|
||||
.of_match_table = of_match_ptr(cros_ec_codec_of_match),
|
||||
.acpi_match_table = ACPI_PTR(cros_ec_codec_acpi_id),
|
||||
},
|
||||
.probe = cros_ec_codec_platform_probe,
|
||||
};
|
||||
|
@ -604,7 +604,9 @@ static int hdac_hda_dev_remove(struct hdac_device *hdev)
|
||||
struct hdac_hda_priv *hda_pvt;
|
||||
|
||||
hda_pvt = dev_get_drvdata(&hdev->dev);
|
||||
cancel_delayed_work_sync(&hda_pvt->codec.jackpoll_work);
|
||||
if (hda_pvt && hda_pvt->codec.registered)
|
||||
cancel_delayed_work_sync(&hda_pvt->codec.jackpoll_work);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -396,9 +396,6 @@ static int pm8916_wcd_analog_enable_micbias_int(struct snd_soc_component
|
||||
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_PRE_PMU:
|
||||
snd_soc_component_update_bits(component, CDC_A_MICB_1_INT_RBIAS,
|
||||
MICB_1_INT_TX2_INT_RBIAS_EN_MASK,
|
||||
MICB_1_INT_TX2_INT_RBIAS_EN_ENABLE);
|
||||
snd_soc_component_update_bits(component, reg, MICB_1_EN_PULL_DOWN_EN_MASK, 0);
|
||||
snd_soc_component_update_bits(component, CDC_A_MICB_1_EN,
|
||||
MICB_1_EN_OPA_STG2_TAIL_CURR_MASK,
|
||||
@ -448,6 +445,14 @@ static int pm8916_wcd_analog_enable_micbias_int1(struct
|
||||
struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
|
||||
struct pm8916_wcd_analog_priv *wcd = snd_soc_component_get_drvdata(component);
|
||||
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_PRE_PMU:
|
||||
snd_soc_component_update_bits(component, CDC_A_MICB_1_INT_RBIAS,
|
||||
MICB_1_INT_TX1_INT_RBIAS_EN_MASK,
|
||||
MICB_1_INT_TX1_INT_RBIAS_EN_ENABLE);
|
||||
break;
|
||||
}
|
||||
|
||||
return pm8916_wcd_analog_enable_micbias_int(component, event, w->reg,
|
||||
wcd->micbias1_cap_mode);
|
||||
}
|
||||
@ -558,6 +563,11 @@ static int pm8916_wcd_analog_enable_micbias_int2(struct
|
||||
struct pm8916_wcd_analog_priv *wcd = snd_soc_component_get_drvdata(component);
|
||||
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_PRE_PMU:
|
||||
snd_soc_component_update_bits(component, CDC_A_MICB_1_INT_RBIAS,
|
||||
MICB_1_INT_TX2_INT_RBIAS_EN_MASK,
|
||||
MICB_1_INT_TX2_INT_RBIAS_EN_ENABLE);
|
||||
break;
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
pm8916_mbhc_configure_bias(wcd, true);
|
||||
break;
|
||||
@ -938,10 +948,10 @@ static const struct snd_soc_dapm_widget pm8916_wcd_analog_dapm_widgets[] = {
|
||||
|
||||
SND_SOC_DAPM_SUPPLY("MIC BIAS External1", CDC_A_MICB_1_EN, 7, 0,
|
||||
pm8916_wcd_analog_enable_micbias_ext1,
|
||||
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
|
||||
SND_SOC_DAPM_POST_PMU),
|
||||
SND_SOC_DAPM_SUPPLY("MIC BIAS External2", CDC_A_MICB_2_EN, 7, 0,
|
||||
pm8916_wcd_analog_enable_micbias_ext2,
|
||||
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
|
||||
SND_SOC_DAPM_POST_PMU),
|
||||
|
||||
SND_SOC_DAPM_ADC_E("ADC1", NULL, CDC_A_TX_1_EN, 7, 0,
|
||||
pm8916_wcd_analog_enable_adc,
|
||||
|
@ -586,6 +586,12 @@ static int msm8916_wcd_digital_enable_interpolator(
|
||||
snd_soc_component_write(component, rx_gain_reg[w->shift],
|
||||
snd_soc_component_read32(component, rx_gain_reg[w->shift]));
|
||||
break;
|
||||
case SND_SOC_DAPM_POST_PMD:
|
||||
snd_soc_component_update_bits(component, LPASS_CDC_CLK_RX_RESET_CTL,
|
||||
1 << w->shift, 1 << w->shift);
|
||||
snd_soc_component_update_bits(component, LPASS_CDC_CLK_RX_RESET_CTL,
|
||||
1 << w->shift, 0x0);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -24,19 +24,18 @@
|
||||
#define IDISP_VID_INTEL 0x80860000
|
||||
|
||||
/* load the legacy HDA codec driver */
|
||||
#ifdef MODULE
|
||||
static void hda_codec_load_module(struct hda_codec *codec)
|
||||
static int hda_codec_load_module(struct hda_codec *codec)
|
||||
{
|
||||
#ifdef MODULE
|
||||
char alias[MODULE_NAME_LEN];
|
||||
const char *module = alias;
|
||||
|
||||
snd_hdac_codec_modalias(&codec->core, alias, sizeof(alias));
|
||||
dev_dbg(&codec->core.dev, "loading codec module: %s\n", module);
|
||||
request_module(module);
|
||||
}
|
||||
#else
|
||||
static void hda_codec_load_module(struct hda_codec *codec) {}
|
||||
#endif
|
||||
return device_attach(hda_codec_dev(codec));
|
||||
}
|
||||
|
||||
/* enable controller wake up event for all codecs with jack connectors */
|
||||
void hda_codec_jack_wake_enable(struct snd_sof_dev *sdev)
|
||||
@ -124,10 +123,16 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address,
|
||||
if (hda_codec_use_common_hdmi ||
|
||||
(resp & 0xFFFF0000) != IDISP_VID_INTEL) {
|
||||
hdev->type = HDA_DEV_LEGACY;
|
||||
hda_codec_load_module(&hda_priv->codec);
|
||||
ret = hda_codec_load_module(&hda_priv->codec);
|
||||
/*
|
||||
* handle ret==0 (no driver bound) as an error, but pass
|
||||
* other return codes without modification
|
||||
*/
|
||||
if (ret == 0)
|
||||
ret = -ENOENT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
#else
|
||||
hdev = devm_kzalloc(sdev->dev, sizeof(*hdev), GFP_KERNEL);
|
||||
if (!hdev)
|
||||
|
@ -328,13 +328,13 @@ int hda_dsp_cl_boot_firmware(struct snd_sof_dev *sdev)
|
||||
if (!ret)
|
||||
break;
|
||||
|
||||
dev_err(sdev->dev, "error: Error code=0x%x: FW status=0x%x\n",
|
||||
dev_dbg(sdev->dev, "iteration %d of Core En/ROM load failed: %d\n",
|
||||
i, ret);
|
||||
dev_dbg(sdev->dev, "Error code=0x%x: FW status=0x%x\n",
|
||||
snd_sof_dsp_read(sdev, HDA_DSP_BAR,
|
||||
HDA_DSP_SRAM_REG_ROM_ERROR),
|
||||
snd_sof_dsp_read(sdev, HDA_DSP_BAR,
|
||||
HDA_DSP_SRAM_REG_ROM_STATUS));
|
||||
dev_err(sdev->dev, "error: iteration %d of Core En/ROM load failed: %d\n",
|
||||
i, ret);
|
||||
}
|
||||
|
||||
if (i == HDA_FW_BOOT_ATTEMPTS) {
|
||||
|
@ -226,7 +226,6 @@ static void uni_player_set_channel_status(struct uniperif *player,
|
||||
* sampling frequency. If no sample rate is already specified, then
|
||||
* set one.
|
||||
*/
|
||||
mutex_lock(&player->ctrl_lock);
|
||||
if (runtime) {
|
||||
switch (runtime->rate) {
|
||||
case 22050:
|
||||
@ -303,7 +302,6 @@ static void uni_player_set_channel_status(struct uniperif *player,
|
||||
player->stream_settings.iec958.status[3 + (n * 4)] << 24;
|
||||
SET_UNIPERIF_CHANNEL_STA_REGN(player, n, status);
|
||||
}
|
||||
mutex_unlock(&player->ctrl_lock);
|
||||
|
||||
/* Update the channel status */
|
||||
if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0)
|
||||
@ -365,8 +363,10 @@ static int uni_player_prepare_iec958(struct uniperif *player,
|
||||
|
||||
SET_UNIPERIF_CTRL_ZERO_STUFF_HW(player);
|
||||
|
||||
mutex_lock(&player->ctrl_lock);
|
||||
/* Update the channel status */
|
||||
uni_player_set_channel_status(player, runtime);
|
||||
mutex_unlock(&player->ctrl_lock);
|
||||
|
||||
/* Clear the user validity user bits */
|
||||
SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(player, 0);
|
||||
@ -598,7 +598,6 @@ static int uni_player_ctl_iec958_put(struct snd_kcontrol *kcontrol,
|
||||
iec958->status[1] = ucontrol->value.iec958.status[1];
|
||||
iec958->status[2] = ucontrol->value.iec958.status[2];
|
||||
iec958->status[3] = ucontrol->value.iec958.status[3];
|
||||
mutex_unlock(&player->ctrl_lock);
|
||||
|
||||
spin_lock_irqsave(&player->irq_lock, flags);
|
||||
if (player->substream && player->substream->runtime)
|
||||
@ -608,6 +607,8 @@ static int uni_player_ctl_iec958_put(struct snd_kcontrol *kcontrol,
|
||||
uni_player_set_channel_status(player, NULL);
|
||||
|
||||
spin_unlock_irqrestore(&player->irq_lock, flags);
|
||||
mutex_unlock(&player->ctrl_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -153,13 +153,13 @@ static const struct snd_soc_component_driver stm32_adfsdm_dai_component = {
|
||||
.name = "stm32_dfsdm_audio",
|
||||
};
|
||||
|
||||
static void memcpy_32to16(void *dest, const void *src, size_t n)
|
||||
static void stm32_memcpy_32to16(void *dest, const void *src, size_t n)
|
||||
{
|
||||
unsigned int i = 0;
|
||||
u16 *d = (u16 *)dest, *s = (u16 *)src;
|
||||
|
||||
s++;
|
||||
for (i = n; i > 0; i--) {
|
||||
for (i = n >> 1; i > 0; i--) {
|
||||
*d++ = *s++;
|
||||
s++;
|
||||
}
|
||||
@ -186,8 +186,8 @@ static int stm32_afsdm_pcm_cb(const void *data, size_t size, void *private)
|
||||
|
||||
if ((priv->pos + src_size) > buff_size) {
|
||||
if (format == SNDRV_PCM_FORMAT_S16_LE)
|
||||
memcpy_32to16(&pcm_buff[priv->pos], src_buff,
|
||||
buff_size - priv->pos);
|
||||
stm32_memcpy_32to16(&pcm_buff[priv->pos], src_buff,
|
||||
buff_size - priv->pos);
|
||||
else
|
||||
memcpy(&pcm_buff[priv->pos], src_buff,
|
||||
buff_size - priv->pos);
|
||||
@ -196,8 +196,8 @@ static int stm32_afsdm_pcm_cb(const void *data, size_t size, void *private)
|
||||
}
|
||||
|
||||
if (format == SNDRV_PCM_FORMAT_S16_LE)
|
||||
memcpy_32to16(&pcm_buff[priv->pos],
|
||||
&src_buff[src_size - cur_size], cur_size);
|
||||
stm32_memcpy_32to16(&pcm_buff[priv->pos],
|
||||
&src_buff[src_size - cur_size], cur_size);
|
||||
else
|
||||
memcpy(&pcm_buff[priv->pos], &src_buff[src_size - cur_size],
|
||||
cur_size);
|
||||
|
Loading…
Reference in New Issue
Block a user