Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+13 -7
+1
include/sound/hwdep.h
··· 68 68 wait_queue_head_t open_wait; 69 69 void *private_data; 70 70 void (*private_free) (struct snd_hwdep *hwdep); 71 + struct device *dev; 71 72 const struct attribute_group **groups; 72 73 73 74 struct mutex open_mutex;
+12 -7
sound/core/hwdep.c
··· 416 416 { 417 417 struct snd_hwdep *hwdep = device->device_data; 418 418 struct snd_card *card = hwdep->card; 419 + struct device *dev; 419 420 int err; 420 421 char name[32]; 421 422 ··· 427 426 } 428 427 list_add_tail(&hwdep->list, &snd_hwdep_devices); 429 428 sprintf(name, "hwC%iD%i", hwdep->card->number, hwdep->device); 430 - if ((err = snd_register_device(SNDRV_DEVICE_TYPE_HWDEP, 431 - hwdep->card, hwdep->device, 432 - &snd_hwdep_f_ops, hwdep, name)) < 0) { 433 - dev_err(card->dev, 429 + dev = hwdep->dev; 430 + if (!dev) 431 + dev = snd_card_get_device_link(hwdep->card); 432 + err = snd_register_device_for_dev(SNDRV_DEVICE_TYPE_HWDEP, 433 + hwdep->card, hwdep->device, 434 + &snd_hwdep_f_ops, hwdep, name, dev); 435 + if (err < 0) { 436 + dev_err(dev, 434 437 "unable to register hardware dependent device %i:%i\n", 435 438 card->number, hwdep->device); 436 439 list_del(&hwdep->list); ··· 450 445 dev_set_drvdata(d, hwdep->private_data); 451 446 err = sysfs_create_groups(&d->kobj, hwdep->groups); 452 447 if (err < 0) 453 - dev_warn(card->dev, 448 + dev_warn(dev, 454 449 "hwdep %d:%d: cannot create sysfs groups\n", 455 450 card->number, hwdep->device); 456 451 put_device(d); ··· 461 456 hwdep->ossreg = 0; 462 457 if (hwdep->oss_type >= 0) { 463 458 if ((hwdep->oss_type == SNDRV_OSS_DEVICE_TYPE_DMFM) && (hwdep->device != 0)) { 464 - dev_warn(card->dev, 459 + dev_warn(dev, 465 460 "only hwdep device 0 can be registered as OSS direct FM device!\n"); 466 461 } else { 467 462 if (snd_register_oss_device(hwdep->oss_type, 468 463 card, hwdep->device, 469 464 &snd_hwdep_f_ops, hwdep) < 0) { 470 - dev_err(card->dev, 465 + dev_err(dev, 471 466 "unable to register OSS compatibility device %i:%i\n", 472 467 card->number, hwdep->device); 473 468 } else