mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-01 10:42:11 +00:00
sound fixes for 6.6-rc1
A collection of fixes for 6.6-rc1. All small and easy ones. - The corrections of the previous PCM iov_iter transitions - Regression fixes in MIDI 2.0 / USB changes - Various ASoC codec fixes for Cirrus, Realtek, WCD - ASoC AMD quirks and ASoC Intel AVS driver workaround -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmT5xkIOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE9k8RAAkgeTtv8W3YWKvkMMf7kMEP4Go8COJ4pLqY4A zPfJp//tDSKiOLPm8XzYYQQddTlcVc6iNbV/3Enw3Ov9xvnQxAk+N+5ciF+s27q5 KyxzKZneEOSJSCPHPcbcI0LgqpSH/b71S8NhGL48DXxCd+GHyHSind8hel6xi+u4 dQIL9cQOp1HGmKreMrHvsvY4ruG5SrnQ+GXjcnkmdmMWP17xtubAXcRWvZs/PMl4 dg5HNUDy/KuRbHnxTAee7tuGZyG10sLkS4UfP+J4gKGdOKQvltrQ7dTyG3dCKtRl Ezq0++IY7asMAdBu39IDJdC7XFr4jNSmeZbqcmhX8PTggIUJuyHzfnC9pAadkXOn B11ZJUL2I6QYI6UZyyvWTc2HD4+rxOvl6IkFkDgaiOD3chPTqhAwAhDUeFICSuBi BPJ4fG2r0iEFP92dTli9Q2gY2fXkE24ndpwP+zWbt0zO0/nQPh0XfWO3x6Vt/ml1 NNNj12qx6w6I4k8kx+mj4zFewz7x8dTIdXLukYAPk5tlagXpora9u1tt0ZT72T22 +wintcjfIp6agKxcWVmKVXi2PFdQmrwpUe5lW5EPKhEXNcrQaTBOKb9MYvFrCTz3 6olHbocegqolNnTJ/uSRTBD0E5jkwpdbc3MbSKrxUpcyTyKZmPDpd9JuPLLJHPfn BkFdx5U= =txoJ -----END PGP SIGNATURE----- Merge tag 'sound-fix-6.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "A collection of fixes for 6.6-rc1. All small and easy ones. - The corrections of the previous PCM iov_iter transitions - Regression fixes in MIDI 2.0 / USB changes - Various ASoC codec fixes for Cirrus, Realtek, WCD - ASoC AMD quirks and ASoC Intel AVS driver workaround" * tag 'sound-fix-6.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (21 commits) ALSA: hda/realtek - ALC287 I2S speaker platform support ASoC: amd: yc: Fix a non-functional mic on Lenovo 82TL ASoC: Intel: avs: Provide support for fallback topology ALSA: seq: Fix snd_seq_expand_var_event() call to user-space ALSA: usb-audio: Fix potential memory leaks at error path for UMP open ALSA: hda/cirrus: Fix broken audio on hardware with two CS42L42 codecs. ASoC: rt5645: NULL pointer access when removing jack ASoC: amd: yc: Add DMI entries to support Victus by HP Gaming Laptop 15-fb0xxx (8A3E) MAINTAINERS: Update the MAINTAINERS enties for TEXAS INSTRUMENTS ASoC DRIVERS ALSA: sb: Fix wrong argument in commented code ALSA: pcm: Fix error checks of default read/write copy ops ASoC: Name iov_iter argument as iterator instead of buffer ASoC: dmaengine: Drop unused iov_iter for process callback ALSA: hda/tas2781: Use standard clamp() macro ASoC: cs35l56: Waiting for firmware to boot must be tolerant of I/O errors ASoC: dt-bindings: fsl_easrc: Add support for imx8mp-easrc ASoC: cs42l43: Fix missing error code in cs42l43_codec_probe() ASoC: cs35l45: Rename DACPCM1 Source control ASoC: cs35l45: Fix "Dead assigment" warning ASoC: cs35l45: Add support for Chip ID 0x35A460 ...
This commit is contained in:
commit
a3d231e44a
@ -14,7 +14,13 @@ properties:
|
||||
pattern: "^easrc@.*"
|
||||
|
||||
compatible:
|
||||
const: fsl,imx8mn-easrc
|
||||
oneOf:
|
||||
- enum:
|
||||
- fsl,imx8mn-easrc
|
||||
- items:
|
||||
- enum:
|
||||
- fsl,imx8mp-easrc
|
||||
- const: fsl,imx8mn-easrc
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
@ -21244,7 +21244,7 @@ F: sound/soc/ti/
|
||||
TEXAS INSTRUMENTS AUDIO (ASoC/HDA) DRIVERS
|
||||
M: Shenghao Ding <shenghao-ding@ti.com>
|
||||
M: Kevin Lu <kevin-lu@ti.com>
|
||||
M: Baojun Xu <x1077012@ti.com>
|
||||
M: Baojun Xu <baojun.xu@ti.com>
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/sound/tas2552.txt
|
||||
|
@ -142,7 +142,7 @@ struct snd_dmaengine_pcm_config {
|
||||
struct snd_pcm_substream *substream);
|
||||
int (*process)(struct snd_pcm_substream *substream,
|
||||
int channel, unsigned long hwoff,
|
||||
struct iov_iter *buf, unsigned long bytes);
|
||||
unsigned long bytes);
|
||||
dma_filter_fn compat_filter_fn;
|
||||
struct device *dma_dev;
|
||||
const char *chan_names[SNDRV_PCM_STREAM_LAST + 1];
|
||||
|
@ -139,7 +139,7 @@ struct snd_soc_component_driver {
|
||||
struct snd_pcm_audio_tstamp_report *audio_tstamp_report);
|
||||
int (*copy)(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream, int channel,
|
||||
unsigned long pos, struct iov_iter *buf,
|
||||
unsigned long pos, struct iov_iter *iter,
|
||||
unsigned long bytes);
|
||||
struct page *(*page)(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream,
|
||||
@ -511,7 +511,7 @@ int snd_soc_pcm_component_ioctl(struct snd_pcm_substream *substream,
|
||||
int snd_soc_pcm_component_sync_stop(struct snd_pcm_substream *substream);
|
||||
int snd_soc_pcm_component_copy(struct snd_pcm_substream *substream,
|
||||
int channel, unsigned long pos,
|
||||
struct iov_iter *buf, unsigned long bytes);
|
||||
struct iov_iter *iter, unsigned long bytes);
|
||||
struct page *snd_soc_pcm_component_page(struct snd_pcm_substream *substream,
|
||||
unsigned long offset);
|
||||
int snd_soc_pcm_component_mmap(struct snd_pcm_substream *substream,
|
||||
|
@ -1992,8 +1992,8 @@ static int default_write_copy(struct snd_pcm_substream *substream,
|
||||
int channel, unsigned long hwoff,
|
||||
struct iov_iter *iter, unsigned long bytes)
|
||||
{
|
||||
if (!copy_from_iter(get_dma_ptr(substream->runtime, channel, hwoff),
|
||||
bytes, iter))
|
||||
if (copy_from_iter(get_dma_ptr(substream->runtime, channel, hwoff),
|
||||
bytes, iter) != bytes)
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
@ -2025,8 +2025,8 @@ static int default_read_copy(struct snd_pcm_substream *substream,
|
||||
int channel, unsigned long hwoff,
|
||||
struct iov_iter *iter, unsigned long bytes)
|
||||
{
|
||||
if (!copy_to_iter(get_dma_ptr(substream->runtime, channel, hwoff),
|
||||
bytes, iter))
|
||||
if (copy_to_iter(get_dma_ptr(substream->runtime, channel, hwoff),
|
||||
bytes, iter) != bytes)
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
|
@ -187,8 +187,13 @@ int snd_seq_expand_var_event(const struct snd_seq_event *event, int count, char
|
||||
err = expand_var_event(event, 0, len, buf, in_kernel);
|
||||
if (err < 0)
|
||||
return err;
|
||||
if (len != newlen)
|
||||
memset(buf + len, 0, newlen - len);
|
||||
if (len != newlen) {
|
||||
if (in_kernel)
|
||||
memset(buf + len, 0, newlen - len);
|
||||
else if (clear_user((__force void __user *)buf + len,
|
||||
newlen - len))
|
||||
return -EFAULT;
|
||||
}
|
||||
return newlen;
|
||||
}
|
||||
EXPORT_SYMBOL(snd_seq_expand_var_event);
|
||||
|
@ -456,7 +456,7 @@ static int emu8k_pcm_silence(struct snd_pcm_substream *subs,
|
||||
/* convert to word unit */
|
||||
pos = (pos << 1) + rec->loop_start[voice];
|
||||
count <<= 1;
|
||||
LOOP_WRITE(rec, pos, USER_SOCKPTR(NULL), count);
|
||||
LOOP_WRITE(rec, pos, NULL, count);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -888,7 +888,7 @@ static void cs42l42_resume(struct sub_codec *cs42l42)
|
||||
|
||||
/* Initialize CS42L42 companion codec */
|
||||
cs8409_i2c_bulk_write(cs42l42, cs42l42->init_seq, cs42l42->init_seq_num);
|
||||
usleep_range(30000, 35000);
|
||||
msleep(CS42L42_INIT_TIMEOUT_MS);
|
||||
|
||||
/* Clear interrupts, by reading interrupt status registers */
|
||||
cs8409_i2c_bulk_read(cs42l42, irq_regs, ARRAY_SIZE(irq_regs));
|
||||
|
@ -229,6 +229,7 @@ enum cs8409_coefficient_index_registers {
|
||||
#define CS42L42_I2C_SLEEP_US (2000)
|
||||
#define CS42L42_PDN_TIMEOUT_US (250000)
|
||||
#define CS42L42_PDN_SLEEP_US (2000)
|
||||
#define CS42L42_INIT_TIMEOUT_MS (45)
|
||||
#define CS42L42_FULL_SCALE_VOL_MASK (2)
|
||||
#define CS42L42_FULL_SCALE_VOL_0DB (1)
|
||||
#define CS42L42_FULL_SCALE_VOL_MINUS6DB (0)
|
||||
|
@ -7057,6 +7057,27 @@ static void alc295_fixup_dell_inspiron_top_speakers(struct hda_codec *codec,
|
||||
}
|
||||
}
|
||||
|
||||
/* Forcibly assign NID 0x03 to HP while NID 0x02 to SPK */
|
||||
static void alc287_fixup_bind_dacs(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
|
||||
static const hda_nid_t preferred_pairs[] = {
|
||||
0x17, 0x02, 0x21, 0x03, 0
|
||||
};
|
||||
|
||||
if (action != HDA_FIXUP_ACT_PRE_PROBE)
|
||||
return;
|
||||
|
||||
snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
|
||||
spec->gen.preferred_dacs = preferred_pairs;
|
||||
spec->gen.auto_mute_via_amp = 1;
|
||||
snd_hda_codec_write_cache(codec, 0x14, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
|
||||
0x0); /* Make sure 0x14 was disable */
|
||||
}
|
||||
|
||||
|
||||
enum {
|
||||
ALC269_FIXUP_GPIO2,
|
||||
ALC269_FIXUP_SONY_VAIO,
|
||||
@ -7319,6 +7340,7 @@ enum {
|
||||
ALC287_FIXUP_TAS2781_I2C,
|
||||
ALC245_FIXUP_HP_MUTE_LED_COEFBIT,
|
||||
ALC245_FIXUP_HP_X360_MUTE_LEDS,
|
||||
ALC287_FIXUP_THINKPAD_I2S_SPK,
|
||||
};
|
||||
|
||||
/* A special fixup for Lenovo C940 and Yoga Duet 7;
|
||||
@ -9413,6 +9435,10 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||
.chained = true,
|
||||
.chain_id = ALC245_FIXUP_HP_GPIO_LED
|
||||
},
|
||||
[ALC287_FIXUP_THINKPAD_I2S_SPK] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc287_fixup_bind_dacs,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
@ -10544,6 +10570,10 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
|
||||
{0x17, 0x90170111},
|
||||
{0x19, 0x03a11030},
|
||||
{0x21, 0x03211020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC287_FIXUP_THINKPAD_I2S_SPK,
|
||||
{0x17, 0x90170110},
|
||||
{0x19, 0x03a11030},
|
||||
{0x21, 0x03211020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
|
||||
{0x12, 0x90a60130},
|
||||
{0x17, 0x90170110},
|
||||
|
@ -173,16 +173,6 @@ static int tasdevice_get_profile_id(struct snd_kcontrol *kcontrol,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tasdevice_hda_clamp(int val, int max)
|
||||
{
|
||||
if (val > max)
|
||||
val = max;
|
||||
|
||||
if (val < 0)
|
||||
val = 0;
|
||||
return val;
|
||||
}
|
||||
|
||||
static int tasdevice_set_profile_id(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
@ -191,7 +181,7 @@ static int tasdevice_set_profile_id(struct snd_kcontrol *kcontrol,
|
||||
int max = tas_priv->rcabin.ncfgs - 1;
|
||||
int val, ret = 0;
|
||||
|
||||
val = tasdevice_hda_clamp(nr_profile, max);
|
||||
val = clamp(nr_profile, 0, max);
|
||||
|
||||
if (tas_priv->rcabin.profile_cfg_id != val) {
|
||||
tas_priv->rcabin.profile_cfg_id = val;
|
||||
@ -248,7 +238,7 @@ static int tasdevice_program_put(struct snd_kcontrol *kcontrol,
|
||||
int max = tas_fw->nr_programs - 1;
|
||||
int val, ret = 0;
|
||||
|
||||
val = tasdevice_hda_clamp(nr_program, max);
|
||||
val = clamp(nr_program, 0, max);
|
||||
|
||||
if (tas_priv->cur_prog != val) {
|
||||
tas_priv->cur_prog = val;
|
||||
@ -277,7 +267,7 @@ static int tasdevice_config_put(struct snd_kcontrol *kcontrol,
|
||||
int max = tas_fw->nr_configurations - 1;
|
||||
int val, ret = 0;
|
||||
|
||||
val = tasdevice_hda_clamp(nr_config, max);
|
||||
val = clamp(nr_config, 0, max);
|
||||
|
||||
if (tas_priv->cur_conf != val) {
|
||||
tas_priv->cur_conf = val;
|
||||
|
@ -213,6 +213,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21J6"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "82TL"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
@ -325,6 +332,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "8A22"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "HP"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "8A3E"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
|
@ -954,7 +954,7 @@ static int mchp_pdmc_dt_init(struct mchp_pdmc *dd)
|
||||
/* used to clean the channel index found on RHR's MSB */
|
||||
static int mchp_pdmc_process(struct snd_pcm_substream *substream,
|
||||
int channel, unsigned long hwoff,
|
||||
struct iov_iter *buf, unsigned long bytes)
|
||||
unsigned long bytes)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
u8 *dma_ptr = runtime->dma_area + hwoff +
|
||||
|
@ -1968,11 +1968,15 @@ config SND_SOC_UDA1380
|
||||
tristate
|
||||
depends on I2C
|
||||
|
||||
config SND_SOC_WCD_CLASSH
|
||||
tristate
|
||||
|
||||
config SND_SOC_WCD9335
|
||||
tristate "WCD9335 Codec"
|
||||
depends on SLIMBUS
|
||||
select REGMAP_SLIMBUS
|
||||
select REGMAP_IRQ
|
||||
select SND_SOC_WCD_CLASSH
|
||||
help
|
||||
The WCD9335 is a standalone Hi-Fi audio CODEC IC, supports
|
||||
Qualcomm Technologies, Inc. (QTI) multimedia solutions,
|
||||
@ -1987,6 +1991,7 @@ config SND_SOC_WCD934X
|
||||
depends on SLIMBUS
|
||||
select REGMAP_IRQ
|
||||
select REGMAP_SLIMBUS
|
||||
select SND_SOC_WCD_CLASSH
|
||||
select SND_SOC_WCD_MBHC
|
||||
depends on MFD_WCD934X || COMPILE_TEST
|
||||
help
|
||||
@ -1997,6 +2002,7 @@ config SND_SOC_WCD938X
|
||||
depends on SND_SOC_WCD938X_SDW
|
||||
tristate
|
||||
depends on SOUNDWIRE || !SOUNDWIRE
|
||||
select SND_SOC_WCD_CLASSH
|
||||
|
||||
config SND_SOC_WCD938X_SDW
|
||||
tristate "WCD9380/WCD9385 Codec - SDW"
|
||||
|
@ -303,10 +303,11 @@ snd-soc-twl4030-objs := twl4030.o
|
||||
snd-soc-twl6040-objs := twl6040.o
|
||||
snd-soc-uda1334-objs := uda1334.o
|
||||
snd-soc-uda1380-objs := uda1380.o
|
||||
snd-soc-wcd-classh-objs := wcd-clsh-v2.o
|
||||
snd-soc-wcd-mbhc-objs := wcd-mbhc-v2.o
|
||||
snd-soc-wcd9335-objs := wcd-clsh-v2.o wcd9335.o
|
||||
snd-soc-wcd934x-objs := wcd-clsh-v2.o wcd934x.o
|
||||
snd-soc-wcd938x-objs := wcd938x.o wcd-clsh-v2.o
|
||||
snd-soc-wcd9335-objs := wcd9335.o
|
||||
snd-soc-wcd934x-objs := wcd934x.o
|
||||
snd-soc-wcd938x-objs := wcd938x.o
|
||||
snd-soc-wcd938x-sdw-objs := wcd938x-sdw.o
|
||||
snd-soc-wl1273-objs := wl1273.o
|
||||
snd-soc-wm-adsp-objs := wm_adsp.o
|
||||
@ -685,6 +686,7 @@ obj-$(CONFIG_SND_SOC_TWL4030) += snd-soc-twl4030.o
|
||||
obj-$(CONFIG_SND_SOC_TWL6040) += snd-soc-twl6040.o
|
||||
obj-$(CONFIG_SND_SOC_UDA1334) += snd-soc-uda1334.o
|
||||
obj-$(CONFIG_SND_SOC_UDA1380) += snd-soc-uda1380.o
|
||||
obj-$(CONFIG_SND_SOC_WCD_CLASSH) += snd-soc-wcd-classh.o
|
||||
obj-$(CONFIG_SND_SOC_WCD_MBHC) += snd-soc-wcd-mbhc.o
|
||||
obj-$(CONFIG_SND_SOC_WCD9335) += snd-soc-wcd9335.o
|
||||
obj-$(CONFIG_SND_SOC_WCD934X) += snd-soc-wcd934x.o
|
||||
|
@ -279,7 +279,7 @@ static const struct snd_kcontrol_new cs35l45_dsp_muxes[] = {
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new cs35l45_dac_muxes[] = {
|
||||
SOC_DAPM_ENUM("DACPCM1 Source", cs35l45_dacpcm_enums[0]),
|
||||
SOC_DAPM_ENUM("DACPCM Source", cs35l45_dacpcm_enums[0]),
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_widget cs35l45_dapm_widgets[] = {
|
||||
@ -333,7 +333,7 @@ static const struct snd_soc_dapm_widget cs35l45_dapm_widgets[] = {
|
||||
SND_SOC_DAPM_MUX("DSP_RX7 Source", SND_SOC_NOPM, 0, 0, &cs35l45_dsp_muxes[6]),
|
||||
SND_SOC_DAPM_MUX("DSP_RX8 Source", SND_SOC_NOPM, 0, 0, &cs35l45_dsp_muxes[7]),
|
||||
|
||||
SND_SOC_DAPM_MUX("DACPCM1 Source", SND_SOC_NOPM, 0, 0, &cs35l45_dac_muxes[0]),
|
||||
SND_SOC_DAPM_MUX("DACPCM Source", SND_SOC_NOPM, 0, 0, &cs35l45_dac_muxes[0]),
|
||||
|
||||
SND_SOC_DAPM_OUT_DRV("AMP", SND_SOC_NOPM, 0, 0, NULL, 0),
|
||||
|
||||
@ -403,7 +403,7 @@ static const struct snd_soc_dapm_route cs35l45_dapm_routes[] = {
|
||||
{ "ASP_RX1", NULL, "ASP_EN" },
|
||||
{ "ASP_RX2", NULL, "ASP_EN" },
|
||||
|
||||
{ "AMP", NULL, "DACPCM1 Source"},
|
||||
{ "AMP", NULL, "DACPCM Source"},
|
||||
{ "AMP", NULL, "GLOBAL_EN"},
|
||||
|
||||
CS35L45_DSP_MUX_ROUTE("DSP_RX1"),
|
||||
@ -427,7 +427,7 @@ static const struct snd_soc_dapm_route cs35l45_dapm_routes[] = {
|
||||
{"DSP1 Preload", NULL, "DSP1 Preloader"},
|
||||
{"DSP1", NULL, "DSP1 Preloader"},
|
||||
|
||||
CS35L45_DAC_MUX_ROUTE("DACPCM1"),
|
||||
CS35L45_DAC_MUX_ROUTE("DACPCM"),
|
||||
|
||||
{ "SPK", NULL, "AMP"},
|
||||
};
|
||||
@ -969,7 +969,7 @@ static irqreturn_t cs35l45_dsp_virt2_mbox_cb(int irq, void *data)
|
||||
|
||||
ret = regmap_read(cs35l45->regmap, CS35L45_DSP_VIRT2_MBOX_3, &mbox_val);
|
||||
if (!ret && mbox_val)
|
||||
ret = cs35l45_dsp_virt2_mbox3_irq_handle(cs35l45, mbox_val & CS35L45_MBOX3_CMD_MASK,
|
||||
cs35l45_dsp_virt2_mbox3_irq_handle(cs35l45, mbox_val & CS35L45_MBOX3_CMD_MASK,
|
||||
(mbox_val & CS35L45_MBOX3_DATA_MASK) >> CS35L45_MBOX3_DATA_SHIFT);
|
||||
|
||||
/* Handle DSP trace log IRQ */
|
||||
@ -1078,6 +1078,7 @@ static int cs35l45_initialize(struct cs35l45_private *cs35l45)
|
||||
|
||||
switch (dev_id[0]) {
|
||||
case 0x35A450:
|
||||
case 0x35A460:
|
||||
break;
|
||||
default:
|
||||
dev_err(cs35l45->dev, "Bad DEVID 0x%x\n", dev_id[0]);
|
||||
|
@ -243,26 +243,27 @@ int cs35l56_wait_for_firmware_boot(struct cs35l56_base *cs35l56_base)
|
||||
{
|
||||
unsigned int reg;
|
||||
unsigned int val;
|
||||
int ret;
|
||||
int read_ret, poll_ret;
|
||||
|
||||
if (cs35l56_base->rev < CS35L56_REVID_B0)
|
||||
reg = CS35L56_DSP1_HALO_STATE_A1;
|
||||
else
|
||||
reg = CS35L56_DSP1_HALO_STATE;
|
||||
|
||||
ret = regmap_read_poll_timeout(cs35l56_base->regmap, reg,
|
||||
val,
|
||||
(val < 0xFFFF) && (val >= CS35L56_HALO_STATE_BOOT_DONE),
|
||||
CS35L56_HALO_STATE_POLL_US,
|
||||
CS35L56_HALO_STATE_TIMEOUT_US);
|
||||
/*
|
||||
* This can't be a regmap_read_poll_timeout() because cs35l56 will NAK
|
||||
* I2C until it has booted which would terminate the poll
|
||||
*/
|
||||
poll_ret = read_poll_timeout(regmap_read, read_ret,
|
||||
(val < 0xFFFF) && (val >= CS35L56_HALO_STATE_BOOT_DONE),
|
||||
CS35L56_HALO_STATE_POLL_US,
|
||||
CS35L56_HALO_STATE_TIMEOUT_US,
|
||||
false,
|
||||
cs35l56_base->regmap, reg, &val);
|
||||
|
||||
if ((ret < 0) && (ret != -ETIMEDOUT)) {
|
||||
dev_err(cs35l56_base->dev, "Failed to read HALO_STATE: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if ((ret == -ETIMEDOUT) || (val != CS35L56_HALO_STATE_BOOT_DONE)) {
|
||||
dev_err(cs35l56_base->dev, "Firmware boot fail: HALO_STATE=%#x\n", val);
|
||||
if (poll_ret) {
|
||||
dev_err(cs35l56_base->dev, "Firmware boot timed out(%d): HALO_STATE=%#x\n",
|
||||
read_ret, val);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
@ -2205,7 +2205,8 @@ static int cs42l43_codec_probe(struct platform_device *pdev)
|
||||
// Don't use devm as we need to get against the MFD device
|
||||
priv->mclk = clk_get_optional(cs42l43->dev, "mclk");
|
||||
if (IS_ERR(priv->mclk)) {
|
||||
dev_err_probe(priv->dev, PTR_ERR(priv->mclk), "Failed to get mclk\n");
|
||||
ret = PTR_ERR(priv->mclk);
|
||||
dev_err_probe(priv->dev, ret, "Failed to get mclk\n");
|
||||
goto err_pm;
|
||||
}
|
||||
|
||||
|
@ -3269,13 +3269,17 @@ static int rt5645_component_set_jack(struct snd_soc_component *component,
|
||||
{
|
||||
struct snd_soc_jack *mic_jack = NULL;
|
||||
struct snd_soc_jack *btn_jack = NULL;
|
||||
int *type = (int *)data;
|
||||
int type;
|
||||
|
||||
if (*type & SND_JACK_MICROPHONE)
|
||||
mic_jack = hs_jack;
|
||||
if (*type & (SND_JACK_BTN_0 | SND_JACK_BTN_1 |
|
||||
SND_JACK_BTN_2 | SND_JACK_BTN_3))
|
||||
btn_jack = hs_jack;
|
||||
if (hs_jack) {
|
||||
type = *(int *)data;
|
||||
|
||||
if (type & SND_JACK_MICROPHONE)
|
||||
mic_jack = hs_jack;
|
||||
if (type & (SND_JACK_BTN_0 | SND_JACK_BTN_1 |
|
||||
SND_JACK_BTN_2 | SND_JACK_BTN_3))
|
||||
btn_jack = hs_jack;
|
||||
}
|
||||
|
||||
return rt5645_set_jack_detect(component, hs_jack, mic_jack, btn_jack);
|
||||
}
|
||||
|
@ -355,6 +355,7 @@ void wcd_clsh_set_hph_mode(struct wcd_clsh_ctrl *ctrl, int mode)
|
||||
wcd_clsh_v2_set_hph_mode(comp, mode);
|
||||
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wcd_clsh_set_hph_mode);
|
||||
|
||||
static void wcd_clsh_set_flyback_current(struct snd_soc_component *comp,
|
||||
int mode)
|
||||
@ -869,11 +870,13 @@ int wcd_clsh_ctrl_set_state(struct wcd_clsh_ctrl *ctrl,
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wcd_clsh_ctrl_set_state);
|
||||
|
||||
int wcd_clsh_ctrl_get_state(struct wcd_clsh_ctrl *ctrl)
|
||||
{
|
||||
return ctrl->state;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wcd_clsh_ctrl_get_state);
|
||||
|
||||
struct wcd_clsh_ctrl *wcd_clsh_ctrl_alloc(struct snd_soc_component *comp,
|
||||
int version)
|
||||
@ -890,8 +893,13 @@ struct wcd_clsh_ctrl *wcd_clsh_ctrl_alloc(struct snd_soc_component *comp,
|
||||
|
||||
return ctrl;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wcd_clsh_ctrl_alloc);
|
||||
|
||||
void wcd_clsh_ctrl_free(struct wcd_clsh_ctrl *ctrl)
|
||||
{
|
||||
kfree(ctrl);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wcd_clsh_ctrl_free);
|
||||
|
||||
MODULE_DESCRIPTION("WCD93XX Class-H driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -796,6 +796,28 @@ static int avs_component_probe(struct snd_soc_component *component)
|
||||
|
||||
ret = avs_load_topology(component, filename);
|
||||
kfree(filename);
|
||||
if (ret == -ENOENT && !strncmp(mach->tplg_filename, "hda-", 4)) {
|
||||
unsigned int vendor_id;
|
||||
|
||||
if (sscanf(mach->tplg_filename, "hda-%08x-tplg.bin", &vendor_id) != 1)
|
||||
return ret;
|
||||
|
||||
if (((vendor_id >> 16) & 0xFFFF) == 0x8086)
|
||||
mach->tplg_filename = devm_kasprintf(adev->dev, GFP_KERNEL,
|
||||
"hda-8086-generic-tplg.bin");
|
||||
else
|
||||
mach->tplg_filename = devm_kasprintf(adev->dev, GFP_KERNEL,
|
||||
"hda-generic-tplg.bin");
|
||||
|
||||
filename = kasprintf(GFP_KERNEL, "%s/%s", component->driver->topology_name_prefix,
|
||||
mach->tplg_filename);
|
||||
if (!filename)
|
||||
return -ENOMEM;
|
||||
|
||||
dev_info(card->dev, "trying to load fallback topology %s\n", mach->tplg_filename);
|
||||
ret = avs_load_topology(component, filename);
|
||||
kfree(filename);
|
||||
}
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
@ -1054,7 +1054,7 @@ int snd_soc_pcm_component_sync_stop(struct snd_pcm_substream *substream)
|
||||
|
||||
int snd_soc_pcm_component_copy(struct snd_pcm_substream *substream,
|
||||
int channel, unsigned long pos,
|
||||
struct iov_iter *buf, unsigned long bytes)
|
||||
struct iov_iter *iter, unsigned long bytes)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_component *component;
|
||||
@ -1065,7 +1065,7 @@ int snd_soc_pcm_component_copy(struct snd_pcm_substream *substream,
|
||||
if (component->driver->copy)
|
||||
return soc_component_ret(component,
|
||||
component->driver->copy(component, substream,
|
||||
channel, pos, buf, bytes));
|
||||
channel, pos, iter, bytes));
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -290,29 +290,29 @@ static snd_pcm_uframes_t dmaengine_pcm_pointer(
|
||||
static int dmaengine_copy(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream,
|
||||
int channel, unsigned long hwoff,
|
||||
struct iov_iter *buf, unsigned long bytes)
|
||||
struct iov_iter *iter, unsigned long bytes)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct dmaengine_pcm *pcm = soc_component_to_pcm(component);
|
||||
int (*process)(struct snd_pcm_substream *substream,
|
||||
int channel, unsigned long hwoff,
|
||||
struct iov_iter *buf, unsigned long bytes) = pcm->config->process;
|
||||
unsigned long bytes) = pcm->config->process;
|
||||
bool is_playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
|
||||
void *dma_ptr = runtime->dma_area + hwoff +
|
||||
channel * (runtime->dma_bytes / runtime->channels);
|
||||
|
||||
if (is_playback)
|
||||
if (copy_from_iter(dma_ptr, bytes, buf) != bytes)
|
||||
if (copy_from_iter(dma_ptr, bytes, iter) != bytes)
|
||||
return -EFAULT;
|
||||
|
||||
if (process) {
|
||||
int ret = process(substream, channel, hwoff, buf, bytes);
|
||||
int ret = process(substream, channel, hwoff, bytes);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (!is_playback)
|
||||
if (copy_to_iter(dma_ptr, bytes, buf) != bytes)
|
||||
if (copy_to_iter(dma_ptr, bytes, iter) != bytes)
|
||||
return -EFAULT;
|
||||
|
||||
return 0;
|
||||
|
@ -1246,7 +1246,7 @@ static const struct snd_soc_dai_ops stm32_sai_pcm_dai_ops2 = {
|
||||
|
||||
static int stm32_sai_pcm_process_spdif(struct snd_pcm_substream *substream,
|
||||
int channel, unsigned long hwoff,
|
||||
struct iov_iter *buf, unsigned long bytes)
|
||||
unsigned long bytes)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
|
@ -265,7 +265,7 @@ static void free_midi_urbs(struct snd_usb_midi2_endpoint *ep)
|
||||
|
||||
if (!ep)
|
||||
return;
|
||||
for (i = 0; i < ep->num_urbs; ++i) {
|
||||
for (i = 0; i < NUM_URBS; ++i) {
|
||||
ctx = &ep->urbs[i];
|
||||
if (!ctx->urb)
|
||||
break;
|
||||
@ -279,6 +279,7 @@ static void free_midi_urbs(struct snd_usb_midi2_endpoint *ep)
|
||||
}
|
||||
|
||||
/* allocate URBs for an EP */
|
||||
/* the callers should handle allocation errors via free_midi_urbs() */
|
||||
static int alloc_midi_urbs(struct snd_usb_midi2_endpoint *ep)
|
||||
{
|
||||
struct snd_usb_midi2_urb *ctx;
|
||||
@ -351,8 +352,10 @@ static int snd_usb_midi_v2_open(struct snd_ump_endpoint *ump, int dir)
|
||||
return -EIO;
|
||||
if (ep->direction == STR_OUT) {
|
||||
err = alloc_midi_urbs(ep);
|
||||
if (err)
|
||||
if (err) {
|
||||
free_midi_urbs(ep);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user