lineage_kernel_xcoverpro/sound/soc/samsung/vts/vts.h

326 lines
9.2 KiB
C
Executable File

/* sound/soc/samsung/vts/vts.h
*
* ALSA SoC - Samsung VTS driver
*
* Copyright (c) 2016 Samsung Electronics Co. Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#ifndef __SND_SOC_VTS_H
#define __SND_SOC_VTS_H
#include <sound/memalloc.h>
#include <linux/wakelock.h>
/* SYSREG_VTS */
#define VTS_DEBUG (0x0404)
#define VTS_DMIC_CLK_CTRL (0x0408)
#define VTS_HWACG_CM4_CLKREQ (0x0428)
#define VTS_DMIC_CLK_CON (0x0434)
#define VTS_SYSPOWER_CTRL (0x0500)
#define VTS_SYSPOWER_STATUS (0x0504)
/* VTS_DEBUG */
#define VTS_NMI_EN_BY_WDT_OFFSET (0)
#define VTS_NMI_EN_BY_WDT_SIZE (1)
/* VTS_DMIC_CLK_CTRL */
#define VTS_CG_STATUS_OFFSET (5)
#define VTS_CG_STATUS_SIZE (1)
#define VTS_CLK_ENABLE_OFFSET (4)
#define VTS_CLK_ENABLE_SIZE (1)
#define VTS_CLK_SEL_OFFSET (0)
#define VTS_CLK_SEL_SIZE (1)
/* VTS_HWACG_CM4_CLKREQ */
#define VTS_MASK_OFFSET (0)
#define VTS_MASK_SIZE (32)
/* VTS_DMIC_CLK_CON */
#define VTS_ENABLE_CLK_GEN_OFFSET (0)
#define VTS_ENABLE_CLK_GEN_SIZE (1)
#define VTS_SEL_EXT_DMIC_CLK_OFFSET (1)
#define VTS_SEL_EXT_DMIC_CLK_SIZE (1)
#define VTS_ENABLE_CLK_CLK_GEN_OFFSET (14)
#define VTS_ENABLE_CLK_CLK_GEN_SIZE (1)
/* VTS_SYSPOWER_CTRL */
#define VTS_SYSPOWER_CTRL_OFFSET (0)
#define VTS_SYSPOWER_CTRL_SIZE (1)
/* VTS_SYSPOWER_STATUS */
#define VTS_SYSPOWER_STATUS_OFFSET (0)
#define VTS_SYSPOWER_STATUS_SIZE (1)
#define VTS_DMIC_ENABLE_DMIC_IF (0x0000)
#define VTS_DMIC_CONTROL_DMIC_IF (0x0004)
/* VTS_DMIC_ENABLE_DMIC_IF */
#define VTS_DMIC_ENABLE_DMIC_IF_OFFSET (31)
#define VTS_DMIC_ENABLE_DMIC_IF_SIZE (1)
#define VTS_DMIC_PERIOD_DATA2REQ_OFFSET (16)
#define VTS_DMIC_PERIOD_DATA2REQ_SIZE (2)
/* VTS_DMIC_CONTROL_DMIC_IF */
#define VTS_DMIC_HPF_EN_OFFSET (31)
#define VTS_DMIC_HPF_EN_SIZE (1)
#define VTS_DMIC_HPF_SEL_OFFSET (28)
#define VTS_DMIC_HPF_SEL_SIZE (1)
#define VTS_DMIC_CPS_SEL_OFFSET (27)
#define VTS_DMIC_CPS_SEL_SIZE (1)
#define VTS_DMIC_GAIN_OFFSET (24)
#define VTS_DMIC_GAIN_SIZE (3)
#define VTS_DMIC_DMIC_SEL_OFFSET (18)
#define VTS_DMIC_DMIC_SEL_SIZE (1)
#define VTS_DMIC_RCH_EN_OFFSET (17)
#define VTS_DMIC_RCH_EN_SIZE (1)
#define VTS_DMIC_LCH_EN_OFFSET (16)
#define VTS_DMIC_LCH_EN_SIZE (1)
#define VTS_DMIC_SYS_SEL_OFFSET (12)
#define VTS_DMIC_SYS_SEL_SIZE (2)
#define VTS_DMIC_POLARITY_CLK_OFFSET (10)
#define VTS_DMIC_POLARITY_CLK_SIZE (1)
#define VTS_DMIC_POLARITY_OUTPUT_OFFSET (9)
#define VTS_DMIC_POLARITY_OUTPUT_SIZE (1)
#define VTS_DMIC_POLARITY_INPUT_OFFSET (8)
#define VTS_DMIC_POLARITY_INPUT_SIZE (1)
#define VTS_DMIC_OVFW_CTRL_OFFSET (4)
#define VTS_DMIC_OVFW_CTRL_SIZE (1)
#define VTS_DMIC_CIC_SEL_OFFSET (0)
#define VTS_DMIC_CIC_SEL_SIZE (1)
/* CM4 */
#define VTS_CM4_R(x) (0x0010 + (x * 0x4))
#define VTS_CM4_PC (0x0004)
#define VTS_IRQ_VTS_ERROR (16)
#define VTS_IRQ_VTS_BOOT_COMPLETED (17)
#define VTS_IRQ_VTS_IPC_RECEIVED (18)
#define VTS_IRQ_VTS_VOICE_TRIGGERED (19)
#define VTS_IRQ_VTS_PERIOD_ELAPSED (20)
#define VTS_IRQ_VTS_REC_PERIOD_ELAPSED (21)
#define VTS_IRQ_VTS_DBGLOG_BUFZERO (22)
#define VTS_IRQ_VTS_DBGLOG_BUFONE (23)
#define VTS_IRQ_VTS_AUDIO_DUMP (24)
#define VTS_IRQ_VTS_LOG_DUMP (25)
#define VTS_IRQ_COUNT (26)
#define VTS_IRQ_AP_IPC_RECEIVED (0)
#define VTS_IRQ_AP_SET_DRAM_BUFFER (1)
#define VTS_IRQ_AP_START_RECOGNITION (2)
#define VTS_IRQ_AP_STOP_RECOGNITION (3)
#define VTS_IRQ_AP_START_COPY (4)
#define VTS_IRQ_AP_STOP_COPY (5)
#define VTS_IRQ_AP_SET_MODE (6)
#define VTS_IRQ_AP_POWER_DOWN (7)
#define VTS_IRQ_AP_TARGET_SIZE (8)
#define VTS_IRQ_AP_SET_REC_BUFFER (9)
#define VTS_IRQ_AP_START_REC (10)
#define VTS_IRQ_AP_STOP_REC (11)
#define VTS_IRQ_AP_RESTART_RECOGNITION (13)
#define VTS_IRQ_AP_TEST_COMMAND (15)
#define VTS_IRQ_LIMIT (32)
#define VTS_BAAW_BASE (0x60000000)
#define VTS_BAAW_SRC_START_ADDRESS (0x10000)
#define VTS_BAAW_SRC_END_ADDRESS (0x10004)
#define VTS_BAAW_REMAPPED_ADDRESS (0x10008)
#define VTS_BAAW_INIT_DONE (0x1000C)
#define BUFFER_BYTES_MAX (0xa0000)
#define PERIOD_BYTES_MIN (SZ_4)
#define PERIOD_BYTES_MAX (BUFFER_BYTES_MAX / 2)
#define SOUND_MODEL_SIZE_MAX (SZ_32K)
#define SOUND_MODEL_COUNT (3)
/* DRAM for copying VTS firmware logs */
#define LOG_BUFFER_BYTES_MAX (0x2000)
#define VTS_SRAMLOG_MSGS_OFFSET (0x59000)
/* VTS firmware version information offset */
#define VTSFW_VERSION_OFFSET (0x7c)
#define DETLIB_VERSION_OFFSET (0x78)
/* VTS Model Binary Max buffer sizes */
#define VTS_MODEL_SVOICE_BIN_MAXSZ (SZ_64K)
#define VTS_MODEL_GOOGLE_BIN_MAXSZ (SZ_64K)
enum ipc_state {
IDLE,
SEND_MSG,
SEND_MSG_OK,
SEND_MSG_FAIL,
};
enum trigger {
TRIGGER_NONE = -1,
TRIGGER_SVOICE = 0,
TRIGGER_GOOGLE = 1,
TRIGGER_SENSORY = 2,
TRIGGER_COUNT,
};
enum vts_platform_type {
PLATFORM_VTS_NORMAL_RECORD,
PLATFORM_VTS_TRIGGER_RECORD,
};
enum executionmode {
//default is off
VTS_OFF_MODE = 0,
//voice-trig-mode:Both LPSD & Trigger are enabled
VTS_VOICE_TRIGGER_MODE = 1,
//sound-detect-mode: Low Power sound Detect
VTS_SOUND_DETECT_MODE = 2,
//vt-always-mode: key phrase Detection only(Trigger)
VTS_VT_ALWAYS_ON_MODE = 3,
//google-trigger: key phrase Detection only(Trigger)
VTS_GOOGLE_TRIGGER_MODE = 4,
//sensory-trigger: key phrase Detection only(Trigger)
VTS_SENSORY_TRIGGER_MODE = 5,
//off:voice-trig-mode:Both LPSD & Trigger are enabled
VTS_VOICE_TRIGGER_MODE_OFF = 6,
//off:sound-detect-mode: Low Power sound Detect
VTS_SOUND_DETECT_MODE_OFF = 7,
//off:vt-always-mode: key phrase Detection only(Trigger)
VTS_VT_ALWAYS_ON_MODE_OFF = 8,
//off:google-trigger: key phrase Detection only(Trigger)
VTS_GOOGLE_TRIGGER_MODE_OFF = 9,
//off:sensory-trigger: key phrase Detection only(Trigger)
VTS_SENSORY_TRIGGER_MODE_OFF = 10,
VTS_MODE_COUNT,
};
enum vts_dump_type {
KERNEL_PANIC_DUMP = 0,
RUNTIME_SUSPEND_DUMP = 1,
};
enum vts_test_command {
VTS_DISABLE_LOGDUMP = 0x01000000,
VTS_ENABLE_LOGDUMP = 0x02000000,
VTS_DISABLE_AUDIODUMP = 0x04000000,
VTS_ENABLE_AUDIODUMP = 0x08000000,
VTS_DISABLE_DEBUGLOG = 0x10000000,
VTS_ENABLE_DEBUGLOG = 0x20000000,
VTS_ENABLE_SRAM_LOG = 0x80000000,
};
struct vts_ipc_msg {
int msg;
u32 values[3];
};
enum vts_micconf_type {
VTS_MICCONF_FOR_RECORD = 0,
VTS_MICCONF_FOR_TRIGGER = 1,
VTS_MICCONF_FOR_GOOGLE = 2,
};
enum vts_state_machine {
VTS_STATE_NONE = 0, //runtime_suspended state
VTS_STATE_VOICECALL = 1, //sram L2Cache voicecall state
VTS_STATE_IDLE = 2, //runtime_resume state
VTS_STATE_RECOG_STARTED = 3, //Voice Recognization started
VTS_STATE_RECOG_TRIGGERED = 4, //Voice Recognize triggered
VTS_STATE_SEAMLESS_REC_STARTED = 5, //seamless record started
VTS_STATE_SEAMLESS_REC_STOPPED = 6, //seamless record started
VTS_STATE_RECOG_STOPPED = 7, //Voice Recognization stopped
};
struct vts_model_bin_info {
unsigned char *data;
size_t actual_sz;
size_t max_sz;
bool loaded;
};
struct vts_data {
struct platform_device *pdev;
struct snd_soc_component *cmpnt;
void __iomem *sfr_base;
void __iomem *baaw_base;
void __iomem *sram_base;
void __iomem *dmic_base;
void __iomem *gpr_base;
size_t sram_size;
struct regmap *regmap_dmic;
struct clk *clk_rco;
struct clk *clk_dmic;
struct clk *clk_dmic_if;
struct clk *clk_dmic_sync;
struct pinctrl *pinctrl;
unsigned int vtsfw_version;
unsigned int vtsdetectlib_version;
const struct firmware *firmware;
unsigned int vtsdma_count;
unsigned long syssel_rate;
struct platform_device *pdev_mailbox;
struct platform_device *pdev_vtsdma[2];
struct proc_dir_entry *proc_dir_entry;
int irq[VTS_IRQ_LIMIT];
volatile enum ipc_state ipc_state_ap;
wait_queue_head_t ipc_wait_queue;
spinlock_t ipc_spinlock;
struct mutex ipc_mutex;
u32 dma_area_vts;
struct snd_dma_buffer dmab;
struct snd_dma_buffer dmab_rec;
struct snd_dma_buffer dmab_log;
u32 target_size;
volatile enum trigger active_trigger;
u32 voicerecog_start;
enum executionmode exec_mode;
bool vts_ready;
volatile unsigned long sram_acquired;
volatile bool enabled;
volatile bool running;
bool voicecall_enabled;
struct snd_soc_card *card;
int micclk_init_cnt;
unsigned int mic_ready;
bool irq_state;
u32 lpsdgain;
u32 dmicgain;
u32 amicgain;
char *sramlog_baseaddr;
u32 running_ipc;
struct wake_lock wake_lock;
unsigned int vts_state;
u32 vtslog_enabled;
bool audiodump_enabled;
bool logdump_enabled;
struct vts_model_bin_info svoice_info;
struct vts_model_bin_info google_info;
};
struct vts_platform_data {
unsigned int id;
struct platform_device *pdev_vts;
struct vts_data *vts_data;
struct snd_pcm_substream *substream;
enum vts_platform_type type;
volatile unsigned int pointer;
};
struct vts_dbg_dump {
char sram[SZ_2K];
unsigned int gpr[17];
long long time;
char reason[SZ_32];
};
struct vts_log_buffer {
char *addr;
unsigned int size;
};
extern int vts_start_ipc_transaction(struct device *dev, struct vts_data *data,
int msg, u32 (*values)[3], int atomic, int sync);
extern int vts_send_ipc_ack(struct vts_data *data, u32 result);
extern void vts_register_dma(struct platform_device *pdev_vts,
struct platform_device *pdev_vts_dma, unsigned int id);
extern int vts_set_dmicctrl(struct platform_device *pdev, int micconf_type, bool enable);
#endif /* __SND_SOC_VTS_H */