162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards 462306a36Sopenharmony_ci * Copyright (c) by Jaroslav Kysela <perex@perex.cz> 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef __CS46XX_DSP_SPOS_H__ 862306a36Sopenharmony_ci#define __CS46XX_DSP_SPOS_H__ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include "cs46xx_dsp_scb_types.h" 1162306a36Sopenharmony_ci#include "cs46xx_dsp_task_types.h" 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define SYMBOL_CONSTANT 0x0 1462306a36Sopenharmony_ci#define SYMBOL_SAMPLE 0x1 1562306a36Sopenharmony_ci#define SYMBOL_PARAMETER 0x2 1662306a36Sopenharmony_ci#define SYMBOL_CODE 0x3 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define SEGTYPE_SP_PROGRAM 0x00000001 1962306a36Sopenharmony_ci#define SEGTYPE_SP_PARAMETER 0x00000002 2062306a36Sopenharmony_ci#define SEGTYPE_SP_SAMPLE 0x00000003 2162306a36Sopenharmony_ci#define SEGTYPE_SP_COEFFICIENT 0x00000004 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#define DSP_SPOS_UU 0x0deadul /* unused */ 2462306a36Sopenharmony_ci#define DSP_SPOS_DC 0x0badul /* don't care */ 2562306a36Sopenharmony_ci#define DSP_SPOS_DC_DC 0x0bad0badul /* don't care */ 2662306a36Sopenharmony_ci#define DSP_SPOS_UUUU 0xdeadc0edul /* unused */ 2762306a36Sopenharmony_ci#define DSP_SPOS_UUHI 0xdeadul 2862306a36Sopenharmony_ci#define DSP_SPOS_UULO 0xc0edul 2962306a36Sopenharmony_ci#define DSP_SPOS_DCDC 0x0badf1d0ul /* don't care */ 3062306a36Sopenharmony_ci#define DSP_SPOS_DCDCHI 0x0badul 3162306a36Sopenharmony_ci#define DSP_SPOS_DCDCLO 0xf1d0ul 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#define DSP_MAX_TASK_NAME 60 3462306a36Sopenharmony_ci#define DSP_MAX_SYMBOL_NAME 100 3562306a36Sopenharmony_ci#define DSP_MAX_SCB_NAME 60 3662306a36Sopenharmony_ci#define DSP_MAX_SCB_DESC 200 3762306a36Sopenharmony_ci#define DSP_MAX_TASK_DESC 50 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci#define DSP_MAX_PCM_CHANNELS 32 4062306a36Sopenharmony_ci#define DSP_MAX_SRC_NR 14 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci#define DSP_PCM_MAIN_CHANNEL 1 4362306a36Sopenharmony_ci#define DSP_PCM_REAR_CHANNEL 2 4462306a36Sopenharmony_ci#define DSP_PCM_CENTER_LFE_CHANNEL 3 4562306a36Sopenharmony_ci#define DSP_PCM_S71_CHANNEL 4 /* surround 7.1 */ 4662306a36Sopenharmony_ci#define DSP_IEC958_CHANNEL 5 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci#define DSP_SPDIF_STATUS_OUTPUT_ENABLED 1 4962306a36Sopenharmony_ci#define DSP_SPDIF_STATUS_PLAYBACK_OPEN 2 5062306a36Sopenharmony_ci#define DSP_SPDIF_STATUS_HW_ENABLED 4 5162306a36Sopenharmony_ci#define DSP_SPDIF_STATUS_INPUT_CTRL_ENABLED 8 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_cistruct dsp_symbol_entry { 5462306a36Sopenharmony_ci u32 address; 5562306a36Sopenharmony_ci char symbol_name[DSP_MAX_SYMBOL_NAME]; 5662306a36Sopenharmony_ci int symbol_type; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci /* initialized by driver */ 5962306a36Sopenharmony_ci struct dsp_module_desc * module; 6062306a36Sopenharmony_ci int deleted; 6162306a36Sopenharmony_ci}; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cistruct dsp_symbol_desc { 6462306a36Sopenharmony_ci int nsymbols; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci struct dsp_symbol_entry *symbols; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci /* initialized by driver */ 6962306a36Sopenharmony_ci int highest_frag_index; 7062306a36Sopenharmony_ci}; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_cistruct dsp_segment_desc { 7362306a36Sopenharmony_ci int segment_type; 7462306a36Sopenharmony_ci u32 offset; 7562306a36Sopenharmony_ci u32 size; 7662306a36Sopenharmony_ci u32 * data; 7762306a36Sopenharmony_ci}; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_cistruct dsp_module_desc { 8062306a36Sopenharmony_ci char * module_name; 8162306a36Sopenharmony_ci struct dsp_symbol_desc symbol_table; 8262306a36Sopenharmony_ci int nsegments; 8362306a36Sopenharmony_ci struct dsp_segment_desc * segments; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci /* initialized by driver */ 8662306a36Sopenharmony_ci u32 overlay_begin_address; 8762306a36Sopenharmony_ci u32 load_address; 8862306a36Sopenharmony_ci int nfixups; 8962306a36Sopenharmony_ci}; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_cistruct dsp_scb_descriptor { 9262306a36Sopenharmony_ci char scb_name[DSP_MAX_SCB_NAME]; 9362306a36Sopenharmony_ci u32 address; 9462306a36Sopenharmony_ci int index; 9562306a36Sopenharmony_ci u32 *data; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci struct dsp_scb_descriptor * sub_list_ptr; 9862306a36Sopenharmony_ci struct dsp_scb_descriptor * next_scb_ptr; 9962306a36Sopenharmony_ci struct dsp_scb_descriptor * parent_scb_ptr; 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci struct dsp_symbol_entry * task_entry; 10262306a36Sopenharmony_ci struct dsp_symbol_entry * scb_symbol; 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci struct snd_info_entry *proc_info; 10562306a36Sopenharmony_ci int ref_count; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci u16 volume[2]; 10862306a36Sopenharmony_ci unsigned int deleted :1; 10962306a36Sopenharmony_ci unsigned int updated :1; 11062306a36Sopenharmony_ci unsigned int volume_set :1; 11162306a36Sopenharmony_ci}; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_cistruct dsp_task_descriptor { 11462306a36Sopenharmony_ci char task_name[DSP_MAX_TASK_NAME]; 11562306a36Sopenharmony_ci int size; 11662306a36Sopenharmony_ci u32 address; 11762306a36Sopenharmony_ci int index; 11862306a36Sopenharmony_ci u32 *data; 11962306a36Sopenharmony_ci}; 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_cistruct dsp_pcm_channel_descriptor { 12262306a36Sopenharmony_ci int active; 12362306a36Sopenharmony_ci int src_slot; 12462306a36Sopenharmony_ci int pcm_slot; 12562306a36Sopenharmony_ci u32 sample_rate; 12662306a36Sopenharmony_ci u32 unlinked; 12762306a36Sopenharmony_ci struct dsp_scb_descriptor * pcm_reader_scb; 12862306a36Sopenharmony_ci struct dsp_scb_descriptor * src_scb; 12962306a36Sopenharmony_ci struct dsp_scb_descriptor * mixer_scb; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci void * private_data; 13262306a36Sopenharmony_ci}; 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_cistruct dsp_spos_instance { 13562306a36Sopenharmony_ci struct dsp_symbol_desc symbol_table; /* currently available loaded symbols in SP */ 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci int nmodules; 13862306a36Sopenharmony_ci struct dsp_module_desc * modules; /* modules loaded into SP */ 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci struct dsp_segment_desc code; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci /* Main PCM playback mixer */ 14362306a36Sopenharmony_ci struct dsp_scb_descriptor * master_mix_scb; 14462306a36Sopenharmony_ci u16 dac_volume_right; 14562306a36Sopenharmony_ci u16 dac_volume_left; 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci /* Rear/surround PCM playback mixer */ 14862306a36Sopenharmony_ci struct dsp_scb_descriptor * rear_mix_scb; 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci /* Center/LFE mixer */ 15162306a36Sopenharmony_ci struct dsp_scb_descriptor * center_lfe_mix_scb; 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci int npcm_channels; 15462306a36Sopenharmony_ci int nsrc_scb; 15562306a36Sopenharmony_ci struct dsp_pcm_channel_descriptor pcm_channels[DSP_MAX_PCM_CHANNELS]; 15662306a36Sopenharmony_ci int src_scb_slots[DSP_MAX_SRC_NR]; 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci /* cache this symbols */ 15962306a36Sopenharmony_ci struct dsp_symbol_entry * null_algorithm; /* used by PCMreaderSCB's */ 16062306a36Sopenharmony_ci struct dsp_symbol_entry * s16_up; /* used by SRCtaskSCB's */ 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci /* proc fs */ 16362306a36Sopenharmony_ci struct snd_card *snd_card; 16462306a36Sopenharmony_ci struct snd_info_entry * proc_dsp_dir; 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci /* SCB's descriptors */ 16762306a36Sopenharmony_ci int nscb; 16862306a36Sopenharmony_ci int scb_highest_frag_index; 16962306a36Sopenharmony_ci struct dsp_scb_descriptor scbs[DSP_MAX_SCB_DESC]; 17062306a36Sopenharmony_ci struct dsp_scb_descriptor * the_null_scb; 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci /* Task's descriptors */ 17362306a36Sopenharmony_ci int ntask; 17462306a36Sopenharmony_ci struct dsp_task_descriptor tasks[DSP_MAX_TASK_DESC]; 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci /* SPDIF status */ 17762306a36Sopenharmony_ci int spdif_status_out; 17862306a36Sopenharmony_ci int spdif_status_in; 17962306a36Sopenharmony_ci u16 spdif_input_volume_right; 18062306a36Sopenharmony_ci u16 spdif_input_volume_left; 18162306a36Sopenharmony_ci /* spdif channel status, 18262306a36Sopenharmony_ci left right and user validity bits */ 18362306a36Sopenharmony_ci unsigned int spdif_csuv_default; 18462306a36Sopenharmony_ci unsigned int spdif_csuv_stream; 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci /* SPDIF input sample rate converter */ 18762306a36Sopenharmony_ci struct dsp_scb_descriptor * spdif_in_src; 18862306a36Sopenharmony_ci /* SPDIF input asynch. receiver */ 18962306a36Sopenharmony_ci struct dsp_scb_descriptor * asynch_rx_scb; 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci /* Capture record mixer SCB */ 19262306a36Sopenharmony_ci struct dsp_scb_descriptor * record_mixer_scb; 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci /* CODEC input SCB */ 19562306a36Sopenharmony_ci struct dsp_scb_descriptor * codec_in_scb; 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci /* reference snooper */ 19862306a36Sopenharmony_ci struct dsp_scb_descriptor * ref_snoop_scb; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci /* SPDIF output PCM reference */ 20162306a36Sopenharmony_ci struct dsp_scb_descriptor * spdif_pcm_input_scb; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci /* asynch TX task */ 20462306a36Sopenharmony_ci struct dsp_scb_descriptor * asynch_tx_scb; 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci /* record sources */ 20762306a36Sopenharmony_ci struct dsp_scb_descriptor * pcm_input; 20862306a36Sopenharmony_ci struct dsp_scb_descriptor * adc_input; 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci int spdif_in_sample_rate; 21162306a36Sopenharmony_ci}; 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci#endif /* __DSP_SPOS_H__ */ 214