mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 13:11:40 +00:00
sound fixes for 5.4-rc7
It became a bit largish, but all small and good for 5.4. - A regression fix of ALSA timer code bug that sneaked in by a recent cleanup; never trust innocent-looking guys... - Fix for compress API max size check signedness - Fixes in HD-audio: CA0132 work stall, Intel Tigerlake HDMI - A few fixes for SOF: memory leak, sanity-check and build fixes - A collection of device-specific fixes: firewire, rockchip, ASoC HDMI, rsnd, ASoC HDA, stm32, TI, kirkwood, msm, max98373 -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAl3EFugOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE8O7Q/8C9FzKxmrlNpmG/d6eYiVJIlnNJqSqP2KVeuN FMwbBpGajYLPHMCtc2hJi2xenM4FK1VY2AZNOEEuW+JgNt2PNw32ADEvXsEU4weq eWS8OTCc1g55YvbZsQXiedfLUqjJYVYnH2PaMnUU3CkyrI9wTNkGzYqZN1zA6FqU 6qxsXngDk6LcUIwvil9T/T+PSVyqo2t6NfcT3N7SLaeLAr1v+WmlT0miz6Ty6Foi wy0RJdt61RKDjkC9J1JXHJ/Lgh5TgoiH6pxIiRbiaF5YCxEvM7x8ogo0qngXWOno dAFqlHDcOqnLN30VS/dMTbZDhy8zn+L2GCoofWykNcwjhAYdAOsoJLCTBH2acF1i 2NJq1SsT303mPbmKQEKKrppUa/GB+6zzhqVWomIrVzde0p+wCO3lIK37k7JhX66H 4IRZ10iSNYat+WvUBgHLqunE2y2L2IdZ2CXxi2zbFfaMOPrQecZ2YaRKHXHNuStJ lj+sZ4bHUF7Z/EzIbaLQAh0crdar+yf59HWYVJyU9QsMnTE7Ap4Iohuq0r8hSgc2 +VTieFWxDtIb04Ef7CWHrCRoY4yYdBhTClJSRHK47DudyOSVLNUuewqfpQkcZWlr qi3P7pU+6tAKWFncihU8GsoU6vn1o7KCPvKxQNFP/04xcnSJxRGQIBYSaakuY+Hs fC7uYEw= =QbXZ -----END PGP SIGNATURE----- Merge tag 'sound-5.4-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "It became a bit largish, but all small and good for 5.4: - A regression fix of ALSA timer code bug that sneaked in by a recent cleanup; never trust innocent-looking guys... - Fix for compress API max size check signedness - Fixes in HD-audio: CA0132 work stall, Intel Tigerlake HDMI - A few fixes for SOF: memory leak, sanity-check and build fixes - A collection of device-specific fixes: firewire, rockchip, ASoC HDMI, rsnd, ASoC HDA, stm32, TI, kirkwood, msm, max98373" * tag 'sound-5.4-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: timer: Fix incorrectly assigned timer instance ASoC: SOF: topology: Fix bytes control size checks ALSA: hda: hdmi - add Tigerlake support ASoC: max98373: replace gpio_request with devm_gpio_request ASoC: stm32: sai: add restriction on mmap support ALSA: hda/ca0132 - Fix possible workqueue stall ASoC: hdac_hda: fix race in device removal ALSA: bebob: fix to detect configured source of sampling clock for Focusrite Saffire Pro i/o series ASoC: rockchip: rockchip_max98090: Enable SHDN to fix headset detection ASoC: ti: sdma-pcm: Add back the flags parameter for non standard dma names ASoC: SOF: ipc: Fix memory leak in sof_set_get_large_ctrl_data ASoC: SOF: Fix memory leak in sof_dfsentry_write ASoC: SOF: Intel: hda-stream: fix the CONFIG_ prefix missing ASoC: kirkwood: fix device remove ordering ASoC: rsnd: dma: fix SSI9 4/5/6/7 busif dma address ASoC: hdmi-codec: drop mutex locking again ASoC: kirkwood: fix external clock probe defer ASoC: compress: fix unsigned integer overflow check ASoC: msm8916-wcd-analog: Fix RX1 selection in RDAC2 MUX
This commit is contained in:
commit
8ac2a114b1
@ -528,7 +528,7 @@ static int snd_compress_check_input(struct snd_compr_params *params)
|
||||
{
|
||||
/* first let's check the buffer parameter's */
|
||||
if (params->buffer.fragment_size == 0 ||
|
||||
params->buffer.fragments > INT_MAX / params->buffer.fragment_size ||
|
||||
params->buffer.fragments > U32_MAX / params->buffer.fragment_size ||
|
||||
params->buffer.fragments == 0)
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -284,11 +284,11 @@ int snd_timer_open(struct snd_timer_instance **ti,
|
||||
goto unlock;
|
||||
}
|
||||
if (!list_empty(&timer->open_list_head)) {
|
||||
timeri = list_entry(timer->open_list_head.next,
|
||||
struct snd_timer_instance *t =
|
||||
list_entry(timer->open_list_head.next,
|
||||
struct snd_timer_instance, open_list);
|
||||
if (timeri->flags & SNDRV_TIMER_IFLG_EXCLUSIVE) {
|
||||
if (t->flags & SNDRV_TIMER_IFLG_EXCLUSIVE) {
|
||||
err = -EBUSY;
|
||||
timeri = NULL;
|
||||
goto unlock;
|
||||
}
|
||||
}
|
||||
|
@ -27,6 +27,8 @@
|
||||
#define SAFFIRE_CLOCK_SOURCE_SPDIF 1
|
||||
|
||||
/* clock sources as returned from register of Saffire Pro 10 and 26 */
|
||||
#define SAFFIREPRO_CLOCK_SOURCE_SELECT_MASK 0x000000ff
|
||||
#define SAFFIREPRO_CLOCK_SOURCE_DETECT_MASK 0x0000ff00
|
||||
#define SAFFIREPRO_CLOCK_SOURCE_INTERNAL 0
|
||||
#define SAFFIREPRO_CLOCK_SOURCE_SKIP 1 /* never used on hardware */
|
||||
#define SAFFIREPRO_CLOCK_SOURCE_SPDIF 2
|
||||
@ -189,6 +191,7 @@ saffirepro_both_clk_src_get(struct snd_bebob *bebob, unsigned int *id)
|
||||
map = saffirepro_clk_maps[1];
|
||||
|
||||
/* In a case that this driver cannot handle the value of register. */
|
||||
value &= SAFFIREPRO_CLOCK_SOURCE_SELECT_MASK;
|
||||
if (value >= SAFFIREPRO_CLOCK_SOURCE_COUNT || map[value] < 0) {
|
||||
err = -EIO;
|
||||
goto end;
|
||||
|
@ -7604,7 +7604,7 @@ static void hp_callback(struct hda_codec *codec, struct hda_jack_callback *cb)
|
||||
/* Delay enabling the HP amp, to let the mic-detection
|
||||
* state machine run.
|
||||
*/
|
||||
cancel_delayed_work_sync(&spec->unsol_hp_work);
|
||||
cancel_delayed_work(&spec->unsol_hp_work);
|
||||
schedule_delayed_work(&spec->unsol_hp_work, msecs_to_jiffies(500));
|
||||
tbl = snd_hda_jack_tbl_get(codec, cb->nid);
|
||||
if (tbl)
|
||||
|
@ -2851,6 +2851,18 @@ static int patch_i915_icl_hdmi(struct hda_codec *codec)
|
||||
return intel_hsw_common_init(codec, 0x02, map, ARRAY_SIZE(map));
|
||||
}
|
||||
|
||||
static int patch_i915_tgl_hdmi(struct hda_codec *codec)
|
||||
{
|
||||
/*
|
||||
* pin to port mapping table where the value indicate the pin number and
|
||||
* the index indicate the port number with 1 base.
|
||||
*/
|
||||
static const int map[] = {0x4, 0x6, 0x8, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf};
|
||||
|
||||
return intel_hsw_common_init(codec, 0x02, map, ARRAY_SIZE(map));
|
||||
}
|
||||
|
||||
|
||||
/* Intel Baytrail and Braswell; with eld notifier */
|
||||
static int patch_i915_byt_hdmi(struct hda_codec *codec)
|
||||
{
|
||||
@ -4153,6 +4165,7 @@ HDA_CODEC_ENTRY(0x8086280b, "Kabylake HDMI", patch_i915_hsw_hdmi),
|
||||
HDA_CODEC_ENTRY(0x8086280c, "Cannonlake HDMI", patch_i915_glk_hdmi),
|
||||
HDA_CODEC_ENTRY(0x8086280d, "Geminilake HDMI", patch_i915_glk_hdmi),
|
||||
HDA_CODEC_ENTRY(0x8086280f, "Icelake HDMI", patch_i915_icl_hdmi),
|
||||
HDA_CODEC_ENTRY(0x80862812, "Tigerlake HDMI", patch_i915_tgl_hdmi),
|
||||
HDA_CODEC_ENTRY(0x80862880, "CedarTrail HDMI", patch_generic_hdmi),
|
||||
HDA_CODEC_ENTRY(0x80862882, "Valleyview2 HDMI", patch_i915_byt_hdmi),
|
||||
HDA_CODEC_ENTRY(0x80862883, "Braswell HDMI", patch_i915_byt_hdmi),
|
||||
|
@ -410,8 +410,8 @@ static void hdac_hda_codec_remove(struct snd_soc_component *component)
|
||||
return;
|
||||
}
|
||||
|
||||
snd_hdac_ext_bus_link_put(hdev->bus, hlink);
|
||||
pm_runtime_disable(&hdev->dev);
|
||||
snd_hdac_ext_bus_link_put(hdev->bus, hlink);
|
||||
}
|
||||
|
||||
static const struct snd_soc_dapm_route hdac_hda_dapm_routes[] = {
|
||||
|
@ -274,7 +274,7 @@ struct hdmi_codec_priv {
|
||||
uint8_t eld[MAX_ELD_BYTES];
|
||||
struct snd_pcm_chmap *chmap_info;
|
||||
unsigned int chmap_idx;
|
||||
struct mutex lock;
|
||||
unsigned long busy;
|
||||
struct snd_soc_jack *jack;
|
||||
unsigned int jack_status;
|
||||
};
|
||||
@ -390,8 +390,8 @@ static int hdmi_codec_startup(struct snd_pcm_substream *substream,
|
||||
struct hdmi_codec_priv *hcp = snd_soc_dai_get_drvdata(dai);
|
||||
int ret = 0;
|
||||
|
||||
ret = mutex_trylock(&hcp->lock);
|
||||
if (!ret) {
|
||||
ret = test_and_set_bit(0, &hcp->busy);
|
||||
if (ret) {
|
||||
dev_err(dai->dev, "Only one simultaneous stream supported!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -419,7 +419,7 @@ static int hdmi_codec_startup(struct snd_pcm_substream *substream,
|
||||
|
||||
err:
|
||||
/* Release the exclusive lock on error */
|
||||
mutex_unlock(&hcp->lock);
|
||||
clear_bit(0, &hcp->busy);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -431,7 +431,7 @@ static void hdmi_codec_shutdown(struct snd_pcm_substream *substream,
|
||||
hcp->chmap_idx = HDMI_CODEC_CHMAP_IDX_UNKNOWN;
|
||||
hcp->hcd.ops->audio_shutdown(dai->dev->parent, hcp->hcd.data);
|
||||
|
||||
mutex_unlock(&hcp->lock);
|
||||
clear_bit(0, &hcp->busy);
|
||||
}
|
||||
|
||||
static int hdmi_codec_hw_params(struct snd_pcm_substream *substream,
|
||||
@ -811,8 +811,6 @@ static int hdmi_codec_probe(struct platform_device *pdev)
|
||||
return -ENOMEM;
|
||||
|
||||
hcp->hcd = *hcd;
|
||||
mutex_init(&hcp->lock);
|
||||
|
||||
daidrv = devm_kcalloc(dev, dai_count, sizeof(*daidrv), GFP_KERNEL);
|
||||
if (!daidrv)
|
||||
return -ENOMEM;
|
||||
|
@ -960,11 +960,11 @@ static int max98373_i2c_probe(struct i2c_client *i2c,
|
||||
|
||||
/* Power on device */
|
||||
if (gpio_is_valid(max98373->reset_gpio)) {
|
||||
ret = gpio_request(max98373->reset_gpio, "MAX98373_RESET");
|
||||
ret = devm_gpio_request(&i2c->dev, max98373->reset_gpio,
|
||||
"MAX98373_RESET");
|
||||
if (ret) {
|
||||
dev_err(&i2c->dev, "%s: Failed to request gpio %d\n",
|
||||
__func__, max98373->reset_gpio);
|
||||
gpio_free(max98373->reset_gpio);
|
||||
return -EINVAL;
|
||||
}
|
||||
gpio_direction_output(max98373->reset_gpio, 0);
|
||||
|
@ -306,7 +306,7 @@ struct pm8916_wcd_analog_priv {
|
||||
};
|
||||
|
||||
static const char *const adc2_mux_text[] = { "ZERO", "INP2", "INP3" };
|
||||
static const char *const rdac2_mux_text[] = { "ZERO", "RX2", "RX1" };
|
||||
static const char *const rdac2_mux_text[] = { "RX1", "RX2" };
|
||||
static const char *const hph_text[] = { "ZERO", "Switch", };
|
||||
|
||||
static const struct soc_enum hph_enum = SOC_ENUM_SINGLE_VIRT(
|
||||
@ -321,7 +321,7 @@ static const struct soc_enum adc2_enum = SOC_ENUM_SINGLE_VIRT(
|
||||
|
||||
/* RDAC2 MUX */
|
||||
static const struct soc_enum rdac2_mux_enum = SOC_ENUM_SINGLE(
|
||||
CDC_D_CDC_CONN_HPHR_DAC_CTL, 0, 3, rdac2_mux_text);
|
||||
CDC_D_CDC_CONN_HPHR_DAC_CTL, 0, 2, rdac2_mux_text);
|
||||
|
||||
static const struct snd_kcontrol_new spkr_switch[] = {
|
||||
SOC_DAPM_SINGLE("Switch", CDC_A_SPKR_DAC_CTL, 7, 1, 0)
|
||||
|
@ -555,10 +555,6 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev)
|
||||
return PTR_ERR(priv->clk);
|
||||
}
|
||||
|
||||
err = clk_prepare_enable(priv->clk);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
priv->extclk = devm_clk_get(&pdev->dev, "extclk");
|
||||
if (IS_ERR(priv->extclk)) {
|
||||
if (PTR_ERR(priv->extclk) == -EPROBE_DEFER)
|
||||
@ -574,6 +570,10 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev)
|
||||
}
|
||||
}
|
||||
|
||||
err = clk_prepare_enable(priv->clk);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
/* Some sensible defaults - this reflects the powerup values */
|
||||
priv->ctl_play = KIRKWOOD_PLAYCTL_SIZE_24;
|
||||
priv->ctl_rec = KIRKWOOD_RECCTL_SIZE_24;
|
||||
@ -587,7 +587,7 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev)
|
||||
priv->ctl_rec |= KIRKWOOD_RECCTL_BURST_128;
|
||||
}
|
||||
|
||||
err = devm_snd_soc_register_component(&pdev->dev, &kirkwood_soc_component,
|
||||
err = snd_soc_register_component(&pdev->dev, &kirkwood_soc_component,
|
||||
soc_dai, 2);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "snd_soc_register_component failed\n");
|
||||
@ -610,6 +610,7 @@ static int kirkwood_i2s_dev_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct kirkwood_dma_data *priv = dev_get_drvdata(&pdev->dev);
|
||||
|
||||
snd_soc_unregister_component(&pdev->dev);
|
||||
if (!IS_ERR(priv->extclk))
|
||||
clk_disable_unprepare(priv->extclk);
|
||||
clk_disable_unprepare(priv->clk);
|
||||
|
@ -66,10 +66,13 @@ static int rk_jack_event(struct notifier_block *nb, unsigned long event,
|
||||
struct snd_soc_jack *jack = (struct snd_soc_jack *)data;
|
||||
struct snd_soc_dapm_context *dapm = &jack->card->dapm;
|
||||
|
||||
if (event & SND_JACK_MICROPHONE)
|
||||
if (event & SND_JACK_MICROPHONE) {
|
||||
snd_soc_dapm_force_enable_pin(dapm, "MICBIAS");
|
||||
else
|
||||
snd_soc_dapm_force_enable_pin(dapm, "SHDN");
|
||||
} else {
|
||||
snd_soc_dapm_disable_pin(dapm, "MICBIAS");
|
||||
snd_soc_dapm_disable_pin(dapm, "SHDN");
|
||||
}
|
||||
|
||||
snd_soc_dapm_sync(dapm);
|
||||
|
||||
|
@ -508,10 +508,10 @@ static struct rsnd_mod_ops rsnd_dmapp_ops = {
|
||||
#define RDMA_SSI_I_N(addr, i) (addr ##_reg - 0x00300000 + (0x40 * i) + 0x8)
|
||||
#define RDMA_SSI_O_N(addr, i) (addr ##_reg - 0x00300000 + (0x40 * i) + 0xc)
|
||||
|
||||
#define RDMA_SSIU_I_N(addr, i, j) (addr ##_reg - 0x00441000 + (0x1000 * (i)) + (((j) / 4) * 0xA000) + (((j) % 4) * 0x400))
|
||||
#define RDMA_SSIU_I_N(addr, i, j) (addr ##_reg - 0x00441000 + (0x1000 * (i)) + (((j) / 4) * 0xA000) + (((j) % 4) * 0x400) - (0x4000 * ((i) / 9) * ((j) / 4)))
|
||||
#define RDMA_SSIU_O_N(addr, i, j) RDMA_SSIU_I_N(addr, i, j)
|
||||
|
||||
#define RDMA_SSIU_I_P(addr, i, j) (addr ##_reg - 0x00141000 + (0x1000 * (i)) + (((j) / 4) * 0xA000) + (((j) % 4) * 0x400))
|
||||
#define RDMA_SSIU_I_P(addr, i, j) (addr ##_reg - 0x00141000 + (0x1000 * (i)) + (((j) / 4) * 0xA000) + (((j) % 4) * 0x400) - (0x4000 * ((i) / 9) * ((j) / 4)))
|
||||
#define RDMA_SSIU_O_P(addr, i, j) RDMA_SSIU_I_P(addr, i, j)
|
||||
|
||||
#define RDMA_SRC_I_N(addr, i) (addr ##_reg - 0x00500000 + (0x400 * i))
|
||||
|
@ -152,8 +152,10 @@ static ssize_t sof_dfsentry_write(struct file *file, const char __user *buffer,
|
||||
*/
|
||||
dentry = file->f_path.dentry;
|
||||
if (strcmp(dentry->d_name.name, "ipc_flood_count") &&
|
||||
strcmp(dentry->d_name.name, "ipc_flood_duration_ms"))
|
||||
return -EINVAL;
|
||||
strcmp(dentry->d_name.name, "ipc_flood_duration_ms")) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!strcmp(dentry->d_name.name, "ipc_flood_duration_ms"))
|
||||
flood_duration_test = true;
|
||||
|
@ -190,7 +190,7 @@ hda_dsp_stream_get(struct snd_sof_dev *sdev, int direction)
|
||||
* Workaround to address a known issue with host DMA that results
|
||||
* in xruns during pause/release in capture scenarios.
|
||||
*/
|
||||
if (!IS_ENABLED(SND_SOC_SOF_HDA_ALWAYS_ENABLE_DMI_L1))
|
||||
if (!IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_ALWAYS_ENABLE_DMI_L1))
|
||||
if (stream && direction == SNDRV_PCM_STREAM_CAPTURE)
|
||||
snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
|
||||
HDA_VS_INTEL_EM2,
|
||||
@ -228,7 +228,7 @@ int hda_dsp_stream_put(struct snd_sof_dev *sdev, int direction, int stream_tag)
|
||||
spin_unlock_irq(&bus->reg_lock);
|
||||
|
||||
/* Enable DMI L1 entry if there are no capture streams open */
|
||||
if (!IS_ENABLED(SND_SOC_SOF_HDA_ALWAYS_ENABLE_DMI_L1))
|
||||
if (!IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_ALWAYS_ENABLE_DMI_L1))
|
||||
if (!active_capture_stream)
|
||||
snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
|
||||
HDA_VS_INTEL_EM2,
|
||||
|
@ -572,8 +572,10 @@ static int sof_set_get_large_ctrl_data(struct snd_sof_dev *sdev,
|
||||
else
|
||||
err = sof_get_ctrl_copy_params(cdata->type, partdata, cdata,
|
||||
sparams);
|
||||
if (err < 0)
|
||||
if (err < 0) {
|
||||
kfree(partdata);
|
||||
return err;
|
||||
}
|
||||
|
||||
msg_bytes = sparams->msg_bytes;
|
||||
pl_size = sparams->pl_size;
|
||||
|
@ -543,15 +543,16 @@ static int sof_control_load_bytes(struct snd_soc_component *scomp,
|
||||
struct soc_bytes_ext *sbe = (struct soc_bytes_ext *)kc->private_value;
|
||||
int max_size = sbe->max;
|
||||
|
||||
if (le32_to_cpu(control->priv.size) > max_size) {
|
||||
dev_err(sdev->dev, "err: bytes data size %d exceeds max %d.\n",
|
||||
control->priv.size, max_size);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* init the get/put bytes data */
|
||||
scontrol->size = sizeof(struct sof_ipc_ctrl_data) +
|
||||
le32_to_cpu(control->priv.size);
|
||||
|
||||
if (scontrol->size > max_size) {
|
||||
dev_err(sdev->dev, "err: bytes data size %d exceeds max %d.\n",
|
||||
scontrol->size, max_size);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
scontrol->control_data = kzalloc(max_size, GFP_KERNEL);
|
||||
cdata = scontrol->control_data;
|
||||
if (!scontrol->control_data)
|
||||
|
@ -1218,6 +1218,16 @@ static int stm32_sai_pcm_process_spdif(struct snd_pcm_substream *substream,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* No support of mmap in S/PDIF mode */
|
||||
static const struct snd_pcm_hardware stm32_sai_pcm_hw_spdif = {
|
||||
.info = SNDRV_PCM_INFO_INTERLEAVED,
|
||||
.buffer_bytes_max = 8 * PAGE_SIZE,
|
||||
.period_bytes_min = 1024,
|
||||
.period_bytes_max = PAGE_SIZE,
|
||||
.periods_min = 2,
|
||||
.periods_max = 8,
|
||||
};
|
||||
|
||||
static const struct snd_pcm_hardware stm32_sai_pcm_hw = {
|
||||
.info = SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_MMAP,
|
||||
.buffer_bytes_max = 8 * PAGE_SIZE,
|
||||
@ -1270,7 +1280,7 @@ static const struct snd_dmaengine_pcm_config stm32_sai_pcm_config = {
|
||||
};
|
||||
|
||||
static const struct snd_dmaengine_pcm_config stm32_sai_pcm_config_spdif = {
|
||||
.pcm_hardware = &stm32_sai_pcm_hw,
|
||||
.pcm_hardware = &stm32_sai_pcm_hw_spdif,
|
||||
.prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config,
|
||||
.process = stm32_sai_pcm_process_spdif,
|
||||
};
|
||||
|
@ -62,7 +62,7 @@ int sdma_pcm_platform_register(struct device *dev,
|
||||
config->chan_names[0] = txdmachan;
|
||||
config->chan_names[1] = rxdmachan;
|
||||
|
||||
return devm_snd_dmaengine_pcm_register(dev, config, 0);
|
||||
return devm_snd_dmaengine_pcm_register(dev, config, flags);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sdma_pcm_platform_register);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user