1*1da177e4SLinus Torvalds /* 2*1da177e4SLinus Torvalds * Driver for PowerMac onboard soundchips 3*1da177e4SLinus Torvalds * Copyright (c) 2001 by Takashi Iwai <tiwai@suse.de> 4*1da177e4SLinus Torvalds * based on dmasound.c. 5*1da177e4SLinus Torvalds * 6*1da177e4SLinus Torvalds * This program is free software; you can redistribute it and/or modify 7*1da177e4SLinus Torvalds * it under the terms of the GNU General Public License as published by 8*1da177e4SLinus Torvalds * the Free Software Foundation; either version 2 of the License, or 9*1da177e4SLinus Torvalds * (at your option) any later version. 10*1da177e4SLinus Torvalds * 11*1da177e4SLinus Torvalds * This program is distributed in the hope that it will be useful, 12*1da177e4SLinus Torvalds * but WITHOUT ANY WARRANTY; without even the implied warranty of 13*1da177e4SLinus Torvalds * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*1da177e4SLinus Torvalds * GNU General Public License for more details. 15*1da177e4SLinus Torvalds * 16*1da177e4SLinus Torvalds * You should have received a copy of the GNU General Public License 17*1da177e4SLinus Torvalds * along with this program; if not, write to the Free Software 18*1da177e4SLinus Torvalds * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19*1da177e4SLinus Torvalds */ 20*1da177e4SLinus Torvalds 21*1da177e4SLinus Torvalds 22*1da177e4SLinus Torvalds #ifndef __PMAC_H 23*1da177e4SLinus Torvalds #define __PMAC_H 24*1da177e4SLinus Torvalds 25*1da177e4SLinus Torvalds #include <linux/version.h> 26*1da177e4SLinus Torvalds #include <sound/control.h> 27*1da177e4SLinus Torvalds #include <sound/pcm.h> 28*1da177e4SLinus Torvalds #include "awacs.h" 29*1da177e4SLinus Torvalds 30*1da177e4SLinus Torvalds #include <linux/adb.h> 31*1da177e4SLinus Torvalds #ifdef CONFIG_ADB_CUDA 32*1da177e4SLinus Torvalds #include <linux/cuda.h> 33*1da177e4SLinus Torvalds #endif 34*1da177e4SLinus Torvalds #ifdef CONFIG_ADB_PMU 35*1da177e4SLinus Torvalds #include <linux/pmu.h> 36*1da177e4SLinus Torvalds #endif 37*1da177e4SLinus Torvalds #include <linux/nvram.h> 38*1da177e4SLinus Torvalds #include <linux/tty.h> 39*1da177e4SLinus Torvalds #include <linux/vt_kern.h> 40*1da177e4SLinus Torvalds #include <asm/dbdma.h> 41*1da177e4SLinus Torvalds #include <asm/prom.h> 42*1da177e4SLinus Torvalds #include <asm/machdep.h> 43*1da177e4SLinus Torvalds 44*1da177e4SLinus Torvalds /* maximum number of fragments */ 45*1da177e4SLinus Torvalds #define PMAC_MAX_FRAGS 32 46*1da177e4SLinus Torvalds 47*1da177e4SLinus Torvalds 48*1da177e4SLinus Torvalds #define PMAC_SUPPORT_AUTOMUTE 49*1da177e4SLinus Torvalds 50*1da177e4SLinus Torvalds /* 51*1da177e4SLinus Torvalds * typedefs 52*1da177e4SLinus Torvalds */ 53*1da177e4SLinus Torvalds typedef struct snd_pmac pmac_t; 54*1da177e4SLinus Torvalds typedef struct snd_pmac_stream pmac_stream_t; 55*1da177e4SLinus Torvalds typedef struct snd_pmac_beep pmac_beep_t; 56*1da177e4SLinus Torvalds typedef struct snd_pmac_dbdma pmac_dbdma_t; 57*1da177e4SLinus Torvalds 58*1da177e4SLinus Torvalds 59*1da177e4SLinus Torvalds /* 60*1da177e4SLinus Torvalds * DBDMA space 61*1da177e4SLinus Torvalds */ 62*1da177e4SLinus Torvalds struct snd_pmac_dbdma { 63*1da177e4SLinus Torvalds unsigned long addr; 64*1da177e4SLinus Torvalds struct dbdma_cmd __iomem *cmds; 65*1da177e4SLinus Torvalds void *space; 66*1da177e4SLinus Torvalds int size; 67*1da177e4SLinus Torvalds }; 68*1da177e4SLinus Torvalds 69*1da177e4SLinus Torvalds /* 70*1da177e4SLinus Torvalds * playback/capture stream 71*1da177e4SLinus Torvalds */ 72*1da177e4SLinus Torvalds struct snd_pmac_stream { 73*1da177e4SLinus Torvalds int running; /* boolean */ 74*1da177e4SLinus Torvalds 75*1da177e4SLinus Torvalds int stream; /* PLAYBACK/CAPTURE */ 76*1da177e4SLinus Torvalds 77*1da177e4SLinus Torvalds int dma_size; /* in bytes */ 78*1da177e4SLinus Torvalds int period_size; /* in bytes */ 79*1da177e4SLinus Torvalds int buffer_size; /* in kbytes */ 80*1da177e4SLinus Torvalds int nperiods, cur_period; 81*1da177e4SLinus Torvalds 82*1da177e4SLinus Torvalds pmac_dbdma_t cmd; 83*1da177e4SLinus Torvalds volatile struct dbdma_regs __iomem *dma; 84*1da177e4SLinus Torvalds 85*1da177e4SLinus Torvalds snd_pcm_substream_t *substream; 86*1da177e4SLinus Torvalds 87*1da177e4SLinus Torvalds unsigned int cur_freqs; /* currently available frequencies */ 88*1da177e4SLinus Torvalds unsigned int cur_formats; /* currently available formats */ 89*1da177e4SLinus Torvalds }; 90*1da177e4SLinus Torvalds 91*1da177e4SLinus Torvalds 92*1da177e4SLinus Torvalds /* 93*1da177e4SLinus Torvalds */ 94*1da177e4SLinus Torvalds 95*1da177e4SLinus Torvalds enum snd_pmac_model { 96*1da177e4SLinus Torvalds PMAC_AWACS, PMAC_SCREAMER, PMAC_BURGUNDY, PMAC_DACA, PMAC_TUMBLER, PMAC_SNAPPER 97*1da177e4SLinus Torvalds }; 98*1da177e4SLinus Torvalds 99*1da177e4SLinus Torvalds struct snd_pmac { 100*1da177e4SLinus Torvalds snd_card_t *card; 101*1da177e4SLinus Torvalds 102*1da177e4SLinus Torvalds /* h/w info */ 103*1da177e4SLinus Torvalds struct device_node *node; 104*1da177e4SLinus Torvalds unsigned int revision; 105*1da177e4SLinus Torvalds unsigned int manufacturer; 106*1da177e4SLinus Torvalds unsigned int subframe; 107*1da177e4SLinus Torvalds unsigned int device_id; 108*1da177e4SLinus Torvalds enum snd_pmac_model model; 109*1da177e4SLinus Torvalds 110*1da177e4SLinus Torvalds unsigned int has_iic : 1; 111*1da177e4SLinus Torvalds unsigned int is_pbook_3400 : 1; 112*1da177e4SLinus Torvalds unsigned int is_pbook_G3 : 1; 113*1da177e4SLinus Torvalds 114*1da177e4SLinus Torvalds unsigned int can_byte_swap : 1; 115*1da177e4SLinus Torvalds unsigned int can_duplex : 1; 116*1da177e4SLinus Torvalds unsigned int can_capture : 1; 117*1da177e4SLinus Torvalds 118*1da177e4SLinus Torvalds unsigned int auto_mute : 1; 119*1da177e4SLinus Torvalds unsigned int initialized : 1; 120*1da177e4SLinus Torvalds unsigned int feature_is_set : 1; 121*1da177e4SLinus Torvalds 122*1da177e4SLinus Torvalds unsigned int of_requested; 123*1da177e4SLinus Torvalds 124*1da177e4SLinus Torvalds int num_freqs; 125*1da177e4SLinus Torvalds int *freq_table; 126*1da177e4SLinus Torvalds unsigned int freqs_ok; /* bit flags */ 127*1da177e4SLinus Torvalds unsigned int formats_ok; /* pcm hwinfo */ 128*1da177e4SLinus Torvalds int active; 129*1da177e4SLinus Torvalds int rate_index; 130*1da177e4SLinus Torvalds int format; /* current format */ 131*1da177e4SLinus Torvalds 132*1da177e4SLinus Torvalds spinlock_t reg_lock; 133*1da177e4SLinus Torvalds volatile struct awacs_regs __iomem *awacs; 134*1da177e4SLinus Torvalds int awacs_reg[8]; /* register cache */ 135*1da177e4SLinus Torvalds unsigned int hp_stat_mask; 136*1da177e4SLinus Torvalds 137*1da177e4SLinus Torvalds unsigned char __iomem *latch_base; 138*1da177e4SLinus Torvalds unsigned char __iomem *macio_base; 139*1da177e4SLinus Torvalds 140*1da177e4SLinus Torvalds pmac_stream_t playback; 141*1da177e4SLinus Torvalds pmac_stream_t capture; 142*1da177e4SLinus Torvalds 143*1da177e4SLinus Torvalds pmac_dbdma_t extra_dma; 144*1da177e4SLinus Torvalds 145*1da177e4SLinus Torvalds int irq, tx_irq, rx_irq; 146*1da177e4SLinus Torvalds 147*1da177e4SLinus Torvalds snd_pcm_t *pcm; 148*1da177e4SLinus Torvalds 149*1da177e4SLinus Torvalds pmac_beep_t *beep; 150*1da177e4SLinus Torvalds 151*1da177e4SLinus Torvalds unsigned int control_mask; /* control mask */ 152*1da177e4SLinus Torvalds 153*1da177e4SLinus Torvalds /* mixer stuffs */ 154*1da177e4SLinus Torvalds void *mixer_data; 155*1da177e4SLinus Torvalds void (*mixer_free)(pmac_t *); 156*1da177e4SLinus Torvalds snd_kcontrol_t *master_sw_ctl; 157*1da177e4SLinus Torvalds snd_kcontrol_t *speaker_sw_ctl; 158*1da177e4SLinus Torvalds snd_kcontrol_t *drc_sw_ctl; /* only used for tumbler -ReneR */ 159*1da177e4SLinus Torvalds snd_kcontrol_t *hp_detect_ctl; 160*1da177e4SLinus Torvalds 161*1da177e4SLinus Torvalds /* lowlevel callbacks */ 162*1da177e4SLinus Torvalds void (*set_format)(pmac_t *chip); 163*1da177e4SLinus Torvalds void (*update_automute)(pmac_t *chip, int do_notify); 164*1da177e4SLinus Torvalds int (*detect_headphone)(pmac_t *chip); 165*1da177e4SLinus Torvalds #ifdef CONFIG_PMAC_PBOOK 166*1da177e4SLinus Torvalds void (*suspend)(pmac_t *chip); 167*1da177e4SLinus Torvalds void (*resume)(pmac_t *chip); 168*1da177e4SLinus Torvalds #endif 169*1da177e4SLinus Torvalds 170*1da177e4SLinus Torvalds }; 171*1da177e4SLinus Torvalds 172*1da177e4SLinus Torvalds 173*1da177e4SLinus Torvalds /* exported functions */ 174*1da177e4SLinus Torvalds int snd_pmac_new(snd_card_t *card, pmac_t **chip_return); 175*1da177e4SLinus Torvalds int snd_pmac_pcm_new(pmac_t *chip); 176*1da177e4SLinus Torvalds int snd_pmac_attach_beep(pmac_t *chip); 177*1da177e4SLinus Torvalds void snd_pmac_detach_beep(pmac_t *chip); 178*1da177e4SLinus Torvalds void snd_pmac_beep_stop(pmac_t *chip); 179*1da177e4SLinus Torvalds unsigned int snd_pmac_rate_index(pmac_t *chip, pmac_stream_t *rec, unsigned int rate); 180*1da177e4SLinus Torvalds 181*1da177e4SLinus Torvalds void snd_pmac_beep_dma_start(pmac_t *chip, int bytes, unsigned long addr, int speed); 182*1da177e4SLinus Torvalds void snd_pmac_beep_dma_stop(pmac_t *chip); 183*1da177e4SLinus Torvalds 184*1da177e4SLinus Torvalds /* initialize mixer */ 185*1da177e4SLinus Torvalds int snd_pmac_awacs_init(pmac_t *chip); 186*1da177e4SLinus Torvalds int snd_pmac_burgundy_init(pmac_t *chip); 187*1da177e4SLinus Torvalds int snd_pmac_daca_init(pmac_t *chip); 188*1da177e4SLinus Torvalds int snd_pmac_tumbler_init(pmac_t *chip); 189*1da177e4SLinus Torvalds int snd_pmac_tumbler_post_init(void); 190*1da177e4SLinus Torvalds 191*1da177e4SLinus Torvalds /* i2c functions */ 192*1da177e4SLinus Torvalds typedef struct snd_pmac_keywest { 193*1da177e4SLinus Torvalds int addr; 194*1da177e4SLinus Torvalds struct i2c_client *client; 195*1da177e4SLinus Torvalds int id; 196*1da177e4SLinus Torvalds int (*init_client)(struct snd_pmac_keywest *i2c); 197*1da177e4SLinus Torvalds char *name; 198*1da177e4SLinus Torvalds } pmac_keywest_t; 199*1da177e4SLinus Torvalds 200*1da177e4SLinus Torvalds int snd_pmac_keywest_init(pmac_keywest_t *i2c); 201*1da177e4SLinus Torvalds void snd_pmac_keywest_cleanup(pmac_keywest_t *i2c); 202*1da177e4SLinus Torvalds 203*1da177e4SLinus Torvalds /* misc */ 204*1da177e4SLinus Torvalds int snd_pmac_boolean_stereo_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo); 205*1da177e4SLinus Torvalds int snd_pmac_boolean_mono_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo); 206*1da177e4SLinus Torvalds 207*1da177e4SLinus Torvalds int snd_pmac_add_automute(pmac_t *chip); 208*1da177e4SLinus Torvalds 209*1da177e4SLinus Torvalds #define big_mdelay(msec) do {\ 210*1da177e4SLinus Torvalds set_current_state(TASK_UNINTERRUPTIBLE);\ 211*1da177e4SLinus Torvalds schedule_timeout(((msec) * HZ + 999) / 1000);\ 212*1da177e4SLinus Torvalds } while (0) 213*1da177e4SLinus Torvalds 214*1da177e4SLinus Torvalds #endif /* __PMAC_H */ 215