alsa.c (2415B)
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 10static int index = -1; 11module_param(index, int, 0444); 12MODULE_PARM_DESC(index, "index for AOA sound card."); 13 14static struct aoa_card *aoa_card; 15 16int 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 strscpy(alsa_card->driver, "AppleOnbdAudio", sizeof(alsa_card->driver)); 32 strscpy(alsa_card->shortname, name, sizeof(alsa_card->shortname)); 33 strscpy(alsa_card->longname, name, sizeof(alsa_card->longname)); 34 strscpy(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 45struct snd_card *aoa_get_card(void) 46{ 47 if (aoa_card) 48 return aoa_card->alsa_card; 49 return NULL; 50} 51EXPORT_SYMBOL_GPL(aoa_get_card); 52 53void aoa_alsa_cleanup(void) 54{ 55 if (aoa_card) { 56 snd_card_free(aoa_card->alsa_card); 57 aoa_card = NULL; 58 } 59} 60 61int 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} 84EXPORT_SYMBOL_GPL(aoa_snd_device_new); 85 86int 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} 98EXPORT_SYMBOL_GPL(aoa_snd_ctl_add);