brintos

brintos / linux-shallow public Read only

0
0
Text · 7.3 KiB · 0cae640 Raw
260 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef OXYGEN_H_INCLUDED3#define OXYGEN_H_INCLUDED4 5#include <linux/mutex.h>6#include <linux/spinlock.h>7#include <linux/wait.h>8#include <linux/workqueue.h>9#include "oxygen_regs.h"10 11/* 1 << PCM_x == OXYGEN_CHANNEL_x */12#define PCM_A		013#define PCM_B		114#define PCM_C		215#define PCM_SPDIF	316#define PCM_MULTICH	417#define PCM_AC97	518#define PCM_COUNT	619 20#define OXYGEN_MCLKS(f_single, f_double, f_quad) ((MCLK_##f_single << 0) | \21						  (MCLK_##f_double << 2) | \22						  (MCLK_##f_quad   << 4))23 24#define OXYGEN_IO_SIZE	0x10025 26#define OXYGEN_EEPROM_ID	0x434d	/* "CM" */27 28/* model-specific configuration of outputs/inputs */29#define PLAYBACK_0_TO_I2S	0x000130     /* PLAYBACK_0_TO_AC97_0		not implemented */31#define PLAYBACK_1_TO_SPDIF	0x000432#define PLAYBACK_2_TO_AC97_1	0x000833#define CAPTURE_0_FROM_I2S_1	0x001034#define CAPTURE_0_FROM_I2S_2	0x002035     /* CAPTURE_0_FROM_AC97_0		not implemented */36#define CAPTURE_1_FROM_SPDIF	0x008037#define CAPTURE_2_FROM_I2S_2	0x010038#define CAPTURE_2_FROM_AC97_1	0x020039#define CAPTURE_3_FROM_I2S_3	0x040040#define MIDI_OUTPUT		0x080041#define MIDI_INPUT		0x100042#define AC97_CD_INPUT		0x200043#define AC97_FMIC_SWITCH	0x400044 45enum {46	CONTROL_SPDIF_PCM,47	CONTROL_SPDIF_INPUT_BITS,48	CONTROL_MIC_CAPTURE_SWITCH,49	CONTROL_LINE_CAPTURE_SWITCH,50	CONTROL_CD_CAPTURE_SWITCH,51	CONTROL_AUX_CAPTURE_SWITCH,52	CONTROL_COUNT53};54 55#define OXYGEN_PCI_SUBID(sv, sd) \56	.vendor = PCI_VENDOR_ID_CMEDIA, \57	.device = 0x8788, \58	.subvendor = sv, \59	.subdevice = sd60 61#define BROKEN_EEPROM_DRIVER_DATA ((unsigned long)-1)62#define OXYGEN_PCI_SUBID_BROKEN_EEPROM \63	OXYGEN_PCI_SUBID(PCI_VENDOR_ID_CMEDIA, 0x8788), \64	.driver_data = BROKEN_EEPROM_DRIVER_DATA65 66struct pci_dev;67struct pci_device_id;68struct snd_card;69struct snd_pcm_substream;70struct snd_pcm_hardware;71struct snd_pcm_hw_params;72struct snd_kcontrol_new;73struct snd_rawmidi;74struct snd_info_buffer;75struct oxygen;76 77struct oxygen_model {78	const char *shortname;79	const char *longname;80	const char *chip;81	void (*init)(struct oxygen *chip);82	int (*control_filter)(struct snd_kcontrol_new *template);83	int (*mixer_init)(struct oxygen *chip);84	void (*cleanup)(struct oxygen *chip);85	void (*suspend)(struct oxygen *chip);86	void (*resume)(struct oxygen *chip);87	void (*pcm_hardware_filter)(unsigned int channel,88				    struct snd_pcm_hardware *hardware);89	void (*set_dac_params)(struct oxygen *chip,90			       struct snd_pcm_hw_params *params);91	void (*set_adc_params)(struct oxygen *chip,92			       struct snd_pcm_hw_params *params);93	void (*update_dac_volume)(struct oxygen *chip);94	void (*update_dac_mute)(struct oxygen *chip);95	void (*update_center_lfe_mix)(struct oxygen *chip, bool mixed);96	unsigned int (*adjust_dac_routing)(struct oxygen *chip,97					   unsigned int play_routing);98	void (*gpio_changed)(struct oxygen *chip);99	void (*uart_input)(struct oxygen *chip);100	void (*ac97_switch)(struct oxygen *chip,101			    unsigned int reg, unsigned int mute);102	void (*dump_registers)(struct oxygen *chip,103			       struct snd_info_buffer *buffer);104	const unsigned int *dac_tlv;105	size_t model_data_size;106	unsigned int device_config;107	u8 dac_channels_pcm;108	u8 dac_channels_mixer;109	u8 dac_volume_min;110	u8 dac_volume_max;111	u8 misc_flags;112	u8 function_flags;113	u8 dac_mclks;114	u8 adc_mclks;115	u16 dac_i2s_format;116	u16 adc_i2s_format;117};118 119struct oxygen {120	unsigned long addr;121	spinlock_t reg_lock;122	struct mutex mutex;123	struct snd_card *card;124	struct pci_dev *pci;125	struct snd_rawmidi *midi;126	int irq;127	void *model_data;128	unsigned int interrupt_mask;129	u8 dac_volume[8];130	u8 dac_mute;131	u8 pcm_active;132	u8 pcm_running;133	u8 dac_routing;134	u8 spdif_playback_enable;135	u8 has_ac97_0;136	u8 has_ac97_1;137	u32 spdif_bits;138	u32 spdif_pcm_bits;139	struct snd_pcm_substream *streams[PCM_COUNT];140	struct snd_kcontrol *controls[CONTROL_COUNT];141	struct work_struct spdif_input_bits_work;142	struct work_struct gpio_work;143	wait_queue_head_t ac97_waitqueue;144	union {145		u8 _8[OXYGEN_IO_SIZE];146		__le16 _16[OXYGEN_IO_SIZE / 2];147		__le32 _32[OXYGEN_IO_SIZE / 4];148	} saved_registers;149	u16 saved_ac97_registers[2][0x40];150	unsigned int uart_input_count;151	u8 uart_input[32];152	struct oxygen_model model;153};154 155/* oxygen_lib.c */156 157int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,158		     struct module *owner,159		     const struct pci_device_id *ids,160		     int (*get_model)(struct oxygen *chip,161				      const struct pci_device_id *id162				     )163		    );164#ifdef CONFIG_PM_SLEEP165extern const struct dev_pm_ops oxygen_pci_pm;166#endif167void oxygen_pci_shutdown(struct pci_dev *pci);168 169/* oxygen_mixer.c */170 171int oxygen_mixer_init(struct oxygen *chip);172void oxygen_update_dac_routing(struct oxygen *chip);173void oxygen_update_spdif_source(struct oxygen *chip);174 175/* oxygen_pcm.c */176 177int oxygen_pcm_init(struct oxygen *chip);178 179/* oxygen_io.c */180 181u8 oxygen_read8(struct oxygen *chip, unsigned int reg);182u16 oxygen_read16(struct oxygen *chip, unsigned int reg);183u32 oxygen_read32(struct oxygen *chip, unsigned int reg);184void oxygen_write8(struct oxygen *chip, unsigned int reg, u8 value);185void oxygen_write16(struct oxygen *chip, unsigned int reg, u16 value);186void oxygen_write32(struct oxygen *chip, unsigned int reg, u32 value);187void oxygen_write8_masked(struct oxygen *chip, unsigned int reg,188			  u8 value, u8 mask);189void oxygen_write16_masked(struct oxygen *chip, unsigned int reg,190			   u16 value, u16 mask);191void oxygen_write32_masked(struct oxygen *chip, unsigned int reg,192			   u32 value, u32 mask);193 194u16 oxygen_read_ac97(struct oxygen *chip, unsigned int codec,195		     unsigned int index);196void oxygen_write_ac97(struct oxygen *chip, unsigned int codec,197		       unsigned int index, u16 data);198void oxygen_write_ac97_masked(struct oxygen *chip, unsigned int codec,199			      unsigned int index, u16 data, u16 mask);200 201int oxygen_write_spi(struct oxygen *chip, u8 control, unsigned int data);202void oxygen_write_i2c(struct oxygen *chip, u8 device, u8 map, u8 data);203 204void oxygen_reset_uart(struct oxygen *chip);205void oxygen_write_uart(struct oxygen *chip, u8 data);206 207u16 oxygen_read_eeprom(struct oxygen *chip, unsigned int index);208void oxygen_write_eeprom(struct oxygen *chip, unsigned int index, u16 value);209 210static inline void oxygen_set_bits8(struct oxygen *chip,211				    unsigned int reg, u8 value)212{213	oxygen_write8_masked(chip, reg, value, value);214}215 216static inline void oxygen_set_bits16(struct oxygen *chip,217				     unsigned int reg, u16 value)218{219	oxygen_write16_masked(chip, reg, value, value);220}221 222static inline void oxygen_set_bits32(struct oxygen *chip,223				     unsigned int reg, u32 value)224{225	oxygen_write32_masked(chip, reg, value, value);226}227 228static inline void oxygen_clear_bits8(struct oxygen *chip,229				      unsigned int reg, u8 value)230{231	oxygen_write8_masked(chip, reg, 0, value);232}233 234static inline void oxygen_clear_bits16(struct oxygen *chip,235				       unsigned int reg, u16 value)236{237	oxygen_write16_masked(chip, reg, 0, value);238}239 240static inline void oxygen_clear_bits32(struct oxygen *chip,241				       unsigned int reg, u32 value)242{243	oxygen_write32_masked(chip, reg, 0, value);244}245 246static inline void oxygen_ac97_set_bits(struct oxygen *chip, unsigned int codec,247					unsigned int index, u16 value)248{249	oxygen_write_ac97_masked(chip, codec, index, value, value);250}251 252static inline void oxygen_ac97_clear_bits(struct oxygen *chip,253					  unsigned int codec,254					  unsigned int index, u16 value)255{256	oxygen_write_ac97_masked(chip, codec, index, 0, value);257}258 259#endif260