···12531253 dev_notice(dev, "SPI dma_set_mask(%d) failed, ret:%d\n",12541254 addr_bits, ret);1255125512561256+ ret = devm_request_irq(dev, irq, mtk_spi_interrupt,12571257+ IRQF_TRIGGER_NONE, dev_name(dev), master);12581258+ if (ret)12591259+ return dev_err_probe(dev, ret, "failed to register irq\n");12601260+12561261 pm_runtime_enable(dev);1257126212581263 ret = devm_spi_register_master(dev, master);12591264 if (ret) {12601265 pm_runtime_disable(dev);12611266 return dev_err_probe(dev, ret, "failed to register master\n");12621262- }12631263-12641264- ret = devm_request_irq(dev, irq, mtk_spi_interrupt,12651265- IRQF_TRIGGER_NONE, dev_name(dev), master);12661266- if (ret) {12671267- pm_runtime_disable(dev);12681268- return dev_err_probe(dev, ret, "failed to register irq\n");12691267 }1270126812711269 return 0;
+2-3
include/linux/firewire.h
···278278 * Otherwise there is a danger of recursion of inbound and outbound279279 * transactions from and to the local node.280280 *281281- * The callback is responsible that either fw_send_response() or kfree()282282- * is called on the @request, except for FCP registers for which the core283283- * takes care of that.281281+ * The callback is responsible that fw_send_response() is called on the @request, except for FCP282282+ * registers for which the core takes care of that.284283 */285284typedef void (*fw_address_callback_t)(struct fw_card *card,286285 struct fw_request *request,
+15-9
sound/core/control.c
···12031203 const u32 pattern = 0xdeadbeef;12041204 int ret;1205120512061206+ down_read(&card->controls_rwsem);12061207 kctl = snd_ctl_find_id(card, &control->id);12071207- if (kctl == NULL)12081208- return -ENOENT;12081208+ if (kctl == NULL) {12091209+ ret = -ENOENT;12101210+ goto unlock;12111211+ }1209121212101213 index_offset = snd_ctl_get_ioff(kctl, &control->id);12111214 vd = &kctl->vd[index_offset];12121212- if (!(vd->access & SNDRV_CTL_ELEM_ACCESS_READ) || kctl->get == NULL)12131213- return -EPERM;12151215+ if (!(vd->access & SNDRV_CTL_ELEM_ACCESS_READ) || kctl->get == NULL) {12161216+ ret = -EPERM;12171217+ goto unlock;12181218+ }1214121912151220 snd_ctl_build_ioff(&control->id, kctl, index_offset);12161221···12251220 info.id = control->id;12261221 ret = __snd_ctl_elem_info(card, kctl, &info, NULL);12271222 if (ret < 0)12281228- return ret;12231223+ goto unlock;12291224#endif1230122512311226 if (!snd_ctl_skip_validation(&info))···12351230 ret = kctl->get(kctl, control);12361231 snd_power_unref(card);12371232 if (ret < 0)12381238- return ret;12331233+ goto unlock;12391234 if (!snd_ctl_skip_validation(&info) &&12401235 sanity_check_elem_value(card, control, &info, pattern) < 0) {12411236 dev_err(card->dev,···12431238 control->id.iface, control->id.device,12441239 control->id.subdevice, control->id.name,12451240 control->id.index);12461246- return -EINVAL;12411241+ ret = -EINVAL;12421242+ goto unlock;12471243 }12441244+unlock:12451245+ up_read(&card->controls_rwsem);12481246 return ret;12491247}12501248···12611253 if (IS_ERR(control))12621254 return PTR_ERR(control);1263125512641264- down_read(&card->controls_rwsem);12651256 result = snd_ctl_elem_read(card, control);12661266- up_read(&card->controls_rwsem);12671257 if (result < 0)12681258 goto error;12691259
···22menuconfig SND_SOC_QCOM33 tristate "ASoC support for QCOM platforms"44 depends on ARCH_QCOM || COMPILE_TEST55- imply SND_SOC_QCOM_COMMON65 help76 Say Y or M if you want to add support to use audio devices87 in Qualcomm Technologies SOC-based platforms.···5960config SND_SOC_APQ8016_SBC6061 tristate "SoC Audio support for APQ8016 SBC platforms"6162 select SND_SOC_LPASS_APQ80166262- depends on SND_SOC_QCOM_COMMON6363+ select SND_SOC_QCOM_COMMON6364 help6465 Support for Qualcomm Technologies LPASS audio block in6566 APQ8016 SOC-based systems.6667 Say Y if you want to use audio devices on MI2S.67686869config SND_SOC_QCOM_COMMON6969- depends on SOUNDWIRE7070+ tristate7171+7272+config SND_SOC_QCOM_SDW7073 tristate71747275config SND_SOC_QDSP6_COMMON···145144 depends on QCOM_APR146145 depends on COMMON_CLK147146 select SND_SOC_QDSP6148148- depends on SND_SOC_QCOM_COMMON147147+ select SND_SOC_QCOM_COMMON149148 help150149 Support for Qualcomm Technologies LPASS audio block in151150 APQ8096 SoC-based systems.···156155 depends on QCOM_APR && I2C && SOUNDWIRE157156 depends on COMMON_CLK158157 select SND_SOC_QDSP6159159- depends on SND_SOC_QCOM_COMMON158158+ select SND_SOC_QCOM_COMMON160159 select SND_SOC_RT5663161160 select SND_SOC_MAX98927162161 imply SND_SOC_CROS_EC_CODEC···170169 depends on QCOM_APR && SOUNDWIRE171170 depends on COMMON_CLK172171 select SND_SOC_QDSP6173173- depends on SND_SOC_QCOM_COMMON172172+ select SND_SOC_QCOM_COMMON173173+ select SND_SOC_QCOM_SDW174174 help175175 To add support for audio on Qualcomm Technologies Inc.176176 SM8250 SoC-based systems.···182180 depends on QCOM_APR && SOUNDWIRE183181 depends on COMMON_CLK184182 select SND_SOC_QDSP6185185- depends on SND_SOC_QCOM_COMMON183183+ select SND_SOC_QCOM_COMMON184184+ select SND_SOC_QCOM_SDW186185 help187186 To add support for audio on Qualcomm Technologies Inc.188187 SC8280XP SoC-based systems.···193190 tristate "SoC Machine driver for SC7180 boards"194191 depends on I2C && GPIOLIB195192 depends on SOUNDWIRE || SOUNDWIRE=n196196- depends on SND_SOC_QCOM_COMMON193193+ select SND_SOC_QCOM_COMMON197194 select SND_SOC_LPASS_SC7180198195 select SND_SOC_MAX98357A199196 select SND_SOC_RT5682_I2C···207204config SND_SOC_SC7280208205 tristate "SoC Machine driver for SC7280 boards"209206 depends on I2C && SOUNDWIRE210210- depends on SND_SOC_QCOM_COMMON207207+ select SND_SOC_QCOM_COMMON211208 select SND_SOC_LPASS_SC7280212209 select SND_SOC_MAX98357A213210 select SND_SOC_WCD938X_SDW
···180180}181181EXPORT_SYMBOL_GPL(qcom_snd_parse_of);182182183183-int qcom_snd_sdw_prepare(struct snd_pcm_substream *substream,184184- struct sdw_stream_runtime *sruntime,185185- bool *stream_prepared)186186-{187187- struct snd_soc_pcm_runtime *rtd = substream->private_data;188188- struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);189189- int ret;190190-191191- if (!sruntime)192192- return 0;193193-194194- switch (cpu_dai->id) {195195- case WSA_CODEC_DMA_RX_0:196196- case WSA_CODEC_DMA_RX_1:197197- case RX_CODEC_DMA_RX_0:198198- case RX_CODEC_DMA_RX_1:199199- case TX_CODEC_DMA_TX_0:200200- case TX_CODEC_DMA_TX_1:201201- case TX_CODEC_DMA_TX_2:202202- case TX_CODEC_DMA_TX_3:203203- break;204204- default:205205- return 0;206206- }207207-208208- if (*stream_prepared) {209209- sdw_disable_stream(sruntime);210210- sdw_deprepare_stream(sruntime);211211- *stream_prepared = false;212212- }213213-214214- ret = sdw_prepare_stream(sruntime);215215- if (ret)216216- return ret;217217-218218- /**219219- * NOTE: there is a strict hw requirement about the ordering of port220220- * enables and actual WSA881x PA enable. PA enable should only happen221221- * after soundwire ports are enabled if not DC on the line is222222- * accumulated resulting in Click/Pop Noise223223- * PA enable/mute are handled as part of codec DAPM and digital mute.224224- */225225-226226- ret = sdw_enable_stream(sruntime);227227- if (ret) {228228- sdw_deprepare_stream(sruntime);229229- return ret;230230- }231231- *stream_prepared = true;232232-233233- return ret;234234-}235235-EXPORT_SYMBOL_GPL(qcom_snd_sdw_prepare);236236-237237-int qcom_snd_sdw_hw_params(struct snd_pcm_substream *substream,238238- struct snd_pcm_hw_params *params,239239- struct sdw_stream_runtime **psruntime)240240-{241241- struct snd_soc_pcm_runtime *rtd = substream->private_data;242242- struct snd_soc_dai *codec_dai;243243- struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);244244- struct sdw_stream_runtime *sruntime;245245- int i;246246-247247- switch (cpu_dai->id) {248248- case WSA_CODEC_DMA_RX_0:249249- case RX_CODEC_DMA_RX_0:250250- case RX_CODEC_DMA_RX_1:251251- case TX_CODEC_DMA_TX_0:252252- case TX_CODEC_DMA_TX_1:253253- case TX_CODEC_DMA_TX_2:254254- case TX_CODEC_DMA_TX_3:255255- for_each_rtd_codec_dais(rtd, i, codec_dai) {256256- sruntime = snd_soc_dai_get_stream(codec_dai, substream->stream);257257- if (sruntime != ERR_PTR(-ENOTSUPP))258258- *psruntime = sruntime;259259- }260260- break;261261- }262262-263263- return 0;264264-265265-}266266-EXPORT_SYMBOL_GPL(qcom_snd_sdw_hw_params);267267-268268-int qcom_snd_sdw_hw_free(struct snd_pcm_substream *substream,269269- struct sdw_stream_runtime *sruntime, bool *stream_prepared)270270-{271271- struct snd_soc_pcm_runtime *rtd = substream->private_data;272272- struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);273273-274274- switch (cpu_dai->id) {275275- case WSA_CODEC_DMA_RX_0:276276- case WSA_CODEC_DMA_RX_1:277277- case RX_CODEC_DMA_RX_0:278278- case RX_CODEC_DMA_RX_1:279279- case TX_CODEC_DMA_TX_0:280280- case TX_CODEC_DMA_TX_1:281281- case TX_CODEC_DMA_TX_2:282282- case TX_CODEC_DMA_TX_3:283283- if (sruntime && *stream_prepared) {284284- sdw_disable_stream(sruntime);285285- sdw_deprepare_stream(sruntime);286286- *stream_prepared = false;287287- }288288- break;289289- default:290290- break;291291- }292292-293293- return 0;294294-}295295-EXPORT_SYMBOL_GPL(qcom_snd_sdw_hw_free);296296-297183int qcom_snd_wcd_jack_setup(struct snd_soc_pcm_runtime *rtd,298184 struct snd_soc_jack *jack, bool *jack_setup)299185{
···10371037 struct lpass_data *data)10381038{10391039 struct device_node *node;10401040- int ret, id;10401040+ int ret, i, id;1041104110421042 /* Allow all channels by default for backwards compatibility */10431043- for (id = 0; id < data->variant->num_dai; id++) {10431043+ for (i = 0; i < data->variant->num_dai; i++) {10441044+ id = data->variant->dai_driver[i].id;10441045 data->mi2s_playback_sd_mode[id] = LPAIF_I2SCTL_MODE_8CH;10451046 data->mi2s_capture_sd_mode[id] = LPAIF_I2SCTL_MODE_8CH;10461047 }
···11+// SPDX-License-Identifier: GPL-2.022+// Copyright (c) 2018, Linaro Limited.33+// Copyright (c) 2018, The Linux Foundation. All rights reserved.44+55+#include <linux/module.h>66+#include <sound/soc.h>77+#include "qdsp6/q6afe.h"88+#include "sdw.h"99+1010+int qcom_snd_sdw_prepare(struct snd_pcm_substream *substream,1111+ struct sdw_stream_runtime *sruntime,1212+ bool *stream_prepared)1313+{1414+ struct snd_soc_pcm_runtime *rtd = substream->private_data;1515+ struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);1616+ int ret;1717+1818+ if (!sruntime)1919+ return 0;2020+2121+ switch (cpu_dai->id) {2222+ case WSA_CODEC_DMA_RX_0:2323+ case WSA_CODEC_DMA_RX_1:2424+ case RX_CODEC_DMA_RX_0:2525+ case RX_CODEC_DMA_RX_1:2626+ case TX_CODEC_DMA_TX_0:2727+ case TX_CODEC_DMA_TX_1:2828+ case TX_CODEC_DMA_TX_2:2929+ case TX_CODEC_DMA_TX_3:3030+ break;3131+ default:3232+ return 0;3333+ }3434+3535+ if (*stream_prepared) {3636+ sdw_disable_stream(sruntime);3737+ sdw_deprepare_stream(sruntime);3838+ *stream_prepared = false;3939+ }4040+4141+ ret = sdw_prepare_stream(sruntime);4242+ if (ret)4343+ return ret;4444+4545+ /**4646+ * NOTE: there is a strict hw requirement about the ordering of port4747+ * enables and actual WSA881x PA enable. PA enable should only happen4848+ * after soundwire ports are enabled if not DC on the line is4949+ * accumulated resulting in Click/Pop Noise5050+ * PA enable/mute are handled as part of codec DAPM and digital mute.5151+ */5252+5353+ ret = sdw_enable_stream(sruntime);5454+ if (ret) {5555+ sdw_deprepare_stream(sruntime);5656+ return ret;5757+ }5858+ *stream_prepared = true;5959+6060+ return ret;6161+}6262+EXPORT_SYMBOL_GPL(qcom_snd_sdw_prepare);6363+6464+int qcom_snd_sdw_hw_params(struct snd_pcm_substream *substream,6565+ struct snd_pcm_hw_params *params,6666+ struct sdw_stream_runtime **psruntime)6767+{6868+ struct snd_soc_pcm_runtime *rtd = substream->private_data;6969+ struct snd_soc_dai *codec_dai;7070+ struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);7171+ struct sdw_stream_runtime *sruntime;7272+ int i;7373+7474+ switch (cpu_dai->id) {7575+ case WSA_CODEC_DMA_RX_0:7676+ case RX_CODEC_DMA_RX_0:7777+ case RX_CODEC_DMA_RX_1:7878+ case TX_CODEC_DMA_TX_0:7979+ case TX_CODEC_DMA_TX_1:8080+ case TX_CODEC_DMA_TX_2:8181+ case TX_CODEC_DMA_TX_3:8282+ for_each_rtd_codec_dais(rtd, i, codec_dai) {8383+ sruntime = snd_soc_dai_get_stream(codec_dai, substream->stream);8484+ if (sruntime != ERR_PTR(-ENOTSUPP))8585+ *psruntime = sruntime;8686+ }8787+ break;8888+ }8989+9090+ return 0;9191+9292+}9393+EXPORT_SYMBOL_GPL(qcom_snd_sdw_hw_params);9494+9595+int qcom_snd_sdw_hw_free(struct snd_pcm_substream *substream,9696+ struct sdw_stream_runtime *sruntime, bool *stream_prepared)9797+{9898+ struct snd_soc_pcm_runtime *rtd = substream->private_data;9999+ struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);100100+101101+ switch (cpu_dai->id) {102102+ case WSA_CODEC_DMA_RX_0:103103+ case WSA_CODEC_DMA_RX_1:104104+ case RX_CODEC_DMA_RX_0:105105+ case RX_CODEC_DMA_RX_1:106106+ case TX_CODEC_DMA_TX_0:107107+ case TX_CODEC_DMA_TX_1:108108+ case TX_CODEC_DMA_TX_2:109109+ case TX_CODEC_DMA_TX_3:110110+ if (sruntime && *stream_prepared) {111111+ sdw_disable_stream(sruntime);112112+ sdw_deprepare_stream(sruntime);113113+ *stream_prepared = false;114114+ }115115+ break;116116+ default:117117+ break;118118+ }119119+120120+ return 0;121121+}122122+EXPORT_SYMBOL_GPL(qcom_snd_sdw_hw_free);123123+MODULE_LICENSE("GPL v2");