1 /* 2 * Apple Onboard Audio Alsa helpers 3 * 4 * Copyright 2006 Johannes Berg <johannes@sipsolutions.net> 5 * 6 * GPL v2, can be found in COPYING. 7 */ 8 #include <linux/module.h> 9 #include "alsa.h" 10 11 static int index = -1; 12 module_param(index, int, 0444); 13 MODULE_PARM_DESC(index, "index for AOA sound card."); 14 15 static struct aoa_card *aoa_card; 16 17 int aoa_alsa_init(char *name, struct module *mod, struct device *dev) 18 { 19 struct snd_card *alsa_card; 20 int err; 21 22 if (aoa_card) 23 /* cannot be EEXIST due to usage in aoa_fabric_register */ 24 return -EBUSY; 25 26 err = snd_card_create(index, name, mod, sizeof(struct aoa_card), 27 &alsa_card); 28 if (err < 0) 29 return err; 30 aoa_card = alsa_card->private_data; 31 aoa_card->alsa_card = alsa_card; 32 alsa_card->dev = dev; 33 strlcpy(alsa_card->driver, "AppleOnbdAudio", sizeof(alsa_card->driver)); 34 strlcpy(alsa_card->shortname, name, sizeof(alsa_card->shortname)); 35 strlcpy(alsa_card->longname, name, sizeof(alsa_card->longname)); 36 strlcpy(alsa_card->mixername, name, sizeof(alsa_card->mixername)); 37 err = snd_card_register(aoa_card->alsa_card); 38 if (err < 0) { 39 printk(KERN_ERR "snd-aoa: couldn't register alsa card\n"); 40 snd_card_free(aoa_card->alsa_card); 41 aoa_card = NULL; 42 return err; 43 } 44 return 0; 45 } 46 47 struct snd_card *aoa_get_card(void) 48 { 49 if (aoa_card) 50 return aoa_card->alsa_card; 51 return NULL; 52 } 53 EXPORT_SYMBOL_GPL(aoa_get_card); 54 55 void aoa_alsa_cleanup(void) 56 { 57 if (aoa_card) { 58 snd_card_free(aoa_card->alsa_card); 59 aoa_card = NULL; 60 } 61 } 62 63 int aoa_snd_device_new(snd_device_type_t type, 64 void * device_data, struct snd_device_ops * ops) 65 { 66 struct snd_card *card = aoa_get_card(); 67 int err; 68 69 if (!card) return -ENOMEM; 70 71 err = snd_device_new(card, type, device_data, ops); 72 if (err) { 73 printk(KERN_ERR "snd-aoa: failed to create snd device (%d)\n", err); 74 return err; 75 } 76 err = snd_device_register(card, device_data); 77 if (err) { 78 printk(KERN_ERR "snd-aoa: failed to register " 79 "snd device (%d)\n", err); 80 printk(KERN_ERR "snd-aoa: have you forgotten the " 81 "dev_register callback?\n"); 82 snd_device_free(card, device_data); 83 } 84 return err; 85 } 86 EXPORT_SYMBOL_GPL(aoa_snd_device_new); 87 88 int aoa_snd_ctl_add(struct snd_kcontrol* control) 89 { 90 int err; 91 92 if (!aoa_card) return -ENODEV; 93 94 err = snd_ctl_add(aoa_card->alsa_card, control); 95 if (err) 96 printk(KERN_ERR "snd-aoa: failed to add alsa control (%d)\n", 97 err); 98 return err; 99 } 100 EXPORT_SYMBOL_GPL(aoa_snd_ctl_add); 101