0001
0002
0003
0004
0005
0006
0007 #include <linux/module.h>
0008 #include "alsa.h"
0009
0010 static int index = -1;
0011 module_param(index, int, 0444);
0012 MODULE_PARM_DESC(index, "index for AOA sound card.");
0013
0014 static struct aoa_card *aoa_card;
0015
0016 int aoa_alsa_init(char *name, struct module *mod, struct device *dev)
0017 {
0018 struct snd_card *alsa_card;
0019 int err;
0020
0021 if (aoa_card)
0022
0023 return -EBUSY;
0024
0025 err = snd_card_new(dev, index, name, mod, sizeof(struct aoa_card),
0026 &alsa_card);
0027 if (err < 0)
0028 return err;
0029 aoa_card = alsa_card->private_data;
0030 aoa_card->alsa_card = alsa_card;
0031 strscpy(alsa_card->driver, "AppleOnbdAudio", sizeof(alsa_card->driver));
0032 strscpy(alsa_card->shortname, name, sizeof(alsa_card->shortname));
0033 strscpy(alsa_card->longname, name, sizeof(alsa_card->longname));
0034 strscpy(alsa_card->mixername, name, sizeof(alsa_card->mixername));
0035 err = snd_card_register(aoa_card->alsa_card);
0036 if (err < 0) {
0037 printk(KERN_ERR "snd-aoa: couldn't register alsa card\n");
0038 snd_card_free(aoa_card->alsa_card);
0039 aoa_card = NULL;
0040 return err;
0041 }
0042 return 0;
0043 }
0044
0045 struct snd_card *aoa_get_card(void)
0046 {
0047 if (aoa_card)
0048 return aoa_card->alsa_card;
0049 return NULL;
0050 }
0051 EXPORT_SYMBOL_GPL(aoa_get_card);
0052
0053 void aoa_alsa_cleanup(void)
0054 {
0055 if (aoa_card) {
0056 snd_card_free(aoa_card->alsa_card);
0057 aoa_card = NULL;
0058 }
0059 }
0060
0061 int aoa_snd_device_new(enum snd_device_type type,
0062 void *device_data, const struct snd_device_ops *ops)
0063 {
0064 struct snd_card *card = aoa_get_card();
0065 int err;
0066
0067 if (!card) return -ENOMEM;
0068
0069 err = snd_device_new(card, type, device_data, ops);
0070 if (err) {
0071 printk(KERN_ERR "snd-aoa: failed to create snd device (%d)\n", err);
0072 return err;
0073 }
0074 err = snd_device_register(card, device_data);
0075 if (err) {
0076 printk(KERN_ERR "snd-aoa: failed to register "
0077 "snd device (%d)\n", err);
0078 printk(KERN_ERR "snd-aoa: have you forgotten the "
0079 "dev_register callback?\n");
0080 snd_device_free(card, device_data);
0081 }
0082 return err;
0083 }
0084 EXPORT_SYMBOL_GPL(aoa_snd_device_new);
0085
0086 int aoa_snd_ctl_add(struct snd_kcontrol* control)
0087 {
0088 int err;
0089
0090 if (!aoa_card) return -ENODEV;
0091
0092 err = snd_ctl_add(aoa_card->alsa_card, control);
0093 if (err)
0094 printk(KERN_ERR "snd-aoa: failed to add alsa control (%d)\n",
0095 err);
0096 return err;
0097 }
0098 EXPORT_SYMBOL_GPL(aoa_snd_ctl_add);