mirror of
https://github.com/AetherDroid/android_kernel_samsung_on5xelte.git
synced 2025-09-08 09:08:05 -04:00
453 lines
10 KiB
C
453 lines
10 KiB
C
#ifndef __SEIREN_H
|
|
#define __SEIREN_H
|
|
|
|
/* Register offset */
|
|
#define CA5_BOOTADDR (0x0020)
|
|
#define CA5_WAKEUP (0x0028)
|
|
#define CA5_STATUS (0x002C)
|
|
#define CA5_DBG (0x0030)
|
|
#define SW_INTR_CA5 (0x0040)
|
|
#define INTR_CA5_STATUS (0x0044)
|
|
#define INTR_CA5_MASK (0x0048)
|
|
#define SW_INTR_CPU (0x0050)
|
|
#define INTR_CPU_STATUS (0x0054)
|
|
#define INTR_CPU_MASK (0x0058)
|
|
|
|
#define CA5_STATUS_WFI (1 << 2)
|
|
#define CA5_STATUS_WFE (1 << 1)
|
|
|
|
/* Mailbox between driver and firmware */
|
|
#define VIRSION_ID (0x0000)
|
|
#define CMD_CODE (0x0004)
|
|
#define HANDLE_ID (0x0008)
|
|
#define IP_TYPE (0x000C)
|
|
#define PHY_ADDR_INBUF (0x000C)
|
|
#define PORT_TYPE (0x000C)
|
|
#define PARAM_VAL1 (0x000C)
|
|
#define PHY_ADDR_DYNAMIC_MEM (0x0010)
|
|
#define SIZE_OF_INBUF (0x0010)
|
|
#define PARAM_VAL2 (0x0010)
|
|
#define SIZE_DYNAMIC_MEM (0x0014)
|
|
#define SIZE_OF_INDATA (0x0014)
|
|
#define PHY_ADDR_OUTBUF (0x0018)
|
|
#define SIZE_OF_OUTBUF (0x001C)
|
|
#define RETURN_CMD (0x0040)
|
|
#define IP_ID (0x0044)
|
|
#define SIZE_OUT_DATA (0x0048)
|
|
#define CONSUMED_BYTE_IN (0x004C)
|
|
#define BIT_DEC_SIZE (0x0050)
|
|
#define FRAME_NUM (0x0054)
|
|
#define CH_NUM (0x0058)
|
|
#define FREQ_SAMPLE (0x005C)
|
|
#define PARAMS_CNT (0x0060)
|
|
#define PARAMS_VAL1 (0x0064)
|
|
#define PARAMS_VAL2 (0x0068)
|
|
#define FW_LOG_VAL1 (0x0078)
|
|
#define FW_LOG_VAL2 (0x007C)
|
|
|
|
/* Mailbox between driver and firmware for offload */
|
|
#define COMPR_CMD_CODE (0x0004)
|
|
#define COMPR_HANDLE_ID (0x0008)
|
|
#define COMPR_IP_TYPE (0x000C)
|
|
#define COMPR_SIZE_OF_FRAGMENT (0x0010)
|
|
#define COMPR_PHY_ADDR_INBUF (0x0014)
|
|
#define COMPR_SIZE_OF_INBUF (0x0018)
|
|
#define COMPR_LEFT_VOL (0x001C)
|
|
#define COMPR_RIGHT_VOL (0x0020)
|
|
#define EFFECT_EXT_ON (0x0024)
|
|
#define COMPR_ALPA_NOTI (0x0028)
|
|
#define COMPR_PARAM_RATE (0x0034)
|
|
#define COMPR_PARAM_SAMPLE (0x0038)
|
|
#define COMPR_PARAM_CH (0x003C)
|
|
#define COMPR_RENDERED_PCM_SIZE (0x004C)
|
|
#define COMPR_RETURN_CMD (0x0040)
|
|
#define COMPR_IP_ID (0x0044)
|
|
#define COMPR_SIZE_OUT_DATA (0x0048)
|
|
#define COMPR_CPU_LOCK_LV (0x0054)
|
|
#define COMPR_CHECK_CMD (0x0058)
|
|
#define COMPR_CHECK_RUNNING (0x005C)
|
|
#define COMPR_ACK (0x0060)
|
|
#define COMPR_INTR_ACK (0x0064)
|
|
#define COMPR_INTR_DMA_ACK (0x0068)
|
|
|
|
/* Interrupt type */
|
|
#define INTR_WAKEUP (0x0)
|
|
#define INTR_READY (0x1000)
|
|
#define INTR_DMA (0x2000)
|
|
#define INTR_CREATED (0x3000)
|
|
#define INTR_DECODED (0x4000)
|
|
#define INTR_RENDERED (0x5000)
|
|
#define INTR_FLUSH (0x6000)
|
|
#define INTR_PAUSED (0x6001)
|
|
#define INTR_EOS (0x7000)
|
|
#define INTR_DESTROY (0x8000)
|
|
#define INTR_FX_EXT (0x9000)
|
|
#define INTR_EFF_REQUEST (0xA000)
|
|
#define INTR_SET_CPU_LOCK (0xC000)
|
|
#define INTR_FW_LOG (0xFFFF)
|
|
|
|
|
|
/* Memory size */
|
|
#define FWMEM_SIZE (0x3DC000)
|
|
#define BASEMEM_OFFSET (0x300000)
|
|
#define FWAREA_SIZE (0x400000)
|
|
#define FWAREA_NUM (3)
|
|
#define FWAREA_IOVA (0x50000000)
|
|
|
|
/* Buffer Information - decode */
|
|
#define DEC_IBUF_SIZE (4096)
|
|
#define DEC_OBUF_SIZE (36864)
|
|
|
|
#define DEC_AAC_IBUF_SIZE (0x10000)
|
|
#define DEC_AAC_OBUF_SIZE (0x18000)
|
|
|
|
#define DEC_FLAC_IBUF_SIZE (0x10000)
|
|
#define DEC_FLAC_OBUF_SIZE (0x18000)
|
|
#define DEC_IBUF_NUM (0x2)
|
|
#define DEC_OBUF_NUM (0x2)
|
|
|
|
/* Buffer Information - sound process */
|
|
#define SP_IBUF_SIZE (0x20000)
|
|
#define SP_OBUF_SIZE (0x20000)
|
|
#define SP_IBUF_NUM (0x1)
|
|
#define SP_OBUF_NUM (0x1)
|
|
|
|
/* External effect */
|
|
#ifdef CONFIG_SND_SAMSUNG_SEIREN_OFFLOAD
|
|
#define FX_BUF_OFFSET (0x1C000)
|
|
#else
|
|
#define FX_BUF_OFFSET (0x30000)
|
|
#endif
|
|
#define FX_BUF_SIZE (0x02000)
|
|
|
|
#define INSTANCE_MAX (20)
|
|
#ifdef CONFIG_SND_SAMSUNG_SEIREN_OFFLOAD
|
|
#define SRAM_FW_MAX (0x24000)
|
|
#else
|
|
#define SRAM_FW_MAX (0x3B000)
|
|
#endif
|
|
#define SRAM_IO_BUF (0x31000)
|
|
#define SRAM_IBUF_OFFSET (0)
|
|
#define SRAM_OBUF_OFFSET (DEC_IBUF_SIZE)
|
|
#define BUF_SIZE_MAX (0x50000)
|
|
|
|
#define SAMPLE_RATE_MIN (8000)
|
|
#define CH_NUM_MIN (1)
|
|
#define BAND_NUM_MAX (16)
|
|
|
|
#define FW_LOG_ADDR (0x1B000)
|
|
#define FW_LOG_LINE (30)
|
|
#define FW_LOG_MAX (80)
|
|
|
|
#define FW_ZERO_SET_BASE (0x14000)
|
|
#define FW_ZERO_SET_SIZE (0x1F00)
|
|
|
|
#define FW_SRAM_NAME "seiren_fw_sram.bin"
|
|
#define FW_DRAM_NAME "seiren_fw_dram.bin"
|
|
|
|
#ifdef CONFIG_SND_ESA_SA_EFFECT
|
|
#define EFFECT_OFFSET (0x1A000)
|
|
#endif
|
|
|
|
/* For Debugging */
|
|
#define esa_info(x...) pr_info("SEIREN: " x)
|
|
#define esa_err(x...) pr_err("SEIREN: ERR: " x)
|
|
|
|
#ifdef CONFIG_SND_SAMSUNG_SEIREN_DEBUG
|
|
#define esa_debug(x...) pr_debug("SEIREN: " x)
|
|
#else
|
|
#define esa_debug(x...)
|
|
#endif
|
|
|
|
enum SEIREN_CMDTYPE {
|
|
CMD_CREATE = 0x01,
|
|
CMD_DESTROY,
|
|
CMD_SET_PARAMS,
|
|
CMD_GET_PARAMS,
|
|
CMD_RESET,
|
|
CMD_FLUSH,
|
|
CMD_EXE,
|
|
/* ADMA */
|
|
CMD_DMA_PREPARE = 0x40,
|
|
CMD_DMA_START,
|
|
CMD_DMA_STOP,
|
|
/* OFFLOAD */
|
|
CMD_COMPR_CREATE = 0x50,
|
|
CMD_COMPR_DESTROY,
|
|
CMD_COMPR_SET_PARAM,
|
|
CMD_COMPR_WRITE,
|
|
CMD_COMPR_READ,
|
|
CMD_COMPR_START,
|
|
CMD_COMPR_STOP,
|
|
CMD_COMPR_PAUSE,
|
|
CMD_COMPR_EOS,
|
|
CMD_COMPR_GET_VOLUME,
|
|
CMD_COMPR_SET_VOLUME,
|
|
CMD_COMPR_CA5_WAKEUP,
|
|
CMD_COMPR_HPDET_NOTIFY,
|
|
SYS_RESET = 0x80,
|
|
SYS_RESTAR,
|
|
SYS_RESUME,
|
|
SYS_SUSPEND,
|
|
SYS_GET_STATUS,
|
|
};
|
|
|
|
enum SEIREN_IPTYPE {
|
|
ADEC_MP3 = 0x0,
|
|
ADEC_AAC,
|
|
ADEC_FLAC,
|
|
SOUND_EQ = 0x9,
|
|
SOUND_BASS,
|
|
AENC_AMR,
|
|
AENC_AAC,
|
|
};
|
|
|
|
enum SEIREN_PORTTYPE {
|
|
PORT_IN = 0x1,
|
|
PORT_OUT,
|
|
};
|
|
|
|
enum SEIREN_EOSSTATE {
|
|
EOS_NO = 0x0,
|
|
EOS_YET,
|
|
EOS_FINAL,
|
|
};
|
|
|
|
enum SEIREN_PARAMCMD {
|
|
/* PCM parameters */
|
|
PCM_PARAM_MAX_SAMPLE_RATE = 0x0,
|
|
PCM_PARAM_MAX_NUM_OF_CH,
|
|
PCM_PARAM_MAX_BIT_PER_SAMPLE,
|
|
|
|
PCM_PARAM_SAMPLE_RATE,
|
|
PCM_PARAM_NUM_OF_CH,
|
|
PCM_PARAM_BIT_PER_SAMPLE,
|
|
|
|
PCM_MAX_CONFIG_INFO,
|
|
PCM_CONFIG_INFO,
|
|
|
|
/* EQ parameters */
|
|
EQ_PARAM_NUM_OF_PRESETS = 0x10,
|
|
EQ_PARAM_MAX_NUM_OF_BANDS ,
|
|
EQ_PARAM_RANGE_OF_BANDLEVEL,
|
|
EQ_PARAM_RANGE_OF_FREQ,
|
|
|
|
EQ_PARAM_PRESET_ID,
|
|
EQ_PARAM_NUM_OF_BANDS,
|
|
EQ_PARAM_CENTER_FREQ,
|
|
EQ_PARAM_BANDLEVEL,
|
|
EQ_PARAM_BANDWIDTH,
|
|
|
|
EQ_MAX_CONFIG_INFO,
|
|
EQ_CONFIG_INFO,
|
|
EQ_BAND_INFO,
|
|
|
|
/* BASS parameters */
|
|
|
|
/* Codec Dec parameters */
|
|
ADEC_PARAM_SET_EOS = 0x30,
|
|
ADEC_PARAM_GET_OUTPUT_STATUS,
|
|
|
|
/* MP3 Dec parameters */
|
|
|
|
/* AAC Dec parameters */
|
|
|
|
/* FLAC Dec parameters */
|
|
|
|
/* Codec Enc parameters */
|
|
|
|
/* AMR Enc parameters */
|
|
|
|
/* AAC Enc parameters */
|
|
|
|
/* Buffer info */
|
|
GET_IBUF_POOL_INFO = 0xA0,
|
|
GET_OBUF_POOL_INFO,
|
|
SET_IBUF_POOL_INFO,
|
|
SET_OBUF_POOL_INFO,
|
|
};
|
|
|
|
struct audio_mem_info_t {
|
|
u32 virt_addr;
|
|
u32 phy_addr;
|
|
u32 mem_size;
|
|
u32 data_size;
|
|
u32 block_count;
|
|
};
|
|
|
|
struct audio_pcm_config_info_t {
|
|
u32 direction; /* 0: input, 1:output */
|
|
u32 sample_rate;
|
|
u32 bit_per_sample;
|
|
u32 num_of_channel;
|
|
};
|
|
|
|
struct audio_eq_config_info_t {
|
|
u32 preset_id; /* SEIREN_PRESET_ID */
|
|
u32 num_of_bands;
|
|
u32 band_level[BAND_NUM_MAX];
|
|
u32 center_freq[BAND_NUM_MAX];
|
|
u32 band_width[BAND_NUM_MAX];
|
|
};
|
|
|
|
struct audio_eq_max_config_info_t {
|
|
u32 max_num_of_presets;
|
|
u32 max_num_of_bands;
|
|
u32 range_of_freq;
|
|
u32 range_of_band_level;
|
|
};
|
|
|
|
struct audio_eq_band_info_t {
|
|
u32 band_id;
|
|
u32 band_level;
|
|
u32 center_freq;
|
|
u32 band_width;
|
|
};
|
|
|
|
struct seiren_info {
|
|
struct platform_device *pdev;
|
|
spinlock_t lock;
|
|
#if defined(CONFIG_SND_SAMSUNG_SEIREN_OFFLOAD)
|
|
spinlock_t cmd_lock;
|
|
spinlock_t compr_lock;
|
|
#endif
|
|
void __iomem *regs;
|
|
void __iomem *regs_s;
|
|
void __iomem *mailbox;
|
|
void __iomem *sram;
|
|
struct clk *clk_ca5;
|
|
unsigned int irq_ca5;
|
|
struct proc_dir_entry *proc_file;
|
|
#ifdef CONFIG_SND_SAMSUNG_IOMMU
|
|
struct iommu_domain *domain;
|
|
#endif
|
|
bool pm_on;
|
|
bool pm_suspended;
|
|
unsigned char *fwarea[FWAREA_NUM];
|
|
phys_addr_t fwarea_pa[FWAREA_NUM];
|
|
unsigned char *bufmem;
|
|
phys_addr_t bufmem_pa;
|
|
unsigned char *fwmem;
|
|
phys_addr_t fwmem_pa;
|
|
void __kernel *fwmem_sram_bak;
|
|
#ifdef CONFIG_SND_SAMSUNG_SEIREN_OFFLOAD
|
|
unsigned int mailbox_bak[32];
|
|
#endif
|
|
volatile bool isr_done;
|
|
#ifdef CONFIG_SND_SAMSUNG_SEIREN_OFFLOAD
|
|
volatile bool isr_compr_created;
|
|
volatile bool is_compr_open;
|
|
struct task_struct *aud_cpu_lock_thrd;
|
|
int cpu_lock_level;
|
|
bool set_cpu_lock;
|
|
#endif
|
|
bool fwmem_loaded;
|
|
int fw_sbin_size;
|
|
int fw_dbin_size;
|
|
|
|
int rtd_cnt;
|
|
struct esa_rtd *rtd_pool[INSTANCE_MAX];
|
|
|
|
unsigned char fw_log[FW_LOG_MAX];
|
|
unsigned int fw_log_pos;
|
|
char *fw_log_buf;
|
|
bool fw_ready;
|
|
bool fw_suspended;
|
|
bool fw_use_dram;
|
|
#ifdef CONFIG_PM_DEVFREQ
|
|
struct pm_qos_request ca5_int_qos;
|
|
struct pm_qos_request ca5_mif_qos;
|
|
int mif_qos;
|
|
int int_qos;
|
|
#endif
|
|
#ifdef CONFIG_SND_ESA_SA_EFFECT
|
|
void __iomem *effect_ram;
|
|
bool effect_on;
|
|
unsigned int out_sample_rate;
|
|
#endif
|
|
bool fx_ext_on;
|
|
unsigned char *fx_work_buf;
|
|
bool fx_irq_done;
|
|
int fx_next_idx;
|
|
};
|
|
|
|
struct esa_rtd {
|
|
/* BUF informaion */
|
|
struct audio_mem_info_t ibuf_info;
|
|
struct audio_mem_info_t obuf_info;
|
|
struct audio_pcm_config_info_t pcm_info;
|
|
unsigned char block_num;
|
|
unsigned long buf_maxsize; /* IBUF + OBUF */
|
|
bool use_sram;
|
|
|
|
/* IBUF informaion */
|
|
unsigned char *ibuf0;
|
|
unsigned char *ibuf1;
|
|
unsigned long ibuf_size;
|
|
unsigned int ibuf_count;
|
|
unsigned int ibuf0_offset;
|
|
unsigned int ibuf1_offset;
|
|
unsigned int select_ibuf;
|
|
|
|
/* OBUF informaion */
|
|
unsigned char *obuf0;
|
|
unsigned char *obuf1;
|
|
unsigned long obuf_size;
|
|
unsigned int obuf_count;
|
|
unsigned int obuf0_offset;
|
|
unsigned int obuf1_offset;
|
|
unsigned int obuf0_filled_size;
|
|
unsigned int obuf1_filled_size;
|
|
unsigned int select_obuf;
|
|
bool obuf0_filled;
|
|
bool obuf1_filled;
|
|
|
|
/* status information */
|
|
unsigned int ip_type;
|
|
unsigned int handle_id;
|
|
unsigned int get_eos;
|
|
bool need_config;
|
|
|
|
/* multi-instance */
|
|
unsigned int idx;
|
|
};
|
|
|
|
#ifdef CONFIG_SND_SAMSUNG_SEIREN_OFFLOAD
|
|
enum OFFLOAD_IPTYPE {
|
|
COMPR_MP3 = 0x0,
|
|
COMPR_AAC = 0x1,
|
|
};
|
|
|
|
typedef int (*seiren_ops)(uint32_t cmd, uint32_t size, void* priv);
|
|
|
|
struct audio_processor {
|
|
seiren_ops ops;
|
|
void* priv;
|
|
uint32_t buffer_size;
|
|
void __iomem *reg_ack;
|
|
size_t block_num;
|
|
size_t handle_id;
|
|
size_t codec_id;
|
|
size_t num_channels;
|
|
size_t sample_rate;
|
|
};
|
|
|
|
extern int esa_compr_set_param(struct audio_processor *ap, uint8_t **buffer);
|
|
extern void esa_compr_open(void);
|
|
extern void esa_compr_close(void);
|
|
extern int esa_compr_send_buffer(const size_t copy_size,
|
|
struct audio_processor *ap);
|
|
extern int esa_compr_send_cmd(int32_t cmd, struct audio_processor *ap);
|
|
extern void __iomem *esa_compr_get_mem(void);
|
|
extern u32 esa_compr_pcm_size(void);
|
|
extern void esa_compr_hpdet_notifier(bool on);
|
|
extern void esa_compr_set_state(bool flag);
|
|
#endif
|
|
|
|
#ifdef CONFIG_SND_ESA_SA_EFFECT
|
|
int esa_effect_write(int type, int *value, int count);
|
|
extern void esa_compr_set_sample_rate(u32 rate);
|
|
extern u32 esa_compr_get_sample_rate(void);
|
|
#endif
|
|
|
|
#endif /* __SEIREN_H */
|