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/config.h>
71 #include <linux/slab.h>
72 #include <linux/init.h>
73 #include <linux/delay.h>
74 #include <linux/soundcard.h>
75 #include <linux/adb.h>
76 #include <linux/nvram.h>
77 #include <linux/tty.h>
78 #include <linux/vt_kern.h>
79 #include <linux/spinlock.h>
80 #include <linux/kmod.h>
81 #include <linux/interrupt.h>
82 #include <linux/input.h>
83 #include <asm/semaphore.h>
84 #ifdef CONFIG_ADB_CUDA
85 #include <linux/cuda.h>
88 #include <linux/pmu.h>
91 #include <linux/i2c-dev.h>
93 #include <asm/uaccess.h>
95 #include <asm/machdep.h>
97 #include <asm/dbdma.h>
98 #include <asm/pmac_feature.h>
100 #include <asm/nvram.h>
102 #include "awacs_defs.h"
103 #include "dmasound.h"
104 #include "tas3001c.h"
106 #include "tas_common.h"
108 #define DMASOUND_AWACS_REVISION 0
109 #define DMASOUND_AWACS_EDITION 7
111 #define AWACS_SNAPPER 110 /* fake revision # for snapper */
112 #define AWACS_BURGUNDY 100 /* fake revision # for burgundy */
113 #define AWACS_TUMBLER 90 /* fake revision # for tumbler */
114 #define AWACS_DACA 80 /* fake revision # for daca (ibook) */
115 #define AWACS_AWACS 2 /* holding revision for AWACS */
116 #define AWACS_SCREAMER 3 /* holding revision for Screamer */
118 * Interrupt numbers and addresses, & info obtained from the device tree.
120 static int awacs_irq
, awacs_tx_irq
, awacs_rx_irq
;
121 static volatile struct awacs_regs __iomem
*awacs
;
122 static volatile u32 __iomem
*i2s
;
123 static volatile struct dbdma_regs __iomem
*awacs_txdma
, *awacs_rxdma
;
124 static int awacs_rate_index
;
125 static int awacs_subframe
;
126 static struct device_node
* awacs_node
;
127 static struct device_node
* i2s_node
;
129 static char awacs_name
[64];
130 static int awacs_revision
;
131 static int awacs_sleeping
;
132 static DECLARE_MUTEX(dmasound_sem
);
134 static int sound_device_id
; /* exists after iMac revA */
135 static int hw_can_byteswap
= 1 ; /* most pmac sound h/w can */
138 /* To be replaced with better interaction with pmac_feature.c */
139 static int is_pbook_3X00
;
140 static int is_pbook_g3
;
143 static int has_perch
;
146 /* for earlier powerbooks which need fiddling with mac-io to enable
149 static unsigned char __iomem
*latch_base
;
150 static unsigned char __iomem
*macio_base
;
153 * Space for the DBDMA command blocks.
155 static void *awacs_tx_cmd_space
;
156 static volatile struct dbdma_cmd
*awacs_tx_cmds
;
157 static int number_of_tx_cmd_buffers
;
159 static void *awacs_rx_cmd_space
;
160 static volatile struct dbdma_cmd
*awacs_rx_cmds
;
161 static int number_of_rx_cmd_buffers
;
164 * Cached values of AWACS registers (we can't read them).
165 * Except on the burgundy (and screamer). XXX
171 /* tracking values for the mixer contents
176 static int passthru_vol
;
178 static int ip_gain
; /* mic preamp settings */
179 static int rec_lev
= 0x4545 ; /* default CD gain 69 % */
181 static int cd_lev
= 0x6363 ; /* 99 % */
184 static int hdp_connected
;
187 * Stuff for outputting a beep. The values range from -327 to +327
188 * so we can multiply by an amplitude in the range 0..100 to get a
189 * signed short value to put in the output buffer.
191 static short beep_wform
[256] = {
192 0, 40, 79, 117, 153, 187, 218, 245,
193 269, 288, 304, 316, 323, 327, 327, 324,
194 318, 310, 299, 288, 275, 262, 249, 236,
195 224, 213, 204, 196, 190, 186, 183, 182,
196 182, 183, 186, 189, 192, 196, 200, 203,
197 206, 208, 209, 209, 209, 207, 204, 201,
198 197, 193, 188, 183, 179, 174, 170, 166,
199 163, 161, 160, 159, 159, 160, 161, 162,
200 164, 166, 168, 169, 171, 171, 171, 170,
201 169, 167, 163, 159, 155, 150, 144, 139,
202 133, 128, 122, 117, 113, 110, 107, 105,
203 103, 103, 103, 103, 104, 104, 105, 105,
204 105, 103, 101, 97, 92, 86, 78, 68,
205 58, 45, 32, 18, 3, -11, -26, -41,
206 -55, -68, -79, -88, -95, -100, -102, -102,
207 -99, -93, -85, -75, -62, -48, -33, -16,
208 0, 16, 33, 48, 62, 75, 85, 93,
209 99, 102, 102, 100, 95, 88, 79, 68,
210 55, 41, 26, 11, -3, -18, -32, -45,
211 -58, -68, -78, -86, -92, -97, -101, -103,
212 -105, -105, -105, -104, -104, -103, -103, -103,
213 -103, -105, -107, -110, -113, -117, -122, -128,
214 -133, -139, -144, -150, -155, -159, -163, -167,
215 -169, -170, -171, -171, -171, -169, -168, -166,
216 -164, -162, -161, -160, -159, -159, -160, -161,
217 -163, -166, -170, -174, -179, -183, -188, -193,
218 -197, -201, -204, -207, -209, -209, -209, -208,
219 -206, -203, -200, -196, -192, -189, -186, -183,
220 -182, -182, -183, -186, -190, -196, -204, -213,
221 -224, -236, -249, -262, -275, -288, -299, -310,
222 -318, -324, -327, -327, -323, -316, -304, -288,
223 -269, -245, -218, -187, -153, -117, -79, -40,
227 #define BEEP_SRATE 22050 /* 22050 Hz sample rate */
228 #define BEEP_BUFLEN 512
229 #define BEEP_VOLUME 15 /* 0 - 100 */
231 static int beep_vol
= BEEP_VOLUME
;
232 static int beep_playing
;
233 static int awacs_beep_state
;
234 static short *beep_buf
;
235 static void *beep_dbdma_cmd_space
;
236 static volatile struct dbdma_cmd
*beep_dbdma_cmd
;
238 /* Burgundy functions */
239 static void awacs_burgundy_wcw(unsigned addr
,unsigned newval
);
240 static unsigned awacs_burgundy_rcw(unsigned addr
);
241 static void awacs_burgundy_write_volume(unsigned address
, int volume
);
242 static int awacs_burgundy_read_volume(unsigned address
);
243 static void awacs_burgundy_write_mvolume(unsigned address
, int volume
);
244 static int awacs_burgundy_read_mvolume(unsigned address
);
246 /* we will allocate a single 'emergency' dbdma cmd block to use if the
247 tx status comes up "DEAD". This happens on some PowerComputing Pmac
248 clones, either owing to a bug in dbdma or some interaction between
249 IDE and sound. However, this measure would deal with DEAD status if
250 if appeared elsewhere.
252 for the sake of memory efficiency we'll allocate this cmd as part of
256 static volatile struct dbdma_cmd
*emergency_dbdma_cmd
;
258 #ifdef CONFIG_PMAC_PBOOK
260 * Stuff for restoring after a sleep.
262 static int awacs_sleep_notify(struct pmu_sleep_notifier
*self
, int when
);
263 struct pmu_sleep_notifier awacs_sleep_notifier
= {
264 awacs_sleep_notify
, SLEEP_LEVEL_SOUND
,
266 #endif /* CONFIG_PMAC_PBOOK */
268 /* for (soft) sample rate translations */
269 int expand_bal
; /* Balance factor for expanding (not volume!) */
270 int expand_read_bal
; /* Balance factor for expanding reads (not volume!) */
272 /*** Low level stuff *********************************************************/
274 static void *PMacAlloc(unsigned int size
, int flags
);
275 static void PMacFree(void *ptr
, unsigned int size
);
276 static int PMacIrqInit(void);
278 static void PMacIrqCleanup(void);
280 static void PMacSilence(void);
281 static void PMacInit(void);
282 static int PMacSetFormat(int format
);
283 static int PMacSetVolume(int volume
);
284 static void PMacPlay(void);
285 static void PMacRecord(void);
286 static irqreturn_t
pmac_awacs_tx_intr(int irq
, void *devid
, struct pt_regs
*regs
);
287 static irqreturn_t
pmac_awacs_rx_intr(int irq
, void *devid
, struct pt_regs
*regs
);
288 static irqreturn_t
pmac_awacs_intr(int irq
, void *devid
, struct pt_regs
*regs
);
289 static void awacs_write(int val
);
290 static int awacs_get_volume(int reg
, int lshift
);
291 static int awacs_volume_setter(int volume
, int n
, int mute
, int lshift
);
294 /*** Mid level stuff **********************************************************/
296 static int PMacMixerIoctl(u_int cmd
, u_long arg
);
297 static int PMacWriteSqSetup(void);
298 static int PMacReadSqSetup(void);
299 static void PMacAbortRead(void);
301 extern TRANS transAwacsNormal
;
302 extern TRANS transAwacsExpand
;
303 extern TRANS transAwacsNormalRead
;
304 extern TRANS transAwacsExpandRead
;
306 extern int daca_init(void);
307 extern void daca_cleanup(void);
308 extern int daca_set_volume(uint left_vol
, uint right_vol
);
309 extern void daca_get_volume(uint
* left_vol
, uint
*right_vol
);
310 extern int daca_enter_sleep(void);
311 extern int daca_leave_sleep(void);
314 if ((rc = down_interruptible(&dmasound_sem)) != 0) \
316 #define LOCK() down(&dmasound_sem);
318 #define UNLOCK() up(&dmasound_sem);
320 /* We use different versions that the ones provided in dmasound.h
322 * FIXME: Use different names ;)
327 #define IOCTL_IN(arg, ret) \
328 rc = get_user(ret, (int __user *)(arg)); \
330 #define IOCTL_OUT(arg, ret) \
331 ioctl_return2((int __user *)(arg), ret)
333 static inline int ioctl_return2(int __user
*addr
, int value
)
335 return value
< 0 ? value
: put_user(value
, addr
);
339 /*** AE - TUMBLER / SNAPPER START ************************************************/
342 int gpio_audio_reset
, gpio_audio_reset_pol
;
343 int gpio_amp_mute
, gpio_amp_mute_pol
;
344 int gpio_headphone_mute
, gpio_headphone_mute_pol
;
345 int gpio_headphone_detect
, gpio_headphone_detect_pol
;
346 int gpio_headphone_irq
;
349 setup_audio_gpio(const char *name
, const char* compatible
, int *gpio_addr
, int* gpio_pol
)
351 struct device_node
*np
;
354 np
= find_devices("gpio");
361 char *property
= get_property(np
,"audio-gpio",NULL
);
362 if (property
!= 0 && strcmp(property
,name
) == 0)
364 } else if (compatible
&& device_is_compatible(np
, compatible
))
370 pp
= (u32
*)get_property(np
, "AAPL,address", NULL
);
373 *gpio_addr
= (*pp
) & 0x0000ffff;
374 pp
= (u32
*)get_property(np
, "audio-gpio-active-state", NULL
);
380 return np
->intrs
[0].line
;
386 write_audio_gpio(int gpio_addr
, int data
)
390 pmac_call_feature(PMAC_FTR_WRITE_GPIO
, NULL
, gpio_addr
, data
? 0x05 : 0x04);
394 read_audio_gpio(int gpio_addr
)
398 return ((pmac_call_feature(PMAC_FTR_READ_GPIO
, NULL
, gpio_addr
, 0) & 0x02) !=0);
402 * Headphone interrupt via GPIO (Tumbler, Snapper, DACA)
405 headphone_intr(int irq
, void *devid
, struct pt_regs
*regs
)
409 spin_lock_irqsave(&dmasound
.lock
, flags
);
410 if (read_audio_gpio(gpio_headphone_detect
) == gpio_headphone_detect_pol
) {
411 printk(KERN_INFO
"Audio jack plugged, muting speakers.\n");
412 write_audio_gpio(gpio_headphone_mute
, !gpio_headphone_mute_pol
);
413 write_audio_gpio(gpio_amp_mute
, gpio_amp_mute_pol
);
414 tas_output_device_change(sound_device_id
,TAS_OUTPUT_HEADPHONES
,0);
416 printk(KERN_INFO
"Audio jack unplugged, enabling speakers.\n");
417 write_audio_gpio(gpio_amp_mute
, !gpio_amp_mute_pol
);
418 write_audio_gpio(gpio_headphone_mute
, gpio_headphone_mute_pol
);
419 tas_output_device_change(sound_device_id
,TAS_OUTPUT_INTERNAL_SPKR
,0);
421 spin_unlock_irqrestore(&dmasound
.lock
, flags
);
426 /* Initialize tumbler */
429 tas_dmasound_init(void)
435 &gpio_audio_reset_pol
);
441 setup_audio_gpio("headphone-mute",
443 &gpio_headphone_mute
,
444 &gpio_headphone_mute_pol
);
445 gpio_headphone_irq
= setup_audio_gpio(
448 &gpio_headphone_detect
,
449 &gpio_headphone_detect_pol
);
450 /* Fix some broken OF entries in desktop machines */
451 if (!gpio_headphone_irq
)
452 gpio_headphone_irq
= setup_audio_gpio(
455 &gpio_headphone_detect
,
456 &gpio_headphone_detect_pol
);
458 write_audio_gpio(gpio_audio_reset
, gpio_audio_reset_pol
);
460 write_audio_gpio(gpio_audio_reset
, !gpio_audio_reset_pol
);
462 if (gpio_headphone_irq
) {
463 if (request_irq(gpio_headphone_irq
,headphone_intr
,0,"Headphone detect",NULL
) < 0) {
464 printk(KERN_ERR
"tumbler: Can't request headphone interrupt\n");
465 gpio_headphone_irq
= 0;
468 /* Activate headphone status interrupts */
469 val
= pmac_call_feature(PMAC_FTR_READ_GPIO
, NULL
, gpio_headphone_detect
, 0);
470 pmac_call_feature(PMAC_FTR_WRITE_GPIO
, NULL
, gpio_headphone_detect
, val
| 0x80);
472 headphone_intr(0,NULL
,NULL
);
475 if (!gpio_headphone_irq
) {
476 /* Some machine enter this case ? */
477 printk(KERN_WARNING
"tumbler: Headphone detect IRQ not found, enabling all outputs !\n");
478 write_audio_gpio(gpio_amp_mute
, !gpio_amp_mute_pol
);
479 write_audio_gpio(gpio_headphone_mute
, !gpio_headphone_mute_pol
);
486 tas_dmasound_cleanup(void)
488 if (gpio_headphone_irq
)
489 free_irq(gpio_headphone_irq
, NULL
);
493 /* We don't support 48k yet */
494 static int tas_freqs
[1] = { 44100 } ;
495 static int tas_freqs_ok
[1] = { 1 } ;
497 /* don't know what to do really - just have to leave it where
502 tas_set_frame_rate(void)
505 out_le32(i2s
+ (I2S_REG_SERIAL_FORMAT
>> 2), 0x41190000);
506 out_le32(i2s
+ (I2S_REG_DATAWORD_SIZES
>> 2), 0x02000200);
508 dmasound
.hard
.speed
= 44100 ;
509 awacs_rate_index
= 0 ;
514 tas_mixer_ioctl(u_int cmd
, u_long arg
)
516 int __user
*argp
= (int __user
*)arg
;
520 rc
=tas_device_ioctl(cmd
, arg
);
525 if ((cmd
& ~0xff) == MIXER_WRITE(0) &&
526 tas_supported_mixers() & (1<<(cmd
& 0xff))) {
527 rc
= get_user(data
, argp
);
529 tas_set_mixer_level(cmd
& 0xff, data
);
530 tas_get_mixer_level(cmd
& 0xff, &data
);
531 return ioctl_return2(argp
, data
);
533 if ((cmd
& ~0xff) == MIXER_READ(0) &&
534 tas_supported_mixers() & (1<<(cmd
& 0xff))) {
535 tas_get_mixer_level(cmd
& 0xff, &data
);
536 return ioctl_return2(argp
, data
);
540 case SOUND_MIXER_READ_DEVMASK
:
541 data
= tas_supported_mixers() | SOUND_MASK_SPEAKER
;
542 rc
= IOCTL_OUT(arg
, data
);
544 case SOUND_MIXER_READ_STEREODEVS
:
545 data
= tas_stereo_mixers();
546 rc
= IOCTL_OUT(arg
, data
);
548 case SOUND_MIXER_READ_CAPS
:
549 rc
= IOCTL_OUT(arg
, 0);
551 case SOUND_MIXER_READ_RECMASK
:
552 // XXX FIXME: find a way to check what is really available */
553 data
= SOUND_MASK_LINE
| SOUND_MASK_MIC
;
554 rc
= IOCTL_OUT(arg
, data
);
556 case SOUND_MIXER_READ_RECSRC
:
557 if (awacs_reg
[0] & MASK_MUX_AUDIN
)
558 data
|= SOUND_MASK_LINE
;
559 if (awacs_reg
[0] & MASK_MUX_MIC
)
560 data
|= SOUND_MASK_MIC
;
561 rc
= IOCTL_OUT(arg
, data
);
563 case SOUND_MIXER_WRITE_RECSRC
:
566 rc
= IOCTL_OUT(arg
, data
);
568 case SOUND_MIXER_WRITE_SPEAKER
: /* really bell volume */
570 beep_vol
= data
& 0xff;
572 case SOUND_MIXER_READ_SPEAKER
:
573 rc
= IOCTL_OUT(arg
, (beep_vol
<<8) | beep_vol
);
575 case SOUND_MIXER_OUTMASK
:
576 case SOUND_MIXER_OUTSRC
:
585 tas_init_frame_rates(unsigned int *prop
, unsigned int l
)
591 for (l
/= sizeof(int); l
> 0; --l
) {
592 unsigned int r
= *prop
++;
593 /* Apple 'Fixed' format */
596 for (i
= 0; i
< 1; ++i
) {
597 if (r
== tas_freqs
[i
]) {
604 /* else we assume that all the rates are available */
608 /*** AE - TUMBLER / SNAPPER END ************************************************/
612 /*** Low level stuff *********************************************************/
615 * PCI PowerMac, with AWACS, Screamer, Burgundy, DACA or Tumbler and DBDMA.
617 static void *PMacAlloc(unsigned int size
, int flags
)
619 return kmalloc(size
, flags
);
622 static void PMacFree(void *ptr
, unsigned int size
)
627 static int __init
PMacIrqInit(void)
630 if (request_irq(awacs_irq
, pmac_awacs_intr
, 0, "Built-in Sound misc", NULL
))
632 if (request_irq(awacs_tx_irq
, pmac_awacs_tx_intr
, 0, "Built-in Sound out", NULL
)
633 || request_irq(awacs_rx_irq
, pmac_awacs_rx_intr
, 0, "Built-in Sound in", NULL
))
639 static void PMacIrqCleanup(void)
641 /* turn off input & output dma */
642 DBDMA_DO_STOP(awacs_txdma
);
643 DBDMA_DO_STOP(awacs_rxdma
);
646 /* disable interrupts from awacs interface */
647 out_le32(&awacs
->control
, in_le32(&awacs
->control
) & 0xfff);
649 /* Switch off the sound clock */
650 pmac_call_feature(PMAC_FTR_SOUND_CHIP_ENABLE
, awacs_node
, 0, 0);
651 /* Make sure proper bits are set on pismo & tipb */
652 if ((machine_is_compatible("PowerBook3,1") ||
653 machine_is_compatible("PowerBook3,2")) && awacs
) {
654 awacs_reg
[1] |= MASK_PAROUT0
| MASK_PAROUT1
;
655 awacs_write(MASK_ADDR1
| awacs_reg
[1]);
659 free_irq(awacs_irq
, NULL
);
660 free_irq(awacs_tx_irq
, NULL
);
661 free_irq(awacs_rx_irq
, NULL
);
667 iounmap(awacs_txdma
);
668 iounmap(awacs_rxdma
);
670 release_OF_resource(awacs_node
, 0);
671 release_OF_resource(awacs_node
, 1);
672 release_OF_resource(awacs_node
, 2);
674 if (awacs_tx_cmd_space
)
675 kfree(awacs_tx_cmd_space
);
676 if (awacs_rx_cmd_space
)
677 kfree(awacs_rx_cmd_space
);
678 if (beep_dbdma_cmd_space
)
679 kfree(beep_dbdma_cmd_space
);
682 #ifdef CONFIG_PMAC_PBOOK
683 pmu_unregister_sleep_notifier(&awacs_sleep_notifier
);
688 static void PMacSilence(void)
690 /* turn off output dma */
691 DBDMA_DO_STOP(awacs_txdma
);
694 /* don't know what to do really - just have to leave it where
698 static int daca_set_frame_rate(void)
701 out_le32(i2s
+ (I2S_REG_SERIAL_FORMAT
>> 2), 0x41190000);
702 out_le32(i2s
+ (I2S_REG_DATAWORD_SIZES
>> 2), 0x02000200);
704 dmasound
.hard
.speed
= 44100 ;
705 awacs_rate_index
= 0 ;
709 static int awacs_freqs
[8] = {
710 44100, 29400, 22050, 17640, 14700, 11025, 8820, 7350
712 static int awacs_freqs_ok
[8] = { 1, 1, 1, 1, 1, 1, 1, 1 };
715 awacs_set_frame_rate(int desired
, int catch_r
)
717 int tolerance
, i
= 8 ;
719 * If we have a sample rate which is within catchRadius percent
720 * of the requested value, we don't have to expand the samples.
721 * Otherwise choose the next higher rate.
722 * N.B.: burgundy awacs only works at 44100 Hz.
725 tolerance
= catch_r
* awacs_freqs
[--i
] / 100;
726 if (awacs_freqs_ok
[i
]
727 && dmasound
.soft
.speed
<= awacs_freqs
[i
] + tolerance
)
730 dmasound
.hard
.speed
= awacs_freqs
[i
];
731 awacs_rate_index
= i
;
733 out_le32(&awacs
->control
, MASK_IEPC
| (i
<< 8) | 0x11 );
734 awacs_reg
[1] = (awacs_reg
[1] & ~MASK_SAMPLERATE
) | (i
<< 3);
735 awacs_write(awacs_reg
[1] | MASK_ADDR1
);
736 return dmasound
.hard
.speed
;
740 burgundy_set_frame_rate(void)
742 awacs_rate_index
= 0 ;
743 awacs_reg
[1] = (awacs_reg
[1] & ~MASK_SAMPLERATE
) ;
744 /* XXX disable error interrupt on burgundy for now */
745 out_le32(&awacs
->control
, MASK_IEPC
| 0 | 0x11 | MASK_IEE
);
750 set_frame_rate(int desired
, int catch_r
)
752 switch (awacs_revision
) {
754 dmasound
.hard
.speed
= burgundy_set_frame_rate();
758 dmasound
.hard
.speed
= tas_set_frame_rate();
761 dmasound
.hard
.speed
=
762 daca_set_frame_rate();
765 dmasound
.hard
.speed
= awacs_set_frame_rate(desired
,
769 return dmasound
.hard
.speed
;
773 awacs_recalibrate(void)
775 /* Sorry for the horrible delays... I hope to get that improved
776 * by making the whole PM process asynchronous in a future version
779 awacs_reg
[1] |= MASK_CMUTE
| MASK_AMUTE
;
780 awacs_write(awacs_reg
[1] | MASK_RECALIBRATE
| MASK_ADDR1
);
782 awacs_write(awacs_reg
[1] | MASK_ADDR1
);
785 static void PMacInit(void)
789 switch (dmasound
.soft
.format
) {
793 dmasound
.hard
.format
= AFMT_S16_LE
;
795 dmasound
.hard
.format
= AFMT_S16_BE
;
798 dmasound
.hard
.format
= AFMT_S16_BE
;
801 dmasound
.hard
.stereo
= 1;
802 dmasound
.hard
.size
= 16;
804 /* set dmasound.hard.speed - on the basis of what we want (soft)
805 * and the tolerance we'll allow.
807 set_frame_rate(dmasound
.soft
.speed
, catchRadius
) ;
809 tolerance
= (catchRadius
* dmasound
.hard
.speed
) / 100;
810 if (dmasound
.soft
.speed
>= dmasound
.hard
.speed
- tolerance
) {
811 dmasound
.trans_write
= &transAwacsNormal
;
812 dmasound
.trans_read
= &transAwacsNormalRead
;
814 dmasound
.trans_write
= &transAwacsExpand
;
815 dmasound
.trans_read
= &transAwacsExpandRead
;
819 if (hw_can_byteswap
&& (dmasound
.hard
.format
== AFMT_S16_LE
))
820 out_le32(&awacs
->byteswap
, BS_VAL
);
822 out_le32(&awacs
->byteswap
, 0);
825 expand_bal
= -dmasound
.soft
.speed
;
826 expand_read_bal
= -dmasound
.soft
.speed
;
829 static int PMacSetFormat(int format
)
832 int req_format
= format
;
836 return dmasound
.soft
.format
;
845 format
= AFMT_S16_BE
;
851 format
= AFMT_U16_BE
;
856 printk(KERN_ERR
"dmasound: unknown format 0x%x, using AFMT_U8\n",
862 if (req_format
== format
) {
863 dmasound
.soft
.format
= format
;
864 dmasound
.soft
.size
= size
;
865 if (dmasound
.minDev
== SND_DEV_DSP
) {
866 dmasound
.dsp
.format
= format
;
867 dmasound
.dsp
.size
= size
;
874 #define AWACS_VOLUME_TO_MASK(x) (15 - ((((x) - 1) * 15) / 99))
875 #define AWACS_MASK_TO_VOLUME(y) (100 - ((y) * 99 / 15))
877 static int awacs_get_volume(int reg
, int lshift
)
881 volume
= AWACS_MASK_TO_VOLUME((reg
>> lshift
) & 0xf);
882 volume
|= AWACS_MASK_TO_VOLUME(reg
& 0xf) << 8;
886 static int awacs_volume_setter(int volume
, int n
, int mute
, int lshift
)
890 if (mute
&& volume
== 0) {
891 r1
= awacs_reg
[1] | mute
;
893 r1
= awacs_reg
[1] & ~mute
;
894 rn
= awacs_reg
[n
] & ~(0xf | (0xf << lshift
));
895 rn
|= ((AWACS_VOLUME_TO_MASK(volume
& 0xff) & 0xf) << lshift
);
896 rn
|= AWACS_VOLUME_TO_MASK((volume
>> 8) & 0xff) & 0xf;
898 awacs_write((n
<< 12) | rn
);
899 volume
= awacs_get_volume(rn
, lshift
);
901 if (r1
!= awacs_reg
[1]) {
903 awacs_write(r1
| MASK_ADDR1
);
908 static int PMacSetVolume(int volume
)
910 printk(KERN_WARNING
"Bogus call to PMacSetVolume !\n");
914 static void awacs_setup_for_beep(int speed
)
916 out_le32(&awacs
->control
,
917 (in_le32(&awacs
->control
) & ~0x1f00)
918 | ((speed
> 0 ? speed
: awacs_rate_index
) << 8));
920 if (hw_can_byteswap
&& (dmasound
.hard
.format
== AFMT_S16_LE
) && speed
== -1)
921 out_le32(&awacs
->byteswap
, BS_VAL
);
923 out_le32(&awacs
->byteswap
, 0);
926 /* CHECK: how much of this *really* needs IRQs masked? */
927 static void __PMacPlay(void)
929 volatile struct dbdma_cmd
*cp
;
932 count
= 300 ; /* > two cycles at the lowest sample rate */
934 /* what we want to send next */
935 next_frg
= (write_sq
.front
+ write_sq
.active
) % write_sq
.max_count
;
937 if (awacs_beep_state
) {
938 /* sound takes precedence over beeps */
939 /* stop the dma channel */
940 out_le32(&awacs_txdma
->control
, (RUN
|PAUSE
|FLUSH
|WAKE
) << 16);
941 while ( (in_le32(&awacs_txdma
->status
) & RUN
) && count
--)
944 awacs_setup_for_beep(-1);
945 out_le32(&awacs_txdma
->cmdptr
,
946 virt_to_bus(&(awacs_tx_cmds
[next_frg
])));
949 awacs_beep_state
= 0;
951 /* this won't allow more than two frags to be in the output queue at
952 once. (or one, if the max frags is 2 - because count can't exceed
955 while (write_sq
.active
< 2 && write_sq
.active
< write_sq
.count
) {
956 count
= (write_sq
.count
== write_sq
.active
+ 1) ?
957 write_sq
.rear_size
:write_sq
.block_size
;
958 if (count
< write_sq
.block_size
) {
959 if (!write_sq
.syncing
) /* last block not yet filled,*/
960 break; /* and we're not syncing or POST-ed */
962 /* pretend the block is full to force a new
963 block to be started on the next write */
964 write_sq
.rear_size
= write_sq
.block_size
;
965 write_sq
.syncing
&= ~2 ; /* clear POST */
968 cp
= &awacs_tx_cmds
[next_frg
];
969 st_le16(&cp
->req_count
, count
);
970 st_le16(&cp
->xfer_status
, 0);
971 st_le16(&cp
->command
, OUTPUT_MORE
+ INTR_ALWAYS
);
972 /* put a STOP at the end of the queue - but only if we have
973 space for it. This means that, if we under-run and we only
974 have two fragments, we might re-play sound from an existing
975 queued frag. I guess the solution to that is not to set two
976 frags if you are likely to under-run...
978 if (write_sq
.count
< write_sq
.max_count
) {
979 if (++next_frg
>= write_sq
.max_count
)
980 next_frg
= 0 ; /* wrap */
981 /* if we get here then we've underrun so we will stop*/
982 st_le16(&awacs_tx_cmds
[next_frg
].command
, DBDMA_STOP
);
984 /* set the dbdma controller going, if it is not already */
985 if (write_sq
.active
== 0)
986 out_le32(&awacs_txdma
->cmdptr
, virt_to_bus(cp
));
987 (void)in_le32(&awacs_txdma
->status
);
988 out_le32(&awacs_txdma
->control
, ((RUN
|WAKE
) << 16) + (RUN
|WAKE
));
993 static void PMacPlay(void)
996 if (!awacs_sleeping
) {
999 spin_lock_irqsave(&dmasound
.lock
, flags
);
1001 spin_unlock_irqrestore(&dmasound
.lock
, flags
);
1006 static void PMacRecord(void)
1008 unsigned long flags
;
1013 spin_lock_irqsave(&dmasound
.lock
, flags
);
1015 /* This is all we have to do......Just start it up.
1017 out_le32(&awacs_rxdma
->control
, ((RUN
|WAKE
) << 16) + (RUN
|WAKE
));
1020 spin_unlock_irqrestore(&dmasound
.lock
, flags
);
1023 /* if the TX status comes up "DEAD" - reported on some Power Computing machines
1024 we need to re-start the dbdma - but from a different physical start address
1025 and with a different transfer length. It would get very messy to do this
1026 with the normal dbdma_cmd blocks - we would have to re-write the buffer start
1027 addresses each time. So, we will keep a single dbdma_cmd block which can be
1029 When DEAD status is first reported the content of the faulted dbdma block is
1030 copied into the emergency buffer and we note that the buffer is in use.
1031 we then bump the start physical address by the amount that was successfully
1032 output before it died.
1033 On any subsequent DEAD result we just do the bump-ups (we know that we are
1034 already using the emergency dbdma_cmd).
1035 CHECK: this just tries to "do it". It is possible that we should abandon
1036 xfers when the number of residual bytes gets below a certain value - I can
1037 see that this might cause a loop-forever if too small a transfer causes
1038 DEAD status. However this is a TODO for now - we'll see what gets reported.
1039 When we get a successful transfer result with the emergency buffer we just
1040 pretend that it completed using the original dmdma_cmd and carry on. The
1041 'next_cmd' field will already point back to the original loop of blocks.
1045 pmac_awacs_tx_intr(int irq
, void *devid
, struct pt_regs
*regs
)
1047 int i
= write_sq
.front
;
1049 int i_nowrap
= write_sq
.front
;
1050 volatile struct dbdma_cmd
*cp
;
1051 /* != 0 when we are dealing with a DEAD xfer */
1052 static int emergency_in_use
;
1054 spin_lock(&dmasound
.lock
);
1055 while (write_sq
.active
> 0) { /* we expect to have done something*/
1056 if (emergency_in_use
) /* we are dealing with DEAD xfer */
1057 cp
= emergency_dbdma_cmd
;
1059 cp
= &awacs_tx_cmds
[i
];
1060 stat
= ld_le16(&cp
->xfer_status
);
1062 unsigned short req
, res
;
1064 #ifdef DEBUG_DMASOUND
1065 printk("dmasound_pmac: tx-irq: xfer died - patching it up...\n") ;
1067 /* to clear DEAD status we must first clear RUN
1068 set it to quiescent to be on the safe side */
1069 (void)in_le32(&awacs_txdma
->status
);
1070 out_le32(&awacs_txdma
->control
,
1071 (RUN
|PAUSE
|FLUSH
|WAKE
) << 16);
1073 if (!emergency_in_use
) { /* new problem */
1074 memcpy((void *)emergency_dbdma_cmd
, (void *)cp
,
1075 sizeof(struct dbdma_cmd
));
1076 emergency_in_use
= 1;
1077 cp
= emergency_dbdma_cmd
;
1079 /* now bump the values to reflect the amount
1080 we haven't yet shifted */
1081 req
= ld_le16(&cp
->req_count
);
1082 res
= ld_le16(&cp
->res_count
);
1083 phy
= ld_le32(&cp
->phy_addr
);
1085 st_le16(&cp
->req_count
, res
);
1086 st_le16(&cp
->res_count
, 0);
1087 st_le16(&cp
->xfer_status
, 0);
1088 st_le32(&cp
->phy_addr
, phy
);
1089 st_le32(&cp
->cmd_dep
, virt_to_bus(&awacs_tx_cmds
[(i
+1)%write_sq
.max_count
]));
1090 st_le16(&cp
->command
, OUTPUT_MORE
| BR_ALWAYS
| INTR_ALWAYS
);
1092 /* point at our patched up command block */
1093 out_le32(&awacs_txdma
->cmdptr
, virt_to_bus(cp
));
1094 /* we must re-start the controller */
1095 (void)in_le32(&awacs_txdma
->status
);
1096 /* should complete clearing the DEAD status */
1097 out_le32(&awacs_txdma
->control
,
1098 ((RUN
|WAKE
) << 16) + (RUN
|WAKE
));
1099 break; /* this block is still going */
1101 if ((stat
& ACTIVE
) == 0)
1102 break; /* this frame is still going */
1103 if (emergency_in_use
)
1104 emergency_in_use
= 0 ; /* done that */
1108 if (++i
>= write_sq
.max_count
)
1112 /* if we stopped and we were not sync-ing - then we under-ran */
1113 if( write_sq
.syncing
== 0 ){
1114 stat
= in_le32(&awacs_txdma
->status
) ;
1115 /* we hit the dbdma_stop */
1116 if( (stat
& ACTIVE
) == 0 ) write_sq
.xruns
++ ;
1119 /* if we used some data up then wake the writer to supply some more*/
1120 if (i_nowrap
!= write_sq
.front
)
1121 WAKE_UP(write_sq
.action_queue
);
1124 /* but make sure we funnel what we've already got */\
1125 if (!awacs_sleeping
)
1128 /* make the wake-on-empty conditional on syncing */
1129 if (!write_sq
.active
&& (write_sq
.syncing
& 1))
1130 WAKE_UP(write_sq
.sync_queue
); /* any time we're empty */
1131 spin_unlock(&dmasound
.lock
);
1137 pmac_awacs_rx_intr(int irq
, void *devid
, struct pt_regs
*regs
)
1140 /* For some reason on my PowerBook G3, I get one interrupt
1141 * when the interrupt vector is installed (like something is
1142 * pending). This happens before the dbdma is initialized by
1143 * us, so I just check the command pointer and if it is zero,
1146 if (in_le32(&awacs_rxdma
->cmdptr
) == 0)
1149 /* We also want to blow 'em off when shutting down.
1151 if (read_sq
.active
== 0)
1154 spin_lock(&dmasound
.lock
);
1155 /* Check multiple buffers in case we were held off from
1156 * interrupt processing for a long time. Geeze, I really hope
1157 * this doesn't happen.
1159 while ((stat
=awacs_rx_cmds
[read_sq
.rear
].xfer_status
)) {
1161 /* if we got a "DEAD" status then just log it for now.
1162 and try to restart dma.
1163 TODO: figure out how best to fix it up
1166 #ifdef DEBUG_DMASOUND
1167 printk("dmasound_pmac: rx-irq: DIED - attempting resurection\n");
1169 /* to clear DEAD status we must first clear RUN
1170 set it to quiescent to be on the safe side */
1171 (void)in_le32(&awacs_txdma
->status
);
1172 out_le32(&awacs_txdma
->control
,
1173 (RUN
|PAUSE
|FLUSH
|WAKE
) << 16);
1174 awacs_rx_cmds
[read_sq
.rear
].xfer_status
= 0;
1175 awacs_rx_cmds
[read_sq
.rear
].res_count
= 0;
1177 (void)in_le32(&awacs_txdma
->status
);
1178 /* re-start the same block */
1179 out_le32(&awacs_rxdma
->cmdptr
,
1180 virt_to_bus(&awacs_rx_cmds
[read_sq
.rear
]));
1181 /* we must re-start the controller */
1182 (void)in_le32(&awacs_rxdma
->status
);
1183 /* should complete clearing the DEAD status */
1184 out_le32(&awacs_rxdma
->control
,
1185 ((RUN
|WAKE
) << 16) + (RUN
|WAKE
));
1186 spin_unlock(&dmasound
.lock
);
1187 return IRQ_HANDLED
; /* try this block again */
1189 /* Clear status and move on to next buffer.
1191 awacs_rx_cmds
[read_sq
.rear
].xfer_status
= 0;
1194 /* Wrap the buffer ring.
1196 if (read_sq
.rear
>= read_sq
.max_active
)
1199 /* If we have caught up to the front buffer, bump it.
1200 * This will cause weird (but not fatal) results if the
1201 * read loop is currently using this buffer. The user is
1202 * behind in this case anyway, so weird things are going
1205 if (read_sq
.rear
== read_sq
.front
) {
1207 read_sq
.xruns
++ ; /* we overan */
1208 if (read_sq
.front
>= read_sq
.max_active
)
1213 WAKE_UP(read_sq
.action_queue
);
1214 spin_unlock(&dmasound
.lock
);
1220 pmac_awacs_intr(int irq
, void *devid
, struct pt_regs
*regs
)
1226 spin_lock(&dmasound
.lock
);
1227 ctrl
= in_le32(&awacs
->control
);
1228 status
= in_le32(&awacs
->codec_stat
);
1230 if (ctrl
& MASK_PORTCHG
) {
1231 /* tested on Screamer, should work on others too */
1232 if (awacs_revision
== AWACS_SCREAMER
) {
1233 if (((status
& MASK_HDPCONN
) >> 3) && (hdp_connected
== 0)) {
1236 r1
= awacs_reg
[1] | MASK_SPKMUTE
;
1238 awacs_write(r1
| MASK_ADDR_MUTE
);
1239 } else if (((status
& MASK_HDPCONN
) >> 3 == 0) && (hdp_connected
== 1)) {
1242 r1
= awacs_reg
[1] & ~MASK_SPKMUTE
;
1244 awacs_write(r1
| MASK_ADDR_MUTE
);
1248 if (ctrl
& MASK_CNTLERR
) {
1249 int err
= (in_le32(&awacs
->codec_stat
) & MASK_ERRCODE
) >> 16;
1250 /* CHECK: we just swallow burgundy errors at the moment..*/
1251 if (err
!= 0 && awacs_revision
!= AWACS_BURGUNDY
)
1252 printk(KERN_ERR
"dmasound_pmac: error %x\n", err
);
1254 /* Writing 1s to the CNTLERR and PORTCHG bits clears them... */
1255 out_le32(&awacs
->control
, ctrl
);
1256 spin_unlock(&dmasound
.lock
);
1261 awacs_write(int val
)
1264 if (awacs_revision
>= AWACS_DACA
|| !awacs
)
1267 while ((in_le32(&awacs
->codec_ctrl
) & MASK_NEWECMD
) && count
--)
1268 udelay(1) ; /* timeout is > 2 samples at lowest rate */
1269 out_le32(&awacs
->codec_ctrl
, val
| (awacs_subframe
<< 22));
1270 (void)in_le32(&awacs
->byteswap
);
1273 /* this is called when the beep timer expires... it will be called even
1274 if the beep has been overidden by other sound output.
1276 static void awacs_nosound(unsigned long xx
)
1278 unsigned long flags
;
1279 int count
= 600 ; /* > four samples at lowest rate */
1281 spin_lock_irqsave(&dmasound
.lock
, flags
);
1283 st_le16(&beep_dbdma_cmd
->command
, DBDMA_STOP
);
1284 out_le32(&awacs_txdma
->control
, (RUN
|PAUSE
|FLUSH
|WAKE
) << 16);
1285 while ((in_le32(&awacs_txdma
->status
) & RUN
) && count
--)
1288 awacs_setup_for_beep(-1);
1291 spin_unlock_irqrestore(&dmasound
.lock
, flags
);
1295 * We generate the beep with a single dbdma command that loops a buffer
1296 * forever - without generating interrupts.
1298 * So, to stop it you have to stop dma output as per awacs_nosound.
1300 static int awacs_beep_event(struct input_dev
*dev
, unsigned int type
,
1301 unsigned int code
, int hz
)
1303 unsigned long flags
;
1306 int period
, ncycles
, nsamples
;
1309 static int beep_hz_cache
;
1310 static int beep_nsamples_cache
;
1311 static int beep_volume_cache
;
1326 if (beep_buf
== NULL
)
1329 /* quick-hack fix for DACA, Burgundy & Tumbler */
1331 if (awacs_revision
>= AWACS_DACA
){
1334 for (i
= 0; i
< 8 && awacs_freqs
[i
] >= BEEP_SRATE
; ++i
)
1335 if (awacs_freqs_ok
[i
])
1337 srate
= awacs_freqs
[beep_speed
];
1340 if (hz
<= srate
/ BEEP_BUFLEN
|| hz
> srate
/ 2) {
1341 /* cancel beep currently playing */
1346 spin_lock_irqsave(&dmasound
.lock
, flags
);
1347 if (beep_playing
|| write_sq
.active
|| beep_buf
== NULL
) {
1348 spin_unlock_irqrestore(&dmasound
.lock
, flags
);
1349 return -1; /* too hard, sorry :-( */
1352 st_le16(&beep_dbdma_cmd
->command
, OUTPUT_MORE
+ BR_ALWAYS
);
1353 spin_unlock_irqrestore(&dmasound
.lock
, flags
);
1355 if (hz
== beep_hz_cache
&& beep_vol
== beep_volume_cache
) {
1356 nsamples
= beep_nsamples_cache
;
1358 period
= srate
* 256 / hz
; /* fixed point */
1359 ncycles
= BEEP_BUFLEN
* 256 / period
;
1360 nsamples
= (period
* ncycles
) >> 8;
1361 f
= ncycles
* 65536 / nsamples
;
1364 for (i
= 0; i
< nsamples
; ++i
, p
+= 2) {
1365 p
[0] = p
[1] = beep_wform
[j
>> 8] * beep_vol
;
1366 j
= (j
+ f
) & 0xffff;
1369 beep_volume_cache
= beep_vol
;
1370 beep_nsamples_cache
= nsamples
;
1373 st_le16(&beep_dbdma_cmd
->req_count
, nsamples
*4);
1374 st_le16(&beep_dbdma_cmd
->xfer_status
, 0);
1375 st_le32(&beep_dbdma_cmd
->cmd_dep
, virt_to_bus(beep_dbdma_cmd
));
1376 st_le32(&beep_dbdma_cmd
->phy_addr
, virt_to_bus(beep_buf
));
1377 awacs_beep_state
= 1;
1379 spin_lock_irqsave(&dmasound
.lock
, flags
);
1380 if (beep_playing
) { /* i.e. haven't been terminated already */
1382 out_le32(&awacs_txdma
->control
, (RUN
|WAKE
|FLUSH
|PAUSE
) << 16);
1383 while ((in_le32(&awacs_txdma
->status
) & RUN
) && count
--)
1384 udelay(1); /* timeout > 2 samples at lowest rate*/
1386 awacs_setup_for_beep(beep_speed
);
1387 out_le32(&awacs_txdma
->cmdptr
, virt_to_bus(beep_dbdma_cmd
));
1388 (void)in_le32(&awacs_txdma
->status
);
1389 out_le32(&awacs_txdma
->control
, RUN
| (RUN
<< 16));
1391 spin_unlock_irqrestore(&dmasound
.lock
, flags
);
1396 /* used in init and for wake-up */
1401 awacs_write(awacs_reg
[0] + MASK_ADDR0
);
1402 awacs_write(awacs_reg
[1] + MASK_ADDR1
);
1403 awacs_write(awacs_reg
[2] + MASK_ADDR2
);
1404 awacs_write(awacs_reg
[4] + MASK_ADDR4
);
1406 if (awacs_revision
== AWACS_SCREAMER
) {
1407 awacs_write(awacs_reg
[5] + MASK_ADDR5
);
1409 awacs_write(awacs_reg
[6] + MASK_ADDR6
);
1411 awacs_write(awacs_reg
[1] + MASK_ADDR1
);
1412 awacs_write(awacs_reg
[7] + MASK_ADDR7
);
1415 if (hw_can_byteswap
&& (dmasound
.hard
.format
== AFMT_S16_LE
))
1416 out_le32(&awacs
->byteswap
, BS_VAL
);
1418 out_le32(&awacs
->byteswap
, 0);
1422 #ifdef CONFIG_PMAC_PBOOK
1424 * Save state when going to sleep, restore it afterwards.
1426 /* FIXME: sort out disabling/re-enabling of read stuff as well */
1427 static int awacs_sleep_notify(struct pmu_sleep_notifier
*self
, int when
)
1429 unsigned long flags
;
1432 case PBOOK_SLEEP_NOW
:
1435 /* Tell the rest of the driver we are now going to sleep */
1437 if (awacs_revision
== AWACS_SCREAMER
||
1438 awacs_revision
== AWACS_AWACS
) {
1439 awacs_reg1_save
= awacs_reg
[1];
1440 awacs_reg
[1] |= MASK_AMUTE
| MASK_CMUTE
;
1441 awacs_write(MASK_ADDR1
| awacs_reg
[1]);
1445 /* stop rx - if going - a bit of a daft user... but */
1446 out_le32(&awacs_rxdma
->control
, (RUN
|WAKE
|FLUSH
<< 16));
1447 /* deny interrupts */
1449 disable_irq(awacs_irq
);
1450 disable_irq(awacs_tx_irq
);
1451 disable_irq(awacs_rx_irq
);
1452 /* Chip specific sleep code */
1453 switch (awacs_revision
) {
1456 write_audio_gpio(gpio_headphone_mute
, gpio_headphone_mute_pol
);
1457 write_audio_gpio(gpio_amp_mute
, gpio_amp_mute_pol
);
1459 write_audio_gpio(gpio_audio_reset
, gpio_audio_reset_pol
);
1464 case AWACS_BURGUNDY
:
1466 case AWACS_SCREAMER
:
1469 out_le32(&awacs
->control
, 0x11) ;
1472 /* Disable sound clock */
1473 pmac_call_feature(PMAC_FTR_SOUND_CHIP_ENABLE
, awacs_node
, 0, 0);
1474 /* According to Darwin, we do that after turning off the sound
1475 * chip clock. All this will have to be cleaned up once we properly
1476 * parse the OF sound-objects
1478 if ((machine_is_compatible("PowerBook3,1") ||
1479 machine_is_compatible("PowerBook3,2")) && awacs
) {
1480 awacs_reg
[1] |= MASK_PAROUT0
| MASK_PAROUT1
;
1481 awacs_write(MASK_ADDR1
| awacs_reg
[1]);
1486 /* Enable sound clock */
1487 pmac_call_feature(PMAC_FTR_SOUND_CHIP_ENABLE
, awacs_node
, 0, 1);
1488 if ((machine_is_compatible("PowerBook3,1") ||
1489 machine_is_compatible("PowerBook3,2")) && awacs
) {
1491 awacs_reg
[1] &= ~(MASK_PAROUT0
| MASK_PAROUT1
);
1492 awacs_write(MASK_ADDR1
| awacs_reg
[1]);
1496 /* restore settings */
1497 switch (awacs_revision
) {
1500 write_audio_gpio(gpio_headphone_mute
, gpio_headphone_mute_pol
);
1501 write_audio_gpio(gpio_amp_mute
, gpio_amp_mute_pol
);
1502 write_audio_gpio(gpio_audio_reset
, gpio_audio_reset_pol
);
1504 write_audio_gpio(gpio_audio_reset
, !gpio_audio_reset_pol
);
1506 tas_leave_sleep(); /* Stub for now */
1507 headphone_intr(0,NULL
,NULL
);
1510 msleep(10); /* Check this !!! */
1512 break ; /* dont know how yet */
1513 case AWACS_BURGUNDY
:
1515 case AWACS_SCREAMER
:
1521 /* Recalibrate chip */
1522 if (awacs_revision
== AWACS_SCREAMER
&& awacs
)
1523 awacs_recalibrate();
1524 /* Make sure dma is stopped */
1527 enable_irq(awacs_irq
);
1528 enable_irq(awacs_tx_irq
);
1529 enable_irq(awacs_rx_irq
);
1531 /* OK, allow ints back again */
1532 out_le32(&awacs
->control
, MASK_IEPC
1533 | (awacs_rate_index
<< 8) | 0x11
1534 | (awacs_revision
< AWACS_DACA
? MASK_IEE
: 0));
1536 if (macio_base
&& is_pbook_g3
) {
1537 /* FIXME: should restore the setup we had...*/
1538 out_8(macio_base
+ 0x37, 3);
1539 } else if (is_pbook_3X00
) {
1540 in_8(latch_base
+ 0x190);
1543 if (awacs_revision
== AWACS_SCREAMER
||
1544 awacs_revision
== AWACS_AWACS
) {
1545 awacs_reg
[1] = awacs_reg1_save
;
1546 awacs_write(MASK_ADDR1
| awacs_reg
[1]);
1549 /* Resume pending sounds. */
1550 /* we don't try to restart input... */
1551 spin_lock_irqsave(&dmasound
.lock
, flags
);
1553 spin_unlock_irqrestore(&dmasound
.lock
, flags
);
1556 return PBOOK_SLEEP_OK
;
1558 #endif /* CONFIG_PMAC_PBOOK */
1561 /* All the burgundy functions: */
1563 /* Waits for busy flag to clear */
1565 awacs_burgundy_busy_wait(void)
1567 int count
= 50; /* > 2 samples at 44k1 */
1568 while ((in_le32(&awacs
->codec_ctrl
) & MASK_NEWECMD
) && count
--)
1573 awacs_burgundy_extend_wait(void)
1575 int count
= 50 ; /* > 2 samples at 44k1 */
1576 while ((!(in_le32(&awacs
->codec_stat
) & MASK_EXTEND
)) && count
--)
1579 while ((in_le32(&awacs
->codec_stat
) & MASK_EXTEND
) && count
--)
1584 awacs_burgundy_wcw(unsigned addr
, unsigned val
)
1586 out_le32(&awacs
->codec_ctrl
, addr
+ 0x200c00 + (val
& 0xff));
1587 awacs_burgundy_busy_wait();
1588 out_le32(&awacs
->codec_ctrl
, addr
+ 0x200d00 +((val
>>8) & 0xff));
1589 awacs_burgundy_busy_wait();
1590 out_le32(&awacs
->codec_ctrl
, addr
+ 0x200e00 +((val
>>16) & 0xff));
1591 awacs_burgundy_busy_wait();
1592 out_le32(&awacs
->codec_ctrl
, addr
+ 0x200f00 +((val
>>24) & 0xff));
1593 awacs_burgundy_busy_wait();
1597 awacs_burgundy_rcw(unsigned addr
)
1600 unsigned long flags
;
1602 /* should have timeouts here */
1603 spin_lock_irqsave(&dmasound
.lock
, flags
);
1605 out_le32(&awacs
->codec_ctrl
, addr
+ 0x100000);
1606 awacs_burgundy_busy_wait();
1607 awacs_burgundy_extend_wait();
1608 val
+= (in_le32(&awacs
->codec_stat
) >> 4) & 0xff;
1610 out_le32(&awacs
->codec_ctrl
, addr
+ 0x100100);
1611 awacs_burgundy_busy_wait();
1612 awacs_burgundy_extend_wait();
1613 val
+= ((in_le32(&awacs
->codec_stat
)>>4) & 0xff) <<8;
1615 out_le32(&awacs
->codec_ctrl
, addr
+ 0x100200);
1616 awacs_burgundy_busy_wait();
1617 awacs_burgundy_extend_wait();
1618 val
+= ((in_le32(&awacs
->codec_stat
)>>4) & 0xff) <<16;
1620 out_le32(&awacs
->codec_ctrl
, addr
+ 0x100300);
1621 awacs_burgundy_busy_wait();
1622 awacs_burgundy_extend_wait();
1623 val
+= ((in_le32(&awacs
->codec_stat
)>>4) & 0xff) <<24;
1625 spin_unlock_irqrestore(&dmasound
.lock
, flags
);
1632 awacs_burgundy_wcb(unsigned addr
, unsigned val
)
1634 out_le32(&awacs
->codec_ctrl
, addr
+ 0x300000 + (val
& 0xff));
1635 awacs_burgundy_busy_wait();
1639 awacs_burgundy_rcb(unsigned addr
)
1642 unsigned long flags
;
1644 /* should have timeouts here */
1645 spin_lock_irqsave(&dmasound
.lock
, flags
);
1647 out_le32(&awacs
->codec_ctrl
, addr
+ 0x100000);
1648 awacs_burgundy_busy_wait();
1649 awacs_burgundy_extend_wait();
1650 val
+= (in_le32(&awacs
->codec_stat
) >> 4) & 0xff;
1652 spin_unlock_irqrestore(&dmasound
.lock
, flags
);
1658 awacs_burgundy_check(void)
1660 /* Checks to see the chip is alive and kicking */
1661 int error
= in_le32(&awacs
->codec_ctrl
) & MASK_ERRCODE
;
1663 return error
== 0xf0000;
1667 awacs_burgundy_init(void)
1669 if (awacs_burgundy_check()) {
1670 printk(KERN_WARNING
"dmasound_pmac: burgundy not working :-(\n");
1674 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_OUTPUTENABLES
,
1675 DEF_BURGUNDY_OUTPUTENABLES
);
1676 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES
,
1677 DEF_BURGUNDY_MORE_OUTPUTENABLES
);
1678 awacs_burgundy_wcw(MASK_ADDR_BURGUNDY_OUTPUTSELECTS
,
1679 DEF_BURGUNDY_OUTPUTSELECTS
);
1681 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_INPSEL21
,
1682 DEF_BURGUNDY_INPSEL21
);
1683 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_INPSEL3
,
1684 DEF_BURGUNDY_INPSEL3
);
1685 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_GAINCD
,
1686 DEF_BURGUNDY_GAINCD
);
1687 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_GAINLINE
,
1688 DEF_BURGUNDY_GAINLINE
);
1689 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_GAINMIC
,
1690 DEF_BURGUNDY_GAINMIC
);
1691 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_GAINMODEM
,
1692 DEF_BURGUNDY_GAINMODEM
);
1694 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_ATTENSPEAKER
,
1695 DEF_BURGUNDY_ATTENSPEAKER
);
1696 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_ATTENLINEOUT
,
1697 DEF_BURGUNDY_ATTENLINEOUT
);
1698 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_ATTENHP
,
1699 DEF_BURGUNDY_ATTENHP
);
1701 awacs_burgundy_wcw(MASK_ADDR_BURGUNDY_MASTER_VOLUME
,
1702 DEF_BURGUNDY_MASTER_VOLUME
);
1703 awacs_burgundy_wcw(MASK_ADDR_BURGUNDY_VOLCD
,
1704 DEF_BURGUNDY_VOLCD
);
1705 awacs_burgundy_wcw(MASK_ADDR_BURGUNDY_VOLLINE
,
1706 DEF_BURGUNDY_VOLLINE
);
1707 awacs_burgundy_wcw(MASK_ADDR_BURGUNDY_VOLMIC
,
1708 DEF_BURGUNDY_VOLMIC
);
1713 awacs_burgundy_write_volume(unsigned address
, int volume
)
1715 int hardvolume
,lvolume
,rvolume
;
1717 lvolume
= (volume
& 0xff) ? (volume
& 0xff) + 155 : 0;
1718 rvolume
= ((volume
>>8)&0xff) ? ((volume
>> 8)&0xff ) + 155 : 0;
1720 hardvolume
= lvolume
+ (rvolume
<< 16);
1722 awacs_burgundy_wcw(address
, hardvolume
);
1726 awacs_burgundy_read_volume(unsigned address
)
1728 int softvolume
,wvolume
;
1730 wvolume
= awacs_burgundy_rcw(address
);
1732 softvolume
= (wvolume
& 0xff) - 155;
1733 softvolume
+= (((wvolume
>> 16) & 0xff) - 155)<<8;
1735 return softvolume
> 0 ? softvolume
: 0;
1739 awacs_burgundy_read_mvolume(unsigned address
)
1741 int lvolume
,rvolume
,wvolume
;
1743 wvolume
= awacs_burgundy_rcw(address
);
1747 rvolume
= (wvolume
& 0xff) - 155;
1748 lvolume
= ((wvolume
& 0xff00)>>8) - 155;
1750 return lvolume
+ (rvolume
<< 8);
1754 awacs_burgundy_write_mvolume(unsigned address
, int volume
)
1756 int lvolume
,rvolume
,hardvolume
;
1758 lvolume
= (volume
&0xff) ? (volume
& 0xff) + 155 :0;
1759 rvolume
= ((volume
>>8) & 0xff) ? (volume
>> 8) + 155 :0;
1761 hardvolume
= lvolume
+ (rvolume
<< 8);
1762 hardvolume
+= (hardvolume
<< 16);
1764 awacs_burgundy_wcw(address
, hardvolume
);
1767 /* End burgundy functions */
1769 /* Set up output volumes on machines with the 'perch/whisper' extension card.
1770 * this has an SGS i2c chip (7433) which is accessed using the cuda.
1772 * TODO: split this out and make use of the other parts of the SGS chip to
1773 * do Bass, Treble etc.
1777 awacs_enable_amp(int spkr_vol
)
1779 #ifdef CONFIG_ADB_CUDA
1780 struct adb_request req
;
1782 if (sys_ctrler
!= SYS_CTRLER_CUDA
)
1785 /* turn on headphones */
1786 cuda_request(&req
, NULL
, 5, CUDA_PACKET
, CUDA_GET_SET_IIC
,
1788 while (!req
.complete
) cuda_poll();
1789 cuda_request(&req
, NULL
, 5, CUDA_PACKET
, CUDA_GET_SET_IIC
,
1791 while (!req
.complete
) cuda_poll();
1793 /* turn on speaker */
1794 cuda_request(&req
, NULL
, 5, CUDA_PACKET
, CUDA_GET_SET_IIC
,
1795 0x8a, 3, (100 - (spkr_vol
& 0xff)) * 32 / 100);
1796 while (!req
.complete
) cuda_poll();
1797 cuda_request(&req
, NULL
, 5, CUDA_PACKET
, CUDA_GET_SET_IIC
,
1798 0x8a, 5, (100 - ((spkr_vol
>> 8) & 0xff)) * 32 / 100);
1799 while (!req
.complete
) cuda_poll();
1801 cuda_request(&req
, NULL
, 5, CUDA_PACKET
,
1802 CUDA_GET_SET_IIC
, 0x8a, 1, 0x29);
1803 while (!req
.complete
) cuda_poll();
1804 #endif /* CONFIG_ADB_CUDA */
1808 /*** Mid level stuff *********************************************************/
1812 * /dev/mixer abstraction
1815 static void do_line_lev(int data
)
1818 awacs_reg
[0] &= ~MASK_MUX_AUDIN
;
1819 if ((data
& 0xff) >= 50)
1820 awacs_reg
[0] |= MASK_MUX_AUDIN
;
1821 awacs_write(MASK_ADDR0
| awacs_reg
[0]);
1824 static void do_ip_gain(int data
)
1828 awacs_reg
[0] &= ~MASK_GAINLINE
;
1829 if (awacs_revision
== AWACS_SCREAMER
) {
1830 awacs_reg
[6] &= ~MASK_MIC_BOOST
;
1832 awacs_reg
[0] |= MASK_GAINLINE
;
1834 awacs_reg
[6] |= MASK_MIC_BOOST
;
1836 awacs_write(MASK_ADDR6
| awacs_reg
[6]) ;
1839 awacs_reg
[0] |= MASK_GAINLINE
;
1841 awacs_write(MASK_ADDR0
| awacs_reg
[0]);
1844 static void do_mic_lev(int data
)
1848 awacs_reg
[0] &= ~MASK_MUX_MIC
;
1850 awacs_reg
[0] |= MASK_MUX_MIC
;
1851 awacs_write(MASK_ADDR0
| awacs_reg
[0]);
1854 static void do_cd_lev(int data
)
1857 awacs_reg
[0] &= ~MASK_MUX_CD
;
1858 if ((data
& 0xff) >= 50)
1859 awacs_reg
[0] |= MASK_MUX_CD
;
1860 awacs_write(MASK_ADDR0
| awacs_reg
[0]);
1863 static void do_rec_lev(int data
)
1867 /* need to fudge this to use the volume setter routine */
1868 left
= 100 - (data
& 0xff) ; if( left
< 0 ) left
= 0 ;
1869 right
= 100 - ((data
>> 8) & 0xff) ; if( right
< 0 ) right
= 0 ;
1870 left
|= (right
<< 8 );
1871 left
= awacs_volume_setter(left
, 0, 0, 4);
1874 static void do_passthru_vol(int data
)
1876 passthru_vol
= data
;
1877 awacs_reg
[1] &= ~MASK_LOOPTHRU
;
1878 if (awacs_revision
== AWACS_SCREAMER
) {
1879 if( data
) { /* switch it on for non-zero */
1880 awacs_reg
[1] |= MASK_LOOPTHRU
;
1881 awacs_write(MASK_ADDR1
| awacs_reg
[1]);
1883 data
= awacs_volume_setter(data
, 5, 0, 6) ;
1885 if ((data
& 0xff) >= 50)
1886 awacs_reg
[1] |= MASK_LOOPTHRU
;
1887 awacs_write(MASK_ADDR1
| awacs_reg
[1]);
1888 data
= (awacs_reg
[1] & MASK_LOOPTHRU
)? 100: 0;
1892 static int awacs_mixer_ioctl(u_int cmd
, u_long arg
)
1898 case SOUND_MIXER_READ_CAPS
:
1899 /* say we will allow multiple inputs? prob. wrong
1900 so I'm switching it to single */
1901 return IOCTL_OUT(arg
, 1);
1902 case SOUND_MIXER_READ_DEVMASK
:
1903 data
= SOUND_MASK_VOLUME
| SOUND_MASK_SPEAKER
1904 | SOUND_MASK_LINE
| SOUND_MASK_MIC
| SOUND_MASK_CD
1905 | SOUND_MASK_IGAIN
| SOUND_MASK_RECLEV
1907 | SOUND_MASK_MONITOR
;
1908 rc
= IOCTL_OUT(arg
, data
);
1910 case SOUND_MIXER_READ_RECMASK
:
1911 data
= SOUND_MASK_LINE
| SOUND_MASK_MIC
| SOUND_MASK_CD
;
1912 rc
= IOCTL_OUT(arg
, data
);
1914 case SOUND_MIXER_READ_RECSRC
:
1916 if (awacs_reg
[0] & MASK_MUX_AUDIN
)
1917 data
|= SOUND_MASK_LINE
;
1918 if (awacs_reg
[0] & MASK_MUX_MIC
)
1919 data
|= SOUND_MASK_MIC
;
1920 if (awacs_reg
[0] & MASK_MUX_CD
)
1921 data
|= SOUND_MASK_CD
;
1922 rc
= IOCTL_OUT(arg
, data
);
1924 case SOUND_MIXER_WRITE_RECSRC
:
1925 IOCTL_IN(arg
, data
);
1926 data
&= (SOUND_MASK_LINE
| SOUND_MASK_MIC
| SOUND_MASK_CD
);
1927 awacs_reg
[0] &= ~(MASK_MUX_CD
| MASK_MUX_MIC
1929 if (data
& SOUND_MASK_LINE
)
1930 awacs_reg
[0] |= MASK_MUX_AUDIN
;
1931 if (data
& SOUND_MASK_MIC
)
1932 awacs_reg
[0] |= MASK_MUX_MIC
;
1933 if (data
& SOUND_MASK_CD
)
1934 awacs_reg
[0] |= MASK_MUX_CD
;
1935 awacs_write(awacs_reg
[0] | MASK_ADDR0
);
1936 rc
= IOCTL_OUT(arg
, data
);
1938 case SOUND_MIXER_READ_STEREODEVS
:
1939 data
= SOUND_MASK_VOLUME
| SOUND_MASK_SPEAKER
| SOUND_MASK_RECLEV
;
1940 if (awacs_revision
== AWACS_SCREAMER
)
1941 data
|= SOUND_MASK_MONITOR
;
1942 rc
= IOCTL_OUT(arg
, data
);
1944 case SOUND_MIXER_WRITE_VOLUME
:
1945 IOCTL_IN(arg
, data
);
1947 awacs_volume_setter(data
, 2, 0, 6);
1949 case SOUND_MIXER_READ_VOLUME
:
1950 rc
= IOCTL_OUT(arg
, line_vol
);
1952 case SOUND_MIXER_WRITE_SPEAKER
:
1953 IOCTL_IN(arg
, data
);
1956 awacs_enable_amp(data
);
1958 (void)awacs_volume_setter(data
, 4, MASK_CMUTE
, 6);
1960 case SOUND_MIXER_READ_SPEAKER
:
1961 rc
= IOCTL_OUT(arg
, spk_vol
);
1963 case SOUND_MIXER_WRITE_ALTPCM
: /* really bell volume */
1964 IOCTL_IN(arg
, data
);
1965 beep_vol
= data
& 0xff;
1967 case SOUND_MIXER_READ_ALTPCM
:
1968 rc
= IOCTL_OUT(arg
, beep_vol
);
1970 case SOUND_MIXER_WRITE_LINE
:
1971 IOCTL_IN(arg
, data
);
1974 case SOUND_MIXER_READ_LINE
:
1975 rc
= IOCTL_OUT(arg
, line_lev
);
1977 case SOUND_MIXER_WRITE_IGAIN
:
1978 IOCTL_IN(arg
, data
);
1981 case SOUND_MIXER_READ_IGAIN
:
1982 rc
= IOCTL_OUT(arg
, ip_gain
);
1984 case SOUND_MIXER_WRITE_MIC
:
1985 IOCTL_IN(arg
, data
);
1988 case SOUND_MIXER_READ_MIC
:
1989 rc
= IOCTL_OUT(arg
, mic_lev
);
1991 case SOUND_MIXER_WRITE_CD
:
1992 IOCTL_IN(arg
, data
);
1995 case SOUND_MIXER_READ_CD
:
1996 rc
= IOCTL_OUT(arg
, cd_lev
);
1998 case SOUND_MIXER_WRITE_RECLEV
:
1999 IOCTL_IN(arg
, data
);
2002 case SOUND_MIXER_READ_RECLEV
:
2003 rc
= IOCTL_OUT(arg
, rec_lev
);
2005 case MIXER_WRITE(SOUND_MIXER_MONITOR
):
2006 IOCTL_IN(arg
, data
);
2007 do_passthru_vol(data
) ;
2009 case MIXER_READ(SOUND_MIXER_MONITOR
):
2010 rc
= IOCTL_OUT(arg
, passthru_vol
);
2019 static void awacs_mixer_init(void)
2021 awacs_volume_setter(line_vol
, 2, 0, 6);
2023 awacs_enable_amp(spk_vol
);
2025 (void)awacs_volume_setter(spk_vol
, 4, MASK_CMUTE
, 6);
2026 do_line_lev(line_lev
) ;
2027 do_ip_gain(ip_gain
) ;
2028 do_mic_lev(mic_lev
) ;
2030 do_rec_lev(rec_lev
) ;
2031 do_passthru_vol(passthru_vol
) ;
2034 static int burgundy_mixer_ioctl(u_int cmd
, u_long arg
)
2039 /* We are, we are, we are... Burgundy or better */
2041 case SOUND_MIXER_READ_DEVMASK
:
2042 data
= SOUND_MASK_VOLUME
| SOUND_MASK_CD
|
2043 SOUND_MASK_LINE
| SOUND_MASK_MIC
|
2044 SOUND_MASK_SPEAKER
| SOUND_MASK_ALTPCM
;
2045 rc
= IOCTL_OUT(arg
, data
);
2047 case SOUND_MIXER_READ_RECMASK
:
2048 data
= SOUND_MASK_LINE
| SOUND_MASK_MIC
2050 rc
= IOCTL_OUT(arg
, data
);
2052 case SOUND_MIXER_READ_RECSRC
:
2054 if (awacs_reg
[0] & MASK_MUX_AUDIN
)
2055 data
|= SOUND_MASK_LINE
;
2056 if (awacs_reg
[0] & MASK_MUX_MIC
)
2057 data
|= SOUND_MASK_MIC
;
2058 if (awacs_reg
[0] & MASK_MUX_CD
)
2059 data
|= SOUND_MASK_CD
;
2060 rc
= IOCTL_OUT(arg
, data
);
2062 case SOUND_MIXER_WRITE_RECSRC
:
2063 IOCTL_IN(arg
, data
);
2064 data
&= (SOUND_MASK_LINE
2065 | SOUND_MASK_MIC
| SOUND_MASK_CD
);
2066 awacs_reg
[0] &= ~(MASK_MUX_CD
| MASK_MUX_MIC
2068 if (data
& SOUND_MASK_LINE
)
2069 awacs_reg
[0] |= MASK_MUX_AUDIN
;
2070 if (data
& SOUND_MASK_MIC
)
2071 awacs_reg
[0] |= MASK_MUX_MIC
;
2072 if (data
& SOUND_MASK_CD
)
2073 awacs_reg
[0] |= MASK_MUX_CD
;
2074 awacs_write(awacs_reg
[0] | MASK_ADDR0
);
2075 rc
= IOCTL_OUT(arg
, data
);
2077 case SOUND_MIXER_READ_STEREODEVS
:
2078 data
= SOUND_MASK_VOLUME
| SOUND_MASK_SPEAKER
2079 | SOUND_MASK_RECLEV
| SOUND_MASK_CD
2081 rc
= IOCTL_OUT(arg
, data
);
2083 case SOUND_MIXER_READ_CAPS
:
2084 rc
= IOCTL_OUT(arg
, 0);
2086 case SOUND_MIXER_WRITE_VOLUME
:
2087 IOCTL_IN(arg
, data
);
2088 awacs_burgundy_write_mvolume(MASK_ADDR_BURGUNDY_MASTER_VOLUME
, data
);
2090 case SOUND_MIXER_READ_VOLUME
:
2091 rc
= IOCTL_OUT(arg
, awacs_burgundy_read_mvolume(MASK_ADDR_BURGUNDY_MASTER_VOLUME
));
2093 case SOUND_MIXER_WRITE_SPEAKER
:
2094 IOCTL_IN(arg
, data
);
2095 if (!(data
& 0xff)) {
2096 /* Mute the left speaker */
2097 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES
,
2098 awacs_burgundy_rcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES
) & ~0x2);
2100 /* Unmute the left speaker */
2101 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES
,
2102 awacs_burgundy_rcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES
) | 0x2);
2104 if (!(data
& 0xff00)) {
2105 /* Mute the right speaker */
2106 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES
,
2107 awacs_burgundy_rcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES
) & ~0x4);
2109 /* Unmute the right speaker */
2110 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES
,
2111 awacs_burgundy_rcb(MASK_ADDR_BURGUNDY_MORE_OUTPUTENABLES
) | 0x4);
2114 data
= (((data
&0xff)*16)/100 > 0xf ? 0xf :
2115 (((data
&0xff)*16)/100)) +
2116 ((((data
>>8)*16)/100 > 0xf ? 0xf :
2117 ((((data
>>8)*16)/100)))<<4);
2119 awacs_burgundy_wcb(MASK_ADDR_BURGUNDY_ATTENSPEAKER
, ~data
);
2121 case SOUND_MIXER_READ_SPEAKER
:
2122 data
= awacs_burgundy_rcb(MASK_ADDR_BURGUNDY_ATTENSPEAKER
);
2123 data
= (((data
& 0xf)*100)/16) + ((((data
>>4)*100)/16)<<8);
2124 rc
= IOCTL_OUT(arg
, (~data
) & 0x0000ffff);
2126 case SOUND_MIXER_WRITE_ALTPCM
: /* really bell volume */
2127 IOCTL_IN(arg
, data
);
2128 beep_vol
= data
& 0xff;
2130 case SOUND_MIXER_READ_ALTPCM
:
2131 rc
= IOCTL_OUT(arg
, beep_vol
);
2133 case SOUND_MIXER_WRITE_LINE
:
2134 IOCTL_IN(arg
, data
);
2135 awacs_burgundy_write_volume(MASK_ADDR_BURGUNDY_VOLLINE
, data
);
2138 case SOUND_MIXER_READ_LINE
:
2139 data
= awacs_burgundy_read_volume(MASK_ADDR_BURGUNDY_VOLLINE
);
2140 rc
= IOCTL_OUT(arg
, data
);
2142 case SOUND_MIXER_WRITE_MIC
:
2143 IOCTL_IN(arg
, data
);
2144 /* Mic is mono device */
2145 data
= (data
<< 8) + (data
<< 24);
2146 awacs_burgundy_write_volume(MASK_ADDR_BURGUNDY_VOLMIC
, data
);
2148 case SOUND_MIXER_READ_MIC
:
2149 data
= awacs_burgundy_read_volume(MASK_ADDR_BURGUNDY_VOLMIC
);
2151 rc
= IOCTL_OUT(arg
, data
);
2153 case SOUND_MIXER_WRITE_CD
:
2154 IOCTL_IN(arg
, data
);
2155 awacs_burgundy_write_volume(MASK_ADDR_BURGUNDY_VOLCD
, data
);
2157 case SOUND_MIXER_READ_CD
:
2158 data
= awacs_burgundy_read_volume(MASK_ADDR_BURGUNDY_VOLCD
);
2159 rc
= IOCTL_OUT(arg
, data
);
2161 case SOUND_MIXER_WRITE_RECLEV
:
2162 IOCTL_IN(arg
, data
);
2163 data
= awacs_volume_setter(data
, 0, 0, 4);
2164 rc
= IOCTL_OUT(arg
, data
);
2166 case SOUND_MIXER_READ_RECLEV
:
2167 data
= awacs_get_volume(awacs_reg
[0], 4);
2168 rc
= IOCTL_OUT(arg
, data
);
2170 case SOUND_MIXER_OUTMASK
:
2171 case SOUND_MIXER_OUTSRC
:
2179 static int daca_mixer_ioctl(u_int cmd
, u_long arg
)
2184 /* And the DACA's no genius either! */
2187 case SOUND_MIXER_READ_DEVMASK
:
2188 data
= SOUND_MASK_VOLUME
;
2189 rc
= IOCTL_OUT(arg
, data
);
2191 case SOUND_MIXER_READ_RECMASK
:
2193 rc
= IOCTL_OUT(arg
, data
);
2195 case SOUND_MIXER_READ_RECSRC
:
2197 rc
= IOCTL_OUT(arg
, data
);
2199 case SOUND_MIXER_WRITE_RECSRC
:
2200 IOCTL_IN(arg
, data
);
2202 rc
= IOCTL_OUT(arg
, data
);
2204 case SOUND_MIXER_READ_STEREODEVS
:
2205 data
= SOUND_MASK_VOLUME
;
2206 rc
= IOCTL_OUT(arg
, data
);
2208 case SOUND_MIXER_READ_CAPS
:
2209 rc
= IOCTL_OUT(arg
, 0);
2211 case SOUND_MIXER_WRITE_VOLUME
:
2212 IOCTL_IN(arg
, data
);
2213 daca_set_volume(data
, data
);
2215 case SOUND_MIXER_READ_VOLUME
:
2216 daca_get_volume(& data
, &data
);
2217 rc
= IOCTL_OUT(arg
, data
);
2219 case SOUND_MIXER_OUTMASK
:
2220 case SOUND_MIXER_OUTSRC
:
2227 static int PMacMixerIoctl(u_int cmd
, u_long arg
)
2231 /* Different IOCTLS for burgundy and, eventually, DACA & Tumbler */
2235 switch (awacs_revision
){
2236 case AWACS_BURGUNDY
:
2237 rc
= burgundy_mixer_ioctl(cmd
, arg
);
2240 rc
= daca_mixer_ioctl(cmd
, arg
);
2244 rc
= tas_mixer_ioctl(cmd
, arg
);
2247 rc
= awacs_mixer_ioctl(cmd
, arg
);
2255 static void PMacMixerInit(void)
2257 switch (awacs_revision
) {
2259 printk("AE-Init tumbler mixer\n");
2262 printk("AE-Init snapper mixer\n");
2265 case AWACS_BURGUNDY
:
2266 break ; /* don't know yet */
2268 case AWACS_SCREAMER
:
2270 awacs_mixer_init() ;
2275 /* Write/Read sq setup functions:
2276 Check to see if we have enough (or any) dbdma cmd buffers for the
2277 user's fragment settings. If not, allocate some. If this fails we will
2278 point at the beep buffer - as an emergency provision - to stop dma tromping
2279 on some random bit of memory (if someone lets it go anyway).
2280 The command buffers are then set up to point to the fragment buffers
2281 (allocated elsewhere). We need n+1 commands the last of which holds
2282 a NOP + loop to start.
2285 static int PMacWriteSqSetup(void)
2287 int i
, count
= 600 ;
2288 volatile struct dbdma_cmd
*cp
;
2292 /* stop the controller from doing any output - if it isn't already.
2293 it _should_ be before this is called anyway */
2295 out_le32(&awacs_txdma
->control
, (RUN
|PAUSE
|FLUSH
|WAKE
) << 16);
2296 while ((in_le32(&awacs_txdma
->status
) & RUN
) && count
--)
2298 #ifdef DEBUG_DMASOUND
2300 printk("dmasound_pmac: write sq setup: timeout waiting for dma to stop\n");
2303 if ((write_sq
.max_count
+ 1) > number_of_tx_cmd_buffers
) {
2304 if (awacs_tx_cmd_space
)
2305 kfree(awacs_tx_cmd_space
);
2306 number_of_tx_cmd_buffers
= 0;
2308 /* we need nbufs + 1 (for the loop) and we should request + 1
2309 again because the DBDMA_ALIGN might pull the start up by up
2310 to sizeof(struct dbdma_cmd) - 4.
2313 awacs_tx_cmd_space
= kmalloc
2314 ((write_sq
.max_count
+ 1 + 1) * sizeof(struct dbdma_cmd
),
2316 if (awacs_tx_cmd_space
== NULL
) {
2317 /* don't leave it dangling - nasty but better than a
2319 out_le32(&awacs_txdma
->cmdptr
, virt_to_bus(beep_dbdma_cmd
));
2321 "dmasound_pmac: can't allocate dbdma cmd buffers"
2322 ", driver disabled\n");
2326 awacs_tx_cmds
= (volatile struct dbdma_cmd
*)
2327 DBDMA_ALIGN(awacs_tx_cmd_space
);
2328 number_of_tx_cmd_buffers
= write_sq
.max_count
+ 1;
2332 memset((void *)cp
, 0, (write_sq
.max_count
+1) * sizeof(struct dbdma_cmd
));
2333 for (i
= 0; i
< write_sq
.max_count
; ++i
, ++cp
) {
2334 st_le32(&cp
->phy_addr
, virt_to_bus(write_sq
.buffers
[i
]));
2336 st_le16(&cp
->command
, DBDMA_NOP
+ BR_ALWAYS
);
2337 st_le32(&cp
->cmd_dep
, virt_to_bus(awacs_tx_cmds
));
2338 /* point the controller at the command stack - ready to go */
2339 out_le32(&awacs_txdma
->cmdptr
, virt_to_bus(awacs_tx_cmds
));
2344 static int PMacReadSqSetup(void)
2347 volatile struct dbdma_cmd
*cp
;
2351 /* stop the controller from doing any input - if it isn't already.
2352 it _should_ be before this is called anyway */
2354 out_le32(&awacs_rxdma
->control
, (RUN
|PAUSE
|FLUSH
|WAKE
) << 16);
2355 while ((in_le32(&awacs_rxdma
->status
) & RUN
) && count
--)
2357 #ifdef DEBUG_DMASOUND
2359 printk("dmasound_pmac: read sq setup: timeout waiting for dma to stop\n");
2362 if ((read_sq
.max_count
+1) > number_of_rx_cmd_buffers
) {
2363 if (awacs_rx_cmd_space
)
2364 kfree(awacs_rx_cmd_space
);
2365 number_of_rx_cmd_buffers
= 0;
2367 /* we need nbufs + 1 (for the loop) and we should request + 1 again
2368 because the DBDMA_ALIGN might pull the start up by up to
2369 sizeof(struct dbdma_cmd) - 4 (assuming kmalloc aligns 32 bits).
2372 awacs_rx_cmd_space
= kmalloc
2373 ((read_sq
.max_count
+ 1 + 1) * sizeof(struct dbdma_cmd
),
2375 if (awacs_rx_cmd_space
== NULL
) {
2376 /* don't leave it dangling - nasty but better than a
2378 out_le32(&awacs_rxdma
->cmdptr
, virt_to_bus(beep_dbdma_cmd
));
2380 "dmasound_pmac: can't allocate dbdma cmd buffers"
2381 ", driver disabled\n");
2385 awacs_rx_cmds
= (volatile struct dbdma_cmd
*)
2386 DBDMA_ALIGN(awacs_rx_cmd_space
);
2387 number_of_rx_cmd_buffers
= read_sq
.max_count
+ 1 ;
2390 memset((void *)cp
, 0, (read_sq
.max_count
+1) * sizeof(struct dbdma_cmd
));
2392 /* Set dma buffers up in a loop */
2393 for (i
= 0; i
< read_sq
.max_count
; i
++,cp
++) {
2394 st_le32(&cp
->phy_addr
, virt_to_bus(read_sq
.buffers
[i
]));
2395 st_le16(&cp
->command
, INPUT_MORE
+ INTR_ALWAYS
);
2396 st_le16(&cp
->req_count
, read_sq
.block_size
);
2397 st_le16(&cp
->xfer_status
, 0);
2400 /* The next two lines make the thing loop around.
2402 st_le16(&cp
->command
, DBDMA_NOP
+ BR_ALWAYS
);
2403 st_le32(&cp
->cmd_dep
, virt_to_bus(awacs_rx_cmds
));
2404 /* point the controller at the command stack - ready to go */
2405 out_le32(&awacs_rxdma
->cmdptr
, virt_to_bus(awacs_rx_cmds
));
2411 /* TODO: this needs work to guarantee that when it returns DMA has stopped
2412 but in a more elegant way than is done here....
2415 static void PMacAbortRead(void)
2418 volatile struct dbdma_cmd
*cp
;
2421 /* give it a chance to update the output and provide the IRQ
2425 out_le32(&awacs_rxdma
->control
, ((FLUSH
) << 16) + FLUSH
);
2428 for (i
= 0; i
< read_sq
.max_count
; i
++,cp
++)
2429 st_le16(&cp
->command
, DBDMA_STOP
);
2431 * We should probably wait for the thing to stop before we
2432 * release the memory.
2435 msleep(100) ; /* give it a (small) chance to act */
2437 /* apply the sledgehammer approach - just stop it now */
2439 out_le32(&awacs_rxdma
->control
, (RUN
|PAUSE
|FLUSH
|WAKE
) << 16);
2443 extern char *get_afmt_string(int);
2444 static int PMacStateInfo(char *b
, size_t sp
)
2447 len
= sprintf(b
,"HW rates: ");
2448 switch (awacs_revision
){
2450 case AWACS_BURGUNDY
:
2451 len
+= sprintf(b
,"44100 ") ;
2455 for (i
=0; i
<1; i
++){
2456 if (tas_freqs_ok
[i
])
2457 len
+= sprintf(b
+len
,"%d ", tas_freqs
[i
]) ;
2461 case AWACS_SCREAMER
:
2463 for (i
=0; i
<8; i
++){
2464 if (awacs_freqs_ok
[i
])
2465 len
+= sprintf(b
+len
,"%d ", awacs_freqs
[i
]) ;
2469 len
+= sprintf(b
+len
,"s/sec\n") ;
2471 len
+= sprintf(b
+len
,"HW AFMTS: ");
2474 if (i
& dmasound
.mach
.hardware_afmts
)
2475 len
+= sprintf(b
+len
,"%s ",
2476 get_afmt_string(i
& dmasound
.mach
.hardware_afmts
));
2479 len
+= sprintf(b
+len
,"\n") ;
2484 /*** Machine definitions *****************************************************/
2486 static SETTINGS def_hard
= {
2487 .format
= AFMT_S16_BE
,
2493 static SETTINGS def_soft
= {
2494 .format
= AFMT_S16_BE
,
2500 static MACHINE machPMac
= {
2502 .name2
= "PowerMac Built-in Sound",
2503 .owner
= THIS_MODULE
,
2504 .dma_alloc
= PMacAlloc
,
2505 .dma_free
= PMacFree
,
2506 .irqinit
= PMacIrqInit
,
2508 .irqcleanup
= PMacIrqCleanup
,
2511 .silence
= PMacSilence
,
2512 .setFormat
= PMacSetFormat
,
2513 .setVolume
= PMacSetVolume
,
2515 .record
= NULL
, /* default to no record */
2516 .mixer_init
= PMacMixerInit
,
2517 .mixer_ioctl
= PMacMixerIoctl
,
2518 .write_sq_setup
= PMacWriteSqSetup
,
2519 .read_sq_setup
= PMacReadSqSetup
,
2520 .state_info
= PMacStateInfo
,
2521 .abort_read
= PMacAbortRead
,
2522 .min_dsp_speed
= 7350,
2523 .max_dsp_speed
= 44100,
2524 .version
= ((DMASOUND_AWACS_REVISION
<<8) + DMASOUND_AWACS_EDITION
)
2528 /*** Config & Setup **********************************************************/
2530 /* Check for pmac models that we care about in terms of special actions.
2536 /* portables/lap-tops */
2538 if (machine_is_compatible("AAPL,3400/2400") ||
2539 machine_is_compatible("AAPL,3500")) {
2542 if (machine_is_compatible("PowerBook1,1") || /* lombard */
2543 machine_is_compatible("AAPL,PowerBook1998")){ /* wallstreet */
2549 /* Get the OF node that tells us about the registers, interrupts etc. to use
2552 On most machines the sound IO OF node is the 'davbus' node. On newer pmacs
2553 with DACA (& Tumbler) the node to use is i2s-a. On much older machines i.e.
2554 before 9500 there is no davbus node and we have to use the 'awacs' property.
2556 In the latter case we signal this by setting the codec value - so that the
2557 code that looks for chip properties knows how to go about it.
2560 static struct device_node
* __init
2561 get_snd_io_node(void)
2563 struct device_node
*np
= NULL
;
2565 /* set up awacs_node for early OF which doesn't have a full set of
2566 * properties on davbus
2569 awacs_node
= find_devices("awacs");
2571 awacs_revision
= AWACS_AWACS
;
2573 /* powermac models after 9500 (other than those which use DACA or
2574 * Tumbler) have a node called "davbus".
2576 np
= find_devices("davbus");
2578 * if we didn't find a davbus device, try 'i2s-a' since
2579 * this seems to be what iBooks (& Tumbler) have.
2582 np
= i2s_node
= find_devices("i2s-a");
2584 /* if we didn't find this - perhaps we are on an early model
2585 * which _only_ has an 'awacs' node
2587 if (np
== NULL
&& awacs_node
)
2590 /* if we failed all these return null - this will cause the
2591 * driver to give up...
2596 /* Get the OF node that contains the info about the sound chip, inputs s-rates
2598 This node does not exist (or contains much reduced info) on earlier machines
2599 we have to deduce the info other ways for these.
2602 static struct device_node
* __init
2603 get_snd_info_node(struct device_node
*io
)
2605 struct device_node
*info
;
2607 info
= find_devices("sound");
2608 while (info
&& info
->parent
!= io
)
2613 /* Find out what type of codec we have.
2617 get_codec_type(struct device_node
*info
)
2619 /* already set if pre-davbus model and info will be NULL */
2620 int codec
= awacs_revision
;
2623 /* must do awacs first to allow screamer to overide it */
2624 if (device_is_compatible(info
, "awacs"))
2625 codec
= AWACS_AWACS
;
2626 if (device_is_compatible(info
, "screamer"))
2627 codec
= AWACS_SCREAMER
;
2628 if (device_is_compatible(info
, "burgundy"))
2629 codec
= AWACS_BURGUNDY
;
2630 if (device_is_compatible(info
, "daca"))
2632 if (device_is_compatible(info
, "tumbler"))
2633 codec
= AWACS_TUMBLER
;
2634 if (device_is_compatible(info
, "snapper"))
2635 codec
= AWACS_SNAPPER
;
2640 /* find out what type, if any, of expansion card we have
2643 get_expansion_type(void)
2645 if (find_devices("perch") != NULL
)
2648 if (find_devices("pb-ziva-pc") != NULL
)
2650 /* need to work out how we deal with iMac SRS module */
2653 /* set up frame rates.
2654 * I suspect that these routines don't quite go about it the right way:
2655 * - where there is more than one rate - I think that the first property
2656 * value is the number of rates.
2657 * TODO: check some more device trees and modify accordingly
2658 * Set dmasound.mach.max_dsp_rate on the basis of these routines.
2662 awacs_init_frame_rates(unsigned int *prop
, unsigned int l
)
2667 awacs_freqs_ok
[i
] = 0 ;
2668 for (l
/= sizeof(int); l
> 0; --l
) {
2669 unsigned int r
= *prop
++;
2670 /* Apple 'Fixed' format */
2673 for (i
= 0; i
< 8; ++i
) {
2674 if (r
== awacs_freqs
[i
]) {
2675 awacs_freqs_ok
[i
] = 1;
2681 /* else we assume that all the rates are available */
2685 burgundy_init_frame_rates(unsigned int *prop
, unsigned int l
)
2690 for (l
/= sizeof(int); l
> 0; --l
) {
2691 unsigned int r
= *prop
++;
2692 /* Apple 'Fixed' format */
2699 #ifdef DEBUG_DMASOUND
2702 printk("dmasound_pmac: burgundy with multiple frame rates\n");
2704 printk("%d ", temp
[j
]) ;
2711 daca_init_frame_rates(unsigned int *prop
, unsigned int l
)
2716 for (l
/= sizeof(int); l
> 0; --l
) {
2717 unsigned int r
= *prop
++;
2718 /* Apple 'Fixed' format */
2726 #ifdef DEBUG_DMASOUND
2729 printk("dmasound_pmac: DACA with multiple frame rates\n");
2731 printk("%d ", temp
[j
]) ;
2738 init_frame_rates(unsigned int *prop
, unsigned int l
)
2740 switch (awacs_revision
) {
2743 tas_init_frame_rates(prop
, l
);
2746 daca_init_frame_rates(prop
, l
);
2748 case AWACS_BURGUNDY
:
2749 burgundy_init_frame_rates(prop
, l
);
2752 awacs_init_frame_rates(prop
, l
);
2757 /* find things/machines that can't do mac-io byteswap
2761 set_hw_byteswap(struct device_node
*io
)
2763 struct device_node
*mio
;
2764 unsigned int kl
= 0 ;
2766 /* if seems that Keylargo can't byte-swap */
2768 for (mio
= io
->parent
; mio
; mio
= mio
->parent
) {
2769 if (strcmp(mio
->name
, "mac-io") == 0) {
2770 if (device_is_compatible(mio
, "Keylargo"))
2775 hw_can_byteswap
= !kl
;
2778 /* Allocate the resources necessary for beep generation. This cannot be (quite)
2779 done statically (yet) because we cannot do virt_to_bus() on static vars when
2780 the code is loaded as a module.
2782 for the sake of saving the possibility that two allocations will incur the
2783 overhead of two pull-ups in DBDMA_ALIGN() we allocate the 'emergency' dmdma
2784 command here as well... even tho' it is not part of the beep process.
2788 __init
setup_beep(void)
2790 /* Initialize beep stuff */
2791 /* want one cmd buffer for beeps, and a second one for emergencies
2792 - i.e. dbdma error conditions.
2793 ask for three to allow for pull up in DBDMA_ALIGN().
2795 beep_dbdma_cmd_space
=
2796 kmalloc((2 + 1) * sizeof(struct dbdma_cmd
), GFP_KERNEL
);
2797 if(beep_dbdma_cmd_space
== NULL
) {
2798 printk(KERN_ERR
"dmasound_pmac: no beep dbdma cmd space\n") ;
2801 beep_dbdma_cmd
= (volatile struct dbdma_cmd
*)
2802 DBDMA_ALIGN(beep_dbdma_cmd_space
);
2803 /* set up emergency dbdma cmd */
2804 emergency_dbdma_cmd
= beep_dbdma_cmd
+1 ;
2805 beep_buf
= (short *) kmalloc(BEEP_BUFLEN
* 4, GFP_KERNEL
);
2806 if (beep_buf
== NULL
) {
2807 printk(KERN_ERR
"dmasound_pmac: no memory for beep buffer\n");
2808 if( beep_dbdma_cmd_space
) kfree(beep_dbdma_cmd_space
) ;
2814 static struct input_dev awacs_beep_dev
= {
2815 .evbit
= { BIT(EV_SND
) },
2816 .sndbit
= { BIT(SND_BELL
) | BIT(SND_TONE
) },
2817 .event
= awacs_beep_event
,
2818 .name
= "dmasound beeper",
2819 .phys
= "macio/input0", /* what the heck is this?? */
2821 .bustype
= BUS_HOST
,
2825 int __init
dmasound_awacs_init(void)
2827 struct device_node
*io
= NULL
, *info
= NULL
;
2830 if (_machine
!= _MACH_Pmac
)
2835 hw_can_byteswap
= 1 ; /* most can */
2837 /* look for models we need to handle specially */
2840 /* find the OF node that tells us about the dbdma stuff
2842 io
= get_snd_io_node();
2844 #ifdef DEBUG_DMASOUND
2845 printk("dmasound_pmac: couldn't find sound io OF node\n");
2850 /* find the OF node that tells us about the sound sub-system
2851 * this doesn't exist on pre-davbus machines (earlier than 9500)
2853 if (awacs_revision
!= AWACS_AWACS
) { /* set for pre-davbus */
2854 info
= get_snd_info_node(io
) ;
2856 #ifdef DEBUG_DMASOUND
2857 printk("dmasound_pmac: couldn't find 'sound' OF node\n");
2863 awacs_revision
= get_codec_type(info
) ;
2864 if (awacs_revision
== 0) {
2865 #ifdef DEBUG_DMASOUND
2866 printk("dmasound_pmac: couldn't find a Codec we can handle\n");
2868 return -ENODEV
; /* we don't know this type of h/w */
2871 /* set up perch, ziva, SRS or whatever else we have as sound
2874 get_expansion_type();
2876 /* we've now got enough information to make up the audio topology.
2877 * we will map the sound part of mac-io now so that we can probe for
2878 * other info if necessary (early AWACS we want to read chip ids)
2881 if (io
->n_addrs
< 3 || io
->n_intrs
< 3) {
2882 /* OK - maybe we need to use the 'awacs' node (on earlier
2887 if (io
->n_addrs
< 3 || io
->n_intrs
< 3) {
2888 printk("dmasound_pmac: can't use %s"
2889 " (%d addrs, %d intrs)\n",
2890 io
->full_name
, io
->n_addrs
, io
->n_intrs
);
2894 printk("dmasound_pmac: can't use %s (%d addrs, %d intrs)\n",
2895 io
->full_name
, io
->n_addrs
, io
->n_intrs
);
2899 if (!request_OF_resource(io
, 0, NULL
)) {
2900 printk(KERN_ERR
"dmasound: can't request IO resource !\n");
2903 if (!request_OF_resource(io
, 1, " (tx dma)")) {
2904 release_OF_resource(io
, 0);
2905 printk(KERN_ERR
"dmasound: can't request TX DMA resource !\n");
2909 if (!request_OF_resource(io
, 2, " (rx dma)")) {
2910 release_OF_resource(io
, 0);
2911 release_OF_resource(io
, 1);
2912 printk(KERN_ERR
"dmasound: can't request RX DMA resource !\n");
2916 /* all OF versions I've seen use this value */
2918 i2s
= ioremap(io
->addrs
[0].address
, 0x1000);
2920 awacs
= ioremap(io
->addrs
[0].address
, 0x1000);
2921 awacs_txdma
= ioremap(io
->addrs
[1].address
, 0x100);
2922 awacs_rxdma
= ioremap(io
->addrs
[2].address
, 0x100);
2924 /* first of all make sure that the chip is powered up....*/
2925 pmac_call_feature(PMAC_FTR_SOUND_CHIP_ENABLE
, io
, 0, 1);
2926 if (awacs_revision
== AWACS_SCREAMER
&& awacs
)
2927 awacs_recalibrate();
2929 awacs_irq
= io
->intrs
[0].line
;
2930 awacs_tx_irq
= io
->intrs
[1].line
;
2931 awacs_rx_irq
= io
->intrs
[2].line
;
2933 /* Hack for legacy crap that will be killed someday */
2936 /* if we have an awacs or screamer - probe the chip to make
2937 * sure we have the right revision.
2940 if (awacs_revision
<= AWACS_SCREAMER
){
2941 uint32_t temp
, rev
, mfg
;
2942 /* find out the awacs revision from the chip */
2943 temp
= in_le32(&awacs
->codec_stat
);
2944 rev
= (temp
>> 12) & 0xf;
2945 mfg
= (temp
>> 8) & 0xf;
2946 #ifdef DEBUG_DMASOUND
2947 printk("dmasound_pmac: Awacs/Screamer Codec Mfct: %d Rev %d\n", mfg
, rev
);
2949 if (rev
>= AWACS_SCREAMER
)
2950 awacs_revision
= AWACS_SCREAMER
;
2952 awacs_revision
= rev
;
2955 dmasound
.mach
= machPMac
;
2957 /* find out other bits & pieces from OF, these may be present
2958 only on some models ... so be careful.
2961 /* in the absence of a frame rates property we will use the defaults
2965 unsigned int *prop
, l
;
2967 sound_device_id
= 0;
2968 /* device ID appears post g3 b&w */
2969 prop
= (unsigned int *)get_property(info
, "device-id", NULL
);
2971 sound_device_id
= *prop
;
2973 /* look for a property saying what sample rates
2976 prop
= (unsigned int *)get_property(info
, "sample-rates", &l
);
2978 prop
= (unsigned int *) get_property
2979 (info
, "output-frame-rates", &l
);
2981 /* if it's there use it to set up frame rates */
2982 init_frame_rates(prop
, l
) ;
2986 out_le32(&awacs
->control
, 0x11); /* set everything quiesent */
2988 set_hw_byteswap(io
) ; /* figure out if the h/w can do it */
2991 /* get default volume from nvram */
2992 vol
= ((pmac_xpram_read( 8 ) & 7 ) << 1 );
2997 /* set up tracking values */
2998 spk_vol
= vol
* 100 ;
2999 spk_vol
/= 7 ; /* get set value to a percentage */
3000 spk_vol
|= (spk_vol
<< 8) ; /* equal left & right */
3001 line_vol
= passthru_vol
= spk_vol
;
3003 /* fill regs that are shared between AWACS & Burgundy */
3005 awacs_reg
[2] = vol
+ (vol
<< 6);
3006 awacs_reg
[4] = vol
+ (vol
<< 6);
3007 awacs_reg
[5] = vol
+ (vol
<< 6); /* screamer has loopthru vol control */
3008 awacs_reg
[6] = 0; /* maybe should be vol << 3 for PCMCIA speaker */
3011 awacs_reg
[0] = MASK_MUX_CD
;
3012 awacs_reg
[1] = MASK_LOOPTHRU
;
3014 /* FIXME: Only machines with external SRS module need MASK_PAROUT */
3015 if (has_perch
|| sound_device_id
== 0x5
3016 || /*sound_device_id == 0x8 ||*/ sound_device_id
== 0xb)
3017 awacs_reg
[1] |= MASK_PAROUT0
| MASK_PAROUT1
;
3019 switch (awacs_revision
) {
3021 tas_register_driver(&tas3001c_hooks
);
3022 tas_init(I2C_DRIVERID_TAS3001C
, I2C_DRIVERNAME_TAS3001C
);
3023 tas_dmasound_init();
3027 tas_register_driver(&tas3004_hooks
);
3028 tas_init(I2C_DRIVERID_TAS3004
,I2C_DRIVERNAME_TAS3004
);
3029 tas_dmasound_init();
3035 case AWACS_BURGUNDY
:
3036 awacs_burgundy_init();
3038 case AWACS_SCREAMER
:
3045 /* enable/set-up external modules - when we know how */
3048 awacs_enable_amp(100 * 0x101);
3050 /* Reset dbdma channels */
3051 out_le32(&awacs_txdma
->control
, (RUN
|PAUSE
|FLUSH
|WAKE
|DEAD
) << 16);
3052 while (in_le32(&awacs_txdma
->status
) & RUN
)
3054 out_le32(&awacs_rxdma
->control
, (RUN
|PAUSE
|FLUSH
|WAKE
|DEAD
) << 16);
3055 while (in_le32(&awacs_rxdma
->status
) & RUN
)
3058 /* Initialize beep stuff */
3059 if ((res
=setup_beep()))
3062 #ifdef CONFIG_PMAC_PBOOK
3063 pmu_register_sleep_notifier(&awacs_sleep_notifier
);
3064 #endif /* CONFIG_PMAC_PBOOK */
3066 /* Powerbooks have odd ways of enabling inputs such as
3067 an expansion-bay CD or sound from an internal modem
3068 or a PC-card modem. */
3069 if (is_pbook_3X00
) {
3071 * Enable CD and PC-card sound inputs.
3072 * This is done by reading from address
3073 * f301a000, + 0x10 to enable the expansion-bay
3074 * CD sound input, + 0x80 to enable the PC-card
3075 * sound input. The 0x100 enables the SCSI bus
3078 latch_base
= ioremap (0xf301a000, 0x1000);
3079 in_8(latch_base
+ 0x190);
3081 } else if (is_pbook_g3
) {
3082 struct device_node
* mio
;
3084 for (mio
= io
->parent
; mio
; mio
= mio
->parent
) {
3085 if (strcmp(mio
->name
, "mac-io") == 0
3086 && mio
->n_addrs
> 0) {
3087 macio_base
= ioremap(mio
->addrs
[0].address
, 0x40);
3092 * Enable CD sound input.
3093 * The relevant bits for writing to this byte are 0x8f.
3094 * I haven't found out what the 0x80 bit does.
3095 * For the 0xf bits, writing 3 or 7 enables the CD
3096 * input, any other value disables it. Values
3097 * 1, 3, 5, 7 enable the microphone. Values 0, 2,
3098 * 4, 6, 8 - f enable the input from the modem.
3102 out_8(macio_base
+ 0x37, 3);
3105 if (hw_can_byteswap
)
3106 dmasound
.mach
.hardware_afmts
= (AFMT_S16_BE
| AFMT_S16_LE
) ;
3108 dmasound
.mach
.hardware_afmts
= AFMT_S16_BE
;
3110 /* shut out chips that do output only.
3111 * may need to extend this to machines which have no inputs - even tho'
3112 * they use screamer - IIRC one of the powerbooks is like this.
3115 if (awacs_revision
!= AWACS_DACA
) {
3116 dmasound
.mach
.capabilities
= DSP_CAP_DUPLEX
;
3117 dmasound
.mach
.record
= PMacRecord
;
3120 dmasound
.mach
.default_hard
= def_hard
;
3121 dmasound
.mach
.default_soft
= def_soft
;
3123 switch (awacs_revision
) {
3124 case AWACS_BURGUNDY
:
3125 sprintf(awacs_name
, "PowerMac Burgundy ") ;
3128 sprintf(awacs_name
, "PowerMac DACA ") ;
3131 sprintf(awacs_name
, "PowerMac Tumbler ") ;
3134 sprintf(awacs_name
, "PowerMac Snapper ") ;
3136 case AWACS_SCREAMER
:
3137 sprintf(awacs_name
, "PowerMac Screamer ") ;
3141 sprintf(awacs_name
, "PowerMac AWACS rev %d ", awacs_revision
) ;
3146 * XXX: we should handle errors here, but that would mean
3147 * rewriting the whole init code. later..
3149 input_register_device(&awacs_beep_dev
);
3151 return dmasound_init();
3154 static void __exit
dmasound_awacs_cleanup(void)
3156 input_unregister_device(&awacs_beep_dev
);
3158 switch (awacs_revision
) {
3161 tas_dmasound_cleanup();
3172 MODULE_DESCRIPTION("PowerMac built-in audio driver.");
3173 MODULE_LICENSE("GPL");
3175 module_init(dmasound_awacs_init
);
3176 module_exit(dmasound_awacs_cleanup
);