root/sound/aoa/core/alsa.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. aoa_alsa_init
  2. aoa_get_card
  3. aoa_alsa_cleanup
  4. aoa_snd_device_new
  5. aoa_snd_ctl_add

   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, 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);

/* [<][>][^][v][top][bottom][index][help] */