123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- /*
- * Apple Onboard Audio Alsa helpers
- *
- * Copyright 2006 Johannes Berg <johannes@sipsolutions.net>
- *
- * GPL v2, can be found in COPYING.
- */
- #include <linux/module.h>
- #include "alsa.h"
- static int index = -1;
- module_param(index, int, 0444);
- MODULE_PARM_DESC(index, "index for AOA sound card.");
- static struct aoa_card *aoa_card;
- int aoa_alsa_init(char *name, struct module *mod, struct device *dev)
- {
- struct snd_card *alsa_card;
- int err;
- if (aoa_card)
- /* cannot be EEXIST due to usage in aoa_fabric_register */
- return -EBUSY;
- err = snd_card_create(index, name, mod, sizeof(struct aoa_card),
- &alsa_card);
- if (err < 0)
- return err;
- aoa_card = alsa_card->private_data;
- aoa_card->alsa_card = alsa_card;
- alsa_card->dev = dev;
- strlcpy(alsa_card->driver, "AppleOnbdAudio", sizeof(alsa_card->driver));
- strlcpy(alsa_card->shortname, name, sizeof(alsa_card->shortname));
- strlcpy(alsa_card->longname, name, sizeof(alsa_card->longname));
- strlcpy(alsa_card->mixername, name, sizeof(alsa_card->mixername));
- err = snd_card_register(aoa_card->alsa_card);
- if (err < 0) {
- printk(KERN_ERR "snd-aoa: couldn't register alsa card\n");
- snd_card_free(aoa_card->alsa_card);
- aoa_card = NULL;
- return err;
- }
- return 0;
- }
- struct snd_card *aoa_get_card(void)
- {
- if (aoa_card)
- return aoa_card->alsa_card;
- return NULL;
- }
- EXPORT_SYMBOL_GPL(aoa_get_card);
- void aoa_alsa_cleanup(void)
- {
- if (aoa_card) {
- snd_card_free(aoa_card->alsa_card);
- aoa_card = NULL;
- }
- }
- int aoa_snd_device_new(snd_device_type_t type,
- void * device_data, struct snd_device_ops * ops)
- {
- struct snd_card *card = aoa_get_card();
- int err;
- if (!card) return -ENOMEM;
- err = snd_device_new(card, type, device_data, ops);
- if (err) {
- printk(KERN_ERR "snd-aoa: failed to create snd device (%d)\n", err);
- return err;
- }
- err = snd_device_register(card, device_data);
- if (err) {
- printk(KERN_ERR "snd-aoa: failed to register "
- "snd device (%d)\n", err);
- printk(KERN_ERR "snd-aoa: have you forgotten the "
- "dev_register callback?\n");
- snd_device_free(card, device_data);
- }
- return err;
- }
- EXPORT_SYMBOL_GPL(aoa_snd_device_new);
- int aoa_snd_ctl_add(struct snd_kcontrol* control)
- {
- int err;
- if (!aoa_card) return -ENODEV;
- err = snd_ctl_add(aoa_card->alsa_card, control);
- if (err)
- printk(KERN_ERR "snd-aoa: failed to add alsa control (%d)\n",
- err);
- return err;
- }
- EXPORT_SYMBOL_GPL(aoa_snd_ctl_add);
|