Blame view

sound/ppc/powermac.c 5.15 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  /*
   * Driver for PowerMac AWACS
   * Copyright (c) 2001 by Takashi Iwai <tiwai@suse.de>
   *   based on dmasound.c.
   *
   *   This program is free software; you can redistribute it and/or modify
   *   it under the terms of the GNU General Public License as published by
   *   the Free Software Foundation; either version 2 of the License, or
   *   (at your option) any later version.
   *
   *   This program is distributed in the hope that it will be useful,
   *   but WITHOUT ANY WARRANTY; without even the implied warranty of
   *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   *   GNU General Public License for more details.
   *
   *   You should have received a copy of the GNU General Public License
   *   along with this program; if not, write to the Free Software
   *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20
  #include <linux/init.h>
5e12bea08   Takashi Iwai   [ALSA] powermac -...
21
22
  #include <linux/err.h>
  #include <linux/platform_device.h>
65a772172   Paul Gortmaker   sound: fix driver...
23
  #include <linux/module.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
25
26
27
28
29
30
31
32
33
34
35
36
37
  #include <sound/core.h>
  #include <sound/initval.h>
  #include "pmac.h"
  #include "awacs.h"
  #include "burgundy.h"
  
  #define CHIP_NAME "PMac"
  
  MODULE_DESCRIPTION("PowerMac");
  MODULE_SUPPORTED_DEVICE("{{Apple,PowerMac}}");
  MODULE_LICENSE("GPL");
  
  static int index = SNDRV_DEFAULT_IDX1;		/* Index 0-MAX */
  static char *id = SNDRV_DEFAULT_STR1;		/* ID for this card */
a67ff6a54   Rusty Russell   ALSA: module_para...
38
  static bool enable_beep = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
40
41
42
43
44
45
  
  module_param(index, int, 0444);
  MODULE_PARM_DESC(index, "Index value for " CHIP_NAME " soundchip.");
  module_param(id, charp, 0444);
  MODULE_PARM_DESC(id, "ID string for " CHIP_NAME " soundchip.");
  module_param(enable_beep, bool, 0444);
  MODULE_PARM_DESC(enable_beep, "Enable beep using PCM.");
f7a9275d9   Clemens Ladisch   [ALSA] unregister...
46
  static struct platform_device *device;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
48
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
   */
