linux/sound/aoa/core/alsa.c
<<
>>
Prefs
   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);
  99