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 11static int index = -1; 12module_param(index, int, 0444); 13MODULE_PARM_DESC(index, "index for AOA sound card."); 14 15static struct aoa_card *aoa_card; 16 17int 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_new(dev, 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 strlcpy(alsa_card->driver, "AppleOnbdAudio", sizeof(alsa_card->driver)); 33 strlcpy(alsa_card->shortname, name, sizeof(alsa_card->shortname)); 34 strlcpy(alsa_card->longname, name, sizeof(alsa_card->longname)); 35 strlcpy(alsa_card->mixername, name, sizeof(alsa_card->mixername)); 36 err = snd_card_register(aoa_card->alsa_card); 37 if (err < 0) { 38 printk(KERN_ERR "snd-aoa: couldn't register alsa card\n"); 39 snd_card_free(aoa_card->alsa_card); 40 aoa_card = NULL; 41 return err; 42 } 43 return 0; 44} 45 46struct snd_card *aoa_get_card(void) 47{ 48 if (aoa_card) 49 return aoa_card->alsa_card; 50 return NULL; 51} 52EXPORT_SYMBOL_GPL(aoa_get_card); 53 54void aoa_alsa_cleanup(void) 55{ 56 if (aoa_card) { 57 snd_card_free(aoa_card->alsa_card); 58 aoa_card = NULL; 59 } 60} 61 62int aoa_snd_device_new(enum snd_device_type type, 63 void * device_data, struct snd_device_ops * ops) 64{ 65 struct snd_card *card = aoa_get_card(); 66 int err; 67 68 if (!card) return -ENOMEM; 69 70 err = snd_device_new(card, type, device_data, ops); 71 if (err) { 72 printk(KERN_ERR "snd-aoa: failed to create snd device (%d)\n", err); 73 return err; 74 } 75 err = snd_device_register(card, device_data); 76 if (err) { 77 printk(KERN_ERR "snd-aoa: failed to register " 78 "snd device (%d)\n", err); 79 printk(KERN_ERR "snd-aoa: have you forgotten the " 80 "dev_register callback?\n"); 81 snd_device_free(card, device_data); 82 } 83 return err; 84} 85EXPORT_SYMBOL_GPL(aoa_snd_device_new); 86 87int aoa_snd_ctl_add(struct snd_kcontrol* control) 88{ 89 int err; 90 91 if (!aoa_card) return -ENODEV; 92 93 err = snd_ctl_add(aoa_card->alsa_card, control); 94 if (err) 95 printk(KERN_ERR "snd-aoa: failed to add alsa control (%d)\n", 96 err); 97 return err; 98} 99EXPORT_SYMBOL_GPL(aoa_snd_ctl_add); 100