Merge tag 'sound-4.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound updates from Takashi Iwai: "It was a busy development cycle at this time, as you can see a wide range of changes in diffstat. There are no big changes but many refactoring and improvements. Here we go some highlights: ALSA core: - Procfs codes were cleaned up to use seq_file - Procfs can be opt out via Kconfig (only for EXPERT) - Two types of jack API were unified finally; now both kctl and input jack devs are handled via a single function call. HD-audio: - Continued code restructuring for the future ASoC driver; now HDA controller driver is split to a core helper module. - Preliminary codes for Skylake audio support in HDA core. - Proper i915 gfx power well management for SKL & co - Enabled runtime PM as default for Intel HDMI/DP codecs - Newer Tegra chip supports - More quirks for Dell headsets, Alienware (with CA0132), etc. - A couple of DRM ELD helper API functions ASoC: - Support for loading ASoC topology maps from firmware, intended to be used to allow self-describing DSP firmware images to be built which can map controls added by the DSP to userspace without the kernel needing to know about individual DSP firmwares - Lots of refactoring to avoid direct access to snd_soc_codec where it's not needed supporting future refactoring - Big refactoring, cleanup and enhancement for the Wolfson ADSP driver - Cleanup series for TI TAS2552 and R-CAR drivers - Fixes and improvements on RT56xx codecs - Support for TI TAS571x power amplifiers - Support for Qualcomm APQ8016 and ZTE ZX296702 SoCs - Support for x86 systems with RT5650 and Qualcomm Storm - Support for Mediatek AFE (Audio Front End) unit - Other various small fixes to ASoC codec drivers Firewire: - Enhanced to allow non-blocking streams to use timestamp synchronization - Improve support for DM1500 and BeBoBv3 Misc: - Cleanup of old pci API functions over all PCI sound drivers - Fix long-standing regression of the old powermac i2c setup" * tag 'sound-4.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (533 commits) ALSA: pcm: Fix pcm_class sysfs output ALSA: hda-beep: Update authors dead email address ASoC: wm_adsp: Move DSP Rate controls into the codec ASoC: wm8995: Fix setting sysclk for WM8995_SYSCLK_MCLK2 case ALSA: hda: provide default bus io ops extended hdac ALSA: hda: add hda link cleanup routine ALSA: hda: add hdac_ext stream creation and cleanup routines ASoC: rsrc-card: remove unused ret ALSA: HDAC: move SND_HDA_PREALLOC_SIZE to core ASoC: mediatek: Add machine driver for rt5650 rt5676 codec ASoC: mediatek: Add machine driver for MAX98090 codec ASoC: mediatek: Add AFE platform driver ASoC: rsnd: remove io from rsnd_mod ASoC: rsnd: move rsnd_mod_is_working() to rsnd_io_is_working() ASoC: rsnd: don't use rsnd_mod_to_io() on snd_kcontrol ASoC: rsnd: don't use rsnd_mod_to_io() on rsnd_src_xxx() ASoC: rsnd: don't use rsnd_mod_to_io() on rsnd_ssi_xxx() ASoC: rsnd: don't use rsnd_mod_to_io() on rsnd_dma_xxx() ASoC: rsnd: don't use rsnd_mod_to_io() on rsnd_get_adinr() ASoC: rsnd: add common interrupt handler for SSI/SRC/DMA ...
This commit is contained in:
@@ -6,6 +6,12 @@ config SND_PCM
|
||||
tristate
|
||||
select SND_TIMER
|
||||
|
||||
config SND_PCM_ELD
|
||||
bool
|
||||
|
||||
config SND_PCM_IEC958
|
||||
bool
|
||||
|
||||
config SND_DMAENGINE_PCM
|
||||
tristate
|
||||
|
||||
@@ -176,9 +182,18 @@ config SND_SUPPORT_OLD_API
|
||||
Say Y here to support the obsolete ALSA PCM API (ver.0.9.0 rc3
|
||||
or older).
|
||||
|
||||
config SND_PROC_FS
|
||||
bool "Sound Proc FS Support" if EXPERT
|
||||
depends on PROC_FS
|
||||
default y
|
||||
help
|
||||
Say 'N' to disable Sound proc FS, which may reduce code size about
|
||||
9KB on x86_64 platform.
|
||||
If unsure say Y.
|
||||
|
||||
config SND_VERBOSE_PROCFS
|
||||
bool "Verbose procfs contents"
|
||||
depends on PROC_FS
|
||||
depends on SND_PROC_FS
|
||||
default y
|
||||
help
|
||||
Say Y here to include code for verbose procfs contents (provides
|
||||
@@ -221,9 +236,6 @@ config SND_PCM_XRUN_DEBUG
|
||||
config SND_VMASTER
|
||||
bool
|
||||
|
||||
config SND_KCTL_JACK
|
||||
bool
|
||||
|
||||
config SND_DMA_SGBUF
|
||||
def_bool y
|
||||
depends on X86
|
||||
|
@@ -3,16 +3,21 @@
|
||||
# Copyright (c) 1999,2001 by Jaroslav Kysela <perex@perex.cz>
|
||||
#
|
||||
|
||||
snd-y := sound.o init.o memory.o info.o control.o misc.o device.o
|
||||
snd-y := sound.o init.o memory.o control.o misc.o device.o
|
||||
ifneq ($(CONFIG_SND_PROC_FS),)
|
||||
snd-y += info.o
|
||||
snd-$(CONFIG_SND_OSSEMUL) += info_oss.o
|
||||
endif
|
||||
snd-$(CONFIG_ISA_DMA_API) += isadma.o
|
||||
snd-$(CONFIG_SND_OSSEMUL) += sound_oss.o info_oss.o
|
||||
snd-$(CONFIG_SND_OSSEMUL) += sound_oss.o
|
||||
snd-$(CONFIG_SND_VMASTER) += vmaster.o
|
||||
snd-$(CONFIG_SND_KCTL_JACK) += ctljack.o
|
||||
snd-$(CONFIG_SND_JACK) += jack.o
|
||||
snd-$(CONFIG_SND_JACK) += ctljack.o jack.o
|
||||
|
||||
snd-pcm-y := pcm.o pcm_native.o pcm_lib.o pcm_timer.o pcm_misc.o \
|
||||
pcm_memory.o memalloc.o
|
||||
snd-pcm-$(CONFIG_SND_DMA_SGBUF) += sgbuf.o
|
||||
snd-pcm-$(CONFIG_SND_PCM_ELD) += pcm_drm_eld.o
|
||||
snd-pcm-$(CONFIG_SND_PCM_IEC958) += pcm_iec958.o
|
||||
|
||||
# for trace-points
|
||||
CFLAGS_pcm_lib.o := -I$(src)
|
||||
|
@@ -31,19 +31,49 @@ static struct snd_kcontrol_new jack_detect_kctl = {
|
||||
.get = jack_detect_kctl_get,
|
||||
};
|
||||
|
||||
static int get_available_index(struct snd_card *card, const char *name)
|
||||
{
|
||||
struct snd_ctl_elem_id sid;
|
||||
|
||||
memset(&sid, 0, sizeof(sid));
|
||||
|
||||
sid.index = 0;
|
||||
sid.iface = SNDRV_CTL_ELEM_IFACE_CARD;
|
||||
strlcpy(sid.name, name, sizeof(sid.name));
|
||||
|
||||
while (snd_ctl_find_id(card, &sid))
|
||||
sid.index++;
|
||||
|
||||
return sid.index;
|
||||
}
|
||||
|
||||
static void jack_kctl_name_gen(char *name, const char *src_name, int size)
|
||||
{
|
||||
size_t count = strlen(src_name);
|
||||
bool need_cat = true;
|
||||
|
||||
/* remove redundant " Jack" from src_name */
|
||||
if (count >= 5)
|
||||
need_cat = strncmp(&src_name[count - 5], " Jack", 5) ? true : false;
|
||||
|
||||
snprintf(name, size, need_cat ? "%s Jack" : "%s", src_name);
|
||||
|
||||
}
|
||||
|
||||
struct snd_kcontrol *
|
||||
snd_kctl_jack_new(const char *name, int idx, void *private_data)
|
||||
snd_kctl_jack_new(const char *name, struct snd_card *card)
|
||||
{
|
||||
struct snd_kcontrol *kctl;
|
||||
kctl = snd_ctl_new1(&jack_detect_kctl, private_data);
|
||||
|
||||
kctl = snd_ctl_new1(&jack_detect_kctl, NULL);
|
||||
if (!kctl)
|
||||
return NULL;
|
||||
snprintf(kctl->id.name, sizeof(kctl->id.name), "%s Jack", name);
|
||||
kctl->id.index = idx;
|
||||
|
||||
jack_kctl_name_gen(kctl->id.name, name, sizeof(kctl->id.name));
|
||||
kctl->id.index = get_available_index(card, kctl->id.name);
|
||||
kctl->private_value = 0;
|
||||
return kctl;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_kctl_jack_new);
|
||||
|
||||
void snd_kctl_jack_report(struct snd_card *card,
|
||||
struct snd_kcontrol *kctl, bool status)
|
||||
@@ -53,4 +83,3 @@ void snd_kctl_jack_report(struct snd_card *card,
|
||||
kctl->private_value = status;
|
||||
snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, &kctl->id);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_kctl_jack_report);
|
||||
|
@@ -484,7 +484,7 @@ static int snd_hwdep_dev_disconnect(struct snd_device *device)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
#ifdef CONFIG_SND_PROC_FS
|
||||
/*
|
||||
* Info interface
|
||||
*/
|
||||
@@ -521,10 +521,10 @@ static void __exit snd_hwdep_proc_done(void)
|
||||
{
|
||||
snd_info_free_entry(snd_hwdep_proc_entry);
|
||||
}
|
||||
#else /* !CONFIG_PROC_FS */
|
||||
#else /* !CONFIG_SND_PROC_FS */
|
||||
#define snd_hwdep_proc_init()
|
||||
#define snd_hwdep_proc_done()
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
#endif /* CONFIG_SND_PROC_FS */
|
||||
|
||||
|
||||
/*
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -29,15 +29,12 @@
|
||||
#include <linux/utsname.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#if defined(CONFIG_SND_OSSEMUL) && defined(CONFIG_PROC_FS)
|
||||
|
||||
/*
|
||||
* OSS compatible part
|
||||
*/
|
||||
|
||||
static DEFINE_MUTEX(strings);
|
||||
static char *snd_sndstat_strings[SNDRV_CARDS][SNDRV_OSS_INFO_DEV_COUNT];
|
||||
static struct snd_info_entry *snd_sndstat_proc_entry;
|
||||
|
||||
int snd_oss_info_register(int dev, int num, char *string)
|
||||
{
|
||||
@@ -112,27 +109,15 @@ static void snd_sndstat_proc_read(struct snd_info_entry *entry,
|
||||
snd_sndstat_show_strings(buffer, "Mixers", SNDRV_OSS_INFO_DEV_MIXERS);
|
||||
}
|
||||
|
||||
int snd_info_minor_register(void)
|
||||
int __init snd_info_minor_register(void)
|
||||
{
|
||||
struct snd_info_entry *entry;
|
||||
|
||||
memset(snd_sndstat_strings, 0, sizeof(snd_sndstat_strings));
|
||||
if ((entry = snd_info_create_module_entry(THIS_MODULE, "sndstat", snd_oss_root)) != NULL) {
|
||||
entry->c.text.read = snd_sndstat_proc_read;
|
||||
if (snd_info_register(entry) < 0) {
|
||||
snd_info_free_entry(entry);
|
||||
entry = NULL;
|
||||
}
|
||||
}
|
||||
snd_sndstat_proc_entry = entry;
|
||||
return 0;
|
||||
entry = snd_info_create_module_entry(THIS_MODULE, "sndstat",
|
||||
snd_oss_root);
|
||||
if (!entry)
|
||||
return -ENOMEM;
|
||||
entry->c.text.read = snd_sndstat_proc_read;
|
||||
return snd_info_register(entry); /* freed in error path */
|
||||
}
|
||||
|
||||
int snd_info_minor_unregister(void)
|
||||
{
|
||||
snd_info_free_entry(snd_sndstat_proc_entry);
|
||||
snd_sndstat_proc_entry = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_SND_OSSEMUL */
|
||||
|
@@ -100,35 +100,29 @@ int (*snd_mixer_oss_notify_callback)(struct snd_card *card, int free_flag);
|
||||
EXPORT_SYMBOL(snd_mixer_oss_notify_callback);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
#ifdef CONFIG_SND_PROC_FS
|
||||
static void snd_card_id_read(struct snd_info_entry *entry,
|
||||
struct snd_info_buffer *buffer)
|
||||
{
|
||||
snd_iprintf(buffer, "%s\n", entry->card->id);
|
||||
}
|
||||
|
||||
static inline int init_info_for_card(struct snd_card *card)
|
||||
static int init_info_for_card(struct snd_card *card)
|
||||
{
|
||||
int err;
|
||||
struct snd_info_entry *entry;
|
||||
|
||||
if ((err = snd_info_card_register(card)) < 0) {
|
||||
dev_dbg(card->dev, "unable to create card info\n");
|
||||
return err;
|
||||
}
|
||||
if ((entry = snd_info_create_card_entry(card, "id", card->proc_root)) == NULL) {
|
||||
entry = snd_info_create_card_entry(card, "id", card->proc_root);
|
||||
if (!entry) {
|
||||
dev_dbg(card->dev, "unable to create card entry\n");
|
||||
return err;
|
||||
}
|
||||
entry->c.text.read = snd_card_id_read;
|
||||
if (snd_info_register(entry) < 0) {
|
||||
snd_info_free_entry(entry);
|
||||
entry = NULL;
|
||||
}
|
||||
card->proc_id = entry;
|
||||
return 0;
|
||||
|
||||
return snd_info_card_register(card);
|
||||
}
|
||||
#else /* !CONFIG_PROC_FS */
|
||||
#else /* !CONFIG_SND_PROC_FS */
|
||||
#define init_info_for_card(card)
|
||||
#endif
|
||||
|
||||
@@ -756,7 +750,7 @@ int snd_card_register(struct snd_card *card)
|
||||
if (snd_cards[card->number]) {
|
||||
/* already registered */
|
||||
mutex_unlock(&snd_card_mutex);
|
||||
return 0;
|
||||
return snd_info_card_register(card); /* register pending info */
|
||||
}
|
||||
if (*card->id) {
|
||||
/* make a unique id name from the given string */
|
||||
@@ -782,9 +776,7 @@ int snd_card_register(struct snd_card *card)
|
||||
|
||||
EXPORT_SYMBOL(snd_card_register);
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
static struct snd_info_entry *snd_card_info_entry;
|
||||
|
||||
#ifdef CONFIG_SND_PROC_FS
|
||||
static void snd_card_info_read(struct snd_info_entry *entry,
|
||||
struct snd_info_buffer *buffer)
|
||||
{
|
||||
@@ -810,7 +802,6 @@ static void snd_card_info_read(struct snd_info_entry *entry,
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SND_OSSEMUL
|
||||
|
||||
void snd_card_info_read_oss(struct snd_info_buffer *buffer)
|
||||
{
|
||||
int idx, count;
|
||||
@@ -832,7 +823,6 @@ void snd_card_info_read_oss(struct snd_info_buffer *buffer)
|
||||
#endif
|
||||
|
||||
#ifdef MODULE
|
||||
static struct snd_info_entry *snd_card_module_info_entry;
|
||||
static void snd_card_module_info_read(struct snd_info_entry *entry,
|
||||
struct snd_info_buffer *buffer)
|
||||
{
|
||||
@@ -857,36 +847,21 @@ int __init snd_card_info_init(void)
|
||||
if (! entry)
|
||||
return -ENOMEM;
|
||||
entry->c.text.read = snd_card_info_read;
|
||||
if (snd_info_register(entry) < 0) {
|
||||
snd_info_free_entry(entry);
|
||||
return -ENOMEM;
|
||||
}
|
||||
snd_card_info_entry = entry;
|
||||
if (snd_info_register(entry) < 0)
|
||||
return -ENOMEM; /* freed in error path */
|
||||
|
||||
#ifdef MODULE
|
||||
entry = snd_info_create_module_entry(THIS_MODULE, "modules", NULL);
|
||||
if (entry) {
|
||||
entry->c.text.read = snd_card_module_info_read;
|
||||
if (snd_info_register(entry) < 0)
|
||||
snd_info_free_entry(entry);
|
||||
else
|
||||
snd_card_module_info_entry = entry;
|
||||
}
|
||||
if (!entry)
|
||||
return -ENOMEM;
|
||||
entry->c.text.read = snd_card_module_info_read;
|
||||
if (snd_info_register(entry) < 0)
|
||||
return -ENOMEM; /* freed in error path */
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __exit snd_card_info_done(void)
|
||||
{
|
||||
snd_info_free_entry(snd_card_info_entry);
|
||||
#ifdef MODULE
|
||||
snd_info_free_entry(snd_card_module_info_entry);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
#endif /* CONFIG_SND_PROC_FS */
|
||||
|
||||
/**
|
||||
* snd_component_add - add a component string
|
||||
|
@@ -24,6 +24,13 @@
|
||||
#include <linux/module.h>
|
||||
#include <sound/jack.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/control.h>
|
||||
|
||||
struct snd_jack_kctl {
|
||||
struct snd_kcontrol *kctl;
|
||||
struct list_head list; /* list of controls belong to the same jack */
|
||||
unsigned int mask_bits; /* only masked status bits are reported via kctl */
|
||||
};
|
||||
|
||||
static int jack_switch_types[SND_JACK_SWITCH_TYPES] = {
|
||||
SW_HEADPHONE_INSERT,
|
||||
@@ -54,7 +61,13 @@ static int snd_jack_dev_disconnect(struct snd_device *device)
|
||||
static int snd_jack_dev_free(struct snd_device *device)
|
||||
{
|
||||
struct snd_jack *jack = device->device_data;
|
||||
struct snd_card *card = device->card;
|
||||
struct snd_jack_kctl *jack_kctl, *tmp_jack_kctl;
|
||||
|
||||
list_for_each_entry_safe(jack_kctl, tmp_jack_kctl, &jack->kctl_list, list) {
|
||||
list_del_init(&jack_kctl->list);
|
||||
snd_ctl_remove(card, jack_kctl->kctl);
|
||||
}
|
||||
if (jack->private_free)
|
||||
jack->private_free(jack);
|
||||
|
||||
@@ -74,6 +87,10 @@ static int snd_jack_dev_register(struct snd_device *device)
|
||||
|
||||
snprintf(jack->name, sizeof(jack->name), "%s %s",
|
||||
card->shortname, jack->id);
|
||||
|
||||
if (!jack->input_dev)
|
||||
return 0;
|
||||
|
||||
jack->input_dev->name = jack->name;
|
||||
|
||||
/* Default to the sound card device. */
|
||||
@@ -100,6 +117,77 @@ static int snd_jack_dev_register(struct snd_device *device)
|
||||
return err;
|
||||
}
|
||||
|
||||
static void snd_jack_kctl_private_free(struct snd_kcontrol *kctl)
|
||||
{
|
||||
struct snd_jack_kctl *jack_kctl;
|
||||
|
||||
jack_kctl = kctl->private_data;
|
||||
if (jack_kctl) {
|
||||
list_del(&jack_kctl->list);
|
||||
kfree(jack_kctl);
|
||||
}
|
||||
}
|
||||
|
||||
static void snd_jack_kctl_add(struct snd_jack *jack, struct snd_jack_kctl *jack_kctl)
|
||||
{
|
||||
list_add_tail(&jack_kctl->list, &jack->kctl_list);
|
||||
}
|
||||
|
||||
static struct snd_jack_kctl * snd_jack_kctl_new(struct snd_card *card, const char *name, unsigned int mask)
|
||||
{
|
||||
struct snd_kcontrol *kctl;
|
||||
struct snd_jack_kctl *jack_kctl;
|
||||
int err;
|
||||
|
||||
kctl = snd_kctl_jack_new(name, card);
|
||||
if (!kctl)
|
||||
return NULL;
|
||||
|
||||
err = snd_ctl_add(card, kctl);
|
||||
if (err < 0)
|
||||
return NULL;
|
||||
|
||||
jack_kctl = kzalloc(sizeof(*jack_kctl), GFP_KERNEL);
|
||||
|
||||
if (!jack_kctl)
|
||||
goto error;
|
||||
|
||||
jack_kctl->kctl = kctl;
|
||||
jack_kctl->mask_bits = mask;
|
||||
|
||||
kctl->private_data = jack_kctl;
|
||||
kctl->private_free = snd_jack_kctl_private_free;
|
||||
|
||||
return jack_kctl;
|
||||
error:
|
||||
snd_ctl_free_one(kctl);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_jack_add_new_kctl - Create a new snd_jack_kctl and add it to jack
|
||||
* @jack: the jack instance which the kctl will attaching to
|
||||
* @name: the name for the snd_kcontrol object
|
||||
* @mask: a bitmask of enum snd_jack_type values that can be detected
|
||||
* by this snd_jack_kctl object.
|
||||
*
|
||||
* Creates a new snd_kcontrol object and adds it to the jack kctl_list.
|
||||
*
|
||||
* Return: Zero if successful, or a negative error code on failure.
|
||||
*/
|
||||
int snd_jack_add_new_kctl(struct snd_jack *jack, const char * name, int mask)
|
||||
{
|
||||
struct snd_jack_kctl *jack_kctl;
|
||||
|
||||
jack_kctl = snd_jack_kctl_new(jack->card, name, mask);
|
||||
if (!jack_kctl)
|
||||
return -ENOMEM;
|
||||
|
||||
snd_jack_kctl_add(jack, jack_kctl);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(snd_jack_add_new_kctl);
|
||||
|
||||
/**
|
||||
* snd_jack_new - Create a new jack
|
||||
* @card: the card instance
|
||||
@@ -107,6 +195,8 @@ static int snd_jack_dev_register(struct snd_device *device)
|
||||
* @type: a bitmask of enum snd_jack_type values that can be detected by
|
||||
* this jack
|
||||
* @jjack: Used to provide the allocated jack object to the caller.
|
||||
* @initial_kctl: if true, create a kcontrol and add it to the jack list.
|
||||
* @phantom_jack: Don't create a input device for phantom jacks.
|
||||
*
|
||||
* Creates a new jack object.
|
||||
*
|
||||
@@ -114,9 +204,10 @@ static int snd_jack_dev_register(struct snd_device *device)
|
||||
* On success @jjack will be initialised.
|
||||
*/
|
||||
int snd_jack_new(struct snd_card *card, const char *id, int type,
|
||||
struct snd_jack **jjack)
|
||||
struct snd_jack **jjack, bool initial_kctl, bool phantom_jack)
|
||||
{
|
||||
struct snd_jack *jack;
|
||||
struct snd_jack_kctl *jack_kctl = NULL;
|
||||
int err;
|
||||
int i;
|
||||
static struct snd_device_ops ops = {
|
||||
@@ -125,31 +216,47 @@ int snd_jack_new(struct snd_card *card, const char *id, int type,
|
||||
.dev_disconnect = snd_jack_dev_disconnect,
|
||||
};
|
||||
|
||||
if (initial_kctl) {
|
||||
jack_kctl = snd_jack_kctl_new(card, id, type);
|
||||
if (!jack_kctl)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
jack = kzalloc(sizeof(struct snd_jack), GFP_KERNEL);
|
||||
if (jack == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
jack->id = kstrdup(id, GFP_KERNEL);
|
||||
|
||||
jack->input_dev = input_allocate_device();
|
||||
if (jack->input_dev == NULL) {
|
||||
err = -ENOMEM;
|
||||
goto fail_input;
|
||||
/* don't creat input device for phantom jack */
|
||||
if (!phantom_jack) {
|
||||
jack->input_dev = input_allocate_device();
|
||||
if (jack->input_dev == NULL) {
|
||||
err = -ENOMEM;
|
||||
goto fail_input;
|
||||
}
|
||||
|
||||
jack->input_dev->phys = "ALSA";
|
||||
|
||||
jack->type = type;
|
||||
|
||||
for (i = 0; i < SND_JACK_SWITCH_TYPES; i++)
|
||||
if (type & (1 << i))
|
||||
input_set_capability(jack->input_dev, EV_SW,
|
||||
jack_switch_types[i]);
|
||||
|
||||
}
|
||||
|
||||
jack->input_dev->phys = "ALSA";
|
||||
|
||||
jack->type = type;
|
||||
|
||||
for (i = 0; i < SND_JACK_SWITCH_TYPES; i++)
|
||||
if (type & (1 << i))
|
||||
input_set_capability(jack->input_dev, EV_SW,
|
||||
jack_switch_types[i]);
|
||||
|
||||
err = snd_device_new(card, SNDRV_DEV_JACK, jack, &ops);
|
||||
if (err < 0)
|
||||
goto fail_input;
|
||||
|
||||
jack->card = card;
|
||||
INIT_LIST_HEAD(&jack->kctl_list);
|
||||
|
||||
if (initial_kctl)
|
||||
snd_jack_kctl_add(jack, jack_kctl);
|
||||
|
||||
*jjack = jack;
|
||||
|
||||
return 0;
|
||||
@@ -175,6 +282,8 @@ EXPORT_SYMBOL(snd_jack_new);
|
||||
void snd_jack_set_parent(struct snd_jack *jack, struct device *parent)
|
||||
{
|
||||
WARN_ON(jack->registered);
|
||||
if (!jack->input_dev)
|
||||
return;
|
||||
|
||||
jack->input_dev->dev.parent = parent;
|
||||
}
|
||||
@@ -230,11 +339,19 @@ EXPORT_SYMBOL(snd_jack_set_key);
|
||||
*/
|
||||
void snd_jack_report(struct snd_jack *jack, int status)
|
||||
{
|
||||
struct snd_jack_kctl *jack_kctl;
|
||||
int i;
|
||||
|
||||
if (!jack)
|
||||
return;
|
||||
|
||||
list_for_each_entry(jack_kctl, &jack->kctl_list, list)
|
||||
snd_kctl_jack_report(jack->card, jack_kctl->kctl,
|
||||
status & jack_kctl->mask_bits);
|
||||
|
||||
if (!jack->input_dev)
|
||||
return;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(jack->key); i++) {
|
||||
int testbit = SND_JACK_BTN_0 >> i;
|
||||
|
||||
@@ -252,9 +369,6 @@ void snd_jack_report(struct snd_jack *jack, int status)
|
||||
}
|
||||
|
||||
input_sync(jack->input_dev);
|
||||
|
||||
}
|
||||
EXPORT_SYMBOL(snd_jack_report);
|
||||
|
||||
MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
|
||||
MODULE_DESCRIPTION("Jack detection support for ALSA");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@@ -1111,7 +1111,7 @@ static int snd_mixer_oss_build_input(struct snd_mixer_oss *mixer, struct snd_mix
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
#ifdef CONFIG_SND_PROC_FS
|
||||
/*
|
||||
*/
|
||||
#define MIXER_VOL(name) [SOUND_MIXER_##name] = #name
|
||||
@@ -1255,10 +1255,10 @@ static void snd_mixer_oss_proc_done(struct snd_mixer_oss *mixer)
|
||||
snd_info_free_entry(mixer->proc_entry);
|
||||
mixer->proc_entry = NULL;
|
||||
}
|
||||
#else /* !CONFIG_PROC_FS */
|
||||
#else /* !CONFIG_SND_PROC_FS */
|
||||
#define snd_mixer_oss_proc_init(mix)
|
||||
#define snd_mixer_oss_proc_done(mix)
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
#endif /* CONFIG_SND_PROC_FS */
|
||||
|
||||
static void snd_mixer_oss_build(struct snd_mixer_oss *mixer)
|
||||
{
|
||||
|
@@ -1027,7 +1027,8 @@ void snd_pcm_detach_substream(struct snd_pcm_substream *substream)
|
||||
static ssize_t show_pcm_class(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct snd_pcm *pcm;
|
||||
struct snd_pcm_str *pstr = container_of(dev, struct snd_pcm_str, dev);
|
||||
struct snd_pcm *pcm = pstr->pcm;
|
||||
const char *str;
|
||||
static const char *strs[SNDRV_PCM_CLASS_LAST + 1] = {
|
||||
[SNDRV_PCM_CLASS_GENERIC] = "generic",
|
||||
@@ -1036,8 +1037,7 @@ static ssize_t show_pcm_class(struct device *dev,
|
||||
[SNDRV_PCM_CLASS_DIGITIZER] = "digitizer",
|
||||
};
|
||||
|
||||
if (! (pcm = dev_get_drvdata(dev)) ||
|
||||
pcm->dev_class > SNDRV_PCM_CLASS_LAST)
|
||||
if (pcm->dev_class > SNDRV_PCM_CLASS_LAST)
|
||||
str = "none";
|
||||
else
|
||||
str = strs[pcm->dev_class];
|
||||
@@ -1181,7 +1181,7 @@ int snd_pcm_notify(struct snd_pcm_notify *notify, int nfree)
|
||||
}
|
||||
EXPORT_SYMBOL(snd_pcm_notify);
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
#ifdef CONFIG_SND_PROC_FS
|
||||
/*
|
||||
* Info interface
|
||||
*/
|
||||
@@ -1227,10 +1227,10 @@ static void snd_pcm_proc_done(void)
|
||||
snd_info_free_entry(snd_pcm_proc_entry);
|
||||
}
|
||||
|
||||
#else /* !CONFIG_PROC_FS */
|
||||
#else /* !CONFIG_SND_PROC_FS */
|
||||
#define snd_pcm_proc_init()
|
||||
#define snd_pcm_proc_done()
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
#endif /* CONFIG_SND_PROC_FS */
|
||||
|
||||
|
||||
/*
|
||||
|
99
sound/core/pcm_drm_eld.c
Normal file
99
sound/core/pcm_drm_eld.c
Normal file
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
* PCM DRM helpers
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/export.h>
|
||||
#include <drm/drm_edid.h>
|
||||
#include <sound/pcm.h>
|
||||
#include <sound/pcm_drm_eld.h>
|
||||
|
||||
static const unsigned int eld_rates[] = {
|
||||
32000,
|
||||
44100,
|
||||
48000,
|
||||
88200,
|
||||
96000,
|
||||
176400,
|
||||
192000,
|
||||
};
|
||||
|
||||
static unsigned int sad_max_channels(const u8 *sad)
|
||||
{
|
||||
return 1 + (sad[0] & 7);
|
||||
}
|
||||
|
||||
static int eld_limit_rates(struct snd_pcm_hw_params *params,
|
||||
struct snd_pcm_hw_rule *rule)
|
||||
{
|
||||
struct snd_interval *r = hw_param_interval(params, rule->var);
|
||||
struct snd_interval *c;
|
||||
unsigned int rate_mask = 7, i;
|
||||
const u8 *sad, *eld = rule->private;
|
||||
|
||||
sad = drm_eld_sad(eld);
|
||||
if (sad) {
|
||||
c = hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
|
||||
|
||||
for (i = drm_eld_sad_count(eld); i > 0; i--, sad += 3) {
|
||||
unsigned max_channels = sad_max_channels(sad);
|
||||
|
||||
/*
|
||||
* Exclude SADs which do not include the
|
||||
* requested number of channels.
|
||||
*/
|
||||
if (c->min <= max_channels)
|
||||
rate_mask |= sad[1];
|
||||
}
|
||||
}
|
||||
|
||||
return snd_interval_list(r, ARRAY_SIZE(eld_rates), eld_rates,
|
||||
rate_mask);
|
||||
}
|
||||
|
||||
static int eld_limit_channels(struct snd_pcm_hw_params *params,
|
||||
struct snd_pcm_hw_rule *rule)
|
||||
{
|
||||
struct snd_interval *c = hw_param_interval(params, rule->var);
|
||||
struct snd_interval *r;
|
||||
struct snd_interval t = { .min = 1, .max = 2, .integer = 1, };
|
||||
unsigned int i;
|
||||
const u8 *sad, *eld = rule->private;
|
||||
|
||||
sad = drm_eld_sad(eld);
|
||||
if (sad) {
|
||||
unsigned int rate_mask = 0;
|
||||
|
||||
/* Convert the rate interval to a mask */
|
||||
r = hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
|
||||
for (i = 0; i < ARRAY_SIZE(eld_rates); i++)
|
||||
if (r->min <= eld_rates[i] && r->max >= eld_rates[i])
|
||||
rate_mask |= BIT(i);
|
||||
|
||||
for (i = drm_eld_sad_count(eld); i > 0; i--, sad += 3)
|
||||
if (rate_mask & sad[1])
|
||||
t.max = max(t.max, sad_max_channels(sad));
|
||||
}
|
||||
|
||||
return snd_interval_refine(c, &t);
|
||||
}
|
||||
|
||||
int snd_pcm_hw_constraint_eld(struct snd_pcm_runtime *runtime, void *eld)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
|
||||
eld_limit_rates, eld,
|
||||
SNDRV_PCM_HW_PARAM_CHANNELS, -1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
|
||||
eld_limit_channels, eld,
|
||||
SNDRV_PCM_HW_PARAM_RATE, -1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_pcm_hw_constraint_eld);
|
95
sound/core/pcm_iec958.c
Normal file
95
sound/core/pcm_iec958.c
Normal file
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* PCM DRM helpers
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/export.h>
|
||||
#include <linux/types.h>
|
||||
#include <sound/asoundef.h>
|
||||
#include <sound/pcm.h>
|
||||
#include <sound/pcm_iec958.h>
|
||||
|
||||
/**
|
||||
* snd_pcm_create_iec958_consumer - create consumer format IEC958 channel status
|
||||
* @runtime: pcm runtime structure with ->rate filled in
|
||||
* @cs: channel status buffer, at least four bytes
|
||||
* @len: length of channel status buffer
|
||||
*
|
||||
* Create the consumer format channel status data in @cs of maximum size
|
||||
* @len corresponding to the parameters of the PCM runtime @runtime.
|
||||
*
|
||||
* Drivers may wish to tweak the contents of the buffer after creation.
|
||||
*
|
||||
* Returns: length of buffer, or negative error code if something failed.
|
||||
*/
|
||||
int snd_pcm_create_iec958_consumer(struct snd_pcm_runtime *runtime, u8 *cs,
|
||||
size_t len)
|
||||
{
|
||||
unsigned int fs, ws;
|
||||
|
||||
if (len < 4)
|
||||
return -EINVAL;
|
||||
|
||||
switch (runtime->rate) {
|
||||
case 32000:
|
||||
fs = IEC958_AES3_CON_FS_32000;
|
||||
break;
|
||||
case 44100:
|
||||
fs = IEC958_AES3_CON_FS_44100;
|
||||
break;
|
||||
case 48000:
|
||||
fs = IEC958_AES3_CON_FS_48000;
|
||||
break;
|
||||
case 88200:
|
||||
fs = IEC958_AES3_CON_FS_88200;
|
||||
break;
|
||||
case 96000:
|
||||
fs = IEC958_AES3_CON_FS_96000;
|
||||
break;
|
||||
case 176400:
|
||||
fs = IEC958_AES3_CON_FS_176400;
|
||||
break;
|
||||
case 192000:
|
||||
fs = IEC958_AES3_CON_FS_192000;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (len > 4) {
|
||||
switch (snd_pcm_format_width(runtime->format)) {
|
||||
case 16:
|
||||
ws = IEC958_AES4_CON_WORDLEN_20_16;
|
||||
break;
|
||||
case 18:
|
||||
ws = IEC958_AES4_CON_WORDLEN_22_18;
|
||||
break;
|
||||
case 20:
|
||||
ws = IEC958_AES4_CON_WORDLEN_20_16 |
|
||||
IEC958_AES4_CON_MAX_WORDLEN_24;
|
||||
break;
|
||||
case 24:
|
||||
ws = IEC958_AES4_CON_WORDLEN_24_20 |
|
||||
IEC958_AES4_CON_MAX_WORDLEN_24;
|
||||
break;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
memset(cs, 0, len);
|
||||
|
||||
cs[0] = IEC958_AES0_CON_NOT_COPYRIGHT | IEC958_AES0_CON_EMPHASIS_NONE;
|
||||
cs[1] = IEC958_AES1_CON_GENERAL;
|
||||
cs[2] = IEC958_AES2_CON_SOURCE_UNSPEC | IEC958_AES2_CON_CHANNEL_UNSPEC;
|
||||
cs[3] = IEC958_AES3_CON_CLOCK_1000PPM | fs;
|
||||
|
||||
if (len > 4)
|
||||
cs[4] = ws;
|
||||
|
||||
return len;
|
||||
}
|
||||
EXPORT_SYMBOL(snd_pcm_create_iec958_consumer);
|
@@ -6,7 +6,8 @@
|
||||
snd-seq-device-objs := seq_device.o
|
||||
snd-seq-objs := seq.o seq_lock.o seq_clientmgr.o seq_memory.o seq_queue.o \
|
||||
seq_fifo.o seq_prioq.o seq_timer.o \
|
||||
seq_system.o seq_ports.o seq_info.o
|
||||
seq_system.o seq_ports.o
|
||||
snd-seq-$(CONFIG_SND_PROC_FS) += seq_info.o
|
||||
snd-seq-midi-objs := seq_midi.o
|
||||
snd-seq-midi-emul-objs := seq_midi_emul.o
|
||||
snd-seq-midi-event-objs := seq_midi_event.o
|
||||
|
@@ -45,7 +45,7 @@ MODULE_ALIAS_SNDRV_MINOR(SNDRV_MINOR_OSS_MUSIC);
|
||||
*/
|
||||
static int register_device(void);
|
||||
static void unregister_device(void);
|
||||
#ifdef CONFIG_PROC_FS
|
||||
#ifdef CONFIG_SND_PROC_FS
|
||||
static int register_proc(void);
|
||||
static void unregister_proc(void);
|
||||
#else
|
||||
@@ -261,7 +261,7 @@ unregister_device(void)
|
||||
* /proc interface
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
#ifdef CONFIG_SND_PROC_FS
|
||||
|
||||
static struct snd_info_entry *info_entry;
|
||||
|
||||
@@ -303,4 +303,4 @@ unregister_proc(void)
|
||||
snd_info_free_entry(info_entry);
|
||||
info_entry = NULL;
|
||||
}
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
#endif /* CONFIG_SND_PROC_FS */
|
||||
|
@@ -479,8 +479,7 @@ snd_seq_oss_reset(struct seq_oss_devinfo *dp)
|
||||
snd_seq_oss_timer_stop(dp->timer);
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
#ifdef CONFIG_SND_PROC_FS
|
||||
/*
|
||||
* misc. functions for proc interface
|
||||
*/
|
||||
@@ -531,4 +530,4 @@ snd_seq_oss_system_info_read(struct snd_info_buffer *buf)
|
||||
snd_seq_oss_readq_info_read(dp->readq, buf);
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
#endif /* CONFIG_SND_PROC_FS */
|
||||
|
@@ -665,7 +665,7 @@ snd_seq_oss_midi_make_info(struct seq_oss_devinfo *dp, int dev, struct midi_info
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
#ifdef CONFIG_SND_PROC_FS
|
||||
/*
|
||||
* proc interface
|
||||
*/
|
||||
@@ -705,4 +705,4 @@ snd_seq_oss_midi_info_read(struct snd_info_buffer *buf)
|
||||
snd_use_lock_free(&mdev->use_lock);
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
#endif /* CONFIG_SND_PROC_FS */
|
||||
|
@@ -222,7 +222,7 @@ snd_seq_oss_readq_put_timestamp(struct seq_oss_readq *q, unsigned long curt, int
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
#ifdef CONFIG_SND_PROC_FS
|
||||
/*
|
||||
* proc interface
|
||||
*/
|
||||
@@ -233,4 +233,4 @@ snd_seq_oss_readq_info_read(struct seq_oss_readq *q, struct snd_info_buffer *buf
|
||||
(waitqueue_active(&q->midi_sleep) ? "sleeping":"running"),
|
||||
q->qlen, q->input_time);
|
||||
}
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
#endif /* CONFIG_SND_PROC_FS */
|
||||
|
@@ -630,7 +630,7 @@ snd_seq_oss_synth_make_info(struct seq_oss_devinfo *dp, int dev, struct synth_in
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
#ifdef CONFIG_SND_PROC_FS
|
||||
/*
|
||||
* proc interface
|
||||
*/
|
||||
@@ -658,4 +658,4 @@ snd_seq_oss_synth_info_read(struct snd_info_buffer *buf)
|
||||
snd_use_lock_free(&rec->use_lock);
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
#endif /* CONFIG_SND_PROC_FS */
|
||||
|
@@ -2447,7 +2447,7 @@ EXPORT_SYMBOL(snd_seq_kernel_client_write_poll);
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
#ifdef CONFIG_SND_PROC_FS
|
||||
/*
|
||||
* /proc interface
|
||||
*/
|
||||
@@ -2549,7 +2549,7 @@ void snd_seq_info_clients_read(struct snd_info_entry *entry,
|
||||
snd_seq_client_unlock(client);
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
#endif /* CONFIG_SND_PROC_FS */
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
|
@@ -72,7 +72,7 @@ static struct bus_type snd_seq_bus_type = {
|
||||
/*
|
||||
* proc interface -- just for compatibility
|
||||
*/
|
||||
#ifdef CONFIG_PROC_FS
|
||||
#ifdef CONFIG_SND_PROC_FS
|
||||
static struct snd_info_entry *info_entry;
|
||||
|
||||
static int print_dev_info(struct device *dev, void *data)
|
||||
@@ -272,7 +272,7 @@ EXPORT_SYMBOL_GPL(snd_seq_driver_unregister);
|
||||
|
||||
static int __init seq_dev_proc_init(void)
|
||||
{
|
||||
#ifdef CONFIG_PROC_FS
|
||||
#ifdef CONFIG_SND_PROC_FS
|
||||
info_entry = snd_info_create_module_entry(THIS_MODULE, "drivers",
|
||||
snd_seq_root);
|
||||
if (info_entry == NULL)
|
||||
@@ -305,7 +305,7 @@ static void __exit alsa_seq_device_exit(void)
|
||||
#ifdef CONFIG_MODULES
|
||||
cancel_work_sync(&autoload_work);
|
||||
#endif
|
||||
#ifdef CONFIG_PROC_FS
|
||||
#ifdef CONFIG_SND_PROC_FS
|
||||
snd_info_free_entry(info_entry);
|
||||
#endif
|
||||
bus_unregister(&snd_seq_bus_type);
|
||||
|
@@ -27,7 +27,6 @@
|
||||
#include "seq_clientmgr.h"
|
||||
#include "seq_timer.h"
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
static struct snd_info_entry *queues_entry;
|
||||
static struct snd_info_entry *clients_entry;
|
||||
static struct snd_info_entry *timer_entry;
|
||||
@@ -51,6 +50,13 @@ create_info_entry(char *name, void (*read)(struct snd_info_entry *,
|
||||
return entry;
|
||||
}
|
||||
|
||||
static void free_info_entries(void)
|
||||
{
|
||||
snd_info_free_entry(queues_entry);
|
||||
snd_info_free_entry(clients_entry);
|
||||
snd_info_free_entry(timer_entry);
|
||||
}
|
||||
|
||||
/* create all our /proc entries */
|
||||
int __init snd_seq_info_init(void)
|
||||
{
|
||||
@@ -59,14 +65,17 @@ int __init snd_seq_info_init(void)
|
||||
clients_entry = create_info_entry("clients",
|
||||
snd_seq_info_clients_read);
|
||||
timer_entry = create_info_entry("timer", snd_seq_info_timer_read);
|
||||
if (!queues_entry || !clients_entry || !timer_entry)
|
||||
goto error;
|
||||
return 0;
|
||||
|
||||
error:
|
||||
free_info_entries();
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
int __exit snd_seq_info_done(void)
|
||||
{
|
||||
snd_info_free_entry(queues_entry);
|
||||
snd_info_free_entry(clients_entry);
|
||||
snd_info_free_entry(timer_entry);
|
||||
free_info_entries();
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
@@ -29,7 +29,7 @@ void snd_seq_info_timer_read(struct snd_info_entry *entry, struct snd_info_buffe
|
||||
void snd_seq_info_queues_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer);
|
||||
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
#ifdef CONFIG_SND_PROC_FS
|
||||
int snd_seq_info_init( void );
|
||||
int snd_seq_info_done( void );
|
||||
#else
|
||||
|
@@ -753,7 +753,7 @@ int snd_seq_control_queue(struct snd_seq_event *ev, int atomic, int hop)
|
||||
|
||||
/*----------------------------------------------------------------*/
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
#ifdef CONFIG_SND_PROC_FS
|
||||
/* exported to seq_info.c */
|
||||
void snd_seq_info_queues_read(struct snd_info_entry *entry,
|
||||
struct snd_info_buffer *buffer)
|
||||
@@ -787,5 +787,5 @@ void snd_seq_info_queues_read(struct snd_info_entry *entry,
|
||||
queuefree(q);
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
#endif /* CONFIG_SND_PROC_FS */
|
||||
|
||||
|
@@ -422,7 +422,7 @@ snd_seq_tick_time_t snd_seq_timer_get_cur_tick(struct snd_seq_timer *tmr)
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
#ifdef CONFIG_SND_PROC_FS
|
||||
/* exported to seq_info.c */
|
||||
void snd_seq_info_timer_read(struct snd_info_entry *entry,
|
||||
struct snd_info_buffer *buffer)
|
||||
@@ -449,5 +449,5 @@ void snd_seq_info_timer_read(struct snd_info_entry *entry,
|
||||
queuefree(q);
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
#endif /* CONFIG_SND_PROC_FS */
|
||||
|
||||
|
@@ -330,13 +330,10 @@ int snd_unregister_device(struct device *dev)
|
||||
}
|
||||
EXPORT_SYMBOL(snd_unregister_device);
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
#ifdef CONFIG_SND_PROC_FS
|
||||
/*
|
||||
* INFO PART
|
||||
*/
|
||||
|
||||
static struct snd_info_entry *snd_minor_info_entry;
|
||||
|
||||
static const char *snd_device_type_name(int type)
|
||||
{
|
||||
switch (type) {
|
||||
@@ -389,23 +386,12 @@ int __init snd_minor_info_init(void)
|
||||
struct snd_info_entry *entry;
|
||||
|
||||
entry = snd_info_create_module_entry(THIS_MODULE, "devices", NULL);
|
||||
if (entry) {
|
||||
entry->c.text.read = snd_minor_info_read;
|
||||
if (snd_info_register(entry) < 0) {
|
||||
snd_info_free_entry(entry);
|
||||
entry = NULL;
|
||||
}
|
||||
}
|
||||
snd_minor_info_entry = entry;
|
||||
return 0;
|
||||
if (!entry)
|
||||
return -ENOMEM;
|
||||
entry->c.text.read = snd_minor_info_read;
|
||||
return snd_info_register(entry); /* freed in error path */
|
||||
}
|
||||
|
||||
int __exit snd_minor_info_done(void)
|
||||
{
|
||||
snd_info_free_entry(snd_minor_info_entry);
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
#endif /* CONFIG_SND_PROC_FS */
|
||||
|
||||
/*
|
||||
* INIT PART
|
||||
@@ -423,7 +409,6 @@ static int __init alsa_sound_init(void)
|
||||
unregister_chrdev(major, "alsa");
|
||||
return -ENOMEM;
|
||||
}
|
||||
snd_info_minor_register();
|
||||
#ifndef MODULE
|
||||
pr_info("Advanced Linux Sound Architecture Driver Initialized.\n");
|
||||
#endif
|
||||
@@ -432,7 +417,6 @@ static int __init alsa_sound_init(void)
|
||||
|
||||
static void __exit alsa_sound_exit(void)
|
||||
{
|
||||
snd_info_minor_unregister();
|
||||
snd_info_done();
|
||||
unregister_chrdev(major, "alsa");
|
||||
}
|
||||
|
@@ -19,12 +19,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_SND_OSSEMUL
|
||||
|
||||
#if !IS_ENABLED(CONFIG_SOUND)
|
||||
#error "Enable the OSS soundcore multiplexer (CONFIG_SOUND) in the kernel."
|
||||
#endif
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/slab.h>
|
||||
@@ -213,10 +207,7 @@ EXPORT_SYMBOL(snd_unregister_oss_device);
|
||||
* INFO PART
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
|
||||
static struct snd_info_entry *snd_minor_info_oss_entry;
|
||||
|
||||
#ifdef CONFIG_SND_PROC_FS
|
||||
static const char *snd_oss_device_type_name(int type)
|
||||
{
|
||||
switch (type) {
|
||||
@@ -263,22 +254,9 @@ int __init snd_minor_info_oss_init(void)
|
||||
struct snd_info_entry *entry;
|
||||
|
||||
entry = snd_info_create_module_entry(THIS_MODULE, "devices", snd_oss_root);
|
||||
if (entry) {
|
||||
entry->c.text.read = snd_minor_info_oss_read;
|
||||
if (snd_info_register(entry) < 0) {
|
||||
snd_info_free_entry(entry);
|
||||
entry = NULL;
|
||||
}
|
||||
}
|
||||
snd_minor_info_oss_entry = entry;
|
||||
return 0;
|
||||
if (!entry)
|
||||
return -ENOMEM;
|
||||
entry->c.text.read = snd_minor_info_oss_read;
|
||||
return snd_info_register(entry); /* freed in error path */
|
||||
}
|
||||
|
||||
int __exit snd_minor_info_oss_done(void)
|
||||
{
|
||||
snd_info_free_entry(snd_minor_info_oss_entry);
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
|
||||
#endif /* CONFIG_SND_OSSEMUL */
|
||||
#endif /* CONFIG_SND_PROC_FS */
|
||||
|
@@ -1034,7 +1034,7 @@ static int snd_timer_register_system(void)
|
||||
return snd_timer_global_register(timer);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
#ifdef CONFIG_SND_PROC_FS
|
||||
/*
|
||||
* Info interface
|
||||
*/
|
||||
@@ -1104,7 +1104,7 @@ static void __exit snd_timer_proc_done(void)
|
||||
{
|
||||
snd_info_free_entry(snd_timer_proc_entry);
|
||||
}
|
||||
#else /* !CONFIG_PROC_FS */
|
||||
#else /* !CONFIG_SND_PROC_FS */
|
||||
#define snd_timer_proc_init()
|
||||
#define snd_timer_proc_done()
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user