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