ALSA: hwdep: Allow to assign the given parent

Just like PCM, allow hwdep to be assigned to a different parent device
than the card.  It'll be used for the HD-audio codec device in the
later patches.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Takashi Iwai 2014-02-25 08:05:21 +01:00
Родитель f806bdb2f7
Коммит 71e2e1c147
2 изменённых файлов: 13 добавлений и 7 удалений

Просмотреть файл

@ -68,6 +68,7 @@ struct snd_hwdep {
wait_queue_head_t open_wait; wait_queue_head_t open_wait;
void *private_data; void *private_data;
void (*private_free) (struct snd_hwdep *hwdep); void (*private_free) (struct snd_hwdep *hwdep);
struct device *dev;
const struct attribute_group **groups; const struct attribute_group **groups;
struct mutex open_mutex; struct mutex open_mutex;

Просмотреть файл

@ -416,6 +416,7 @@ static int snd_hwdep_dev_register(struct snd_device *device)
{ {
struct snd_hwdep *hwdep = device->device_data; struct snd_hwdep *hwdep = device->device_data;
struct snd_card *card = hwdep->card; struct snd_card *card = hwdep->card;
struct device *dev;
int err; int err;
char name[32]; char name[32];
@ -426,10 +427,14 @@ static int snd_hwdep_dev_register(struct snd_device *device)
} }
list_add_tail(&hwdep->list, &snd_hwdep_devices); list_add_tail(&hwdep->list, &snd_hwdep_devices);
sprintf(name, "hwC%iD%i", hwdep->card->number, hwdep->device); sprintf(name, "hwC%iD%i", hwdep->card->number, hwdep->device);
if ((err = snd_register_device(SNDRV_DEVICE_TYPE_HWDEP, dev = hwdep->dev;
hwdep->card, hwdep->device, if (!dev)
&snd_hwdep_f_ops, hwdep, name)) < 0) { dev = snd_card_get_device_link(hwdep->card);
dev_err(card->dev, err = snd_register_device_for_dev(SNDRV_DEVICE_TYPE_HWDEP,
hwdep->card, hwdep->device,
&snd_hwdep_f_ops, hwdep, name, dev);
if (err < 0) {
dev_err(dev,
"unable to register hardware dependent device %i:%i\n", "unable to register hardware dependent device %i:%i\n",
card->number, hwdep->device); card->number, hwdep->device);
list_del(&hwdep->list); list_del(&hwdep->list);
@ -445,7 +450,7 @@ static int snd_hwdep_dev_register(struct snd_device *device)
dev_set_drvdata(d, hwdep->private_data); dev_set_drvdata(d, hwdep->private_data);
err = sysfs_create_groups(&d->kobj, hwdep->groups); err = sysfs_create_groups(&d->kobj, hwdep->groups);
if (err < 0) if (err < 0)
dev_warn(card->dev, dev_warn(dev,
"hwdep %d:%d: cannot create sysfs groups\n", "hwdep %d:%d: cannot create sysfs groups\n",
card->number, hwdep->device); card->number, hwdep->device);
put_device(d); put_device(d);
@ -456,13 +461,13 @@ static int snd_hwdep_dev_register(struct snd_device *device)
hwdep->ossreg = 0; hwdep->ossreg = 0;
if (hwdep->oss_type >= 0) { if (hwdep->oss_type >= 0) {
if ((hwdep->oss_type == SNDRV_OSS_DEVICE_TYPE_DMFM) && (hwdep->device != 0)) { if ((hwdep->oss_type == SNDRV_OSS_DEVICE_TYPE_DMFM) && (hwdep->device != 0)) {
dev_warn(card->dev, dev_warn(dev,
"only hwdep device 0 can be registered as OSS direct FM device!\n"); "only hwdep device 0 can be registered as OSS direct FM device!\n");
} else { } else {
if (snd_register_oss_device(hwdep->oss_type, if (snd_register_oss_device(hwdep->oss_type,
card, hwdep->device, card, hwdep->device,
&snd_hwdep_f_ops, hwdep) < 0) { &snd_hwdep_f_ops, hwdep) < 0) {
dev_err(card->dev, dev_err(dev,
"unable to register OSS compatibility device %i:%i\n", "unable to register OSS compatibility device %i:%i\n",
card->number, hwdep->device); card->number, hwdep->device);
} else } else