Merge commit 'AU_LINUX_ANDROID_ICS.04.00.04.00.126' into msm-3.4
AU_LINUX_ANDROID_ICS.04.00.04.00.126 from msm-3.0.
First parent is from google/android-3.4.
* commit 'AU_LINUX_ANDROID_ICS.04.00.04.00.126': (8712 commits)
PRNG: Device tree entry for qrng device.
vidc:1080p: Set video core timeout value for Thumbnail mode
msm: sps: improve the debugging support in SPS driver
board-8064 msm: Overlap secure and non secure video firmware heaps.
msm: clock: Add handoff ops for 7x30 and copper XO clocks
msm_fb: display: Wait for external vsync before DTV IOMMU unmap
msm: Fix ciruclar dependency in debug UART settings
msm: gdsc: Add GDSC regulator driver for msm-copper
defconfig: Enable Mobicore Driver.
mobicore: Add mobicore driver.
mobicore: rename variable to lower case.
mobicore: rename folder.
mobicore: add makefiles
mobicore: initial import of kernel driver
ASoC: msm: Add SLIMBUS_2_RX CPU DAI
board-8064-gpio: Update FUNC for EPM SPI CS
msm_fb: display: Remove chicken bit config during video playback
mmc: msm_sdcc: enable the sanitize capability
msm-fb: display: lm2 writeback support on mpq platfroms
msm_fb: display: Disable LVDS phy & pll during panel off
...
Signed-off-by: Steve Muckle <smuckle@codeaurora.org>
diff --git a/sound/core/Kconfig b/sound/core/Kconfig
index b413ed0..87dcaee 100644
--- a/sound/core/Kconfig
+++ b/sound/core/Kconfig
@@ -149,6 +149,7 @@
config SND_DYNAMIC_MINORS
bool "Dynamic device file minor numbers"
+ default y if SND_OMAP_SOC_ABE_DSP
help
If you say Y here, the minor numbers of ALSA device files in
/dev/snd/ are allocated dynamically. This allows you to have
diff --git a/sound/core/init.c b/sound/core/init.c
index d8ec849..f300bd3 100644
--- a/sound/core/init.c
+++ b/sound/core/init.c
@@ -22,13 +22,12 @@
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/module.h>
-#include <linux/device.h>
#include <linux/file.h>
#include <linux/slab.h>
#include <linux/time.h>
#include <linux/ctype.h>
#include <linux/pm.h>
-
+#include <linux/device.h>
#include <sound/core.h>
#include <sound/control.h>
#include <sound/info.h>
@@ -481,104 +480,74 @@
EXPORT_SYMBOL(snd_card_free);
-/* retrieve the last word of shortname or longname */
-static const char *retrieve_id_from_card_name(const char *name)
+static void snd_card_set_id_no_lock(struct snd_card *card, const char *nid)
{
- const char *spos = name;
-
- while (*name) {
- if (isspace(*name) && isalnum(name[1]))
- spos = name + 1;
- name++;
- }
- return spos;
-}
-
-/* return true if the given id string doesn't conflict any other card ids */
-static bool card_id_ok(struct snd_card *card, const char *id)
-{
- int i;
- if (!snd_info_check_reserved_words(id))
- return false;
- for (i = 0; i < snd_ecards_limit; i++) {
- if (snd_cards[i] && snd_cards[i] != card &&
- !strcmp(snd_cards[i]->id, id))
- return false;
- }
- return true;
-}
-
-/* copy to card->id only with valid letters from nid */
-static void copy_valid_id_string(struct snd_card *card, const char *src,
- const char *nid)
-{
- char *id = card->id;
-
- while (*nid && !isalnum(*nid))
- nid++;
- if (isdigit(*nid))
- *id++ = isalpha(*src) ? *src : 'D';
- while (*nid && (size_t)(id - card->id) < sizeof(card->id) - 1) {
- if (isalnum(*nid))
- *id++ = *nid;
- nid++;
- }
- *id = 0;
-}
-
-/* Set card->id from the given string
- * If the string conflicts with other ids, add a suffix to make it unique.
- */
-static void snd_card_set_id_no_lock(struct snd_card *card, const char *src,
- const char *nid)
-{
- int len, loops;
- bool with_suffix;
- bool is_default = false;
+ int i, len, idx_flag = 0, loops = SNDRV_CARDS;
+ const char *spos, *src;
char *id;
- copy_valid_id_string(card, src, nid);
- id = card->id;
-
- again:
- /* use "Default" for obviously invalid strings
- * ("card" conflicts with proc directories)
- */
- if (!*id || !strncmp(id, "card", 4)) {
- strcpy(id, "Default");
- is_default = true;
+ if (nid == NULL) {
+ id = card->shortname;
+ spos = src = id;
+ while (*id != '\0') {
+ if (*id == ' ')
+ spos = id + 1;
+ id++;
+ }
+ } else {
+ spos = src = nid;
}
+ id = card->id;
+ while (*spos != '\0' && !isalnum(*spos))
+ spos++;
+ if (isdigit(*spos))
+ *id++ = isalpha(src[0]) ? src[0] : 'D';
+ while (*spos != '\0' && (size_t)(id - card->id) < sizeof(card->id) - 1) {
+ if (isalnum(*spos))
+ *id++ = *spos;
+ spos++;
+ }
+ *id = '\0';
- with_suffix = false;
- for (loops = 0; loops < SNDRV_CARDS; loops++) {
- if (card_id_ok(card, id))
- return; /* OK */
+ id = card->id;
+
+ if (*id == '\0')
+ strcpy(id, "Default");
+ while (1) {
+ if (loops-- == 0) {
+ snd_printk(KERN_ERR "unable to set card id (%s)\n", id);
+ strcpy(card->id, card->proc_root->name);
+ return;
+ }
+ if (!snd_info_check_reserved_words(id))
+ goto __change;
+ for (i = 0; i < snd_ecards_limit; i++) {
+ if (snd_cards[i] && !strcmp(snd_cards[i]->id, id))
+ goto __change;
+ }
+ break;
+
+ __change:
len = strlen(id);
- if (!with_suffix) {
- /* add the "_X" suffix */
- char *spos = id + len;
- if (len > sizeof(card->id) - 3)
- spos = id + sizeof(card->id) - 3;
- strcpy(spos, "_1");
- with_suffix = true;
- } else {
- /* modify the existing suffix */
- if (id[len - 1] != '9')
- id[len - 1]++;
+ if (idx_flag) {
+ if (id[len-1] != '9')
+ id[len-1]++;
else
- id[len - 1] = 'A';
+ id[len-1] = 'A';
+ } else if ((size_t)len <= sizeof(card->id) - 3) {
+ strcat(id, "_1");
+ idx_flag++;
+ } else {
+ spos = id + len - 2;
+ if ((size_t)len <= sizeof(card->id) - 2)
+ spos++;
+ *(char *)spos++ = '_';
+ *(char *)spos++ = '1';
+ *(char *)spos++ = '\0';
+ idx_flag++;
}
}
- /* fallback to the default id */
- if (!is_default) {
- *id = 0;
- goto again;
- }
- /* last resort... */
- snd_printk(KERN_ERR "unable to set card id (%s)\n", id);
- if (card->proc_root->name)
- strcpy(card->id, card->proc_root->name);
}
/**
@@ -595,7 +564,7 @@
if (card->id[0] != '\0')
return;
mutex_lock(&snd_card_mutex);
- snd_card_set_id_no_lock(card, nid, nid);
+ snd_card_set_id_no_lock(card, nid);
mutex_unlock(&snd_card_mutex);
}
EXPORT_SYMBOL(snd_card_set_id);
@@ -627,12 +596,22 @@
memcpy(buf1, buf, copy);
buf1[copy] = '\0';
mutex_lock(&snd_card_mutex);
- if (!card_id_ok(NULL, buf1)) {
+ if (!snd_info_check_reserved_words(buf1)) {
+ __exist:
mutex_unlock(&snd_card_mutex);
return -EEXIST;
}
+ for (idx = 0; idx < snd_ecards_limit; idx++) {
+ if (snd_cards[idx] && !strcmp(snd_cards[idx]->id, buf1)) {
+ if (card == snd_cards[idx])
+ goto __ok;
+ else
+ goto __exist;
+ }
+ }
strcpy(card->id, buf1);
snd_info_card_id_change(card);
+__ok:
mutex_unlock(&snd_card_mutex);
return count;
@@ -686,18 +665,7 @@
mutex_unlock(&snd_card_mutex);
return 0;
}
- if (*card->id) {
- /* make a unique id name from the given string */
- char tmpid[sizeof(card->id)];
- memcpy(tmpid, card->id, sizeof(card->id));
- snd_card_set_id_no_lock(card, tmpid, tmpid);
- } else {
- /* create an id from either shortname or longname */
- const char *src;
- src = *card->shortname ? card->shortname : card->longname;
- snd_card_set_id_no_lock(card, src,
- retrieve_id_from_card_name(src));
- }
+ snd_card_set_id_no_lock(card, card->id[0] == '\0' ? NULL : card->id);
snd_cards[card->number] = card;
mutex_unlock(&snd_card_mutex);
init_info_for_card(card);
diff --git a/sound/core/jack.c b/sound/core/jack.c
index 471e1e3..9e2e085 100644
--- a/sound/core/jack.c
+++ b/sound/core/jack.c
@@ -25,13 +25,16 @@
#include <sound/jack.h>
#include <sound/core.h>
-static int jack_switch_types[SND_JACK_SWITCH_TYPES] = {
+static int jack_switch_types[] = {
SW_HEADPHONE_INSERT,
SW_MICROPHONE_INSERT,
SW_LINEOUT_INSERT,
SW_JACK_PHYSICAL_INSERT,
SW_VIDEOOUT_INSERT,
SW_LINEIN_INSERT,
+ SW_HPHL_OVERCURRENT,
+ SW_HPHR_OVERCURRENT,
+ SW_UNSUPPORT_INSERT,
};
static int snd_jack_dev_free(struct snd_device *device)
@@ -128,7 +131,7 @@
jack->type = type;
- for (i = 0; i < SND_JACK_SWITCH_TYPES; i++)
+ for (i = 0; i < ARRAY_SIZE(jack_switch_types); i++)
if (type & (1 << i))
input_set_capability(jack->input_dev, EV_SW,
jack_switch_types[i]);
diff --git a/sound/core/pcm.c b/sound/core/pcm.c
index 1a3070b..09bf06e 100644
--- a/sound/core/pcm.c
+++ b/sound/core/pcm.c
@@ -24,7 +24,6 @@
#include <linux/module.h>
#include <linux/time.h>
#include <linux/mutex.h>
-#include <linux/device.h>
#include <sound/core.h>
#include <sound/minors.h>
#include <sound/pcm.h>
@@ -42,6 +41,7 @@
static int snd_pcm_free(struct snd_pcm *pcm);
static int snd_pcm_dev_free(struct snd_device *device);
static int snd_pcm_dev_register(struct snd_device *device);
+static int snd_pcm_dev_register_soc_be(struct snd_device *device);
static int snd_pcm_dev_disconnect(struct snd_device *device);
static struct snd_pcm *snd_pcm_get(struct snd_card *card, int device)
@@ -651,7 +651,7 @@
pstr->stream = stream;
pstr->pcm = pcm;
pstr->substream_count = substream_count;
- if (substream_count > 0 && !pcm->internal) {
+ if (substream_count > 0) {
err = snd_pcm_stream_proc_init(pstr);
if (err < 0) {
snd_printk(KERN_ERR "Error in snd_pcm_stream_proc_init\n");
@@ -675,18 +675,15 @@
pstr->substream = substream;
else
prev->next = substream;
-
- if (!pcm->internal) {
- err = snd_pcm_substream_proc_init(substream);
- if (err < 0) {
- snd_printk(KERN_ERR "Error in snd_pcm_stream_proc_init\n");
- if (prev == NULL)
- pstr->substream = NULL;
- else
- prev->next = NULL;
- kfree(substream);
- return err;
- }
+ err = snd_pcm_substream_proc_init(substream);
+ if (err < 0) {
+ snd_printk(KERN_ERR "Error in snd_pcm_stream_proc_init\n");
+ if (prev == NULL)
+ pstr->substream = NULL;
+ else
+ prev->next = NULL;
+ kfree(substream);
+ return err;
}
substream->group = &substream->self_group;
spin_lock_init(&substream->self_group.lock);
@@ -700,9 +697,25 @@
EXPORT_SYMBOL(snd_pcm_new_stream);
-static int _snd_pcm_new(struct snd_card *card, const char *id, int device,
- int playback_count, int capture_count, bool internal,
- struct snd_pcm **rpcm)
+/**
+ * snd_pcm_new - create a new PCM instance
+ * @card: the card instance
+ * @id: the id string
+ * @device: the device index (zero based)
+ * @playback_count: the number of substreams for playback
+ * @capture_count: the number of substreams for capture
+ * @rpcm: the pointer to store the new pcm instance
+ *
+ * Creates a new PCM instance.
+ *
+ * The pcm operators have to be set afterwards to the new instance
+ * via snd_pcm_set_ops().
+ *
+ * Returns zero if successful, or a negative error code on failure.
+ */
+int snd_pcm_new(struct snd_card *card, const char *id, int device,
+ int playback_count, int capture_count,
+ struct snd_pcm ** rpcm)
{
struct snd_pcm *pcm;
int err;
@@ -723,7 +736,7 @@
}
pcm->card = card;
pcm->device = device;
- pcm->internal = internal;
+
if (id)
strlcpy(pcm->id, id, sizeof(pcm->id));
if ((err = snd_pcm_new_stream(pcm, SNDRV_PCM_STREAM_PLAYBACK, playback_count)) < 0) {
@@ -745,32 +758,49 @@
return 0;
}
-/**
- * snd_pcm_new - create a new PCM instance
- * @card: the card instance
- * @id: the id string
- * @device: the device index (zero based)
- * @playback_count: the number of substreams for playback
- * @capture_count: the number of substreams for capture
- * @rpcm: the pointer to store the new pcm instance
- *
- * Creates a new PCM instance.
- *
- * The pcm operators have to be set afterwards to the new instance
- * via snd_pcm_set_ops().
- *
- * Returns zero if successful, or a negative error code on failure.
- */
-int snd_pcm_new(struct snd_card *card, const char *id, int device,
- int playback_count, int capture_count, struct snd_pcm **rpcm)
-{
- return _snd_pcm_new(card, id, device, playback_count, capture_count,
- false, rpcm);
-}
EXPORT_SYMBOL(snd_pcm_new);
+static int snd_pcm_new_stream_soc_be(struct snd_pcm *pcm, int stream,
+ int substream_count)
+{
+ int idx;
+ struct snd_pcm_str *pstr = &pcm->streams[stream];
+ struct snd_pcm_substream *substream, *prev;
+
+ pstr->stream = stream;
+ pstr->pcm = pcm;
+ pstr->substream_count = substream_count;
+
+ prev = NULL;
+ for (idx = 0, prev = NULL; idx < substream_count; idx++) {
+ substream = kzalloc(sizeof(*substream), GFP_KERNEL);
+ if (substream == NULL) {
+ snd_printk(KERN_ERR "Cannot allocate BE PCM substream\n");
+ return -ENOMEM;
+ }
+ substream->pcm = pcm;
+ substream->pstr = pstr;
+ substream->number = idx;
+ substream->stream = stream;
+ sprintf(substream->name, "subdevice #%i", idx);
+ substream->buffer_bytes_max = UINT_MAX;
+ if (prev == NULL)
+ pstr->substream = substream;
+ else
+ prev->next = substream;
+
+ substream->group = &substream->self_group;
+ spin_lock_init(&substream->self_group.lock);
+ INIT_LIST_HEAD(&substream->self_group.substreams);
+ list_add_tail(&substream->link_list, &substream->self_group.substreams);
+ atomic_set(&substream->mmap_count, 0);
+ prev = substream;
+ }
+ return 0;
+}
+
/**
- * snd_pcm_new_internal - create a new internal PCM instance
+ * snd_pcm_new_soc_be - create a new PCM instance for ASoC BE DAI link
* @card: the card instance
* @id: the id string
* @device: the device index (zero based - shared with normal PCMs)
@@ -778,25 +808,62 @@
* @capture_count: the number of substreams for capture
* @rpcm: the pointer to store the new pcm instance
*
- * Creates a new internal PCM instance with no userspace device or procfs
- * entries. This is used by ASoC Back End PCMs in order to create a PCM that
- * will only be used internally by kernel drivers. i.e. it cannot be opened
- * by userspace. It provides existing ASoC components drivers with a substream
- * and access to any private data.
+ * Creates a new PCM instance with no userspace device or procfs entries.
+ * This is used by ASoC Back End PCMs in order to create a PCM that will only
+ * be used internally by kernel drivers. i.e. it cannot be opened by userspace.
+ * It also provides existing ASoC components drivers with a substream and
+ * access to any private data.
*
* The pcm operators have to be set afterwards to the new instance
* via snd_pcm_set_ops().
*
* Returns zero if successful, or a negative error code on failure.
*/
-int snd_pcm_new_internal(struct snd_card *card, const char *id, int device,
+int snd_pcm_new_soc_be(struct snd_card *card, const char *id, int device,
int playback_count, int capture_count,
- struct snd_pcm **rpcm)
+ struct snd_pcm ** rpcm)
{
- return _snd_pcm_new(card, id, device, playback_count, capture_count,
- true, rpcm);
+ struct snd_pcm *pcm;
+ int err;
+ static struct snd_device_ops ops = {
+ .dev_free = snd_pcm_dev_free,
+ .dev_register = snd_pcm_dev_register_soc_be,
+ .dev_disconnect = snd_pcm_dev_disconnect,
+ };
+
+ if (snd_BUG_ON(!card))
+ return -ENXIO;
+ if (rpcm)
+ *rpcm = NULL;
+ pcm = kzalloc(sizeof(*pcm), GFP_KERNEL);
+ if (pcm == NULL) {
+ snd_printk(KERN_ERR "Cannot allocate virtual PCM\n");
+ return -ENOMEM;
+ }
+ pcm->card = card;
+ pcm->device = device;
+
+ if (id)
+ strlcpy(pcm->id, id, sizeof(pcm->id));
+ if ((err = snd_pcm_new_stream_soc_be(pcm, SNDRV_PCM_STREAM_PLAYBACK, playback_count)) < 0) {
+ snd_pcm_free(pcm);
+ return err;
+ }
+ if ((err = snd_pcm_new_stream_soc_be(pcm, SNDRV_PCM_STREAM_CAPTURE, capture_count)) < 0) {
+ snd_pcm_free(pcm);
+ return err;
+ }
+
+ if ((err = snd_device_new(card, SNDRV_DEV_PCM, pcm, &ops)) < 0) {
+ snd_pcm_free(pcm);
+ return err;
+ }
+ if (rpcm)
+ *rpcm = pcm;
+ return 0;
}
-EXPORT_SYMBOL(snd_pcm_new_internal);
+
+EXPORT_SYMBOL(snd_pcm_new_soc_be);
static void snd_pcm_free_stream(struct snd_pcm_str * pstr)
{
@@ -1034,7 +1101,7 @@
}
for (cidx = 0; cidx < 2; cidx++) {
int devtype = -1;
- if (pcm->streams[cidx].substream == NULL || pcm->internal)
+ if (pcm->streams[cidx].substream == NULL)
continue;
switch (cidx) {
case SNDRV_PCM_STREAM_PLAYBACK:
@@ -1075,6 +1142,29 @@
return 0;
}
+static int snd_pcm_dev_register_soc_be(struct snd_device *device)
+{
+ int err;
+ struct snd_pcm_notify *notify;
+ struct snd_pcm *pcm;
+
+ if (snd_BUG_ON(!device || !device->device_data))
+ return -ENXIO;
+ pcm = device->device_data;
+ mutex_lock(®ister_mutex);
+ err = snd_pcm_add(pcm);
+ if (err) {
+ mutex_unlock(®ister_mutex);
+ return err;
+ }
+
+ list_for_each_entry(notify, &snd_pcm_notify_list, list)
+ notify->n_register(pcm);
+
+ mutex_unlock(®ister_mutex);
+ return 0;
+}
+
static int snd_pcm_dev_disconnect(struct snd_device *device)
{
struct snd_pcm *pcm = device->device_data;
diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
index 4d18941..b5d5a75 100644
--- a/sound/core/pcm_lib.c
+++ b/sound/core/pcm_lib.c
@@ -6,8 +6,7 @@
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * the Free Software Foundation; only version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -1030,7 +1029,7 @@
* Returns non-zero if the value is changed, zero if not changed.
*/
int snd_interval_list(struct snd_interval *i, unsigned int count,
- const unsigned int *list, unsigned int mask)
+ unsigned int *list, unsigned int mask)
{
unsigned int k;
struct snd_interval list_range;
@@ -1992,6 +1991,9 @@
struct snd_pcm_runtime *runtime;
if (PCM_RUNTIME_CHECK(substream))
return -ENXIO;
+ /* TODO: consider and -EINVAL here */
+ if (substream->hw_no_buffer)
+ snd_printd("%s: warning this PCM is host less\n", __func__);
runtime = substream->runtime;
if (snd_BUG_ON(!substream->ops->copy && !runtime->dma_area))
return -EINVAL;
diff --git a/sound/core/pcm_misc.c b/sound/core/pcm_misc.c
index 9c9eff9..1dbd5ad 100644
--- a/sound/core/pcm_misc.c
+++ b/sound/core/pcm_misc.c
@@ -148,7 +148,9 @@
.le = -1, .signd = -1,
},
[SNDRV_PCM_FORMAT_SPECIAL] = {
- .le = -1, .signd = -1,
+ /* set the width and phys same as S16_LE */
+ .width = 16, .phys = 16, .le = -1, .signd = -1,
+ .silence = {},
},
[SNDRV_PCM_FORMAT_S24_3LE] = {
.width = 24, .phys = 24, .le = 1, .signd = 1,
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
index 3fe99e6..5034393 100644
--- a/sound/core/pcm_native.c
+++ b/sound/core/pcm_native.c
@@ -5,8 +5,7 @@
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * the Free Software Foundation; only version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -29,6 +28,7 @@
#include <linux/dma-mapping.h>
#include <sound/core.h>
#include <sound/control.h>
+#include <sound/compress_offload.h>
#include <sound/info.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
@@ -843,6 +843,7 @@
if (runtime->status->state != SNDRV_PCM_STATE_PREPARED)
return -EBADFD;
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
+ !substream->hw_no_buffer &&
!snd_pcm_playback_data(substream))
return -EPIPE;
runtime->trigger_master = substream;
@@ -1520,6 +1521,19 @@
return result;
}
+static int snd_compressed_ioctl(struct snd_pcm_substream *substream,
+ unsigned int cmd, void __user *arg)
+{
+ struct snd_pcm_runtime *runtime;
+ int err = 0;
+
+ if (PCM_RUNTIME_CHECK(substream))
+ return -ENXIO;
+ runtime = substream->runtime;
+ pr_debug("%s called with cmd = %d\n", __func__, cmd);
+ err = substream->ops->ioctl(substream, cmd, arg);
+ return err;
+}
/*
* drop ioctl
*
@@ -2041,6 +2055,12 @@
goto error;
}
+ if (substream->ops == NULL) {
+ snd_printd("cannot open back end PCMs directly\n");
+ err = -ENODEV;
+ goto error;
+ }
+
if ((err = substream->ops->open(substream)) < 0)
goto error;
@@ -2567,6 +2587,12 @@
snd_pcm_stream_unlock_irq(substream);
return res;
}
+ case SNDRV_COMPRESS_GET_CAPS:
+ case SNDRV_COMPRESS_GET_CODEC_CAPS:
+ case SNDRV_COMPRESS_SET_PARAMS:
+ case SNDRV_COMPRESS_GET_PARAMS:
+ case SNDRV_COMPRESS_TSTAMP:
+ return snd_compressed_ioctl(substream, cmd, arg);
}
snd_printd("unknown ioctl = 0x%x\n", cmd);
return -ENOTTY;
@@ -2739,7 +2765,7 @@
pcm_file = file->private_data;
- if (((cmd >> 8) & 0xff) != 'A')
+ if ((((cmd >> 8) & 0xff) != 'A') && (((cmd >> 8) & 0xff) != 'C'))
return -ENOTTY;
return snd_pcm_playback_ioctl1(file, pcm_file->substream, cmd,