Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/ppc/powermac.c
26381 views
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
/*
3
* Driver for PowerMac AWACS
4
* Copyright (c) 2001 by Takashi Iwai <[email protected]>
5
* based on dmasound.c.
6
*/
7
8
#include <linux/init.h>
9
#include <linux/err.h>
10
#include <linux/platform_device.h>
11
#include <linux/module.h>
12
#include <sound/core.h>
13
#include <sound/initval.h>
14
#include "pmac.h"
15
#include "awacs.h"
16
#include "burgundy.h"
17
18
#define CHIP_NAME "PMac"
19
20
MODULE_DESCRIPTION("PowerMac");
21
MODULE_LICENSE("GPL");
22
23
static int index = SNDRV_DEFAULT_IDX1; /* Index 0-MAX */
24
static char *id = SNDRV_DEFAULT_STR1; /* ID for this card */
25
static bool enable_beep = 1;
26
27
module_param(index, int, 0444);
28
MODULE_PARM_DESC(index, "Index value for " CHIP_NAME " soundchip.");
29
module_param(id, charp, 0444);
30
MODULE_PARM_DESC(id, "ID string for " CHIP_NAME " soundchip.");
31
module_param(enable_beep, bool, 0444);
32
MODULE_PARM_DESC(enable_beep, "Enable beep using PCM.");
33
34
static struct platform_device *device;
35
36
37
/*
38
*/
39
40
static int snd_pmac_probe(struct platform_device *devptr)
41
{
42
struct snd_card *card;
43
struct snd_pmac *chip;
44
char *name_ext;
45
int err;
46
47
err = snd_card_new(&devptr->dev, index, id, THIS_MODULE, 0, &card);
48
if (err < 0)
49
return err;
50
51
err = snd_pmac_new(card, &chip);
52
if (err < 0)
53
goto __error;
54
card->private_data = chip;
55
56
switch (chip->model) {
57
case PMAC_BURGUNDY:
58
strscpy(card->driver, "PMac Burgundy");
59
strscpy(card->shortname, "PowerMac Burgundy");
60
sprintf(card->longname, "%s (Dev %d) Sub-frame %d",
61
card->shortname, chip->device_id, chip->subframe);
62
err = snd_pmac_burgundy_init(chip);
63
if (err < 0)
64
goto __error;
65
break;
66
case PMAC_DACA:
67
strscpy(card->driver, "PMac DACA");
68
strscpy(card->shortname, "PowerMac DACA");
69
sprintf(card->longname, "%s (Dev %d) Sub-frame %d",
70
card->shortname, chip->device_id, chip->subframe);
71
err = snd_pmac_daca_init(chip);
72
if (err < 0)
73
goto __error;
74
break;
75
case PMAC_TUMBLER:
76
case PMAC_SNAPPER:
77
name_ext = chip->model == PMAC_TUMBLER ? "Tumbler" : "Snapper";
78
sprintf(card->driver, "PMac %s", name_ext);
79
sprintf(card->shortname, "PowerMac %s", name_ext);
80
sprintf(card->longname, "%s (Dev %d) Sub-frame %d",
81
card->shortname, chip->device_id, chip->subframe);
82
err = snd_pmac_tumbler_init(chip);
83
if (err < 0)
84
goto __error;
85
err = snd_pmac_tumbler_post_init();
86
if (err < 0)
87
goto __error;
88
break;
89
case PMAC_AWACS:
90
case PMAC_SCREAMER:
91
name_ext = chip->model == PMAC_SCREAMER ? "Screamer" : "AWACS";
92
sprintf(card->driver, "PMac %s", name_ext);
93
sprintf(card->shortname, "PowerMac %s", name_ext);
94
if (chip->is_pbook_3400)
95
name_ext = " [PB3400]";
96
else if (chip->is_pbook_G3)
97
name_ext = " [PBG3]";
98
else
99
name_ext = "";
100
sprintf(card->longname, "%s%s Rev %d",
101
card->shortname, name_ext, chip->revision);
102
err = snd_pmac_awacs_init(chip);
103
if (err < 0)
104
goto __error;
105
break;
106
default:
107
dev_err(&devptr->dev, "unsupported hardware %d\n", chip->model);
108
err = -EINVAL;
109
goto __error;
110
}
111
112
err = snd_pmac_pcm_new(chip);
113
if (err < 0)
114
goto __error;
115
116
chip->initialized = 1;
117
if (enable_beep)
118
snd_pmac_attach_beep(chip);
119
120
err = snd_card_register(card);
121
if (err < 0)
122
goto __error;
123
124
platform_set_drvdata(devptr, card);
125
return 0;
126
127
__error:
128
snd_card_free(card);
129
return err;
130
}
131
132
133
static void snd_pmac_remove(struct platform_device *devptr)
134
{
135
snd_card_free(platform_get_drvdata(devptr));
136
}
137
138
#ifdef CONFIG_PM_SLEEP
139
static int snd_pmac_driver_suspend(struct device *dev)
140
{
141
struct snd_card *card = dev_get_drvdata(dev);
142
snd_pmac_suspend(card->private_data);
143
return 0;
144
}
145
146
static int snd_pmac_driver_resume(struct device *dev)
147
{
148
struct snd_card *card = dev_get_drvdata(dev);
149
snd_pmac_resume(card->private_data);
150
return 0;
151
}
152
153
static SIMPLE_DEV_PM_OPS(snd_pmac_pm, snd_pmac_driver_suspend, snd_pmac_driver_resume);
154
#define SND_PMAC_PM_OPS &snd_pmac_pm
155
#else
156
#define SND_PMAC_PM_OPS NULL
157
#endif
158
159
#define SND_PMAC_DRIVER "snd_powermac"
160
161
static struct platform_driver snd_pmac_driver = {
162
.probe = snd_pmac_probe,
163
.remove = snd_pmac_remove,
164
.driver = {
165
.name = SND_PMAC_DRIVER,
166
.pm = SND_PMAC_PM_OPS,
167
},
168
};
169
170
static int __init alsa_card_pmac_init(void)
171
{
172
int err;
173
174
err = platform_driver_register(&snd_pmac_driver);
175
if (err < 0)
176
return err;
177
device = platform_device_register_simple(SND_PMAC_DRIVER, -1, NULL, 0);
178
return 0;
179
180
}
181
182
static void __exit alsa_card_pmac_exit(void)
183
{
184
if (!IS_ERR(device))
185
platform_device_unregister(device);
186
platform_driver_unregister(&snd_pmac_driver);
187
}
188
189
module_init(alsa_card_pmac_init)
190
module_exit(alsa_card_pmac_exit)
191
192