18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards 48c2ecf20Sopenharmony_ci * Copyright (c) by Jaroslav Kysela <perex@perex.cz> 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#ifndef __CS46XX_DSP_SPOS_H__ 88c2ecf20Sopenharmony_ci#define __CS46XX_DSP_SPOS_H__ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include "cs46xx_dsp_scb_types.h" 118c2ecf20Sopenharmony_ci#include "cs46xx_dsp_task_types.h" 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#define SYMBOL_CONSTANT 0x0 148c2ecf20Sopenharmony_ci#define SYMBOL_SAMPLE 0x1 158c2ecf20Sopenharmony_ci#define SYMBOL_PARAMETER 0x2 168c2ecf20Sopenharmony_ci#define SYMBOL_CODE 0x3 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#define SEGTYPE_SP_PROGRAM 0x00000001 198c2ecf20Sopenharmony_ci#define SEGTYPE_SP_PARAMETER 0x00000002 208c2ecf20Sopenharmony_ci#define SEGTYPE_SP_SAMPLE 0x00000003 218c2ecf20Sopenharmony_ci#define SEGTYPE_SP_COEFFICIENT 0x00000004 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci#define DSP_SPOS_UU 0x0deadul /* unused */ 248c2ecf20Sopenharmony_ci#define DSP_SPOS_DC 0x0badul /* don't care */ 258c2ecf20Sopenharmony_ci#define DSP_SPOS_DC_DC 0x0bad0badul /* don't care */ 268c2ecf20Sopenharmony_ci#define DSP_SPOS_UUUU 0xdeadc0edul /* unused */ 278c2ecf20Sopenharmony_ci#define DSP_SPOS_UUHI 0xdeadul 288c2ecf20Sopenharmony_ci#define DSP_SPOS_UULO 0xc0edul 298c2ecf20Sopenharmony_ci#define DSP_SPOS_DCDC 0x0badf1d0ul /* don't care */ 308c2ecf20Sopenharmony_ci#define DSP_SPOS_DCDCHI 0x0badul 318c2ecf20Sopenharmony_ci#define DSP_SPOS_DCDCLO 0xf1d0ul 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci#define DSP_MAX_TASK_NAME 60 348c2ecf20Sopenharmony_ci#define DSP_MAX_SYMBOL_NAME 100 358c2ecf20Sopenharmony_ci#define DSP_MAX_SCB_NAME 60 368c2ecf20Sopenharmony_ci#define DSP_MAX_SCB_DESC 200 378c2ecf20Sopenharmony_ci#define DSP_MAX_TASK_DESC 50 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci#define DSP_MAX_PCM_CHANNELS 32 408c2ecf20Sopenharmony_ci#define DSP_MAX_SRC_NR 14 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci#define DSP_PCM_MAIN_CHANNEL 1 438c2ecf20Sopenharmony_ci#define DSP_PCM_REAR_CHANNEL 2 448c2ecf20Sopenharmony_ci#define DSP_PCM_CENTER_LFE_CHANNEL 3 458c2ecf20Sopenharmony_ci#define DSP_PCM_S71_CHANNEL 4 /* surround 7.1 */ 468c2ecf20Sopenharmony_ci#define DSP_IEC958_CHANNEL 5 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci#define DSP_SPDIF_STATUS_OUTPUT_ENABLED 1 498c2ecf20Sopenharmony_ci#define DSP_SPDIF_STATUS_PLAYBACK_OPEN 2 508c2ecf20Sopenharmony_ci#define DSP_SPDIF_STATUS_HW_ENABLED 4 518c2ecf20Sopenharmony_ci#define DSP_SPDIF_STATUS_INPUT_CTRL_ENABLED 8 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_cistruct dsp_symbol_entry { 548c2ecf20Sopenharmony_ci u32 address; 558c2ecf20Sopenharmony_ci char symbol_name[DSP_MAX_SYMBOL_NAME]; 568c2ecf20Sopenharmony_ci int symbol_type; 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci /* initialized by driver */ 598c2ecf20Sopenharmony_ci struct dsp_module_desc * module; 608c2ecf20Sopenharmony_ci int deleted; 618c2ecf20Sopenharmony_ci}; 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_cistruct dsp_symbol_desc { 648c2ecf20Sopenharmony_ci int nsymbols; 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci struct dsp_symbol_entry *symbols; 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci /* initialized by driver */ 698c2ecf20Sopenharmony_ci int highest_frag_index; 708c2ecf20Sopenharmony_ci}; 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_cistruct dsp_segment_desc { 738c2ecf20Sopenharmony_ci int segment_type; 748c2ecf20Sopenharmony_ci u32 offset; 758c2ecf20Sopenharmony_ci u32 size; 768c2ecf20Sopenharmony_ci u32 * data; 778c2ecf20Sopenharmony_ci}; 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_cistruct dsp_module_desc { 808c2ecf20Sopenharmony_ci char * module_name; 818c2ecf20Sopenharmony_ci struct dsp_symbol_desc symbol_table; 828c2ecf20Sopenharmony_ci int nsegments; 838c2ecf20Sopenharmony_ci struct dsp_segment_desc * segments; 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci /* initialized by driver */ 868c2ecf20Sopenharmony_ci u32 overlay_begin_address; 878c2ecf20Sopenharmony_ci u32 load_address; 888c2ecf20Sopenharmony_ci int nfixups; 898c2ecf20Sopenharmony_ci}; 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_cistruct dsp_scb_descriptor { 928c2ecf20Sopenharmony_ci char scb_name[DSP_MAX_SCB_NAME]; 938c2ecf20Sopenharmony_ci u32 address; 948c2ecf20Sopenharmony_ci int index; 958c2ecf20Sopenharmony_ci u32 *data; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci struct dsp_scb_descriptor * sub_list_ptr; 988c2ecf20Sopenharmony_ci struct dsp_scb_descriptor * next_scb_ptr; 998c2ecf20Sopenharmony_ci struct dsp_scb_descriptor * parent_scb_ptr; 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ci struct dsp_symbol_entry * task_entry; 1028c2ecf20Sopenharmony_ci struct dsp_symbol_entry * scb_symbol; 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci struct snd_info_entry *proc_info; 1058c2ecf20Sopenharmony_ci int ref_count; 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci u16 volume[2]; 1088c2ecf20Sopenharmony_ci unsigned int deleted :1; 1098c2ecf20Sopenharmony_ci unsigned int updated :1; 1108c2ecf20Sopenharmony_ci unsigned int volume_set :1; 1118c2ecf20Sopenharmony_ci}; 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_cistruct dsp_task_descriptor { 1148c2ecf20Sopenharmony_ci char task_name[DSP_MAX_TASK_NAME]; 1158c2ecf20Sopenharmony_ci int size; 1168c2ecf20Sopenharmony_ci u32 address; 1178c2ecf20Sopenharmony_ci int index; 1188c2ecf20Sopenharmony_ci u32 *data; 1198c2ecf20Sopenharmony_ci}; 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_cistruct dsp_pcm_channel_descriptor { 1228c2ecf20Sopenharmony_ci int active; 1238c2ecf20Sopenharmony_ci int src_slot; 1248c2ecf20Sopenharmony_ci int pcm_slot; 1258c2ecf20Sopenharmony_ci u32 sample_rate; 1268c2ecf20Sopenharmony_ci u32 unlinked; 1278c2ecf20Sopenharmony_ci struct dsp_scb_descriptor * pcm_reader_scb; 1288c2ecf20Sopenharmony_ci struct dsp_scb_descriptor * src_scb; 1298c2ecf20Sopenharmony_ci struct dsp_scb_descriptor * mixer_scb; 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_ci void * private_data; 1328c2ecf20Sopenharmony_ci}; 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_cistruct dsp_spos_instance { 1358c2ecf20Sopenharmony_ci struct dsp_symbol_desc symbol_table; /* currently available loaded symbols in SP */ 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci int nmodules; 1388c2ecf20Sopenharmony_ci struct dsp_module_desc * modules; /* modules loaded into SP */ 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_ci struct dsp_segment_desc code; 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_ci /* Main PCM playback mixer */ 1438c2ecf20Sopenharmony_ci struct dsp_scb_descriptor * master_mix_scb; 1448c2ecf20Sopenharmony_ci u16 dac_volume_right; 1458c2ecf20Sopenharmony_ci u16 dac_volume_left; 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_ci /* Rear/surround PCM playback mixer */ 1488c2ecf20Sopenharmony_ci struct dsp_scb_descriptor * rear_mix_scb; 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci /* Center/LFE mixer */ 1518c2ecf20Sopenharmony_ci struct dsp_scb_descriptor * center_lfe_mix_scb; 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_ci int npcm_channels; 1548c2ecf20Sopenharmony_ci int nsrc_scb; 1558c2ecf20Sopenharmony_ci struct dsp_pcm_channel_descriptor pcm_channels[DSP_MAX_PCM_CHANNELS]; 1568c2ecf20Sopenharmony_ci int src_scb_slots[DSP_MAX_SRC_NR]; 1578c2ecf20Sopenharmony_ci 1588c2ecf20Sopenharmony_ci /* cache this symbols */ 1598c2ecf20Sopenharmony_ci struct dsp_symbol_entry * null_algorithm; /* used by PCMreaderSCB's */ 1608c2ecf20Sopenharmony_ci struct dsp_symbol_entry * s16_up; /* used by SRCtaskSCB's */ 1618c2ecf20Sopenharmony_ci 1628c2ecf20Sopenharmony_ci /* proc fs */ 1638c2ecf20Sopenharmony_ci struct snd_card *snd_card; 1648c2ecf20Sopenharmony_ci struct snd_info_entry * proc_dsp_dir; 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_ci /* SCB's descriptors */ 1678c2ecf20Sopenharmony_ci int nscb; 1688c2ecf20Sopenharmony_ci int scb_highest_frag_index; 1698c2ecf20Sopenharmony_ci struct dsp_scb_descriptor scbs[DSP_MAX_SCB_DESC]; 1708c2ecf20Sopenharmony_ci struct dsp_scb_descriptor * the_null_scb; 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_ci /* Task's descriptors */ 1738c2ecf20Sopenharmony_ci int ntask; 1748c2ecf20Sopenharmony_ci struct dsp_task_descriptor tasks[DSP_MAX_TASK_DESC]; 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_ci /* SPDIF status */ 1778c2ecf20Sopenharmony_ci int spdif_status_out; 1788c2ecf20Sopenharmony_ci int spdif_status_in; 1798c2ecf20Sopenharmony_ci u16 spdif_input_volume_right; 1808c2ecf20Sopenharmony_ci u16 spdif_input_volume_left; 1818c2ecf20Sopenharmony_ci /* spdif channel status, 1828c2ecf20Sopenharmony_ci left right and user validity bits */ 1838c2ecf20Sopenharmony_ci unsigned int spdif_csuv_default; 1848c2ecf20Sopenharmony_ci unsigned int spdif_csuv_stream; 1858c2ecf20Sopenharmony_ci 1868c2ecf20Sopenharmony_ci /* SPDIF input sample rate converter */ 1878c2ecf20Sopenharmony_ci struct dsp_scb_descriptor * spdif_in_src; 1888c2ecf20Sopenharmony_ci /* SPDIF input asynch. receiver */ 1898c2ecf20Sopenharmony_ci struct dsp_scb_descriptor * asynch_rx_scb; 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_ci /* Capture record mixer SCB */ 1928c2ecf20Sopenharmony_ci struct dsp_scb_descriptor * record_mixer_scb; 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_ci /* CODEC input SCB */ 1958c2ecf20Sopenharmony_ci struct dsp_scb_descriptor * codec_in_scb; 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_ci /* reference snooper */ 1988c2ecf20Sopenharmony_ci struct dsp_scb_descriptor * ref_snoop_scb; 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_ci /* SPDIF output PCM reference */ 2018c2ecf20Sopenharmony_ci struct dsp_scb_descriptor * spdif_pcm_input_scb; 2028c2ecf20Sopenharmony_ci 2038c2ecf20Sopenharmony_ci /* asynch TX task */ 2048c2ecf20Sopenharmony_ci struct dsp_scb_descriptor * asynch_tx_scb; 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_ci /* record sources */ 2078c2ecf20Sopenharmony_ci struct dsp_scb_descriptor * pcm_input; 2088c2ecf20Sopenharmony_ci struct dsp_scb_descriptor * adc_input; 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_ci int spdif_in_sample_rate; 2118c2ecf20Sopenharmony_ci}; 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_ci#endif /* __DSP_SPOS_H__ */ 214