Commit 62abd092 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: usb-audio: Add implicit_fb module option

A new module option, implicit_fb, is added to specify the driver
looking for the implicit feedback sync.  This can be useful for a
device that could be working better in the implicit feed back mode and
user wants to test it quickly.  When this works, we can add the quirk
entry easily.
Tested-by: default avatarKeith Milner <kamilner@superlative.org>
Tested-by: default avatarDylan Robinson <dylan_robinson@motu.com>
Link: https://lore.kernel.org/r/20201123085347.19667-40-tiwai@suse.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 83b7dcbc
...@@ -2227,6 +2227,11 @@ quirk_alias ...@@ -2227,6 +2227,11 @@ quirk_alias
Quirk alias list, pass strings like ``0123abcd:5678beef``, which Quirk alias list, pass strings like ``0123abcd:5678beef``, which
applies the existing quirk for the device 5678:beef to a new applies the existing quirk for the device 5678:beef to a new
device 0123:abcd. device 0123:abcd.
implicit_fb
Apply the generic implicit feedback sync mode. When this is set
and the playback stream sync mode is ASYNC, the driver tries to
tie an adjacent ASYNC capture stream as the implicit feedback
source.
use_vmalloc use_vmalloc
Use vmalloc() for allocations of the PCM buffers (default: yes). Use vmalloc() for allocations of the PCM buffers (default: yes).
For architectures with non-coherent memory like ARM or MIPS, the For architectures with non-coherent memory like ARM or MIPS, the
......
...@@ -72,6 +72,7 @@ static bool ignore_ctl_error; ...@@ -72,6 +72,7 @@ static bool ignore_ctl_error;
static bool autoclock = true; static bool autoclock = true;
static char *quirk_alias[SNDRV_CARDS]; static char *quirk_alias[SNDRV_CARDS];
static char *delayed_register[SNDRV_CARDS]; static char *delayed_register[SNDRV_CARDS];
static bool implicit_fb[SNDRV_CARDS];
bool snd_usb_use_vmalloc = true; bool snd_usb_use_vmalloc = true;
bool snd_usb_skip_validation; bool snd_usb_skip_validation;
...@@ -97,6 +98,8 @@ module_param_array(quirk_alias, charp, NULL, 0444); ...@@ -97,6 +98,8 @@ module_param_array(quirk_alias, charp, NULL, 0444);
MODULE_PARM_DESC(quirk_alias, "Quirk aliases, e.g. 0123abcd:5678beef."); MODULE_PARM_DESC(quirk_alias, "Quirk aliases, e.g. 0123abcd:5678beef.");
module_param_array(delayed_register, charp, NULL, 0444); module_param_array(delayed_register, charp, NULL, 0444);
MODULE_PARM_DESC(delayed_register, "Quirk for delayed registration, given by id:iface, e.g. 0123abcd:4."); MODULE_PARM_DESC(delayed_register, "Quirk for delayed registration, given by id:iface, e.g. 0123abcd:4.");
module_param_array(implicit_fb, bool, NULL, 0444);
MODULE_PARM_DESC(implicit_fb, "Apply generic implicit feedback sync mode.");
module_param_named(use_vmalloc, snd_usb_use_vmalloc, bool, 0444); module_param_named(use_vmalloc, snd_usb_use_vmalloc, bool, 0444);
MODULE_PARM_DESC(use_vmalloc, "Use vmalloc for PCM intermediate buffers (default: yes)."); MODULE_PARM_DESC(use_vmalloc, "Use vmalloc for PCM intermediate buffers (default: yes).");
module_param_named(skip_validation, snd_usb_skip_validation, bool, 0444); module_param_named(skip_validation, snd_usb_skip_validation, bool, 0444);
...@@ -596,6 +599,7 @@ static int snd_usb_audio_create(struct usb_interface *intf, ...@@ -596,6 +599,7 @@ static int snd_usb_audio_create(struct usb_interface *intf,
chip->dev = dev; chip->dev = dev;
chip->card = card; chip->card = card;
chip->setup = device_setup[idx]; chip->setup = device_setup[idx];
chip->generic_implicit_fb = implicit_fb[idx];
chip->autoclock = autoclock; chip->autoclock = autoclock;
atomic_set(&chip->active, 1); /* avoid autopm during probing */ atomic_set(&chip->active, 1); /* avoid autopm during probing */
atomic_set(&chip->usage_count, 0); atomic_set(&chip->usage_count, 0);
......
...@@ -269,6 +269,10 @@ static int audioformat_implicit_fb_quirk(struct snd_usb_audio *chip, ...@@ -269,6 +269,10 @@ static int audioformat_implicit_fb_quirk(struct snd_usb_audio *chip,
return 1; return 1;
} }
/* Try the generic implicit fb if available */
if (chip->generic_implicit_fb)
return add_generic_implicit_fb(chip, fmt, alts);
/* No quirk */ /* No quirk */
return 0; return 0;
} }
......
...@@ -51,6 +51,7 @@ struct snd_usb_audio { ...@@ -51,6 +51,7 @@ struct snd_usb_audio {
struct list_head mixer_list; /* list of mixer interfaces */ struct list_head mixer_list; /* list of mixer interfaces */
int setup; /* from the 'device_setup' module param */ int setup; /* from the 'device_setup' module param */
bool generic_implicit_fb; /* from the 'implicit_fb' module param */
bool autoclock; /* from the 'autoclock' module param */ bool autoclock; /* from the 'autoclock' module param */
struct usb_host_interface *ctrl_intf; /* the audio control interface */ struct usb_host_interface *ctrl_intf; /* the audio control interface */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment