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