99 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Apple Onboard Audio Alsa helpers4 *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);99