162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Driver for Digigram VX soundcards 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Hardware core part 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de> 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifndef __SOUND_VX_COMMON_H 1162306a36Sopenharmony_ci#define __SOUND_VX_COMMON_H 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <sound/pcm.h> 1462306a36Sopenharmony_ci#include <sound/hwdep.h> 1562306a36Sopenharmony_ci#include <linux/interrupt.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistruct firmware; 1862306a36Sopenharmony_cistruct device; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#define VX_DRIVER_VERSION 0x010000 /* 1.0.0 */ 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* 2362306a36Sopenharmony_ci */ 2462306a36Sopenharmony_ci#define SIZE_MAX_CMD 0x10 2562306a36Sopenharmony_ci#define SIZE_MAX_STATUS 0x10 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cistruct vx_rmh { 2862306a36Sopenharmony_ci u16 LgCmd; /* length of the command to send (WORDs) */ 2962306a36Sopenharmony_ci u16 LgStat; /* length of the status received (WORDs) */ 3062306a36Sopenharmony_ci u32 Cmd[SIZE_MAX_CMD]; 3162306a36Sopenharmony_ci u32 Stat[SIZE_MAX_STATUS]; 3262306a36Sopenharmony_ci u16 DspStat; /* status type, RMP_SSIZE_XXX */ 3362306a36Sopenharmony_ci}; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_citypedef u64 pcx_time_t; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#define VX_MAX_PIPES 16 3862306a36Sopenharmony_ci#define VX_MAX_PERIODS 32 3962306a36Sopenharmony_ci#define VX_MAX_CODECS 2 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cistruct vx_ibl_info { 4262306a36Sopenharmony_ci int size; /* the current IBL size (0 = query) in bytes */ 4362306a36Sopenharmony_ci int max_size; /* max. IBL size in bytes */ 4462306a36Sopenharmony_ci int min_size; /* min. IBL size in bytes */ 4562306a36Sopenharmony_ci int granularity; /* granularity */ 4662306a36Sopenharmony_ci}; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_cistruct vx_pipe { 4962306a36Sopenharmony_ci int number; 5062306a36Sopenharmony_ci unsigned int is_capture: 1; 5162306a36Sopenharmony_ci unsigned int data_mode: 1; 5262306a36Sopenharmony_ci unsigned int running: 1; 5362306a36Sopenharmony_ci unsigned int prepared: 1; 5462306a36Sopenharmony_ci int channels; 5562306a36Sopenharmony_ci unsigned int differed_type; 5662306a36Sopenharmony_ci pcx_time_t pcx_time; 5762306a36Sopenharmony_ci struct snd_pcm_substream *substream; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci int hbuf_size; /* H-buffer size in bytes */ 6062306a36Sopenharmony_ci int buffer_bytes; /* the ALSA pcm buffer size in bytes */ 6162306a36Sopenharmony_ci int period_bytes; /* the ALSA pcm period size in bytes */ 6262306a36Sopenharmony_ci int hw_ptr; /* the current hardware pointer in bytes */ 6362306a36Sopenharmony_ci int position; /* the current position in frames (playback only) */ 6462306a36Sopenharmony_ci int transferred; /* the transferred size (per period) in frames */ 6562306a36Sopenharmony_ci int align; /* size of alignment */ 6662306a36Sopenharmony_ci u64 cur_count; /* current sample position (for playback) */ 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci unsigned int references; /* an output pipe may be used for monitoring and/or playback */ 6962306a36Sopenharmony_ci struct vx_pipe *monitoring_pipe; /* pointer to the monitoring pipe (capture pipe only)*/ 7062306a36Sopenharmony_ci}; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_cistruct vx_core; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_cistruct snd_vx_ops { 7562306a36Sopenharmony_ci /* low-level i/o */ 7662306a36Sopenharmony_ci unsigned char (*in8)(struct vx_core *chip, int reg); 7762306a36Sopenharmony_ci unsigned int (*in32)(struct vx_core *chip, int reg); 7862306a36Sopenharmony_ci void (*out8)(struct vx_core *chip, int reg, unsigned char val); 7962306a36Sopenharmony_ci void (*out32)(struct vx_core *chip, int reg, unsigned int val); 8062306a36Sopenharmony_ci /* irq */ 8162306a36Sopenharmony_ci int (*test_and_ack)(struct vx_core *chip); 8262306a36Sopenharmony_ci void (*validate_irq)(struct vx_core *chip, int enable); 8362306a36Sopenharmony_ci /* codec */ 8462306a36Sopenharmony_ci void (*write_codec)(struct vx_core *chip, int codec, unsigned int data); 8562306a36Sopenharmony_ci void (*akm_write)(struct vx_core *chip, int reg, unsigned int data); 8662306a36Sopenharmony_ci void (*reset_codec)(struct vx_core *chip); 8762306a36Sopenharmony_ci void (*change_audio_source)(struct vx_core *chip, int src); 8862306a36Sopenharmony_ci void (*set_clock_source)(struct vx_core *chp, int src); 8962306a36Sopenharmony_ci /* chip init */ 9062306a36Sopenharmony_ci int (*load_dsp)(struct vx_core *chip, int idx, const struct firmware *fw); 9162306a36Sopenharmony_ci void (*reset_dsp)(struct vx_core *chip); 9262306a36Sopenharmony_ci void (*reset_board)(struct vx_core *chip, int cold_reset); 9362306a36Sopenharmony_ci int (*add_controls)(struct vx_core *chip); 9462306a36Sopenharmony_ci /* pcm */ 9562306a36Sopenharmony_ci void (*dma_write)(struct vx_core *chip, struct snd_pcm_runtime *runtime, 9662306a36Sopenharmony_ci struct vx_pipe *pipe, int count); 9762306a36Sopenharmony_ci void (*dma_read)(struct vx_core *chip, struct snd_pcm_runtime *runtime, 9862306a36Sopenharmony_ci struct vx_pipe *pipe, int count); 9962306a36Sopenharmony_ci}; 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_cistruct snd_vx_hardware { 10262306a36Sopenharmony_ci const char *name; 10362306a36Sopenharmony_ci int type; /* VX_TYPE_XXX */ 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci /* hardware specs */ 10662306a36Sopenharmony_ci unsigned int num_codecs; 10762306a36Sopenharmony_ci unsigned int num_ins; 10862306a36Sopenharmony_ci unsigned int num_outs; 10962306a36Sopenharmony_ci unsigned int output_level_max; 11062306a36Sopenharmony_ci const unsigned int *output_level_db_scale; 11162306a36Sopenharmony_ci}; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci/* hwdep id string */ 11462306a36Sopenharmony_ci#define SND_VX_HWDEP_ID "VX Loader" 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci/* hardware type */ 11762306a36Sopenharmony_cienum { 11862306a36Sopenharmony_ci /* VX222 PCI */ 11962306a36Sopenharmony_ci VX_TYPE_BOARD, /* old VX222 PCI */ 12062306a36Sopenharmony_ci VX_TYPE_V2, /* VX222 V2 PCI */ 12162306a36Sopenharmony_ci VX_TYPE_MIC, /* VX222 Mic PCI */ 12262306a36Sopenharmony_ci /* VX-pocket */ 12362306a36Sopenharmony_ci VX_TYPE_VXPOCKET, /* VXpocket V2 */ 12462306a36Sopenharmony_ci VX_TYPE_VXP440, /* VXpocket 440 */ 12562306a36Sopenharmony_ci VX_TYPE_NUMS 12662306a36Sopenharmony_ci}; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci/* chip status */ 12962306a36Sopenharmony_cienum { 13062306a36Sopenharmony_ci VX_STAT_XILINX_LOADED = (1 << 0), /* devices are registered */ 13162306a36Sopenharmony_ci VX_STAT_DEVICE_INIT = (1 << 1), /* devices are registered */ 13262306a36Sopenharmony_ci VX_STAT_CHIP_INIT = (1 << 2), /* all operational */ 13362306a36Sopenharmony_ci VX_STAT_IN_SUSPEND = (1 << 10), /* in suspend phase */ 13462306a36Sopenharmony_ci VX_STAT_IS_STALE = (1 << 15) /* device is stale */ 13562306a36Sopenharmony_ci}; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci/* min/max values for analog output for old codecs */ 13862306a36Sopenharmony_ci#define VX_ANALOG_OUT_LEVEL_MAX 0xe3 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_cistruct vx_core { 14162306a36Sopenharmony_ci /* ALSA stuff */ 14262306a36Sopenharmony_ci struct snd_card *card; 14362306a36Sopenharmony_ci struct snd_pcm *pcm[VX_MAX_CODECS]; 14462306a36Sopenharmony_ci int type; /* VX_TYPE_XXX */ 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci int irq; 14762306a36Sopenharmony_ci /* ports are defined externally */ 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci /* low-level functions */ 15062306a36Sopenharmony_ci const struct snd_vx_hardware *hw; 15162306a36Sopenharmony_ci const struct snd_vx_ops *ops; 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci struct mutex lock; 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci unsigned int chip_status; 15662306a36Sopenharmony_ci unsigned int pcm_running; 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci struct device *dev; 15962306a36Sopenharmony_ci struct snd_hwdep *hwdep; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci struct vx_rmh irq_rmh; /* RMH used in interrupts */ 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci unsigned int audio_info; /* see VX_AUDIO_INFO */ 16462306a36Sopenharmony_ci unsigned int audio_ins; 16562306a36Sopenharmony_ci unsigned int audio_outs; 16662306a36Sopenharmony_ci struct vx_pipe **playback_pipes; 16762306a36Sopenharmony_ci struct vx_pipe **capture_pipes; 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci /* clock and audio sources */ 17062306a36Sopenharmony_ci unsigned int audio_source; /* current audio input source */ 17162306a36Sopenharmony_ci unsigned int audio_source_target; 17262306a36Sopenharmony_ci unsigned int clock_mode; /* clock mode (VX_CLOCK_MODE_XXX) */ 17362306a36Sopenharmony_ci unsigned int clock_source; /* current clock source (INTERNAL_QUARTZ or UER_SYNC) */ 17462306a36Sopenharmony_ci unsigned int freq; /* current frequency */ 17562306a36Sopenharmony_ci unsigned int freq_detected; /* detected frequency from digital in */ 17662306a36Sopenharmony_ci unsigned int uer_detected; /* VX_UER_MODE_XXX */ 17762306a36Sopenharmony_ci unsigned int uer_bits; /* IEC958 status bits */ 17862306a36Sopenharmony_ci struct vx_ibl_info ibl; /* IBL information */ 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci /* mixer setting */ 18162306a36Sopenharmony_ci int output_level[VX_MAX_CODECS][2]; /* analog output level */ 18262306a36Sopenharmony_ci int audio_gain[2][4]; /* digital audio level (playback/capture) */ 18362306a36Sopenharmony_ci unsigned char audio_active[4]; /* mute/unmute on digital playback */ 18462306a36Sopenharmony_ci int audio_monitor[4]; /* playback hw-monitor level */ 18562306a36Sopenharmony_ci unsigned char audio_monitor_active[4]; /* playback hw-monitor mute/unmute */ 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci struct mutex mixer_mutex; 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci const struct firmware *firmware[4]; /* loaded firmware data */ 19062306a36Sopenharmony_ci}; 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci/* 19462306a36Sopenharmony_ci * constructor 19562306a36Sopenharmony_ci */ 19662306a36Sopenharmony_cistruct vx_core *snd_vx_create(struct snd_card *card, 19762306a36Sopenharmony_ci const struct snd_vx_hardware *hw, 19862306a36Sopenharmony_ci const struct snd_vx_ops *ops, int extra_size); 19962306a36Sopenharmony_ciint snd_vx_setup_firmware(struct vx_core *chip); 20062306a36Sopenharmony_ciint snd_vx_load_boot_image(struct vx_core *chip, const struct firmware *dsp); 20162306a36Sopenharmony_ciint snd_vx_dsp_boot(struct vx_core *chip, const struct firmware *dsp); 20262306a36Sopenharmony_ciint snd_vx_dsp_load(struct vx_core *chip, const struct firmware *dsp); 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_civoid snd_vx_free_firmware(struct vx_core *chip); 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci/* 20762306a36Sopenharmony_ci * interrupt handler; exported for pcmcia 20862306a36Sopenharmony_ci */ 20962306a36Sopenharmony_ciirqreturn_t snd_vx_irq_handler(int irq, void *dev); 21062306a36Sopenharmony_ciirqreturn_t snd_vx_threaded_irq_handler(int irq, void *dev); 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci/* 21362306a36Sopenharmony_ci * lowlevel functions 21462306a36Sopenharmony_ci */ 21562306a36Sopenharmony_cistatic inline int vx_test_and_ack(struct vx_core *chip) 21662306a36Sopenharmony_ci{ 21762306a36Sopenharmony_ci return chip->ops->test_and_ack(chip); 21862306a36Sopenharmony_ci} 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_cistatic inline void vx_validate_irq(struct vx_core *chip, int enable) 22162306a36Sopenharmony_ci{ 22262306a36Sopenharmony_ci chip->ops->validate_irq(chip, enable); 22362306a36Sopenharmony_ci} 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_cistatic inline unsigned char snd_vx_inb(struct vx_core *chip, int reg) 22662306a36Sopenharmony_ci{ 22762306a36Sopenharmony_ci return chip->ops->in8(chip, reg); 22862306a36Sopenharmony_ci} 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_cistatic inline unsigned int snd_vx_inl(struct vx_core *chip, int reg) 23162306a36Sopenharmony_ci{ 23262306a36Sopenharmony_ci return chip->ops->in32(chip, reg); 23362306a36Sopenharmony_ci} 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_cistatic inline void snd_vx_outb(struct vx_core *chip, int reg, unsigned char val) 23662306a36Sopenharmony_ci{ 23762306a36Sopenharmony_ci chip->ops->out8(chip, reg, val); 23862306a36Sopenharmony_ci} 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_cistatic inline void snd_vx_outl(struct vx_core *chip, int reg, unsigned int val) 24162306a36Sopenharmony_ci{ 24262306a36Sopenharmony_ci chip->ops->out32(chip, reg, val); 24362306a36Sopenharmony_ci} 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci#define vx_inb(chip,reg) snd_vx_inb(chip, VX_##reg) 24662306a36Sopenharmony_ci#define vx_outb(chip,reg,val) snd_vx_outb(chip, VX_##reg,val) 24762306a36Sopenharmony_ci#define vx_inl(chip,reg) snd_vx_inl(chip, VX_##reg) 24862306a36Sopenharmony_ci#define vx_outl(chip,reg,val) snd_vx_outl(chip, VX_##reg,val) 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_cistatic inline void vx_reset_dsp(struct vx_core *chip) 25162306a36Sopenharmony_ci{ 25262306a36Sopenharmony_ci chip->ops->reset_dsp(chip); 25362306a36Sopenharmony_ci} 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ciint vx_send_msg(struct vx_core *chip, struct vx_rmh *rmh); 25662306a36Sopenharmony_ciint vx_send_msg_nolock(struct vx_core *chip, struct vx_rmh *rmh); 25762306a36Sopenharmony_ciint vx_send_rih(struct vx_core *chip, int cmd); 25862306a36Sopenharmony_ciint vx_send_rih_nolock(struct vx_core *chip, int cmd); 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_civoid vx_reset_codec(struct vx_core *chip, int cold_reset); 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci/* 26362306a36Sopenharmony_ci * check the bit on the specified register 26462306a36Sopenharmony_ci * returns zero if a bit matches, or a negative error code. 26562306a36Sopenharmony_ci * exported for vxpocket driver 26662306a36Sopenharmony_ci */ 26762306a36Sopenharmony_ciint snd_vx_check_reg_bit(struct vx_core *chip, int reg, int mask, int bit, int time); 26862306a36Sopenharmony_ci#define vx_check_isr(chip,mask,bit,time) snd_vx_check_reg_bit(chip, VX_ISR, mask, bit, time) 26962306a36Sopenharmony_ci#define vx_wait_isr_bit(chip,bit) vx_check_isr(chip, bit, bit, 200) 27062306a36Sopenharmony_ci#define vx_wait_for_rx_full(chip) vx_wait_isr_bit(chip, ISR_RX_FULL) 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci/* 27462306a36Sopenharmony_ci * pseudo-DMA transfer 27562306a36Sopenharmony_ci */ 27662306a36Sopenharmony_cistatic inline void vx_pseudo_dma_write(struct vx_core *chip, struct snd_pcm_runtime *runtime, 27762306a36Sopenharmony_ci struct vx_pipe *pipe, int count) 27862306a36Sopenharmony_ci{ 27962306a36Sopenharmony_ci chip->ops->dma_write(chip, runtime, pipe, count); 28062306a36Sopenharmony_ci} 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_cistatic inline void vx_pseudo_dma_read(struct vx_core *chip, struct snd_pcm_runtime *runtime, 28362306a36Sopenharmony_ci struct vx_pipe *pipe, int count) 28462306a36Sopenharmony_ci{ 28562306a36Sopenharmony_ci chip->ops->dma_read(chip, runtime, pipe, count); 28662306a36Sopenharmony_ci} 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci/* error with hardware code, 29162306a36Sopenharmony_ci * the return value is -(VX_ERR_MASK | actual-hw-error-code) 29262306a36Sopenharmony_ci */ 29362306a36Sopenharmony_ci#define VX_ERR_MASK 0x1000000 29462306a36Sopenharmony_ci#define vx_get_error(err) (-(err) & ~VX_ERR_MASK) 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci/* 29862306a36Sopenharmony_ci * pcm stuff 29962306a36Sopenharmony_ci */ 30062306a36Sopenharmony_ciint snd_vx_pcm_new(struct vx_core *chip); 30162306a36Sopenharmony_civoid vx_pcm_update_intr(struct vx_core *chip, unsigned int events); 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ci/* 30462306a36Sopenharmony_ci * mixer stuff 30562306a36Sopenharmony_ci */ 30662306a36Sopenharmony_ciint snd_vx_mixer_new(struct vx_core *chip); 30762306a36Sopenharmony_civoid vx_toggle_dac_mute(struct vx_core *chip, int mute); 30862306a36Sopenharmony_ciint vx_sync_audio_source(struct vx_core *chip); 30962306a36Sopenharmony_ciint vx_set_monitor_level(struct vx_core *chip, int audio, int level, int active); 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci/* 31262306a36Sopenharmony_ci * IEC958 & clock stuff 31362306a36Sopenharmony_ci */ 31462306a36Sopenharmony_civoid vx_set_iec958_status(struct vx_core *chip, unsigned int bits); 31562306a36Sopenharmony_ciint vx_set_clock(struct vx_core *chip, unsigned int freq); 31662306a36Sopenharmony_civoid vx_set_internal_clock(struct vx_core *chip, unsigned int freq); 31762306a36Sopenharmony_ciint vx_change_frequency(struct vx_core *chip); 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_ci/* 32162306a36Sopenharmony_ci * PM 32262306a36Sopenharmony_ci */ 32362306a36Sopenharmony_ciint snd_vx_suspend(struct vx_core *card); 32462306a36Sopenharmony_ciint snd_vx_resume(struct vx_core *card); 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci/* 32762306a36Sopenharmony_ci * hardware constants 32862306a36Sopenharmony_ci */ 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ci#define vx_has_new_dsp(chip) ((chip)->type != VX_TYPE_BOARD) 33162306a36Sopenharmony_ci#define vx_is_pcmcia(chip) ((chip)->type >= VX_TYPE_VXPOCKET) 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci/* audio input source */ 33462306a36Sopenharmony_cienum { 33562306a36Sopenharmony_ci VX_AUDIO_SRC_DIGITAL, 33662306a36Sopenharmony_ci VX_AUDIO_SRC_LINE, 33762306a36Sopenharmony_ci VX_AUDIO_SRC_MIC 33862306a36Sopenharmony_ci}; 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ci/* clock source */ 34162306a36Sopenharmony_cienum { 34262306a36Sopenharmony_ci INTERNAL_QUARTZ, 34362306a36Sopenharmony_ci UER_SYNC 34462306a36Sopenharmony_ci}; 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_ci/* clock mode */ 34762306a36Sopenharmony_cienum { 34862306a36Sopenharmony_ci VX_CLOCK_MODE_AUTO, /* depending on the current audio source */ 34962306a36Sopenharmony_ci VX_CLOCK_MODE_INTERNAL, /* fixed to internal quartz */ 35062306a36Sopenharmony_ci VX_CLOCK_MODE_EXTERNAL /* fixed to UER sync */ 35162306a36Sopenharmony_ci}; 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_ci/* SPDIF/UER type */ 35462306a36Sopenharmony_cienum { 35562306a36Sopenharmony_ci VX_UER_MODE_CONSUMER, 35662306a36Sopenharmony_ci VX_UER_MODE_PROFESSIONAL, 35762306a36Sopenharmony_ci VX_UER_MODE_NOT_PRESENT, 35862306a36Sopenharmony_ci}; 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci/* register indices */ 36162306a36Sopenharmony_cienum { 36262306a36Sopenharmony_ci VX_ICR, 36362306a36Sopenharmony_ci VX_CVR, 36462306a36Sopenharmony_ci VX_ISR, 36562306a36Sopenharmony_ci VX_IVR, 36662306a36Sopenharmony_ci VX_RXH, 36762306a36Sopenharmony_ci VX_TXH = VX_RXH, 36862306a36Sopenharmony_ci VX_RXM, 36962306a36Sopenharmony_ci VX_TXM = VX_RXM, 37062306a36Sopenharmony_ci VX_RXL, 37162306a36Sopenharmony_ci VX_TXL = VX_RXL, 37262306a36Sopenharmony_ci VX_DMA, 37362306a36Sopenharmony_ci VX_CDSP, 37462306a36Sopenharmony_ci VX_RFREQ, 37562306a36Sopenharmony_ci VX_RUER_V2, 37662306a36Sopenharmony_ci VX_GAIN, 37762306a36Sopenharmony_ci VX_DATA = VX_GAIN, 37862306a36Sopenharmony_ci VX_MEMIRQ, 37962306a36Sopenharmony_ci VX_ACQ, 38062306a36Sopenharmony_ci VX_BIT0, 38162306a36Sopenharmony_ci VX_BIT1, 38262306a36Sopenharmony_ci VX_MIC0, 38362306a36Sopenharmony_ci VX_MIC1, 38462306a36Sopenharmony_ci VX_MIC2, 38562306a36Sopenharmony_ci VX_MIC3, 38662306a36Sopenharmony_ci VX_PLX0, 38762306a36Sopenharmony_ci VX_PLX1, 38862306a36Sopenharmony_ci VX_PLX2, 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ci VX_LOFREQ, // V2: ACQ, VP: RFREQ 39162306a36Sopenharmony_ci VX_HIFREQ, // V2: BIT0, VP: RUER_V2 39262306a36Sopenharmony_ci VX_CSUER, // V2: BIT1, VP: BIT0 39362306a36Sopenharmony_ci VX_RUER, // V2: RUER_V2, VP: BIT1 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci VX_REG_MAX, 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_ci /* aliases for VX board */ 39862306a36Sopenharmony_ci VX_RESET_DMA = VX_ISR, 39962306a36Sopenharmony_ci VX_CFG = VX_RFREQ, 40062306a36Sopenharmony_ci VX_STATUS = VX_MEMIRQ, 40162306a36Sopenharmony_ci VX_SELMIC = VX_MIC0, 40262306a36Sopenharmony_ci VX_COMPOT = VX_MIC1, 40362306a36Sopenharmony_ci VX_SCOMPR = VX_MIC2, 40462306a36Sopenharmony_ci VX_GLIMIT = VX_MIC3, 40562306a36Sopenharmony_ci VX_INTCSR = VX_PLX0, 40662306a36Sopenharmony_ci VX_CNTRL = VX_PLX1, 40762306a36Sopenharmony_ci VX_GPIOC = VX_PLX2, 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_ci /* aliases for VXPOCKET board */ 41062306a36Sopenharmony_ci VX_MICRO = VX_MEMIRQ, 41162306a36Sopenharmony_ci VX_CODEC2 = VX_MEMIRQ, 41262306a36Sopenharmony_ci VX_DIALOG = VX_ACQ, 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_ci}; 41562306a36Sopenharmony_ci 41662306a36Sopenharmony_ci/* RMH status type */ 41762306a36Sopenharmony_cienum { 41862306a36Sopenharmony_ci RMH_SSIZE_FIXED = 0, /* status size given by the driver (in LgStat) */ 41962306a36Sopenharmony_ci RMH_SSIZE_ARG = 1, /* status size given in the LSB byte */ 42062306a36Sopenharmony_ci RMH_SSIZE_MASK = 2, /* status size given in bitmask */ 42162306a36Sopenharmony_ci}; 42262306a36Sopenharmony_ci 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_ci/* bits for ICR register */ 42562306a36Sopenharmony_ci#define ICR_HF1 0x10 42662306a36Sopenharmony_ci#define ICR_HF0 0x08 42762306a36Sopenharmony_ci#define ICR_TREQ 0x02 /* Interrupt mode + HREQ set on for transfer (->DSP) request */ 42862306a36Sopenharmony_ci#define ICR_RREQ 0x01 /* Interrupt mode + RREQ set on for transfer (->PC) request */ 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_ci/* bits for CVR register */ 43162306a36Sopenharmony_ci#define CVR_HC 0x80 43262306a36Sopenharmony_ci 43362306a36Sopenharmony_ci/* bits for ISR register */ 43462306a36Sopenharmony_ci#define ISR_HF3 0x10 43562306a36Sopenharmony_ci#define ISR_HF2 0x08 43662306a36Sopenharmony_ci#define ISR_CHK 0x10 43762306a36Sopenharmony_ci#define ISR_ERR 0x08 43862306a36Sopenharmony_ci#define ISR_TX_READY 0x04 43962306a36Sopenharmony_ci#define ISR_TX_EMPTY 0x02 44062306a36Sopenharmony_ci#define ISR_RX_FULL 0x01 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_ci/* Constants used to access the DATA register */ 44362306a36Sopenharmony_ci#define VX_DATA_CODEC_MASK 0x80 44462306a36Sopenharmony_ci#define VX_DATA_XICOR_MASK 0x80 44562306a36Sopenharmony_ci 44662306a36Sopenharmony_ci/* Constants used to access the CSUER register (both for VX2 and VXP) */ 44762306a36Sopenharmony_ci#define VX_SUER_FREQ_MASK 0x0c 44862306a36Sopenharmony_ci#define VX_SUER_FREQ_32KHz_MASK 0x0c 44962306a36Sopenharmony_ci#define VX_SUER_FREQ_44KHz_MASK 0x00 45062306a36Sopenharmony_ci#define VX_SUER_FREQ_48KHz_MASK 0x04 45162306a36Sopenharmony_ci#define VX_SUER_DATA_PRESENT_MASK 0x02 45262306a36Sopenharmony_ci#define VX_SUER_CLOCK_PRESENT_MASK 0x01 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_ci#define VX_CUER_HH_BITC_SEL_MASK 0x08 45562306a36Sopenharmony_ci#define VX_CUER_MH_BITC_SEL_MASK 0x04 45662306a36Sopenharmony_ci#define VX_CUER_ML_BITC_SEL_MASK 0x02 45762306a36Sopenharmony_ci#define VX_CUER_LL_BITC_SEL_MASK 0x01 45862306a36Sopenharmony_ci 45962306a36Sopenharmony_ci#define XX_UER_CBITS_OFFSET_MASK 0x1f 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ci 46262306a36Sopenharmony_ci/* bits for audio_info */ 46362306a36Sopenharmony_ci#define VX_AUDIO_INFO_REAL_TIME (1<<0) /* real-time processing available */ 46462306a36Sopenharmony_ci#define VX_AUDIO_INFO_OFFLINE (1<<1) /* offline processing available */ 46562306a36Sopenharmony_ci#define VX_AUDIO_INFO_MPEG1 (1<<5) 46662306a36Sopenharmony_ci#define VX_AUDIO_INFO_MPEG2 (1<<6) 46762306a36Sopenharmony_ci#define VX_AUDIO_INFO_LINEAR_8 (1<<7) 46862306a36Sopenharmony_ci#define VX_AUDIO_INFO_LINEAR_16 (1<<8) 46962306a36Sopenharmony_ci#define VX_AUDIO_INFO_LINEAR_24 (1<<9) 47062306a36Sopenharmony_ci 47162306a36Sopenharmony_ci/* DSP Interrupt Request values */ 47262306a36Sopenharmony_ci#define VXP_IRQ_OFFSET 0x40 /* add 0x40 offset for vxpocket and vx222/v2 */ 47362306a36Sopenharmony_ci/* call with vx_send_irq_dsp() */ 47462306a36Sopenharmony_ci#define IRQ_MESS_WRITE_END 0x30 47562306a36Sopenharmony_ci#define IRQ_MESS_WRITE_NEXT 0x32 47662306a36Sopenharmony_ci#define IRQ_MESS_READ_NEXT 0x34 47762306a36Sopenharmony_ci#define IRQ_MESS_READ_END 0x36 47862306a36Sopenharmony_ci#define IRQ_MESSAGE 0x38 47962306a36Sopenharmony_ci#define IRQ_RESET_CHK 0x3A 48062306a36Sopenharmony_ci#define IRQ_CONNECT_STREAM_NEXT 0x26 48162306a36Sopenharmony_ci#define IRQ_CONNECT_STREAM_END 0x28 48262306a36Sopenharmony_ci#define IRQ_PAUSE_START_CONNECT 0x2A 48362306a36Sopenharmony_ci#define IRQ_END_CONNECTION 0x2C 48462306a36Sopenharmony_ci 48562306a36Sopenharmony_ci/* Is there async. events pending ( IT Source Test ) */ 48662306a36Sopenharmony_ci#define ASYNC_EVENTS_PENDING 0x008000 48762306a36Sopenharmony_ci#define HBUFFER_EVENTS_PENDING 0x004000 // Not always accurate 48862306a36Sopenharmony_ci#define NOTIF_EVENTS_PENDING 0x002000 48962306a36Sopenharmony_ci#define TIME_CODE_EVENT_PENDING 0x001000 49062306a36Sopenharmony_ci#define FREQUENCY_CHANGE_EVENT_PENDING 0x000800 49162306a36Sopenharmony_ci#define END_OF_BUFFER_EVENTS_PENDING 0x000400 49262306a36Sopenharmony_ci#define FATAL_DSP_ERROR 0xff0000 49362306a36Sopenharmony_ci 49462306a36Sopenharmony_ci/* Stream Format Header Defines */ 49562306a36Sopenharmony_ci#define HEADER_FMT_BASE 0xFED00000 49662306a36Sopenharmony_ci#define HEADER_FMT_MONO 0x000000C0 49762306a36Sopenharmony_ci#define HEADER_FMT_INTEL 0x00008000 49862306a36Sopenharmony_ci#define HEADER_FMT_16BITS 0x00002000 49962306a36Sopenharmony_ci#define HEADER_FMT_24BITS 0x00004000 50062306a36Sopenharmony_ci#define HEADER_FMT_UPTO11 0x00000200 /* frequency is less or equ. to 11k.*/ 50162306a36Sopenharmony_ci#define HEADER_FMT_UPTO32 0x00000100 /* frequency is over 11k and less then 32k.*/ 50262306a36Sopenharmony_ci 50362306a36Sopenharmony_ci/* Constants used to access the Codec */ 50462306a36Sopenharmony_ci#define XX_CODEC_SELECTOR 0x20 50562306a36Sopenharmony_ci/* codec commands */ 50662306a36Sopenharmony_ci#define XX_CODEC_ADC_CONTROL_REGISTER 0x01 50762306a36Sopenharmony_ci#define XX_CODEC_DAC_CONTROL_REGISTER 0x02 50862306a36Sopenharmony_ci#define XX_CODEC_LEVEL_LEFT_REGISTER 0x03 50962306a36Sopenharmony_ci#define XX_CODEC_LEVEL_RIGHT_REGISTER 0x04 51062306a36Sopenharmony_ci#define XX_CODEC_PORT_MODE_REGISTER 0x05 51162306a36Sopenharmony_ci#define XX_CODEC_STATUS_REPORT_REGISTER 0x06 51262306a36Sopenharmony_ci#define XX_CODEC_CLOCK_CONTROL_REGISTER 0x07 51362306a36Sopenharmony_ci 51462306a36Sopenharmony_ci/* 51562306a36Sopenharmony_ci * Audio-level control values 51662306a36Sopenharmony_ci */ 51762306a36Sopenharmony_ci#define CVAL_M110DB 0x000 /* -110dB */ 51862306a36Sopenharmony_ci#define CVAL_M99DB 0x02C 51962306a36Sopenharmony_ci#define CVAL_M21DB 0x163 52062306a36Sopenharmony_ci#define CVAL_M18DB 0x16F 52162306a36Sopenharmony_ci#define CVAL_M10DB 0x18F 52262306a36Sopenharmony_ci#define CVAL_0DB 0x1B7 52362306a36Sopenharmony_ci#define CVAL_18DB 0x1FF /* +18dB */ 52462306a36Sopenharmony_ci#define CVAL_MAX 0x1FF 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_ci#define AUDIO_IO_HAS_MUTE_LEVEL 0x400000 52762306a36Sopenharmony_ci#define AUDIO_IO_HAS_MUTE_MONITORING_1 0x200000 52862306a36Sopenharmony_ci#define AUDIO_IO_HAS_MUTE_MONITORING_2 0x100000 52962306a36Sopenharmony_ci#define VALID_AUDIO_IO_DIGITAL_LEVEL 0x01 53062306a36Sopenharmony_ci#define VALID_AUDIO_IO_MONITORING_LEVEL 0x02 53162306a36Sopenharmony_ci#define VALID_AUDIO_IO_MUTE_LEVEL 0x04 53262306a36Sopenharmony_ci#define VALID_AUDIO_IO_MUTE_MONITORING_1 0x08 53362306a36Sopenharmony_ci#define VALID_AUDIO_IO_MUTE_MONITORING_2 0x10 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_ci 53662306a36Sopenharmony_ci#endif /* __SOUND_VX_COMMON_H */ 537