brintos

brintos / linux-shallow public Read only

0
0
Text · 2.4 KiB · 7fce858 Raw
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