2 * linux/sound/oss/dmasound/dmasound_awacs.c
4 * PowerMac `AWACS' and `Burgundy' DMA Sound Driver
5 * with some limited support for DACA & Tumbler
7 * See linux/sound/oss/dmasound/dmasound_core.c for copyright and
8 * history prior to 2001/01/26.
10 * 26/01/2001 ed 0.1 Iain Sandoe
11 * - added version info.
12 * - moved dbdma command buffer allocation to PMacXXXSqSetup()
13 * - fixed up beep dbdma cmd buffers
16 * - make SNDCTL_DSP_GETFMTS return the correct info for the h/w
17 * - move soft format translations to a separate file
18 * - [0.3] make SNDCTL_DSP_GETCAPS return correct info.
19 * - [0.4] more informative machine name strings.
22 * - made the default_hard/soft entries.
24 * - minor correction to bit assignments in awacs_defs.h
25 * - incorporate mixer changes from 2.2.x back-port.
26 * - take out passthru as a rec input (it isn't).
27 * - make Input Gain slider work the 'right way up'.
28 * - try to make the mixer sliders more logical - so now the
29 * input selectors are just two-state (>50% == ON) and the
30 * Input Gain slider handles the rest of the gain issues.
31 * - try to pick slider representations that most closely match
32 * the actual use - e.g. IGain for input gain...
33 * - first stab at over/under-run detection.
34 * - minor cosmetic changes to IRQ identification.
35 * - fix bug where rates > max would be reported as supported.
36 * - first stab at over/under-run detection.
37 * - make use of i2c for mixer settings conditional on perch
38 * rather than cuda (some machines without perch have cuda).
39 * - fix bug where TX stops when dbdma status comes up "DEAD"
40 * so far only reported on PowerComputing clones ... but.
41 * - put in AWACS/Screamer register write timeouts.
42 * - part way to partitioning the init() stuff
43 * - first pass at 'tumbler' stuff (not support - just an attempt
44 * to allow the driver to load on new G4s).
45 * 01/02/2002 [0.7] - BenH
46 * - all sort of minor bits went in since the latest update, I
47 * bumped the version number for that reason
49 * 07/26/2002 [0.8] - BenH
50 * - More minor bits since last changelog (I should be more careful
52 * - Support for snapper & better tumbler integration by Toby Sargeant
53 * - Headphone detect for scremer by Julien Blache
54 * - More tumbler fixed by Andreas Schwab
55 * 11/29/2003 [0.8.1] - Renzo Davoli (King Enzo)
56 * - Support for Snapper line in
57 * - snapper input resampling (for rates < 44100)
58 * - software line gain control
61 /* GENERAL FIXME/TODO: check that the assumptions about what is written to
62 mac-io is valid for DACA & Tumbler.
64 This driver is in bad need of a rewrite. The dbdma code has to be split,
65 some proper device-tree parsing code has to be written, etc...
68 #include <linux/types.h>
69 #include <linux/module.h>
70 #include <linux/slab.h>
71 #include <linux/init.h>
72 #include <linux/delay.h>
73 #include <linux/soundcard.h>
74 #include <linux/adb.h>
75 #include <linux/nvram.h>
76 #include <linux/tty.h>
77 #include <linux/vt_kern.h>
78 #include <linux/spinlock.h>
79 #include <linux/kmod.h>
80 #include <linux/interrupt.h>
81 #include <linux/input.h>
82 #include <linux/mutex.h>
83 #ifdef CONFIG_ADB_CUDA
84 #include <linux/cuda.h>
87 #include <linux/pmu.h>
90 #include <asm/uaccess.h>
92 #include <asm/machdep.h>
94 #include <asm/dbdma.h>
95 #include <asm/pmac_feature.h>
97 #include <asm/nvram.h>
99 #include "awacs_defs.h"
100 #include "dmasound.h"
101 #include "tas3001c.h"
103 #include "tas_common.h"
105 #define DMASOUND_AWACS_REVISION 0
106 #define DMASOUND_AWACS_EDITION 7
108 #define AWACS_SNAPPER 110 /* fake revision # for snapper */
109 #define AWACS_BURGUNDY 100 /* fake revision # for burgundy */
110 #define AWACS_TUMBLER 90 /* fake revision # for tumbler */
111 #define AWACS_DACA 80 /* fake revision # for daca (ibook) */
112 #define AWACS_AWACS 2 /* holding revision for AWACS */
113 #define AWACS_SCREAMER 3 /* holding revision for Screamer */
115 * Interrupt numbers and addresses, & info obtained from the device tree.
117 static int awacs_irq, awacs_tx_irq, awacs_rx_irq;
118 static volatile struct awacs_regs __iomem *awacs;
119 static volatile u32 __iomem *i2s;
120 static volatile struct dbdma_regs __iomem *awacs_txdma, *awacs_rxdma;
121 static int awacs_rate_index;
122 static int awacs_subframe;
123 static struct device_node* awacs_node;
124 static struct device_node* i2s_node;
125 static struct resource awacs_rsrc[3];
127 static char awacs_name[64];
128 static int awacs_revision;
129 static int awacs_sleeping;
130 static DEFINE_MUTEX(dmasound_mutex);
132 static int sound_device_id; /* exists after iMac revA */
133 static int hw_can_byteswap = 1 ; /* most pmac sound h/w can */
136 /* To be replaced with better interaction with pmac_feature.c */
137 static int is_pbook_3X00;
138 static int is_pbook_g3;
141 static int has_perch;
144 /* for earlier powerbooks which need fiddling with mac-io to enable
147 static unsigned char __iomem *latch_base;
148 static unsigned char __iomem *macio_base;
151 * Space for the DBDMA command blocks.
153 static void *awacs_tx_cmd_space;
154 static volatile struct dbdma_cmd *awacs_tx_cmds;
155 static int number_of_tx_cmd_buffers;
157 static void *awacs_rx_cmd_space;
158 static volatile struct dbdma_cmd *awacs_rx_cmds;
159 static int number_of_rx_cmd_buffers;
162 * Cached values of AWACS registers (we can't read them).
163 * Except on the burgundy (and screamer). XXX
169 /* tracking values for the mixer contents
174 static int passthru_vol;
176 static int ip_gain; /* mic preamp settings */
177 static int rec_lev = 0x4545 ; /* default CD gain 69 % */
179 static int cd_lev = 0x6363 ; /* 99 % */
182 static int hdp_connected;
185 * Stuff for outputting a beep. The values range from -327 to +327
186 * so we can multiply by an amplitude in the range 0..100 to get a
187 * signed short value to put in the output buffer.
189 static short beep_wform[256] = {
190 0, 40, 79, 117, 153, 187, 218, 245,
191 269, 288, 304, 316, 323, 327, 327, 324,
192 318, 310, 299, 288, 275, 262, 249, 236,
193 224, 213, 204, 196, 190, 186, 183, 182,
194 182, 183, 186, 189, 192, 196, 200, 203,
195 206, 208, 209, 209, 209, 207, 204, 201,
196 197, 193, 188, 183, 179, 174, 170, 166,
197 163, 161, 160, 159, 159, 160, 161, 162,
198 164, 166, 168, 169, 171, 171, 171, 170,
199 169, 167, 163, 159, 155, 150, 144, 139,
200 133, 128, 122, 117, 113, 110, 107, 105,
201 103, 103, 103, 103, 104, 104, 105, 105,
202 105, 103, 101, 97, 92, 86, 78, 68,
203 58, 45, 32, 18, 3, -11, -26, -41,
204 -55, -68, -79, -88, -95, -100, -102, -102,
205 -99, -93, -85, -75, -62, -48, -33, -16,
206 0, 16, 33, 48, 62, 75, 85, 93,
207 99, 102, 102, 100, 95, 88, 79, 68,
208 55, 41, 26, 11, -3, -18, -32, -45,
209 -58, -68, -78, -86, -92, -97, -101, -103,
210 -105, -105, -105, -104, -104, -103, -103, -103,
211 -103, -105, -107, -110, -113, -117, -122, -128,
212 -133, -139, -144, -150, -155, -159, -163, -167,
213 -169, -170, -171, -171, -171, -169, -168, -166,
214 -164, -162, -161, -160, -159, -159, -160, -161,
215 -163, -166, -170, -174, -179, -183, -188, -193,
216 -197, -201, -204, -207, -209, -209, -209, -208,
217 -206, -203, -200, -196, -192, -189, -186, -183,
218 -182, -182, -183, -186, -190, -196, -204, -213,
219 -224, -236, -249, -262, -275, -288, -299, -310,
220 -318, -324, -327, -327, -323, -316, -304, -288,
221 -269, -245, -218, -187, -153, -117, -79, -40,
225 #define BEEP_SRATE 22050 /* 22050 Hz sample rate */
226 #define BEEP_BUFLEN 512
227 #define BEEP_VOLUME 15 /* 0 - 100 */
229 static int beep_vol = BEEP_VOLUME;
230 static int beep_playing;
231 static int awacs_beep_state;
232 static short *beep_buf;
233 static void *beep_dbdma_cmd_space;
234 static volatile struct dbdma_cmd *beep_dbdma_cmd;
236 /* Burgundy functions */
237 static void awacs_burgundy_wcw(unsigned addr,unsigned newval);
238 static unsigned awacs_burgundy_rcw(unsigned addr);
239 static void awacs_burgundy_write_volume(unsigned address, int volume);
240 static int awacs_burgundy_read_volume(unsigned address);
241 static void awacs_burgundy_write_mvolume(unsigned address, int volume);
242 static int awacs_burgundy_read_mvolume(unsigned address);
244 /* we will allocate a single 'emergency' dbdma cmd block to use if the
245 tx status comes up "DEAD". This happens on some PowerComputing Pmac
246 clones, either owing to a bug in dbdma or some interaction between
247 IDE and sound. However, this measure would deal with DEAD status if
248 if appeared elsewhere.
250 for the sake of memory efficiency we'll allocate this cmd as part of
254 static volatile struct dbdma_cmd *emergency_dbdma_cmd;
258 * Stuff for restoring after a sleep.
260 static void awacs_sleep_notify(struct pmu_sleep_notifier *self, int when);
261 struct pmu_sleep_notifier awacs_sleep_notifier = {
262 awacs_sleep_notify, SLEEP_LEVEL_SOUND,
264 #endif /* CONFIG_PM */
266 /* for (soft) sample rate translations */
267 int expand_bal; /* Balance factor for expanding (not volume!) */
268 int expand_read_bal; /* Balance factor for expanding reads (not volume!) */
270 /*** Low level stuff *********************************************************/
272 static void *PMacAlloc(unsigned int size, gfp_t flags);
273 static void PMacFree(void *ptr, unsigned int size);
274 static int PMacIrqInit(void);
276 static void PMacIrqCleanup(void);
278 static void PMacSilence(void);
279 static void PMacInit(void);
280 static int PMacSetFormat(int format);
281 static int PMacSetVolume(int volume);
282 static void PMacPlay(void);
283 static void PMacRecord(void);
284 static irqreturn_t pmac_awacs_tx_intr(int irq, void *devid);
285 static irqreturn_t pmac_awacs_rx_intr(int irq, void *devid);
286 static irqreturn_t pmac_awacs_intr(int irq, void *devid);
287 static void awacs_write(int val);
288 static int awacs_get_volume(int reg, int lshift);
289 static int awacs_volume_setter(int volume, int n, int mute, int lshift);
292 /*** Mid level stuff **********************************************************/
294 static int PMacMixerIoctl(u_int cmd, u_long arg);
295 static int PMacWriteSqSetup(void);
296 static int PMacReadSqSetup(void);
297 static void PMacAbortRead(void);
299 extern TRANS transAwacsNormal ;
300 extern TRANS transAwacsExpand ;
301 extern TRANS transAwacsNormalRead ;
302 extern TRANS transAwacsExpandRead ;
304 extern int daca_init(void);
305 extern void daca_cleanup(void);
306 extern int daca_set_volume(uint left_vol, uint right_vol);
307 extern void daca_get_volume(uint * left_vol, uint *right_vol);
308 extern int daca_enter_sleep(void);
309 extern int daca_leave_sleep(void);
312 if ((rc = mutex_lock_interruptible(&dmasound_mutex)) != 0) \
314 #define LOCK() mutex_lock(&dmasound_mutex);
316 #define UNLOCK() mutex_unlock(&dmasound_mutex);
318 /* We use different versions that the ones provided in dmasound.h
320 * FIXME: Use different names ;)
325 #define IOCTL_IN(arg, ret) \
326 rc = get_user(ret, (int __user *)(arg)); \
328 #define IOCTL_OUT(arg, ret) \
329 ioctl_return2((int __user *)(arg), ret)
331 static inline int ioctl_return2(int __user *addr, int value)
333 return value < 0 ? value : put_user(value, addr);
337 /*** AE - TUMBLER / SNAPPER START ************************************************/
340 int gpio_audio_reset, gpio_audio_reset_pol;
341 int gpio_amp_mute, gpio_amp_mute_pol;
342 int gpio_headphone_mute, gpio_headphone_mute_pol;
343 int gpio_headphone_detect, gpio_headphone_detect_pol;
344 int gpio_headphone_irq;
347 setup_audio_gpio(const char *name, const char* compatible, int *gpio_addr, int* gpio_pol)
349 struct device_node *np;
352 np = find_devices("gpio");
359 const char *property =
360 get_property(np,"audio-gpio",NULL);
361 if (property != 0 && strcmp(property,name) == 0)
363 } else if (compatible && device_is_compatible(np, compatible))
369 pp = get_property(np, "AAPL,address", NULL);
372 *gpio_addr = (*pp) & 0x0000ffff;
373 pp = get_property(np, "audio-gpio-active-state", NULL);
378 return irq_of_parse_and_map(np, 0);
382 write_audio_gpio(int gpio_addr, int data)
386 pmac_call_feature(PMAC_FTR_WRITE_GPIO, NULL, gpio_addr, data ? 0x05 : 0x04);
390 read_audio_gpio(int gpio_addr)
394 return ((pmac_call_feature(PMAC_FTR_READ_GPIO, NULL, gpio_addr, 0) & 0x02) !=0);
398 * Headphone interrupt via GPIO (Tumbler, Snapper, DACA)
401 headphone_intr(int irq, void *devid)
405 spin_lock_irqsave(&dmasound.lock, flags);
406 if (read_audio_gpio(gpio_headphone_detect) == gpio_headphone_detect_pol) {
407 printk(KERN_INFO "Audio jack plugged, muting speakers.\n");
408 write_audio_gpio(gpio_headphone_mute, !gpio_headphone_mute_pol);
409 write_audio_gpio(gpio_amp_mute, gpio_amp_mute_pol);
410 tas_output_device_change(sound_device_id,TAS_OUTPUT_HEADPHONES,0);
412 printk(KERN_INFO "Audio jack unplugged, enabling speakers.\n");
413 write_audio_gpio(gpio_amp_mute, !gpio_amp_mute_pol);
414 write_audio_gpio(gpio_headphone_mute, gpio_headphone_mute_pol);
415 tas_output_device_change(sound_device_id,TAS_OUTPUT_INTERNAL_SPKR,0);
417 spin_unlock_irqrestore(&dmasound.lock, flags);
422 /* Initialize tumbler */
425 tas_dmasound_init(void)
431 &gpio_audio_reset_pol);
437 setup_audio_gpio("headphone-mute",
439 &gpio_headphone_mute,
440 &gpio_headphone_mute_pol);
441 gpio_headphone_irq = setup_audio_gpio(
444 &gpio_headphone_detect,
445 &gpio_headphone_detect_pol);
446 /* Fix some broken OF entries in desktop machines */
447 if (!gpio_headphone_irq)
448 gpio_headphone_irq = setup_audio_gpio(
451 &gpio_headphone_detect,
452 &gpio_headphone_detect_pol);
454 write_audio_gpio(gpio_audio_reset, gpio_audio_reset_pol);
456 write_audio_gpio(gpio_audio_reset, !gpio_audio_reset_pol);
458 if (gpio_headphone_irq) {
459 if (request_irq(gpio_headphone_irq,headphone_intr,0,"Headphone detect",NULL) < 0) {
460 printk(KERN_ERR "tumbler: Can't request headphone interrupt\n");
461 gpio_headphone_irq = 0;
464 /* Activate headphone status interrupts */
465 val = pmac_call_feature(PMAC_FTR_READ_GPIO, NULL, gpio_headphone_detect, 0);
466 pmac_call_feature(PMAC_FTR_WRITE_GPIO, NULL, gpio_headphone_detect, val | 0x80);
468 headphone_intr(0, NULL);
471 if (!gpio_headphone_irq) {
472 /* Some machine enter this case ? */
473 printk(KERN_WARNING "tumbler: Headphone detect IRQ not found, enabling all outputs !\n");
474 write_audio_gpio(gpio_amp_mute, !gpio_amp_mute_pol);
475 write_audio_gpio(gpio_headphone_mute, !gpio_headphone_mute_pol);
482 tas_dmasound_cleanup(void)
484 if (gpio_headphone_irq)
485 free_irq(gpio_headphone_irq, NULL);
489 /* We don't support 48k yet */
490 static int tas_freqs[1] = { 44100 } ;
491 static int tas_freqs_ok[1] = { 1 } ;
493 /* don't know what to do really - just have to leave it where
498 tas_set_frame_rate(void)
501 out_le32(i2s + (I2S_REG_SERIAL_FORMAT >> 2), 0x41190000);
502 out_le32(i2s + (I2S_REG_DATAWORD_SIZES >> 2), 0x02000200);
504 dmasound.hard.speed = 44100 ;
505 awacs_rate_index = 0 ;
510 tas_mixer_ioctl(u_int cmd, u_long arg)
512 int __user *argp = (int __user *)arg;
516 rc=tas_device_ioctl(cmd, arg);
521 if ((cmd & ~0xff) == MIXER_WRITE(0) &&
522 tas_supported_mixers() & (1<<(cmd & 0xff))) {
523 rc = get_user(data, argp);
525 tas_set_mixer_level(cmd & 0xff, data);
526 tas_get_mixer_level(cmd & 0xff, &data);
527 return ioctl_return2(argp, data);
529 if ((cmd & ~0xff) == MIXER_READ(0) &&
530 tas_supported_mixers() & (1<<(cmd & 0xff))) {
531 tas_get_mixer_level(cmd & 0xff, &data);
532 return ioctl_return2(argp, data);
536 case SOUND_MIXER_READ_DEVMASK:
537 data = tas_supported_mixers() | SOUND_MASK_SPEAKER;
538 rc = IOCTL_OUT(arg, data);
540 case SOUND_MIXER_READ_STEREODEVS:
541 data = tas_stereo_mixers();
542 rc = IOCTL_OUT(arg, data);
544 case SOUND_MIXER_READ_CAPS:
545 rc = IOCTL_OUT(arg, 0);
547 case SOUND_MIXER_READ_RECMASK:
548 // XXX FIXME: find a way to check what is really available */
549 data = SOUND_MASK_LINE | SOUND_MASK_MIC;
550 rc = IOCTL_OUT(arg, data);
552 case SOUND_MIXER_READ_RECSRC:
553 if (awacs_reg[0] & MASK_MUX_AUDIN)
554 data |= SOUND_MASK_LINE;
555 if (awacs_reg[0] & MASK_MUX_MIC)
556 data |= SOUND_MASK_MIC;
557 rc = IOCTL_OUT(arg, data);
559 case SOUND_MIXER_WRITE_RECSRC:
562 rc = IOCTL_OUT(arg, data);
564 case SOUND_MIXER_WRITE_SPEAKER: /* really bell volume */
566 beep_vol = data & 0xff;
568 case SOUND_MIXER_READ_SPEAKER:
569 rc = IOCTL_OUT(arg, (beep_vol<<8) | beep_vol);
571 case SOUND_MIXER_OUTMASK:
572 case SOUND_MIXER_OUTSRC:
581 tas_init_frame_rates(unsigned int *prop, unsigned int l)
587 for (l /= sizeof(int); l > 0; --l) {
588 unsigned int r = *prop++;
589 /* Apple 'Fixed' format */
592 for (i = 0; i < 1; ++i) {
593 if (r == tas_freqs[i]) {
600 /* else we assume that all the rates are available */
604 /*** AE - TUMBLER / SNAPPER END ************************************************/
608 /*** Low level stuff *********************************************************/
611 * PCI PowerMac, with AWACS, Screamer, Burgundy, DACA or Tumbler and DBDMA.
613 static void *PMacAlloc(unsigned int size, gfp_t flags)
615 return kmalloc(size, flags);
618 static void PMacFree(void *ptr, unsigned int size)
623 static int __init PMacIrqInit(void)
626 if (request_irq(awacs_irq, pmac_awacs_intr, 0, "Built-in Sound misc", NULL))
628 if (request_irq(awacs_tx_irq, pmac_awacs_tx_intr, 0, "Built-in Sound out", NULL)
629 || request_irq(awacs_rx_irq, pmac_awacs_rx_intr, 0, "Built-in Sound in", NULL))
635 static void PMacIrqCleanup(void)
637 /* turn off input & output dma */
638 DBDMA_DO_STOP(awacs_txdma);
639 DBDMA_DO_STOP(awacs_rxdma);
642 /* disable interrupts from awacs interface */
643 out_le32(&awacs->control, in_le32(&awacs->control) & 0xfff);
645 /* Switch off the sound clock */
646 pmac_call_feature(PMAC_FTR_SOUND_CHIP_ENABLE, awacs_node, 0, 0);
647 /* Make sure proper bits are set on pismo & tipb */
648 if ((machine_is_compatible("PowerBook3,1") ||
649 machine_is_compatible("PowerBook3,2")) && awacs) {
650 awacs_reg[1] |= MASK_PAROUT0 | MASK_PAROUT1;
651 awacs_write(MASK_ADDR1 | awacs_reg[1]);
655 free_irq(awacs_irq, NULL);
656 free_irq(awacs_tx_irq, NULL);
657 free_irq(awacs_rx_irq, NULL);
663 iounmap(awacs_txdma);
664 iounmap(awacs_rxdma);
666 release_mem_region(awacs_rsrc[0].start,
667 awacs_rsrc[0].end - awacs_rsrc[0].start + 1);
668 release_mem_region(awacs_rsrc[1].start,
669 awacs_rsrc[1].end - awacs_rsrc[1].start + 1);
670 release_mem_region(awacs_rsrc[2].start,
671 awacs_rsrc[2].end - awacs_rsrc[2].start + 1);
673 kfree(awacs_tx_cmd_space);
674 kfree(awacs_rx_cmd_space);
675 kfree(beep_dbdma_cmd_space);
678 pmu_unregister_sleep_notifier(&awacs_sleep_notifier);
683 static void PMacSilence(void)
685 /* turn off output dma */
686 DBDMA_DO_STOP(awacs_txdma);
689 /* don't know what to do really - just have to leave it where
693 static int daca_set_frame_rate(void)
696 out_le32(i2s + (I2S_REG_SERIAL_FORMAT >> 2), 0x41190000);
697 out_le32(i2s + (I2S_REG_DATAWORD_SIZES >> 2), 0x02000200);
699 dmasound.hard.speed = 44100 ;
700 awacs_rate_index = 0 ;
704 static int awacs_freqs[8] = {
705 44100, 29400, 22050, 17640, 14700, 11025, 8820, 7350
707 static int awacs_freqs_ok[8] = { 1, 1, 1, 1, 1, 1, 1, 1 };
710 awacs_set_frame_rate(int desired, int catch_r)
712 int tolerance, i = 8 ;
714 * If we have a sample rate which is within catchRadius percent
715 * of the requested value, we don't have to expand the samples.
716 * Otherwise choose the next higher rate.
717 * N.B.: burgundy awacs only works at 44100 Hz.
720 tolerance = catch_r * awacs_freqs[--i] / 100;
721 if (awacs_freqs_ok[i]
722 && dmasound.soft.speed <= awacs_freqs[i] + tolerance)
725 dmasound.hard.speed = awacs_freqs[i];
726 awacs_rate_index = i;
728 out_le32(&awacs->control, MASK_IEPC | (i << 8) | 0x11 );
729 awacs_reg[1] = (awacs_reg[1] & ~MASK_SAMPLERATE) | (i << 3);
730 awacs_write(awacs_reg[1] | MASK_ADDR1);
731 return dmasound.hard.speed;
735 burgundy_set_frame_rate(void)
737 awacs_rate_index = 0 ;
738 awacs_reg[1] = (awacs_reg[1] & ~MASK_SAMPLERATE) ;
739 /* XXX disable error interrupt on burgundy for now */
740 out_le32(&awacs->control, MASK_IEPC | 0 | 0x11 | MASK_IEE);
745 set_frame_rate(int desired, int catch_r)
747 switch (awacs_revision) {
749 dmasound.hard.speed = burgundy_set_frame_rate();
753 dmasound.hard.speed = tas_set_frame_rate();
756 dmasound.hard.speed =
757 daca_set_frame_rate();
760 dmasound.hard.speed = awacs_set_frame_rate(desired,
764 return dmasound.hard.speed ;
768 awacs_recalibrate(void)
770 /* Sorry for the horrible delays... I hope to get that improved
771 * by making the whole PM process asynchronous in a future version
774 awacs_reg[1] |= MASK_CMUTE | MASK_AMUTE;
775 awacs_write(awacs_reg[1] | MASK_RECALIBRATE | MASK_ADDR1);
777 awacs_write(awacs_reg[1] | MASK_ADDR1);
780 static void PMacInit(void)
784 switch (dmasound.soft.format) {
788 dmasound.hard.format = AFMT_S16_LE;
790 dmasound.hard.format = AFMT_S16_BE;
793 dmasound.hard.format = AFMT_S16_BE;
796 dmasound.hard.stereo = 1;
797 dmasound.hard.size = 16;
799 /* set dmasound.hard.speed - on the basis of what we want (soft)
800 * and the tolerance we'll allow.
802 set_frame_rate(dmasound.soft.speed, catchRadius) ;
804 tolerance = (catchRadius * dmasound.hard.speed) / 100;
805 if (dmasound.soft.speed >= dmasound.hard.speed - tolerance) {
806 dmasound.trans_write = &transAwacsNormal;
807 dmasound.trans_read = &transAwacsNormalRead;
809 dmasound.trans_write = &transAwacsExpand;
810 dmasound.trans_read = &transAwacsExpandRead;
814 if (hw_can_byteswap && (dmasound.hard.format == AFMT_S16_LE))
815 out_le32(&awacs->byteswap, BS_VAL);
817 out_le32(&awacs->byteswap, 0);
820 expand_bal = -dmasound.soft.speed;
821 expand_read_bal = -dmasound.soft.speed;
824 static int PMacSetFormat(int format)
827 int req_format = format;
831 return dmasound.soft.format;
840 format = AFMT_S16_BE;
846 format = AFMT_U16_BE;
851 printk(KERN_ERR "dmasound: unknown format 0x%x, using AFMT_U8\n",
857 if (req_format == format) {
858 dmasound.soft.format = format;
859 dmasound.soft.size = size;
860 if (dmasound.minDev == SND_DEV_DSP) {
861 dmasound.dsp.format = format;
862 dmasound.dsp.size = size;
869 #define AWACS_VOLUME_TO_MASK(x) (15 - ((((x) - 1) * 15) / 99))
870 #define AWACS_MASK_TO_VOLUME(y) (100 - ((y) * 99 / 15))
872 static int awacs_get_volume(int reg, int lshift)
876 volume = AWACS_MASK_TO_VOLUME((reg >> lshift) & 0xf);
877 volume |= AWACS_MASK_TO_VOLUME(reg & 0xf) << 8;
881 static int awacs_volume_setter(int volume, int n, int mute, int lshift)
885 if (mute && volume == 0) {
886 r1 = awacs_reg[1] | mute;
888 r1 = awacs_reg[1] & ~mute;
889 rn = awacs_reg[n] & ~(0xf | (0xf << lshift));
890 rn |= ((AWACS_VOLUME_TO_MASK(volume & 0xff) & 0xf) << lshift);
891 rn |= AWACS_VOLUME_TO_MASK((volume >> 8) & 0xff) & 0xf;
893 awacs_write((n << 12) | rn);
894 volume = awacs_get_volume(rn, lshift);
896 if (r1 != awacs_reg[1]) {
898 awacs_write(r1 | MASK_ADDR1);
903 static int PMacSetVolume(int volume)
905 printk(KERN_WARNING "Bogus call to PMacSetVolume !\n");
909 static void awacs_setup_for_beep(int speed)
911 out_le32(&awacs->control,
912 (in_le32(&awacs->control) & ~0x1f00)
913 | ((speed > 0 ? speed : awacs_rate_index) << 8));
915 if (hw_can_byteswap && (dmasound.hard.format == AFMT_S16_LE) && speed == -1)
916 out_le32(&awacs->byteswap, BS_VAL);
918 out_le32(&awacs->byteswap, 0);
921 /* CHECK: how much of this *really* needs IRQs masked? */
922 static void __PMacPlay(void)
924 volatile struct dbdma_cmd *cp;
927 count = 300 ; /* > two cycles at the lowest sample rate */
929 /* what we want to send next */
930 next_frg = (write_sq.front + write_sq.active) % write_sq.max_count;
932 if (awacs_beep_state) {
933 /* sound takes precedence over beeps */
934 /* stop the dma channel */
935 out_le32(&awacs_txdma->control, (RUN|PAUSE|FLUSH|WAKE) << 16);
936 while ( (in_le32(&awacs_txdma->status) & RUN) && count--)
939 awacs_setup_for_beep(-1);
940 out_le32(&awacs_txdma->cmdptr,
941 virt_to_bus(&(awacs_tx_cmds[next_frg])));
944 awacs_beep_state = 0;
946 /* this won't allow more than two frags to be in the output queue at
947 once. (or one, if the max frags is 2 - because count can't exceed
950 while (write_sq.active < 2 && write_sq.active < write_sq.count) {
951 count = (write_sq.count == write_sq.active + 1) ?
952 write_sq.rear_size:write_sq.block_size ;
953 if (count < write_sq.block_size) {
954 if (!write_sq.syncing) /* last block not yet filled,*/
955 break; /* and we're not syncing or POST-ed */
957 /* pretend the block is full to force a new
958 block to be started on the next write */
959 write_sq.rear_size = write_sq.block_size ;
960 write_sq.syncing &= ~2 ; /* clear POST */
963 cp = &awacs_tx_cmds[next_frg];
964 st_le16(&cp->req_count, count);
965 st_le16(&cp->xfer_status, 0);
966 st_le16(&cp->command, OUTPUT_MORE + INTR_ALWAYS);
967 /* put a STOP at the end of the queue - but only if we have
968 space for it. This means that, if we under-run and we only
969 have two fragments, we might re-play sound from an existing
970 queued frag. I guess the solution to that is not to set two
971 frags if you are likely to under-run...
973 if (write_sq.count < write_sq.max_count) {
974 if (++next_frg >= write_sq.max_count)
975 next_frg = 0 ; /* wrap */
976 /* if we get here then we've underrun so we will stop*/
977 st_le16(&awacs_tx_cmds[next_frg].command, DBDMA_STOP);
979 /* set the dbdma controller going, if it is not already */
980 if (write_sq.active == 0)
981 out_le32(&awacs_txdma->cmdptr, virt_to_bus(cp));
982 (void)in_le32(&awacs_txdma->status);
983 out_le32(&awacs_txdma->control, ((RUN|WAKE) << 16) + (RUN|WAKE));
988 static void PMacPlay(void)
991 if (!awacs_sleeping) {
994 spin_lock_irqsave(&dmasound.lock, flags);
996 spin_unlock_irqrestore(&dmasound.lock, flags);
1001 static void PMacRecord(void)
1003 unsigned long flags;
1008 spin_lock_irqsave(&dmasound.lock, flags);
1010 /* This is all we have to do......Just start it up.
1012 out_le32(&awacs_rxdma->control, ((RUN|WAKE) << 16) + (RUN|WAKE));
1015 spin_unlock_irqrestore(&dmasound.lock, flags);
1018 /* if the TX status comes up "DEAD" - reported on some Power Computing machines
1019 we need to re-start the dbdma - but from a different physical start address
1020 and with a different transfer length. It would get very messy to do this
1021 with the normal dbdma_cmd blocks - we would have to re-write the buffer start
1022 addresses each time. So, we will keep a single dbdma_cmd block which can be
1024 When DEAD status is first reported the content of the faulted dbdma block is
1025 copied into the emergency buffer and we note that the buffer is in use.
1026 we then bump the start physical address by the amount that was successfully
1027 output before it died.
1028 On any subsequent DEAD result we just do the bump-ups (we know that we are
1029 already using the emergency dbdma_cmd).
1030 CHECK: this just tries to "do it". It is possible that we should abandon
1031 xfers when the number of residual bytes gets below a certain value - I can
1032 see that this might cause a loop-forever if too small a transfer causes
1033 DEAD status. However this is a TODO for now - we'll see what gets reported.
1034 When we get a successful transfer result with the emergency buffer we just
1035 pretend that it completed using the original dmdma_cmd and carry on. The
1036 'next_cmd' field will already point back to the original loop of blocks.
1040 pmac_awacs_tx_intr(int irq, void *devid)
1042 int i = write_sq.front;
1044 int i_nowrap = write_sq.front;
1045 volatile struct dbdma_cmd *cp;
1046 /* != 0 when we are dealing with a DEAD xfer */
1047 static int emergency_in_use;
1049 spin_lock(&dmasound.lock);
1050 while (write_sq.active > 0) { /* we expect to have done something*/
1051 if (emergency_in_use) /* we are dealing with DEAD xfer */
1052 cp = emergency_dbdma_cmd ;
1054 cp = &awacs_tx_cmds[i];
1055 stat = ld_le16(&cp->xfer_status);
1057 unsigned short req, res ;
1059 #ifdef DEBUG_DMASOUND
1060 printk("dmasound_pmac: tx-irq: xfer died - patching it up...\n") ;
1062 /* to clear DEAD status we must first clear RUN
1063 set it to quiescent to be on the safe side */
1064 (void)in_le32(&awacs_txdma->status);
1065 out_le32(&awacs_txdma->control,
1066 (RUN|PAUSE|FLUSH|WAKE) << 16);
1068 if (!emergency_in_use) { /* new problem */
1069 memcpy((void *)emergency_dbdma_cmd, (void *)cp,
1070 sizeof(struct dbdma_cmd));
1071 emergency_in_use = 1;
1072 cp = emergency_dbdma_cmd;
1074 /* now bump the values to reflect the amount
1075 we haven't yet shifted */
1076 req = ld_le16(&cp->req_count);
1077 res = ld_le16(&cp->res_count);
1078 phy = ld_le32(&cp->phy_addr);
1080 st_le16(&cp->req_count, res);
1081 st_le16(&cp->res_count, 0);
1082 st_le16(&cp->xfer_status, 0);
1083 st_le32(&cp->phy_addr, phy);
1084 st_le32(&cp->cmd_dep, virt_to_bus(&awacs_tx_cmds[(i+1)%write_sq.max_count]));
1085 st_le16(&cp->command, OUTPUT_MORE | BR_ALWAYS | INTR_ALWAYS);
1087 /* point at our patched up command block */
1088 out_le32(&awacs_txdma->cmdptr, virt_to_bus(cp));
1089 /* we must re-start the controller */
1090 (void)in_le32(&awacs_txdma->status);
1091 /* should complete clearing the DEAD status */
1092 out_le32(&awacs_txdma->control,
1093 ((RUN|WAKE) << 16) + (RUN|WAKE));
1094 break; /* this block is still going */
1096 if ((stat & ACTIVE) == 0)
1097 break; /* this frame is still going */
1098 if (emergency_in_use)
1099 emergency_in_use = 0 ; /* done that */
1103 if (++i >= write_sq.max_count)
1107 /* if we stopped and we were not sync-ing - then we under-ran */
1108 if( write_sq.syncing == 0 ){
1109 stat = in_le32(&awacs_txdma->status) ;
1110 /* we hit the dbdma_stop */
1111 if( (stat & ACTIVE) == 0 ) write_sq.xruns++ ;
1114 /* if we used some data up then wake the writer to supply some more*/
1115 if (i_nowrap != write_sq.front)
1116 WAKE_UP(write_sq.action_queue);
1119 /* but make sure we funnel what we've already got */\
1120 if (!awacs_sleeping)
1123 /* make the wake-on-empty conditional on syncing */
1124 if (!write_sq.active && (write_sq.syncing & 1))
1125 WAKE_UP(write_sq.sync_queue); /* any time we're empty */
1126 spin_unlock(&dmasound.lock);
1132 pmac_awacs_rx_intr(int irq, void *devid)
1135 /* For some reason on my PowerBook G3, I get one interrupt
1136 * when the interrupt vector is installed (like something is
1137 * pending). This happens before the dbdma is initialized by
1138 * us, so I just check the command pointer and if it is zero,
1141 if (in_le32(&awacs_rxdma->cmdptr) == 0)
1144 /* We also want to blow 'em off when shutting down.
1146 if (read_sq.active == 0)
1149 spin_lock(&dmasound.lock);
1150 /* Check multiple buffers in case we were held off from
1151 * interrupt processing for a long time. Geeze, I really hope
1152 * this doesn't happen.
1154 while ((stat=awacs_rx_cmds[read_sq.rear].xfer_status)) {
1156 /* if we got a "DEAD" status then just log it for now.
1157 and try to restart dma.
1158 TODO: figure out how best to fix it up
1161 #ifdef DEBUG_DMASOUND
1162 printk("dmasound_pmac: rx-irq: DIED - attempting resurection\n");
1164 /* to clear DEAD status we must first clear RUN
1165 set it to quiescent to be on the safe side */
1166 (void)in_le32(&awacs_txdma->status);
1167 out_le32(&awacs_txdma->control,
1168 (RUN|PAUSE|FLUSH|WAKE) << 16);
1169 awacs_rx_cmds[read_sq.rear].xfer_status = 0;
1170 awacs_rx_cmds[read_sq.rear].res_count = 0;
1172 (void)in_le32(&awacs_txdma->status);
1173 /* re-start the same block */
1174 out_le32(&awacs_rxdma->cmdptr,
1175 virt_to_bus(&awacs_rx_cmds[read_sq.rear]));
1176 /* we must re-start the controller */
1177 (void)in_le32(&awacs_rxdma->status);
1178 /* should complete clearing the DEAD status */
1179 out_le32(&awacs_rxdma->control,
1180 ((RUN|WAKE) << 16) + (RUN|WAKE));
1181 spin_unlock(&dmasound.lock);
1182 return IRQ_HANDLED; /* try this block again */
1184 /* Clear status and move on to next buffer.
1186 awacs_rx_cmds[read_sq.rear].xfer_status = 0;
1189 /* Wrap the buffer ring.
1191 if (read_sq.rear >= read_sq.max_active)
1194 /* If we have caught up to the front buffer, bump it.
1195 * This will cause weird (but not fatal) results if the
1196 * read loop is currently using this buffer. The user is
1197 * behind in this case anyway, so weird things are going
1200 if (read_sq.rear == read_sq.front) {
1202 read_sq.xruns++ ; /* we overan */
1203 if (read_sq.front >= read_sq.max_active)
1208 WAKE_UP(read_sq.action_queue);
1209 spin_unlock(&dmasound.lock);
1215 pmac_awacs_intr(int irq, void *devid)
1221 spin_lock(&dmasound.lock);
1222 ctrl = in_le32(&awacs->control);
1223 status = in_le32(&awacs->codec_stat);
1225 if (ctrl & MASK_PORTCHG) {
1226 /* tested on Screamer, should work on others too */
1227 if (awacs_revision == AWACS_SCREAMER) {
1228 if (((status & MASK_HDPCONN) >> 3) && (hdp_connected == 0)) {
1231 r1 = awacs_reg[1] | MASK_SPKMUTE;
1233 awacs_write(r1 | MASK_ADDR_MUTE);
1234 } else if (((status & MASK_HDPCONN) >> 3 == 0) && (hdp_connected == 1)) {
1237 r1 = awacs_reg[1] & ~MASK_SPKMUTE;
1239 awacs_write(r1 | MASK_ADDR_MUTE);
1243 if (ctrl & MASK_CNTLERR) {
1244 int err = (in_le32(&awacs->codec_stat) & MASK_ERRCODE) >> 16;
1245 /* CHECK: we just swallow burgundy errors at the moment..*/
1246 if (err != 0 && awacs_revision != AWACS_BURGUNDY)
1247 printk(KERN_ERR "dmasound_pmac: error %x\n", err);
1249 /* Writing 1s to the CNTLERR and PORTCHG bits clears them... */
1250 out_le32(&awacs->control, ctrl);
1251 spin_unlock(&dmasound.lock);
1256 awacs_write(int val)
1259 if (awacs_revision >= AWACS_DACA || !awacs)
1262 while ((in_le32(&awacs->codec_ctrl) & MASK_NEWECMD) && count--)
1263 udelay(1) ; /* timeout is > 2 samples at lowest rate */
1264 out_le32(&awacs->codec_ctrl, val | (awacs_subframe << 22));
1265 (void)in_le32(&awacs->byteswap);
1268 /* this is called when the beep timer expires... it will be called even
1269 if the beep has been overidden by other sound output.
1271 static void awacs_nosound(unsigned long xx)
1273 unsigned long flags;
1274 int count = 600 ; /* > four samples at lowest rate */
1276 spin_lock_irqsave(&dmasound.lock, flags);
1278 st_le16(&beep_dbdma_cmd->command, DBDMA_STOP);
1279 out_le32(&awacs_txdma->control, (RUN|PAUSE|FLUSH|WAKE) << 16);
1280 while ((in_le32(&awacs_txdma->status) & RUN) && count--)
1283 awacs_setup_for_beep(-1);
1286 spin_unlock_irqrestore(&dmasound.lock, flags);
1290 * We generate the beep with a single dbdma command that loops a buffer
1291 * forever - without generating interrupts.
1293 * So, to stop it you have to stop dma output as per awacs_nosound.
1295 static int awacs_beep_event(struct input_dev *dev, unsigned int type,
1296 unsigned int code, int hz)
1298 unsigned long flags;
1301 int period, ncycles, nsamples;
1304 static int beep_hz_cache;
1305 static int beep_nsamples_cache;
1306 static int beep_volume_cache;
1321 if (beep_buf == NULL)
1324 /* quick-hack fix for DACA, Burgundy & Tumbler */
1326 if (awacs_revision >= AWACS_DACA){
1329 for (i = 0; i < 8 && awacs_freqs[i] >= BEEP_SRATE; ++i)
1330 if (awacs_freqs_ok[i])
1332 srate = awacs_freqs[beep_speed];
1335 if (hz <= srate / BEEP_BUFLEN || hz > srate / 2) {
1336 /* cancel beep currently playing */
1341 spin_lock_irqsave(&dmasound.lock, flags);
1342 if (beep_playing || write_sq.active || beep_buf == NULL) {
1343 spin_unlock_irqrestore(&dmasound.lock, flags);
1344 return -1; /* too hard, sorry :-( */
1347 st_le16(&beep_dbdma_cmd->command, OUTPUT_MORE + BR_ALWAYS);
1348 spin_unlock_irqrestore(&dmasound.lock, flags);
1350 if (hz == beep_hz_cache && beep_vol == beep_volume_cache) {
1351 nsamples = beep_nsamples_cache;
1353 period = srate * 256 / hz; /* fixed point */
1354 ncycles = BEEP_BUFLEN * 256 / period;
1355 nsamples = (period * ncycles) >> 8;
1356 f = ncycles * 65536 / nsamples;
1359 for (i = 0; i < nsamples; ++i, p += 2) {
1360 p[0] = p[1] = beep_wform[j >> 8] * beep_vol;
1361 j = (j + f) & 0xffff;
1364 beep_volume_cache = beep_vol;
1365 beep_nsamples_cache = nsamples;
1368 st_le16(&beep_dbdma_cmd->req_count, nsamples*4);
1369 st_le16(&beep_dbdma_cmd->xfer_status, 0);
1370 st_le32(&beep_dbdma_cmd->cmd_dep, virt_to_bus(beep_dbdma_cmd));
1371 st_le32(&beep_dbdma_cmd->phy_addr, virt_to_bus(beep_buf));
1372 awacs_beep_state = 1;
1374 spin_lock_irqsave(&dmasound.lock, flags);
1375 if (beep_playing) { /* i.e. haven't been terminated already */
1377 out_le32(&awacs_txdma->control, (RUN|WAKE|FLUSH|PAUSE) << 16);
1378 while ((in_le32(&awacs_txdma->status) & RUN) && count--)
1379 udelay(1); /* timeout > 2 samples at lowest rate*/
1381 awacs_setup_for_beep(beep_speed);
1382 out_le32(&awacs_txdma->cmdptr, virt_to_bus(beep_dbdma_cmd));
1383 (void)in_le32(&awacs_txdma->status);
1384 out_le32(&awacs_txdma->control, RUN | (RUN << 16));
1386 spin_unlock_irqrestore(&dmasound.lock, flags);
1391 /* used in init and for wake-up */
1396 awacs_write(awacs_reg[0] + MASK_ADDR0);
1397 awacs_write(awacs_reg[1] + MASK_ADDR1);
1398 awacs_write(awacs_reg[2] + MASK_ADDR2);
1399 awacs_write(awacs_reg[4] + MASK_ADDR4);
1401 if (awacs_revision == AWACS_SCREAMER) {
1402 awacs_write(awacs_reg[5] + MASK_ADDR5);
1404 awacs_write(awacs_reg[6] + MASK_ADDR6);
1406 awacs_write(awacs_reg[1] + MASK_ADDR1);
1407 awacs_write(awacs_reg[7] + MASK_ADDR7);
1410 if (hw_can_byteswap && (dmasound.hard.format == AFMT_S16_LE))
1411 out_le32(&awacs->byteswap, BS_VAL);
1413 out_le32(&awacs->byteswap, 0);
1419 * Save state when going to sleep, restore it afterwards.
1421 /* FIXME: sort out disabling/re-enabling of read stuff as well */
1422 static void awacs_sleep_notify(struct pmu_sleep_notifier *self, int when)
1424 unsigned long flags;
1427 case PBOOK_SLEEP_NOW:
1430 /* Tell the rest of the driver we are now going to sleep */
1432 if (awacs_revision == AWACS_SCREAMER ||
1433 awacs_revision == AWACS_AWACS) {
1434 awacs_reg1_save = awacs_reg[1];
1435 awacs_reg[1] |= MASK_AMUTE | MASK_CMUTE;
1436 awacs_write(MASK_ADDR1 | awacs_reg[1]);
1440 /* stop rx - if going - a bit of a daft user... but */
1441 out_le32(&awacs_rxdma->control, (RUN|WAKE|FLUSH << 16));
1442 /* deny interrupts */
1444 disable_irq(awacs_irq);
1445 disable_irq(awacs_tx_irq);
1446 disable_irq(awacs_rx_irq);
1447 /* Chip specific sleep code */
1448 switch (awacs_revision) {
1451 write_audio_gpio(gpio_headphone_mute, gpio_headphone_mute_pol);
1452 write_audio_gpio(gpio_amp_mute, gpio_amp_mute_pol);
1454 write_audio_gpio(gpio_audio_reset, gpio_audio_reset_pol);
1459 case AWACS_BURGUNDY:
1461 case AWACS_SCREAMER:
1464 out_le32(&awacs->control, 0x11) ;
1467 /* Disable sound clock */
1468 pmac_call_feature(PMAC_FTR_SOUND_CHIP_ENABLE, awacs_node, 0, 0);
1469 /* According to Darwin, we do that after turning off the sound
1470 * chip clock. All this will have to be cleaned up once we properly
1471 * parse the OF sound-objects
1473 if ((machine_is_compatible("PowerBook3,1") ||
1474 machine_is_compatible("PowerBook3,2")) && awacs) {
1475 awacs_reg[1] |= MASK_PAROUT0 | MASK_PAROUT1;
1476 awacs_write(MASK_ADDR1 | awacs_reg[1]);
1481 /* Enable sound clock */
1482 pmac_call_feature(PMAC_FTR_SOUND_CHIP_ENABLE, awacs_node, 0, 1);
1483 if ((machine_is_compatible("PowerBook3,1") ||
1484 machine_is_compatible("PowerBook3,2")) && awacs) {
1486 awacs_reg[1] &= ~(MASK_PAROUT0 | MASK_PAROUT1);
1487 awacs_write(MASK_ADDR1 | awacs_reg[1]);
1491 /* restore settings */
1492 switch (awacs_revision) {
1495 write_audio_gpio(gpio_headphone_mute, gpio_headphone_mute_pol);
1496 write_audio_gpio(gpio_amp_mute, gpio_amp_mute_pol);
1497 write_audio_gpio(gpio_audio_reset, gpio_audio_reset_pol);
1499 write_audio_gpio(gpio_audio_reset, !gpio_audio_reset_pol);
1501 tas_leave_sleep(); /* Stub for now */
1502 headphone_intr(0, NULL);
1505 msleep(10); /* Check this !!! */
1507 break ; /* dont know how yet */
1508 case AWACS_BURGUNDY:
1510 case AWACS_SCREAMER:
1516 /* Recalibrate chip */
1517 if (awacs_revision == AWACS_SCREAMER && awacs)
1518 awacs_recalibrate();
1519 /* Make sure dma is stopped */
1522 enable_irq(awacs_irq);
1523 enable_irq(awacs_tx_irq);
1524 enable_irq(awacs_rx_irq);
1526 /* OK, allow ints back again */
1527 out_le32(&awacs->control, MASK_IEPC
1528 | (awacs_rate_index << 8) | 0x11
1529 | (awacs_revision < AWACS_DACA ? MASK_IEE: 0));
1531 if (macio_base && is_pbook_g3) {
1532 /* FIXME: should restore the setup we had...*/
1533 out_8(macio_base + 0x37, 3);
1534 } else if (is_pbook_3X00) {
1535 in_8(latch_base + 0x190);
1538 if (awacs_revision == AWACS_SCREAMER ||
1539 awacs_revision == AWACS_AWACS) {
1540 awacs_reg[1] = awacs_reg1_save;
1541 awacs_write(MASK_ADDR1 | awacs_reg[1]);
1544 /* Resume pending sounds. */
1545 /* we don't try to restart input... */
1546 spin_lock_irqsave(&dmasound.lock, flags);
1548 spin_unlock_irqrestore(&dmasound.lock, flags);
1552 #endif /* CONFIG_PM */
1555 /* All the burgundy functions: */
1557 /* Waits for busy flag to clear */
1559 awacs_burgundy_busy_wait(void)
1561 int count = 50; /* > 2 samples at 44k1 */
1562 while ((in_le32(&awacs->codec_ctrl) & MASK_NEWECMD) && count--)
1567 awacs_burgundy_extend_wait(void)
1569 int count = 50 ; /* > 2 samples at 44k1 */
1570 while ((!(in_le32(&awacs->codec_stat) & MASK_EXTEND)) && count--)
1573 while ((in_le32(&awacs->codec_stat) & MASK_EXTEND) && count--)
1578 awacs_burgundy_wcw(unsigned addr, unsigned val)
1580 out_le32(&awacs->codec_ctrl, addr + 0x200c00 + (val & 0xff));
1581 awacs_burgundy_busy_wait();
1582 out_le32(&awacs->codec_ctrl, addr + 0x200d00 +((val>>8) & 0xff));
1583 awacs_burgundy_busy_wait();
1584 out_le32(&awacs->codec_ctrl, addr + 0x200e00 +((val>>16) & 0xff));
1585 awacs_burgundy_busy_wait();
1586 out_le32(&awacs->codec_ctrl, addr + 0x200f00 +((val>>24) & 0xff));
1587 awacs_burgundy_busy_wait();
1591 awacs_burgundy_rcw(unsigned addr)
1594 unsigned long flags;
1596 /* should have timeouts here */
1597 spin_lock_irqsave(&dmasound.lock, flags);
1599 out_le32(&awacs->codec_ctrl, addr + 0x100000);
1600 awacs_burgundy_busy_wait();
1601 awacs_burgundy_extend_wait();
1602 val += (in_le32(&awacs->codec_stat) >> 4) & 0xff;
1604 out_le32(&awacs->codec_ctrl, addr + 0x100100);
1605 awacs_burgundy_busy_wait();
1606 awacs_burgundy_extend_wait();
1607 val += ((in_le32(&awacs->codec_stat)>>4) & 0xff) <<8;
1609 out_le32(&awacs->codec_ctrl, addr + 0x100200);
1610 awacs_burgundy_busy_wait();
1611 awacs_burgundy_extend_wait();
1612 val += ((in_le32(&awacs->codec_stat)>>4) & 0xff) <<16;
1614 out_le32(&awacs->codec_ctrl, addr + 0x100300);
1615 awacs_burgundy_busy_wait();
1616 awacs_burgundy_extend_wait();
1617 val += ((in_le32(&awacs->codec_stat)>>4) & 0xff) <<24;
1619 spin_unlock_irqrestore(&dmasound.lock, flags);
1626 awacs_burgundy_wcb(unsigned addr, unsigned val)
1628 out_le32(&awacs->codec_ctrl, addr + 0x300000 + (val & 0xff));
1629 awacs_burgundy_busy_wait();
1633 awacs_burgundy_rcb(unsigned addr)
1636 unsigned long flags;
1638 /* should have timeouts here */
1639 spin_lock_irqsave(&dmasound.lock, flags);
1641 out_le32(&awacs->codec_ctrl, addr + 0x100000);
1642 awacs_burgundy_busy_wait();
1643 awacs_burgundy_extend_wait();
1644 val += (in_le32(&awacs->codec_stat) >> 4) & 0xff;
1646 spin_unlock_irqrestore(&dmasound.lock, flags);
1652 awacs_burgundy_check(void)
1654 /* Checks to see the chip is alive and kicking */
1655 int error = in_le32(&awacs->codec_ctrl) & MASK_ERRCODE;
1657 return error == 0xf0000;
1661 awacs_burgundy_init(void)
1663 if (awacs_burgundy_check()) {
1664 printk(KERN_WARNING "dmasound_pmac: burgundy not working :-(\n");
1668 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_OUTPUTENABLES,
1669 DEF_BURGUNDY_OUTPUTENABLES);
1670 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES,
1671 DEF_BURGUNDY_MORE_OUTPUTENABLES);
1672 awacs_burgundy_wcw(MASK_ADDR_BURGUNDY_OUTPUTSELECTS,
1673 DEF_BURGUNDY_OUTPUTSELECTS);
1675 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_INPSEL21,
1676 DEF_BURGUNDY_INPSEL21);
1677 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_INPSEL3,
1678 DEF_BURGUNDY_INPSEL3);
1679 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_GAINCD,
1680 DEF_BURGUNDY_GAINCD);
1681 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_GAINLINE,
1682 DEF_BURGUNDY_GAINLINE);
1683 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_GAINMIC,
1684 DEF_BURGUNDY_GAINMIC);
1685 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_GAINMODEM,
1686 DEF_BURGUNDY_GAINMODEM);
1688 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_ATTENSPEAKER,
1689 DEF_BURGUNDY_ATTENSPEAKER);
1690 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_ATTENLINEOUT,
1691 DEF_BURGUNDY_ATTENLINEOUT);
1692 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_ATTENHP,
1693 DEF_BURGUNDY_ATTENHP);
1695 awacs_burgundy_wcw(MASK_ADDR_BURGUNDY_MASTER_VOLUME,
1696 DEF_BURGUNDY_MASTER_VOLUME);
1697 awacs_burgundy_wcw(MASK_ADDR_BURGUNDY_VOLCD,
1698 DEF_BURGUNDY_VOLCD);
1699 awacs_burgundy_wcw(MASK_ADDR_BURGUNDY_VOLLINE,
1700 DEF_BURGUNDY_VOLLINE);
1701 awacs_burgundy_wcw(MASK_ADDR_BURGUNDY_VOLMIC,
1702 DEF_BURGUNDY_VOLMIC);
1707 awacs_burgundy_write_volume(unsigned address, int volume)
1709 int hardvolume,lvolume,rvolume;
1711 lvolume = (volume & 0xff) ? (volume & 0xff) + 155 : 0;
1712 rvolume = ((volume >>8)&0xff) ? ((volume >> 8)&0xff ) + 155 : 0;
1714 hardvolume = lvolume + (rvolume << 16);
1716 awacs_burgundy_wcw(address, hardvolume);
1720 awacs_burgundy_read_volume(unsigned address)
1722 int softvolume,wvolume;
1724 wvolume = awacs_burgundy_rcw(address);
1726 softvolume = (wvolume & 0xff) - 155;
1727 softvolume += (((wvolume >> 16) & 0xff) - 155)<<8;
1729 return softvolume > 0 ? softvolume : 0;
1733 awacs_burgundy_read_mvolume(unsigned address)
1735 int lvolume,rvolume,wvolume;
1737 wvolume = awacs_burgundy_rcw(address);
1741 rvolume = (wvolume & 0xff) - 155;
1742 lvolume = ((wvolume & 0xff00)>>8) - 155;
1744 return lvolume + (rvolume << 8);
1748 awacs_burgundy_write_mvolume(unsigned address, int volume)
1750 int lvolume,rvolume,hardvolume;
1752 lvolume = (volume &0xff) ? (volume & 0xff) + 155 :0;
1753 rvolume = ((volume >>8) & 0xff) ? (volume >> 8) + 155 :0;
1755 hardvolume = lvolume + (rvolume << 8);
1756 hardvolume += (hardvolume << 16);
1758 awacs_burgundy_wcw(address, hardvolume);
1761 /* End burgundy functions */
1763 /* Set up output volumes on machines with the 'perch/whisper' extension card.
1764 * this has an SGS i2c chip (7433) which is accessed using the cuda.
1766 * TODO: split this out and make use of the other parts of the SGS chip to
1767 * do Bass, Treble etc.
1771 awacs_enable_amp(int spkr_vol)
1773 #ifdef CONFIG_ADB_CUDA
1774 struct adb_request req;
1776 if (sys_ctrler != SYS_CTRLER_CUDA)
1779 /* turn on headphones */
1780 cuda_request(&req, NULL, 5, CUDA_PACKET, CUDA_GET_SET_IIC,
1782 while (!req.complete) cuda_poll();
1783 cuda_request(&req, NULL, 5, CUDA_PACKET, CUDA_GET_SET_IIC,
1785 while (!req.complete) cuda_poll();
1787 /* turn on speaker */
1788 cuda_request(&req, NULL, 5, CUDA_PACKET, CUDA_GET_SET_IIC,
1789 0x8a, 3, (100 - (spkr_vol & 0xff)) * 32 / 100);
1790 while (!req.complete) cuda_poll();
1791 cuda_request(&req, NULL, 5, CUDA_PACKET, CUDA_GET_SET_IIC,
1792 0x8a, 5, (100 - ((spkr_vol >> 8) & 0xff)) * 32 / 100);
1793 while (!req.complete) cuda_poll();
1795 cuda_request(&req, NULL, 5, CUDA_PACKET,
1796 CUDA_GET_SET_IIC, 0x8a, 1, 0x29);
1797 while (!req.complete) cuda_poll();
1798 #endif /* CONFIG_ADB_CUDA */
1802 /*** Mid level stuff *********************************************************/
1806 * /dev/mixer abstraction
1809 static void do_line_lev(int data)
1812 awacs_reg[0] &= ~MASK_MUX_AUDIN;
1813 if ((data & 0xff) >= 50)
1814 awacs_reg[0] |= MASK_MUX_AUDIN;
1815 awacs_write(MASK_ADDR0 | awacs_reg[0]);
1818 static void do_ip_gain(int data)
1822 awacs_reg[0] &= ~MASK_GAINLINE;
1823 if (awacs_revision == AWACS_SCREAMER) {
1824 awacs_reg[6] &= ~MASK_MIC_BOOST ;
1826 awacs_reg[0] |= MASK_GAINLINE;
1828 awacs_reg[6] |= MASK_MIC_BOOST ;
1830 awacs_write(MASK_ADDR6 | awacs_reg[6]) ;
1833 awacs_reg[0] |= MASK_GAINLINE;
1835 awacs_write(MASK_ADDR0 | awacs_reg[0]);
1838 static void do_mic_lev(int data)
1842 awacs_reg[0] &= ~MASK_MUX_MIC;
1844 awacs_reg[0] |= MASK_MUX_MIC;
1845 awacs_write(MASK_ADDR0 | awacs_reg[0]);
1848 static void do_cd_lev(int data)
1851 awacs_reg[0] &= ~MASK_MUX_CD;
1852 if ((data & 0xff) >= 50)
1853 awacs_reg[0] |= MASK_MUX_CD;
1854 awacs_write(MASK_ADDR0 | awacs_reg[0]);
1857 static void do_rec_lev(int data)
1861 /* need to fudge this to use the volume setter routine */
1862 left = 100 - (data & 0xff) ; if( left < 0 ) left = 0 ;
1863 right = 100 - ((data >> 8) & 0xff) ; if( right < 0 ) right = 0 ;
1864 left |= (right << 8 );
1865 left = awacs_volume_setter(left, 0, 0, 4);
1868 static void do_passthru_vol(int data)
1870 passthru_vol = data ;
1871 awacs_reg[1] &= ~MASK_LOOPTHRU;
1872 if (awacs_revision == AWACS_SCREAMER) {
1873 if( data ) { /* switch it on for non-zero */
1874 awacs_reg[1] |= MASK_LOOPTHRU;
1875 awacs_write(MASK_ADDR1 | awacs_reg[1]);
1877 data = awacs_volume_setter(data, 5, 0, 6) ;
1879 if ((data & 0xff) >= 50)
1880 awacs_reg[1] |= MASK_LOOPTHRU;
1881 awacs_write(MASK_ADDR1 | awacs_reg[1]);
1882 data = (awacs_reg[1] & MASK_LOOPTHRU)? 100: 0;
1886 static int awacs_mixer_ioctl(u_int cmd, u_long arg)
1892 case SOUND_MIXER_READ_CAPS:
1893 /* say we will allow multiple inputs? prob. wrong
1894 so I'm switching it to single */
1895 return IOCTL_OUT(arg, 1);
1896 case SOUND_MIXER_READ_DEVMASK:
1897 data = SOUND_MASK_VOLUME | SOUND_MASK_SPEAKER
1898 | SOUND_MASK_LINE | SOUND_MASK_MIC | SOUND_MASK_CD
1899 | SOUND_MASK_IGAIN | SOUND_MASK_RECLEV
1901 | SOUND_MASK_MONITOR;
1902 rc = IOCTL_OUT(arg, data);
1904 case SOUND_MIXER_READ_RECMASK:
1905 data = SOUND_MASK_LINE | SOUND_MASK_MIC | SOUND_MASK_CD;
1906 rc = IOCTL_OUT(arg, data);
1908 case SOUND_MIXER_READ_RECSRC:
1910 if (awacs_reg[0] & MASK_MUX_AUDIN)
1911 data |= SOUND_MASK_LINE;
1912 if (awacs_reg[0] & MASK_MUX_MIC)
1913 data |= SOUND_MASK_MIC;
1914 if (awacs_reg[0] & MASK_MUX_CD)
1915 data |= SOUND_MASK_CD;
1916 rc = IOCTL_OUT(arg, data);
1918 case SOUND_MIXER_WRITE_RECSRC:
1919 IOCTL_IN(arg, data);
1920 data &= (SOUND_MASK_LINE | SOUND_MASK_MIC | SOUND_MASK_CD);
1921 awacs_reg[0] &= ~(MASK_MUX_CD | MASK_MUX_MIC
1923 if (data & SOUND_MASK_LINE)
1924 awacs_reg[0] |= MASK_MUX_AUDIN;
1925 if (data & SOUND_MASK_MIC)
1926 awacs_reg[0] |= MASK_MUX_MIC;
1927 if (data & SOUND_MASK_CD)
1928 awacs_reg[0] |= MASK_MUX_CD;
1929 awacs_write(awacs_reg[0] | MASK_ADDR0);
1930 rc = IOCTL_OUT(arg, data);
1932 case SOUND_MIXER_READ_STEREODEVS:
1933 data = SOUND_MASK_VOLUME | SOUND_MASK_SPEAKER| SOUND_MASK_RECLEV ;
1934 if (awacs_revision == AWACS_SCREAMER)
1935 data |= SOUND_MASK_MONITOR ;
1936 rc = IOCTL_OUT(arg, data);
1938 case SOUND_MIXER_WRITE_VOLUME:
1939 IOCTL_IN(arg, data);
1941 awacs_volume_setter(data, 2, 0, 6);
1943 case SOUND_MIXER_READ_VOLUME:
1944 rc = IOCTL_OUT(arg, line_vol);
1946 case SOUND_MIXER_WRITE_SPEAKER:
1947 IOCTL_IN(arg, data);
1950 awacs_enable_amp(data);
1952 (void)awacs_volume_setter(data, 4, MASK_CMUTE, 6);
1954 case SOUND_MIXER_READ_SPEAKER:
1955 rc = IOCTL_OUT(arg, spk_vol);
1957 case SOUND_MIXER_WRITE_ALTPCM: /* really bell volume */
1958 IOCTL_IN(arg, data);
1959 beep_vol = data & 0xff;
1961 case SOUND_MIXER_READ_ALTPCM:
1962 rc = IOCTL_OUT(arg, beep_vol);
1964 case SOUND_MIXER_WRITE_LINE:
1965 IOCTL_IN(arg, data);
1968 case SOUND_MIXER_READ_LINE:
1969 rc = IOCTL_OUT(arg, line_lev);
1971 case SOUND_MIXER_WRITE_IGAIN:
1972 IOCTL_IN(arg, data);
1975 case SOUND_MIXER_READ_IGAIN:
1976 rc = IOCTL_OUT(arg, ip_gain);
1978 case SOUND_MIXER_WRITE_MIC:
1979 IOCTL_IN(arg, data);
1982 case SOUND_MIXER_READ_MIC:
1983 rc = IOCTL_OUT(arg, mic_lev);
1985 case SOUND_MIXER_WRITE_CD:
1986 IOCTL_IN(arg, data);
1989 case SOUND_MIXER_READ_CD:
1990 rc = IOCTL_OUT(arg, cd_lev);
1992 case SOUND_MIXER_WRITE_RECLEV:
1993 IOCTL_IN(arg, data);
1996 case SOUND_MIXER_READ_RECLEV:
1997 rc = IOCTL_OUT(arg, rec_lev);
1999 case MIXER_WRITE(SOUND_MIXER_MONITOR):
2000 IOCTL_IN(arg, data);
2001 do_passthru_vol(data) ;
2003 case MIXER_READ(SOUND_MIXER_MONITOR):
2004 rc = IOCTL_OUT(arg, passthru_vol);
2013 static void awacs_mixer_init(void)
2015 awacs_volume_setter(line_vol, 2, 0, 6);
2017 awacs_enable_amp(spk_vol);
2019 (void)awacs_volume_setter(spk_vol, 4, MASK_CMUTE, 6);
2020 do_line_lev(line_lev) ;
2021 do_ip_gain(ip_gain) ;
2022 do_mic_lev(mic_lev) ;
2024 do_rec_lev(rec_lev) ;
2025 do_passthru_vol(passthru_vol) ;
2028 static int burgundy_mixer_ioctl(u_int cmd, u_long arg)
2033 /* We are, we are, we are... Burgundy or better */
2035 case SOUND_MIXER_READ_DEVMASK:
2036 data = SOUND_MASK_VOLUME | SOUND_MASK_CD |
2037 SOUND_MASK_LINE | SOUND_MASK_MIC |
2038 SOUND_MASK_SPEAKER | SOUND_MASK_ALTPCM;
2039 rc = IOCTL_OUT(arg, data);
2041 case SOUND_MIXER_READ_RECMASK:
2042 data = SOUND_MASK_LINE | SOUND_MASK_MIC
2044 rc = IOCTL_OUT(arg, data);
2046 case SOUND_MIXER_READ_RECSRC:
2048 if (awacs_reg[0] & MASK_MUX_AUDIN)
2049 data |= SOUND_MASK_LINE;
2050 if (awacs_reg[0] & MASK_MUX_MIC)
2051 data |= SOUND_MASK_MIC;
2052 if (awacs_reg[0] & MASK_MUX_CD)
2053 data |= SOUND_MASK_CD;
2054 rc = IOCTL_OUT(arg, data);
2056 case SOUND_MIXER_WRITE_RECSRC:
2057 IOCTL_IN(arg, data);
2058 data &= (SOUND_MASK_LINE
2059 | SOUND_MASK_MIC | SOUND_MASK_CD);
2060 awacs_reg[0] &= ~(MASK_MUX_CD | MASK_MUX_MIC
2062 if (data & SOUND_MASK_LINE)
2063 awacs_reg[0] |= MASK_MUX_AUDIN;
2064 if (data & SOUND_MASK_MIC)
2065 awacs_reg[0] |= MASK_MUX_MIC;
2066 if (data & SOUND_MASK_CD)
2067 awacs_reg[0] |= MASK_MUX_CD;
2068 awacs_write(awacs_reg[0] | MASK_ADDR0);
2069 rc = IOCTL_OUT(arg, data);
2071 case SOUND_MIXER_READ_STEREODEVS:
2072 data = SOUND_MASK_VOLUME | SOUND_MASK_SPEAKER
2073 | SOUND_MASK_RECLEV | SOUND_MASK_CD
2075 rc = IOCTL_OUT(arg, data);
2077 case SOUND_MIXER_READ_CAPS:
2078 rc = IOCTL_OUT(arg, 0);
2080 case SOUND_MIXER_WRITE_VOLUME:
2081 IOCTL_IN(arg, data);
2082 awacs_burgundy_write_mvolume(MASK_ADDR_BURGUNDY_MASTER_VOLUME, data);
2084 case SOUND_MIXER_READ_VOLUME:
2085 rc = IOCTL_OUT(arg, awacs_burgundy_read_mvolume(MASK_ADDR_BURGUNDY_MASTER_VOLUME));
2087 case SOUND_MIXER_WRITE_SPEAKER:
2088 IOCTL_IN(arg, data);
2089 if (!(data & 0xff)) {
2090 /* Mute the left speaker */
2091 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES,
2092 awacs_burgundy_rcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES) & ~0x2);
2094 /* Unmute the left speaker */
2095 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES,
2096 awacs_burgundy_rcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES) | 0x2);
2098 if (!(data & 0xff00)) {
2099 /* Mute the right speaker */
2100 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES,
2101 awacs_burgundy_rcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES) & ~0x4);
2103 /* Unmute the right speaker */
2104 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES,
2105 awacs_burgundy_rcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES) | 0x4);
2108 data = (((data&0xff)*16)/100 > 0xf ? 0xf :
2109 (((data&0xff)*16)/100)) +
2110 ((((data>>8)*16)/100 > 0xf ? 0xf :
2111 ((((data>>8)*16)/100)))<<4);
2113 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_ATTENSPEAKER, ~data);
2115 case SOUND_MIXER_READ_SPEAKER:
2116 data = awacs_burgundy_rcb(MASK_ADDR_BURGUNDY_ATTENSPEAKER);
2117 data = (((data & 0xf)*100)/16) + ((((data>>4)*100)/16)<<8);
2118 rc = IOCTL_OUT(arg, (~data) & 0x0000ffff);
2120 case SOUND_MIXER_WRITE_ALTPCM: /* really bell volume */
2121 IOCTL_IN(arg, data);
2122 beep_vol = data & 0xff;
2124 case SOUND_MIXER_READ_ALTPCM:
2125 rc = IOCTL_OUT(arg, beep_vol);
2127 case SOUND_MIXER_WRITE_LINE:
2128 IOCTL_IN(arg, data);
2129 awacs_burgundy_write_volume(MASK_ADDR_BURGUNDY_VOLLINE, data);
2132 case SOUND_MIXER_READ_LINE:
2133 data = awacs_burgundy_read_volume(MASK_ADDR_BURGUNDY_VOLLINE);
2134 rc = IOCTL_OUT(arg, data);
2136 case SOUND_MIXER_WRITE_MIC:
2137 IOCTL_IN(arg, data);
2138 /* Mic is mono device */
2139 data = (data << 8) + (data << 24);
2140 awacs_burgundy_write_volume(MASK_ADDR_BURGUNDY_VOLMIC, data);
2142 case SOUND_MIXER_READ_MIC:
2143 data = awacs_burgundy_read_volume(MASK_ADDR_BURGUNDY_VOLMIC);
2145 rc = IOCTL_OUT(arg, data);
2147 case SOUND_MIXER_WRITE_CD:
2148 IOCTL_IN(arg, data);
2149 awacs_burgundy_write_volume(MASK_ADDR_BURGUNDY_VOLCD, data);
2151 case SOUND_MIXER_READ_CD:
2152 data = awacs_burgundy_read_volume(MASK_ADDR_BURGUNDY_VOLCD);
2153 rc = IOCTL_OUT(arg, data);
2155 case SOUND_MIXER_WRITE_RECLEV:
2156 IOCTL_IN(arg, data);
2157 data = awacs_volume_setter(data, 0, 0, 4);
2158 rc = IOCTL_OUT(arg, data);
2160 case SOUND_MIXER_READ_RECLEV:
2161 data = awacs_get_volume(awacs_reg[0], 4);
2162 rc = IOCTL_OUT(arg, data);
2164 case SOUND_MIXER_OUTMASK:
2165 case SOUND_MIXER_OUTSRC:
2173 static int daca_mixer_ioctl(u_int cmd, u_long arg)
2178 /* And the DACA's no genius either! */
2181 case SOUND_MIXER_READ_DEVMASK:
2182 data = SOUND_MASK_VOLUME;
2183 rc = IOCTL_OUT(arg, data);
2185 case SOUND_MIXER_READ_RECMASK:
2187 rc = IOCTL_OUT(arg, data);
2189 case SOUND_MIXER_READ_RECSRC:
2191 rc = IOCTL_OUT(arg, data);
2193 case SOUND_MIXER_WRITE_RECSRC:
2194 IOCTL_IN(arg, data);
2196 rc = IOCTL_OUT(arg, data);
2198 case SOUND_MIXER_READ_STEREODEVS:
2199 data = SOUND_MASK_VOLUME;
2200 rc = IOCTL_OUT(arg, data);
2202 case SOUND_MIXER_READ_CAPS:
2203 rc = IOCTL_OUT(arg, 0);
2205 case SOUND_MIXER_WRITE_VOLUME:
2206 IOCTL_IN(arg, data);
2207 daca_set_volume(data, data);
2209 case SOUND_MIXER_READ_VOLUME:
2210 daca_get_volume(& data, &data);
2211 rc = IOCTL_OUT(arg, data);
2213 case SOUND_MIXER_OUTMASK:
2214 case SOUND_MIXER_OUTSRC:
2221 static int PMacMixerIoctl(u_int cmd, u_long arg)
2225 /* Different IOCTLS for burgundy and, eventually, DACA & Tumbler */
2229 switch (awacs_revision){
2230 case AWACS_BURGUNDY:
2231 rc = burgundy_mixer_ioctl(cmd, arg);
2234 rc = daca_mixer_ioctl(cmd, arg);
2238 rc = tas_mixer_ioctl(cmd, arg);
2241 rc = awacs_mixer_ioctl(cmd, arg);
2249 static void PMacMixerInit(void)
2251 switch (awacs_revision) {
2253 printk("AE-Init tumbler mixer\n");
2256 printk("AE-Init snapper mixer\n");
2259 case AWACS_BURGUNDY:
2260 break ; /* don't know yet */
2262 case AWACS_SCREAMER:
2264 awacs_mixer_init() ;
2269 /* Write/Read sq setup functions:
2270 Check to see if we have enough (or any) dbdma cmd buffers for the
2271 user's fragment settings. If not, allocate some. If this fails we will
2272 point at the beep buffer - as an emergency provision - to stop dma tromping
2273 on some random bit of memory (if someone lets it go anyway).
2274 The command buffers are then set up to point to the fragment buffers
2275 (allocated elsewhere). We need n+1 commands the last of which holds
2276 a NOP + loop to start.
2279 static int PMacWriteSqSetup(void)
2281 int i, count = 600 ;
2282 volatile struct dbdma_cmd *cp;
2286 /* stop the controller from doing any output - if it isn't already.
2287 it _should_ be before this is called anyway */
2289 out_le32(&awacs_txdma->control, (RUN|PAUSE|FLUSH|WAKE) << 16);
2290 while ((in_le32(&awacs_txdma->status) & RUN) && count--)
2292 #ifdef DEBUG_DMASOUND
2294 printk("dmasound_pmac: write sq setup: timeout waiting for dma to stop\n");
2297 if ((write_sq.max_count + 1) > number_of_tx_cmd_buffers) {
2298 kfree(awacs_tx_cmd_space);
2299 number_of_tx_cmd_buffers = 0;
2301 /* we need nbufs + 1 (for the loop) and we should request + 1
2302 again because the DBDMA_ALIGN might pull the start up by up
2303 to sizeof(struct dbdma_cmd) - 4.
2306 awacs_tx_cmd_space = kmalloc
2307 ((write_sq.max_count + 1 + 1) * sizeof(struct dbdma_cmd),
2309 if (awacs_tx_cmd_space == NULL) {
2310 /* don't leave it dangling - nasty but better than a
2312 out_le32(&awacs_txdma->cmdptr, virt_to_bus(beep_dbdma_cmd));
2314 "dmasound_pmac: can't allocate dbdma cmd buffers"
2315 ", driver disabled\n");
2319 awacs_tx_cmds = (volatile struct dbdma_cmd *)
2320 DBDMA_ALIGN(awacs_tx_cmd_space);
2321 number_of_tx_cmd_buffers = write_sq.max_count + 1;
2325 memset((void *)cp, 0, (write_sq.max_count+1) * sizeof(struct dbdma_cmd));
2326 for (i = 0; i < write_sq.max_count; ++i, ++cp) {
2327 st_le32(&cp->phy_addr, virt_to_bus(write_sq.buffers[i]));
2329 st_le16(&cp->command, DBDMA_NOP + BR_ALWAYS);
2330 st_le32(&cp->cmd_dep, virt_to_bus(awacs_tx_cmds));
2331 /* point the controller at the command stack - ready to go */
2332 out_le32(&awacs_txdma->cmdptr, virt_to_bus(awacs_tx_cmds));
2337 static int PMacReadSqSetup(void)
2340 volatile struct dbdma_cmd *cp;
2344 /* stop the controller from doing any input - if it isn't already.
2345 it _should_ be before this is called anyway */
2347 out_le32(&awacs_rxdma->control, (RUN|PAUSE|FLUSH|WAKE) << 16);
2348 while ((in_le32(&awacs_rxdma->status) & RUN) && count--)
2350 #ifdef DEBUG_DMASOUND
2352 printk("dmasound_pmac: read sq setup: timeout waiting for dma to stop\n");
2355 if ((read_sq.max_count+1) > number_of_rx_cmd_buffers ) {
2356 kfree(awacs_rx_cmd_space);
2357 number_of_rx_cmd_buffers = 0;
2359 /* we need nbufs + 1 (for the loop) and we should request + 1 again
2360 because the DBDMA_ALIGN might pull the start up by up to
2361 sizeof(struct dbdma_cmd) - 4 (assuming kmalloc aligns 32 bits).
2364 awacs_rx_cmd_space = kmalloc
2365 ((read_sq.max_count + 1 + 1) * sizeof(struct dbdma_cmd),
2367 if (awacs_rx_cmd_space == NULL) {
2368 /* don't leave it dangling - nasty but better than a
2370 out_le32(&awacs_rxdma->cmdptr, virt_to_bus(beep_dbdma_cmd));
2372 "dmasound_pmac: can't allocate dbdma cmd buffers"
2373 ", driver disabled\n");
2377 awacs_rx_cmds = (volatile struct dbdma_cmd *)
2378 DBDMA_ALIGN(awacs_rx_cmd_space);
2379 number_of_rx_cmd_buffers = read_sq.max_count + 1 ;
2382 memset((void *)cp, 0, (read_sq.max_count+1) * sizeof(struct dbdma_cmd));
2384 /* Set dma buffers up in a loop */
2385 for (i = 0; i < read_sq.max_count; i++,cp++) {
2386 st_le32(&cp->phy_addr, virt_to_bus(read_sq.buffers[i]));
2387 st_le16(&cp->command, INPUT_MORE + INTR_ALWAYS);
2388 st_le16(&cp->req_count, read_sq.block_size);
2389 st_le16(&cp->xfer_status, 0);
2392 /* The next two lines make the thing loop around.
2394 st_le16(&cp->command, DBDMA_NOP + BR_ALWAYS);
2395 st_le32(&cp->cmd_dep, virt_to_bus(awacs_rx_cmds));
2396 /* point the controller at the command stack - ready to go */
2397 out_le32(&awacs_rxdma->cmdptr, virt_to_bus(awacs_rx_cmds));
2403 /* TODO: this needs work to guarantee that when it returns DMA has stopped
2404 but in a more elegant way than is done here....
2407 static void PMacAbortRead(void)
2410 volatile struct dbdma_cmd *cp;
2413 /* give it a chance to update the output and provide the IRQ
2417 out_le32(&awacs_rxdma->control, ((FLUSH) << 16) + FLUSH );
2420 for (i = 0; i < read_sq.max_count; i++,cp++)
2421 st_le16(&cp->command, DBDMA_STOP);
2423 * We should probably wait for the thing to stop before we
2424 * release the memory.
2427 msleep(100) ; /* give it a (small) chance to act */
2429 /* apply the sledgehammer approach - just stop it now */
2431 out_le32(&awacs_rxdma->control, (RUN|PAUSE|FLUSH|WAKE) << 16);
2435 extern char *get_afmt_string(int);
2436 static int PMacStateInfo(char *b, size_t sp)
2439 len = sprintf(b,"HW rates: ");
2440 switch (awacs_revision){
2442 case AWACS_BURGUNDY:
2443 len += sprintf(b,"44100 ") ;
2447 for (i=0; i<1; i++){
2448 if (tas_freqs_ok[i])
2449 len += sprintf(b+len,"%d ", tas_freqs[i]) ;
2453 case AWACS_SCREAMER:
2455 for (i=0; i<8; i++){
2456 if (awacs_freqs_ok[i])
2457 len += sprintf(b+len,"%d ", awacs_freqs[i]) ;
2461 len += sprintf(b+len,"s/sec\n") ;
2463 len += sprintf(b+len,"HW AFMTS: ");
2466 if (i & dmasound.mach.hardware_afmts)
2467 len += sprintf(b+len,"%s ",
2468 get_afmt_string(i & dmasound.mach.hardware_afmts));
2471 len += sprintf(b+len,"\n") ;
2476 /*** Machine definitions *****************************************************/
2478 static SETTINGS def_hard = {
2479 .format = AFMT_S16_BE,
2485 static SETTINGS def_soft = {
2486 .format = AFMT_S16_BE,
2492 static MACHINE machPMac = {
2494 .name2 = "PowerMac Built-in Sound",
2495 .owner = THIS_MODULE,
2496 .dma_alloc = PMacAlloc,
2497 .dma_free = PMacFree,
2498 .irqinit = PMacIrqInit,
2500 .irqcleanup = PMacIrqCleanup,
2503 .silence = PMacSilence,
2504 .setFormat = PMacSetFormat,
2505 .setVolume = PMacSetVolume,
2507 .record = NULL, /* default to no record */
2508 .mixer_init = PMacMixerInit,
2509 .mixer_ioctl = PMacMixerIoctl,
2510 .write_sq_setup = PMacWriteSqSetup,
2511 .read_sq_setup = PMacReadSqSetup,
2512 .state_info = PMacStateInfo,
2513 .abort_read = PMacAbortRead,
2514 .min_dsp_speed = 7350,
2515 .max_dsp_speed = 44100,
2516 .version = ((DMASOUND_AWACS_REVISION<<8) + DMASOUND_AWACS_EDITION)
2520 /*** Config & Setup **********************************************************/
2522 /* Check for pmac models that we care about in terms of special actions.
2528 /* portables/lap-tops */
2530 if (machine_is_compatible("AAPL,3400/2400") ||
2531 machine_is_compatible("AAPL,3500")) {
2534 if (machine_is_compatible("PowerBook1,1") || /* lombard */
2535 machine_is_compatible("AAPL,PowerBook1998")){ /* wallstreet */
2541 /* Get the OF node that tells us about the registers, interrupts etc. to use
2544 On most machines the sound IO OF node is the 'davbus' node. On newer pmacs
2545 with DACA (& Tumbler) the node to use is i2s-a. On much older machines i.e.
2546 before 9500 there is no davbus node and we have to use the 'awacs' property.
2548 In the latter case we signal this by setting the codec value - so that the
2549 code that looks for chip properties knows how to go about it.
2552 static struct device_node* __init
2553 get_snd_io_node(void)
2555 struct device_node *np = NULL;
2557 /* set up awacs_node for early OF which doesn't have a full set of
2558 * properties on davbus
2561 awacs_node = find_devices("awacs");
2563 awacs_revision = AWACS_AWACS;
2565 /* powermac models after 9500 (other than those which use DACA or
2566 * Tumbler) have a node called "davbus".
2568 np = find_devices("davbus");
2570 * if we didn't find a davbus device, try 'i2s-a' since
2571 * this seems to be what iBooks (& Tumbler) have.
2574 np = i2s_node = find_devices("i2s-a");
2576 /* if we didn't find this - perhaps we are on an early model
2577 * which _only_ has an 'awacs' node
2579 if (np == NULL && awacs_node)
2582 /* if we failed all these return null - this will cause the
2583 * driver to give up...
2588 /* Get the OF node that contains the info about the sound chip, inputs s-rates
2590 This node does not exist (or contains much reduced info) on earlier machines
2591 we have to deduce the info other ways for these.
2594 static struct device_node* __init
2595 get_snd_info_node(struct device_node *io)
2597 struct device_node *info;
2599 info = find_devices("sound");
2600 while (info && info->parent != io)
2605 /* Find out what type of codec we have.
2609 get_codec_type(struct device_node *info)
2611 /* already set if pre-davbus model and info will be NULL */
2612 int codec = awacs_revision ;
2615 /* must do awacs first to allow screamer to overide it */
2616 if (device_is_compatible(info, "awacs"))
2617 codec = AWACS_AWACS ;
2618 if (device_is_compatible(info, "screamer"))
2619 codec = AWACS_SCREAMER;
2620 if (device_is_compatible(info, "burgundy"))
2621 codec = AWACS_BURGUNDY ;
2622 if (device_is_compatible(info, "daca"))
2624 if (device_is_compatible(info, "tumbler"))
2625 codec = AWACS_TUMBLER;
2626 if (device_is_compatible(info, "snapper"))
2627 codec = AWACS_SNAPPER;
2632 /* find out what type, if any, of expansion card we have
2635 get_expansion_type(void)
2637 if (find_devices("perch") != NULL)
2640 if (find_devices("pb-ziva-pc") != NULL)
2642 /* need to work out how we deal with iMac SRS module */
2645 /* set up frame rates.
2646 * I suspect that these routines don't quite go about it the right way:
2647 * - where there is more than one rate - I think that the first property
2648 * value is the number of rates.
2649 * TODO: check some more device trees and modify accordingly
2650 * Set dmasound.mach.max_dsp_rate on the basis of these routines.
2654 awacs_init_frame_rates(unsigned int *prop, unsigned int l)
2659 awacs_freqs_ok[i] = 0 ;
2660 for (l /= sizeof(int); l > 0; --l) {
2661 unsigned int r = *prop++;
2662 /* Apple 'Fixed' format */
2665 for (i = 0; i < 8; ++i) {
2666 if (r == awacs_freqs[i]) {
2667 awacs_freqs_ok[i] = 1;
2673 /* else we assume that all the rates are available */
2677 burgundy_init_frame_rates(unsigned int *prop, unsigned int l)
2682 for (l /= sizeof(int); l > 0; --l) {
2683 unsigned int r = *prop++;
2684 /* Apple 'Fixed' format */
2691 #ifdef DEBUG_DMASOUND
2694 printk("dmasound_pmac: burgundy with multiple frame rates\n");
2696 printk("%d ", temp[j]) ;
2703 daca_init_frame_rates(unsigned int *prop, unsigned int l)
2708 for (l /= sizeof(int); l > 0; --l) {
2709 unsigned int r = *prop++;
2710 /* Apple 'Fixed' format */
2718 #ifdef DEBUG_DMASOUND
2721 printk("dmasound_pmac: DACA with multiple frame rates\n");
2723 printk("%d ", temp[j]) ;
2730 init_frame_rates(unsigned int *prop, unsigned int l)
2732 switch (awacs_revision) {
2735 tas_init_frame_rates(prop, l);
2738 daca_init_frame_rates(prop, l);
2740 case AWACS_BURGUNDY:
2741 burgundy_init_frame_rates(prop, l);
2744 awacs_init_frame_rates(prop, l);
2749 /* find things/machines that can't do mac-io byteswap
2753 set_hw_byteswap(struct device_node *io)
2755 struct device_node *mio ;
2756 unsigned int kl = 0 ;
2758 /* if seems that Keylargo can't byte-swap */
2760 for (mio = io->parent; mio ; mio = mio->parent) {
2761 if (strcmp(mio->name, "mac-io") == 0) {
2762 if (device_is_compatible(mio, "Keylargo"))
2767 hw_can_byteswap = !kl;
2770 /* Allocate the resources necessary for beep generation. This cannot be (quite)
2771 done statically (yet) because we cannot do virt_to_bus() on static vars when
2772 the code is loaded as a module.
2774 for the sake of saving the possibility that two allocations will incur the
2775 overhead of two pull-ups in DBDMA_ALIGN() we allocate the 'emergency' dmdma
2776 command here as well... even tho' it is not part of the beep process.
2780 __init setup_beep(void)
2782 /* Initialize beep stuff */
2783 /* want one cmd buffer for beeps, and a second one for emergencies
2784 - i.e. dbdma error conditions.
2785 ask for three to allow for pull up in DBDMA_ALIGN().
2787 beep_dbdma_cmd_space =
2788 kmalloc((2 + 1) * sizeof(struct dbdma_cmd), GFP_KERNEL);
2789 if(beep_dbdma_cmd_space == NULL) {
2790 printk(KERN_ERR "dmasound_pmac: no beep dbdma cmd space\n") ;
2793 beep_dbdma_cmd = (volatile struct dbdma_cmd *)
2794 DBDMA_ALIGN(beep_dbdma_cmd_space);
2795 /* set up emergency dbdma cmd */
2796 emergency_dbdma_cmd = beep_dbdma_cmd+1 ;
2797 beep_buf = kmalloc(BEEP_BUFLEN * 4, GFP_KERNEL);
2798 if (beep_buf == NULL) {
2799 printk(KERN_ERR "dmasound_pmac: no memory for beep buffer\n");
2800 kfree(beep_dbdma_cmd_space) ;
2806 static struct input_dev *awacs_beep_dev;
2808 int __init dmasound_awacs_init(void)
2810 struct device_node *io = NULL, *info = NULL;
2813 if (!machine_is(powermac))
2818 hw_can_byteswap = 1 ; /* most can */
2820 /* look for models we need to handle specially */
2823 /* find the OF node that tells us about the dbdma stuff
2825 io = get_snd_io_node();
2827 #ifdef DEBUG_DMASOUND
2828 printk("dmasound_pmac: couldn't find sound io OF node\n");
2833 /* find the OF node that tells us about the sound sub-system
2834 * this doesn't exist on pre-davbus machines (earlier than 9500)
2836 if (awacs_revision != AWACS_AWACS) { /* set for pre-davbus */
2837 info = get_snd_info_node(io) ;
2839 #ifdef DEBUG_DMASOUND
2840 printk("dmasound_pmac: couldn't find 'sound' OF node\n");
2846 awacs_revision = get_codec_type(info) ;
2847 if (awacs_revision == 0) {
2848 #ifdef DEBUG_DMASOUND
2849 printk("dmasound_pmac: couldn't find a Codec we can handle\n");
2851 return -ENODEV ; /* we don't know this type of h/w */
2854 /* set up perch, ziva, SRS or whatever else we have as sound
2857 get_expansion_type();
2859 /* we've now got enough information to make up the audio topology.
2860 * we will map the sound part of mac-io now so that we can probe for
2861 * other info if necessary (early AWACS we want to read chip ids)
2864 if (of_get_address(io, 2, NULL, NULL) == NULL) {
2865 /* OK - maybe we need to use the 'awacs' node (on earlier
2870 if (of_get_address(io, 2, NULL, NULL) == NULL) {
2871 printk("dmasound_pmac: can't use %s\n",
2876 printk("dmasound_pmac: can't use %s\n", io->full_name);
2879 if (of_address_to_resource(io, 0, &awacs_rsrc[0]) ||
2880 request_mem_region(awacs_rsrc[0].start,
2881 awacs_rsrc[0].end - awacs_rsrc[0].start + 1,
2883 printk(KERN_ERR "dmasound: can't request IO resource !\n");
2886 if (of_address_to_resource(io, 1, &awacs_rsrc[1]) ||
2887 request_mem_region(awacs_rsrc[1].start,
2888 awacs_rsrc[1].end - awacs_rsrc[1].start + 1,
2889 " (tx dma)") == NULL) {
2890 release_mem_region(awacs_rsrc[0].start,
2891 awacs_rsrc[0].end - awacs_rsrc[0].start + 1);
2892 printk(KERN_ERR "dmasound: can't request Tx DMA resource !\n");
2895 if (of_address_to_resource(io, 2, &awacs_rsrc[2]) ||
2896 request_mem_region(awacs_rsrc[2].start,
2897 awacs_rsrc[2].end - awacs_rsrc[2].start + 1,
2898 " (rx dma)") == NULL) {
2899 release_mem_region(awacs_rsrc[0].start,
2900 awacs_rsrc[0].end - awacs_rsrc[0].start + 1);
2901 release_mem_region(awacs_rsrc[1].start,
2902 awacs_rsrc[1].end - awacs_rsrc[1].start + 1);
2903 printk(KERN_ERR "dmasound: can't request Rx DMA resource !\n");
2907 awacs_beep_dev = input_allocate_device();
2908 if (!awacs_beep_dev) {
2909 release_mem_region(awacs_rsrc[0].start,
2910 awacs_rsrc[0].end - awacs_rsrc[0].start + 1);
2911 release_mem_region(awacs_rsrc[1].start,
2912 awacs_rsrc[1].end - awacs_rsrc[1].start + 1);
2913 release_mem_region(awacs_rsrc[2].start,
2914 awacs_rsrc[2].end - awacs_rsrc[2].start + 1);
2915 printk(KERN_ERR "dmasound: can't allocate input device !\n");
2919 awacs_beep_dev->name = "dmasound beeper";
2920 awacs_beep_dev->phys = "macio/input0";
2921 awacs_beep_dev->id.bustype = BUS_HOST;
2922 awacs_beep_dev->event = awacs_beep_event;
2923 awacs_beep_dev->sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE);
2924 awacs_beep_dev->evbit[0] = BIT(EV_SND);
2926 /* all OF versions I've seen use this value */
2928 i2s = ioremap(awacs_rsrc[0].start, 0x1000);
2930 awacs = ioremap(awacs_rsrc[0].start, 0x1000);
2931 awacs_txdma = ioremap(awacs_rsrc[1].start, 0x100);
2932 awacs_rxdma = ioremap(awacs_rsrc[2].start, 0x100);
2934 /* first of all make sure that the chip is powered up....*/
2935 pmac_call_feature(PMAC_FTR_SOUND_CHIP_ENABLE, io, 0, 1);
2936 if (awacs_revision == AWACS_SCREAMER && awacs)
2937 awacs_recalibrate();
2939 awacs_irq = irq_of_parse_and_map(io, 0);
2940 awacs_tx_irq = irq_of_parse_and_map(io, 1);
2941 awacs_rx_irq = irq_of_parse_and_map(io, 2);
2943 /* Hack for legacy crap that will be killed someday */
2946 /* if we have an awacs or screamer - probe the chip to make
2947 * sure we have the right revision.
2950 if (awacs_revision <= AWACS_SCREAMER){
2951 uint32_t temp, rev, mfg ;
2952 /* find out the awacs revision from the chip */
2953 temp = in_le32(&awacs->codec_stat);
2954 rev = (temp >> 12) & 0xf;
2955 mfg = (temp >> 8) & 0xf;
2956 #ifdef DEBUG_DMASOUND
2957 printk("dmasound_pmac: Awacs/Screamer Codec Mfct: %d Rev %d\n", mfg, rev);
2959 if (rev >= AWACS_SCREAMER)
2960 awacs_revision = AWACS_SCREAMER ;
2962 awacs_revision = rev ;
2965 dmasound.mach = machPMac;
2967 /* find out other bits & pieces from OF, these may be present
2968 only on some models ... so be careful.
2971 /* in the absence of a frame rates property we will use the defaults
2975 unsigned int *prop, l;
2977 sound_device_id = 0;
2978 /* device ID appears post g3 b&w */
2979 prop = (unsigned int *)get_property(info, "device-id", NULL);
2981 sound_device_id = *prop;
2983 /* look for a property saying what sample rates
2986 prop = (unsigned int *)get_property(info, "sample-rates", &l);
2988 prop = (unsigned int *) get_property
2989 (info, "output-frame-rates", &l);
2991 /* if it's there use it to set up frame rates */
2992 init_frame_rates(prop, l) ;
2996 out_le32(&awacs->control, 0x11); /* set everything quiesent */
2998 set_hw_byteswap(io) ; /* figure out if the h/w can do it */
3001 /* get default volume from nvram */
3002 vol = ((pmac_xpram_read( 8 ) & 7 ) << 1 );
3007 /* set up tracking values */
3008 spk_vol = vol * 100 ;
3009 spk_vol /= 7 ; /* get set value to a percentage */
3010 spk_vol |= (spk_vol << 8) ; /* equal left & right */
3011 line_vol = passthru_vol = spk_vol ;
3013 /* fill regs that are shared between AWACS & Burgundy */
3015 awacs_reg[2] = vol + (vol << 6);
3016 awacs_reg[4] = vol + (vol << 6);
3017 awacs_reg[5] = vol + (vol << 6); /* screamer has loopthru vol control */
3018 awacs_reg[6] = 0; /* maybe should be vol << 3 for PCMCIA speaker */
3021 awacs_reg[0] = MASK_MUX_CD;
3022 awacs_reg[1] = MASK_LOOPTHRU;
3024 /* FIXME: Only machines with external SRS module need MASK_PAROUT */
3025 if (has_perch || sound_device_id == 0x5
3026 || /*sound_device_id == 0x8 ||*/ sound_device_id == 0xb)
3027 awacs_reg[1] |= MASK_PAROUT0 | MASK_PAROUT1;
3029 switch (awacs_revision) {
3031 tas_register_driver(&tas3001c_hooks);
3032 tas_init(I2C_DRIVERID_TAS3001C, I2C_DRIVERNAME_TAS3001C);
3033 tas_dmasound_init();
3037 tas_register_driver(&tas3004_hooks);
3038 tas_init(I2C_DRIVERID_TAS3004,I2C_DRIVERNAME_TAS3004);
3039 tas_dmasound_init();
3045 case AWACS_BURGUNDY:
3046 awacs_burgundy_init();
3048 case AWACS_SCREAMER:
3055 /* enable/set-up external modules - when we know how */
3058 awacs_enable_amp(100 * 0x101);
3060 /* Reset dbdma channels */
3061 out_le32(&awacs_txdma->control, (RUN|PAUSE|FLUSH|WAKE|DEAD) << 16);
3062 while (in_le32(&awacs_txdma->status) & RUN)
3064 out_le32(&awacs_rxdma->control, (RUN|PAUSE|FLUSH|WAKE|DEAD) << 16);
3065 while (in_le32(&awacs_rxdma->status) & RUN)
3068 /* Initialize beep stuff */
3069 if ((res=setup_beep()))
3073 pmu_register_sleep_notifier(&awacs_sleep_notifier);
3074 #endif /* CONFIG_PM */
3076 /* Powerbooks have odd ways of enabling inputs such as
3077 an expansion-bay CD or sound from an internal modem
3078 or a PC-card modem. */
3079 if (is_pbook_3X00) {
3081 * Enable CD and PC-card sound inputs.
3082 * This is done by reading from address
3083 * f301a000, + 0x10 to enable the expansion-bay
3084 * CD sound input, + 0x80 to enable the PC-card
3085 * sound input. The 0x100 enables the SCSI bus
3088 latch_base = ioremap (0xf301a000, 0x1000);
3089 in_8(latch_base + 0x190);
3091 } else if (is_pbook_g3) {
3092 struct device_node* mio;
3094 for (mio = io->parent; mio; mio = mio->parent) {
3095 if (strcmp(mio->name, "mac-io") == 0) {
3097 if (of_address_to_resource(mio, 0, &r) == 0)
3098 macio_base = ioremap(r.start, 0x40);
3103 * Enable CD sound input.
3104 * The relevant bits for writing to this byte are 0x8f.
3105 * I haven't found out what the 0x80 bit does.
3106 * For the 0xf bits, writing 3 or 7 enables the CD
3107 * input, any other value disables it. Values
3108 * 1, 3, 5, 7 enable the microphone. Values 0, 2,
3109 * 4, 6, 8 - f enable the input from the modem.
3113 out_8(macio_base + 0x37, 3);
3116 if (hw_can_byteswap)
3117 dmasound.mach.hardware_afmts = (AFMT_S16_BE | AFMT_S16_LE) ;
3119 dmasound.mach.hardware_afmts = AFMT_S16_BE ;
3121 /* shut out chips that do output only.
3122 * may need to extend this to machines which have no inputs - even tho'
3123 * they use screamer - IIRC one of the powerbooks is like this.
3126 if (awacs_revision != AWACS_DACA) {
3127 dmasound.mach.capabilities = DSP_CAP_DUPLEX ;
3128 dmasound.mach.record = PMacRecord ;
3131 dmasound.mach.default_hard = def_hard ;
3132 dmasound.mach.default_soft = def_soft ;
3134 switch (awacs_revision) {
3135 case AWACS_BURGUNDY:
3136 sprintf(awacs_name, "PowerMac Burgundy ") ;
3139 sprintf(awacs_name, "PowerMac DACA ") ;
3142 sprintf(awacs_name, "PowerMac Tumbler ") ;
3145 sprintf(awacs_name, "PowerMac Snapper ") ;
3147 case AWACS_SCREAMER:
3148 sprintf(awacs_name, "PowerMac Screamer ") ;
3152 sprintf(awacs_name, "PowerMac AWACS rev %d ", awacs_revision) ;
3157 * XXX: we should handle errors here, but that would mean
3158 * rewriting the whole init code. later..
3160 input_register_device(awacs_beep_dev);
3162 return dmasound_init();
3165 static void __exit dmasound_awacs_cleanup(void)
3167 input_unregister_device(awacs_beep_dev);
3169 switch (awacs_revision) {
3172 tas_dmasound_cleanup();
3183 MODULE_DESCRIPTION("PowerMac built-in audio driver.");
3184 MODULE_LICENSE("GPL");
3186 module_init(dmasound_awacs_init);
3187 module_exit(dmasound_awacs_cleanup);