#include <linux/ctype.h>
#include <linux/debugfs.h>
#include <linux/delay.h>
#include <linux/minmax.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/seq_file.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/firmware/cirrus/cs_dsp.h>
#include <linux/firmware/cirrus/wmfw.h>
#define cs_dsp_err(_dsp, fmt, ...) …
#define cs_dsp_warn(_dsp, fmt, ...) …
#define cs_dsp_info(_dsp, fmt, ...) …
#define cs_dsp_dbg(_dsp, fmt, ...) …
#define ADSP1_CONTROL_1 …
#define ADSP1_CONTROL_2 …
#define ADSP1_CONTROL_3 …
#define ADSP1_CONTROL_4 …
#define ADSP1_CONTROL_5 …
#define ADSP1_CONTROL_6 …
#define ADSP1_CONTROL_7 …
#define ADSP1_CONTROL_8 …
#define ADSP1_CONTROL_9 …
#define ADSP1_CONTROL_10 …
#define ADSP1_CONTROL_11 …
#define ADSP1_CONTROL_12 …
#define ADSP1_CONTROL_13 …
#define ADSP1_CONTROL_14 …
#define ADSP1_CONTROL_15 …
#define ADSP1_CONTROL_16 …
#define ADSP1_CONTROL_17 …
#define ADSP1_CONTROL_18 …
#define ADSP1_CONTROL_19 …
#define ADSP1_CONTROL_20 …
#define ADSP1_CONTROL_21 …
#define ADSP1_CONTROL_22 …
#define ADSP1_CONTROL_23 …
#define ADSP1_CONTROL_24 …
#define ADSP1_CONTROL_25 …
#define ADSP1_CONTROL_26 …
#define ADSP1_CONTROL_27 …
#define ADSP1_CONTROL_28 …
#define ADSP1_CONTROL_29 …
#define ADSP1_CONTROL_30 …
#define ADSP1_CONTROL_31 …
#define ADSP1_WDMA_BUFFER_LENGTH_MASK …
#define ADSP1_WDMA_BUFFER_LENGTH_SHIFT …
#define ADSP1_WDMA_BUFFER_LENGTH_WIDTH …
#define ADSP1_DBG_CLK_ENA …
#define ADSP1_DBG_CLK_ENA_MASK …
#define ADSP1_DBG_CLK_ENA_SHIFT …
#define ADSP1_DBG_CLK_ENA_WIDTH …
#define ADSP1_SYS_ENA …
#define ADSP1_SYS_ENA_MASK …
#define ADSP1_SYS_ENA_SHIFT …
#define ADSP1_SYS_ENA_WIDTH …
#define ADSP1_CORE_ENA …
#define ADSP1_CORE_ENA_MASK …
#define ADSP1_CORE_ENA_SHIFT …
#define ADSP1_CORE_ENA_WIDTH …
#define ADSP1_START …
#define ADSP1_START_MASK …
#define ADSP1_START_SHIFT …
#define ADSP1_START_WIDTH …
#define ADSP1_CLK_SEL_MASK …
#define ADSP1_CLK_SEL_SHIFT …
#define ADSP1_CLK_SEL_WIDTH …
#define ADSP2_CONTROL …
#define ADSP2_CLOCKING …
#define ADSP2V2_CLOCKING …
#define ADSP2_STATUS1 …
#define ADSP2_WDMA_CONFIG_1 …
#define ADSP2_WDMA_CONFIG_2 …
#define ADSP2V2_WDMA_CONFIG_2 …
#define ADSP2_RDMA_CONFIG_1 …
#define ADSP2_SCRATCH0 …
#define ADSP2_SCRATCH1 …
#define ADSP2_SCRATCH2 …
#define ADSP2_SCRATCH3 …
#define ADSP2V2_SCRATCH0_1 …
#define ADSP2V2_SCRATCH2_3 …
#define ADSP2_MEM_ENA …
#define ADSP2_MEM_ENA_MASK …
#define ADSP2_MEM_ENA_SHIFT …
#define ADSP2_MEM_ENA_WIDTH …
#define ADSP2_SYS_ENA …
#define ADSP2_SYS_ENA_MASK …
#define ADSP2_SYS_ENA_SHIFT …
#define ADSP2_SYS_ENA_WIDTH …
#define ADSP2_CORE_ENA …
#define ADSP2_CORE_ENA_MASK …
#define ADSP2_CORE_ENA_SHIFT …
#define ADSP2_CORE_ENA_WIDTH …
#define ADSP2_START …
#define ADSP2_START_MASK …
#define ADSP2_START_SHIFT …
#define ADSP2_START_WIDTH …
#define ADSP2_CLK_SEL_MASK …
#define ADSP2_CLK_SEL_SHIFT …
#define ADSP2_CLK_SEL_WIDTH …
#define ADSP2V2_CLK_SEL_MASK …
#define ADSP2V2_CLK_SEL_SHIFT …
#define ADSP2V2_CLK_SEL_WIDTH …
#define ADSP2V2_RATE_MASK …
#define ADSP2V2_RATE_SHIFT …
#define ADSP2V2_RATE_WIDTH …
#define ADSP2_RAM_RDY …
#define ADSP2_RAM_RDY_MASK …
#define ADSP2_RAM_RDY_SHIFT …
#define ADSP2_RAM_RDY_WIDTH …
#define ADSP2_LOCK_CODE_0 …
#define ADSP2_LOCK_CODE_1 …
#define ADSP2_WATCHDOG …
#define ADSP2_BUS_ERR_ADDR …
#define ADSP2_REGION_LOCK_STATUS …
#define ADSP2_LOCK_REGION_1_LOCK_REGION_0 …
#define ADSP2_LOCK_REGION_3_LOCK_REGION_2 …
#define ADSP2_LOCK_REGION_5_LOCK_REGION_4 …
#define ADSP2_LOCK_REGION_7_LOCK_REGION_6 …
#define ADSP2_LOCK_REGION_9_LOCK_REGION_8 …
#define ADSP2_LOCK_REGION_CTRL …
#define ADSP2_PMEM_ERR_ADDR_XMEM_ERR_ADDR …
#define ADSP2_REGION_LOCK_ERR_MASK …
#define ADSP2_ADDR_ERR_MASK …
#define ADSP2_WDT_TIMEOUT_STS_MASK …
#define ADSP2_CTRL_ERR_PAUSE_ENA …
#define ADSP2_CTRL_ERR_EINT …
#define ADSP2_BUS_ERR_ADDR_MASK …
#define ADSP2_XMEM_ERR_ADDR_MASK …
#define ADSP2_PMEM_ERR_ADDR_MASK …
#define ADSP2_PMEM_ERR_ADDR_SHIFT …
#define ADSP2_WDT_ENA_MASK …
#define ADSP2_LOCK_REGION_SHIFT …
#define CS_DSP_FW_EVENT_SHUTDOWN …
#define HALO_AHBM_WINDOW_DEBUG_0 …
#define HALO_AHBM_WINDOW_DEBUG_1 …
#define HALO_SCRATCH1 …
#define HALO_SCRATCH2 …
#define HALO_SCRATCH3 …
#define HALO_SCRATCH4 …
#define HALO_CCM_CORE_CONTROL …
#define HALO_CORE_SOFT_RESET …
#define HALO_WDT_CONTROL …
#define HALO_MPU_XMEM_ACCESS_0 …
#define HALO_MPU_YMEM_ACCESS_0 …
#define HALO_MPU_WINDOW_ACCESS_0 …
#define HALO_MPU_XREG_ACCESS_0 …
#define HALO_MPU_YREG_ACCESS_0 …
#define HALO_MPU_XMEM_ACCESS_1 …
#define HALO_MPU_YMEM_ACCESS_1 …
#define HALO_MPU_WINDOW_ACCESS_1 …
#define HALO_MPU_XREG_ACCESS_1 …
#define HALO_MPU_YREG_ACCESS_1 …
#define HALO_MPU_XMEM_ACCESS_2 …
#define HALO_MPU_YMEM_ACCESS_2 …
#define HALO_MPU_WINDOW_ACCESS_2 …
#define HALO_MPU_XREG_ACCESS_2 …
#define HALO_MPU_YREG_ACCESS_2 …
#define HALO_MPU_XMEM_ACCESS_3 …
#define HALO_MPU_YMEM_ACCESS_3 …
#define HALO_MPU_WINDOW_ACCESS_3 …
#define HALO_MPU_XREG_ACCESS_3 …
#define HALO_MPU_YREG_ACCESS_3 …
#define HALO_MPU_XM_VIO_ADDR …
#define HALO_MPU_XM_VIO_STATUS …
#define HALO_MPU_YM_VIO_ADDR …
#define HALO_MPU_YM_VIO_STATUS …
#define HALO_MPU_PM_VIO_ADDR …
#define HALO_MPU_PM_VIO_STATUS …
#define HALO_MPU_LOCK_CONFIG …
#define HALO_AHBM_CORE_ERR_ADDR_MASK …
#define HALO_AHBM_CORE_ERR_ADDR_SHIFT …
#define HALO_AHBM_FLAGS_ERR_MASK …
#define HALO_CORE_RESET …
#define HALO_CORE_EN …
#define HALO_CORE_SOFT_RESET_MASK …
#define HALO_WDT_EN_MASK …
#define HALO_MPU_VIO_STS_MASK …
#define HALO_MPU_VIO_STS_SHIFT …
#define HALO_MPU_VIO_ERR_WR_MASK …
#define HALO_MPU_VIO_ERR_SRC_MASK …
#define HALO_MPU_VIO_ERR_SRC_SHIFT …
#define WSEQ_OP_MAX_WORDS …
#define WSEQ_END_OF_SCRIPT …
struct cs_dsp_ops { … };
static const struct cs_dsp_ops cs_dsp_adsp1_ops;
static const struct cs_dsp_ops cs_dsp_adsp2_ops[];
static const struct cs_dsp_ops cs_dsp_halo_ops;
static const struct cs_dsp_ops cs_dsp_halo_ao_ops;
struct cs_dsp_buf { … };
static struct cs_dsp_buf *cs_dsp_buf_alloc(const void *src, size_t len,
struct list_head *list)
{ … }
static void cs_dsp_buf_free(struct list_head *list)
{ … }
const char *cs_dsp_mem_region_name(unsigned int type)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
#ifdef CONFIG_DEBUG_FS
static void cs_dsp_debugfs_save_wmfwname(struct cs_dsp *dsp, const char *s)
{ … }
static void cs_dsp_debugfs_save_binname(struct cs_dsp *dsp, const char *s)
{ … }
static void cs_dsp_debugfs_clear(struct cs_dsp *dsp)
{ … }
static ssize_t cs_dsp_debugfs_wmfw_read(struct file *file,
char __user *user_buf,
size_t count, loff_t *ppos)
{ … }
static ssize_t cs_dsp_debugfs_bin_read(struct file *file,
char __user *user_buf,
size_t count, loff_t *ppos)
{ … }
static const struct { … } cs_dsp_debugfs_fops[] = …;
static int cs_dsp_coeff_base_reg(struct cs_dsp_coeff_ctl *ctl, unsigned int *reg,
unsigned int off);
static int cs_dsp_debugfs_read_controls_show(struct seq_file *s, void *ignored)
{ … }
DEFINE_SHOW_ATTRIBUTE(…);
void cs_dsp_init_debugfs(struct cs_dsp *dsp, struct dentry *debugfs_root)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
void cs_dsp_cleanup_debugfs(struct cs_dsp *dsp)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
#else
void cs_dsp_init_debugfs(struct cs_dsp *dsp, struct dentry *debugfs_root)
{
}
EXPORT_SYMBOL_NS_GPL(cs_dsp_init_debugfs, FW_CS_DSP);
void cs_dsp_cleanup_debugfs(struct cs_dsp *dsp)
{
}
EXPORT_SYMBOL_NS_GPL(cs_dsp_cleanup_debugfs, FW_CS_DSP);
static inline void cs_dsp_debugfs_save_wmfwname(struct cs_dsp *dsp,
const char *s)
{
}
static inline void cs_dsp_debugfs_save_binname(struct cs_dsp *dsp,
const char *s)
{
}
static inline void cs_dsp_debugfs_clear(struct cs_dsp *dsp)
{
}
#endif
static const struct cs_dsp_region *cs_dsp_find_region(struct cs_dsp *dsp,
int type)
{ … }
static unsigned int cs_dsp_region_to_reg(struct cs_dsp_region const *mem,
unsigned int offset)
{ … }
static unsigned int cs_dsp_halo_region_to_reg(struct cs_dsp_region const *mem,
unsigned int offset)
{ … }
static void cs_dsp_read_fw_status(struct cs_dsp *dsp,
int noffs, unsigned int *offs)
{ … }
static void cs_dsp_adsp2_show_fw_status(struct cs_dsp *dsp)
{ … }
static void cs_dsp_adsp2v2_show_fw_status(struct cs_dsp *dsp)
{ … }
static void cs_dsp_halo_show_fw_status(struct cs_dsp *dsp)
{ … }
static int cs_dsp_coeff_base_reg(struct cs_dsp_coeff_ctl *ctl, unsigned int *reg,
unsigned int off)
{ … }
int cs_dsp_coeff_write_acked_control(struct cs_dsp_coeff_ctl *ctl, unsigned int event_id)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
static int cs_dsp_coeff_write_ctrl_raw(struct cs_dsp_coeff_ctl *ctl,
unsigned int off, const void *buf, size_t len)
{ … }
int cs_dsp_coeff_write_ctrl(struct cs_dsp_coeff_ctl *ctl,
unsigned int off, const void *buf, size_t len)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
int cs_dsp_coeff_lock_and_write_ctrl(struct cs_dsp_coeff_ctl *ctl,
unsigned int off, const void *buf, size_t len)
{ … }
EXPORT_SYMBOL_GPL(…);
static int cs_dsp_coeff_read_ctrl_raw(struct cs_dsp_coeff_ctl *ctl,
unsigned int off, void *buf, size_t len)
{ … }
int cs_dsp_coeff_read_ctrl(struct cs_dsp_coeff_ctl *ctl,
unsigned int off, void *buf, size_t len)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
int cs_dsp_coeff_lock_and_read_ctrl(struct cs_dsp_coeff_ctl *ctl,
unsigned int off, void *buf, size_t len)
{ … }
EXPORT_SYMBOL_GPL(…);
static int cs_dsp_coeff_init_control_caches(struct cs_dsp *dsp)
{ … }
static int cs_dsp_coeff_sync_controls(struct cs_dsp *dsp)
{ … }
static void cs_dsp_signal_event_controls(struct cs_dsp *dsp,
unsigned int event)
{ … }
static void cs_dsp_free_ctl_blk(struct cs_dsp_coeff_ctl *ctl)
{ … }
static int cs_dsp_create_control(struct cs_dsp *dsp,
const struct cs_dsp_alg_region *alg_region,
unsigned int offset, unsigned int len,
const char *subname, unsigned int subname_len,
unsigned int flags, unsigned int type)
{ … }
struct cs_dsp_coeff_parsed_alg { … };
struct cs_dsp_coeff_parsed_coeff { … };
static int cs_dsp_coeff_parse_string(int bytes, const u8 **pos, unsigned int avail,
const u8 **str)
{ … }
static int cs_dsp_coeff_parse_int(int bytes, const u8 **pos)
{ … }
static int cs_dsp_coeff_parse_alg(struct cs_dsp *dsp,
const struct wmfw_region *region,
struct cs_dsp_coeff_parsed_alg *blk)
{ … }
static int cs_dsp_coeff_parse_coeff(struct cs_dsp *dsp,
const struct wmfw_region *region,
unsigned int pos,
struct cs_dsp_coeff_parsed_coeff *blk)
{ … }
static int cs_dsp_check_coeff_flags(struct cs_dsp *dsp,
const struct cs_dsp_coeff_parsed_coeff *coeff_blk,
unsigned int f_required,
unsigned int f_illegal)
{ … }
static int cs_dsp_parse_coeff(struct cs_dsp *dsp,
const struct wmfw_region *region)
{ … }
static unsigned int cs_dsp_adsp1_parse_sizes(struct cs_dsp *dsp,
const char * const file,
unsigned int pos,
const struct firmware *firmware)
{ … }
static unsigned int cs_dsp_adsp2_parse_sizes(struct cs_dsp *dsp,
const char * const file,
unsigned int pos,
const struct firmware *firmware)
{ … }
static bool cs_dsp_validate_version(struct cs_dsp *dsp, unsigned int version)
{ … }
static bool cs_dsp_halo_validate_version(struct cs_dsp *dsp, unsigned int version)
{ … }
static int cs_dsp_load(struct cs_dsp *dsp, const struct firmware *firmware,
const char *file)
{ … }
struct cs_dsp_coeff_ctl *cs_dsp_get_ctl(struct cs_dsp *dsp, const char *name, int type,
unsigned int alg)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
static void cs_dsp_ctl_fixup_base(struct cs_dsp *dsp,
const struct cs_dsp_alg_region *alg_region)
{ … }
static void *cs_dsp_read_algs(struct cs_dsp *dsp, size_t n_algs,
const struct cs_dsp_region *mem,
unsigned int pos, unsigned int len)
{ … }
struct cs_dsp_alg_region *cs_dsp_find_alg_region(struct cs_dsp *dsp,
int type, unsigned int id)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
static struct cs_dsp_alg_region *cs_dsp_create_region(struct cs_dsp *dsp,
int type, __be32 id,
__be32 ver, __be32 base)
{ … }
static void cs_dsp_free_alg_regions(struct cs_dsp *dsp)
{ … }
static void cs_dsp_parse_wmfw_id_header(struct cs_dsp *dsp,
struct wmfw_id_hdr *fw, int nalgs)
{ … }
static void cs_dsp_parse_wmfw_v3_id_header(struct cs_dsp *dsp,
struct wmfw_v3_id_hdr *fw, int nalgs)
{ … }
static int cs_dsp_create_regions(struct cs_dsp *dsp, __be32 id, __be32 ver,
int nregions, const int *type, __be32 *base)
{ … }
static int cs_dsp_adsp1_setup_algs(struct cs_dsp *dsp)
{ … }
static int cs_dsp_adsp2_setup_algs(struct cs_dsp *dsp)
{ … }
static int cs_dsp_halo_create_regions(struct cs_dsp *dsp, __be32 id, __be32 ver,
__be32 xm_base, __be32 ym_base)
{ … }
static int cs_dsp_halo_setup_algs(struct cs_dsp *dsp)
{ … }
static int cs_dsp_load_coeff(struct cs_dsp *dsp, const struct firmware *firmware,
const char *file)
{ … }
static int cs_dsp_create_name(struct cs_dsp *dsp)
{ … }
static int cs_dsp_common_init(struct cs_dsp *dsp)
{ … }
int cs_dsp_adsp1_init(struct cs_dsp *dsp)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
int cs_dsp_adsp1_power_up(struct cs_dsp *dsp,
const struct firmware *wmfw_firmware, const char *wmfw_filename,
const struct firmware *coeff_firmware, const char *coeff_filename,
const char *fw_name)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
void cs_dsp_adsp1_power_down(struct cs_dsp *dsp)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
static int cs_dsp_adsp2v2_enable_core(struct cs_dsp *dsp)
{ … }
static int cs_dsp_adsp2_enable_core(struct cs_dsp *dsp)
{ … }
static int cs_dsp_adsp2_lock(struct cs_dsp *dsp, unsigned int lock_regions)
{ … }
static int cs_dsp_adsp2_enable_memory(struct cs_dsp *dsp)
{ … }
static void cs_dsp_adsp2_disable_memory(struct cs_dsp *dsp)
{ … }
static void cs_dsp_adsp2_disable_core(struct cs_dsp *dsp)
{ … }
static void cs_dsp_adsp2v2_disable_core(struct cs_dsp *dsp)
{ … }
static int cs_dsp_halo_configure_mpu(struct cs_dsp *dsp, unsigned int lock_regions)
{ … }
int cs_dsp_set_dspclk(struct cs_dsp *dsp, unsigned int freq)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
static void cs_dsp_stop_watchdog(struct cs_dsp *dsp)
{ … }
static void cs_dsp_halo_stop_watchdog(struct cs_dsp *dsp)
{ … }
int cs_dsp_power_up(struct cs_dsp *dsp,
const struct firmware *wmfw_firmware, const char *wmfw_filename,
const struct firmware *coeff_firmware, const char *coeff_filename,
const char *fw_name)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
void cs_dsp_power_down(struct cs_dsp *dsp)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
static int cs_dsp_adsp2_start_core(struct cs_dsp *dsp)
{ … }
static void cs_dsp_adsp2_stop_core(struct cs_dsp *dsp)
{ … }
int cs_dsp_run(struct cs_dsp *dsp)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
void cs_dsp_stop(struct cs_dsp *dsp)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
static int cs_dsp_halo_start_core(struct cs_dsp *dsp)
{ … }
static void cs_dsp_halo_stop_core(struct cs_dsp *dsp)
{ … }
int cs_dsp_adsp2_init(struct cs_dsp *dsp)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
int cs_dsp_halo_init(struct cs_dsp *dsp)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
void cs_dsp_remove(struct cs_dsp *dsp)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
int cs_dsp_read_raw_data_block(struct cs_dsp *dsp, int mem_type, unsigned int mem_addr,
unsigned int num_words, __be32 *data)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
int cs_dsp_read_data_word(struct cs_dsp *dsp, int mem_type, unsigned int mem_addr, u32 *data)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
int cs_dsp_write_data_word(struct cs_dsp *dsp, int mem_type, unsigned int mem_addr, u32 data)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
void cs_dsp_remove_padding(u32 *buf, int nwords)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
void cs_dsp_adsp2_bus_error(struct cs_dsp *dsp)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
void cs_dsp_halo_bus_error(struct cs_dsp *dsp)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
void cs_dsp_halo_wdt_expire(struct cs_dsp *dsp)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
static const struct cs_dsp_ops cs_dsp_adsp1_ops = …;
static const struct cs_dsp_ops cs_dsp_adsp2_ops[] = …;
static const struct cs_dsp_ops cs_dsp_halo_ops = …;
static const struct cs_dsp_ops cs_dsp_halo_ao_ops = …;
int cs_dsp_chunk_write(struct cs_dsp_chunk *ch, int nbits, u32 val)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
int cs_dsp_chunk_flush(struct cs_dsp_chunk *ch)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
int cs_dsp_chunk_read(struct cs_dsp_chunk *ch, int nbits)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
struct cs_dsp_wseq_op { … };
static void cs_dsp_wseq_clear(struct cs_dsp *dsp, struct cs_dsp_wseq *wseq)
{ … }
static int cs_dsp_populate_wseq(struct cs_dsp *dsp, struct cs_dsp_wseq *wseq)
{ … }
int cs_dsp_wseq_init(struct cs_dsp *dsp, struct cs_dsp_wseq *wseqs, unsigned int num_wseqs)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
static struct cs_dsp_wseq_op *cs_dsp_wseq_find_op(u32 addr, u8 op_code,
struct list_head *wseq_ops)
{ … }
int cs_dsp_wseq_write(struct cs_dsp *dsp, struct cs_dsp_wseq *wseq,
u32 addr, u32 data, u8 op_code, bool update)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
int cs_dsp_wseq_multi_write(struct cs_dsp *dsp, struct cs_dsp_wseq *wseq,
const struct reg_sequence *reg_seq, int num_regs,
u8 op_code, bool update)
{ … }
EXPORT_SYMBOL_NS_GPL(…);
MODULE_DESCRIPTION(…) …;
MODULE_AUTHOR(…) …;
MODULE_LICENSE(…) …;