Skip to content

Commit

Permalink
Merge branch 'topic/misc' into for-linus
Browse files Browse the repository at this point in the history
  • Loading branch information
tiwai committed Mar 18, 2012
2 parents dbf117c + c6b76d1 commit 44c76a9
Show file tree
Hide file tree
Showing 33 changed files with 612 additions and 193 deletions.
5 changes: 3 additions & 2 deletions include/sound/pcm.h
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ struct snd_pcm_hw_constraint_ratdens {

struct snd_pcm_hw_constraint_list {
unsigned int count;
unsigned int *list;
const unsigned int *list;
unsigned int mask;
};

Expand Down Expand Up @@ -781,7 +781,8 @@ void snd_interval_muldivk(const struct snd_interval *a, const struct snd_interva
unsigned int k, struct snd_interval *c);
void snd_interval_mulkdiv(const struct snd_interval *a, unsigned int k,
const struct snd_interval *b, struct snd_interval *c);
int snd_interval_list(struct snd_interval *i, unsigned int count, unsigned int *list, unsigned int mask);
int snd_interval_list(struct snd_interval *i, unsigned int count,
const unsigned int *list, unsigned int mask);
int snd_interval_ratnum(struct snd_interval *i,
unsigned int rats_count, struct snd_ratnum *rats,
unsigned int *nump, unsigned int *denp);
Expand Down
2 changes: 1 addition & 1 deletion include/sound/version.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
/* include/version.h */
#define CONFIG_SND_VERSION "1.0.24"
#define CONFIG_SND_VERSION "1.0.25"
#define CONFIG_SND_DATE ""
2 changes: 2 additions & 0 deletions include/sound/ymfpci.h
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,8 @@ struct snd_ymfpci {
#ifdef CONFIG_PM
u32 *saved_regs;
u32 saved_ydsxgr_mode;
u16 saved_dsxg_legacy;
u16 saved_dsxg_elegacy;
#endif
};

Expand Down
13 changes: 1 addition & 12 deletions sound/aoa/codecs/onyx.c
Original file line number Diff line number Diff line change
Expand Up @@ -1132,15 +1132,4 @@ static struct i2c_driver onyx_driver = {
.id_table = onyx_i2c_id,
};

static int __init onyx_init(void)
{
return i2c_add_driver(&onyx_driver);
}

static void __exit onyx_exit(void)
{
i2c_del_driver(&onyx_driver);
}

module_init(onyx_init);
module_exit(onyx_exit);
module_i2c_driver(onyx_driver);
13 changes: 1 addition & 12 deletions sound/aoa/codecs/tas.c
Original file line number Diff line number Diff line change
Expand Up @@ -1026,15 +1026,4 @@ static struct i2c_driver tas_driver = {
.id_table = tas_i2c_id,
};

static int __init tas_init(void)
{
return i2c_add_driver(&tas_driver);
}

static void __exit tas_exit(void)
{
i2c_del_driver(&tas_driver);
}

module_init(tas_init);
module_exit(tas_exit);
module_i2c_driver(tas_driver);
2 changes: 1 addition & 1 deletion sound/core/control.c
Original file line number Diff line number Diff line change
Expand Up @@ -1313,7 +1313,7 @@ static int snd_ctl_tlv_ioctl(struct snd_ctl_file *file,
err = -EPERM;
goto __kctl_end;
}
err = kctl->tlv.c(kctl, op_flag, tlv.length, _tlv->tlv);
err = kctl->tlv.c(kctl, op_flag, tlv.length, _tlv->tlv);
if (err > 0) {
up_read(&card->controls_rwsem);
snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_TLV, &kctl->id);
Expand Down
169 changes: 100 additions & 69 deletions sound/core/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -480,74 +480,104 @@ int snd_card_free(struct snd_card *card)

EXPORT_SYMBOL(snd_card_free);

static void snd_card_set_id_no_lock(struct snd_card *card, const char *nid)
/* retrieve the last word of shortname or longname */
static const char *retrieve_id_from_card_name(const char *name)
{
int i, len, idx_flag = 0, loops = SNDRV_CARDS;
const char *spos, *src;
char *id;

if (nid == NULL) {
id = card->shortname;
spos = src = id;
while (*id != '\0') {
if (*id == ' ')
spos = id + 1;
id++;
}
} else {
spos = src = nid;
const char *spos = name;

while (*name) {
if (isspace(*name) && isalnum(name[1]))
spos = name + 1;
name++;
}
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++;
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;
}
*id = '\0';
return true;
}

id = card->id;
/* 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;
char *id;

if (*id == '\0')
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;
}

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;
with_suffix = false;
for (loops = 0; loops < SNDRV_CARDS; loops++) {
if (card_id_ok(card, id))
return; /* OK */

__change:
len = strlen(id);
if (idx_flag) {
if (id[len-1] != '9')
id[len-1]++;
else
id[len-1] = 'A';
} else if ((size_t)len <= sizeof(card->id) - 3) {
strcat(id, "_1");
idx_flag++;
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 {
spos = id + len - 2;
if ((size_t)len <= sizeof(card->id) - 2)
spos++;
*(char *)spos++ = '_';
*(char *)spos++ = '1';
*(char *)spos++ = '\0';
idx_flag++;
/* modify the existing suffix */
if (id[len - 1] != '9')
id[len - 1]++;
else
id[len - 1] = 'A';
}
}
/* 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);
}

/**
Expand All @@ -564,7 +594,7 @@ void snd_card_set_id(struct snd_card *card, const char *nid)
if (card->id[0] != '\0')
return;
mutex_lock(&snd_card_mutex);
snd_card_set_id_no_lock(card, nid);
snd_card_set_id_no_lock(card, nid, nid);
mutex_unlock(&snd_card_mutex);
}
EXPORT_SYMBOL(snd_card_set_id);
Expand Down Expand Up @@ -596,22 +626,12 @@ card_id_store_attr(struct device *dev, struct device_attribute *attr,
memcpy(buf1, buf, copy);
buf1[copy] = '\0';
mutex_lock(&snd_card_mutex);
if (!snd_info_check_reserved_words(buf1)) {
__exist:
if (!card_id_ok(NULL, buf1)) {
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;
Expand Down Expand Up @@ -665,7 +685,18 @@ int snd_card_register(struct snd_card *card)
mutex_unlock(&snd_card_mutex);
return 0;
}
snd_card_set_id_no_lock(card, card->id[0] == '\0' ? NULL : card->id);
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_cards[card->number] = card;
mutex_unlock(&snd_card_mutex);
init_info_for_card(card);
Expand Down
2 changes: 1 addition & 1 deletion sound/core/misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ void __snd_printk(unsigned int level, const char *path, int line,
char verbose_fmt[] = KERN_DEFAULT "ALSA %s:%d %pV";
#endif

#ifdef CONFIG_SND_DEBUG
#ifdef CONFIG_SND_DEBUG
if (debug < level)
return;
#endif
Expand Down
3 changes: 2 additions & 1 deletion sound/core/pcm_lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -1029,7 +1029,8 @@ static int snd_interval_ratden(struct snd_interval *i,
*
* Returns non-zero if the value is changed, zero if not changed.
*/
int snd_interval_list(struct snd_interval *i, unsigned int count, unsigned int *list, unsigned int mask)
int snd_interval_list(struct snd_interval *i, unsigned int count,
const unsigned int *list, unsigned int mask)
{
unsigned int k;
struct snd_interval list_range;
Expand Down
15 changes: 10 additions & 5 deletions sound/core/pcm_native.c
Original file line number Diff line number Diff line change
Expand Up @@ -1586,12 +1586,18 @@ static int snd_pcm_link(struct snd_pcm_substream *substream, int fd)
struct file *file;
struct snd_pcm_file *pcm_file;
struct snd_pcm_substream *substream1;
struct snd_pcm_group *group;

file = snd_pcm_file_fd(fd);
if (!file)
return -EBADFD;
pcm_file = file->private_data;
substream1 = pcm_file->substream;
group = kmalloc(sizeof(*group), GFP_KERNEL);
if (!group) {
res = -ENOMEM;
goto _nolock;
}
down_write(&snd_pcm_link_rwsem);
write_lock_irq(&snd_pcm_link_rwlock);
if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN ||
Expand All @@ -1604,11 +1610,7 @@ static int snd_pcm_link(struct snd_pcm_substream *substream, int fd)
goto _end;
}
if (!snd_pcm_stream_linked(substream)) {
substream->group = kmalloc(sizeof(struct snd_pcm_group), GFP_ATOMIC);
if (substream->group == NULL) {
res = -ENOMEM;
goto _end;
}
substream->group = group;
spin_lock_init(&substream->group->lock);
INIT_LIST_HEAD(&substream->group->substreams);
list_add_tail(&substream->link_list, &substream->group->substreams);
Expand All @@ -1620,7 +1622,10 @@ static int snd_pcm_link(struct snd_pcm_substream *substream, int fd)
_end:
write_unlock_irq(&snd_pcm_link_rwlock);
up_write(&snd_pcm_link_rwsem);
_nolock:
fput(file);
if (res < 0)
kfree(group);
return res;
}

Expand Down
13 changes: 11 additions & 2 deletions sound/pci/au88x0/au88x0.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
#include <sound/mpu401.h>
#include <sound/hwdep.h>
#include <sound/ac97_codec.h>

#include <sound/tlv.h>
#endif

#ifndef CHIP_AU8820
Expand Down Expand Up @@ -107,6 +107,14 @@
#define NR_WTPB 0x20 /* WT channels per each bank. */
#define NR_PCM 0x10

struct pcm_vol {
struct snd_kcontrol *kctl;
int active;
int dma;
int mixin[4];
int vol[4];
};

/* Structs */
typedef struct {
//int this_08; /* Still unknown */
Expand Down Expand Up @@ -168,6 +176,7 @@ struct snd_vortex {
/* Xtalk canceler */
int xt_mode; /* 1: speakers, 0:headphones. */
#endif
struct pcm_vol pcm_vol[NR_PCM];

int isquad; /* cache of extended ID codec flag. */

Expand Down Expand Up @@ -239,7 +248,7 @@ static int vortex_alsafmt_aspfmt(int alsafmt);
/* Connection stuff. */
static void vortex_connect_default(vortex_t * vortex, int en);
static int vortex_adb_allocroute(vortex_t * vortex, int dma, int nr_ch,
int dir, int type);
int dir, int type, int subdev);
static char vortex_adb_checkinout(vortex_t * vortex, int resmap[], int out,
int restype);
#ifndef CHIP_AU8810
Expand Down
Loading

0 comments on commit 44c76a9

Please sign in to comment.