cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

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