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:
commit
1212fa1b48
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 ? */
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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[] =
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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] = {
|
||||||
|
|
|
@ -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] = {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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[] = {
|
||||||
|
|
|
@ -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) {\
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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)),
|
||||||
|
},
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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[] = {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in New Issue