Merge branch 'for-linus' into for-next

Merge for 5.18-rc1

Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Takashi Iwai 2022-05-23 07:48:16 +02:00
commit 1212fa1b48
57 changed files with 493 additions and 264 deletions

View File

@ -679,6 +679,7 @@ EXPORT_SYMBOL_GPL(fw_card_release);
void fw_core_remove_card(struct fw_card *card) void fw_core_remove_card(struct fw_card *card)
{ {
struct fw_card_driver dummy_driver = dummy_driver_template; struct fw_card_driver dummy_driver = dummy_driver_template;
unsigned long flags;
card->driver->update_phy_reg(card, 4, card->driver->update_phy_reg(card, 4,
PHY_LINK_ACTIVE | PHY_CONTENDER, 0); PHY_LINK_ACTIVE | PHY_CONTENDER, 0);
@ -693,7 +694,9 @@ void fw_core_remove_card(struct fw_card *card)
dummy_driver.stop_iso = card->driver->stop_iso; dummy_driver.stop_iso = card->driver->stop_iso;
card->driver = &dummy_driver; card->driver = &dummy_driver;
spin_lock_irqsave(&card->lock, flags);
fw_destroy_nodes(card); fw_destroy_nodes(card);
spin_unlock_irqrestore(&card->lock, flags);
/* Wait for all users, especially device workqueue jobs, to finish. */ /* Wait for all users, especially device workqueue jobs, to finish. */
fw_card_put(card); fw_card_put(card);

View File

@ -1502,6 +1502,7 @@ static void outbound_phy_packet_callback(struct fw_packet *packet,
{ {
struct outbound_phy_packet_event *e = struct outbound_phy_packet_event *e =
container_of(packet, struct outbound_phy_packet_event, p); container_of(packet, struct outbound_phy_packet_event, p);
struct client *e_client;
switch (status) { switch (status) {
/* expected: */ /* expected: */
@ -1518,9 +1519,10 @@ static void outbound_phy_packet_callback(struct fw_packet *packet,
} }
e->phy_packet.data[0] = packet->timestamp; e->phy_packet.data[0] = packet->timestamp;
e_client = e->client;
queue_event(e->client, &e->event, &e->phy_packet, queue_event(e->client, &e->event, &e->phy_packet,
sizeof(e->phy_packet) + e->phy_packet.length, NULL, 0); sizeof(e->phy_packet) + e->phy_packet.length, NULL, 0);
client_put(e->client); client_put(e_client);
} }
static int ioctl_send_phy_packet(struct client *client, union ioctl_arg *arg) static int ioctl_send_phy_packet(struct client *client, union ioctl_arg *arg)

View File

@ -375,16 +375,13 @@ static void report_found_node(struct fw_card *card,
card->bm_retries = 0; card->bm_retries = 0;
} }
/* Must be called with card->lock held */
void fw_destroy_nodes(struct fw_card *card) void fw_destroy_nodes(struct fw_card *card)
{ {
unsigned long flags;
spin_lock_irqsave(&card->lock, flags);
card->color++; card->color++;
if (card->local_node != NULL) if (card->local_node != NULL)
for_each_fw_node(card, card->local_node, report_lost_node); for_each_fw_node(card, card->local_node, report_lost_node);
card->local_node = NULL; card->local_node = NULL;
spin_unlock_irqrestore(&card->lock, flags);
} }
static void move_tree(struct fw_node *node0, struct fw_node *node1, int port) static void move_tree(struct fw_node *node0, struct fw_node *node1, int port)
@ -510,6 +507,8 @@ void fw_core_handle_bus_reset(struct fw_card *card, int node_id, int generation,
struct fw_node *local_node; struct fw_node *local_node;
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&card->lock, flags);
/* /*
* If the selfID buffer is not the immediate successor of the * If the selfID buffer is not the immediate successor of the
* previously processed one, we cannot reliably compare the * previously processed one, we cannot reliably compare the
@ -521,8 +520,6 @@ void fw_core_handle_bus_reset(struct fw_card *card, int node_id, int generation,
card->bm_retries = 0; card->bm_retries = 0;
} }
spin_lock_irqsave(&card->lock, flags);
card->broadcast_channel_allocated = card->broadcast_channel_auto_allocated; card->broadcast_channel_allocated = card->broadcast_channel_auto_allocated;
card->node_id = node_id; card->node_id = node_id;
/* /*

View File

@ -73,24 +73,25 @@ static int try_cancel_split_timeout(struct fw_transaction *t)
static int close_transaction(struct fw_transaction *transaction, static int close_transaction(struct fw_transaction *transaction,
struct fw_card *card, int rcode) struct fw_card *card, int rcode)
{ {
struct fw_transaction *t; struct fw_transaction *t = NULL, *iter;
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&card->lock, flags); spin_lock_irqsave(&card->lock, flags);
list_for_each_entry(t, &card->transaction_list, link) { list_for_each_entry(iter, &card->transaction_list, link) {
if (t == transaction) { if (iter == transaction) {
if (!try_cancel_split_timeout(t)) { if (!try_cancel_split_timeout(iter)) {
spin_unlock_irqrestore(&card->lock, flags); spin_unlock_irqrestore(&card->lock, flags);
goto timed_out; goto timed_out;
} }
list_del_init(&t->link); list_del_init(&iter->link);
card->tlabel_mask &= ~(1ULL << t->tlabel); card->tlabel_mask &= ~(1ULL << iter->tlabel);
t = iter;
break; break;
} }
} }
spin_unlock_irqrestore(&card->lock, flags); spin_unlock_irqrestore(&card->lock, flags);
if (&t->link != &card->transaction_list) { if (t) {
t->callback(card, rcode, NULL, 0, t->callback_data); t->callback(card, rcode, NULL, 0, t->callback_data);
return 0; return 0;
} }
@ -953,7 +954,7 @@ EXPORT_SYMBOL(fw_core_handle_request);
void fw_core_handle_response(struct fw_card *card, struct fw_packet *p) void fw_core_handle_response(struct fw_card *card, struct fw_packet *p)
{ {
struct fw_transaction *t; struct fw_transaction *t = NULL, *iter;
unsigned long flags; unsigned long flags;
u32 *data; u32 *data;
size_t data_length; size_t data_length;
@ -965,20 +966,21 @@ void fw_core_handle_response(struct fw_card *card, struct fw_packet *p)
rcode = HEADER_GET_RCODE(p->header[1]); rcode = HEADER_GET_RCODE(p->header[1]);
spin_lock_irqsave(&card->lock, flags); spin_lock_irqsave(&card->lock, flags);
list_for_each_entry(t, &card->transaction_list, link) { list_for_each_entry(iter, &card->transaction_list, link) {
if (t->node_id == source && t->tlabel == tlabel) { if (iter->node_id == source && iter->tlabel == tlabel) {
if (!try_cancel_split_timeout(t)) { if (!try_cancel_split_timeout(iter)) {
spin_unlock_irqrestore(&card->lock, flags); spin_unlock_irqrestore(&card->lock, flags);
goto timed_out; goto timed_out;
} }
list_del_init(&t->link); list_del_init(&iter->link);
card->tlabel_mask &= ~(1ULL << t->tlabel); card->tlabel_mask &= ~(1ULL << iter->tlabel);
t = iter;
break; break;
} }
} }
spin_unlock_irqrestore(&card->lock, flags); spin_unlock_irqrestore(&card->lock, flags);
if (&t->link == &card->transaction_list) { if (!t) {
timed_out: timed_out:
fw_notice(card, "unsolicited response (source %x, tlabel %x)\n", fw_notice(card, "unsolicited response (source %x, tlabel %x)\n",
source, tlabel); source, tlabel);

View File

@ -408,7 +408,7 @@ static void sbp2_status_write(struct fw_card *card, struct fw_request *request,
void *payload, size_t length, void *callback_data) void *payload, size_t length, void *callback_data)
{ {
struct sbp2_logical_unit *lu = callback_data; struct sbp2_logical_unit *lu = callback_data;
struct sbp2_orb *orb; struct sbp2_orb *orb = NULL, *iter;
struct sbp2_status status; struct sbp2_status status;
unsigned long flags; unsigned long flags;
@ -433,17 +433,18 @@ static void sbp2_status_write(struct fw_card *card, struct fw_request *request,
/* Lookup the orb corresponding to this status write. */ /* Lookup the orb corresponding to this status write. */
spin_lock_irqsave(&lu->tgt->lock, flags); spin_lock_irqsave(&lu->tgt->lock, flags);
list_for_each_entry(orb, &lu->orb_list, link) { list_for_each_entry(iter, &lu->orb_list, link) {
if (STATUS_GET_ORB_HIGH(status) == 0 && if (STATUS_GET_ORB_HIGH(status) == 0 &&
STATUS_GET_ORB_LOW(status) == orb->request_bus) { STATUS_GET_ORB_LOW(status) == iter->request_bus) {
orb->rcode = RCODE_COMPLETE; iter->rcode = RCODE_COMPLETE;
list_del(&orb->link); list_del(&iter->link);
orb = iter;
break; break;
} }
} }
spin_unlock_irqrestore(&lu->tgt->lock, flags); spin_unlock_irqrestore(&lu->tgt->lock, flags);
if (&orb->link != &lu->orb_list) { if (orb) {
orb->callback(orb, &status); orb->callback(orb, &status);
kref_put(&orb->kref, free_orb); /* orb callback reference */ kref_put(&orb->kref, free_orb); /* orb callback reference */
} else { } else {

View File

@ -955,8 +955,7 @@ static int cs_dsp_create_control(struct cs_dsp *dsp,
ctl->alg_region = *alg_region; ctl->alg_region = *alg_region;
if (subname && dsp->fw_ver >= 2) { if (subname && dsp->fw_ver >= 2) {
ctl->subname_len = subname_len; ctl->subname_len = subname_len;
ctl->subname = kmemdup(subname, ctl->subname = kasprintf(GFP_KERNEL, "%.*s", subname_len, subname);
strlen(subname) + 1, GFP_KERNEL);
if (!ctl->subname) { if (!ctl->subname) {
ret = -ENOMEM; ret = -ENOMEM;
goto err_ctl; goto err_ctl;

View File

@ -179,6 +179,10 @@ struct snd_soc_component_driver {
struct snd_pcm_hw_params *params); struct snd_pcm_hw_params *params);
bool use_dai_pcm_id; /* use DAI link PCM ID as PCM device number */ bool use_dai_pcm_id; /* use DAI link PCM ID as PCM device number */
int be_pcm_base; /* base device ID for all BE PCMs */ int be_pcm_base; /* base device ID for all BE PCMs */
#ifdef CONFIG_DEBUG_FS
const char *debugfs_prefix;
#endif
}; };
struct snd_soc_component { struct snd_soc_component {

View File

@ -34,6 +34,7 @@ hwdep_read_resp_buf(struct snd_efw *efw, char __user *buf, long remained,
type = SNDRV_FIREWIRE_EVENT_EFW_RESPONSE; type = SNDRV_FIREWIRE_EVENT_EFW_RESPONSE;
if (copy_to_user(buf, &type, sizeof(type))) if (copy_to_user(buf, &type, sizeof(type)))
return -EFAULT; return -EFAULT;
count += sizeof(type);
remained -= sizeof(type); remained -= sizeof(type);
buf += sizeof(type); buf += sizeof(type);

View File

@ -127,11 +127,10 @@ static int i915_gfx_present(struct pci_dev *hdac_pci)
display_dev = pci_get_class(class, display_dev); display_dev = pci_get_class(class, display_dev);
if (display_dev && display_dev->vendor == PCI_VENDOR_ID_INTEL && if (display_dev && display_dev->vendor == PCI_VENDOR_ID_INTEL &&
connectivity_check(display_dev, hdac_pci)) connectivity_check(display_dev, hdac_pci)) {
pci_dev_put(display_dev);
match = true; match = true;
}
pci_dev_put(display_dev);
} while (!match && display_dev); } while (!match && display_dev);
return match; return match;

View File

@ -424,6 +424,15 @@ static const struct config_entry config_table[] = {
.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
.device = 0x54c8, .device = 0x54c8,
}, },
/* RaptorLake-P */
{
.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
.device = 0x51ca,
},
{
.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
.device = 0x51cb,
},
#endif #endif
}; };

View File

@ -1094,7 +1094,8 @@ wavefront_send_sample (snd_wavefront_t *dev,
if (dataptr < data_end) { if (dataptr < data_end) {
__get_user (sample_short, dataptr); if (get_user(sample_short, dataptr))
return -EFAULT;
dataptr += skip; dataptr += skip;
if (data_is_unsigned) { /* GUS ? */ if (data_is_unsigned) { /* GUS ? */

View File

@ -1428,7 +1428,7 @@ void dmasound_deinit(void)
unregister_sound_dsp(sq_unit); unregister_sound_dsp(sq_unit);
} }
static int dmasound_setup(char *str) static int __maybe_unused dmasound_setup(char *str)
{ {
int ints[6], size; int ints[6], size;

View File

@ -1395,7 +1395,7 @@ static int hdmi_find_pcm_slot(struct hdmi_spec *spec,
last_try: last_try:
/* the last try; check the empty slots in pins */ /* the last try; check the empty slots in pins */
for (i = 0; i < spec->num_nids; i++) { for (i = 0; i < spec->pcm_used; i++) {
if (!test_bit(i, &spec->pcm_bitmap)) if (!test_bit(i, &spec->pcm_bitmap))
return i; return i;
} }
@ -2325,7 +2325,9 @@ static int generic_hdmi_build_pcms(struct hda_codec *codec)
* dev_num is the device entry number in a pin * dev_num is the device entry number in a pin
*/ */
if (codec->mst_no_extra_pcms) if (spec->dyn_pcm_no_legacy && codec->mst_no_extra_pcms)
pcm_num = spec->num_cvts;
else if (codec->mst_no_extra_pcms)
pcm_num = spec->num_nids; pcm_num = spec->num_nids;
else else
pcm_num = spec->num_nids + spec->dev_num - 1; pcm_num = spec->num_nids + spec->dev_num - 1;
@ -4551,6 +4553,7 @@ HDA_CODEC_ENTRY(0x80862819, "DG2 HDMI", patch_i915_adlp_hdmi),
HDA_CODEC_ENTRY(0x8086281a, "Jasperlake HDMI", patch_i915_icl_hdmi), HDA_CODEC_ENTRY(0x8086281a, "Jasperlake HDMI", patch_i915_icl_hdmi),
HDA_CODEC_ENTRY(0x8086281b, "Elkhartlake HDMI", patch_i915_icl_hdmi), HDA_CODEC_ENTRY(0x8086281b, "Elkhartlake HDMI", patch_i915_icl_hdmi),
HDA_CODEC_ENTRY(0x8086281c, "Alderlake-P HDMI", patch_i915_adlp_hdmi), HDA_CODEC_ENTRY(0x8086281c, "Alderlake-P HDMI", patch_i915_adlp_hdmi),
HDA_CODEC_ENTRY(0x8086281f, "Raptorlake-P HDMI", patch_i915_adlp_hdmi),
HDA_CODEC_ENTRY(0x80862880, "CedarTrail HDMI", patch_generic_hdmi), HDA_CODEC_ENTRY(0x80862880, "CedarTrail HDMI", patch_generic_hdmi),
HDA_CODEC_ENTRY(0x80862882, "Valleyview2 HDMI", patch_i915_byt_hdmi), HDA_CODEC_ENTRY(0x80862882, "Valleyview2 HDMI", patch_i915_byt_hdmi),
HDA_CODEC_ENTRY(0x80862883, "Braswell HDMI", patch_i915_byt_hdmi), HDA_CODEC_ENTRY(0x80862883, "Braswell HDMI", patch_i915_byt_hdmi),

View File

@ -937,6 +937,9 @@ static int alc_init(struct hda_codec *codec)
return 0; return 0;
} }
#define alc_free snd_hda_gen_free
#ifdef CONFIG_PM
static inline void alc_shutup(struct hda_codec *codec) static inline void alc_shutup(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; struct alc_spec *spec = codec->spec;
@ -950,9 +953,6 @@ static inline void alc_shutup(struct hda_codec *codec)
alc_shutup_pins(codec); alc_shutup_pins(codec);
} }
#define alc_free snd_hda_gen_free
#ifdef CONFIG_PM
static void alc_power_eapd(struct hda_codec *codec) static void alc_power_eapd(struct hda_codec *codec)
{ {
alc_auto_setup_eapd(codec, false); alc_auto_setup_eapd(codec, false);
@ -966,9 +966,7 @@ static int alc_suspend(struct hda_codec *codec)
spec->power_hook(codec); spec->power_hook(codec);
return 0; return 0;
} }
#endif
#ifdef CONFIG_PM
static int alc_resume(struct hda_codec *codec) static int alc_resume(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; struct alc_spec *spec = codec->spec;
@ -6728,6 +6726,41 @@ static void alc256_fixup_mic_no_presence_and_resume(struct hda_codec *codec,
} }
} }
static void alc_fixup_dell4_mic_no_presence_quiet(struct hda_codec *codec,
const struct hda_fixup *fix,
int action)
{
struct alc_spec *spec = codec->spec;
struct hda_input_mux *imux = &spec->gen.input_mux;
int i;
alc269_fixup_limit_int_mic_boost(codec, fix, action);
switch (action) {
case HDA_FIXUP_ACT_PRE_PROBE:
/**
* Set the vref of pin 0x19 (Headset Mic) and pin 0x1b (Headphone Mic)
* to Hi-Z to avoid pop noises at startup and when plugging and
* unplugging headphones.
*/
snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
snd_hda_codec_set_pin_target(codec, 0x1b, PIN_VREFHIZ);
break;
case HDA_FIXUP_ACT_PROBE:
/**
* Make the internal mic (0x12) the default input source to
* prevent pop noises on cold boot.
*/
for (i = 0; i < imux->num_items; i++) {
if (spec->gen.imux_pins[i] == 0x12) {
spec->gen.cur_mux[0] = i;
break;
}
}
break;
}
}
enum { enum {
ALC269_FIXUP_GPIO2, ALC269_FIXUP_GPIO2,
ALC269_FIXUP_SONY_VAIO, ALC269_FIXUP_SONY_VAIO,
@ -6769,6 +6802,7 @@ enum {
ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET,
ALC269_FIXUP_HEADSET_MODE, ALC269_FIXUP_HEADSET_MODE,
ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
ALC269_FIXUP_ASPIRE_HEADSET_MIC, ALC269_FIXUP_ASPIRE_HEADSET_MIC,
@ -6954,11 +6988,13 @@ enum {
ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE, ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
ALC287_FIXUP_LEGION_16ACHG6, ALC287_FIXUP_LEGION_16ACHG6,
ALC287_FIXUP_CS35L41_I2C_2, ALC287_FIXUP_CS35L41_I2C_2,
ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED,
ALC245_FIXUP_CS35L41_SPI_2, ALC245_FIXUP_CS35L41_SPI_2,
ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED, ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED,
ALC245_FIXUP_CS35L41_SPI_4, ALC245_FIXUP_CS35L41_SPI_4,
ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED, ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED,
ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED, ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED,
ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE,
}; };
static const struct hda_fixup alc269_fixups[] = { static const struct hda_fixup alc269_fixups[] = {
@ -8716,6 +8752,14 @@ static const struct hda_fixup alc269_fixups[] = {
[ALC287_FIXUP_CS35L41_I2C_2] = { [ALC287_FIXUP_CS35L41_I2C_2] = {
.type = HDA_FIXUP_FUNC, .type = HDA_FIXUP_FUNC,
.v.func = cs35l41_fixup_i2c_two, .v.func = cs35l41_fixup_i2c_two,
.chained = true,
.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
},
[ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED] = {
.type = HDA_FIXUP_FUNC,
.v.func = cs35l41_fixup_i2c_two,
.chained = true,
.chain_id = ALC285_FIXUP_HP_MUTE_LED,
}, },
[ALC245_FIXUP_CS35L41_SPI_2] = { [ALC245_FIXUP_CS35L41_SPI_2] = {
.type = HDA_FIXUP_FUNC, .type = HDA_FIXUP_FUNC,
@ -8747,6 +8791,21 @@ static const struct hda_fixup alc269_fixups[] = {
.chained = true, .chained = true,
.chain_id = ALC285_FIXUP_HP_MUTE_LED, .chain_id = ALC285_FIXUP_HP_MUTE_LED,
}, },
[ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET] = {
.type = HDA_FIXUP_FUNC,
.v.func = alc_fixup_dell4_mic_no_presence_quiet,
.chained = true,
.chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
},
[ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE] = {
.type = HDA_FIXUP_PINS,
.v.pins = (const struct hda_pintbl[]) {
{ 0x19, 0x02a1112c }, /* use as headset mic, without its own jack detect */
{ }
},
.chained = true,
.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
},
}; };
static const struct snd_pci_quirk alc269_fixup_tbl[] = { static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@ -8837,6 +8896,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x1028, 0x0a2e, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC), SND_PCI_QUIRK(0x1028, 0x0a2e, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
SND_PCI_QUIRK(0x1028, 0x0a30, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC), SND_PCI_QUIRK(0x1028, 0x0a30, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
SND_PCI_QUIRK(0x1028, 0x0a38, "Dell Latitude 7520", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET),
SND_PCI_QUIRK(0x1028, 0x0a58, "Dell", ALC255_FIXUP_DELL_HEADSET_MIC), SND_PCI_QUIRK(0x1028, 0x0a58, "Dell", ALC255_FIXUP_DELL_HEADSET_MIC),
SND_PCI_QUIRK(0x1028, 0x0a61, "Dell XPS 15 9510", ALC289_FIXUP_DUAL_SPK), SND_PCI_QUIRK(0x1028, 0x0a61, "Dell XPS 15 9510", ALC289_FIXUP_DUAL_SPK),
SND_PCI_QUIRK(0x1028, 0x0a62, "Dell Precision 5560", ALC289_FIXUP_DUAL_SPK), SND_PCI_QUIRK(0x1028, 0x0a62, "Dell Precision 5560", ALC289_FIXUP_DUAL_SPK),
@ -8964,21 +9024,22 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK(0x103c, 0x8896, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_MUTE_LED), SND_PCI_QUIRK(0x103c, 0x8896, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_MUTE_LED),
SND_PCI_QUIRK(0x103c, 0x8898, "HP EliteBook 845 G8 Notebook PC", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST), SND_PCI_QUIRK(0x103c, 0x8898, "HP EliteBook 845 G8 Notebook PC", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
SND_PCI_QUIRK(0x103c, 0x88d0, "HP Pavilion 15-eh1xxx (mainboard 88D0)", ALC287_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x88d0, "HP Pavilion 15-eh1xxx (mainboard 88D0)", ALC287_FIXUP_HP_GPIO_LED),
SND_PCI_QUIRK(0x103c, 0x896e, "HP EliteBook x360 830 G9", ALC245_FIXUP_CS35L41_SPI_2), SND_PCI_QUIRK(0x103c, 0x896e, "HP EliteBook x360 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
SND_PCI_QUIRK(0x103c, 0x8971, "HP EliteBook 830 G9", ALC245_FIXUP_CS35L41_SPI_2), SND_PCI_QUIRK(0x103c, 0x8971, "HP EliteBook 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
SND_PCI_QUIRK(0x103c, 0x8972, "HP EliteBook 840 G9", ALC245_FIXUP_CS35L41_SPI_2), SND_PCI_QUIRK(0x103c, 0x8972, "HP EliteBook 840 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
SND_PCI_QUIRK(0x103c, 0x8973, "HP EliteBook 860 G9", ALC245_FIXUP_CS35L41_SPI_2), SND_PCI_QUIRK(0x103c, 0x8973, "HP EliteBook 860 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
SND_PCI_QUIRK(0x103c, 0x8974, "HP EliteBook 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2), SND_PCI_QUIRK(0x103c, 0x8974, "HP EliteBook 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
SND_PCI_QUIRK(0x103c, 0x8975, "HP EliteBook x360 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2), SND_PCI_QUIRK(0x103c, 0x8975, "HP EliteBook x360 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
SND_PCI_QUIRK(0x103c, 0x8981, "HP Elite Dragonfly G3", ALC245_FIXUP_CS35L41_SPI_4), SND_PCI_QUIRK(0x103c, 0x8981, "HP Elite Dragonfly G3", ALC245_FIXUP_CS35L41_SPI_4),
SND_PCI_QUIRK(0x103c, 0x898e, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x898e, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
SND_PCI_QUIRK(0x103c, 0x898f, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x898f, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
SND_PCI_QUIRK(0x103c, 0x8991, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x8991, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
SND_PCI_QUIRK(0x103c, 0x8992, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x8992, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2),
SND_PCI_QUIRK(0x103c, 0x8994, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x8994, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
SND_PCI_QUIRK(0x103c, 0x8995, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x8995, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2),
SND_PCI_QUIRK(0x103c, 0x89a4, "HP ProBook 440 G9", ALC236_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x89a4, "HP ProBook 440 G9", ALC236_FIXUP_HP_GPIO_LED),
SND_PCI_QUIRK(0x103c, 0x89a6, "HP ProBook 450 G9", ALC236_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x89a6, "HP ProBook 450 G9", ALC236_FIXUP_HP_GPIO_LED),
SND_PCI_QUIRK(0x103c, 0x89aa, "HP EliteBook 630 G9", ALC236_FIXUP_HP_GPIO_LED),
SND_PCI_QUIRK(0x103c, 0x89ac, "HP EliteBook 640 G9", ALC236_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x89ac, "HP EliteBook 640 G9", ALC236_FIXUP_HP_GPIO_LED),
SND_PCI_QUIRK(0x103c, 0x89ae, "HP EliteBook 650 G9", ALC236_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x89ae, "HP EliteBook 650 G9", ALC236_FIXUP_HP_GPIO_LED),
SND_PCI_QUIRK(0x103c, 0x89c3, "Zbook Studio G9", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x89c3, "Zbook Studio G9", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
@ -9111,6 +9172,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK(0x1558, 0x8562, "Clevo NH[57][0-9]RZ[Q]", ALC269_FIXUP_DMIC), SND_PCI_QUIRK(0x1558, 0x8562, "Clevo NH[57][0-9]RZ[Q]", ALC269_FIXUP_DMIC),
SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x1558, 0x866d, "Clevo NP5[05]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1558, 0x866d, "Clevo NP5[05]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x1558, 0x867c, "Clevo NP7[01]PNP", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x1558, 0x867d, "Clevo NP7[01]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1558, 0x867d, "Clevo NP7[01]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME), SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME),
@ -9185,6 +9247,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS), SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940", ALC298_FIXUP_LENOVO_SPK_VOLUME), SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940", ALC298_FIXUP_LENOVO_SPK_VOLUME),
SND_PCI_QUIRK(0x17aa, 0x3819, "Lenovo 13s Gen2 ITL", ALC287_FIXUP_13S_GEN2_SPEAKERS), SND_PCI_QUIRK(0x17aa, 0x3819, "Lenovo 13s Gen2 ITL", ALC287_FIXUP_13S_GEN2_SPEAKERS),
SND_PCI_QUIRK(0x17aa, 0x3820, "Yoga Duet 7 13ITL6", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
SND_PCI_QUIRK(0x17aa, 0x3824, "Legion Y9000X 2020", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS), SND_PCI_QUIRK(0x17aa, 0x3824, "Legion Y9000X 2020", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
SND_PCI_QUIRK(0x17aa, 0x3827, "Ideapad S740", ALC285_FIXUP_IDEAPAD_S740_COEF), SND_PCI_QUIRK(0x17aa, 0x3827, "Ideapad S740", ALC285_FIXUP_IDEAPAD_S740_COEF),
SND_PCI_QUIRK(0x17aa, 0x3834, "Lenovo IdeaPad Slim 9i 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS), SND_PCI_QUIRK(0x17aa, 0x3834, "Lenovo IdeaPad Slim 9i 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
@ -9227,6 +9290,14 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802), SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802),
SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X), SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X),
SND_PCI_QUIRK(0x1d05, 0x1132, "TongFang PHxTxX1", ALC256_FIXUP_SET_COEF_DEFAULTS), SND_PCI_QUIRK(0x1d05, 0x1132, "TongFang PHxTxX1", ALC256_FIXUP_SET_COEF_DEFAULTS),
SND_PCI_QUIRK(0x1d05, 0x1096, "TongFang GMxMRxx", ALC269_FIXUP_NO_SHUTUP),
SND_PCI_QUIRK(0x1d05, 0x1100, "TongFang GKxNRxx", ALC269_FIXUP_NO_SHUTUP),
SND_PCI_QUIRK(0x1d05, 0x1111, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
SND_PCI_QUIRK(0x1d05, 0x1119, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
SND_PCI_QUIRK(0x1d05, 0x1129, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
SND_PCI_QUIRK(0x1d05, 0x1147, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
SND_PCI_QUIRK(0x1d05, 0x115c, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
SND_PCI_QUIRK(0x1d05, 0x121b, "TongFang GMxAGxx", ALC269_FIXUP_NO_SHUTUP),
SND_PCI_QUIRK(0x1d72, 0x1602, "RedmiBook", ALC255_FIXUP_XIAOMI_HEADSET_MIC), SND_PCI_QUIRK(0x1d72, 0x1602, "RedmiBook", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
SND_PCI_QUIRK(0x1d72, 0x1701, "XiaomiNotebook Pro", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1d72, 0x1701, "XiaomiNotebook Pro", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC), SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),
@ -9234,6 +9305,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK(0x8086, 0x2074, "Intel NUC 8", ALC233_FIXUP_INTEL_NUC8_DMIC), SND_PCI_QUIRK(0x8086, 0x2074, "Intel NUC 8", ALC233_FIXUP_INTEL_NUC8_DMIC),
SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", ALC256_FIXUP_INTEL_NUC8_RUGGED), SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", ALC256_FIXUP_INTEL_NUC8_RUGGED),
SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", ALC256_FIXUP_INTEL_NUC10), SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", ALC256_FIXUP_INTEL_NUC10),
SND_PCI_QUIRK(0xf111, 0x0001, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
#if 0 #if 0
/* Below is a quirk table taken from the old code. /* Below is a quirk table taken from the old code.

View File

@ -561,8 +561,9 @@ static snd_pcm_uframes_t lola_pcm_pointer(struct snd_pcm_substream *substream)
void lola_pcm_update(struct lola *chip, struct lola_pcm *pcm, unsigned int bits) void lola_pcm_update(struct lola *chip, struct lola_pcm *pcm, unsigned int bits)
{ {
int i; int i;
u8 num_streams = min_t(u8, pcm->num_streams, ARRAY_SIZE(pcm->streams));
for (i = 0; bits && i < pcm->num_streams; i++) { for (i = 0; bits && i < num_streams; i++) {
if (bits & (1 << i)) { if (bits & (1 << i)) {
struct lola_stream *str = &pcm->streams[i]; struct lola_stream *str = &pcm->streams[i];
if (str->substream && str->running) if (str->substream && str->running)

View File

@ -966,6 +966,7 @@ static int mchp_pdmc_process(struct snd_pcm_substream *substream,
static struct snd_dmaengine_pcm_config mchp_pdmc_config = { static struct snd_dmaengine_pcm_config mchp_pdmc_config = {
.process = mchp_pdmc_process, .process = mchp_pdmc_process,
.prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config,
}; };
static int mchp_pdmc_probe(struct platform_device *pdev) static int mchp_pdmc_probe(struct platform_device *pdev)

View File

@ -46,35 +46,6 @@
*/ */
#undef ENABLE_MIC_INPUT #undef ENABLE_MIC_INPUT
static struct clk *mclk;
static int at91sam9g20ek_set_bias_level(struct snd_soc_card *card,
struct snd_soc_dapm_context *dapm,
enum snd_soc_bias_level level)
{
static int mclk_on;
int ret = 0;
switch (level) {
case SND_SOC_BIAS_ON:
case SND_SOC_BIAS_PREPARE:
if (!mclk_on)
ret = clk_enable(mclk);
if (ret == 0)
mclk_on = 1;
break;
case SND_SOC_BIAS_OFF:
case SND_SOC_BIAS_STANDBY:
if (mclk_on)
clk_disable(mclk);
mclk_on = 0;
break;
}
return ret;
}
static const struct snd_soc_dapm_widget at91sam9g20ek_dapm_widgets[] = { static const struct snd_soc_dapm_widget at91sam9g20ek_dapm_widgets[] = {
SND_SOC_DAPM_MIC("Int Mic", NULL), SND_SOC_DAPM_MIC("Int Mic", NULL),
SND_SOC_DAPM_SPK("Ext Spk", NULL), SND_SOC_DAPM_SPK("Ext Spk", NULL),
@ -135,7 +106,6 @@ static struct snd_soc_card snd_soc_at91sam9g20ek = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.dai_link = &at91sam9g20ek_dai, .dai_link = &at91sam9g20ek_dai,
.num_links = 1, .num_links = 1,
.set_bias_level = at91sam9g20ek_set_bias_level,
.dapm_widgets = at91sam9g20ek_dapm_widgets, .dapm_widgets = at91sam9g20ek_dapm_widgets,
.num_dapm_widgets = ARRAY_SIZE(at91sam9g20ek_dapm_widgets), .num_dapm_widgets = ARRAY_SIZE(at91sam9g20ek_dapm_widgets),
@ -148,7 +118,6 @@ static int at91sam9g20ek_audio_probe(struct platform_device *pdev)
{ {
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
struct device_node *codec_np, *cpu_np; struct device_node *codec_np, *cpu_np;
struct clk *pllb;
struct snd_soc_card *card = &snd_soc_at91sam9g20ek; struct snd_soc_card *card = &snd_soc_at91sam9g20ek;
int ret; int ret;
@ -162,31 +131,6 @@ static int at91sam9g20ek_audio_probe(struct platform_device *pdev)
return -EINVAL; return -EINVAL;
} }
/*
* Codec MCLK is supplied by PCK0 - set it up.
*/
mclk = clk_get(NULL, "pck0");
if (IS_ERR(mclk)) {
dev_err(&pdev->dev, "Failed to get MCLK\n");
ret = PTR_ERR(mclk);
goto err;
}
pllb = clk_get(NULL, "pllb");
if (IS_ERR(pllb)) {
dev_err(&pdev->dev, "Failed to get PLLB\n");
ret = PTR_ERR(pllb);
goto err_mclk;
}
ret = clk_set_parent(mclk, pllb);
clk_put(pllb);
if (ret != 0) {
dev_err(&pdev->dev, "Failed to set MCLK parent\n");
goto err_mclk;
}
clk_set_rate(mclk, MCLK_RATE);
card->dev = &pdev->dev; card->dev = &pdev->dev;
/* Parse device node info */ /* Parse device node info */
@ -230,9 +174,6 @@ static int at91sam9g20ek_audio_probe(struct platform_device *pdev)
return ret; return ret;
err_mclk:
clk_put(mclk);
mclk = NULL;
err: err:
atmel_ssc_put_audio(0); atmel_ssc_put_audio(0);
return ret; return ret;
@ -242,8 +183,6 @@ static int at91sam9g20ek_audio_remove(struct platform_device *pdev)
{ {
struct snd_soc_card *card = platform_get_drvdata(pdev); struct snd_soc_card *card = platform_get_drvdata(pdev);
clk_disable(mclk);
mclk = NULL;
snd_soc_unregister_card(card); snd_soc_unregister_card(card);
atmel_ssc_put_audio(0); atmel_ssc_put_audio(0);

View File

@ -842,8 +842,8 @@ int cs35l41_otp_unpack(struct device *dev, struct regmap *regmap)
word_offset = otp_map_match->word_offset; word_offset = otp_map_match->word_offset;
for (i = 0; i < otp_map_match->num_elements; i++) { for (i = 0; i < otp_map_match->num_elements; i++) {
dev_dbg(dev, "bitoffset= %d, word_offset=%d, bit_sum mod 32=%d\n", dev_dbg(dev, "bitoffset= %d, word_offset=%d, bit_sum mod 32=%d otp_map[i].size = %d\n",
bit_offset, word_offset, bit_sum % 32); bit_offset, word_offset, bit_sum % 32, otp_map[i].size);
if (bit_offset + otp_map[i].size - 1 >= 32) { if (bit_offset + otp_map[i].size - 1 >= 32) {
otp_val = (otp_mem[word_offset] & otp_val = (otp_mem[word_offset] &
GENMASK(31, bit_offset)) >> bit_offset; GENMASK(31, bit_offset)) >> bit_offset;
@ -851,12 +851,14 @@ int cs35l41_otp_unpack(struct device *dev, struct regmap *regmap)
GENMASK(bit_offset + otp_map[i].size - 33, 0)) << GENMASK(bit_offset + otp_map[i].size - 33, 0)) <<
(32 - bit_offset); (32 - bit_offset);
bit_offset += otp_map[i].size - 32; bit_offset += otp_map[i].size - 32;
} else { } else if (bit_offset + otp_map[i].size - 1 >= 0) {
otp_val = (otp_mem[word_offset] & otp_val = (otp_mem[word_offset] &
GENMASK(bit_offset + otp_map[i].size - 1, bit_offset) GENMASK(bit_offset + otp_map[i].size - 1, bit_offset)
) >> bit_offset; ) >> bit_offset;
bit_offset += otp_map[i].size; bit_offset += otp_map[i].size;
} } else /* both bit_offset and otp_map[i].size are 0 */
otp_val = 0;
bit_sum += otp_map[i].size; bit_sum += otp_map[i].size;
if (bit_offset == 32) { if (bit_offset == 32) {

View File

@ -446,7 +446,7 @@ static int da7219_tonegen_freq_put(struct snd_kcontrol *kcontrol,
struct soc_mixer_control *mixer_ctrl = struct soc_mixer_control *mixer_ctrl =
(struct soc_mixer_control *) kcontrol->private_value; (struct soc_mixer_control *) kcontrol->private_value;
unsigned int reg = mixer_ctrl->reg; unsigned int reg = mixer_ctrl->reg;
__le16 val; __le16 val_new, val_old;
int ret; int ret;
/* /*
@ -454,13 +454,19 @@ static int da7219_tonegen_freq_put(struct snd_kcontrol *kcontrol,
* Therefore we need to convert to little endian here to align with * Therefore we need to convert to little endian here to align with
* HW registers. * HW registers.
*/ */
val = cpu_to_le16(ucontrol->value.integer.value[0]); val_new = cpu_to_le16(ucontrol->value.integer.value[0]);
mutex_lock(&da7219->ctrl_lock); mutex_lock(&da7219->ctrl_lock);
ret = regmap_raw_write(da7219->regmap, reg, &val, sizeof(val)); ret = regmap_raw_read(da7219->regmap, reg, &val_old, sizeof(val_old));
if (ret == 0 && (val_old != val_new))
ret = regmap_raw_write(da7219->regmap, reg,
&val_new, sizeof(val_new));
mutex_unlock(&da7219->ctrl_lock); mutex_unlock(&da7219->ctrl_lock);
return ret; if (ret < 0)
return ret;
return val_old != val_new;
} }

View File

@ -3566,12 +3566,16 @@ static int rx_macro_probe(struct platform_device *pdev)
return PTR_ERR(rx->pds); return PTR_ERR(rx->pds);
base = devm_platform_ioremap_resource(pdev, 0); base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(base)) if (IS_ERR(base)) {
return PTR_ERR(base); ret = PTR_ERR(base);
goto err;
}
rx->regmap = devm_regmap_init_mmio(dev, base, &rx_regmap_config); rx->regmap = devm_regmap_init_mmio(dev, base, &rx_regmap_config);
if (IS_ERR(rx->regmap)) if (IS_ERR(rx->regmap)) {
return PTR_ERR(rx->regmap); ret = PTR_ERR(rx->regmap);
goto err;
}
dev_set_drvdata(dev, rx); dev_set_drvdata(dev, rx);
@ -3632,6 +3636,8 @@ err_mclk:
err_dcodec: err_dcodec:
clk_disable_unprepare(rx->macro); clk_disable_unprepare(rx->macro);
err: err:
lpass_macro_pds_exit(rx->pds);
return ret; return ret;
} }

View File

@ -1828,8 +1828,10 @@ static int tx_macro_probe(struct platform_device *pdev)
return PTR_ERR(tx->pds); return PTR_ERR(tx->pds);
base = devm_platform_ioremap_resource(pdev, 0); base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(base)) if (IS_ERR(base)) {
return PTR_ERR(base); ret = PTR_ERR(base);
goto err;
}
/* Update defaults for lpass sc7280 */ /* Update defaults for lpass sc7280 */
if (of_device_is_compatible(np, "qcom,sc7280-lpass-tx-macro")) { if (of_device_is_compatible(np, "qcom,sc7280-lpass-tx-macro")) {
@ -1846,8 +1848,10 @@ static int tx_macro_probe(struct platform_device *pdev)
} }
tx->regmap = devm_regmap_init_mmio(dev, base, &tx_regmap_config); tx->regmap = devm_regmap_init_mmio(dev, base, &tx_regmap_config);
if (IS_ERR(tx->regmap)) if (IS_ERR(tx->regmap)) {
return PTR_ERR(tx->regmap); ret = PTR_ERR(tx->regmap);
goto err;
}
dev_set_drvdata(dev, tx); dev_set_drvdata(dev, tx);
@ -1907,6 +1911,8 @@ err_mclk:
err_dcodec: err_dcodec:
clk_disable_unprepare(tx->macro); clk_disable_unprepare(tx->macro);
err: err:
lpass_macro_pds_exit(tx->pds);
return ret; return ret;
} }

View File

@ -1434,8 +1434,10 @@ static int va_macro_probe(struct platform_device *pdev)
va->dmic_clk_div = VA_MACRO_CLK_DIV_2; va->dmic_clk_div = VA_MACRO_CLK_DIV_2;
} else { } else {
ret = va_macro_validate_dmic_sample_rate(sample_rate, va); ret = va_macro_validate_dmic_sample_rate(sample_rate, va);
if (!ret) if (!ret) {
return -EINVAL; ret = -EINVAL;
goto err;
}
} }
base = devm_platform_ioremap_resource(pdev, 0); base = devm_platform_ioremap_resource(pdev, 0);
@ -1492,6 +1494,8 @@ err_mclk:
err_dcodec: err_dcodec:
clk_disable_unprepare(va->macro); clk_disable_unprepare(va->macro);
err: err:
lpass_macro_pds_exit(va->pds);
return ret; return ret;
} }

View File

@ -413,6 +413,9 @@ static int max98090_put_enab_tlv(struct snd_kcontrol *kcontrol,
val = (val >> mc->shift) & mask; val = (val >> mc->shift) & mask;
if (sel < 0 || sel > mc->max)
return -EINVAL;
*select = sel; *select = sel;
/* Setting a volume is only valid if it is already On */ /* Setting a volume is only valid if it is already On */
@ -427,7 +430,7 @@ static int max98090_put_enab_tlv(struct snd_kcontrol *kcontrol,
mask << mc->shift, mask << mc->shift,
sel << mc->shift); sel << mc->shift);
return 0; return *select != val;
} }
static const char *max98090_perf_pwr_text[] = static const char *max98090_perf_pwr_text[] =

View File

@ -1206,9 +1206,16 @@ static int msm8916_wcd_digital_probe(struct platform_device *pdev)
dev_set_drvdata(dev, priv); dev_set_drvdata(dev, priv);
return devm_snd_soc_register_component(dev, &msm8916_wcd_digital, ret = devm_snd_soc_register_component(dev, &msm8916_wcd_digital,
msm8916_wcd_digital_dai, msm8916_wcd_digital_dai,
ARRAY_SIZE(msm8916_wcd_digital_dai)); ARRAY_SIZE(msm8916_wcd_digital_dai));
if (ret)
goto err_mclk;
return 0;
err_mclk:
clk_disable_unprepare(priv->mclk);
err_clk: err_clk:
clk_disable_unprepare(priv->ahbclk); clk_disable_unprepare(priv->ahbclk);
return ret; return ret;

View File

@ -489,7 +489,7 @@ static int rk817_platform_probe(struct platform_device *pdev)
rk817_codec_parse_dt_property(&pdev->dev, rk817_codec_data); rk817_codec_parse_dt_property(&pdev->dev, rk817_codec_data);
rk817_codec_data->mclk = clk_get(pdev->dev.parent, "mclk"); rk817_codec_data->mclk = devm_clk_get(pdev->dev.parent, "mclk");
if (IS_ERR(rk817_codec_data->mclk)) { if (IS_ERR(rk817_codec_data->mclk)) {
dev_dbg(&pdev->dev, "Unable to get mclk\n"); dev_dbg(&pdev->dev, "Unable to get mclk\n");
ret = -ENXIO; ret = -ENXIO;

View File

@ -1100,6 +1100,15 @@ void rt5682_jack_detect_handler(struct work_struct *work)
return; return;
} }
if (rt5682->is_sdw) {
if (pm_runtime_status_suspended(rt5682->slave->dev.parent)) {
dev_dbg(&rt5682->slave->dev,
"%s: parent device is pm_runtime_status_suspended, skipping jack detection\n",
__func__);
return;
}
}
dapm = snd_soc_component_get_dapm(rt5682->component); dapm = snd_soc_component_get_dapm(rt5682->component);
snd_soc_dapm_mutex_lock(dapm); snd_soc_dapm_mutex_lock(dapm);
@ -2822,14 +2831,11 @@ static int rt5682_bclk_set_rate(struct clk_hw *hw, unsigned long rate,
for_each_component_dais(component, dai) for_each_component_dais(component, dai)
if (dai->id == RT5682_AIF1) if (dai->id == RT5682_AIF1)
break; return rt5682_set_bclk1_ratio(dai, factor);
if (!dai) {
dev_err(rt5682->i2c_dev, "dai %d not found in component\n",
RT5682_AIF1);
return -ENODEV;
}
return rt5682_set_bclk1_ratio(dai, factor); dev_err(rt5682->i2c_dev, "dai %d not found in component\n",
RT5682_AIF1);
return -ENODEV;
} }
static const struct clk_ops rt5682_dai_clk_ops[RT5682_DAI_NUM_CLKS] = { static const struct clk_ops rt5682_dai_clk_ops[RT5682_DAI_NUM_CLKS] = {

View File

@ -2687,14 +2687,11 @@ static int rt5682s_bclk_set_rate(struct clk_hw *hw, unsigned long rate,
for_each_component_dais(component, dai) for_each_component_dais(component, dai)
if (dai->id == RT5682S_AIF1) if (dai->id == RT5682S_AIF1)
break; return rt5682s_set_bclk1_ratio(dai, factor);
if (!dai) {
dev_err(component->dev, "dai %d not found in component\n",
RT5682S_AIF1);
return -ENODEV;
}
return rt5682s_set_bclk1_ratio(dai, factor); dev_err(component->dev, "dai %d not found in component\n",
RT5682S_AIF1);
return -ENODEV;
} }
static const struct clk_ops rt5682s_dai_clk_ops[RT5682S_DAI_NUM_CLKS] = { static const struct clk_ops rt5682s_dai_clk_ops[RT5682S_DAI_NUM_CLKS] = {

View File

@ -245,6 +245,13 @@ static void rt711_jack_detect_handler(struct work_struct *work)
if (!rt711->component->card->instantiated) if (!rt711->component->card->instantiated)
return; return;
if (pm_runtime_status_suspended(rt711->slave->dev.parent)) {
dev_dbg(&rt711->slave->dev,
"%s: parent device is pm_runtime_status_suspended, skipping jack detection\n",
__func__);
return;
}
reg = RT711_VERB_GET_PIN_SENSE | RT711_HP_OUT; reg = RT711_VERB_GET_PIN_SENSE | RT711_HP_OUT;
ret = regmap_read(rt711->regmap, reg, &jack_status); ret = regmap_read(rt711->regmap, reg, &jack_status);
if (ret < 0) if (ret < 0)

View File

@ -341,7 +341,6 @@ static int rt9120_get_reg_size(unsigned int reg)
{ {
switch (reg) { switch (reg) {
case 0x00: case 0x00:
case 0x09:
case 0x20 ... 0x27: case 0x20 ... 0x27:
return 2; return 2;
case 0x30 ... 0x3D: case 0x30 ... 0x3D:

View File

@ -1274,29 +1274,7 @@ static int wcd934x_set_sido_input_src(struct wcd934x_codec *wcd, int sido_src)
if (sido_src == wcd->sido_input_src) if (sido_src == wcd->sido_input_src)
return 0; return 0;
if (sido_src == SIDO_SOURCE_INTERNAL) { if (sido_src == SIDO_SOURCE_RCO_BG) {
regmap_update_bits(wcd->regmap, WCD934X_ANA_BUCK_CTL,
WCD934X_ANA_BUCK_HI_ACCU_EN_MASK, 0);
usleep_range(100, 110);
regmap_update_bits(wcd->regmap, WCD934X_ANA_BUCK_CTL,
WCD934X_ANA_BUCK_HI_ACCU_PRE_ENX_MASK, 0x0);
usleep_range(100, 110);
regmap_update_bits(wcd->regmap, WCD934X_ANA_RCO,
WCD934X_ANA_RCO_BG_EN_MASK, 0);
usleep_range(100, 110);
regmap_update_bits(wcd->regmap, WCD934X_ANA_BUCK_CTL,
WCD934X_ANA_BUCK_PRE_EN1_MASK,
WCD934X_ANA_BUCK_PRE_EN1_ENABLE);
usleep_range(100, 110);
regmap_update_bits(wcd->regmap, WCD934X_ANA_BUCK_CTL,
WCD934X_ANA_BUCK_PRE_EN2_MASK,
WCD934X_ANA_BUCK_PRE_EN2_ENABLE);
usleep_range(100, 110);
regmap_update_bits(wcd->regmap, WCD934X_ANA_BUCK_CTL,
WCD934X_ANA_BUCK_HI_ACCU_EN_MASK,
WCD934X_ANA_BUCK_HI_ACCU_ENABLE);
usleep_range(100, 110);
} else if (sido_src == SIDO_SOURCE_RCO_BG) {
regmap_update_bits(wcd->regmap, WCD934X_ANA_RCO, regmap_update_bits(wcd->regmap, WCD934X_ANA_RCO,
WCD934X_ANA_RCO_BG_EN_MASK, WCD934X_ANA_RCO_BG_EN_MASK,
WCD934X_ANA_RCO_BG_ENABLE); WCD934X_ANA_RCO_BG_ENABLE);
@ -1382,8 +1360,6 @@ static int wcd934x_disable_ana_bias_and_syclk(struct wcd934x_codec *wcd)
regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG, regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG,
WCD934X_EXT_CLK_BUF_EN_MASK | WCD934X_EXT_CLK_BUF_EN_MASK |
WCD934X_MCLK_EN_MASK, 0x0); WCD934X_MCLK_EN_MASK, 0x0);
wcd934x_set_sido_input_src(wcd, SIDO_SOURCE_INTERNAL);
regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS, regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
WCD934X_ANA_BIAS_EN_MASK, 0); WCD934X_ANA_BIAS_EN_MASK, 0);
regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS, regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,

View File

@ -602,7 +602,7 @@ static int wm8731_hw_init(struct device *dev, struct wm8731_priv *wm8731)
ret = wm8731_reset(wm8731->regmap); ret = wm8731_reset(wm8731->regmap);
if (ret < 0) { if (ret < 0) {
dev_err(dev, "Failed to issue reset: %d\n", ret); dev_err(dev, "Failed to issue reset: %d\n", ret);
goto err_regulator_enable; goto err;
} }
/* Clear POWEROFF, keep everything else disabled */ /* Clear POWEROFF, keep everything else disabled */
@ -619,10 +619,7 @@ static int wm8731_hw_init(struct device *dev, struct wm8731_priv *wm8731)
regcache_mark_dirty(wm8731->regmap); regcache_mark_dirty(wm8731->regmap);
err_regulator_enable: err:
/* Regulators will be enabled by bias management */
regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies);
return ret; return ret;
} }
@ -760,21 +757,27 @@ static int wm8731_i2c_probe(struct i2c_client *i2c,
ret = PTR_ERR(wm8731->regmap); ret = PTR_ERR(wm8731->regmap);
dev_err(&i2c->dev, "Failed to allocate register map: %d\n", dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
ret); ret);
return ret; goto err_regulator_enable;
} }
ret = wm8731_hw_init(&i2c->dev, wm8731); ret = wm8731_hw_init(&i2c->dev, wm8731);
if (ret != 0) if (ret != 0)
return ret; goto err_regulator_enable;
ret = devm_snd_soc_register_component(&i2c->dev, ret = devm_snd_soc_register_component(&i2c->dev,
&soc_component_dev_wm8731, &wm8731_dai, 1); &soc_component_dev_wm8731, &wm8731_dai, 1);
if (ret != 0) { if (ret != 0) {
dev_err(&i2c->dev, "Failed to register CODEC: %d\n", ret); dev_err(&i2c->dev, "Failed to register CODEC: %d\n", ret);
return ret; goto err_regulator_enable;
} }
return 0; return 0;
err_regulator_enable:
/* Regulators will be enabled by bias management */
regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies);
return ret;
} }
static const struct i2c_device_id wm8731_i2c_id[] = { static const struct i2c_device_id wm8731_i2c_id[] = {

View File

@ -530,7 +530,7 @@ static int wm8958_mbc_put(struct snd_kcontrol *kcontrol,
wm8958_dsp_apply(component, mbc, wm8994->mbc_ena[mbc]); wm8958_dsp_apply(component, mbc, wm8994->mbc_ena[mbc]);
return 0; return 1;
} }
#define WM8958_MBC_SWITCH(xname, xval) {\ #define WM8958_MBC_SWITCH(xname, xval) {\
@ -656,7 +656,7 @@ static int wm8958_vss_put(struct snd_kcontrol *kcontrol,
wm8958_dsp_apply(component, vss, wm8994->vss_ena[vss]); wm8958_dsp_apply(component, vss, wm8994->vss_ena[vss]);
return 0; return 1;
} }
@ -730,7 +730,7 @@ static int wm8958_hpf_put(struct snd_kcontrol *kcontrol,
wm8958_dsp_apply(component, hpf % 3, ucontrol->value.integer.value[0]); wm8958_dsp_apply(component, hpf % 3, ucontrol->value.integer.value[0]);
return 0; return 1;
} }
#define WM8958_HPF_SWITCH(xname, xval) {\ #define WM8958_HPF_SWITCH(xname, xval) {\
@ -824,7 +824,7 @@ static int wm8958_enh_eq_put(struct snd_kcontrol *kcontrol,
wm8958_dsp_apply(component, eq, ucontrol->value.integer.value[0]); wm8958_dsp_apply(component, eq, ucontrol->value.integer.value[0]);
return 0; return 1;
} }
#define WM8958_ENH_EQ_SWITCH(xname, xval) {\ #define WM8958_ENH_EQ_SWITCH(xname, xval) {\

View File

@ -97,13 +97,13 @@ struct wm_adsp_system_config_xm_hdr {
__be32 wdma[8]; __be32 wdma[8];
__be32 build_job_name[3]; __be32 build_job_name[3];
__be32 build_job_number; __be32 build_job_number;
}; } __packed;
struct wm_halo_system_config_xm_hdr { struct wm_halo_system_config_xm_hdr {
__be32 halo_heartbeat; __be32 halo_heartbeat;
__be32 build_job_name[3]; __be32 build_job_name[3];
__be32 build_job_number; __be32 build_job_number;
}; } __packed;
struct wm_adsp_alg_xm_struct { struct wm_adsp_alg_xm_struct {
__be32 magic; __be32 magic;
@ -114,13 +114,13 @@ struct wm_adsp_alg_xm_struct {
__be32 high_water_mark; __be32 high_water_mark;
__be32 low_water_mark; __be32 low_water_mark;
__be64 smoothed_power; __be64 smoothed_power;
}; } __packed;
struct wm_adsp_host_buf_coeff_v1 { struct wm_adsp_host_buf_coeff_v1 {
__be32 host_buf_ptr; /* Host buffer pointer */ __be32 host_buf_ptr; /* Host buffer pointer */
__be32 versions; /* Version numbers */ __be32 versions; /* Version numbers */
__be32 name[4]; /* The buffer name */ __be32 name[4]; /* The buffer name */
}; } __packed;
struct wm_adsp_buffer { struct wm_adsp_buffer {
__be32 buf1_base; /* Base addr of first buffer area */ __be32 buf1_base; /* Base addr of first buffer area */
@ -141,7 +141,7 @@ struct wm_adsp_buffer {
__be32 min_free; /* min free space since stream start */ __be32 min_free; /* min free space since stream start */
__be32 blocks_written[2]; /* total blocks written (64 bit) */ __be32 blocks_written[2]; /* total blocks written (64 bit) */
__be32 words_written[2]; /* total words written (64 bit) */ __be32 words_written[2]; /* total words written (64 bit) */
}; } __packed;
struct wm_adsp_compr; struct wm_adsp_compr;

View File

@ -372,7 +372,7 @@ static int fsl_sai_set_bclk(struct snd_soc_dai *dai, bool tx, u32 freq)
continue; continue;
if (ratio == 1 && !support_1_1_ratio) if (ratio == 1 && !support_1_1_ratio)
continue; continue;
else if (ratio & 1) if ((ratio & 1) && ratio > 1)
continue; continue;
diff = abs((long)clk_rate - ratio * freq); diff = abs((long)clk_rate - ratio * freq);

View File

@ -322,7 +322,7 @@ void asoc_simple_shutdown(struct snd_pcm_substream *substream)
if (props->mclk_fs && !dai->clk_fixed && !snd_soc_dai_active(cpu_dai)) if (props->mclk_fs && !dai->clk_fixed && !snd_soc_dai_active(cpu_dai))
snd_soc_dai_set_sysclk(cpu_dai, snd_soc_dai_set_sysclk(cpu_dai,
0, 0, SND_SOC_CLOCK_IN); 0, 0, SND_SOC_CLOCK_OUT);
asoc_simple_clk_disable(dai); asoc_simple_clk_disable(dai);
} }
@ -364,13 +364,15 @@ static int asoc_simple_set_tdm(struct snd_soc_dai *dai,
struct snd_pcm_hw_params *params) struct snd_pcm_hw_params *params)
{ {
int sample_bits = params_width(params); int sample_bits = params_width(params);
int slot_width = simple_dai->slot_width; int slot_width, slot_count;
int slot_count = simple_dai->slots;
int i, ret; int i, ret;
if (!simple_dai || !simple_dai->tdm_width_map) if (!simple_dai || !simple_dai->tdm_width_map)
return 0; return 0;
slot_width = simple_dai->slot_width;
slot_count = simple_dai->slots;
if (slot_width == 0) if (slot_width == 0)
slot_width = sample_bits; slot_width = sample_bits;

View File

@ -27,9 +27,11 @@
#define SOF_ES8336_SSP_CODEC(quirk) ((quirk) & GENMASK(3, 0)) #define SOF_ES8336_SSP_CODEC(quirk) ((quirk) & GENMASK(3, 0))
#define SOF_ES8336_SSP_CODEC_MASK (GENMASK(3, 0)) #define SOF_ES8336_SSP_CODEC_MASK (GENMASK(3, 0))
#define SOF_ES8336_TGL_GPIO_QUIRK BIT(4) #define SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK BIT(4)
#define SOF_ES8336_ENABLE_DMIC BIT(5) #define SOF_ES8336_ENABLE_DMIC BIT(5)
#define SOF_ES8336_JD_INVERTED BIT(6) #define SOF_ES8336_JD_INVERTED BIT(6)
#define SOF_ES8336_HEADPHONE_GPIO BIT(7)
#define SOC_ES8336_HEADSET_MIC1 BIT(8)
static unsigned long quirk; static unsigned long quirk;
@ -39,7 +41,7 @@ MODULE_PARM_DESC(quirk, "Board-specific quirk override");
struct sof_es8336_private { struct sof_es8336_private {
struct device *codec_dev; struct device *codec_dev;
struct gpio_desc *gpio_pa; struct gpio_desc *gpio_speakers, *gpio_headphone;
struct snd_soc_jack jack; struct snd_soc_jack jack;
struct list_head hdmi_pcm_list; struct list_head hdmi_pcm_list;
bool speaker_en; bool speaker_en;
@ -51,19 +53,31 @@ struct sof_hdmi_pcm {
int device; int device;
}; };
static const struct acpi_gpio_params pa_enable_gpio = { 0, 0, true }; static const struct acpi_gpio_params enable_gpio0 = { 0, 0, true };
static const struct acpi_gpio_mapping acpi_es8336_gpios[] = { static const struct acpi_gpio_params enable_gpio1 = { 1, 0, true };
{ "pa-enable-gpios", &pa_enable_gpio, 1 },
static const struct acpi_gpio_mapping acpi_speakers_enable_gpio0[] = {
{ "speakers-enable-gpios", &enable_gpio0, 1 },
{ } { }
}; };
static const struct acpi_gpio_params quirk_pa_enable_gpio = { 1, 0, true }; static const struct acpi_gpio_mapping acpi_speakers_enable_gpio1[] = {
static const struct acpi_gpio_mapping quirk_acpi_es8336_gpios[] = { { "speakers-enable-gpios", &enable_gpio1, 1 },
{ "pa-enable-gpios", &quirk_pa_enable_gpio, 1 }, };
static const struct acpi_gpio_mapping acpi_enable_both_gpios[] = {
{ "speakers-enable-gpios", &enable_gpio0, 1 },
{ "headphone-enable-gpios", &enable_gpio1, 1 },
{ } { }
}; };
static const struct acpi_gpio_mapping *gpio_mapping = acpi_es8336_gpios; static const struct acpi_gpio_mapping acpi_enable_both_gpios_rev_order[] = {
{ "speakers-enable-gpios", &enable_gpio1, 1 },
{ "headphone-enable-gpios", &enable_gpio0, 1 },
{ }
};
static const struct acpi_gpio_mapping *gpio_mapping = acpi_speakers_enable_gpio0;
static void log_quirks(struct device *dev) static void log_quirks(struct device *dev)
{ {
@ -71,10 +85,14 @@ static void log_quirks(struct device *dev)
dev_info(dev, "quirk SSP%ld\n", SOF_ES8336_SSP_CODEC(quirk)); dev_info(dev, "quirk SSP%ld\n", SOF_ES8336_SSP_CODEC(quirk));
if (quirk & SOF_ES8336_ENABLE_DMIC) if (quirk & SOF_ES8336_ENABLE_DMIC)
dev_info(dev, "quirk DMIC enabled\n"); dev_info(dev, "quirk DMIC enabled\n");
if (quirk & SOF_ES8336_TGL_GPIO_QUIRK) if (quirk & SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK)
dev_info(dev, "quirk TGL GPIO enabled\n"); dev_info(dev, "Speakers GPIO1 quirk enabled\n");
if (quirk & SOF_ES8336_HEADPHONE_GPIO)
dev_info(dev, "quirk headphone GPIO enabled\n");
if (quirk & SOF_ES8336_JD_INVERTED) if (quirk & SOF_ES8336_JD_INVERTED)
dev_info(dev, "quirk JD inverted enabled\n"); dev_info(dev, "quirk JD inverted enabled\n");
if (quirk & SOC_ES8336_HEADSET_MIC1)
dev_info(dev, "quirk headset at mic1 port enabled\n");
} }
static int sof_es8316_speaker_power_event(struct snd_soc_dapm_widget *w, static int sof_es8316_speaker_power_event(struct snd_soc_dapm_widget *w,
@ -83,12 +101,23 @@ static int sof_es8316_speaker_power_event(struct snd_soc_dapm_widget *w,
struct snd_soc_card *card = w->dapm->card; struct snd_soc_card *card = w->dapm->card;
struct sof_es8336_private *priv = snd_soc_card_get_drvdata(card); struct sof_es8336_private *priv = snd_soc_card_get_drvdata(card);
if (SND_SOC_DAPM_EVENT_ON(event)) if (priv->speaker_en == !SND_SOC_DAPM_EVENT_ON(event))
priv->speaker_en = false; return 0;
else
priv->speaker_en = true;
gpiod_set_value_cansleep(priv->gpio_pa, priv->speaker_en); priv->speaker_en = !SND_SOC_DAPM_EVENT_ON(event);
if (SND_SOC_DAPM_EVENT_ON(event))
msleep(70);
gpiod_set_value_cansleep(priv->gpio_speakers, priv->speaker_en);
if (!(quirk & SOF_ES8336_HEADPHONE_GPIO))
return 0;
if (SND_SOC_DAPM_EVENT_ON(event))
msleep(70);
gpiod_set_value_cansleep(priv->gpio_headphone, priv->speaker_en);
return 0; return 0;
} }
@ -114,18 +143,23 @@ static const struct snd_soc_dapm_route sof_es8316_audio_map[] = {
/* /*
* There is no separate speaker output instead the speakers are muxed to * There is no separate speaker output instead the speakers are muxed to
* the HP outputs. The mux is controlled by the "Speaker Power" supply. * the HP outputs. The mux is controlled Speaker and/or headphone switch.
*/ */
{"Speaker", NULL, "HPOL"}, {"Speaker", NULL, "HPOL"},
{"Speaker", NULL, "HPOR"}, {"Speaker", NULL, "HPOR"},
{"Speaker", NULL, "Speaker Power"}, {"Speaker", NULL, "Speaker Power"},
}; };
static const struct snd_soc_dapm_route sof_es8316_intmic_in1_map[] = { static const struct snd_soc_dapm_route sof_es8316_headset_mic2_map[] = {
{"MIC1", NULL, "Internal Mic"}, {"MIC1", NULL, "Internal Mic"},
{"MIC2", NULL, "Headset Mic"}, {"MIC2", NULL, "Headset Mic"},
}; };
static const struct snd_soc_dapm_route sof_es8316_headset_mic1_map[] = {
{"MIC2", NULL, "Internal Mic"},
{"MIC1", NULL, "Headset Mic"},
};
static const struct snd_soc_dapm_route dmic_map[] = { static const struct snd_soc_dapm_route dmic_map[] = {
/* digital mics */ /* digital mics */
{"DMic", NULL, "SoC DMIC"}, {"DMic", NULL, "SoC DMIC"},
@ -199,8 +233,13 @@ static int sof_es8316_init(struct snd_soc_pcm_runtime *runtime)
card->dapm.idle_bias_off = true; card->dapm.idle_bias_off = true;
custom_map = sof_es8316_intmic_in1_map; if (quirk & SOC_ES8336_HEADSET_MIC1) {
num_routes = ARRAY_SIZE(sof_es8316_intmic_in1_map); custom_map = sof_es8316_headset_mic1_map;
num_routes = ARRAY_SIZE(sof_es8316_headset_mic1_map);
} else {
custom_map = sof_es8316_headset_mic2_map;
num_routes = ARRAY_SIZE(sof_es8316_headset_mic2_map);
}
ret = snd_soc_dapm_add_routes(&card->dapm, custom_map, num_routes); ret = snd_soc_dapm_add_routes(&card->dapm, custom_map, num_routes);
if (ret) if (ret)
@ -233,8 +272,14 @@ static int sof_es8336_quirk_cb(const struct dmi_system_id *id)
{ {
quirk = (unsigned long)id->driver_data; quirk = (unsigned long)id->driver_data;
if (quirk & SOF_ES8336_TGL_GPIO_QUIRK) if (quirk & SOF_ES8336_HEADPHONE_GPIO) {
gpio_mapping = quirk_acpi_es8336_gpios; if (quirk & SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK)
gpio_mapping = acpi_enable_both_gpios;
else
gpio_mapping = acpi_enable_both_gpios_rev_order;
} else if (quirk & SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK) {
gpio_mapping = acpi_speakers_enable_gpio1;
}
return 1; return 1;
} }
@ -257,7 +302,16 @@ static const struct dmi_system_id sof_es8336_quirk_table[] = {
DMI_MATCH(DMI_SYS_VENDOR, "IP3 tech"), DMI_MATCH(DMI_SYS_VENDOR, "IP3 tech"),
DMI_MATCH(DMI_BOARD_NAME, "WN1"), DMI_MATCH(DMI_BOARD_NAME, "WN1"),
}, },
.driver_data = (void *)(SOF_ES8336_TGL_GPIO_QUIRK) .driver_data = (void *)(SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK)
},
{
.callback = sof_es8336_quirk_cb,
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "HUAWEI"),
DMI_MATCH(DMI_BOARD_NAME, "BOHB-WAX9-PCB-B2"),
},
.driver_data = (void *)(SOF_ES8336_HEADPHONE_GPIO |
SOC_ES8336_HEADSET_MIC1)
}, },
{} {}
}; };
@ -585,10 +639,17 @@ static int sof_es8336_probe(struct platform_device *pdev)
if (ret) if (ret)
dev_warn(codec_dev, "unable to add GPIO mapping table\n"); dev_warn(codec_dev, "unable to add GPIO mapping table\n");
priv->gpio_pa = gpiod_get_optional(codec_dev, "pa-enable", GPIOD_OUT_LOW); priv->gpio_speakers = gpiod_get_optional(codec_dev, "speakers-enable", GPIOD_OUT_LOW);
if (IS_ERR(priv->gpio_pa)) { if (IS_ERR(priv->gpio_speakers)) {
ret = dev_err_probe(dev, PTR_ERR(priv->gpio_pa), ret = dev_err_probe(dev, PTR_ERR(priv->gpio_speakers),
"could not get pa-enable GPIO\n"); "could not get speakers-enable GPIO\n");
goto err_put_codec;
}
priv->gpio_headphone = gpiod_get_optional(codec_dev, "headphone-enable", GPIOD_OUT_LOW);
if (IS_ERR(priv->gpio_headphone)) {
ret = dev_err_probe(dev, PTR_ERR(priv->gpio_headphone),
"could not get headphone-enable GPIO\n");
goto err_put_codec; goto err_put_codec;
} }
@ -604,7 +665,7 @@ static int sof_es8336_probe(struct platform_device *pdev)
ret = devm_snd_soc_register_card(dev, card); ret = devm_snd_soc_register_card(dev, card);
if (ret) { if (ret) {
gpiod_put(priv->gpio_pa); gpiod_put(priv->gpio_speakers);
dev_err(dev, "snd_soc_register_card failed: %d\n", ret); dev_err(dev, "snd_soc_register_card failed: %d\n", ret);
goto err_put_codec; goto err_put_codec;
} }
@ -622,7 +683,7 @@ static int sof_es8336_remove(struct platform_device *pdev)
struct snd_soc_card *card = platform_get_drvdata(pdev); struct snd_soc_card *card = platform_get_drvdata(pdev);
struct sof_es8336_private *priv = snd_soc_card_get_drvdata(card); struct sof_es8336_private *priv = snd_soc_card_get_drvdata(card);
gpiod_put(priv->gpio_pa); gpiod_put(priv->gpio_speakers);
device_remove_software_node(priv->codec_dev); device_remove_software_node(priv->codec_dev);
put_device(priv->codec_dev); put_device(priv->codec_dev);

View File

@ -212,6 +212,19 @@ static const struct dmi_system_id sof_rt5682_quirk_table[] = {
SOF_SSP_BT_OFFLOAD_PRESENT), SOF_SSP_BT_OFFLOAD_PRESENT),
}, },
{
.callback = sof_rt5682_quirk_cb,
.matches = {
DMI_MATCH(DMI_PRODUCT_FAMILY, "Google_Brya"),
DMI_MATCH(DMI_OEM_STRING, "AUDIO-MAX98360_ALC5682I_I2S_AMP_SSP2"),
},
.driver_data = (void *)(SOF_RT5682_MCLK_EN |
SOF_RT5682_SSP_CODEC(0) |
SOF_SPEAKER_AMP_PRESENT |
SOF_MAX98360A_SPEAKER_AMP_PRESENT |
SOF_RT5682_SSP_AMP(2) |
SOF_RT5682_NUM_HDMIDEV(4)),
},
{} {}
}; };

View File

@ -132,13 +132,13 @@ static const struct snd_soc_acpi_adr_device mx8373_1_adr[] = {
{ {
.adr = 0x000123019F837300ull, .adr = 0x000123019F837300ull,
.num_endpoints = 1, .num_endpoints = 1,
.endpoints = &spk_l_endpoint, .endpoints = &spk_r_endpoint,
.name_prefix = "Right" .name_prefix = "Right"
}, },
{ {
.adr = 0x000127019F837300ull, .adr = 0x000127019F837300ull,
.num_endpoints = 1, .num_endpoints = 1,
.endpoints = &spk_r_endpoint, .endpoints = &spk_l_endpoint,
.name_prefix = "Left" .name_prefix = "Left"
} }
}; };

