Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Apple Onboard Audio Alsa helpers
0004  *
0005  * Copyright 2006 Johannes Berg <johannes@sipsolutions.net>
0006  */
0007 #include <linux/module.h>
0008 #include "alsa.h"
0009 
0010 static int index = -1;
0011 module_param(index, int, 0444);
0012 MODULE_PARM_DESC(index, "index for AOA sound card.");
0013 
0014 static struct aoa_card *aoa_card;
0015 
0016 int aoa_alsa_init(char *name, struct module *mod, struct device *dev)
0017 {
0018     struct snd_card *alsa_card;
0019     int err;
0020 
0021     if (aoa_card)
0022         /* cannot be EEXIST due to usage in aoa_fabric_register */
0023         return -EBUSY;
0024 
0025     err = snd_card_new(dev, index, name, mod, sizeof(struct aoa_card),
0026                &alsa_card);
0027     if (err < 0)
0028         return err;
0029     aoa_card = alsa_card->private_data;
0030     aoa_card->alsa_card = alsa_card;
0031     strscpy(alsa_card->driver, "AppleOnbdAudio", sizeof(alsa_card->driver));
0032     strscpy(alsa_card->shortname, name, sizeof(alsa_card->shortname));
0033     strscpy(alsa_card->longname, name, sizeof(alsa_card->longname));
0034     strscpy(alsa_card->mixername, name, sizeof(alsa_card->mixername));
0035     err = snd_card_register(aoa_card->alsa_card);
0036     if (err < 0) {
0037         printk(KERN_ERR "snd-aoa: couldn't register alsa card\n");
0038         snd_card_free(aoa_card->alsa_card);
0039         aoa_card = NULL;
0040         return err;
0041     }
0042     return 0;
0043 }
0044 
0045 struct snd_card *aoa_get_card(void)
0046 {
0047     if (aoa_card)
0048         return aoa_card->alsa_card;
0049     return NULL;
0050 }
0051 EXPORT_SYMBOL_GPL(aoa_get_card);
0052 
0053 void aoa_alsa_cleanup(void)
0054 {
0055     if (aoa_card) {
0056         snd_card_free(aoa_card->alsa_card);
0057         aoa_card = NULL;
0058     }
0059 }
0060 
0061 int aoa_snd_device_new(enum snd_device_type type,
0062                void *device_data, const struct snd_device_ops *ops)
0063 {
0064     struct snd_card *card = aoa_get_card();
0065     int err;
0066 
0067     if (!card) return -ENOMEM;
0068 
0069     err = snd_device_new(card, type, device_data, ops);
0070     if (err) {
0071         printk(KERN_ERR "snd-aoa: failed to create snd device (%d)\n", err);
0072         return err;
0073     }
0074     err = snd_device_register(card, device_data);
0075     if (err) {
0076         printk(KERN_ERR "snd-aoa: failed to register "
0077                 "snd device (%d)\n", err);
0078         printk(KERN_ERR "snd-aoa: have you forgotten the "
0079                 "dev_register callback?\n");
0080         snd_device_free(card, device_data);
0081     }
0082     return err;
0083 }
0084 EXPORT_SYMBOL_GPL(aoa_snd_device_new);
0085 
0086 int aoa_snd_ctl_add(struct snd_kcontrol* control)
0087 {
0088     int err;
0089 
0090     if (!aoa_card) return -ENODEV;
0091 
0092     err = snd_ctl_add(aoa_card->alsa_card, control);
0093     if (err)
0094         printk(KERN_ERR "snd-aoa: failed to add alsa control (%d)\n",
0095                err);
0096     return err;
0097 }
0098 EXPORT_SYMBOL_GPL(aoa_snd_ctl_add);