Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/aoa/core/alsa.c
26424 views
1
// SPDX-License-Identifier: GPL-2.0-only
2
/*
3
* Apple Onboard Audio Alsa helpers
4
*
5
* Copyright 2006 Johannes Berg <[email protected]>
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
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
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, 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
}
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);
99
100