View File

@ -58,7 +58,7 @@ static int aiu_acodec_ctrl_mux_put_enum(struct snd_kcontrol *kcontrol,
snd_soc_dapm_mux_update_power(dapm, kcontrol, mux, e, NULL); snd_soc_dapm_mux_update_power(dapm, kcontrol, mux, e, NULL);
return 0; return 1;
} }
static SOC_ENUM_SINGLE_DECL(aiu_acodec_ctrl_mux_enum, AIU_ACODEC_CTRL, static SOC_ENUM_SINGLE_DECL(aiu_acodec_ctrl_mux_enum, AIU_ACODEC_CTRL,
@ -193,6 +193,9 @@ static const struct snd_soc_component_driver aiu_acodec_ctrl_component = {
.of_xlate_dai_name = aiu_acodec_of_xlate_dai_name, .of_xlate_dai_name = aiu_acodec_of_xlate_dai_name,
.endianness = 1, .endianness = 1,
.non_legacy_dai_naming = 1, .non_legacy_dai_naming = 1,
#ifdef CONFIG_DEBUG_FS
.debugfs_prefix = "acodec",
#endif
}; };
int aiu_acodec_ctrl_register_component(struct device *dev) int aiu_acodec_ctrl_register_component(struct device *dev)

View File

@ -57,7 +57,7 @@ static int aiu_codec_ctrl_mux_put_enum(struct snd_kcontrol *kcontrol,
snd_soc_dapm_mux_update_power(dapm, kcontrol, mux, e, NULL); snd_soc_dapm_mux_update_power(dapm, kcontrol, mux, e, NULL);
return 0; return 1;
} }
static SOC_ENUM_SINGLE_DECL(aiu_hdmi_ctrl_mux_enum, AIU_HDMI_CLK_DATA_CTRL, static SOC_ENUM_SINGLE_DECL(aiu_hdmi_ctrl_mux_enum, AIU_HDMI_CLK_DATA_CTRL,
@ -140,6 +140,9 @@ static const struct snd_soc_component_driver aiu_hdmi_ctrl_component = {
.of_xlate_dai_name = aiu_hdmi_of_xlate_dai_name, .of_xlate_dai_name = aiu_hdmi_of_xlate_dai_name,
.endianness = 1, .endianness = 1,
.non_legacy_dai_naming = 1, .non_legacy_dai_naming = 1,
#ifdef CONFIG_DEBUG_FS
.debugfs_prefix = "hdmi",
#endif
}; };
int aiu_hdmi_ctrl_register_component(struct device *dev) int aiu_hdmi_ctrl_register_component(struct device *dev)

View File

@ -103,6 +103,9 @@ static const struct snd_soc_component_driver aiu_cpu_component = {
.pointer = aiu_fifo_pointer, .pointer = aiu_fifo_pointer,
.probe = aiu_cpu_component_probe, .probe = aiu_cpu_component_probe,
.remove = aiu_cpu_component_remove, .remove = aiu_cpu_component_remove,
#ifdef CONFIG_DEBUG_FS
.debugfs_prefix = "cpu",
#endif
}; };
static struct snd_soc_dai_driver aiu_cpu_dai_drv[] = { static struct snd_soc_dai_driver aiu_cpu_dai_drv[] = {

View File

@ -320,7 +320,6 @@ static int axg_card_add_link(struct snd_soc_card *card, struct device_node *np,
dai_link->cpus = cpu; dai_link->cpus = cpu;
dai_link->num_cpus = 1; dai_link->num_cpus = 1;
dai_link->nonatomic = true;
ret = meson_card_parse_dai(card, np, &dai_link->cpus->of_node, ret = meson_card_parse_dai(card, np, &dai_link->cpus->of_node,
&dai_link->cpus->dai_name); &dai_link->cpus->dai_name);

View File

@ -351,29 +351,13 @@ static int axg_tdm_iface_hw_free(struct snd_pcm_substream *substream,
return 0; return 0;
} }
static int axg_tdm_iface_trigger(struct snd_pcm_substream *substream, static int axg_tdm_iface_prepare(struct snd_pcm_substream *substream,
int cmd,
struct snd_soc_dai *dai) struct snd_soc_dai *dai)
{ {
struct axg_tdm_stream *ts = struct axg_tdm_stream *ts = snd_soc_dai_get_dma_data(dai, substream);
snd_soc_dai_get_dma_data(dai, substream);
switch (cmd) { /* Force all attached formatters to update */
case SNDRV_PCM_TRIGGER_START: return axg_tdm_stream_reset(ts);
case SNDRV_PCM_TRIGGER_RESUME:
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
axg_tdm_stream_start(ts);
break;
case SNDRV_PCM_TRIGGER_SUSPEND:
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
case SNDRV_PCM_TRIGGER_STOP:
axg_tdm_stream_stop(ts);
break;
default:
return -EINVAL;
}
return 0;
} }
static int axg_tdm_iface_remove_dai(struct snd_soc_dai *dai) static int axg_tdm_iface_remove_dai(struct snd_soc_dai *dai)
@ -413,8 +397,8 @@ static const struct snd_soc_dai_ops axg_tdm_iface_ops = {
.set_fmt = axg_tdm_iface_set_fmt, .set_fmt = axg_tdm_iface_set_fmt,
.startup = axg_tdm_iface_startup, .startup = axg_tdm_iface_startup,
.hw_params = axg_tdm_iface_hw_params, .hw_params = axg_tdm_iface_hw_params,
.prepare = axg_tdm_iface_prepare,
.hw_free = axg_tdm_iface_hw_free, .hw_free = axg_tdm_iface_hw_free,
.trigger = axg_tdm_iface_trigger,
}; };
/* TDM Backend DAIs */ /* TDM Backend DAIs */

View File

@ -67,7 +67,7 @@ static int g12a_tohdmitx_i2s_mux_put_enum(struct snd_kcontrol *kcontrol,
snd_soc_dapm_mux_update_power(dapm, kcontrol, mux, e, NULL); snd_soc_dapm_mux_update_power(dapm, kcontrol, mux, e, NULL);
return 0; return 1;
} }
static SOC_ENUM_SINGLE_DECL(g12a_tohdmitx_i2s_mux_enum, TOHDMITX_CTRL0, static SOC_ENUM_SINGLE_DECL(g12a_tohdmitx_i2s_mux_enum, TOHDMITX_CTRL0,

View File

@ -2587,6 +2587,11 @@ int snd_soc_component_initialize(struct snd_soc_component *component,
component->dev = dev; component->dev = dev;
component->driver = driver; component->driver = driver;
#ifdef CONFIG_DEBUG_FS
if (!component->debugfs_prefix)
component->debugfs_prefix = driver->debugfs_prefix;
#endif
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(snd_soc_component_initialize); EXPORT_SYMBOL_GPL(snd_soc_component_initialize);

View File

@ -1687,8 +1687,7 @@ static void dapm_seq_run(struct snd_soc_card *card,
switch (w->id) { switch (w->id) {
case snd_soc_dapm_pre: case snd_soc_dapm_pre:
if (!w->event) if (!w->event)
list_for_each_entry_safe_continue(w, n, list, continue;
power_list);
if (event == SND_SOC_DAPM_STREAM_START) if (event == SND_SOC_DAPM_STREAM_START)
ret = w->event(w, ret = w->event(w,
@ -1700,8 +1699,7 @@ static void dapm_seq_run(struct snd_soc_card *card,
case snd_soc_dapm_post: case snd_soc_dapm_post:
if (!w->event) if (!w->event)
list_for_each_entry_safe_continue(w, n, list, continue;
power_list);
if (event == SND_SOC_DAPM_STREAM_START) if (event == SND_SOC_DAPM_STREAM_START)
ret = w->event(w, ret = w->event(w,

View File

@ -86,10 +86,10 @@ static int dmaengine_pcm_hw_params(struct snd_soc_component *component,
memset(&slave_config, 0, sizeof(slave_config)); memset(&slave_config, 0, sizeof(slave_config));
if (pcm->config && pcm->config->prepare_slave_config) if (!pcm->config)
prepare_slave_config = pcm->config->prepare_slave_config;
else
prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config; prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config;
else
prepare_slave_config = pcm->config->prepare_slave_config;
if (prepare_slave_config) { if (prepare_slave_config) {
int ret = prepare_slave_config(substream, params, &slave_config); int ret = prepare_slave_config(substream, params, &slave_config);

View File

@ -461,7 +461,7 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,
ret = err; ret = err;
} }
} }
return err; return ret;
} }
EXPORT_SYMBOL_GPL(snd_soc_put_volsw_sx); EXPORT_SYMBOL_GPL(snd_soc_put_volsw_sx);
@ -519,7 +519,15 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
unsigned int mask = (1 << fls(max)) - 1; unsigned int mask = (1 << fls(max)) - 1;
unsigned int invert = mc->invert; unsigned int invert = mc->invert;
unsigned int val, val_mask; unsigned int val, val_mask;
int err, ret; int err, ret, tmp;
tmp = ucontrol->value.integer.value[0];
if (tmp < 0)
return -EINVAL;
if (mc->platform_max && tmp > mc->platform_max)
return -EINVAL;
if (tmp > mc->max - mc->min + 1)
return -EINVAL;
if (invert) if (invert)
val = (max - ucontrol->value.integer.value[0]) & mask; val = (max - ucontrol->value.integer.value[0]) & mask;
@ -534,6 +542,14 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
ret = err; ret = err;
if (snd_soc_volsw_is_stereo(mc)) { if (snd_soc_volsw_is_stereo(mc)) {
tmp = ucontrol->value.integer.value[1];
if (tmp < 0)
return -EINVAL;
if (mc->platform_max && tmp > mc->platform_max)
return -EINVAL;
if (tmp > mc->max - mc->min + 1)
return -EINVAL;
if (invert) if (invert)
val = (max - ucontrol->value.integer.value[1]) & mask; val = (max - ucontrol->value.integer.value[1]) & mask;
else else

View File

@ -1214,7 +1214,7 @@ static int dpcm_be_connect(struct snd_soc_pcm_runtime *fe,
be_substream->pcm->nonatomic = 1; be_substream->pcm->nonatomic = 1;
} }
dpcm = kzalloc(sizeof(struct snd_soc_dpcm), GFP_ATOMIC); dpcm = kzalloc(sizeof(struct snd_soc_dpcm), GFP_KERNEL);
if (!dpcm) if (!dpcm)
return -ENOMEM; return -ENOMEM;

View File

@ -1436,12 +1436,12 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg,
template.num_kcontrols = le32_to_cpu(w->num_kcontrols); template.num_kcontrols = le32_to_cpu(w->num_kcontrols);
kc = devm_kcalloc(tplg->dev, le32_to_cpu(w->num_kcontrols), sizeof(*kc), GFP_KERNEL); kc = devm_kcalloc(tplg->dev, le32_to_cpu(w->num_kcontrols), sizeof(*kc), GFP_KERNEL);
if (!kc) if (!kc)
goto err; goto hdr_err;
kcontrol_type = devm_kcalloc(tplg->dev, le32_to_cpu(w->num_kcontrols), sizeof(unsigned int), kcontrol_type = devm_kcalloc(tplg->dev, le32_to_cpu(w->num_kcontrols), sizeof(unsigned int),
GFP_KERNEL); GFP_KERNEL);
if (!kcontrol_type) if (!kcontrol_type)
goto err; goto hdr_err;
for (i = 0; i < le32_to_cpu(w->num_kcontrols); i++) { for (i = 0; i < le32_to_cpu(w->num_kcontrols); i++) {
control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos; control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos;

View File

@ -83,7 +83,14 @@ static const struct dmi_system_id sof_tplg_table[] = {
}, },
.driver_data = "sof-adl-max98357a-rt5682-2way.tplg", .driver_data = "sof-adl-max98357a-rt5682-2way.tplg",
}, },
{
.callback = sof_tplg_cb,
.matches = {
DMI_MATCH(DMI_PRODUCT_FAMILY, "Google_Brya"),
DMI_MATCH(DMI_OEM_STRING, "AUDIO-MAX98360_ALC5682I_I2S_AMP_SSP2"),
},
.driver_data = "sof-adl-max98357a-rt5682.tplg",
},
{} {}
}; };
@ -146,6 +153,11 @@ int sof_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id)
dev_dbg(&pci->dev, "PCI DSP detected"); dev_dbg(&pci->dev, "PCI DSP detected");
if (!desc) {
dev_err(dev, "error: no matching PCI descriptor\n");
return -ENODEV;
}
if (!desc->ops) { if (!desc->ops) {
dev_err(dev, "error: no matching PCI descriptor ops\n"); dev_err(dev, "error: no matching PCI descriptor ops\n");
return -ENODEV; return -ENODEV;

View File

@ -904,8 +904,10 @@ static int sof_control_load(struct snd_soc_component *scomp, int index,
return -ENOMEM; return -ENOMEM;
scontrol->name = kstrdup(hdr->name, GFP_KERNEL); scontrol->name = kstrdup(hdr->name, GFP_KERNEL);
if (!scontrol->name) if (!scontrol->name) {
kfree(scontrol);
return -ENOMEM; return -ENOMEM;
}
scontrol->scomp = scomp; scontrol->scomp = scomp;
scontrol->access = kc->access; scontrol->access = kc->access;
@ -941,11 +943,13 @@ static int sof_control_load(struct snd_soc_component *scomp, int index,
default: default:
dev_warn(scomp->dev, "control type not supported %d:%d:%d\n", dev_warn(scomp->dev, "control type not supported %d:%d:%d\n",
hdr->ops.get, hdr->ops.put, hdr->ops.info); hdr->ops.get, hdr->ops.put, hdr->ops.info);
kfree(scontrol->name);
kfree(scontrol); kfree(scontrol);
return 0; return 0;
} }
if (ret < 0) { if (ret < 0) {
kfree(scontrol->name);
kfree(scontrol); kfree(scontrol);
return ret; return ret;
} }
@ -1068,6 +1072,46 @@ static int sof_connect_dai_widget(struct snd_soc_component *scomp,
return 0; return 0;
} }
static void sof_disconnect_dai_widget(struct snd_soc_component *scomp,
struct snd_soc_dapm_widget *w)
{
struct snd_soc_card *card = scomp->card;
struct snd_soc_pcm_runtime *rtd;
struct snd_soc_dai *cpu_dai;
int i;
if (!w->sname)
return;
list_for_each_entry(rtd, &card->rtd_list, list) {
/* does stream match DAI link ? */
if (!rtd->dai_link->stream_name ||
strcmp(w->sname, rtd->dai_link->stream_name))
continue;
switch (w->id) {
case snd_soc_dapm_dai_out:
for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
if (cpu_dai->capture_widget == w) {
cpu_dai->capture_widget = NULL;
break;
}
}
break;
case snd_soc_dapm_dai_in:
for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
if (cpu_dai->playback_widget == w) {
cpu_dai->playback_widget = NULL;
break;
}
}
break;
default:
break;
}
}
}
/* bind PCM ID to host component ID */ /* bind PCM ID to host component ID */
static int spcm_bind(struct snd_soc_component *scomp, struct snd_sof_pcm *spcm, static int spcm_bind(struct snd_soc_component *scomp, struct snd_sof_pcm *spcm,
int dir) int dir)
@ -1353,6 +1397,9 @@ static int sof_widget_unload(struct snd_soc_component *scomp,
if (dai) if (dai)
list_del(&dai->list); list_del(&dai->list);
sof_disconnect_dai_widget(scomp, widget);
break; break;
default: default:
break; break;
@ -1380,6 +1427,7 @@ static int sof_widget_unload(struct snd_soc_component *scomp,
} }
kfree(scontrol->ipc_control_data); kfree(scontrol->ipc_control_data);
list_del(&scontrol->list); list_del(&scontrol->list);
kfree(scontrol->name);
kfree(scontrol); kfree(scontrol);
} }

View File

@ -572,6 +572,13 @@ static int set_sample_rate_v2v3(struct snd_usb_audio *chip,
/* continue processing */ /* continue processing */
} }
/* FIXME - TEAC devices require the immediate interface setup */
if (rate != prev_rate && USB_ID_VENDOR(chip->usb_id) == 0x0644) {
usb_set_interface(chip->dev, fmt->iface, fmt->altsetting);
if (chip->quirk_flags & QUIRK_FLAG_IFACE_DELAY)
msleep(50);
}
validation: validation:
/* validate clock after rate change */ /* validate clock after rate change */
if (!uac_clock_source_is_valid(chip, fmt, clock)) if (!uac_clock_source_is_valid(chip, fmt, clock))

View File

@ -1194,6 +1194,7 @@ static void snd_usbmidi_output_drain(struct snd_rawmidi_substream *substream)
} while (drain_urbs && timeout); } while (drain_urbs && timeout);
finish_wait(&ep->drain_wait, &wait); finish_wait(&ep->drain_wait, &wait);
} }
port->active = 0;
spin_unlock_irq(&ep->buffer_lock); spin_unlock_irq(&ep->buffer_lock);
} }

