mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 13:41:51 +00:00
sound fixes for 6.6-rc3
A large collection of fixes around this time. All small and mostly trivial fixes. - Lots of fixes for the new -Wformat-truncation warnings - A fix in ALSA rawmidi core regression and UMP handling - Series of Cirrus codec fixes - ASoC Intel and Realtek codec fixes - Usual HD- and USB-audio quirks and AMD ASoC quirks -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmUMUWkOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE+hdxAA0+tcf9xj7Na58P3VCD0dCBddoJ4STModW8RZ SnOevnjIMLa7TFKnxyBNWTgtBlKpaJ62c+/ZJJt0dgzDaYAX/6kGz9I9WN5w/81x JKbXemtbv32h/STmE36G3j2pILzKMVo8Iew4aghga5t7QkZZuSfj5KPiKpg0lIE4 LGfAoaPUFvsgHGqKKP4Y2qOeGkR7LWJ6r66mtC0WMb5LNddPrdsWbscj0ZfeEceE p3jQMk5Iw/d/8PueIdsVL0Epq8j46L+EKaNMgdG38eJsMxhhLnDoyZ4lRwIZ5Stg X+BTFULw7v/ldp/vBOoJgQYkjI9g51T7H1h58oZP1xup68eE1+QVw2D/Jpx+zDv8 TZrp3YLlWMN3YVZKxKpum0AALGELYA1eSax94sifxwMOQ2P7ctDgVUVKq2mxiPWN W+244dvoz1IB6ey22PRP7eSx015CHAtOosCPesSYs2M8OPsz0ckfxijz7PGcpqTD 7NFKAilG6lkMn638A4O1PG5l/DuMoIP8/W6JWeF83yCIxTvQVIcYdFxIku4rU8Lh LbyHU6nV9pH+B2RDjZpPQNVNZfp/egFlLsKGaIc9Wqjuur7vjryXRNs2y2Xq/0jq 0xJsV8xoPj4WO2u4+sFkYNMZ5AjTPUGndGURA3QMMjsDUnAxTw6e4a5yf06V9hZU ZaWVhRk= =1MuW -----END PGP SIGNATURE----- Merge tag 'sound-6.6-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "A large collection of fixes around this time. All small and mostly trivial fixes. - Lots of fixes for the new -Wformat-truncation warnings - A fix in ALSA rawmidi core regression and UMP handling - Series of Cirrus codec fixes - ASoC Intel and Realtek codec fixes - Usual HD- and USB-audio quirks and AMD ASoC quirks" * tag 'sound-6.6-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (64 commits) ALSA: hda/realtek - ALC287 Realtek I2S speaker platform support ALSA: hda: cs35l56: Use the new RUNTIME_PM_OPS() macro ALSA: usb-audio: scarlett_gen2: Fix another -Wformat-truncation warning ALSA: rawmidi: Fix NULL dereference at proc read ASoC: SOF: core: Only call sof_ops_free() on remove if the probe was successful ASoC: SOF: Intel: MTL: Reduce the DSP init timeout ASoC: cs42l43: Add shared IRQ flag for shutters ASoC: imx-audmix: Fix return error with devm_clk_get() ASoC: hdaudio.c: Add missing check for devm_kstrdup ALSA: riptide: Fix -Wformat-truncation warning for longname string ALSA: cs4231: Fix -Wformat-truncation warning for longname string ALSA: ad1848: Fix -Wformat-truncation warning for longname string ALSA: hda: generic: Check potential mixer name string truncation ALSA: cmipci: Fix -Wformat-truncation warning ALSA: firewire: Fix -Wformat-truncation warning for MIDI stream names ALSA: firewire: Fix -Wformat-truncation warning for longname string ALSA: xen: Fix -Wformat-truncation warning ALSA: opti9x: Fix -Wformat-truncation warning ALSA: es1688: Fix -Wformat-truncation warning ALSA: cs4236: Fix -Wformat-truncation warning ...
This commit is contained in:
commit
2af5acbaa7
@ -74,8 +74,8 @@ topology based on those information. When the device is older and
|
||||
doesn't respond to the new UMP inquiries, the driver falls back and
|
||||
builds the topology based on Group Terminal Block (GTB) information
|
||||
from the USB descriptor. Some device might be screwed up by the
|
||||
unexpected UMP command; in such a case, pass `midi2_probe=0` option to
|
||||
snd-usb-audio driver for skipping the UMP v1.1 inquiries.
|
||||
unexpected UMP command; in such a case, pass `midi2_ump_probe=0`
|
||||
option to snd-usb-audio driver for skipping the UMP v1.1 inquiries.
|
||||
|
||||
When the MIDI 2.0 device is probed, the kernel creates a rawmidi
|
||||
device for each UMP Endpoint of the device. Its device name is
|
||||
|
@ -1863,15 +1863,15 @@ static int cs_dsp_adsp2_setup_algs(struct cs_dsp *dsp)
|
||||
return PTR_ERR(adsp2_alg);
|
||||
|
||||
for (i = 0; i < n_algs; i++) {
|
||||
cs_dsp_info(dsp,
|
||||
"%d: ID %x v%d.%d.%d XM@%x YM@%x ZM@%x\n",
|
||||
i, be32_to_cpu(adsp2_alg[i].alg.id),
|
||||
(be32_to_cpu(adsp2_alg[i].alg.ver) & 0xff0000) >> 16,
|
||||
(be32_to_cpu(adsp2_alg[i].alg.ver) & 0xff00) >> 8,
|
||||
be32_to_cpu(adsp2_alg[i].alg.ver) & 0xff,
|
||||
be32_to_cpu(adsp2_alg[i].xm),
|
||||
be32_to_cpu(adsp2_alg[i].ym),
|
||||
be32_to_cpu(adsp2_alg[i].zm));
|
||||
cs_dsp_dbg(dsp,
|
||||
"%d: ID %x v%d.%d.%d XM@%x YM@%x ZM@%x\n",
|
||||
i, be32_to_cpu(adsp2_alg[i].alg.id),
|
||||
(be32_to_cpu(adsp2_alg[i].alg.ver) & 0xff0000) >> 16,
|
||||
(be32_to_cpu(adsp2_alg[i].alg.ver) & 0xff00) >> 8,
|
||||
be32_to_cpu(adsp2_alg[i].alg.ver) & 0xff,
|
||||
be32_to_cpu(adsp2_alg[i].xm),
|
||||
be32_to_cpu(adsp2_alg[i].ym),
|
||||
be32_to_cpu(adsp2_alg[i].zm));
|
||||
|
||||
alg_region = cs_dsp_create_region(dsp, WMFW_ADSP2_XM,
|
||||
adsp2_alg[i].alg.id,
|
||||
@ -1996,14 +1996,14 @@ static int cs_dsp_halo_setup_algs(struct cs_dsp *dsp)
|
||||
return PTR_ERR(halo_alg);
|
||||
|
||||
for (i = 0; i < n_algs; i++) {
|
||||
cs_dsp_info(dsp,
|
||||
"%d: ID %x v%d.%d.%d XM@%x YM@%x\n",
|
||||
i, be32_to_cpu(halo_alg[i].alg.id),
|
||||
(be32_to_cpu(halo_alg[i].alg.ver) & 0xff0000) >> 16,
|
||||
(be32_to_cpu(halo_alg[i].alg.ver) & 0xff00) >> 8,
|
||||
be32_to_cpu(halo_alg[i].alg.ver) & 0xff,
|
||||
be32_to_cpu(halo_alg[i].xm_base),
|
||||
be32_to_cpu(halo_alg[i].ym_base));
|
||||
cs_dsp_dbg(dsp,
|
||||
"%d: ID %x v%d.%d.%d XM@%x YM@%x\n",
|
||||
i, be32_to_cpu(halo_alg[i].alg.id),
|
||||
(be32_to_cpu(halo_alg[i].alg.ver) & 0xff0000) >> 16,
|
||||
(be32_to_cpu(halo_alg[i].alg.ver) & 0xff00) >> 8,
|
||||
be32_to_cpu(halo_alg[i].alg.ver) & 0xff,
|
||||
be32_to_cpu(halo_alg[i].xm_base),
|
||||
be32_to_cpu(halo_alg[i].ym_base));
|
||||
|
||||
ret = cs_dsp_halo_create_regions(dsp, halo_alg[i].alg.id,
|
||||
halo_alg[i].alg.ver,
|
||||
|
@ -278,9 +278,6 @@ static int snd_card_init(struct snd_card *card, struct device *parent,
|
||||
size_t extra_size)
|
||||
{
|
||||
int err;
|
||||
#ifdef CONFIG_SND_DEBUG
|
||||
char name[8];
|
||||
#endif
|
||||
|
||||
if (extra_size > 0)
|
||||
card->private_data = (char *)card + sizeof(struct snd_card);
|
||||
@ -364,8 +361,8 @@ static int snd_card_init(struct snd_card *card, struct device *parent,
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SND_DEBUG
|
||||
sprintf(name, "card%d", idx);
|
||||
card->debugfs_root = debugfs_create_dir(name, sound_debugfs_root);
|
||||
card->debugfs_root = debugfs_create_dir(dev_name(&card->card_dev),
|
||||
sound_debugfs_root);
|
||||
#endif
|
||||
return 0;
|
||||
|
||||
|
@ -1770,7 +1770,7 @@ static void snd_rawmidi_proc_info_read(struct snd_info_entry *entry,
|
||||
if (IS_ENABLED(CONFIG_SND_UMP))
|
||||
snd_iprintf(buffer, "Type: %s\n",
|
||||
rawmidi_is_ump(rmidi) ? "UMP" : "Legacy");
|
||||
if (rmidi->ops->proc_read)
|
||||
if (rmidi->ops && rmidi->ops->proc_read)
|
||||
rmidi->ops->proc_read(entry, buffer);
|
||||
mutex_lock(&rmidi->open_mutex);
|
||||
if (rmidi->info_flags & SNDRV_RAWMIDI_INFO_OUTPUT) {
|
||||
|
@ -349,9 +349,9 @@ snd_seq_midisynth_probe(struct device *_dev)
|
||||
if (! port->name[0]) {
|
||||
if (info->name[0]) {
|
||||
if (ports > 1)
|
||||
snprintf(port->name, sizeof(port->name), "%s-%u", info->name, p);
|
||||
scnprintf(port->name, sizeof(port->name), "%s-%u", info->name, p);
|
||||
else
|
||||
snprintf(port->name, sizeof(port->name), "%s", info->name);
|
||||
scnprintf(port->name, sizeof(port->name), "%s", info->name);
|
||||
} else {
|
||||
/* last resort */
|
||||
if (ports > 1)
|
||||
|
@ -207,7 +207,7 @@ static void fill_port_info(struct snd_seq_port_info *port,
|
||||
SNDRV_SEQ_PORT_TYPE_PORT;
|
||||
port->midi_channels = 16;
|
||||
if (*group->name)
|
||||
snprintf(port->name, sizeof(port->name), "Group %d (%s)",
|
||||
snprintf(port->name, sizeof(port->name), "Group %d (%.53s)",
|
||||
group->group + 1, group->name);
|
||||
else
|
||||
sprintf(port->name, "Group %d", group->group + 1);
|
||||
@ -416,6 +416,25 @@ static void setup_client_midi_version(struct seq_ump_client *client)
|
||||
snd_seq_kernel_client_put(cptr);
|
||||
}
|
||||
|
||||
/* set up client's group_filter bitmap */
|
||||
static void setup_client_group_filter(struct seq_ump_client *client)
|
||||
{
|
||||
struct snd_seq_client *cptr;
|
||||
unsigned int filter;
|
||||
int p;
|
||||
|
||||
cptr = snd_seq_kernel_client_get(client->seq_client);
|
||||
if (!cptr)
|
||||
return;
|
||||
filter = ~(1U << 0); /* always allow groupless messages */
|
||||
for (p = 0; p < SNDRV_UMP_MAX_GROUPS; p++) {
|
||||
if (client->groups[p].active)
|
||||
filter &= ~(1U << (p + 1));
|
||||
}
|
||||
cptr->group_filter = filter;
|
||||
snd_seq_kernel_client_put(cptr);
|
||||
}
|
||||
|
||||
/* UMP group change notification */
|
||||
static void handle_group_notify(struct work_struct *work)
|
||||
{
|
||||
@ -424,6 +443,7 @@ static void handle_group_notify(struct work_struct *work)
|
||||
|
||||
update_group_attrs(client);
|
||||
update_port_infos(client);
|
||||
setup_client_group_filter(client);
|
||||
}
|
||||
|
||||
/* UMP FB change notification */
|
||||
@ -492,6 +512,8 @@ static int snd_seq_ump_probe(struct device *_dev)
|
||||
goto error;
|
||||
}
|
||||
|
||||
setup_client_group_filter(client);
|
||||
|
||||
err = create_ump_endpoint_port(client);
|
||||
if (err < 0)
|
||||
goto error;
|
||||
|
@ -1197,6 +1197,8 @@ int snd_seq_deliver_to_ump(struct snd_seq_client *source,
|
||||
struct snd_seq_event *event,
|
||||
int atomic, int hop)
|
||||
{
|
||||
if (dest->group_filter & (1U << dest_port->ump_group))
|
||||
return 0; /* group filtered - skip the event */
|
||||
if (event->type == SNDRV_SEQ_EVENT_SYSEX)
|
||||
return cvt_sysex_to_ump(dest, dest_port, event, atomic, hop);
|
||||
else if (snd_seq_client_is_midi2(dest))
|
||||
|
@ -84,9 +84,9 @@ static void set_midi_substream_names(struct snd_bebob *bebob,
|
||||
struct snd_rawmidi_substream *subs;
|
||||
|
||||
list_for_each_entry(subs, &str->substreams, list) {
|
||||
snprintf(subs->name, sizeof(subs->name),
|
||||
"%s MIDI %d",
|
||||
bebob->card->shortname, subs->number + 1);
|
||||
scnprintf(subs->name, sizeof(subs->name),
|
||||
"%s MIDI %d",
|
||||
bebob->card->shortname, subs->number + 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -88,8 +88,8 @@ static void set_midi_substream_names(struct snd_dice *dice,
|
||||
struct snd_rawmidi_substream *subs;
|
||||
|
||||
list_for_each_entry(subs, &str->substreams, list) {
|
||||
snprintf(subs->name, sizeof(subs->name),
|
||||
"%s MIDI %d", dice->card->shortname, subs->number + 1);
|
||||
scnprintf(subs->name, sizeof(subs->name),
|
||||
"%s MIDI %d", dice->card->shortname, subs->number + 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -100,14 +100,14 @@ static void set_substream_names(struct snd_dg00x *dg00x,
|
||||
|
||||
list_for_each_entry(subs, &str->substreams, list) {
|
||||
if (!is_console) {
|
||||
snprintf(subs->name, sizeof(subs->name),
|
||||
"%s MIDI %d",
|
||||
dg00x->card->shortname,
|
||||
subs->number + 1);
|
||||
scnprintf(subs->name, sizeof(subs->name),
|
||||
"%s MIDI %d",
|
||||
dg00x->card->shortname,
|
||||
subs->number + 1);
|
||||
} else {
|
||||
snprintf(subs->name, sizeof(subs->name),
|
||||
"%s control",
|
||||
dg00x->card->shortname);
|
||||
scnprintf(subs->name, sizeof(subs->name),
|
||||
"%s control",
|
||||
dg00x->card->shortname);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -79,8 +79,8 @@ static void set_midi_substream_names(struct snd_rawmidi_str *stream,
|
||||
struct snd_rawmidi_substream *substream;
|
||||
|
||||
list_for_each_entry(substream, &stream->substreams, list) {
|
||||
snprintf(substream->name, sizeof(substream->name),
|
||||
"%s MIDI %d", name, substream->number + 1);
|
||||
scnprintf(substream->name, sizeof(substream->name),
|
||||
"%s MIDI %d", name, substream->number + 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -93,11 +93,11 @@ get_hardware_info(struct snd_efw *efw)
|
||||
strcpy(efw->card->driver, "Fireworks");
|
||||
strcpy(efw->card->shortname, hwinfo->model_name);
|
||||
strcpy(efw->card->mixername, hwinfo->model_name);
|
||||
snprintf(efw->card->longname, sizeof(efw->card->longname),
|
||||
"%s %s v%s, GUID %08x%08x at %s, S%d",
|
||||
hwinfo->vendor_name, hwinfo->model_name, version,
|
||||
hwinfo->guid_hi, hwinfo->guid_lo,
|
||||
dev_name(&efw->unit->device), 100 << fw_dev->max_speed);
|
||||
scnprintf(efw->card->longname, sizeof(efw->card->longname),
|
||||
"%s %s v%s, GUID %08x%08x at %s, S%d",
|
||||
hwinfo->vendor_name, hwinfo->model_name, version,
|
||||
hwinfo->guid_hi, hwinfo->guid_lo,
|
||||
dev_name(&efw->unit->device), 100 << fw_dev->max_speed);
|
||||
|
||||
if (hwinfo->flags & BIT(FLAG_RESP_ADDR_CHANGABLE))
|
||||
efw->resp_addr_changable = true;
|
||||
|
@ -84,8 +84,8 @@ static void set_midi_substream_names(struct snd_efw *efw,
|
||||
struct snd_rawmidi_substream *subs;
|
||||
|
||||
list_for_each_entry(subs, &str->substreams, list) {
|
||||
snprintf(subs->name, sizeof(subs->name),
|
||||
"%s MIDI %d", efw->card->shortname, subs->number + 1);
|
||||
scnprintf(subs->name, sizeof(subs->name),
|
||||
"%s MIDI %d", efw->card->shortname, subs->number + 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -88,8 +88,8 @@ static void set_midi_substream_names(struct snd_motu *motu,
|
||||
struct snd_rawmidi_substream *subs;
|
||||
|
||||
list_for_each_entry(subs, &str->substreams, list) {
|
||||
snprintf(subs->name, sizeof(subs->name),
|
||||
"%s MIDI %d", motu->card->shortname, subs->number + 1);
|
||||
scnprintf(subs->name, sizeof(subs->name),
|
||||
"%s MIDI %d", motu->card->shortname, subs->number + 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -129,9 +129,9 @@ static void set_midi_substream_names(struct snd_oxfw *oxfw,
|
||||
struct snd_rawmidi_substream *subs;
|
||||
|
||||
list_for_each_entry(subs, &str->substreams, list) {
|
||||
snprintf(subs->name, sizeof(subs->name),
|
||||
"%s MIDI %d",
|
||||
oxfw->card->shortname, subs->number + 1);
|
||||
scnprintf(subs->name, sizeof(subs->name),
|
||||
"%s MIDI %d",
|
||||
oxfw->card->shortname, subs->number + 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -108,11 +108,11 @@ static int name_card(struct snd_oxfw *oxfw, const struct ieee1394_device_id *ent
|
||||
strcpy(oxfw->card->mixername, m);
|
||||
strcpy(oxfw->card->shortname, m);
|
||||
|
||||
snprintf(oxfw->card->longname, sizeof(oxfw->card->longname),
|
||||
"%s %s (OXFW%x %04x), GUID %08x%08x at %s, S%d",
|
||||
v, m, firmware >> 20, firmware & 0xffff,
|
||||
fw_dev->config_rom[3], fw_dev->config_rom[4],
|
||||
dev_name(&oxfw->unit->device), 100 << fw_dev->max_speed);
|
||||
scnprintf(oxfw->card->longname, sizeof(oxfw->card->longname),
|
||||
"%s %s (OXFW%x %04x), GUID %08x%08x at %s, S%d",
|
||||
v, m, firmware >> 20, firmware & 0xffff,
|
||||
fw_dev->config_rom[3], fw_dev->config_rom[4],
|
||||
dev_name(&oxfw->unit->device), 100 << fw_dev->max_speed);
|
||||
end:
|
||||
return err;
|
||||
}
|
||||
|
@ -108,9 +108,9 @@ int snd_tscm_create_midi_devices(struct snd_tscm *tscm)
|
||||
/* TODO: support virtual MIDI ports. */
|
||||
if (subs->number < tscm->spec->midi_capture_ports) {
|
||||
/* Hardware MIDI ports. */
|
||||
snprintf(subs->name, sizeof(subs->name),
|
||||
"%s MIDI %d",
|
||||
tscm->card->shortname, subs->number + 1);
|
||||
scnprintf(subs->name, sizeof(subs->name),
|
||||
"%s MIDI %d",
|
||||
tscm->card->shortname, subs->number + 1);
|
||||
}
|
||||
}
|
||||
|
||||
@ -123,9 +123,9 @@ int snd_tscm_create_midi_devices(struct snd_tscm *tscm)
|
||||
list_for_each_entry(subs, &stream->substreams, list) {
|
||||
if (subs->number < tscm->spec->midi_playback_ports) {
|
||||
/* Hardware MIDI ports only. */
|
||||
snprintf(subs->name, sizeof(subs->name),
|
||||
"%s MIDI %d",
|
||||
tscm->card->shortname, subs->number + 1);
|
||||
scnprintf(subs->name, sizeof(subs->name),
|
||||
"%s MIDI %d",
|
||||
tscm->card->shortname, subs->number + 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -23,7 +23,7 @@ static int ctrl_link_mask;
|
||||
module_param_named(sdw_link_mask, ctrl_link_mask, int, 0444);
|
||||
MODULE_PARM_DESC(sdw_link_mask, "Intel link mask (one bit per link)");
|
||||
|
||||
static bool is_link_enabled(struct fwnode_handle *fw_node, int i)
|
||||
static bool is_link_enabled(struct fwnode_handle *fw_node, u8 idx)
|
||||
{
|
||||
struct fwnode_handle *link;
|
||||
char name[32];
|
||||
@ -31,7 +31,7 @@ static bool is_link_enabled(struct fwnode_handle *fw_node, int i)
|
||||
|
||||
/* Find master handle */
|
||||
snprintf(name, sizeof(name),
|
||||
"mipi-sdw-link-%d-subproperties", i);
|
||||
"mipi-sdw-link-%hhu-subproperties", idx);
|
||||
|
||||
link = fwnode_get_named_child_node(fw_node, name);
|
||||
if (!link)
|
||||
@ -51,8 +51,8 @@ static int
|
||||
sdw_intel_scan_controller(struct sdw_intel_acpi_info *info)
|
||||
{
|
||||
struct acpi_device *adev = acpi_fetch_acpi_dev(info->handle);
|
||||
int ret, i;
|
||||
u8 count;
|
||||
u8 count, i;
|
||||
int ret;
|
||||
|
||||
if (!adev)
|
||||
return -EINVAL;
|
||||
|
@ -96,13 +96,13 @@ static int snd_ad1848_probe(struct device *dev, unsigned int n)
|
||||
strscpy(card->shortname, chip->pcm->name, sizeof(card->shortname));
|
||||
|
||||
if (!thinkpad[n])
|
||||
snprintf(card->longname, sizeof(card->longname),
|
||||
"%s at 0x%lx, irq %d, dma %d",
|
||||
chip->pcm->name, chip->port, irq[n], dma1[n]);
|
||||
scnprintf(card->longname, sizeof(card->longname),
|
||||
"%s at 0x%lx, irq %d, dma %d",
|
||||
chip->pcm->name, chip->port, irq[n], dma1[n]);
|
||||
else
|
||||
snprintf(card->longname, sizeof(card->longname),
|
||||
"%s at 0x%lx, irq %d, dma %d [Thinkpad]",
|
||||
chip->pcm->name, chip->port, irq[n], dma1[n]);
|
||||
scnprintf(card->longname, sizeof(card->longname),
|
||||
"%s at 0x%lx, irq %d, dma %d [Thinkpad]",
|
||||
chip->pcm->name, chip->port, irq[n], dma1[n]);
|
||||
|
||||
error = snd_card_register(card);
|
||||
if (error < 0)
|
||||
|
@ -98,13 +98,13 @@ static int snd_cs4231_probe(struct device *dev, unsigned int n)
|
||||
strscpy(card->shortname, chip->pcm->name, sizeof(card->shortname));
|
||||
|
||||
if (dma2[n] < 0)
|
||||
snprintf(card->longname, sizeof(card->longname),
|
||||
"%s at 0x%lx, irq %d, dma %d",
|
||||
chip->pcm->name, chip->port, irq[n], dma1[n]);
|
||||
scnprintf(card->longname, sizeof(card->longname),
|
||||
"%s at 0x%lx, irq %d, dma %d",
|
||||
chip->pcm->name, chip->port, irq[n], dma1[n]);
|
||||
else
|
||||
snprintf(card->longname, sizeof(card->longname),
|
||||
"%s at 0x%lx, irq %d, dma %d&%d",
|
||||
chip->pcm->name, chip->port, irq[n], dma1[n], dma2[n]);
|
||||
scnprintf(card->longname, sizeof(card->longname),
|
||||
"%s at 0x%lx, irq %d, dma %d&%d",
|
||||
chip->pcm->name, chip->port, irq[n], dma1[n], dma2[n]);
|
||||
|
||||
error = snd_wss_mixer(chip);
|
||||
if (error < 0)
|
||||
|
@ -367,14 +367,14 @@ static int snd_cs423x_probe(struct snd_card *card, int dev)
|
||||
strscpy(card->driver, chip->pcm->name, sizeof(card->driver));
|
||||
strscpy(card->shortname, chip->pcm->name, sizeof(card->shortname));
|
||||
if (dma2[dev] < 0)
|
||||
snprintf(card->longname, sizeof(card->longname),
|
||||
"%s at 0x%lx, irq %i, dma %i",
|
||||
chip->pcm->name, chip->port, irq[dev], dma1[dev]);
|
||||
scnprintf(card->longname, sizeof(card->longname),
|
||||
"%s at 0x%lx, irq %i, dma %i",
|
||||
chip->pcm->name, chip->port, irq[dev], dma1[dev]);
|
||||
else
|
||||
snprintf(card->longname, sizeof(card->longname),
|
||||
"%s at 0x%lx, irq %i, dma %i&%d",
|
||||
chip->pcm->name, chip->port, irq[dev], dma1[dev],
|
||||
dma2[dev]);
|
||||
scnprintf(card->longname, sizeof(card->longname),
|
||||
"%s at 0x%lx, irq %i, dma %i&%d",
|
||||
chip->pcm->name, chip->port, irq[dev], dma1[dev],
|
||||
dma2[dev]);
|
||||
|
||||
err = snd_wss_timer(chip, 0);
|
||||
if (err < 0)
|
||||
|
@ -130,9 +130,9 @@ static int snd_es1688_probe(struct snd_card *card, unsigned int n)
|
||||
|
||||
strscpy(card->driver, "ES1688", sizeof(card->driver));
|
||||
strscpy(card->shortname, chip->pcm->name, sizeof(card->shortname));
|
||||
snprintf(card->longname, sizeof(card->longname),
|
||||
"%s at 0x%lx, irq %i, dma %i", chip->pcm->name, chip->port,
|
||||
chip->irq, chip->dma8);
|
||||
scnprintf(card->longname, sizeof(card->longname),
|
||||
"%s at 0x%lx, irq %i, dma %i", chip->pcm->name, chip->port,
|
||||
chip->irq, chip->dma8);
|
||||
|
||||
if (fm_port[n] == SNDRV_AUTO_PORT)
|
||||
fm_port[n] = port[n]; /* share the same port */
|
||||
|
@ -1344,10 +1344,10 @@ static int snd_miro_probe(struct snd_card *card)
|
||||
}
|
||||
|
||||
strcpy(card->driver, "miro");
|
||||
snprintf(card->longname, sizeof(card->longname),
|
||||
"%s: OPTi%s, %s at 0x%lx, irq %d, dma %d&%d",
|
||||
card->shortname, miro->name, codec->pcm->name,
|
||||
miro->wss_base + 4, miro->irq, miro->dma1, miro->dma2);
|
||||
scnprintf(card->longname, sizeof(card->longname),
|
||||
"%s: OPTi%s, %s at 0x%lx, irq %d, dma %d&%d",
|
||||
card->shortname, miro->name, codec->pcm->name,
|
||||
miro->wss_base + 4, miro->irq, miro->dma1, miro->dma2);
|
||||
|
||||
if (mpu_port <= 0 || mpu_port == SNDRV_AUTO_PORT)
|
||||
rmidi = NULL;
|
||||
|
@ -859,15 +859,15 @@ static int snd_opti9xx_probe(struct snd_card *card)
|
||||
strcpy(card->driver, chip->name);
|
||||
sprintf(card->shortname, "OPTi %s", card->driver);
|
||||
#if defined(CS4231) || defined(OPTi93X)
|
||||
snprintf(card->longname, sizeof(card->longname),
|
||||
"%s, %s at 0x%lx, irq %d, dma %d&%d",
|
||||
card->shortname, codec->pcm->name,
|
||||
chip->wss_base + 4, irq, dma1, xdma2);
|
||||
scnprintf(card->longname, sizeof(card->longname),
|
||||
"%s, %s at 0x%lx, irq %d, dma %d&%d",
|
||||
card->shortname, codec->pcm->name,
|
||||
chip->wss_base + 4, irq, dma1, xdma2);
|
||||
#else
|
||||
snprintf(card->longname, sizeof(card->longname),
|
||||
"%s, %s at 0x%lx, irq %d, dma %d",
|
||||
card->shortname, codec->pcm->name, chip->wss_base + 4, irq,
|
||||
dma1);
|
||||
scnprintf(card->longname, sizeof(card->longname),
|
||||
"%s, %s at 0x%lx, irq %d, dma %d",
|
||||
card->shortname, codec->pcm->name, chip->wss_base + 4, irq,
|
||||
dma1);
|
||||
#endif /* CS4231 || OPTi93X */
|
||||
|
||||
if (mpu_port <= 0 || mpu_port == SNDRV_AUTO_PORT)
|
||||
|
@ -557,7 +557,7 @@ static int sscape_upload_microcode(struct snd_card *card, int version)
|
||||
char name[14];
|
||||
int err;
|
||||
|
||||
snprintf(name, sizeof(name), "sndscape.co%d", version);
|
||||
scnprintf(name, sizeof(name), "sndscape.co%d", version);
|
||||
|
||||
err = request_firmware(&init_fw, name, card->dev);
|
||||
if (err < 0) {
|
||||
|
@ -3102,11 +3102,13 @@ static int snd_cmipci_create(struct snd_card *card, struct pci_dev *pci,
|
||||
}
|
||||
sprintf(card->shortname, "C-Media CMI%d", val);
|
||||
if (cm->chip_version < 68)
|
||||
sprintf(modelstr, " (model %d)", cm->chip_version);
|
||||
scnprintf(modelstr, sizeof(modelstr),
|
||||
" (model %d)", cm->chip_version);
|
||||
else
|
||||
modelstr[0] = '\0';
|
||||
sprintf(card->longname, "%s%s at %#lx, irq %i",
|
||||
card->shortname, modelstr, cm->iobase, cm->irq);
|
||||
scnprintf(card->longname, sizeof(card->longname),
|
||||
"%s%s at %#lx, irq %i",
|
||||
card->shortname, modelstr, cm->iobase, cm->irq);
|
||||
|
||||
if (cm->chip_version >= 39) {
|
||||
val = snd_cmipci_read_b(cm, CM_REG_MPU_PCI + 1);
|
||||
|
@ -105,7 +105,7 @@ static void cs35l56_hda_playback_hook(struct device *dev, int action)
|
||||
}
|
||||
}
|
||||
|
||||
static int __maybe_unused cs35l56_hda_runtime_suspend(struct device *dev)
|
||||
static int cs35l56_hda_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
|
||||
|
||||
@ -115,7 +115,7 @@ static int __maybe_unused cs35l56_hda_runtime_suspend(struct device *dev)
|
||||
return cs35l56_runtime_suspend_common(&cs35l56->base);
|
||||
}
|
||||
|
||||
static int __maybe_unused cs35l56_hda_runtime_resume(struct device *dev)
|
||||
static int cs35l56_hda_runtime_resume(struct device *dev)
|
||||
{
|
||||
struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
@ -218,7 +218,7 @@ static int cs35l56_hda_posture_get(struct snd_kcontrol *kcontrol,
|
||||
|
||||
ucontrol->value.integer.value[0] = pos;
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cs35l56_hda_posture_put(struct snd_kcontrol *kcontrol,
|
||||
@ -865,15 +865,13 @@ static int cs35l56_hda_read_acpi(struct cs35l56_hda *cs35l56, int id)
|
||||
sub = acpi_get_subsystem_id(ACPI_HANDLE(cs35l56->base.dev));
|
||||
|
||||
if (IS_ERR(sub)) {
|
||||
/* If no ACPI SUB, return 0 and fallback to legacy firmware path, otherwise fail */
|
||||
if (PTR_ERR(sub) == -ENODATA)
|
||||
return 0;
|
||||
else
|
||||
return PTR_ERR(sub);
|
||||
dev_info(cs35l56->base.dev,
|
||||
"Read ACPI _SUB failed(%ld): fallback to generic firmware\n",
|
||||
PTR_ERR(sub));
|
||||
} else {
|
||||
cs35l56->system_name = sub;
|
||||
}
|
||||
|
||||
cs35l56->system_name = sub;
|
||||
|
||||
cs35l56->base.reset_gpio = devm_gpiod_get_index_optional(cs35l56->base.dev,
|
||||
"reset",
|
||||
cs35l56->index,
|
||||
@ -1003,6 +1001,7 @@ void cs35l56_hda_remove(struct device *dev)
|
||||
{
|
||||
struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
|
||||
|
||||
pm_runtime_dont_use_autosuspend(cs35l56->base.dev);
|
||||
pm_runtime_get_sync(cs35l56->base.dev);
|
||||
pm_runtime_disable(cs35l56->base.dev);
|
||||
|
||||
@ -1016,7 +1015,7 @@ void cs35l56_hda_remove(struct device *dev)
|
||||
EXPORT_SYMBOL_NS_GPL(cs35l56_hda_remove, SND_HDA_SCODEC_CS35L56);
|
||||
|
||||
const struct dev_pm_ops cs35l56_hda_pm_ops = {
|
||||
SET_RUNTIME_PM_OPS(cs35l56_hda_runtime_suspend, cs35l56_hda_runtime_resume, NULL)
|
||||
RUNTIME_PM_OPS(cs35l56_hda_runtime_suspend, cs35l56_hda_runtime_resume, NULL)
|
||||
SYSTEM_SLEEP_PM_OPS(cs35l56_hda_system_suspend, cs35l56_hda_system_resume)
|
||||
LATE_SYSTEM_SLEEP_PM_OPS(cs35l56_hda_system_suspend_late,
|
||||
cs35l56_hda_system_resume_early)
|
||||
|
@ -21,7 +21,6 @@ static int cs35l56_hda_i2c_probe(struct i2c_client *clt)
|
||||
return -ENOMEM;
|
||||
|
||||
cs35l56->base.dev = &clt->dev;
|
||||
cs35l56->base.can_hibernate = true;
|
||||
cs35l56->base.regmap = devm_regmap_init_i2c(clt, &cs35l56_regmap_i2c);
|
||||
if (IS_ERR(cs35l56->base.regmap)) {
|
||||
ret = PTR_ERR(cs35l56->base.regmap);
|
||||
|
@ -998,7 +998,11 @@ static int add_control_with_pfx(struct hda_gen_spec *spec, int type,
|
||||
const char *sfx, int cidx, unsigned long val)
|
||||
{
|
||||
char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
|
||||
snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
|
||||
int len;
|
||||
|
||||
len = snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
|
||||
if (snd_BUG_ON(len >= sizeof(name)))
|
||||
return -EINVAL;
|
||||
if (!add_control(spec, type, name, cidx, val))
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
|
@ -2211,6 +2211,7 @@ static const struct snd_pci_quirk power_save_denylist[] = {
|
||||
SND_PCI_QUIRK(0x8086, 0x2068, "Intel NUC7i3BNB", 0),
|
||||
/* https://bugzilla.kernel.org/show_bug.cgi?id=198611 */
|
||||
SND_PCI_QUIRK(0x17aa, 0x2227, "Lenovo X1 Carbon 3rd Gen", 0),
|
||||
SND_PCI_QUIRK(0x17aa, 0x316e, "Lenovo ThinkCentre M70q", 0),
|
||||
/* https://bugzilla.redhat.com/show_bug.cgi?id=1689623 */
|
||||
SND_PCI_QUIRK(0x17aa, 0x367b, "Lenovo IdeaCentre B550", 0),
|
||||
/* https://bugzilla.redhat.com/show_bug.cgi?id=1572975 */
|
||||
|
@ -7073,8 +7073,10 @@ static void alc287_fixup_bind_dacs(struct hda_codec *codec,
|
||||
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 */
|
||||
if (spec->gen.autocfg.speaker_pins[0] != 0x14) {
|
||||
snd_hda_codec_write_cache(codec, 0x14, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
|
||||
0x0); /* Make sure 0x14 was disable */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -9812,7 +9814,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1043, 0x1d1f, "ASUS ROG Strix G17 2023 (G713PV)", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x1d42, "ASUS Zephyrus G14 2022", ALC289_FIXUP_ASUS_GA401),
|
||||
SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
|
||||
SND_PCI_QUIRK(0x1043, 0x1e02, "ASUS UX3402", ALC245_FIXUP_CS35L41_SPI_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x1e02, "ASUS UX3402ZA", ALC245_FIXUP_CS35L41_SPI_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS UX3402VA", ALC245_FIXUP_CS35L41_SPI_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
|
||||
SND_PCI_QUIRK(0x1043, 0x1e12, "ASUS UM3402", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x1e51, "ASUS Zephyrus M15", ALC294_FIXUP_ASUS_GU502_PINS),
|
||||
@ -10574,6 +10577,10 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
|
||||
{0x17, 0x90170110},
|
||||
{0x19, 0x03a11030},
|
||||
{0x21, 0x03211020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC287_FIXUP_THINKPAD_I2S_SPK,
|
||||
{0x17, 0x90170110}, /* 0x231f with RTK I2S AMP */
|
||||
{0x19, 0x04a11040},
|
||||
{0x21, 0x04211020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
|
||||
{0x12, 0x90a60130},
|
||||
{0x17, 0x90170110},
|
||||
|
@ -2105,15 +2105,15 @@ __snd_card_riptide_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
|
||||
strcpy(card->driver, "RIPTIDE");
|
||||
strcpy(card->shortname, "Riptide");
|
||||
#ifdef SUPPORT_JOYSTICK
|
||||
snprintf(card->longname, sizeof(card->longname),
|
||||
"%s at 0x%lx, irq %i mpu 0x%x opl3 0x%x gameport 0x%x",
|
||||
card->shortname, chip->port, chip->irq, chip->mpuaddr,
|
||||
chip->opladdr, chip->gameaddr);
|
||||
scnprintf(card->longname, sizeof(card->longname),
|
||||
"%s at 0x%lx, irq %i mpu 0x%x opl3 0x%x gameport 0x%x",
|
||||
card->shortname, chip->port, chip->irq, chip->mpuaddr,
|
||||
chip->opladdr, chip->gameaddr);
|
||||
#else
|
||||
snprintf(card->longname, sizeof(card->longname),
|
||||
"%s at 0x%lx, irq %i mpu 0x%x opl3 0x%x",
|
||||
card->shortname, chip->port, chip->irq, chip->mpuaddr,
|
||||
chip->opladdr);
|
||||
scnprintf(card->longname, sizeof(card->longname),
|
||||
"%s at 0x%lx, irq %i mpu 0x%x opl3 0x%x",
|
||||
card->shortname, chip->port, chip->irq, chip->mpuaddr,
|
||||
chip->opladdr);
|
||||
#endif
|
||||
snd_riptide_proc_init(chip);
|
||||
err = snd_card_register(card);
|
||||
|
@ -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, "82QF"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
@ -220,6 +227,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "82TL"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "82UG"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
@ -262,6 +276,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "M6500RC"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Micro-Star International Co., Ltd."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Bravo 15 B7ED"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
|
@ -452,11 +452,13 @@ static int aw_dev_parse_reg_bin_with_hdr(struct aw_device *aw_dev,
|
||||
if ((aw_bin->all_bin_parse_num != 1) ||
|
||||
(aw_bin->header_info[0].bin_data_type != DATA_TYPE_REGISTER)) {
|
||||
dev_err(aw_dev->dev, "bin num or type error");
|
||||
ret = -EINVAL;
|
||||
goto parse_bin_failed;
|
||||
}
|
||||
|
||||
if (aw_bin->header_info[0].valid_data_len % 4) {
|
||||
dev_err(aw_dev->dev, "bin data len get error!");
|
||||
ret = -EINVAL;
|
||||
goto parse_bin_failed;
|
||||
}
|
||||
|
||||
|
@ -27,7 +27,6 @@ static int cs35l56_i2c_probe(struct i2c_client *client)
|
||||
return -ENOMEM;
|
||||
|
||||
cs35l56->base.dev = dev;
|
||||
cs35l56->base.can_hibernate = true;
|
||||
|
||||
i2c_set_clientdata(client, cs35l56);
|
||||
cs35l56->base.regmap = devm_regmap_init_i2c(client, regmap_config);
|
||||
|
@ -1207,6 +1207,7 @@ void cs35l56_remove(struct cs35l56_private *cs35l56)
|
||||
flush_workqueue(cs35l56->dsp_wq);
|
||||
destroy_workqueue(cs35l56->dsp_wq);
|
||||
|
||||
pm_runtime_dont_use_autosuspend(cs35l56->base.dev);
|
||||
pm_runtime_suspend(cs35l56->base.dev);
|
||||
pm_runtime_disable(cs35l56->base.dev);
|
||||
|
||||
|
@ -344,6 +344,16 @@ static int cs42l42_sdw_update_status(struct sdw_slave *peripheral,
|
||||
switch (status) {
|
||||
case SDW_SLAVE_ATTACHED:
|
||||
dev_dbg(cs42l42->dev, "ATTACHED\n");
|
||||
|
||||
/*
|
||||
* The SoundWire core can report stale ATTACH notifications
|
||||
* if we hard-reset CS42L42 in probe() but it had already been
|
||||
* enumerated. Reject the ATTACH if we haven't yet seen an
|
||||
* UNATTACH report for the device being in reset.
|
||||
*/
|
||||
if (cs42l42->sdw_waiting_first_unattach)
|
||||
break;
|
||||
|
||||
/*
|
||||
* Initialise codec, this only needs to be done once.
|
||||
* When resuming from suspend, resume callback will handle re-init of codec,
|
||||
@ -354,6 +364,16 @@ static int cs42l42_sdw_update_status(struct sdw_slave *peripheral,
|
||||
break;
|
||||
case SDW_SLAVE_UNATTACHED:
|
||||
dev_dbg(cs42l42->dev, "UNATTACHED\n");
|
||||
|
||||
if (cs42l42->sdw_waiting_first_unattach) {
|
||||
/*
|
||||
* SoundWire core has seen that CS42L42 is not on
|
||||
* the bus so release RESET and wait for ATTACH.
|
||||
*/
|
||||
cs42l42->sdw_waiting_first_unattach = false;
|
||||
gpiod_set_value_cansleep(cs42l42->reset_gpio, 1);
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -2320,7 +2320,26 @@ int cs42l42_common_probe(struct cs42l42_private *cs42l42,
|
||||
|
||||
if (cs42l42->reset_gpio) {
|
||||
dev_dbg(cs42l42->dev, "Found reset GPIO\n");
|
||||
gpiod_set_value_cansleep(cs42l42->reset_gpio, 1);
|
||||
|
||||
/*
|
||||
* ACPI can override the default GPIO state we requested
|
||||
* so ensure that we start with RESET low.
|
||||
*/
|
||||
gpiod_set_value_cansleep(cs42l42->reset_gpio, 0);
|
||||
|
||||
/* Ensure minimum reset pulse width */
|
||||
usleep_range(10, 500);
|
||||
|
||||
/*
|
||||
* On SoundWire keep the chip in reset until we get an UNATTACH
|
||||
* notification from the SoundWire core. This acts as a
|
||||
* synchronization point to reject stale ATTACH notifications
|
||||
* if the chip was already enumerated before we reset it.
|
||||
*/
|
||||
if (cs42l42->sdw_peripheral)
|
||||
cs42l42->sdw_waiting_first_unattach = true;
|
||||
else
|
||||
gpiod_set_value_cansleep(cs42l42->reset_gpio, 1);
|
||||
}
|
||||
usleep_range(CS42L42_BOOT_TIME_US, CS42L42_BOOT_TIME_US * 2);
|
||||
|
||||
|
@ -53,6 +53,7 @@ struct cs42l42_private {
|
||||
u8 stream_use;
|
||||
bool hp_adc_up_pending;
|
||||
bool suspended;
|
||||
bool sdw_waiting_first_unattach;
|
||||
bool init_done;
|
||||
};
|
||||
|
||||
|
@ -2077,7 +2077,8 @@ static const struct cs42l43_irq cs42l43_irqs[] = {
|
||||
|
||||
static int cs42l43_request_irq(struct cs42l43_codec *priv,
|
||||
struct irq_domain *dom, const char * const name,
|
||||
unsigned int irq, irq_handler_t handler)
|
||||
unsigned int irq, irq_handler_t handler,
|
||||
unsigned long flags)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@ -2087,8 +2088,8 @@ static int cs42l43_request_irq(struct cs42l43_codec *priv,
|
||||
|
||||
dev_dbg(priv->dev, "Request IRQ %d for %s\n", ret, name);
|
||||
|
||||
ret = devm_request_threaded_irq(priv->dev, ret, NULL, handler, IRQF_ONESHOT,
|
||||
name, priv);
|
||||
ret = devm_request_threaded_irq(priv->dev, ret, NULL, handler,
|
||||
IRQF_ONESHOT | flags, name, priv);
|
||||
if (ret)
|
||||
return dev_err_probe(priv->dev, ret, "Failed to request IRQ %s\n", name);
|
||||
|
||||
@ -2124,11 +2125,11 @@ static int cs42l43_shutter_irq(struct cs42l43_codec *priv,
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = cs42l43_request_irq(priv, dom, close_name, close_irq, handler);
|
||||
ret = cs42l43_request_irq(priv, dom, close_name, close_irq, handler, IRQF_SHARED);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return cs42l43_request_irq(priv, dom, open_name, open_irq, handler);
|
||||
return cs42l43_request_irq(priv, dom, open_name, open_irq, handler, IRQF_SHARED);
|
||||
}
|
||||
|
||||
static int cs42l43_codec_probe(struct platform_device *pdev)
|
||||
@ -2178,7 +2179,8 @@ static int cs42l43_codec_probe(struct platform_device *pdev)
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(cs42l43_irqs); i++) {
|
||||
ret = cs42l43_request_irq(priv, dom, cs42l43_irqs[i].name,
|
||||
cs42l43_irqs[i].irq, cs42l43_irqs[i].handler);
|
||||
cs42l43_irqs[i].irq,
|
||||
cs42l43_irqs[i].handler, 0);
|
||||
if (ret)
|
||||
goto err_pm;
|
||||
}
|
||||
|
@ -2403,13 +2403,11 @@ static irqreturn_t rt5640_irq(int irq, void *data)
|
||||
struct rt5640_priv *rt5640 = data;
|
||||
int delay = 0;
|
||||
|
||||
if (rt5640->jd_src == RT5640_JD_SRC_HDA_HEADER) {
|
||||
cancel_delayed_work_sync(&rt5640->jack_work);
|
||||
if (rt5640->jd_src == RT5640_JD_SRC_HDA_HEADER)
|
||||
delay = 100;
|
||||
}
|
||||
|
||||
if (rt5640->jack)
|
||||
queue_delayed_work(system_long_wq, &rt5640->jack_work, delay);
|
||||
mod_delayed_work(system_long_wq, &rt5640->jack_work, delay);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@ -2565,10 +2563,9 @@ static void rt5640_enable_jack_detect(struct snd_soc_component *component,
|
||||
if (jack_data && jack_data->use_platform_clock)
|
||||
rt5640->use_platform_clock = jack_data->use_platform_clock;
|
||||
|
||||
ret = devm_request_threaded_irq(component->dev, rt5640->irq,
|
||||
NULL, rt5640_irq,
|
||||
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
|
||||
"rt5640", rt5640);
|
||||
ret = request_irq(rt5640->irq, rt5640_irq,
|
||||
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
|
||||
"rt5640", rt5640);
|
||||
if (ret) {
|
||||
dev_warn(component->dev, "Failed to request IRQ %d: %d\n", rt5640->irq, ret);
|
||||
rt5640_disable_jack_detect(component);
|
||||
@ -2621,14 +2618,14 @@ static void rt5640_enable_hda_jack_detect(
|
||||
|
||||
rt5640->jack = jack;
|
||||
|
||||
ret = devm_request_threaded_irq(component->dev, rt5640->irq,
|
||||
NULL, rt5640_irq, IRQF_TRIGGER_RISING | IRQF_ONESHOT,
|
||||
"rt5640", rt5640);
|
||||
ret = request_irq(rt5640->irq, rt5640_irq,
|
||||
IRQF_TRIGGER_RISING | IRQF_ONESHOT, "rt5640", rt5640);
|
||||
if (ret) {
|
||||
dev_warn(component->dev, "Failed to request IRQ %d: %d\n", rt5640->irq, ret);
|
||||
rt5640->irq = -ENXIO;
|
||||
rt5640->jack = NULL;
|
||||
return;
|
||||
}
|
||||
rt5640->irq_requested = true;
|
||||
|
||||
/* sync initial jack state */
|
||||
queue_delayed_work(system_long_wq, &rt5640->jack_work, 0);
|
||||
@ -2801,12 +2798,12 @@ static int rt5640_suspend(struct snd_soc_component *component)
|
||||
{
|
||||
struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
if (rt5640->irq) {
|
||||
if (rt5640->jack) {
|
||||
/* disable jack interrupts during system suspend */
|
||||
disable_irq(rt5640->irq);
|
||||
rt5640_cancel_work(rt5640);
|
||||
}
|
||||
|
||||
rt5640_cancel_work(rt5640);
|
||||
snd_soc_component_force_bias_level(component, SND_SOC_BIAS_OFF);
|
||||
rt5640_reset(component);
|
||||
regcache_cache_only(rt5640->regmap, true);
|
||||
@ -2829,9 +2826,6 @@ static int rt5640_resume(struct snd_soc_component *component)
|
||||
regcache_cache_only(rt5640->regmap, false);
|
||||
regcache_sync(rt5640->regmap);
|
||||
|
||||
if (rt5640->irq)
|
||||
enable_irq(rt5640->irq);
|
||||
|
||||
if (rt5640->jack) {
|
||||
if (rt5640->jd_src == RT5640_JD_SRC_HDA_HEADER) {
|
||||
snd_soc_component_update_bits(component,
|
||||
@ -2859,6 +2853,7 @@ static int rt5640_resume(struct snd_soc_component *component)
|
||||
}
|
||||
}
|
||||
|
||||
enable_irq(rt5640->irq);
|
||||
queue_delayed_work(system_long_wq, &rt5640->jack_work, 0);
|
||||
}
|
||||
|
||||
|
@ -1468,8 +1468,10 @@ static int wm8960_i2c_probe(struct i2c_client *i2c)
|
||||
}
|
||||
|
||||
wm8960->regmap = devm_regmap_init_i2c(i2c, &wm8960_regmap);
|
||||
if (IS_ERR(wm8960->regmap))
|
||||
return PTR_ERR(wm8960->regmap);
|
||||
if (IS_ERR(wm8960->regmap)) {
|
||||
ret = PTR_ERR(wm8960->regmap);
|
||||
goto bulk_disable;
|
||||
}
|
||||
|
||||
if (pdata)
|
||||
memcpy(&wm8960->pdata, pdata, sizeof(struct wm8960_data));
|
||||
@ -1479,13 +1481,14 @@ static int wm8960_i2c_probe(struct i2c_client *i2c)
|
||||
ret = i2c_master_recv(i2c, &val, sizeof(val));
|
||||
if (ret >= 0) {
|
||||
dev_err(&i2c->dev, "Not wm8960, wm8960 reg can not read by i2c\n");
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto bulk_disable;
|
||||
}
|
||||
|
||||
ret = wm8960_reset(wm8960->regmap);
|
||||
if (ret != 0) {
|
||||
dev_err(&i2c->dev, "Failed to issue reset\n");
|
||||
return ret;
|
||||
goto bulk_disable;
|
||||
}
|
||||
|
||||
if (wm8960->pdata.shared_lrclk) {
|
||||
@ -1494,7 +1497,7 @@ static int wm8960_i2c_probe(struct i2c_client *i2c)
|
||||
if (ret != 0) {
|
||||
dev_err(&i2c->dev, "Failed to enable LRCM: %d\n",
|
||||
ret);
|
||||
return ret;
|
||||
goto bulk_disable;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1528,7 +1531,13 @@ static int wm8960_i2c_probe(struct i2c_client *i2c)
|
||||
|
||||
ret = devm_snd_soc_register_component(&i2c->dev,
|
||||
&soc_component_dev_wm8960, &wm8960_dai, 1);
|
||||
if (ret)
|
||||
goto bulk_disable;
|
||||
|
||||
return 0;
|
||||
|
||||
bulk_disable:
|
||||
regulator_bulk_disable(ARRAY_SIZE(wm8960->supplies), wm8960->supplies);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -687,7 +687,10 @@ int wm_adsp_write_ctl(struct wm_adsp *dsp, const char *name, int type,
|
||||
struct wm_coeff_ctl *ctl;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&dsp->cs_dsp.pwr_lock);
|
||||
ret = cs_dsp_coeff_write_ctrl(cs_ctl, 0, buf, len);
|
||||
mutex_unlock(&dsp->cs_dsp.pwr_lock);
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@ -703,8 +706,14 @@ EXPORT_SYMBOL_GPL(wm_adsp_write_ctl);
|
||||
int wm_adsp_read_ctl(struct wm_adsp *dsp, const char *name, int type,
|
||||
unsigned int alg, void *buf, size_t len)
|
||||
{
|
||||
return cs_dsp_coeff_read_ctrl(cs_dsp_get_ctl(&dsp->cs_dsp, name, type, alg),
|
||||
0, buf, len);
|
||||
int ret;
|
||||
|
||||
mutex_lock(&dsp->cs_dsp.pwr_lock);
|
||||
ret = cs_dsp_coeff_read_ctrl(cs_dsp_get_ctl(&dsp->cs_dsp, name, type, alg),
|
||||
0, buf, len);
|
||||
mutex_unlock(&dsp->cs_dsp.pwr_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wm_adsp_read_ctl);
|
||||
|
||||
|
@ -315,7 +315,7 @@ static int imx_audmix_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(priv->cpu_mclk)) {
|
||||
ret = PTR_ERR(priv->cpu_mclk);
|
||||
dev_err(&cpu_pdev->dev, "failed to get DAI mclk1: %d\n", ret);
|
||||
return -EINVAL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
priv->audmix_pdev = audmix_pdev;
|
||||
|
@ -19,6 +19,7 @@
|
||||
static struct snd_pcm_hardware imx_rpmsg_pcm_hardware = {
|
||||
.info = SNDRV_PCM_INFO_INTERLEAVED |
|
||||
SNDRV_PCM_INFO_BLOCK_TRANSFER |
|
||||
SNDRV_PCM_INFO_BATCH |
|
||||
SNDRV_PCM_INFO_MMAP |
|
||||
SNDRV_PCM_INFO_MMAP_VALID |
|
||||
SNDRV_PCM_INFO_NO_PERIOD_WAKEUP |
|
||||
|
@ -89,6 +89,14 @@ static int imx_rpmsg_probe(struct platform_device *pdev)
|
||||
SND_SOC_DAIFMT_NB_NF |
|
||||
SND_SOC_DAIFMT_CBC_CFC;
|
||||
|
||||
/*
|
||||
* i.MX rpmsg sound cards work on codec slave mode. MCLK will be
|
||||
* disabled by CPU DAI driver in hw_free(). Some codec requires MCLK
|
||||
* present at power up/down sequence. So need to set ignore_pmdown_time
|
||||
* to power down codec immediately before MCLK is turned off.
|
||||
*/
|
||||
data->dai.ignore_pmdown_time = 1;
|
||||
|
||||
/* Optional codec node */
|
||||
ret = of_parse_phandle_with_fixed_args(np, "audio-codec", 0, 0, &args);
|
||||
if (ret) {
|
||||
|
@ -55,6 +55,9 @@ static int avs_create_dai_links(struct device *dev, struct hda_codec *codec, int
|
||||
return -ENOMEM;
|
||||
|
||||
dl[i].codecs->name = devm_kstrdup(dev, cname, GFP_KERNEL);
|
||||
if (!dl[i].codecs->name)
|
||||
return -ENOMEM;
|
||||
|
||||
dl[i].codecs->dai_name = pcm->name;
|
||||
dl[i].num_codecs = 1;
|
||||
dl[i].num_cpus = 1;
|
||||
|
@ -112,34 +112,6 @@ static int axg_spdifin_prepare(struct snd_pcm_substream *substream,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int axg_spdifin_startup(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *dai)
|
||||
{
|
||||
struct axg_spdifin *priv = snd_soc_dai_get_drvdata(dai);
|
||||
int ret;
|
||||
|
||||
ret = clk_prepare_enable(priv->refclk);
|
||||
if (ret) {
|
||||
dev_err(dai->dev,
|
||||
"failed to enable spdifin reference clock\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
regmap_update_bits(priv->map, SPDIFIN_CTRL0, SPDIFIN_CTRL0_EN,
|
||||
SPDIFIN_CTRL0_EN);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void axg_spdifin_shutdown(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *dai)
|
||||
{
|
||||
struct axg_spdifin *priv = snd_soc_dai_get_drvdata(dai);
|
||||
|
||||
regmap_update_bits(priv->map, SPDIFIN_CTRL0, SPDIFIN_CTRL0_EN, 0);
|
||||
clk_disable_unprepare(priv->refclk);
|
||||
}
|
||||
|
||||
static void axg_spdifin_write_mode_param(struct regmap *map, int mode,
|
||||
unsigned int val,
|
||||
unsigned int num_per_reg,
|
||||
@ -251,17 +223,32 @@ static int axg_spdifin_dai_probe(struct snd_soc_dai *dai)
|
||||
ret = axg_spdifin_sample_mode_config(dai, priv);
|
||||
if (ret) {
|
||||
dev_err(dai->dev, "mode configuration failed\n");
|
||||
clk_disable_unprepare(priv->pclk);
|
||||
return ret;
|
||||
goto pclk_err;
|
||||
}
|
||||
|
||||
ret = clk_prepare_enable(priv->refclk);
|
||||
if (ret) {
|
||||
dev_err(dai->dev,
|
||||
"failed to enable spdifin reference clock\n");
|
||||
goto pclk_err;
|
||||
}
|
||||
|
||||
regmap_update_bits(priv->map, SPDIFIN_CTRL0, SPDIFIN_CTRL0_EN,
|
||||
SPDIFIN_CTRL0_EN);
|
||||
|
||||
return 0;
|
||||
|
||||
pclk_err:
|
||||
clk_disable_unprepare(priv->pclk);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int axg_spdifin_dai_remove(struct snd_soc_dai *dai)
|
||||
{
|
||||
struct axg_spdifin *priv = snd_soc_dai_get_drvdata(dai);
|
||||
|
||||
regmap_update_bits(priv->map, SPDIFIN_CTRL0, SPDIFIN_CTRL0_EN, 0);
|
||||
clk_disable_unprepare(priv->refclk);
|
||||
clk_disable_unprepare(priv->pclk);
|
||||
return 0;
|
||||
}
|
||||
@ -270,8 +257,6 @@ static const struct snd_soc_dai_ops axg_spdifin_ops = {
|
||||
.probe = axg_spdifin_dai_probe,
|
||||
.remove = axg_spdifin_dai_remove,
|
||||
.prepare = axg_spdifin_prepare,
|
||||
.startup = axg_spdifin_startup,
|
||||
.shutdown = axg_spdifin_shutdown,
|
||||
};
|
||||
|
||||
static int axg_spdifin_iec958_info(struct snd_kcontrol *kcontrol,
|
||||
|
@ -1303,6 +1303,7 @@ audio_graph:
|
||||
if (i >= RSND_MAX_COMPONENT) {
|
||||
dev_info(dev, "reach to max component\n");
|
||||
of_node_put(node);
|
||||
of_node_put(ports);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -985,6 +985,7 @@ static int __soc_pcm_hw_params(struct snd_soc_pcm_runtime *rtd,
|
||||
{
|
||||
struct snd_soc_dai *cpu_dai;
|
||||
struct snd_soc_dai *codec_dai;
|
||||
struct snd_pcm_hw_params tmp_params;
|
||||
int i, ret = 0;
|
||||
|
||||
snd_soc_dpcm_mutex_assert_held(rtd);
|
||||
@ -998,7 +999,6 @@ static int __soc_pcm_hw_params(struct snd_soc_pcm_runtime *rtd,
|
||||
goto out;
|
||||
|
||||
for_each_rtd_codec_dais(rtd, i, codec_dai) {
|
||||
struct snd_pcm_hw_params codec_params;
|
||||
unsigned int tdm_mask = snd_soc_dai_tdm_mask_get(codec_dai, substream->stream);
|
||||
|
||||
/*
|
||||
@ -1019,23 +1019,22 @@ static int __soc_pcm_hw_params(struct snd_soc_pcm_runtime *rtd,
|
||||
continue;
|
||||
|
||||
/* copy params for each codec */
|
||||
codec_params = *params;
|
||||
tmp_params = *params;
|
||||
|
||||
/* fixup params based on TDM slot masks */
|
||||
if (tdm_mask)
|
||||
soc_pcm_codec_params_fixup(&codec_params, tdm_mask);
|
||||
soc_pcm_codec_params_fixup(&tmp_params, tdm_mask);
|
||||
|
||||
ret = snd_soc_dai_hw_params(codec_dai, substream,
|
||||
&codec_params);
|
||||
&tmp_params);
|
||||
if(ret < 0)
|
||||
goto out;
|
||||
|
||||
soc_pcm_set_dai_params(codec_dai, &codec_params);
|
||||
snd_soc_dapm_update_dai(substream, &codec_params, codec_dai);
|
||||
soc_pcm_set_dai_params(codec_dai, &tmp_params);
|
||||
snd_soc_dapm_update_dai(substream, &tmp_params, codec_dai);
|
||||
}
|
||||
|
||||
for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
|
||||
struct snd_pcm_hw_params cpu_params;
|
||||
unsigned int ch_mask = 0;
|
||||
int j;
|
||||
|
||||
@ -1047,7 +1046,7 @@ static int __soc_pcm_hw_params(struct snd_soc_pcm_runtime *rtd,
|
||||
continue;
|
||||
|
||||
/* copy params for each cpu */
|
||||
cpu_params = *params;
|
||||
tmp_params = *params;
|
||||
|
||||
if (!rtd->dai_link->codec_ch_maps)
|
||||
goto hw_params;
|
||||
@ -1062,16 +1061,16 @@ static int __soc_pcm_hw_params(struct snd_soc_pcm_runtime *rtd,
|
||||
|
||||
/* fixup cpu channel number */
|
||||
if (ch_mask)
|
||||
soc_pcm_codec_params_fixup(&cpu_params, ch_mask);
|
||||
soc_pcm_codec_params_fixup(&tmp_params, ch_mask);
|
||||
|
||||
hw_params:
|
||||
ret = snd_soc_dai_hw_params(cpu_dai, substream, &cpu_params);
|
||||
ret = snd_soc_dai_hw_params(cpu_dai, substream, &tmp_params);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
/* store the parameters for each DAI */
|
||||
soc_pcm_set_dai_params(cpu_dai, &cpu_params);
|
||||
snd_soc_dapm_update_dai(substream, &cpu_params, cpu_dai);
|
||||
soc_pcm_set_dai_params(cpu_dai, &tmp_params);
|
||||
snd_soc_dapm_update_dai(substream, &tmp_params, cpu_dai);
|
||||
}
|
||||
|
||||
ret = snd_soc_pcm_component_hw_params(substream, params);
|
||||
|
@ -217,6 +217,7 @@ int snd_soc_dai_is_dummy(struct snd_soc_dai *dai)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_dai_is_dummy);
|
||||
|
||||
int snd_soc_component_is_dummy(struct snd_soc_component *component)
|
||||
{
|
||||
|
@ -486,10 +486,9 @@ int snd_sof_device_remove(struct device *dev)
|
||||
snd_sof_ipc_free(sdev);
|
||||
snd_sof_free_debug(sdev);
|
||||
snd_sof_remove(sdev);
|
||||
sof_ops_free(sdev);
|
||||
}
|
||||
|
||||
sof_ops_free(sdev);
|
||||
|
||||
/* release firmware */
|
||||
snd_sof_fw_unload(sdev);
|
||||
|
||||
|
@ -460,7 +460,7 @@ int mtl_dsp_cl_init(struct snd_sof_dev *sdev, int stream_tag, bool imr_boot)
|
||||
/* step 3: wait for IPC DONE bit from ROM */
|
||||
ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR, chip->ipc_ack, status,
|
||||
((status & chip->ipc_ack_mask) == chip->ipc_ack_mask),
|
||||
HDA_DSP_REG_POLL_INTERVAL_US, MTL_DSP_PURGE_TIMEOUT_US);
|
||||
HDA_DSP_REG_POLL_INTERVAL_US, HDA_DSP_INIT_TIMEOUT_US);
|
||||
if (ret < 0) {
|
||||
if (hda->boot_iteration == HDA_FW_BOOT_ATTEMPTS)
|
||||
dev_err(sdev->dev, "timeout waiting for purge IPC done\n");
|
||||
|
@ -62,7 +62,6 @@
|
||||
#define MTL_DSP_IRQSTS_IPC BIT(0)
|
||||
#define MTL_DSP_IRQSTS_SDW BIT(6)
|
||||
|
||||
#define MTL_DSP_PURGE_TIMEOUT_US 20000000 /* 20s */
|
||||
#define MTL_DSP_REG_POLL_INTERVAL_US 10 /* 10 us */
|
||||
|
||||
/* Memory windows */
|
||||
|
@ -231,7 +231,7 @@ static int sof_ipc4_get_audio_fmt(struct snd_soc_component *scomp,
|
||||
|
||||
ret = sof_update_ipc_object(scomp, available_fmt,
|
||||
SOF_AUDIO_FMT_NUM_TOKENS, swidget->tuples,
|
||||
swidget->num_tuples, sizeof(available_fmt), 1);
|
||||
swidget->num_tuples, sizeof(*available_fmt), 1);
|
||||
if (ret) {
|
||||
dev_err(scomp->dev, "Failed to parse audio format token count\n");
|
||||
return ret;
|
||||
|
@ -212,7 +212,8 @@ widget_free:
|
||||
sof_widget_free_unlocked(sdev, swidget);
|
||||
use_count_decremented = true;
|
||||
core_put:
|
||||
snd_sof_dsp_core_put(sdev, swidget->core);
|
||||
if (!use_count_decremented)
|
||||
snd_sof_dsp_core_put(sdev, swidget->core);
|
||||
pipe_widget_free:
|
||||
if (swidget->id != snd_soc_dapm_scheduler)
|
||||
sof_widget_free_unlocked(sdev, swidget->spipe->pipe_widget);
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <sound/graph_card.h>
|
||||
#include <sound/pcm_params.h>
|
||||
#include <sound/soc-dai.h>
|
||||
|
||||
#define MAX_PLLA_OUT0_DIV 128
|
||||
|
||||
@ -44,6 +45,21 @@ struct tegra_audio_cdata {
|
||||
unsigned int plla_out0_rates[NUM_RATE_TYPE];
|
||||
};
|
||||
|
||||
static bool need_clk_update(struct snd_soc_dai *dai)
|
||||
{
|
||||
if (snd_soc_dai_is_dummy(dai) ||
|
||||
!dai->driver->ops ||
|
||||
!dai->driver->name)
|
||||
return false;
|
||||
|
||||
if (strstr(dai->driver->name, "I2S") ||
|
||||
strstr(dai->driver->name, "DMIC") ||
|
||||
strstr(dai->driver->name, "DSPK"))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Setup PLL clock as per the given sample rate */
|
||||
static int tegra_audio_graph_update_pll(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params)
|
||||
@ -140,19 +156,7 @@ static int tegra_audio_graph_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
|
||||
int err;
|
||||
|
||||
/*
|
||||
* This gets called for each DAI link (FE or BE) when DPCM is used.
|
||||
* We may not want to update PLLA rate for each call. So PLLA update
|
||||
* must be restricted to external I/O links (I2S, DMIC or DSPK) since
|
||||
* they actually depend on it. I/O modules update their clocks in
|
||||
* hw_param() of their respective component driver and PLLA rate
|
||||
* update here helps them to derive appropriate rates.
|
||||
*
|
||||
* TODO: When more HW accelerators get added (like sample rate
|
||||
* converter, volume gain controller etc., which don't really
|
||||
* depend on PLLA) we need a better way to filter here.
|
||||
*/
|
||||
if (cpu_dai->driver->ops && rtd->dai_link->no_pcm) {
|
||||
if (need_clk_update(cpu_dai)) {
|
||||
err = tegra_audio_graph_update_pll(substream, params);
|
||||
if (err)
|
||||
return err;
|
||||
|
@ -485,7 +485,7 @@ static int init_card(struct snd_usb_caiaqdev *cdev)
|
||||
}
|
||||
|
||||
usb_make_path(usb_dev, usbpath, sizeof(usbpath));
|
||||
snprintf(card->longname, sizeof(card->longname), "%s %s (%s)",
|
||||
scnprintf(card->longname, sizeof(card->longname), "%s %s (%s)",
|
||||
cdev->vendor_name, cdev->product_name, usbpath);
|
||||
|
||||
setup_card(cdev);
|
||||
|
@ -1929,7 +1929,6 @@ static int parse_clock_source_unit(struct mixer_build *state, int unitid,
|
||||
struct uac_clock_source_descriptor *hdr = _ftr;
|
||||
struct usb_mixer_elem_info *cval;
|
||||
struct snd_kcontrol *kctl;
|
||||
char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
|
||||
int ret;
|
||||
|
||||
if (state->mixer->protocol != UAC_VERSION_2)
|
||||
@ -1966,10 +1965,9 @@ static int parse_clock_source_unit(struct mixer_build *state, int unitid,
|
||||
|
||||
kctl->private_free = snd_usb_mixer_elem_free;
|
||||
ret = snd_usb_copy_string_desc(state->chip, hdr->iClockSource,
|
||||
name, sizeof(name));
|
||||
kctl->id.name, sizeof(kctl->id.name));
|
||||
if (ret > 0)
|
||||
snprintf(kctl->id.name, sizeof(kctl->id.name),
|
||||
"%s Validity", name);
|
||||
append_ctl_name(kctl, " Validity");
|
||||
else
|
||||
snprintf(kctl->id.name, sizeof(kctl->id.name),
|
||||
"Clock Source %d Validity", hdr->bClockID);
|
||||
|
@ -3205,8 +3205,8 @@ static int scarlett2_add_line_in_ctls(struct usb_mixer_interface *mixer)
|
||||
/* Add input phantom controls */
|
||||
if (info->inputs_per_phantom == 1) {
|
||||
for (i = 0; i < info->phantom_count; i++) {
|
||||
snprintf(s, sizeof(s), fmt, i + 1,
|
||||
"Phantom Power", "Switch");
|
||||
scnprintf(s, sizeof(s), fmt, i + 1,
|
||||
"Phantom Power", "Switch");
|
||||
err = scarlett2_add_new_ctl(
|
||||
mixer, &scarlett2_phantom_ctl,
|
||||
i, 1, s, &private->phantom_ctls[i]);
|
||||
@ -3218,8 +3218,8 @@ static int scarlett2_add_line_in_ctls(struct usb_mixer_interface *mixer)
|
||||
int from = i * info->inputs_per_phantom + 1;
|
||||
int to = (i + 1) * info->inputs_per_phantom;
|
||||
|
||||
snprintf(s, sizeof(s), fmt2, from, to,
|
||||
"Phantom Power", "Switch");
|
||||
scnprintf(s, sizeof(s), fmt2, from, to,
|
||||
"Phantom Power", "Switch");
|
||||
err = scarlett2_add_new_ctl(
|
||||
mixer, &scarlett2_phantom_ctl,
|
||||
i, 1, s, &private->phantom_ctls[i]);
|
||||
|
@ -483,7 +483,7 @@ int xen_snd_front_cfg_card(struct xen_snd_front_info *front_info,
|
||||
*stream_cnt = 0;
|
||||
num_devices = 0;
|
||||
do {
|
||||
snprintf(node, sizeof(node), "%d", num_devices);
|
||||
scnprintf(node, sizeof(node), "%d", num_devices);
|
||||
if (!xenbus_exists(XBT_NIL, xb_dev->nodename, node))
|
||||
break;
|
||||
|
||||
|
@ -431,7 +431,6 @@ long conf_get_long(snd_config_t *root, const char *key1, const char *key2, long
|
||||
int conf_get_bool(snd_config_t *root, const char *key1, const char *key2, int def)
|
||||
{
|
||||
snd_config_t *cfg;
|
||||
long l;
|
||||
int ret;
|
||||
|
||||
if (!root)
|
||||
|
@ -188,7 +188,7 @@ static int wait_for_event(struct ctl_data *ctl, int timeout)
|
||||
{
|
||||
unsigned short revents;
|
||||
snd_ctl_event_t *event;
|
||||
int count, err;
|
||||
int err;
|
||||
unsigned int mask = 0;
|
||||
unsigned int ev_id;
|
||||
|
||||
@ -430,7 +430,6 @@ static bool strend(const char *haystack, const char *needle)
|
||||
static void test_ctl_name(struct ctl_data *ctl)
|
||||
{
|
||||
bool name_ok = true;
|
||||
bool check;
|
||||
|
||||
ksft_print_msg("%d.%d %s\n", ctl->card->card, ctl->elem,
|
||||
ctl->name);
|
||||
@ -863,7 +862,6 @@ static bool test_ctl_write_invalid_value(struct ctl_data *ctl,
|
||||
snd_ctl_elem_value_t *val)
|
||||
{
|
||||
int err;
|
||||
long val_read;
|
||||
|
||||
/* Ideally this will fail... */
|
||||
err = snd_ctl_elem_write(ctl->card->handle, val);
|
||||
@ -883,8 +881,7 @@ static bool test_ctl_write_invalid_value(struct ctl_data *ctl,
|
||||
|
||||
static bool test_ctl_write_invalid_boolean(struct ctl_data *ctl)
|
||||
{
|
||||
int err, i;
|
||||
long val_read;
|
||||
int i;
|
||||
bool fail = false;
|
||||
snd_ctl_elem_value_t *val;
|
||||
snd_ctl_elem_value_alloca(&val);
|
||||
@ -994,8 +991,7 @@ static bool test_ctl_write_invalid_integer64(struct ctl_data *ctl)
|
||||
|
||||
static bool test_ctl_write_invalid_enumerated(struct ctl_data *ctl)
|
||||
{
|
||||
int err, i;
|
||||
unsigned int val_read;
|
||||
int i;
|
||||
bool fail = false;
|
||||
snd_ctl_elem_value_t *val;
|
||||
snd_ctl_elem_value_alloca(&val);
|
||||
@ -1027,7 +1023,6 @@ static bool test_ctl_write_invalid_enumerated(struct ctl_data *ctl)
|
||||
static void test_ctl_write_invalid(struct ctl_data *ctl)
|
||||
{
|
||||
bool pass;
|
||||
int err;
|
||||
|
||||
/* If the control is turned off let's be polite */
|
||||
if (snd_ctl_elem_info_is_inactive(ctl->info)) {
|
||||
|
@ -257,7 +257,7 @@ static void find_pcms(void)
|
||||
static void test_pcm_time(struct pcm_data *data, enum test_class class,
|
||||
const char *test_name, snd_config_t *pcm_cfg)
|
||||
{
|
||||
char name[64], key[128], msg[256];
|
||||
char name[64], msg[256];
|
||||
const int duration_s = 2, margin_ms = 100;
|
||||
const int duration_ms = duration_s * 1000;
|
||||
const char *cs;
|
||||
@ -567,7 +567,7 @@ int main(void)
|
||||
{
|
||||
struct card_data *card;
|
||||
struct pcm_data *pcm;
|
||||
snd_config_t *global_config, *cfg, *pcm_cfg;
|
||||
snd_config_t *global_config, *cfg;
|
||||
int num_pcm_tests = 0, num_tests, num_std_pcm_tests;
|
||||
int ret;
|
||||
void *thread_ret;
|
||||
|
@ -313,7 +313,6 @@ TEST_F(pcmtest, ni_playback) {
|
||||
*/
|
||||
TEST_F(pcmtest, reset_ioctl) {
|
||||
snd_pcm_t *handle;
|
||||
unsigned char *it;
|
||||
int test_res;
|
||||
struct pcmtest_test_params *params = &self->params;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user