2 * Driver for PowerMac AWACS
3 * Copyright (c) 2001 by Takashi Iwai <tiwai@suse.de>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #include <linux/init.h>
22 #include <linux/err.h>
23 #include <linux/platform_device.h>
24 #include <linux/module.h>
25 #include <sound/core.h>
26 #include <sound/initval.h>
31 #define CHIP_NAME "PMac"
33 MODULE_DESCRIPTION("PowerMac");
34 MODULE_SUPPORTED_DEVICE("{{Apple,PowerMac}}");
35 MODULE_LICENSE("GPL");
37 static int index
= SNDRV_DEFAULT_IDX1
; /* Index 0-MAX */
38 static char *id
= SNDRV_DEFAULT_STR1
; /* ID for this card */
39 static bool enable_beep
= 1;
41 module_param(index
, int, 0444);
42 MODULE_PARM_DESC(index
, "Index value for " CHIP_NAME
" soundchip.");
43 module_param(id
, charp
, 0444);
44 MODULE_PARM_DESC(id
, "ID string for " CHIP_NAME
" soundchip.");
45 module_param(enable_beep
, bool, 0444);
46 MODULE_PARM_DESC(enable_beep
, "Enable beep using PCM.");
48 static struct platform_device
*device
;
54 static int snd_pmac_probe(struct platform_device
*devptr
)
56 struct snd_card
*card
;
57 struct snd_pmac
*chip
;
61 err
= snd_card_new(&devptr
->dev
, index
, id
, THIS_MODULE
, 0, &card
);
65 if ((err
= snd_pmac_new(card
, &chip
)) < 0)
67 card
->private_data
= chip
;
69 switch (chip
->model
) {
71 strcpy(card
->driver
, "PMac Burgundy");
72 strcpy(card
->shortname
, "PowerMac Burgundy");
73 sprintf(card
->longname
, "%s (Dev %d) Sub-frame %d",
74 card
->shortname
, chip
->device_id
, chip
->subframe
);
75 if ((err
= snd_pmac_burgundy_init(chip
)) < 0)
79 strcpy(card
->driver
, "PMac DACA");
80 strcpy(card
->shortname
, "PowerMac DACA");
81 sprintf(card
->longname
, "%s (Dev %d) Sub-frame %d",
82 card
->shortname
, chip
->device_id
, chip
->subframe
);
83 if ((err
= snd_pmac_daca_init(chip
)) < 0)
88 name_ext
= chip
->model
== PMAC_TUMBLER
? "Tumbler" : "Snapper";
89 sprintf(card
->driver
, "PMac %s", name_ext
);
90 sprintf(card
->shortname
, "PowerMac %s", name_ext
);
91 sprintf(card
->longname
, "%s (Dev %d) Sub-frame %d",
92 card
->shortname
, chip
->device_id
, chip
->subframe
);
93 if ( snd_pmac_tumbler_init(chip
) < 0 || snd_pmac_tumbler_post_init() < 0)
98 name_ext
= chip
->model
== PMAC_SCREAMER
? "Screamer" : "AWACS";
99 sprintf(card
->driver
, "PMac %s", name_ext
);
100 sprintf(card
->shortname
, "PowerMac %s", name_ext
);
101 if (chip
->is_pbook_3400
)
102 name_ext
= " [PB3400]";
103 else if (chip
->is_pbook_G3
)
104 name_ext
= " [PBG3]";
107 sprintf(card
->longname
, "%s%s Rev %d",
108 card
->shortname
, name_ext
, chip
->revision
);
109 if ((err
= snd_pmac_awacs_init(chip
)) < 0)
113 snd_printk(KERN_ERR
"unsupported hardware %d\n", chip
->model
);
118 if ((err
= snd_pmac_pcm_new(chip
)) < 0)
121 chip
->initialized
= 1;
123 snd_pmac_attach_beep(chip
);
125 if ((err
= snd_card_register(card
)) < 0)
128 platform_set_drvdata(devptr
, card
);
137 static int snd_pmac_remove(struct platform_device
*devptr
)
139 snd_card_free(platform_get_drvdata(devptr
));
143 #ifdef CONFIG_PM_SLEEP
144 static int snd_pmac_driver_suspend(struct device
*dev
)
146 struct snd_card
*card
= dev_get_drvdata(dev
);
147 snd_pmac_suspend(card
->private_data
);
151 static int snd_pmac_driver_resume(struct device
*dev
)
153 struct snd_card
*card
= dev_get_drvdata(dev
);
154 snd_pmac_resume(card
->private_data
);
158 static SIMPLE_DEV_PM_OPS(snd_pmac_pm
, snd_pmac_driver_suspend
, snd_pmac_driver_resume
);
159 #define SND_PMAC_PM_OPS &snd_pmac_pm
161 #define SND_PMAC_PM_OPS NULL
164 #define SND_PMAC_DRIVER "snd_powermac"
166 static struct platform_driver snd_pmac_driver
= {
167 .probe
= snd_pmac_probe
,
168 .remove
= snd_pmac_remove
,
170 .name
= SND_PMAC_DRIVER
,
171 .pm
= SND_PMAC_PM_OPS
,
175 static int __init
alsa_card_pmac_init(void)
179 if ((err
= platform_driver_register(&snd_pmac_driver
)) < 0)
181 device
= platform_device_register_simple(SND_PMAC_DRIVER
, -1, NULL
, 0);
186 static void __exit
alsa_card_pmac_exit(void)
189 platform_device_unregister(device
);
190 platform_driver_unregister(&snd_pmac_driver
);
193 module_init(alsa_card_pmac_init
)
194 module_exit(alsa_card_pmac_exit
)