mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 03:24:45 +01:00
Merge branch 'for-linus' into for-next
Pull 6.19-devel branch. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
commit
8bf65ec419
34 changed files with 344 additions and 166 deletions
|
|
@ -1402,7 +1402,7 @@ int snd_pcm_lib_mmap_iomem(struct snd_pcm_substream *substream, struct vm_area_s
|
|||
#define snd_pcm_lib_mmap_iomem NULL
|
||||
#endif
|
||||
|
||||
void snd_pcm_runtime_buffer_set_silence(struct snd_pcm_runtime *runtime);
|
||||
int snd_pcm_runtime_buffer_set_silence(struct snd_pcm_runtime *runtime);
|
||||
|
||||
/**
|
||||
* snd_pcm_limit_isa_dma_size - Get the max size fitting with ISA DMA transfer
|
||||
|
|
|
|||
|
|
@ -203,6 +203,8 @@ struct snd_soc_acpi_link_adr {
|
|||
* @mach: the pointer of the machine driver
|
||||
* @prefix: the prefix of the topology file name. Typically, it is the path.
|
||||
* @tplg_files: the pointer of the array of the topology file names.
|
||||
* @best_effort: ignore non supported links and try to build the card in best effort
|
||||
* with supported links
|
||||
*/
|
||||
/* Descriptor for SST ASoC machine driver */
|
||||
struct snd_soc_acpi_mach {
|
||||
|
|
@ -224,7 +226,8 @@ struct snd_soc_acpi_mach {
|
|||
const u32 tplg_quirk_mask;
|
||||
int (*get_function_tplg_files)(struct snd_soc_card *card,
|
||||
const struct snd_soc_acpi_mach *mach,
|
||||
const char *prefix, const char ***tplg_files);
|
||||
const char *prefix, const char ***tplg_files,
|
||||
bool best_effort);
|
||||
};
|
||||
|
||||
#define SND_SOC_ACPI_MAX_CODECS 3
|
||||
|
|
|
|||
|
|
@ -298,6 +298,7 @@ static void ac97_adapter_release(struct device *dev)
|
|||
idr_remove(&ac97_adapter_idr, ac97_ctrl->nr);
|
||||
dev_dbg(&ac97_ctrl->adap, "adapter unregistered by %s\n",
|
||||
dev_name(ac97_ctrl->parent));
|
||||
kfree(ac97_ctrl);
|
||||
}
|
||||
|
||||
static const struct device_type ac97_adapter_type = {
|
||||
|
|
@ -319,7 +320,9 @@ static int ac97_add_adapter(struct ac97_controller *ac97_ctrl)
|
|||
ret = device_register(&ac97_ctrl->adap);
|
||||
if (ret)
|
||||
put_device(&ac97_ctrl->adap);
|
||||
}
|
||||
} else
|
||||
kfree(ac97_ctrl);
|
||||
|
||||
if (!ret) {
|
||||
list_add(&ac97_ctrl->controllers, &ac97_controllers);
|
||||
dev_dbg(&ac97_ctrl->adap, "adapter registered by %s\n",
|
||||
|
|
@ -361,14 +364,11 @@ struct ac97_controller *snd_ac97_controller_register(
|
|||
ret = ac97_add_adapter(ac97_ctrl);
|
||||
|
||||
if (ret)
|
||||
goto err;
|
||||
return ERR_PTR(ret);
|
||||
ac97_bus_reset(ac97_ctrl);
|
||||
ac97_bus_scan(ac97_ctrl);
|
||||
|
||||
return ac97_ctrl;
|
||||
err:
|
||||
kfree(ac97_ctrl);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_ac97_controller_register);
|
||||
|
||||
|
|
|
|||
|
|
@ -1076,7 +1076,9 @@ static int snd_pcm_oss_change_params_locked(struct snd_pcm_substream *substream)
|
|||
runtime->oss.params = 0;
|
||||
runtime->oss.prepare = 1;
|
||||
runtime->oss.buffer_used = 0;
|
||||
snd_pcm_runtime_buffer_set_silence(runtime);
|
||||
err = snd_pcm_runtime_buffer_set_silence(runtime);
|
||||
if (err < 0)
|
||||
goto failure;
|
||||
|
||||
runtime->oss.period_frames = snd_pcm_alsa_frames(substream, oss_period_size);
|
||||
|
||||
|
|
|
|||
|
|
@ -730,13 +730,18 @@ static void snd_pcm_buffer_access_unlock(struct snd_pcm_runtime *runtime)
|
|||
}
|
||||
|
||||
/* fill the PCM buffer with the current silence format; called from pcm_oss.c */
|
||||
void snd_pcm_runtime_buffer_set_silence(struct snd_pcm_runtime *runtime)
|
||||
int snd_pcm_runtime_buffer_set_silence(struct snd_pcm_runtime *runtime)
|
||||
{
|
||||
snd_pcm_buffer_access_lock(runtime);
|
||||
int err;
|
||||
|
||||
err = snd_pcm_buffer_access_lock(runtime);
|
||||
if (err < 0)
|
||||
return err;
|
||||
if (runtime->dma_area)
|
||||
snd_pcm_format_set_silence(runtime->format, runtime->dma_area,
|
||||
bytes_to_samples(runtime, runtime->dma_bytes));
|
||||
snd_pcm_buffer_access_unlock(runtime);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_pcm_runtime_buffer_set_silence);
|
||||
|
||||
|
|
|
|||
|
|
@ -1670,6 +1670,18 @@ static void alc236_fixup_hp_mute_led_micmute_vref(struct hda_codec *codec,
|
|||
alc236_fixup_hp_micmute_led_vref(codec, fix, action);
|
||||
}
|
||||
|
||||
static void alc236_fixup_hp_mute_led_micmute_gpio(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
|
||||
if (action == HDA_FIXUP_ACT_PRE_PROBE)
|
||||
spec->micmute_led_polarity = 1;
|
||||
|
||||
alc236_fixup_hp_mute_led_coefbit2(codec, fix, action);
|
||||
alc_fixup_hp_gpio_led(codec, action, 0x00, 0x01);
|
||||
}
|
||||
|
||||
static inline void alc298_samsung_write_coef_pack(struct hda_codec *codec,
|
||||
const unsigned short coefs[2])
|
||||
{
|
||||
|
|
@ -3800,6 +3812,7 @@ enum {
|
|||
ALC295_FIXUP_DELL_TAS2781_I2C,
|
||||
ALC245_FIXUP_TAS2781_SPI_2,
|
||||
ALC287_FIXUP_TXNW2781_I2C,
|
||||
ALC287_FIXUP_TXNW2781_I2C_ASUS,
|
||||
ALC287_FIXUP_YOGA7_14ARB7_I2C,
|
||||
ALC245_FIXUP_HP_MUTE_LED_COEFBIT,
|
||||
ALC245_FIXUP_HP_MUTE_LED_V1_COEFBIT,
|
||||
|
|
@ -5374,9 +5387,7 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
},
|
||||
[ALC236_FIXUP_HP_MUTE_LED_MICMUTE_GPIO] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc236_fixup_hp_mute_led_coefbit2,
|
||||
.chained = true,
|
||||
.chain_id = ALC236_FIXUP_HP_GPIO_LED,
|
||||
.v.func = alc236_fixup_hp_mute_led_micmute_gpio,
|
||||
},
|
||||
[ALC236_FIXUP_LENOVO_INV_DMIC] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
|
|
@ -6101,6 +6112,12 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
.chained = true,
|
||||
.chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,
|
||||
},
|
||||
[ALC287_FIXUP_TXNW2781_I2C_ASUS] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = tas2781_fixup_txnw_i2c,
|
||||
.chained = true,
|
||||
.chain_id = ALC294_FIXUP_ASUS_SPK,
|
||||
},
|
||||
[ALC287_FIXUP_YOGA7_14ARB7_I2C] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = yoga7_14arb7_fixup_i2c,
|
||||
|
|
@ -6356,6 +6373,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1025, 0x1466, "Acer Aspire A515-56", ALC255_FIXUP_ACER_HEADPHONE_AND_MIC),
|
||||
SND_PCI_QUIRK(0x1025, 0x1534, "Acer Predator PH315-54", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1025, 0x159c, "Acer Nitro 5 AN515-58", ALC2XX_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1025, 0x1597, "Acer Nitro 5 AN517-55", ALC2XX_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1025, 0x169a, "Acer Swift SFG16", ALC256_FIXUP_ACER_SFG16_MICMUTE_LED),
|
||||
SND_PCI_QUIRK(0x1025, 0x1826, "Acer Helios ZPC", ALC287_FIXUP_PREDATOR_SPK_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x1025, 0x182c, "Acer Helios ZPD", ALC287_FIXUP_PREDATOR_SPK_CS35L41_I2C_2),
|
||||
|
|
@ -6543,6 +6561,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x103c, 0x863e, "HP Spectre x360 15-df1xxx", ALC285_FIXUP_HP_SPECTRE_X360_DF1),
|
||||
SND_PCI_QUIRK(0x103c, 0x86e8, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
|
||||
SND_PCI_QUIRK(0x103c, 0x86f9, "HP Spectre x360 13-aw0xxx", ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8706, "HP Laptop 15s-eq1xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8716, "HP Elite Dragonfly G2 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
|
||||
SND_PCI_QUIRK(0x103c, 0x8720, "HP EliteBook x360 1040 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
|
||||
SND_PCI_QUIRK(0x103c, 0x8724, "HP EliteBook 850 G7", ALC285_FIXUP_HP_GPIO_LED),
|
||||
|
|
@ -6823,10 +6842,10 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x103c, 0x8e61, "HP Trekker ", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e62, "HP Trekker ", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e8a, "HP NexusX", ALC245_FIXUP_HP_TAS2781_I2C_MUTE_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e9c, "HP 16 Clipper OmniBook X X360", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e9d, "HP 17 Turbine OmniBook X UMA", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8e9e, "HP 17 Turbine OmniBook X UMA", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8eb6, "HP Abe A6U", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_GPIO),
|
||||
SND_PCI_QUIRK(0x103c, 0x8eb7, "HP Abe A6U", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_GPIO),
|
||||
SND_PCI_QUIRK(0x103c, 0x8eb8, "HP Abe A6U", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_GPIO),
|
||||
SND_PCI_QUIRK(0x103c, 0x8ec1, "HP 200 G2i", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_GPIO),
|
||||
SND_PCI_QUIRK(0x103c, 0x8ec4, "HP Bantie I6U", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_GPIO),
|
||||
|
|
@ -6842,11 +6861,13 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x103c, 0x8eda, "HP ZBook Firefly 16W", ALC245_FIXUP_HP_TAS2781_SPI_MUTE_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8ee4, "HP Bantie A6U", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_GPIO),
|
||||
SND_PCI_QUIRK(0x103c, 0x8ee5, "HP Bantie A6U", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_GPIO),
|
||||
SND_PCI_QUIRK(0x103c, 0x8ee7, "HP Abe A6U", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_GPIO),
|
||||
SND_PCI_QUIRK(0x103c, 0x8f0c, "HP ZBook X G2i 16W", ALC236_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8f0e, "HP ZBook X G2i 16W", ALC236_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8f40, "HP ZBook 8 G2a 14", ALC245_FIXUP_HP_TAS2781_I2C_MUTE_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8f41, "HP ZBook 8 G2a 16", ALC245_FIXUP_HP_TAS2781_I2C_MUTE_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8f42, "HP ZBook 8 G2a 14W", ALC245_FIXUP_HP_TAS2781_I2C_MUTE_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8f57, "HP Trekker G7JC", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8f62, "HP ZBook 8 G2a 16W", ALC245_FIXUP_HP_TAS2781_I2C_MUTE_LED),
|
||||
SND_PCI_QUIRK(0x1043, 0x1032, "ASUS VivoBook X513EA", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1043, 0x1034, "ASUS GU605C", ALC285_FIXUP_ASUS_GU605_SPI_SPEAKER2_TO_DAC1),
|
||||
|
|
@ -6879,8 +6900,8 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1043, 0x1314, "ASUS GA605K", ALC285_FIXUP_ASUS_GA605K_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1384, "ASUS RC73XA", ALC287_FIXUP_TXNW2781_I2C),
|
||||
SND_PCI_QUIRK(0x1043, 0x1394, "ASUS RC73YA", ALC287_FIXUP_TXNW2781_I2C),
|
||||
SND_PCI_QUIRK(0x1043, 0x1384, "ASUS RC73XA", ALC287_FIXUP_TXNW2781_I2C_ASUS),
|
||||
SND_PCI_QUIRK(0x1043, 0x1394, "ASUS RC73YA", ALC287_FIXUP_TXNW2781_I2C_ASUS),
|
||||
SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
|
||||
SND_PCI_QUIRK(0x1043, 0x1433, "ASUS GX650PY/PZ/PV/PU/PYV/PZV/PIV/PVV", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@ struct tas2781_hda_i2c_priv {
|
|||
int (*save_calibration)(struct tas2781_hda *h);
|
||||
|
||||
int hda_chip_id;
|
||||
bool skip_calibration;
|
||||
};
|
||||
|
||||
static int tas2781_get_i2c_res(struct acpi_resource *ares, void *data)
|
||||
|
|
@ -111,8 +112,10 @@ static int tas2781_read_acpi(struct tasdevice_priv *p, const char *hid)
|
|||
sub = acpi_get_subsystem_id(ACPI_HANDLE(physdev));
|
||||
if (IS_ERR(sub)) {
|
||||
/* No subsys id in older tas2563 projects. */
|
||||
if (!strncmp(hid, "INT8866", sizeof("INT8866")))
|
||||
if (!strncmp(hid, "INT8866", sizeof("INT8866"))) {
|
||||
p->speaker_id = -1;
|
||||
goto end_2563;
|
||||
}
|
||||
dev_err(p->dev, "Failed to get SUBSYS ID.\n");
|
||||
ret = PTR_ERR(sub);
|
||||
goto err;
|
||||
|
|
@ -489,7 +492,8 @@ static void tasdevice_dspfw_init(void *context)
|
|||
/* If calibrated data occurs error, dsp will still works with default
|
||||
* calibrated data inside algo.
|
||||
*/
|
||||
hda_priv->save_calibration(tas_hda);
|
||||
if (!hda_priv->skip_calibration)
|
||||
hda_priv->save_calibration(tas_hda);
|
||||
}
|
||||
|
||||
static void tasdev_fw_ready(const struct firmware *fmw, void *context)
|
||||
|
|
@ -544,6 +548,7 @@ static int tas2781_hda_bind(struct device *dev, struct device *master,
|
|||
void *master_data)
|
||||
{
|
||||
struct tas2781_hda *tas_hda = dev_get_drvdata(dev);
|
||||
struct tas2781_hda_i2c_priv *hda_priv = tas_hda->hda_priv;
|
||||
struct hda_component_parent *parent = master_data;
|
||||
struct hda_component *comp;
|
||||
struct hda_codec *codec;
|
||||
|
|
@ -569,6 +574,14 @@ static int tas2781_hda_bind(struct device *dev, struct device *master,
|
|||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Using ASUS ROG Xbox Ally X (RC73XA) UEFI calibration data
|
||||
* causes audio dropouts during playback, use fallback data
|
||||
* from DSP firmware as a workaround.
|
||||
*/
|
||||
if (codec->core.subsystem_id == 0x10431384)
|
||||
hda_priv->skip_calibration = true;
|
||||
|
||||
guard(pm_runtime_active_auto)(dev);
|
||||
|
||||
comp->dev = dev;
|
||||
|
|
|
|||
|
|
@ -131,7 +131,13 @@ static int snd_pdacf_probe(struct pcmcia_device *link)
|
|||
link->config_index = 1;
|
||||
link->config_regs = PRESENT_OPTION;
|
||||
|
||||
return pdacf_config(link);
|
||||
err = pdacf_config(link);
|
||||
if (err < 0) {
|
||||
card_list[i] = NULL;
|
||||
snd_card_free(card);
|
||||
return err;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -284,7 +284,13 @@ static int vxpocket_probe(struct pcmcia_device *p_dev)
|
|||
|
||||
vxp->p_dev = p_dev;
|
||||
|
||||
return vxpocket_config(p_dev);
|
||||
err = vxpocket_config(p_dev);
|
||||
if (err < 0) {
|
||||
card_alloc &= ~(1 << i);
|
||||
snd_card_free(card);
|
||||
return err;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void vxpocket_detach(struct pcmcia_device *link)
|
||||
|
|
|
|||
|
|
@ -661,6 +661,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "Bravo 15 C7UCX"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "HONOR"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "GOH-X"),
|
||||
}
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -783,16 +783,12 @@ static int ak4458_i2c_probe(struct i2c_client *i2c)
|
|||
|
||||
pm_runtime_enable(&i2c->dev);
|
||||
regcache_cache_only(ak4458->regmap, true);
|
||||
ak4458_reset(ak4458, false);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ak4458_i2c_remove(struct i2c_client *i2c)
|
||||
{
|
||||
struct ak4458_priv *ak4458 = i2c_get_clientdata(i2c);
|
||||
|
||||
ak4458_reset(ak4458, true);
|
||||
pm_runtime_disable(&i2c->dev);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1505,10 +1505,6 @@ static int pm4125_bind(struct device *dev)
|
|||
struct device_link *devlink;
|
||||
int ret;
|
||||
|
||||
/* Initialize device pointers to NULL for safe cleanup */
|
||||
pm4125->rxdev = NULL;
|
||||
pm4125->txdev = NULL;
|
||||
|
||||
/* Give the soundwire subdevices some more time to settle */
|
||||
usleep_range(15000, 15010);
|
||||
|
||||
|
|
@ -1537,13 +1533,7 @@ static int pm4125_bind(struct device *dev)
|
|||
|
||||
pm4125->sdw_priv[AIF1_CAP] = dev_get_drvdata(pm4125->txdev);
|
||||
pm4125->sdw_priv[AIF1_CAP]->pm4125 = pm4125;
|
||||
|
||||
pm4125->tx_sdw_dev = dev_to_sdw_dev(pm4125->txdev);
|
||||
if (!pm4125->tx_sdw_dev) {
|
||||
dev_err(dev, "could not get txslave with matching of dev\n");
|
||||
ret = -EINVAL;
|
||||
goto error_put_tx;
|
||||
}
|
||||
|
||||
/*
|
||||
* As TX is the main CSR reg interface, which should not be suspended first.
|
||||
|
|
@ -1624,11 +1614,8 @@ static void pm4125_unbind(struct device *dev)
|
|||
device_link_remove(dev, pm4125->rxdev);
|
||||
device_link_remove(pm4125->rxdev, pm4125->txdev);
|
||||
|
||||
/* Release device references acquired in bind */
|
||||
if (pm4125->txdev)
|
||||
put_device(pm4125->txdev);
|
||||
if (pm4125->rxdev)
|
||||
put_device(pm4125->rxdev);
|
||||
put_device(pm4125->txdev);
|
||||
put_device(pm4125->rxdev);
|
||||
|
||||
component_unbind_all(dev, pm4125);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -115,7 +115,8 @@ static const struct reg_sequence rt1320_blind_write[] = {
|
|||
static const struct reg_sequence rt1320_vc_blind_write[] = {
|
||||
{ 0xc003, 0xe0 },
|
||||
{ 0xe80a, 0x01 },
|
||||
{ 0xc5c3, 0xf3 },
|
||||
{ 0xc5c3, 0xf2 },
|
||||
{ 0xc5c8, 0x03 },
|
||||
{ 0xc057, 0x51 },
|
||||
{ 0xc054, 0x35 },
|
||||
{ 0xca05, 0xd6 },
|
||||
|
|
@ -126,8 +127,6 @@ static const struct reg_sequence rt1320_vc_blind_write[] = {
|
|||
{ 0xc609, 0x40 },
|
||||
{ 0xc046, 0xff },
|
||||
{ 0xc045, 0xff },
|
||||
{ 0xda81, 0x14 },
|
||||
{ 0xda8d, 0x14 },
|
||||
{ 0xc044, 0xff },
|
||||
{ 0xc043, 0xff },
|
||||
{ 0xc042, 0xff },
|
||||
|
|
@ -136,8 +135,8 @@ static const struct reg_sequence rt1320_vc_blind_write[] = {
|
|||
{ 0xcc10, 0x01 },
|
||||
{ 0xc700, 0xf0 },
|
||||
{ 0xc701, 0x13 },
|
||||
{ 0xc901, 0x09 },
|
||||
{ 0xc900, 0xd0 },
|
||||
{ 0xc901, 0x04 },
|
||||
{ 0xc900, 0x73 },
|
||||
{ 0xde03, 0x05 },
|
||||
{ 0xdd0b, 0x0d },
|
||||
{ 0xdd0a, 0xff },
|
||||
|
|
@ -153,6 +152,7 @@ static const struct reg_sequence rt1320_vc_blind_write[] = {
|
|||
{ 0xf082, 0xff },
|
||||
{ 0xf081, 0xff },
|
||||
{ 0xf080, 0xff },
|
||||
{ 0xe801, 0x01 },
|
||||
{ 0xe802, 0xf8 },
|
||||
{ 0xe803, 0xbe },
|
||||
{ 0xc003, 0xc0 },
|
||||
|
|
@ -202,7 +202,7 @@ static const struct reg_sequence rt1320_vc_blind_write[] = {
|
|||
{ 0x3fc2bfc3, 0x00 },
|
||||
{ 0x3fc2bfc2, 0x00 },
|
||||
{ 0x3fc2bfc1, 0x00 },
|
||||
{ 0x3fc2bfc0, 0x03 },
|
||||
{ 0x3fc2bfc0, 0x07 },
|
||||
{ 0x0000d486, 0x43 },
|
||||
{ SDW_SDCA_CTL(FUNC_NUM_AMP, RT1320_SDCA_ENT_PDE23, RT1320_SDCA_CTL_REQ_POWER_STATE, 0), 0x00 },
|
||||
{ 0x1000db00, 0x07 },
|
||||
|
|
@ -241,9 +241,7 @@ static const struct reg_sequence rt1320_vc_blind_write[] = {
|
|||
{ 0x1000db21, 0x00 },
|
||||
{ 0x1000db22, 0x00 },
|
||||
{ 0x1000db23, 0x00 },
|
||||
{ 0x0000d540, 0x01 },
|
||||
{ 0x0000c081, 0xfc },
|
||||
{ 0x0000f01e, 0x80 },
|
||||
{ 0x0000d540, 0x21 },
|
||||
{ 0xc01b, 0xfc },
|
||||
{ 0xc5d1, 0x89 },
|
||||
{ 0xc5d8, 0x0a },
|
||||
|
|
|
|||
|
|
@ -2763,11 +2763,6 @@ static int wcd937x_bind(struct device *dev)
|
|||
wcd937x->sdw_priv[AIF1_CAP] = dev_get_drvdata(wcd937x->txdev);
|
||||
wcd937x->sdw_priv[AIF1_CAP]->wcd937x = wcd937x;
|
||||
wcd937x->tx_sdw_dev = dev_to_sdw_dev(wcd937x->txdev);
|
||||
if (!wcd937x->tx_sdw_dev) {
|
||||
dev_err(dev, "could not get txslave with matching of dev\n");
|
||||
ret = -EINVAL;
|
||||
goto err_put_txdev;
|
||||
}
|
||||
|
||||
/*
|
||||
* As TX is the main CSR reg interface, which should not be suspended first.
|
||||
|
|
|
|||
|
|
@ -1045,8 +1045,8 @@ static int fsl_asoc_card_probe(struct platform_device *pdev)
|
|||
* The notifier is initialized in snd_soc_card_jack_new(), then
|
||||
* snd_soc_jack_notifier_register can be called.
|
||||
*/
|
||||
if (of_property_read_bool(np, "hp-det-gpios") ||
|
||||
of_property_read_bool(np, "hp-det-gpio") /* deprecated */) {
|
||||
if (of_property_present(np, "hp-det-gpios") ||
|
||||
of_property_present(np, "hp-det-gpio") /* deprecated */) {
|
||||
ret = simple_util_init_jack(&priv->card, &priv->hp_jack,
|
||||
1, NULL, "Headphone Jack");
|
||||
if (ret)
|
||||
|
|
@ -1055,8 +1055,8 @@ static int fsl_asoc_card_probe(struct platform_device *pdev)
|
|||
snd_soc_jack_notifier_register(&priv->hp_jack.jack, &hp_jack_nb);
|
||||
}
|
||||
|
||||
if (of_property_read_bool(np, "mic-det-gpios") ||
|
||||
of_property_read_bool(np, "mic-det-gpio") /* deprecated */) {
|
||||
if (of_property_present(np, "mic-det-gpios") ||
|
||||
of_property_present(np, "mic-det-gpio") /* deprecated */) {
|
||||
ret = simple_util_init_jack(&priv->card, &priv->mic_jack,
|
||||
0, NULL, "Mic Jack");
|
||||
if (ret)
|
||||
|
|
|
|||
|
|
@ -473,5 +473,8 @@ struct snd_soc_component_driver fsl_asrc_component = {
|
|||
.pointer = fsl_asrc_dma_pcm_pointer,
|
||||
.pcm_construct = fsl_asrc_dma_pcm_new,
|
||||
.legacy_dai_naming = 1,
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
.debugfs_prefix = "asrc",
|
||||
#endif
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(fsl_asrc_component);
|
||||
|
|
|
|||
|
|
@ -1577,6 +1577,9 @@ static const struct snd_soc_component_driver fsl_easrc_component = {
|
|||
.controls = fsl_easrc_snd_controls,
|
||||
.num_controls = ARRAY_SIZE(fsl_easrc_snd_controls),
|
||||
.legacy_dai_naming = 1,
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
.debugfs_prefix = "easrc",
|
||||
#endif
|
||||
};
|
||||
|
||||
static const struct reg_default fsl_easrc_reg_defaults[] = {
|
||||
|
|
|
|||
|
|
@ -917,8 +917,14 @@ static int fsl_sai_startup(struct snd_pcm_substream *substream,
|
|||
tx ? sai->dma_params_tx.maxburst :
|
||||
sai->dma_params_rx.maxburst);
|
||||
|
||||
ret = snd_pcm_hw_constraint_list(substream->runtime, 0,
|
||||
SNDRV_PCM_HW_PARAM_RATE, &sai->constraint_rates);
|
||||
if (sai->is_consumer_mode[tx])
|
||||
ret = snd_pcm_hw_constraint_list(substream->runtime, 0,
|
||||
SNDRV_PCM_HW_PARAM_RATE,
|
||||
&fsl_sai_rate_constraints);
|
||||
else
|
||||
ret = snd_pcm_hw_constraint_list(substream->runtime, 0,
|
||||
SNDRV_PCM_HW_PARAM_RATE,
|
||||
&sai->constraint_rates);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1075,6 +1081,7 @@ static const struct reg_default fsl_sai_reg_defaults_ofs0[] = {
|
|||
{FSL_SAI_TDR6, 0},
|
||||
{FSL_SAI_TDR7, 0},
|
||||
{FSL_SAI_TMR, 0},
|
||||
{FSL_SAI_TTCTL, 0},
|
||||
{FSL_SAI_RCR1(0), 0},
|
||||
{FSL_SAI_RCR2(0), 0},
|
||||
{FSL_SAI_RCR3(0), 0},
|
||||
|
|
@ -1098,12 +1105,14 @@ static const struct reg_default fsl_sai_reg_defaults_ofs8[] = {
|
|||
{FSL_SAI_TDR6, 0},
|
||||
{FSL_SAI_TDR7, 0},
|
||||
{FSL_SAI_TMR, 0},
|
||||
{FSL_SAI_TTCTL, 0},
|
||||
{FSL_SAI_RCR1(8), 0},
|
||||
{FSL_SAI_RCR2(8), 0},
|
||||
{FSL_SAI_RCR3(8), 0},
|
||||
{FSL_SAI_RCR4(8), 0},
|
||||
{FSL_SAI_RCR5(8), 0},
|
||||
{FSL_SAI_RMR, 0},
|
||||
{FSL_SAI_RTCTL, 0},
|
||||
{FSL_SAI_MCTL, 0},
|
||||
{FSL_SAI_MDIV, 0},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1323,6 +1323,7 @@ static const struct reg_default fsl_xcvr_phy_reg_defaults[] = {
|
|||
};
|
||||
|
||||
static const struct regmap_config fsl_xcvr_regmap_phy_cfg = {
|
||||
.name = "phy",
|
||||
.reg_bits = 8,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
|
|
@ -1335,6 +1336,7 @@ static const struct regmap_config fsl_xcvr_regmap_phy_cfg = {
|
|||
};
|
||||
|
||||
static const struct regmap_config fsl_xcvr_regmap_pllv0_cfg = {
|
||||
.name = "pllv0",
|
||||
.reg_bits = 8,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
|
|
@ -1345,6 +1347,7 @@ static const struct regmap_config fsl_xcvr_regmap_pllv0_cfg = {
|
|||
};
|
||||
|
||||
static const struct regmap_config fsl_xcvr_regmap_pllv1_cfg = {
|
||||
.name = "pllv1",
|
||||
.reg_bits = 8,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
|
|
|
|||
|
|
@ -46,11 +46,11 @@ enum {
|
|||
#define SOC_SDW_NO_AGGREGATION BIT(14)
|
||||
|
||||
/* BT audio offload: reserve 3 bits for future */
|
||||
#define SOF_BT_OFFLOAD_SSP_SHIFT 15
|
||||
#define SOF_BT_OFFLOAD_SSP_MASK (GENMASK(17, 15))
|
||||
#define SOF_BT_OFFLOAD_SSP_SHIFT 18
|
||||
#define SOF_BT_OFFLOAD_SSP_MASK (GENMASK(20, 18))
|
||||
#define SOF_BT_OFFLOAD_SSP(quirk) \
|
||||
(((quirk) << SOF_BT_OFFLOAD_SSP_SHIFT) & SOF_BT_OFFLOAD_SSP_MASK)
|
||||
#define SOF_SSP_BT_OFFLOAD_PRESENT BIT(18)
|
||||
#define SOF_SSP_BT_OFFLOAD_PRESENT BIT(21)
|
||||
|
||||
struct intel_mc_ctx {
|
||||
struct sof_hdmi_private hdmi;
|
||||
|
|
|
|||
|
|
@ -699,6 +699,69 @@ static const struct snd_soc_acpi_adr_device cs35l56_1_fb_adr[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_adr_device cs35l56_6amp_1_fb_adr[] = {
|
||||
{
|
||||
.adr = 0x00013701FA355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_r_fb_endpoints),
|
||||
.endpoints = cs35l56_r_fb_endpoints,
|
||||
.name_prefix = "AMP6"
|
||||
},
|
||||
{
|
||||
.adr = 0x00013601FA355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_3_fb_endpoints),
|
||||
.endpoints = cs35l56_3_fb_endpoints,
|
||||
.name_prefix = "AMP5"
|
||||
},
|
||||
{
|
||||
.adr = 0x00013501FA355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_5_fb_endpoints),
|
||||
.endpoints = cs35l56_5_fb_endpoints,
|
||||
.name_prefix = "AMP4"
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_adr_device cs35l63_6amp_3_fb_adr[] = {
|
||||
{
|
||||
.adr = 0x00033001FA356301ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_l_fb_endpoints),
|
||||
.endpoints = cs35l56_l_fb_endpoints,
|
||||
.name_prefix = "AMP1"
|
||||
},
|
||||
{
|
||||
.adr = 0x00033201FA356301ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_2_fb_endpoints),
|
||||
.endpoints = cs35l56_2_fb_endpoints,
|
||||
.name_prefix = "AMP3"
|
||||
},
|
||||
{
|
||||
.adr = 0x00033401FA356301ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_4_fb_endpoints),
|
||||
.endpoints = cs35l56_4_fb_endpoints,
|
||||
.name_prefix = "AMP5"
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_adr_device cs35l63_6amp_2_fb_adr[] = {
|
||||
{
|
||||
.adr = 0x00023101FA356301ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_r_fb_endpoints),
|
||||
.endpoints = cs35l56_r_fb_endpoints,
|
||||
.name_prefix = "AMP2"
|
||||
},
|
||||
{
|
||||
.adr = 0x00023301FA356301ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_3_fb_endpoints),
|
||||
.endpoints = cs35l56_3_fb_endpoints,
|
||||
.name_prefix = "AMP4"
|
||||
},
|
||||
{
|
||||
.adr = 0x00023501FA356301ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_5_fb_endpoints),
|
||||
.endpoints = cs35l56_5_fb_endpoints,
|
||||
.name_prefix = "AMP6"
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_adr_device cs35l56_2_r_adr[] = {
|
||||
{
|
||||
.adr = 0x00023201FA355601ull,
|
||||
|
|
@ -1069,6 +1132,35 @@ static const struct snd_soc_acpi_link_adr mtl_cs35l56_x8_link0_link1_fb[] = {
|
|||
{}
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_link_adr mtl_cs35l56_x6_link0_link1_fb[] = {
|
||||
{
|
||||
.mask = BIT(1),
|
||||
.num_adr = ARRAY_SIZE(cs35l56_6amp_1_fb_adr),
|
||||
.adr_d = cs35l56_6amp_1_fb_adr,
|
||||
},
|
||||
{
|
||||
.mask = BIT(0),
|
||||
/* First 3 amps in cs35l56_0_fb_adr */
|
||||
.num_adr = 3,
|
||||
.adr_d = cs35l56_0_fb_adr,
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_link_adr mtl_cs35l63_x6_link2_link3_fb[] = {
|
||||
{
|
||||
.mask = BIT(3),
|
||||
.num_adr = ARRAY_SIZE(cs35l63_6amp_3_fb_adr),
|
||||
.adr_d = cs35l63_6amp_3_fb_adr,
|
||||
},
|
||||
{
|
||||
.mask = BIT(2),
|
||||
.num_adr = ARRAY_SIZE(cs35l63_6amp_2_fb_adr),
|
||||
.adr_d = cs35l63_6amp_2_fb_adr,
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_link_adr mtl_cs35l63_x2_link1_link3_fb[] = {
|
||||
{
|
||||
.mask = BIT(3),
|
||||
|
|
@ -1189,6 +1281,12 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_mtl_sdw_machines[] = {
|
|||
.sof_tplg_filename = "sof-mtl-cs35l56-l01-fb8.tplg",
|
||||
.get_function_tplg_files = sof_sdw_get_tplg_files,
|
||||
},
|
||||
{
|
||||
.link_mask = BIT(0) | BIT(1),
|
||||
.links = mtl_cs35l56_x6_link0_link1_fb,
|
||||
.drv_name = "sof_sdw",
|
||||
.sof_tplg_filename = "sof-mtl-cs35l56-l01-fb6.tplg"
|
||||
},
|
||||
{
|
||||
.link_mask = BIT(0),
|
||||
.links = mtl_cs42l43_l0,
|
||||
|
|
@ -1202,6 +1300,12 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_mtl_sdw_machines[] = {
|
|||
.drv_name = "sof_sdw",
|
||||
.sof_tplg_filename = "sof-mtl-cs35l56-l01-fb8.tplg",
|
||||
},
|
||||
{
|
||||
.link_mask = BIT(2) | BIT(3),
|
||||
.links = mtl_cs35l63_x6_link2_link3_fb,
|
||||
.drv_name = "sof_sdw",
|
||||
.sof_tplg_filename = "sof-mtl-cs35l56-l01-fb6.tplg",
|
||||
},
|
||||
{
|
||||
.link_mask = GENMASK(3, 0),
|
||||
.links = mtl_3_in_1_sdca,
|
||||
|
|
|
|||
|
|
@ -15,49 +15,6 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_nvl_machines[] = {
|
|||
};
|
||||
EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_nvl_machines);
|
||||
|
||||
/*
|
||||
* Multi-function codecs with three endpoints created for
|
||||
* headset, amp and dmic functions.
|
||||
*/
|
||||
static const struct snd_soc_acpi_endpoint rt_mf_endpoints[] = {
|
||||
{
|
||||
.num = 0,
|
||||
.aggregated = 0,
|
||||
.group_position = 0,
|
||||
.group_id = 0,
|
||||
},
|
||||
{
|
||||
.num = 1,
|
||||
.aggregated = 0,
|
||||
.group_position = 0,
|
||||
.group_id = 0,
|
||||
},
|
||||
{
|
||||
.num = 2,
|
||||
.aggregated = 0,
|
||||
.group_position = 0,
|
||||
.group_id = 0,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_adr_device rt722_3_single_adr[] = {
|
||||
{
|
||||
.adr = 0x000330025d072201ull,
|
||||
.num_endpoints = ARRAY_SIZE(rt_mf_endpoints),
|
||||
.endpoints = rt_mf_endpoints,
|
||||
.name_prefix = "rt722"
|
||||
}
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_link_adr nvl_rt722_l3[] = {
|
||||
{
|
||||
.mask = BIT(3),
|
||||
.num_adr = ARRAY_SIZE(rt722_3_single_adr),
|
||||
.adr_d = rt722_3_single_adr,
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
/* this table is used when there is no I2S codec present */
|
||||
struct snd_soc_acpi_mach snd_soc_acpi_intel_nvl_sdw_machines[] = {
|
||||
/* mockup tests need to be first */
|
||||
|
|
@ -79,12 +36,6 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_nvl_sdw_machines[] = {
|
|||
.drv_name = "sof_sdw",
|
||||
.sof_tplg_filename = "sof-nvl-rt715-rt711-rt1308-mono.tplg",
|
||||
},
|
||||
{
|
||||
.link_mask = BIT(3),
|
||||
.links = nvl_rt722_l3,
|
||||
.drv_name = "sof_sdw",
|
||||
.sof_tplg_filename = "sof-nvl-rt722.tplg",
|
||||
},
|
||||
{},
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_nvl_sdw_machines);
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ enum tplg_device_id {
|
|||
#define SOF_INTEL_PLATFORM_NAME_MAX 4
|
||||
|
||||
int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_mach *mach,
|
||||
const char *prefix, const char ***tplg_files)
|
||||
const char *prefix, const char ***tplg_files, bool best_effort)
|
||||
{
|
||||
struct snd_soc_acpi_mach_params mach_params = mach->mach_params;
|
||||
struct snd_soc_dai_link *dai_link;
|
||||
|
|
@ -87,6 +87,9 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
|
|||
dev_dbg(card->dev,
|
||||
"dai_link %s is not supported by separated tplg yet\n",
|
||||
dai_link->name);
|
||||
if (best_effort)
|
||||
continue;
|
||||
|
||||
return 0;
|
||||
}
|
||||
if (tplg_mask & BIT(tplg_dev))
|
||||
|
|
|
|||
|
|
@ -10,6 +10,6 @@
|
|||
#define _SND_SOC_ACPI_INTEL_GET_TPLG_H
|
||||
|
||||
int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_mach *mach,
|
||||
const char *prefix, const char ***tplg_files);
|
||||
const char *prefix, const char ***tplg_files, bool best_effort);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -365,10 +365,12 @@ static int sdm845_snd_startup(struct snd_pcm_substream *substream)
|
|||
snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt);
|
||||
break;
|
||||
case QUATERNARY_MI2S_RX:
|
||||
codec_dai_fmt |= SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_I2S;
|
||||
snd_soc_dai_set_sysclk(cpu_dai,
|
||||
Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT,
|
||||
MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK);
|
||||
snd_soc_dai_set_fmt(cpu_dai, fmt);
|
||||
snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt);
|
||||
break;
|
||||
|
||||
case QUATERNARY_TDM_RX_0:
|
||||
|
|
|
|||
|
|
@ -1414,10 +1414,6 @@ static int is_sdca_endpoint_present(struct device *dev,
|
|||
}
|
||||
|
||||
slave = dev_to_sdw_dev(sdw_dev);
|
||||
if (!slave) {
|
||||
ret = -EINVAL;
|
||||
goto put_device;
|
||||
}
|
||||
|
||||
/* Make sure BIOS provides SDCA properties */
|
||||
if (!slave->sdca_data.interface_revision) {
|
||||
|
|
@ -1534,8 +1530,10 @@ int asoc_sdw_parse_sdw_endpoints(struct snd_soc_card *card,
|
|||
* endpoint check is not necessary
|
||||
*/
|
||||
if (dai_info->quirk &&
|
||||
!(dai_info->quirk_exclude ^ !!(dai_info->quirk & ctx->mc_quirk)))
|
||||
!(dai_info->quirk_exclude ^ !!(dai_info->quirk & ctx->mc_quirk))) {
|
||||
(*num_devs)--;
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
/* Check SDCA codec endpoint if there is no matching quirk */
|
||||
ret = is_sdca_endpoint_present(dev, codec_info, adr_link, i, j);
|
||||
|
|
@ -1543,8 +1541,10 @@ int asoc_sdw_parse_sdw_endpoints(struct snd_soc_card *card,
|
|||
return ret;
|
||||
|
||||
/* The endpoint is not present, skip */
|
||||
if (!ret)
|
||||
if (!ret) {
|
||||
(*num_devs)--;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
dev_dbg(dev,
|
||||
|
|
|
|||
|
|
@ -111,7 +111,8 @@ int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,
|
|||
EXPORT_SYMBOL_GPL(snd_soc_put_enum_double);
|
||||
|
||||
static int sdca_soc_q78_reg_to_ctl(struct soc_mixer_control *mc, unsigned int reg_val,
|
||||
unsigned int mask, unsigned int shift, int max)
|
||||
unsigned int mask, unsigned int shift, int max,
|
||||
bool sx)
|
||||
{
|
||||
int val = reg_val;
|
||||
|
||||
|
|
@ -141,20 +142,26 @@ static unsigned int sdca_soc_q78_ctl_to_reg(struct soc_mixer_control *mc, int va
|
|||
}
|
||||
|
||||
static int soc_mixer_reg_to_ctl(struct soc_mixer_control *mc, unsigned int reg_val,
|
||||
unsigned int mask, unsigned int shift, int max)
|
||||
unsigned int mask, unsigned int shift, int max,
|
||||
bool sx)
|
||||
{
|
||||
int val = (reg_val >> shift) & mask;
|
||||
|
||||
if (mc->sign_bit)
|
||||
val = sign_extend32(val, mc->sign_bit);
|
||||
|
||||
val = clamp(val, mc->min, mc->max);
|
||||
val -= mc->min;
|
||||
if (sx) {
|
||||
val -= mc->min; // SX controls intentionally can overflow here
|
||||
val = min_t(unsigned int, val & mask, max);
|
||||
} else {
|
||||
val = clamp(val, mc->min, mc->max);
|
||||
val -= mc->min;
|
||||
}
|
||||
|
||||
if (mc->invert)
|
||||
val = max - val;
|
||||
|
||||
return val & mask;
|
||||
return val;
|
||||
}
|
||||
|
||||
static unsigned int soc_mixer_ctl_to_reg(struct soc_mixer_control *mc, int val,
|
||||
|
|
@ -280,9 +287,10 @@ static int soc_put_volsw(struct snd_kcontrol *kcontrol,
|
|||
|
||||
static int soc_get_volsw(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol,
|
||||
struct soc_mixer_control *mc, int mask, int max)
|
||||
struct soc_mixer_control *mc, int mask, int max, bool sx)
|
||||
{
|
||||
int (*reg_to_ctl)(struct soc_mixer_control *, unsigned int, unsigned int, unsigned int, int);
|
||||
int (*reg_to_ctl)(struct soc_mixer_control *, unsigned int, unsigned int,
|
||||
unsigned int, int, bool);
|
||||
struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
|
||||
unsigned int reg_val;
|
||||
int val;
|
||||
|
|
@ -293,16 +301,16 @@ static int soc_get_volsw(struct snd_kcontrol *kcontrol,
|
|||
reg_to_ctl = soc_mixer_reg_to_ctl;
|
||||
|
||||
reg_val = snd_soc_component_read(component, mc->reg);
|
||||
val = reg_to_ctl(mc, reg_val, mask, mc->shift, max);
|
||||
val = reg_to_ctl(mc, reg_val, mask, mc->shift, max, sx);
|
||||
|
||||
ucontrol->value.integer.value[0] = val;
|
||||
|
||||
if (snd_soc_volsw_is_stereo(mc)) {
|
||||
if (mc->reg == mc->rreg) {
|
||||
val = reg_to_ctl(mc, reg_val, mask, mc->rshift, max);
|
||||
val = reg_to_ctl(mc, reg_val, mask, mc->rshift, max, sx);
|
||||
} else {
|
||||
reg_val = snd_soc_component_read(component, mc->rreg);
|
||||
val = reg_to_ctl(mc, reg_val, mask, mc->shift, max);
|
||||
val = reg_to_ctl(mc, reg_val, mask, mc->shift, max, sx);
|
||||
}
|
||||
|
||||
ucontrol->value.integer.value[1] = val;
|
||||
|
|
@ -371,7 +379,7 @@ int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,
|
|||
(struct soc_mixer_control *)kcontrol->private_value;
|
||||
unsigned int mask = soc_mixer_mask(mc);
|
||||
|
||||
return soc_get_volsw(kcontrol, ucontrol, mc, mask, mc->max - mc->min);
|
||||
return soc_get_volsw(kcontrol, ucontrol, mc, mask, mc->max - mc->min, false);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_get_volsw);
|
||||
|
||||
|
|
@ -413,7 +421,7 @@ int snd_soc_get_volsw_sx(struct snd_kcontrol *kcontrol,
|
|||
(struct soc_mixer_control *)kcontrol->private_value;
|
||||
unsigned int mask = soc_mixer_sx_mask(mc);
|
||||
|
||||
return soc_get_volsw(kcontrol, ucontrol, mc, mask, mc->max);
|
||||
return soc_get_volsw(kcontrol, ucontrol, mc, mask, mc->max, true);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_get_volsw_sx);
|
||||
|
||||
|
|
|
|||
|
|
@ -1549,6 +1549,7 @@ struct snd_soc_acpi_mach *hda_machine_select(struct snd_sof_dev *sdev)
|
|||
* name string if quirk flag is set.
|
||||
*/
|
||||
if (mach) {
|
||||
const struct sof_intel_dsp_desc *chip = get_chip_info(sdev->pdata);
|
||||
bool tplg_fixup = false;
|
||||
bool dmic_fixup = false;
|
||||
|
||||
|
|
@ -1598,6 +1599,18 @@ struct snd_soc_acpi_mach *hda_machine_select(struct snd_sof_dev *sdev)
|
|||
sof_pdata->tplg_filename = tplg_filename;
|
||||
}
|
||||
|
||||
if (tplg_fixup && mach->mach_params.bt_link_mask &&
|
||||
chip->hw_ip_version >= SOF_INTEL_ACE_4_0) {
|
||||
int bt_port = fls(mach->mach_params.bt_link_mask) - 1;
|
||||
|
||||
tplg_filename = devm_kasprintf(sdev->dev, GFP_KERNEL, "%s-ssp%d-bt",
|
||||
sof_pdata->tplg_filename, bt_port);
|
||||
if (!tplg_filename)
|
||||
return NULL;
|
||||
|
||||
sof_pdata->tplg_filename = tplg_filename;
|
||||
}
|
||||
|
||||
if (mach->link_mask) {
|
||||
mach->mach_params.links = mach->links;
|
||||
mach->mach_params.link_mask = mach->link_mask;
|
||||
|
|
@ -1609,7 +1622,6 @@ struct snd_soc_acpi_mach *hda_machine_select(struct snd_sof_dev *sdev)
|
|||
if (tplg_fixup &&
|
||||
mach->tplg_quirk_mask & SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER &&
|
||||
mach->mach_params.i2s_link_mask) {
|
||||
const struct sof_intel_dsp_desc *chip = get_chip_info(sdev->pdata);
|
||||
int ssp_num;
|
||||
int mclk_mask;
|
||||
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ static const struct sof_dev_desc mtl_desc = {
|
|||
[SOF_IPC_TYPE_4] = "intel/sof-ipc4-lib/mtl",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC_TYPE_4] = "intel/sof-ace-tplg",
|
||||
[SOF_IPC_TYPE_4] = "intel/sof-ipc4-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC_TYPE_4] = "sof-mtl.ri",
|
||||
|
|
@ -77,7 +77,7 @@ static const struct sof_dev_desc arl_desc = {
|
|||
[SOF_IPC_TYPE_4] = "intel/sof-ipc4-lib/arl",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC_TYPE_4] = "intel/sof-ace-tplg",
|
||||
[SOF_IPC_TYPE_4] = "intel/sof-ipc4-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC_TYPE_4] = "sof-arl.ri",
|
||||
|
|
@ -107,7 +107,7 @@ static const struct sof_dev_desc arl_s_desc = {
|
|||
[SOF_IPC_TYPE_4] = "intel/sof-ipc4-lib/arl-s",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC_TYPE_4] = "intel/sof-ace-tplg",
|
||||
[SOF_IPC_TYPE_4] = "intel/sof-ipc4-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC_TYPE_4] = "sof-arl-s.ri",
|
||||
|
|
|
|||
|
|
@ -1752,11 +1752,9 @@ snd_sof_get_nhlt_endpoint_data(struct snd_sof_dev *sdev, struct snd_sof_dai *dai
|
|||
channel_count = params_channels(params);
|
||||
sample_rate = params_rate(params);
|
||||
bit_depth = params_width(params);
|
||||
/*
|
||||
* Look for 32-bit blob first instead of 16-bit if copier
|
||||
* supports multiple formats
|
||||
*/
|
||||
if (bit_depth == 16 && !single_bitdepth) {
|
||||
|
||||
/* Prefer 32-bit blob if copier supports multiple formats */
|
||||
if (bit_depth <= 16 && !single_bitdepth) {
|
||||
dev_dbg(sdev->dev, "Looking for 32-bit blob first for DMIC\n");
|
||||
format_change = true;
|
||||
bit_depth = 32;
|
||||
|
|
@ -1799,10 +1797,18 @@ snd_sof_get_nhlt_endpoint_data(struct snd_sof_dev *sdev, struct snd_sof_dai *dai
|
|||
if (format_change) {
|
||||
/*
|
||||
* The 32-bit blob was not found in NHLT table, try to
|
||||
* look for one based on the params
|
||||
* look for 16-bit for DMIC or based on the params for
|
||||
* SSP
|
||||
*/
|
||||
bit_depth = params_width(params);
|
||||
format_change = false;
|
||||
if (linktype == SOF_DAI_INTEL_DMIC) {
|
||||
bit_depth = 16;
|
||||
if (params_width(params) == 16)
|
||||
format_change = false;
|
||||
} else {
|
||||
bit_depth = params_width(params);
|
||||
format_change = false;
|
||||
}
|
||||
|
||||
get_new_blob = true;
|
||||
} else if (linktype == SOF_DAI_INTEL_DMIC && !single_bitdepth) {
|
||||
/*
|
||||
|
|
@ -1837,7 +1843,7 @@ out:
|
|||
*len = cfg->size >> 2;
|
||||
*dst = (u32 *)cfg->caps;
|
||||
|
||||
if (format_change) {
|
||||
if (format_change || params_format(params) == SNDRV_PCM_FORMAT_FLOAT_LE) {
|
||||
/*
|
||||
* Update the params to reflect that different blob was loaded
|
||||
* instead of the requested bit depth (16 -> 32 or 32 -> 16).
|
||||
|
|
@ -2280,8 +2286,19 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
|
|||
ch_map >>= 4;
|
||||
}
|
||||
|
||||
step = ch_count / blob->alh_cfg.device_count;
|
||||
mask = GENMASK(step - 1, 0);
|
||||
if (swidget->id == snd_soc_dapm_dai_in && ch_count == out_ref_channels) {
|
||||
/*
|
||||
* For playback DAI widgets where the channel number is equal to
|
||||
* the output reference channels, set the step = 0 to ensure all
|
||||
* the ch_mask is applied to all alh mappings.
|
||||
*/
|
||||
mask = ch_mask;
|
||||
step = 0;
|
||||
} else {
|
||||
step = ch_count / blob->alh_cfg.device_count;
|
||||
mask = GENMASK(step - 1, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set each gtw_cfg.node_id to blob->alh_cfg.mapping[]
|
||||
* for all widgets with the same stream name
|
||||
|
|
@ -2316,8 +2333,9 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
|
|||
}
|
||||
|
||||
/*
|
||||
* Set the same channel mask for playback as the audio data is
|
||||
* duplicated for all speakers. For capture, split the channels
|
||||
* Set the same channel mask if the widget channel count is the same
|
||||
* as the FE channels for playback as the audio data is duplicated
|
||||
* for all speakers in this case. Otherwise, split the channels
|
||||
* among the aggregated DAIs. For example, with 4 channels on 2
|
||||
* aggregated DAIs, the channel_mask should be 0x3 and 0xc for the
|
||||
* two DAI's.
|
||||
|
|
@ -2326,10 +2344,7 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
|
|||
* the tables in soc_acpi files depending on the _ADR and devID
|
||||
* registers for each codec.
|
||||
*/
|
||||
if (w->id == snd_soc_dapm_dai_in)
|
||||
blob->alh_cfg.mapping[i].channel_mask = ch_mask;
|
||||
else
|
||||
blob->alh_cfg.mapping[i].channel_mask = mask << (step * i);
|
||||
blob->alh_cfg.mapping[i].channel_mask = mask << (step * i);
|
||||
|
||||
i++;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2106,8 +2106,8 @@ static int sof_route_load(struct snd_soc_component *scomp, int index,
|
|||
/* source component */
|
||||
source_swidget = snd_sof_find_swidget(scomp, (char *)route->source);
|
||||
if (!source_swidget) {
|
||||
dev_err(scomp->dev, "error: source %s not found\n",
|
||||
route->source);
|
||||
dev_err(scomp->dev, "source %s for sink %s is not found\n",
|
||||
route->source, route->sink);
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
|
@ -2125,8 +2125,8 @@ static int sof_route_load(struct snd_soc_component *scomp, int index,
|
|||
/* sink component */
|
||||
sink_swidget = snd_sof_find_swidget(scomp, (char *)route->sink);
|
||||
if (!sink_swidget) {
|
||||
dev_err(scomp->dev, "error: sink %s not found\n",
|
||||
route->sink);
|
||||
dev_err(scomp->dev, "sink %s for source %s is not found\n",
|
||||
route->sink, route->source);
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
|
@ -2506,12 +2506,28 @@ int snd_sof_load_topology(struct snd_soc_component *scomp, const char *file)
|
|||
if (!tplg_files)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Try to use function topologies if possible */
|
||||
if (!sof_pdata->disable_function_topology && !disable_function_topology &&
|
||||
sof_pdata->machine && sof_pdata->machine->get_function_tplg_files) {
|
||||
/*
|
||||
* When the topology name contains 'dummy' word, it means that
|
||||
* there is no fallback option to monolithic topology in case
|
||||
* any of the function topologies might be missing.
|
||||
* In this case we should use best effort to form the card,
|
||||
* ignoring functionalities that we are missing a fragment for.
|
||||
*
|
||||
* Note: monolithic topologies also ignore these possibly
|
||||
* missing functions, so the functionality of the card would be
|
||||
* identical to the case if there would be a fallback monolithic
|
||||
* topology created for the configuration.
|
||||
*/
|
||||
bool no_fallback = strstr(file, "dummy");
|
||||
|
||||
tplg_cnt = sof_pdata->machine->get_function_tplg_files(scomp->card,
|
||||
sof_pdata->machine,
|
||||
tplg_filename_prefix,
|
||||
&tplg_files);
|
||||
&tplg_files,
|
||||
no_fallback);
|
||||
if (tplg_cnt < 0) {
|
||||
kfree(tplg_files);
|
||||
return tplg_cnt;
|
||||
|
|
|
|||
|
|
@ -171,6 +171,8 @@
|
|||
* @reg_dac_txdata: TX FIFO offset for DMA config.
|
||||
* @has_reset: SoC needs reset deasserted.
|
||||
* @val_fctl_ftx: TX FIFO flush bitmask.
|
||||
* @mclk_multiplier: ratio of internal MCLK divider
|
||||
* @tx_clk_name: name of TX module clock if split clock design
|
||||
*/
|
||||
struct sun4i_spdif_quirks {
|
||||
unsigned int reg_dac_txdata;
|
||||
|
|
|
|||
|
|
@ -2077,7 +2077,7 @@ static const struct regmap_config tegra210_ahub_regmap_config = {
|
|||
.val_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.max_register = TEGRA210_MAX_REGISTER_ADDR,
|
||||
.cache_type = REGCACHE_FLAT,
|
||||
.cache_type = REGCACHE_FLAT_S,
|
||||
};
|
||||
|
||||
static const struct regmap_config tegra186_ahub_regmap_config = {
|
||||
|
|
@ -2085,7 +2085,7 @@ static const struct regmap_config tegra186_ahub_regmap_config = {
|
|||
.val_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.max_register = TEGRA186_MAX_REGISTER_ADDR,
|
||||
.cache_type = REGCACHE_FLAT,
|
||||
.cache_type = REGCACHE_FLAT_S,
|
||||
};
|
||||
|
||||
static const struct regmap_config tegra264_ahub_regmap_config = {
|
||||
|
|
@ -2094,7 +2094,7 @@ static const struct regmap_config tegra264_ahub_regmap_config = {
|
|||
.reg_stride = 4,
|
||||
.writeable_reg = tegra264_ahub_wr_reg,
|
||||
.max_register = TEGRA264_MAX_REGISTER_ADDR,
|
||||
.cache_type = REGCACHE_FLAT,
|
||||
.cache_type = REGCACHE_FLAT_S,
|
||||
};
|
||||
|
||||
static const struct tegra_ahub_soc_data soc_data_tegra210 = {
|
||||
|
|
|
|||
|
|
@ -655,17 +655,25 @@ static void get_meter_levels_from_urb(int s,
|
|||
u8 *meter_urb)
|
||||
{
|
||||
int val = MUC2(meter_urb, s) + (MUC3(meter_urb, s) << 8);
|
||||
int ch = MUB2(meter_urb, s) - 1;
|
||||
|
||||
if (ch < 0)
|
||||
return;
|
||||
|
||||
if (MUA0(meter_urb, s) == 0x61 && MUA1(meter_urb, s) == 0x02 &&
|
||||
MUA2(meter_urb, s) == 0x04 && MUB0(meter_urb, s) == 0x62) {
|
||||
if (MUC0(meter_urb, s) == 0x72)
|
||||
store->meter_level[MUB2(meter_urb, s) - 1] = val;
|
||||
if (MUC0(meter_urb, s) == 0xb2)
|
||||
store->comp_level[MUB2(meter_urb, s) - 1] = val;
|
||||
if (ch < SND_US16X08_MAX_CHANNELS) {
|
||||
if (MUC0(meter_urb, s) == 0x72)
|
||||
store->meter_level[ch] = val;
|
||||
if (MUC0(meter_urb, s) == 0xb2)
|
||||
store->comp_level[ch] = val;
|
||||
}
|
||||
}
|
||||
if (MUA0(meter_urb, s) == 0x61 && MUA1(meter_urb, s) == 0x02 &&
|
||||
MUA2(meter_urb, s) == 0x02 && MUB0(meter_urb, s) == 0x62)
|
||||
store->master_level[MUB2(meter_urb, s) - 1] = val;
|
||||
MUA2(meter_urb, s) == 0x02 && MUB0(meter_urb, s) == 0x62) {
|
||||
if (ch < ARRAY_SIZE(store->master_level))
|
||||
store->master_level[ch] = val;
|
||||
}
|
||||
}
|
||||
|
||||
/* Function to retrieve current meter values from the device.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue