1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Driver for PowerMac onboard soundchips 4*4882a593Smuzhiyun * Copyright (c) 2001 by Takashi Iwai <tiwai@suse.de> 5*4882a593Smuzhiyun * based on dmasound.c. 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef __PMAC_H 10*4882a593Smuzhiyun #define __PMAC_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <sound/control.h> 13*4882a593Smuzhiyun #include <sound/pcm.h> 14*4882a593Smuzhiyun #include "awacs.h" 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #include <linux/adb.h> 17*4882a593Smuzhiyun #ifdef CONFIG_ADB_CUDA 18*4882a593Smuzhiyun #include <linux/cuda.h> 19*4882a593Smuzhiyun #endif 20*4882a593Smuzhiyun #ifdef CONFIG_ADB_PMU 21*4882a593Smuzhiyun #include <linux/pmu.h> 22*4882a593Smuzhiyun #endif 23*4882a593Smuzhiyun #include <linux/nvram.h> 24*4882a593Smuzhiyun #include <linux/tty.h> 25*4882a593Smuzhiyun #include <linux/vt_kern.h> 26*4882a593Smuzhiyun #include <asm/dbdma.h> 27*4882a593Smuzhiyun #include <asm/prom.h> 28*4882a593Smuzhiyun #include <asm/machdep.h> 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* maximum number of fragments */ 31*4882a593Smuzhiyun #define PMAC_MAX_FRAGS 32 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #define PMAC_SUPPORT_AUTOMUTE 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* 37*4882a593Smuzhiyun * DBDMA space 38*4882a593Smuzhiyun */ 39*4882a593Smuzhiyun struct pmac_dbdma { 40*4882a593Smuzhiyun dma_addr_t dma_base; 41*4882a593Smuzhiyun dma_addr_t addr; 42*4882a593Smuzhiyun struct dbdma_cmd __iomem *cmds; 43*4882a593Smuzhiyun void *space; 44*4882a593Smuzhiyun int size; 45*4882a593Smuzhiyun }; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun /* 48*4882a593Smuzhiyun * playback/capture stream 49*4882a593Smuzhiyun */ 50*4882a593Smuzhiyun struct pmac_stream { 51*4882a593Smuzhiyun int running; /* boolean */ 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun int stream; /* PLAYBACK/CAPTURE */ 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun int dma_size; /* in bytes */ 56*4882a593Smuzhiyun int period_size; /* in bytes */ 57*4882a593Smuzhiyun int buffer_size; /* in kbytes */ 58*4882a593Smuzhiyun int nperiods, cur_period; 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun struct pmac_dbdma cmd; 61*4882a593Smuzhiyun volatile struct dbdma_regs __iomem *dma; 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun struct snd_pcm_substream *substream; 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun unsigned int cur_freqs; /* currently available frequencies */ 66*4882a593Smuzhiyun unsigned int cur_formats; /* currently available formats */ 67*4882a593Smuzhiyun }; 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun /* 71*4882a593Smuzhiyun */ 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun enum snd_pmac_model { 74*4882a593Smuzhiyun PMAC_AWACS, PMAC_SCREAMER, PMAC_BURGUNDY, PMAC_DACA, PMAC_TUMBLER, 75*4882a593Smuzhiyun PMAC_SNAPPER 76*4882a593Smuzhiyun }; 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun struct snd_pmac { 79*4882a593Smuzhiyun struct snd_card *card; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun /* h/w info */ 82*4882a593Smuzhiyun struct device_node *node; 83*4882a593Smuzhiyun struct pci_dev *pdev; 84*4882a593Smuzhiyun unsigned int revision; 85*4882a593Smuzhiyun unsigned int manufacturer; 86*4882a593Smuzhiyun unsigned int subframe; 87*4882a593Smuzhiyun unsigned int device_id; 88*4882a593Smuzhiyun enum snd_pmac_model model; 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun unsigned int has_iic : 1; 91*4882a593Smuzhiyun unsigned int is_pbook_3400 : 1; 92*4882a593Smuzhiyun unsigned int is_pbook_G3 : 1; 93*4882a593Smuzhiyun unsigned int is_k2 : 1; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun unsigned int can_byte_swap : 1; 96*4882a593Smuzhiyun unsigned int can_duplex : 1; 97*4882a593Smuzhiyun unsigned int can_capture : 1; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun unsigned int auto_mute : 1; 100*4882a593Smuzhiyun unsigned int initialized : 1; 101*4882a593Smuzhiyun unsigned int feature_is_set : 1; 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun unsigned int requested; 104*4882a593Smuzhiyun struct resource rsrc[3]; 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun int num_freqs; 107*4882a593Smuzhiyun const int *freq_table; 108*4882a593Smuzhiyun unsigned int freqs_ok; /* bit flags */ 109*4882a593Smuzhiyun unsigned int formats_ok; /* pcm hwinfo */ 110*4882a593Smuzhiyun int active; 111*4882a593Smuzhiyun int rate_index; 112*4882a593Smuzhiyun int format; /* current format */ 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun spinlock_t reg_lock; 115*4882a593Smuzhiyun volatile struct awacs_regs __iomem *awacs; 116*4882a593Smuzhiyun int awacs_reg[8]; /* register cache */ 117*4882a593Smuzhiyun unsigned int hp_stat_mask; 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun unsigned char __iomem *latch_base; 120*4882a593Smuzhiyun unsigned char __iomem *macio_base; 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun struct pmac_stream playback; 123*4882a593Smuzhiyun struct pmac_stream capture; 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun struct pmac_dbdma extra_dma; 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun int irq, tx_irq, rx_irq; 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun struct snd_pcm *pcm; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun struct pmac_beep *beep; 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun unsigned int control_mask; /* control mask */ 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun /* mixer stuffs */ 136*4882a593Smuzhiyun void *mixer_data; 137*4882a593Smuzhiyun void (*mixer_free)(struct snd_pmac *); 138*4882a593Smuzhiyun struct snd_kcontrol *master_sw_ctl; 139*4882a593Smuzhiyun struct snd_kcontrol *speaker_sw_ctl; 140*4882a593Smuzhiyun struct snd_kcontrol *drc_sw_ctl; /* only used for tumbler -ReneR */ 141*4882a593Smuzhiyun struct snd_kcontrol *hp_detect_ctl; 142*4882a593Smuzhiyun struct snd_kcontrol *lineout_sw_ctl; 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun /* lowlevel callbacks */ 145*4882a593Smuzhiyun void (*set_format)(struct snd_pmac *chip); 146*4882a593Smuzhiyun void (*update_automute)(struct snd_pmac *chip, int do_notify); 147*4882a593Smuzhiyun int (*detect_headphone)(struct snd_pmac *chip); 148*4882a593Smuzhiyun #ifdef CONFIG_PM 149*4882a593Smuzhiyun void (*suspend)(struct snd_pmac *chip); 150*4882a593Smuzhiyun void (*resume)(struct snd_pmac *chip); 151*4882a593Smuzhiyun #endif 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun }; 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun /* exported functions */ 157*4882a593Smuzhiyun int snd_pmac_new(struct snd_card *card, struct snd_pmac **chip_return); 158*4882a593Smuzhiyun int snd_pmac_pcm_new(struct snd_pmac *chip); 159*4882a593Smuzhiyun int snd_pmac_attach_beep(struct snd_pmac *chip); 160*4882a593Smuzhiyun void snd_pmac_detach_beep(struct snd_pmac *chip); 161*4882a593Smuzhiyun void snd_pmac_beep_stop(struct snd_pmac *chip); 162*4882a593Smuzhiyun unsigned int snd_pmac_rate_index(struct snd_pmac *chip, struct pmac_stream *rec, unsigned int rate); 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun void snd_pmac_beep_dma_start(struct snd_pmac *chip, int bytes, unsigned long addr, int speed); 165*4882a593Smuzhiyun void snd_pmac_beep_dma_stop(struct snd_pmac *chip); 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun #ifdef CONFIG_PM 168*4882a593Smuzhiyun void snd_pmac_suspend(struct snd_pmac *chip); 169*4882a593Smuzhiyun void snd_pmac_resume(struct snd_pmac *chip); 170*4882a593Smuzhiyun #endif 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun /* initialize mixer */ 173*4882a593Smuzhiyun int snd_pmac_awacs_init(struct snd_pmac *chip); 174*4882a593Smuzhiyun int snd_pmac_burgundy_init(struct snd_pmac *chip); 175*4882a593Smuzhiyun int snd_pmac_daca_init(struct snd_pmac *chip); 176*4882a593Smuzhiyun int snd_pmac_tumbler_init(struct snd_pmac *chip); 177*4882a593Smuzhiyun int snd_pmac_tumbler_post_init(void); 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun /* i2c functions */ 180*4882a593Smuzhiyun struct pmac_keywest { 181*4882a593Smuzhiyun int addr; 182*4882a593Smuzhiyun struct i2c_client *client; 183*4882a593Smuzhiyun int id; 184*4882a593Smuzhiyun int (*init_client)(struct pmac_keywest *i2c); 185*4882a593Smuzhiyun char *name; 186*4882a593Smuzhiyun }; 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun int snd_pmac_keywest_init(struct pmac_keywest *i2c); 189*4882a593Smuzhiyun void snd_pmac_keywest_cleanup(struct pmac_keywest *i2c); 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun /* misc */ 192*4882a593Smuzhiyun #define snd_pmac_boolean_stereo_info snd_ctl_boolean_stereo_info 193*4882a593Smuzhiyun #define snd_pmac_boolean_mono_info snd_ctl_boolean_mono_info 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun int snd_pmac_add_automute(struct snd_pmac *chip); 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun #endif /* __PMAC_H */ 198