162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Driver for PowerMac onboard soundchips 462306a36Sopenharmony_ci * Copyright (c) 2001 by Takashi Iwai <tiwai@suse.de> 562306a36Sopenharmony_ci * based on dmasound.c. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#ifndef __PMAC_H 1062306a36Sopenharmony_ci#define __PMAC_H 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <sound/control.h> 1362306a36Sopenharmony_ci#include <sound/pcm.h> 1462306a36Sopenharmony_ci#include "awacs.h" 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#include <linux/adb.h> 1762306a36Sopenharmony_ci#ifdef CONFIG_ADB_CUDA 1862306a36Sopenharmony_ci#include <linux/cuda.h> 1962306a36Sopenharmony_ci#endif 2062306a36Sopenharmony_ci#ifdef CONFIG_ADB_PMU 2162306a36Sopenharmony_ci#include <linux/pmu.h> 2262306a36Sopenharmony_ci#endif 2362306a36Sopenharmony_ci#include <linux/nvram.h> 2462306a36Sopenharmony_ci#include <linux/tty.h> 2562306a36Sopenharmony_ci#include <linux/vt_kern.h> 2662306a36Sopenharmony_ci#include <asm/dbdma.h> 2762306a36Sopenharmony_ci#include <asm/prom.h> 2862306a36Sopenharmony_ci#include <asm/machdep.h> 2962306a36Sopenharmony_ci#include <asm/pmac_feature.h> 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci/* maximum number of fragments */ 3262306a36Sopenharmony_ci#define PMAC_MAX_FRAGS 32 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#define PMAC_SUPPORT_AUTOMUTE 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci/* 3862306a36Sopenharmony_ci * DBDMA space 3962306a36Sopenharmony_ci */ 4062306a36Sopenharmony_cistruct pmac_dbdma { 4162306a36Sopenharmony_ci dma_addr_t dma_base; 4262306a36Sopenharmony_ci dma_addr_t addr; 4362306a36Sopenharmony_ci struct dbdma_cmd __iomem *cmds; 4462306a36Sopenharmony_ci void *space; 4562306a36Sopenharmony_ci int size; 4662306a36Sopenharmony_ci}; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci/* 4962306a36Sopenharmony_ci * playback/capture stream 5062306a36Sopenharmony_ci */ 5162306a36Sopenharmony_cistruct pmac_stream { 5262306a36Sopenharmony_ci int running; /* boolean */ 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci int stream; /* PLAYBACK/CAPTURE */ 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci int dma_size; /* in bytes */ 5762306a36Sopenharmony_ci int period_size; /* in bytes */ 5862306a36Sopenharmony_ci int buffer_size; /* in kbytes */ 5962306a36Sopenharmony_ci int nperiods, cur_period; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci struct pmac_dbdma cmd; 6262306a36Sopenharmony_ci volatile struct dbdma_regs __iomem *dma; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci struct snd_pcm_substream *substream; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci unsigned int cur_freqs; /* currently available frequencies */ 6762306a36Sopenharmony_ci unsigned int cur_formats; /* currently available formats */ 6862306a36Sopenharmony_ci}; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci/* 7262306a36Sopenharmony_ci */ 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_cienum snd_pmac_model { 7562306a36Sopenharmony_ci PMAC_AWACS, PMAC_SCREAMER, PMAC_BURGUNDY, PMAC_DACA, PMAC_TUMBLER, 7662306a36Sopenharmony_ci PMAC_SNAPPER 7762306a36Sopenharmony_ci}; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_cistruct snd_pmac { 8062306a36Sopenharmony_ci struct snd_card *card; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci /* h/w info */ 8362306a36Sopenharmony_ci struct device_node *node; 8462306a36Sopenharmony_ci struct pci_dev *pdev; 8562306a36Sopenharmony_ci unsigned int revision; 8662306a36Sopenharmony_ci unsigned int manufacturer; 8762306a36Sopenharmony_ci unsigned int subframe; 8862306a36Sopenharmony_ci unsigned int device_id; 8962306a36Sopenharmony_ci enum snd_pmac_model model; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci unsigned int has_iic : 1; 9262306a36Sopenharmony_ci unsigned int is_pbook_3400 : 1; 9362306a36Sopenharmony_ci unsigned int is_pbook_G3 : 1; 9462306a36Sopenharmony_ci unsigned int is_k2 : 1; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci unsigned int can_byte_swap : 1; 9762306a36Sopenharmony_ci unsigned int can_duplex : 1; 9862306a36Sopenharmony_ci unsigned int can_capture : 1; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci unsigned int auto_mute : 1; 10162306a36Sopenharmony_ci unsigned int initialized : 1; 10262306a36Sopenharmony_ci unsigned int feature_is_set : 1; 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci unsigned int requested; 10562306a36Sopenharmony_ci struct resource rsrc[3]; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci int num_freqs; 10862306a36Sopenharmony_ci const int *freq_table; 10962306a36Sopenharmony_ci unsigned int freqs_ok; /* bit flags */ 11062306a36Sopenharmony_ci unsigned int formats_ok; /* pcm hwinfo */ 11162306a36Sopenharmony_ci int active; 11262306a36Sopenharmony_ci int rate_index; 11362306a36Sopenharmony_ci int format; /* current format */ 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci spinlock_t reg_lock; 11662306a36Sopenharmony_ci volatile struct awacs_regs __iomem *awacs; 11762306a36Sopenharmony_ci int awacs_reg[8]; /* register cache */ 11862306a36Sopenharmony_ci unsigned int hp_stat_mask; 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci unsigned char __iomem *latch_base; 12162306a36Sopenharmony_ci unsigned char __iomem *macio_base; 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci struct pmac_stream playback; 12462306a36Sopenharmony_ci struct pmac_stream capture; 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci struct pmac_dbdma extra_dma; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci int irq, tx_irq, rx_irq; 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci struct snd_pcm *pcm; 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci struct pmac_beep *beep; 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci unsigned int control_mask; /* control mask */ 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci /* mixer stuffs */ 13762306a36Sopenharmony_ci void *mixer_data; 13862306a36Sopenharmony_ci void (*mixer_free)(struct snd_pmac *); 13962306a36Sopenharmony_ci struct snd_kcontrol *master_sw_ctl; 14062306a36Sopenharmony_ci struct snd_kcontrol *speaker_sw_ctl; 14162306a36Sopenharmony_ci struct snd_kcontrol *drc_sw_ctl; /* only used for tumbler -ReneR */ 14262306a36Sopenharmony_ci struct snd_kcontrol *hp_detect_ctl; 14362306a36Sopenharmony_ci struct snd_kcontrol *lineout_sw_ctl; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci /* lowlevel callbacks */ 14662306a36Sopenharmony_ci void (*set_format)(struct snd_pmac *chip); 14762306a36Sopenharmony_ci void (*update_automute)(struct snd_pmac *chip, int do_notify); 14862306a36Sopenharmony_ci int (*detect_headphone)(struct snd_pmac *chip); 14962306a36Sopenharmony_ci#ifdef CONFIG_PM 15062306a36Sopenharmony_ci void (*suspend)(struct snd_pmac *chip); 15162306a36Sopenharmony_ci void (*resume)(struct snd_pmac *chip); 15262306a36Sopenharmony_ci#endif 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci}; 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci/* exported functions */ 15862306a36Sopenharmony_ciint snd_pmac_new(struct snd_card *card, struct snd_pmac **chip_return); 15962306a36Sopenharmony_ciint snd_pmac_pcm_new(struct snd_pmac *chip); 16062306a36Sopenharmony_ciint snd_pmac_attach_beep(struct snd_pmac *chip); 16162306a36Sopenharmony_civoid snd_pmac_detach_beep(struct snd_pmac *chip); 16262306a36Sopenharmony_civoid snd_pmac_beep_stop(struct snd_pmac *chip); 16362306a36Sopenharmony_ciunsigned int snd_pmac_rate_index(struct snd_pmac *chip, struct pmac_stream *rec, unsigned int rate); 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_civoid snd_pmac_beep_dma_start(struct snd_pmac *chip, int bytes, unsigned long addr, int speed); 16662306a36Sopenharmony_civoid snd_pmac_beep_dma_stop(struct snd_pmac *chip); 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci#ifdef CONFIG_PM 16962306a36Sopenharmony_civoid snd_pmac_suspend(struct snd_pmac *chip); 17062306a36Sopenharmony_civoid snd_pmac_resume(struct snd_pmac *chip); 17162306a36Sopenharmony_ci#endif 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci/* initialize mixer */ 17462306a36Sopenharmony_ciint snd_pmac_awacs_init(struct snd_pmac *chip); 17562306a36Sopenharmony_ciint snd_pmac_burgundy_init(struct snd_pmac *chip); 17662306a36Sopenharmony_ciint snd_pmac_daca_init(struct snd_pmac *chip); 17762306a36Sopenharmony_ciint snd_pmac_tumbler_init(struct snd_pmac *chip); 17862306a36Sopenharmony_ciint snd_pmac_tumbler_post_init(void); 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci/* i2c functions */ 18162306a36Sopenharmony_cistruct pmac_keywest { 18262306a36Sopenharmony_ci int addr; 18362306a36Sopenharmony_ci struct i2c_client *client; 18462306a36Sopenharmony_ci int id; 18562306a36Sopenharmony_ci int (*init_client)(struct pmac_keywest *i2c); 18662306a36Sopenharmony_ci char *name; 18762306a36Sopenharmony_ci}; 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ciint snd_pmac_keywest_init(struct pmac_keywest *i2c); 19062306a36Sopenharmony_civoid snd_pmac_keywest_cleanup(struct pmac_keywest *i2c); 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci/* misc */ 19362306a36Sopenharmony_ci#define snd_pmac_boolean_stereo_info snd_ctl_boolean_stereo_info 19462306a36Sopenharmony_ci#define snd_pmac_boolean_mono_info snd_ctl_boolean_mono_info 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ciint snd_pmac_add_automute(struct snd_pmac *chip); 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci#endif /* __PMAC_H */ 199