290 lines
7.4 KiB
C
Executable file
290 lines
7.4 KiB
C
Executable file
/* SPDX-License-Identifier: GPL-2.0-or-later
|
|
* 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/pm_wakeup.h>
|
|
#include <soc/samsung/imgloader.h>
|
|
#include <soc/samsung/memlogger.h>
|
|
#include <soc/samsung/sysevent.h>
|
|
#include <sound/samsung/vts.h>
|
|
|
|
#include "vts_soc.h"
|
|
#include "vts_shared_info.h"
|
|
|
|
#define TEST_WAKEUP
|
|
|
|
#define VTS_TAG_IPC ("IPC")
|
|
|
|
#define VTS_IRQ_LIMIT (32)
|
|
|
|
#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)
|
|
#define VTS_MICCONF_FOR_RECORD (4)
|
|
|
|
/* VTS Model Binary Max buffer sizes */
|
|
#define VTS_MODEL_BIN_MAXSZ (0x10800)
|
|
|
|
enum ipc_state {
|
|
IDLE,
|
|
SEND_MSG,
|
|
SEND_MSG_OK,
|
|
SEND_MSG_FAIL,
|
|
};
|
|
|
|
/* poll_event_type
|
|
triggered: event_type = EVENT_TRIGGERED + triggered_id
|
|
stop polling: event_type = EVENT_STOP_POLLING
|
|
error recoverty: event_type = EVENT_ERROR_RECOVERY
|
|
retart: event_type = EVENT_RESTART
|
|
EVENT_READY should be add(bit operation) whenever event occurs
|
|
*/
|
|
enum poll_event_type {
|
|
EVENT_NONE = 0,
|
|
EVENT_TRIGGERED = 0x10,
|
|
EVENT_STOP_POLLING = 0x20,
|
|
EVENT_ERROR_RECOVERY = 0x40,
|
|
EVENT_RESTART = 0x80,
|
|
EVENT_READY = 0x100,
|
|
};
|
|
|
|
enum vts_platform_type {
|
|
PLATFORM_VTS_NONE = 0, /* skipping id */
|
|
PLATFORM_VTS_NORMAL_RECORD,
|
|
PLATFORM_VTS_TRIGGER_RECORD,
|
|
};
|
|
|
|
enum executionmode {
|
|
VTS_RECOGNIZE_STOP = 0,
|
|
VTS_RECOGNIZE_START = 1,
|
|
};
|
|
|
|
enum vts_dump_type {
|
|
KERNEL_PANIC_DUMP,
|
|
VTS_FW_NOT_READY,
|
|
VTS_IPC_TRANS_FAIL,
|
|
VTS_FW_ERROR,
|
|
VTS_ITMON_ERROR,
|
|
RUNTIME_SUSPEND_DUMP,
|
|
VTS_DUMP_LAST,
|
|
};
|
|
|
|
enum vts_command {
|
|
VTS_START_SLIFDUMP = 0x00000010,
|
|
VTS_STOP_SLIFDUMP = 0x00000020,
|
|
VTS_KERNEL_TIME = 0x00000040,
|
|
VTS_FORCE_TRIGGER = 0x00000080,
|
|
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,
|
|
};
|
|
|
|
enum supported_mic_type {
|
|
MIC_NUM1 = 1,
|
|
MIC_NUM2,
|
|
};
|
|
|
|
struct vts_ipc_msg {
|
|
int msg;
|
|
u32 values[3];
|
|
};
|
|
|
|
enum vts_state_machine {
|
|
VTS_STATE_NONE = 0, /* runtime_suspended state */
|
|
VTS_STATE_VOICECALL = 1, /* sram L2Cache call state */
|
|
VTS_STATE_RUNTIME_RESUMING = 2, /* runtime_resume started */
|
|
VTS_STATE_RUNTIME_RESUMED = 3, /* runtime_resume done */
|
|
VTS_STATE_RECOG_STARTED = 4, /* Recognization started */
|
|
VTS_STATE_RECOG_TRIGGERED = 5, /* Recognize triggered */
|
|
VTS_STATE_SEAMLESS_REC_STARTED = 6, /* seamless record started */
|
|
VTS_STATE_SEAMLESS_REC_STOPPED = 7, /* seamless record stopped */
|
|
VTS_STATE_RECOG_STOPPED = 8, /* Recognization stopped */
|
|
VTS_STATE_RUNTIME_SUSPENDING = 9, /* runtime_suspend started */
|
|
VTS_STATE_RUNTIME_SUSPENDED = 10, /* runtime_suspend done */
|
|
};
|
|
|
|
enum vts_rec_state_machine {
|
|
VTS_REC_STATE_STOP = 0,
|
|
VTS_REC_STATE_START = 1,
|
|
};
|
|
|
|
enum vts_tri_state_machine {
|
|
VTS_TRI_STATE_COPY_STOP = 0,
|
|
VTS_TRI_STATE_COPY_START = 1,
|
|
};
|
|
|
|
struct vts_model_bin_info {
|
|
size_t actual_sz;
|
|
size_t max_sz;
|
|
int offset;
|
|
};
|
|
|
|
struct vts_dbg_dump {
|
|
long long time;
|
|
enum vts_dump_type dbg_type;
|
|
unsigned int gpr[17];
|
|
char *sram_log;
|
|
char *sram_fw;
|
|
};
|
|
|
|
struct vts_dram_request {
|
|
unsigned int id;
|
|
bool on;
|
|
unsigned long long updated;
|
|
};
|
|
|
|
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_if0_base;
|
|
void __iomem *dmic_if1_base;
|
|
void __iomem *dmic_ahb0_base;
|
|
void __iomem *timer0_base;
|
|
void __iomem *gpr_base;
|
|
|
|
void __iomem *intmem_code;
|
|
void __iomem *intmem_data;
|
|
void __iomem *intmem_pcm;
|
|
void __iomem *intmem_data1;
|
|
void __iomem *sicd_base;
|
|
void __iomem *sfr_slif_vts;
|
|
|
|
size_t sram_size;
|
|
phys_addr_t sram_phys;
|
|
struct regmap *regmap_dmic;
|
|
struct clk *clk_vts_src;
|
|
struct clk *mux_dmic_clk;
|
|
struct clk *clk_dmic;
|
|
struct clk *clk_dmic_if;
|
|
struct clk *clk_dmic_sync;
|
|
struct clk *mux_clk_dmic_if;
|
|
struct clk *clk_sys;
|
|
struct clk *clk_sys_mux;
|
|
struct clk *clk_slif_src;
|
|
struct clk *clk_slif_src1;
|
|
struct clk *clk_slif_src2;
|
|
struct clk *clk_slif_vts;
|
|
struct pinctrl *pinctrl;
|
|
struct mutex mutex_pin;
|
|
unsigned int vtsfw_version;
|
|
unsigned int vtsdetectlib_version;
|
|
const struct firmware *firmware;
|
|
unsigned int vtsdma_count;
|
|
unsigned long syssel_rate;
|
|
unsigned int target_sysclk;
|
|
unsigned long sysclk_rate;
|
|
struct platform_device *pdev_mailbox;
|
|
struct platform_device *pdev_vtsdma[2];
|
|
int irq[VTS_IRQ_LIMIT];
|
|
enum ipc_state ipc_state_ap;
|
|
wait_queue_head_t ipc_wait_queue;
|
|
wait_queue_head_t poll_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;
|
|
struct snd_dma_buffer dmab_model;
|
|
u32 target_size;
|
|
int active_trigger;
|
|
u32 voicerecog_start;
|
|
enum executionmode exec_mode;
|
|
bool vts_ready;
|
|
unsigned long sram_acquired;
|
|
bool enabled;
|
|
bool running;
|
|
bool voicecall_enabled;
|
|
struct snd_soc_card *card;
|
|
int micclk_init_cnt;
|
|
unsigned int mic_ready;
|
|
enum vts_dmic_sel dmic_if;
|
|
bool irq_state;
|
|
u32 lpsdgain;
|
|
u32 dmicgain;
|
|
u32 amicgain;
|
|
char *sramlog_baseaddr;
|
|
u32 running_ipc;
|
|
struct wakeup_source *wake_lock;
|
|
unsigned int vts_state;
|
|
unsigned int vts_tri_state;
|
|
unsigned int vts_rec_state;
|
|
u32 fw_logfile_enabled;
|
|
u32 fw_logger_enabled;
|
|
bool audiodump_enabled;
|
|
bool logdump_enabled;
|
|
struct vts_model_bin_info sm_info;
|
|
spinlock_t state_spinlock;
|
|
struct notifier_block pm_nb;
|
|
struct notifier_block itmon_nb;
|
|
struct vts_dbg_dump p_dump[VTS_DUMP_LAST];
|
|
bool slif_dump_enabled;
|
|
enum vts_clk_src clk_path;
|
|
bool imgloader;
|
|
struct imgloader_desc vts_imgloader_desc;
|
|
struct memlog *log_desc;
|
|
struct memlog_obj *kernel_log_file_obj;
|
|
struct memlog_obj *kernel_log_obj;
|
|
struct memlog_obj *dump_file_obj;
|
|
struct memlog_obj *dump_obj;
|
|
struct memlog_obj *fw_log_file_obj;
|
|
struct memlog_obj *fw_log_obj;
|
|
struct sysevent_desc sysevent_desc;
|
|
struct sysevent_device *sysevent_dev;
|
|
int google_version;
|
|
char google_uuid[40];
|
|
struct vts_shared_info *shared_info;
|
|
struct vts_dram_request dram_requests[16];
|
|
u32 poll_event_type;
|
|
char *sm_data;
|
|
bool sm_loaded;
|
|
uint32_t supported_mic_num;
|
|
uint32_t sysclk_div;
|
|
};
|
|
|
|
struct vts_dma_data {
|
|
unsigned int id;
|
|
struct platform_device *pdev_vts;
|
|
struct device *dev;
|
|
struct vts_data *vts_data;
|
|
struct snd_pcm_substream *substream;
|
|
enum vts_platform_type type;
|
|
unsigned int pointer;
|
|
};
|
|
|
|
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);
|
|
extern int vts_sound_machine_drv_register(void);
|
|
extern bool is_vts(struct device *dev);
|
|
extern int vts_start_runtime_resume(struct device *dev, int skip_log);
|
|
extern struct vts_data *vts_get_data(struct device *dev);
|
|
extern int cmu_vts_rco_400_control(bool on);
|
|
|
|
#endif /* __SND_SOC_VTS_H */
|