View File

@ -599,6 +599,10 @@ static const struct usbmix_ctl_map usbmix_ctl_maps[] = {
.id = USB_ID(0x0db0, 0x419c), .id = USB_ID(0x0db0, 0x419c),
.map = msi_mpg_x570s_carbon_max_wifi_alc4080_map, .map = msi_mpg_x570s_carbon_max_wifi_alc4080_map,
}, },
{ /* MSI MAG X570S Torpedo Max */
.id = USB_ID(0x0db0, 0xa073),
.map = msi_mpg_x570s_carbon_max_wifi_alc4080_map,
},
{ /* MSI TRX40 */ { /* MSI TRX40 */
.id = USB_ID(0x0db0, 0x543d), .id = USB_ID(0x0db0, 0x543d),
.map = trx40_mobo_map, .map = trx40_mobo_map,

View File

@ -2672,6 +2672,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
.altset_idx = 1, .altset_idx = 1,
.attributes = 0, .attributes = 0,
.endpoint = 0x82, .endpoint = 0x82,
.ep_idx = 1,
.ep_attr = USB_ENDPOINT_XFER_ISOC, .ep_attr = USB_ENDPOINT_XFER_ISOC,
.datainterval = 1, .datainterval = 1,
.maxpacksize = 0x0126, .maxpacksize = 0x0126,
@ -2875,6 +2876,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
.altset_idx = 1, .altset_idx = 1,
.attributes = 0x4, .attributes = 0x4,
.endpoint = 0x81, .endpoint = 0x81,
.ep_idx = 1,
.ep_attr = USB_ENDPOINT_XFER_ISOC | .ep_attr = USB_ENDPOINT_XFER_ISOC |
USB_ENDPOINT_SYNC_ASYNC, USB_ENDPOINT_SYNC_ASYNC,
.maxpacksize = 0x130, .maxpacksize = 0x130,
@ -3235,6 +3237,15 @@ YAMAHA_DEVICE(0x7010, "UB99"),
} }
}, },
/* Rane SL-1 */
{
USB_DEVICE(0x13e5, 0x0001),
.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
.ifnum = QUIRK_ANY_INTERFACE,
.type = QUIRK_AUDIO_STANDARD_INTERFACE
}
},
/* disabled due to regression for other devices; /* disabled due to regression for other devices;
* see https://bugzilla.kernel.org/show_bug.cgi?id=199905 * see https://bugzilla.kernel.org/show_bug.cgi?id=199905
*/ */
@ -3382,6 +3393,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
.altset_idx = 1, .altset_idx = 1,
.attributes = 0, .attributes = 0,
.endpoint = 0x03, .endpoint = 0x03,
.ep_idx = 1,
.rates = SNDRV_PCM_RATE_96000, .rates = SNDRV_PCM_RATE_96000,
.ep_attr = USB_ENDPOINT_XFER_ISOC | .ep_attr = USB_ENDPOINT_XFER_ISOC |
USB_ENDPOINT_SYNC_ASYNC, USB_ENDPOINT_SYNC_ASYNC,

View File

@ -1824,6 +1824,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
QUIRK_FLAG_IGNORE_CTL_ERROR), QUIRK_FLAG_IGNORE_CTL_ERROR),
DEVICE_FLG(0x06f8, 0xd002, /* Hercules DJ Console (Macintosh Edition) */ DEVICE_FLG(0x06f8, 0xd002, /* Hercules DJ Console (Macintosh Edition) */
QUIRK_FLAG_IGNORE_CTL_ERROR), QUIRK_FLAG_IGNORE_CTL_ERROR),
DEVICE_FLG(0x0711, 0x5800, /* MCT Trigger 5 USB-to-HDMI */
QUIRK_FLAG_GET_SAMPLE_RATE),
DEVICE_FLG(0x074d, 0x3553, /* Outlaw RR2150 (Micronas UAC3553B) */ DEVICE_FLG(0x074d, 0x3553, /* Outlaw RR2150 (Micronas UAC3553B) */
QUIRK_FLAG_GET_SAMPLE_RATE), QUIRK_FLAG_GET_SAMPLE_RATE),
DEVICE_FLG(0x0763, 0x2030, /* M-Audio Fast Track C400 */ DEVICE_FLG(0x0763, 0x2030, /* M-Audio Fast Track C400 */