2019-05-27 09:55:05 +03:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
2005-04-17 02:20:36 +04:00
|
|
|
#ifndef __USBAUDIO_H
|
|
|
|
#define __USBAUDIO_H
|
|
|
|
/*
|
|
|
|
* (Tentative) USB Audio Driver for ALSA
|
|
|
|
*
|
|
|
|
* Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de>
|
|
|
|
*/
|
|
|
|
|
2005-05-02 10:51:26 +04:00
|
|
|
/* handling of USB vendor/product ID pairs as 32-bit numbers */
|
|
|
|
#define USB_ID(vendor, product) (((vendor) << 16) | (product))
|
|
|
|
#define USB_ID_VENDOR(id) ((id) >> 16)
|
|
|
|
#define USB_ID_PRODUCT(id) ((u16)(id))
|
|
|
|
|
2005-04-17 02:20:36 +04:00
|
|
|
/*
|
2010-03-04 21:46:13 +03:00
|
|
|
*
|
2005-04-17 02:20:36 +04:00
|
|
|
*/
|
|
|
|
|
media: sound/usb: Use Media Controller API to share media resources
Media Device Allocator API to allows multiple drivers share a media device.
This API solves a very common use-case for media devices where one physical
device (an USB stick) provides both audio and video. When such media device
exposes a standard USB Audio class, a proprietary Video class, two or more
independent drivers will share a single physical USB bridge. In such cases,
it is necessary to coordinate access to the shared resource.
Using this API, drivers can allocate a media device with the shared struct
device as the key. Once the media device is allocated by a driver, other
drivers can get a reference to it. The media device is released when all
the references are released.
Change the ALSA driver to use the Media Controller API to share media
resources with DVB, and V4L2 drivers on a AU0828 media device.
The Media Controller specific initialization is done after sound card is
registered. ALSA creates Media interface and entity function graph nodes
for Control, Mixer, PCM Playback, and PCM Capture devices.
snd_usb_hw_params() will call Media Controller enable source handler
interface to request the media resource. If resource request is granted,
it will release it from snd_usb_hw_free(). If resource is busy, -EBUSY is
returned.
Media specific cleanup is done in usb_audio_disconnect().
Reviewed-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Shuah Khan <shuah@kernel.org>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
2019-04-02 03:40:22 +03:00
|
|
|
struct media_device;
|
|
|
|
struct media_intf_devnode;
|
|
|
|
|
2005-04-17 02:20:36 +04:00
|
|
|
struct snd_usb_audio {
|
|
|
|
int index;
|
|
|
|
struct usb_device *dev;
|
2005-11-17 17:08:02 +03:00
|
|
|
struct snd_card *card;
|
2011-03-11 16:51:12 +03:00
|
|
|
struct usb_interface *pm_intf;
|
2005-05-02 10:51:26 +04:00
|
|
|
u32 usb_id;
|
2012-04-12 15:51:10 +04:00
|
|
|
struct mutex mutex;
|
ALSA: usb-audio: Fix inconsistent card PM state after resume
When a USB-audio interface gets runtime-suspended via auto-pm feature,
the driver suspends all functionality and increment
chip->num_suspended_intf. Later on, when the system gets suspended to
S3, the driver increments chip->num_suspended_intf again, skips the
device changes, and sets the card power state to
SNDRV_CTL_POWER_D3hot. In return, when the system gets resumed from
S3, the resume callback decrements chip->num_suspended_intf. Since
this refcount is still not zero (it's been runtime-suspended), the
whole resume is skipped. But there is a small pitfall here.
The problem is that the driver doesn't restore the card power state
after this resume call, leaving it as SNDRV_CTL_POWER_D3hot. So,
even after the system resume finishes, the card instance still appears
as if it were system-suspended, and this confuses many ioctl accesses
that are blocked unexpectedly.
In details, we have two issues behind the scene: one is that the card
power state is changed only when the refcount becomes zero, and
another is that the prior auto-suspend check is kept in a boolean
flag. Although the latter problem is almost negligible since the
auto-pm feature is imposed only on the primary interface, but this can
be a potential problem on the devices with multiple interfaces.
This patch addresses those issues by the following:
- Replace chip->autosuspended boolean flag with chip->system_suspend
counter
- At the first system-suspend, chip->num_suspended_intf is recorded to
chip->system_suspend
- At system-resume, the card power state is restored when the
chip->num_suspended_intf refcount reaches to chip->system_suspend,
i.e. the state returns to the auto-suspended
Also, the patch fixes yet another hidden problem by the code
refactoring along with the fixes above: namely, when some resume
procedure failed, the driver left chip->num_suspended_intf that was
already decreased, and it might lead to the refcount unbalance.
In the new code, the refcount decrement is done after the whole resume
procedure, and the problem is avoided as well.
Fixes: 0662292aec05 ("ALSA: usb-audio: Handle normal and auto-suspend equally")
Reported-and-tested-by: Macpaul Lin <macpaul.lin@mediatek.com>
Cc: <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20200603153709.6293-1-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2020-06-03 18:37:08 +03:00
|
|
|
unsigned int system_suspend;
|
ALSA: usb-audio: Avoid nested autoresume calls
After the recent fix of runtime PM for USB-audio driver, we got a
lockdep warning like:
=============================================
[ INFO: possible recursive locking detected ]
4.2.0-rc8+ #61 Not tainted
---------------------------------------------
pulseaudio/980 is trying to acquire lock:
(&chip->shutdown_rwsem){.+.+.+}, at: [<ffffffffa0355dac>] snd_usb_autoresume+0x1d/0x52 [snd_usb_audio]
but task is already holding lock:
(&chip->shutdown_rwsem){.+.+.+}, at: [<ffffffffa0355dac>] snd_usb_autoresume+0x1d/0x52 [snd_usb_audio]
This comes from snd_usb_autoresume() invoking down_read() and it's
used in a nested way. Although it's basically safe, per se (as these
are read locks), it's better to reduce such spurious warnings.
The read lock is needed to guarantee the execution of "shutdown"
(cleanup at disconnection) task after all concurrent tasks are
finished. This can be implemented in another better way.
Also, the current check of chip->in_pm isn't good enough for
protecting the racy execution of multiple auto-resumes.
This patch rewrites the logic of snd_usb_autoresume() & co; namely,
- The recursive call of autopm is avoided by the new refcount,
chip->active. The chip->in_pm flag is removed accordingly.
- Instead of rwsem, another refcount, chip->usage_count, is introduced
for tracking the period to delay the shutdown procedure. At
the last clear of this refcount, wake_up() to the shutdown waiter is
called.
- The shutdown flag is replaced with shutdown atomic count; this is
for reducing the lock.
- Two new helpers are introduced to simplify the management of these
refcounts; snd_usb_lock_shutdown() increases the usage_count, checks
the shutdown state, and does autoresume. snd_usb_unlock_shutdown()
does the opposite. Most of mixer and other codes just need this,
and simply returns an error if it receives an error from lock.
Fixes: 9003ebb13f61 ('ALSA: usb-audio: Fix runtime PM unbalance')
Reported-and-tested-by: Alexnader Kuleshov <kuleshovmail@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2015-08-25 17:09:00 +03:00
|
|
|
atomic_t active;
|
|
|
|
atomic_t shutdown;
|
|
|
|
atomic_t usage_count;
|
|
|
|
wait_queue_head_t shutdown_wait;
|
2009-12-27 20:19:58 +03:00
|
|
|
unsigned int txfr_quirk:1; /* Subframe boundaries on transfers */
|
ALSA: USB-audio: Add quirk for Zoom R16/24 playback
The Zoom R16/24 have a nonstandard playback format where each isochronous
packet contains a length descriptor in the first four bytes. (Curiously,
capture data does not contain this and requires no quirk.)
The quirk involves adding the extra length descriptor whenever outgoing
isochronous packets are generated, both in pcm.c (outgoing audio) and
endpoint.c (silent data).
In order to make the quirk as unintrusive as possible, for
pcm.c:prepare_playback_urb(), the isochronous packet descriptors are
initially set up in the same way no matter if the quirk is enabled or not.
Once it is time to actually copy the data into the outgoing packet buffer
(together with the added length descriptors) the isochronous descriptors
are adjusted in order take the increased payload length into account.
For endpoint.c:prepare_silent_urb() it makes more sense to modify the
actual function, partly because the function is less complex to start with
and partly because it is not as time-critical as prepare_playback_urb()
(whose bulk is run with interrupts disabled), so the (minute) additional
time spent in the non-quirk case is motivated by the simplicity of having
a single function for all cases.
The quirk is controlled by the new tx_length_quirk member in struct
snd_usb_substream and struct snd_usb_audio, which is conveyed to pcm.c
and endpoint.c from quirks.c in a similar manner to the txfr_quirk member
in the same structs.
In contrast to txfr_quirk however, the quirk is enabled directly in
quirks.c:create_standard_audio_quirk() by checking the USB ID in that
function. Another option would be to introduce a new
QUIRK_AUDIO_ZOOM_INTERFACE or somesuch, which would have made the quirk
very plain to see in the quirk table, but it was felt that the additional
code needed to implement it this way would just make the implementation
more complex with no real gain.
Tested with a Zoom R16, both by doing capture and playback separately
using arecord and aplay (8 channel capture and 2 channel playback,
respectively), as well as capture and playback together using Ardour, as
well as Audacity and Qtractor together with jackd.
The R24 is reportedly compatible with the R16 when used as an audio
interface. Both devices share the same USB ID and have the same number of
inputs (8) and outputs (2). Therefore "R16/24" is mentioned throughout the
patch.
Regression tested using an Edirol UA-5 in both class compliant (16-bit)
and "advanced" (24 bit, forces the use of quirks) modes.
Signed-off-by: Ricard Wanderlof <ricardw@axis.com>
Tested-by: Panu Matilainen <pmatilai@laiskiainen.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2015-10-19 09:52:53 +03:00
|
|
|
unsigned int tx_length_quirk:1; /* Put length specifier in transfers */
|
2019-12-18 16:26:50 +03:00
|
|
|
unsigned int setup_fmt_after_resume_quirk:1; /* setup the format to interface after resume */
|
2020-03-25 13:33:21 +03:00
|
|
|
unsigned int need_delayed_register:1; /* warn for delayed registration */
|
2005-04-17 02:20:36 +04:00
|
|
|
int num_interfaces;
|
2007-12-14 16:42:41 +03:00
|
|
|
int num_suspended_intf;
|
2016-04-29 12:49:04 +03:00
|
|
|
int sample_rate_read_error;
|
2005-04-17 02:20:36 +04:00
|
|
|
|
2018-05-04 04:24:04 +03:00
|
|
|
int badd_profile; /* UAC3 BADD profile */
|
|
|
|
|
2005-04-17 02:20:36 +04:00
|
|
|
struct list_head pcm_list; /* list of pcm streams */
|
2012-04-12 15:51:11 +04:00
|
|
|
struct list_head ep_list; /* list of audio-related endpoints */
|
2005-04-17 02:20:36 +04:00
|
|
|
int pcm_devs;
|
|
|
|
|
|
|
|
struct list_head midi_list; /* list of midi interfaces */
|
|
|
|
|
2005-04-29 18:23:13 +04:00
|
|
|
struct list_head mixer_list; /* list of mixer interfaces */
|
2010-03-04 21:46:13 +03:00
|
|
|
|
|
|
|
int setup; /* from the 'device_setup' module param */
|
2013-04-04 01:18:56 +04:00
|
|
|
bool autoclock; /* from the 'autoclock' module param */
|
2018-05-02 11:04:27 +03:00
|
|
|
bool keep_iface; /* keep interface/altset after closing
|
|
|
|
* or parameter change
|
|
|
|
*/
|
2010-05-31 16:51:31 +04:00
|
|
|
|
|
|
|
struct usb_host_interface *ctrl_intf; /* the audio control interface */
|
media: sound/usb: Use Media Controller API to share media resources
Media Device Allocator API to allows multiple drivers share a media device.
This API solves a very common use-case for media devices where one physical
device (an USB stick) provides both audio and video. When such media device
exposes a standard USB Audio class, a proprietary Video class, two or more
independent drivers will share a single physical USB bridge. In such cases,
it is necessary to coordinate access to the shared resource.
Using this API, drivers can allocate a media device with the shared struct
device as the key. Once the media device is allocated by a driver, other
drivers can get a reference to it. The media device is released when all
the references are released.
Change the ALSA driver to use the Media Controller API to share media
resources with DVB, and V4L2 drivers on a AU0828 media device.
The Media Controller specific initialization is done after sound card is
registered. ALSA creates Media interface and entity function graph nodes
for Control, Mixer, PCM Playback, and PCM Capture devices.
snd_usb_hw_params() will call Media Controller enable source handler
interface to request the media resource. If resource request is granted,
it will release it from snd_usb_hw_free(). If resource is busy, -EBUSY is
returned.
Media specific cleanup is done in usb_audio_disconnect().
Reviewed-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Shuah Khan <shuah@kernel.org>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
2019-04-02 03:40:22 +03:00
|
|
|
struct media_device *media_dev;
|
|
|
|
struct media_intf_devnode *ctl_intf_media_devnode;
|
2005-04-17 02:20:36 +04:00
|
|
|
};
|
|
|
|
|
2014-02-26 16:02:17 +04:00
|
|
|
#define usb_audio_err(chip, fmt, args...) \
|
|
|
|
dev_err(&(chip)->dev->dev, fmt, ##args)
|
|
|
|
#define usb_audio_warn(chip, fmt, args...) \
|
|
|
|
dev_warn(&(chip)->dev->dev, fmt, ##args)
|
|
|
|
#define usb_audio_info(chip, fmt, args...) \
|
|
|
|
dev_info(&(chip)->dev->dev, fmt, ##args)
|
|
|
|
#define usb_audio_dbg(chip, fmt, args...) \
|
|
|
|
dev_dbg(&(chip)->dev->dev, fmt, ##args)
|
|
|
|
|
2005-04-17 02:20:36 +04:00
|
|
|
/*
|
|
|
|
* Information about devices with broken descriptors
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* special values for .ifnum */
|
|
|
|
#define QUIRK_NO_INTERFACE -2
|
|
|
|
#define QUIRK_ANY_INTERFACE -1
|
|
|
|
|
2005-07-25 18:19:10 +04:00
|
|
|
enum quirk_type {
|
|
|
|
QUIRK_IGNORE_INTERFACE,
|
|
|
|
QUIRK_COMPOSITE,
|
2013-04-01 01:43:12 +04:00
|
|
|
QUIRK_AUTODETECT,
|
2005-07-25 18:19:10 +04:00
|
|
|
QUIRK_MIDI_STANDARD_INTERFACE,
|
|
|
|
QUIRK_MIDI_FIXED_ENDPOINT,
|
|
|
|
QUIRK_MIDI_YAMAHA,
|
2013-04-01 01:43:12 +04:00
|
|
|
QUIRK_MIDI_ROLAND,
|
2005-07-25 18:19:10 +04:00
|
|
|
QUIRK_MIDI_MIDIMAN,
|
|
|
|
QUIRK_MIDI_NOVATION,
|
2010-10-22 20:20:48 +04:00
|
|
|
QUIRK_MIDI_RAW_BYTES,
|
2005-07-25 18:19:10 +04:00
|
|
|
QUIRK_MIDI_EMAGIC,
|
2006-02-07 19:11:06 +03:00
|
|
|
QUIRK_MIDI_CME,
|
2010-05-20 23:31:10 +04:00
|
|
|
QUIRK_MIDI_AKAI,
|
2008-07-30 17:13:29 +04:00
|
|
|
QUIRK_MIDI_US122L,
|
2011-08-26 15:19:49 +04:00
|
|
|
QUIRK_MIDI_FTDI,
|
2015-11-16 00:38:29 +03:00
|
|
|
QUIRK_MIDI_CH345,
|
2005-07-25 18:19:10 +04:00
|
|
|
QUIRK_AUDIO_STANDARD_INTERFACE,
|
|
|
|
QUIRK_AUDIO_FIXED_ENDPOINT,
|
2008-10-04 18:27:36 +04:00
|
|
|
QUIRK_AUDIO_EDIROL_UAXX,
|
2009-12-27 20:19:59 +03:00
|
|
|
QUIRK_AUDIO_ALIGN_TRANSFER,
|
2011-05-25 11:09:02 +04:00
|
|
|
QUIRK_AUDIO_STANDARD_MIXER,
|
2019-12-18 16:26:50 +03:00
|
|
|
QUIRK_SETUP_FMT_AFTER_RESUME,
|
2005-07-25 18:19:10 +04:00
|
|
|
|
|
|
|
QUIRK_TYPE_COUNT
|
|
|
|
};
|
2005-04-17 02:20:36 +04:00
|
|
|
|
|
|
|
struct snd_usb_audio_quirk {
|
|
|
|
const char *vendor_name;
|
|
|
|
const char *product_name;
|
2018-05-02 15:45:37 +03:00
|
|
|
const char *profile_name; /* override the card->longname */
|
2005-04-17 02:20:36 +04:00
|
|
|
int16_t ifnum;
|
2005-07-25 18:19:10 +04:00
|
|
|
uint16_t type;
|
media: sound/usb: Use Media Controller API to share media resources
Media Device Allocator API to allows multiple drivers share a media device.
This API solves a very common use-case for media devices where one physical
device (an USB stick) provides both audio and video. When such media device
exposes a standard USB Audio class, a proprietary Video class, two or more
independent drivers will share a single physical USB bridge. In such cases,
it is necessary to coordinate access to the shared resource.
Using this API, drivers can allocate a media device with the shared struct
device as the key. Once the media device is allocated by a driver, other
drivers can get a reference to it. The media device is released when all
the references are released.
Change the ALSA driver to use the Media Controller API to share media
resources with DVB, and V4L2 drivers on a AU0828 media device.
The Media Controller specific initialization is done after sound card is
registered. ALSA creates Media interface and entity function graph nodes
for Control, Mixer, PCM Playback, and PCM Capture devices.
snd_usb_hw_params() will call Media Controller enable source handler
interface to request the media resource. If resource request is granted,
it will release it from snd_usb_hw_free(). If resource is busy, -EBUSY is
returned.
Media specific cleanup is done in usb_audio_disconnect().
Reviewed-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Shuah Khan <shuah@kernel.org>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
2019-04-02 03:40:22 +03:00
|
|
|
bool shares_media_device;
|
2005-04-17 02:20:36 +04:00
|
|
|
const void *data;
|
|
|
|
};
|
|
|
|
|
2009-11-07 00:44:53 +03:00
|
|
|
#define combine_word(s) ((*(s)) | ((unsigned int)(s)[1] << 8))
|
2005-04-17 02:20:36 +04:00
|
|
|
#define combine_triple(s) (combine_word(s) | ((unsigned int)(s)[2] << 16))
|
|
|
|
#define combine_quad(s) (combine_triple(s) | ((unsigned int)(s)[3] << 24))
|
|
|
|
|
ALSA: usb-audio: Avoid nested autoresume calls
After the recent fix of runtime PM for USB-audio driver, we got a
lockdep warning like:
=============================================
[ INFO: possible recursive locking detected ]
4.2.0-rc8+ #61 Not tainted
---------------------------------------------
pulseaudio/980 is trying to acquire lock:
(&chip->shutdown_rwsem){.+.+.+}, at: [<ffffffffa0355dac>] snd_usb_autoresume+0x1d/0x52 [snd_usb_audio]
but task is already holding lock:
(&chip->shutdown_rwsem){.+.+.+}, at: [<ffffffffa0355dac>] snd_usb_autoresume+0x1d/0x52 [snd_usb_audio]
This comes from snd_usb_autoresume() invoking down_read() and it's
used in a nested way. Although it's basically safe, per se (as these
are read locks), it's better to reduce such spurious warnings.
The read lock is needed to guarantee the execution of "shutdown"
(cleanup at disconnection) task after all concurrent tasks are
finished. This can be implemented in another better way.
Also, the current check of chip->in_pm isn't good enough for
protecting the racy execution of multiple auto-resumes.
This patch rewrites the logic of snd_usb_autoresume() & co; namely,
- The recursive call of autopm is avoided by the new refcount,
chip->active. The chip->in_pm flag is removed accordingly.
- Instead of rwsem, another refcount, chip->usage_count, is introduced
for tracking the period to delay the shutdown procedure. At
the last clear of this refcount, wake_up() to the shutdown waiter is
called.
- The shutdown flag is replaced with shutdown atomic count; this is
for reducing the lock.
- Two new helpers are introduced to simplify the management of these
refcounts; snd_usb_lock_shutdown() increases the usage_count, checks
the shutdown state, and does autoresume. snd_usb_unlock_shutdown()
does the opposite. Most of mixer and other codes just need this,
and simply returns an error if it receives an error from lock.
Fixes: 9003ebb13f61 ('ALSA: usb-audio: Fix runtime PM unbalance')
Reported-and-tested-by: Alexnader Kuleshov <kuleshovmail@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2015-08-25 17:09:00 +03:00
|
|
|
int snd_usb_lock_shutdown(struct snd_usb_audio *chip);
|
|
|
|
void snd_usb_unlock_shutdown(struct snd_usb_audio *chip);
|
|
|
|
|
2018-05-27 14:01:17 +03:00
|
|
|
extern bool snd_usb_use_vmalloc;
|
2019-11-14 19:56:13 +03:00
|
|
|
extern bool snd_usb_skip_validation;
|
2018-05-27 14:01:17 +03:00
|
|
|
|
2005-04-17 02:20:36 +04:00
|
|
|
#endif /* __USBAUDIO_H */
|