ALSA: dice: fix regression for Lexicon I-ONIX FW810S
For Lexicon I-ONIX FW810S, the call of ioctl(2) with SNDRV_PCM_IOCTL_HW_PARAMS can returns -ETIMEDOUT. This is a regression due to the commit41319eb56e
("ALSA: dice: wait just for NOTIFY_CLOCK_ACCEPTED after GLOBAL_CLOCK_SELECT operation"). The device does not emit NOTIFY_CLOCK_ACCEPTED notification when accepting GLOBAL_CLOCK_SELECT operation with the same parameters as current ones. This commit fixes the regression. When receiving no notification, return -ETIMEDOUT as long as operating for any change. Fixes:41319eb56e
("ALSA: dice: wait just for NOTIFY_CLOCK_ACCEPTED after GLOBAL_CLOCK_SELECT operation") Cc: <stable@vger.kernel.org> Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Link: https://lore.kernel.org/r/20221130130604.29774-1-o-takashi@sakamocchi.jp Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
ecae4c8954
commit
9b84f0f74d
|
@ -59,7 +59,7 @@ int snd_dice_stream_get_rate_mode(struct snd_dice *dice, unsigned int rate,
|
||||||
|
|
||||||
static int select_clock(struct snd_dice *dice, unsigned int rate)
|
static int select_clock(struct snd_dice *dice, unsigned int rate)
|
||||||
{
|
{
|
||||||
__be32 reg;
|
__be32 reg, new;
|
||||||
u32 data;
|
u32 data;
|
||||||
int i;
|
int i;
|
||||||
int err;
|
int err;
|
||||||
|
@ -83,15 +83,17 @@ static int select_clock(struct snd_dice *dice, unsigned int rate)
|
||||||
if (completion_done(&dice->clock_accepted))
|
if (completion_done(&dice->clock_accepted))
|
||||||
reinit_completion(&dice->clock_accepted);
|
reinit_completion(&dice->clock_accepted);
|
||||||
|
|
||||||
reg = cpu_to_be32(data);
|
new = cpu_to_be32(data);
|
||||||
err = snd_dice_transaction_write_global(dice, GLOBAL_CLOCK_SELECT,
|
err = snd_dice_transaction_write_global(dice, GLOBAL_CLOCK_SELECT,
|
||||||
®, sizeof(reg));
|
&new, sizeof(new));
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
if (wait_for_completion_timeout(&dice->clock_accepted,
|
if (wait_for_completion_timeout(&dice->clock_accepted,
|
||||||
msecs_to_jiffies(NOTIFICATION_TIMEOUT_MS)) == 0)
|
msecs_to_jiffies(NOTIFICATION_TIMEOUT_MS)) == 0) {
|
||||||
return -ETIMEDOUT;
|
if (reg != new)
|
||||||
|
return -ETIMEDOUT;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue