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