7d2ac1036   Uwe Kleine-König   ALSA: move snd_po...
50
  static int __devinit snd_pmac_probe(struct platform_device *devptr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
  {
65b29f503   Takashi Iwai   [ALSA] Remove xxx...
52
53
  	struct snd_card *card;
  	struct snd_pmac *chip;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
55
  	char *name_ext;
  	int err;
bd7dd77c2   Takashi Iwai   ALSA: Convert to ...
56
57
58
  	err = snd_card_create(index, id, THIS_MODULE, 0, &card);
  	if (err < 0)
  		return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
60
61
  
  	if ((err = snd_pmac_new(card, &chip)) < 0)
  		goto __error;
5e12bea08   Takashi Iwai   [ALSA] powermac -...
62
  	card->private_data = chip;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
  
  	switch (chip->model) {
  	case PMAC_BURGUNDY:
  		strcpy(card->driver, "PMac Burgundy");
  		strcpy(card->shortname, "PowerMac Burgundy");
  		sprintf(card->longname, "%s (Dev %d) Sub-frame %d",
  			card->shortname, chip->device_id, chip->subframe);
  		if ((err = snd_pmac_burgundy_init(chip)) < 0)
  			goto __error;
  		break;
  	case PMAC_DACA:
  		strcpy(card->driver, "PMac DACA");
  		strcpy(card->shortname, "PowerMac DACA");
  		sprintf(card->longname, "%s (Dev %d) Sub-frame %d",
  			card->shortname, chip->device_id, chip->subframe);
  		if ((err = snd_pmac_daca_init(chip)) < 0)
  			goto __error;
  		break;
  	case PMAC_TUMBLER:
  	case PMAC_SNAPPER:
  		name_ext = chip->model == PMAC_TUMBLER ? "Tumbler" : "Snapper";
  		sprintf(card->driver, "PMac %s", name_ext);
  		sprintf(card->shortname, "PowerMac %s", name_ext);
  		sprintf(card->longname, "%s (Dev %d) Sub-frame %d",
  			card->shortname, chip->device_id, chip->subframe);
  		if ( snd_pmac_tumbler_init(chip) < 0 || snd_pmac_tumbler_post_init() < 0)
  			goto __error;
  		break;
  	case PMAC_AWACS:
  	case PMAC_SCREAMER:
  		name_ext = chip->model == PMAC_SCREAMER ? "Screamer" : "AWACS";
  		sprintf(card->driver, "PMac %s", name_ext);
  		sprintf(card->shortname, "PowerMac %s", name_ext);
  		if (chip->is_pbook_3400)
  			name_ext = " [PB3400]";
  		else if (chip->is_pbook_G3)
  			name_ext = " [PBG3]";
  		else
  			name_ext = "";
  		sprintf(card->longname, "%s%s Rev %d",
  			card->shortname, name_ext, chip->revision);
  		if ((err = snd_pmac_awacs_init(chip)) < 0)
  			goto __error;
  		break;
  	default:
6da671138   Takashi Iwai   ALSA: powermac - ...
108
109
  		snd_printk(KERN_ERR "unsupported hardware %d
  ", chip->model);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110
111
112
113
114
115
116
117
118
119
  		err = -EINVAL;
  		goto __error;
  	}
  
  	if ((err = snd_pmac_pcm_new(chip)) < 0)
  		goto __error;
  
  	chip->initialized = 1;
  	if (enable_beep)
  		snd_pmac_attach_beep(chip);
5e12bea08   Takashi Iwai   [ALSA] powermac -...
120
  	snd_card_set_dev(card, &devptr->dev);
16dab54b8   Takashi Iwai   [ALSA] Add snd_ca...
121

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
122
123
  	if ((err = snd_card_register(card)) < 0)
  		goto __error;
5e12bea08   Takashi Iwai   [ALSA] powermac -...
124
  	platform_set_drvdata(devptr, card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
125
126
127
128
129
130
  	return 0;
  
  __error:
  	snd_card_free(card);
  	return err;
  }
5e12bea08   Takashi Iwai   [ALSA] powermac -...
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
  static int __devexit snd_pmac_remove(struct platform_device *devptr)
  {
  	snd_card_free(platform_get_drvdata(devptr));
  	platform_set_drvdata(devptr, NULL);
  	return 0;
  }
  
  #ifdef CONFIG_PM
  static int snd_pmac_driver_suspend(struct platform_device *devptr, pm_message_t state)
  {
  	struct snd_card *card = platform_get_drvdata(devptr);
  	snd_pmac_suspend(card->private_data);
  	return 0;
  }
  
  static int snd_pmac_driver_resume(struct platform_device *devptr)
  {
  	struct snd_card *card = platform_get_drvdata(devptr);
  	snd_pmac_resume(card->private_data);
  	return 0;
  }
  #endif
  
  #define SND_PMAC_DRIVER		"snd_powermac"
  
  static struct platform_driver snd_pmac_driver = {
  	.probe		= snd_pmac_probe,
  	.remove		= __devexit_p(snd_pmac_remove),
  #ifdef CONFIG_PM
  	.suspend	= snd_pmac_driver_suspend,
  	.resume		= snd_pmac_driver_resume,
  #endif
  	.driver		= {
  		.name	= SND_PMAC_DRIVER
  	},
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
167
168
169
170
  
  static int __init alsa_card_pmac_init(void)
  {
  	int err;
5e12bea08   Takashi Iwai   [ALSA] powermac -...
171
172
  
  	if ((err = platform_driver_register(&snd_pmac_driver)) < 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
173
  		return err;
5e12bea08   Takashi Iwai   [ALSA] powermac -...
174
  	device = platform_device_register_simple(SND_PMAC_DRIVER, -1, NULL, 0);
545b07d36   Johannes Berg   [ALSA] make snd-p...
175
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
176
177
178
179
180
  
  }
  
  static void __exit alsa_card_pmac_exit(void)
  {
545b07d36   Johannes Berg   [ALSA] make snd-p...
181
182
  	if (!IS_ERR(device))
  		platform_device_unregister(device);
5e12bea08   Takashi Iwai   [ALSA] powermac -...
183
  	platform_driver_unregister(&snd_pmac_driver);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
184
185
186
187
  }
  
  module_init(alsa_card_pmac_init)
  module_exit(alsa_card_pmac_exit)