#ifndef __FS_AMP_LIB_H__
#define __FS_AMP_LIB_H__
#define HI_U16(a) (((a) >> 8) & 0xFF)
#define LO_U16(a) ((a) & 0xFF)
#define FS_TABLE_NAME_LEN (4)
#define FS_SCENE_COUNT_MAX (16)
#define FS_CMD_DELAY_MS_MAX (100)
#define FS_CMD_DELAY (0xFF)
#define FS_CMD_BURST (0xFE)
#define FS_CMD_UPDATE (0xFD)
#define FS_SOC_ENUM_EXT(xname, xhandler_info, xhandler_get, xhandler_put) \
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
.info = xhandler_info, \
.get = xhandler_get, .put = xhandler_put \
}
enum fs_index_type {
FS_INDEX_INFO = 0,
FS_INDEX_STCOEF,
FS_INDEX_SCENE,
FS_INDEX_MODEL,
FS_INDEX_REG,
FS_INDEX_EFFECT,
FS_INDEX_STRING,
FS_INDEX_WOOFER,
FS_INDEX_MAX,
};
#pragma pack(push, 1)
struct fs_reg_val {
u8 reg;
u16 val;
};
struct fs_reg_bits {
u8 cmd;
u8 reg;
u16 val;
u16 mask;
};
struct fs_cmd_pkg {
union {
u8 cmd;
struct fs_reg_val regv;
struct fs_reg_bits regb;
};
};
struct fs_fwm_index {
u16 type;
u16 offset;
};
struct fs_fwm_table {
char name[FS_TABLE_NAME_LEN];
u16 size;
u8 buf[];
};
struct fs_scene_index {
u16 name;
u16 reg;
u16 model;
u16 effect;
};
struct fs_reg_table {
u16 size;
u8 buf[];
};
struct fs_file_table {
u16 name;
u16 size;
u8 buf[];
};
struct fs_fwm_date {
u32 year:12;
u32 month:4;
u32 day:5;
u32 hour:5;
u32 minute:6;
};
struct fs_fwm_header {
u16 version;
u16 project;
u16 device;
struct fs_fwm_date date;
u16 crc16;
u16 crc_size;
u16 chip_type;
u16 addr;
u16 spkid;
u16 rsvd[6];
u8 params[];
};
#pragma pack(pop)
struct fs_i2s_srate {
u32 srate;
u16 i2ssr;
};
struct fs_pll_div {
unsigned int bclk;
u16 pll1;
u16 pll2;
u16 pll3;
};
struct fs_amp_scene {
const char *name;
const struct fs_reg_table *reg;
const struct fs_file_table *model;
const struct fs_file_table *effect;
};
struct fs_amp_lib {
const struct fs_fwm_header *hdr;
const struct fs_fwm_table *table[FS_INDEX_MAX];
struct fs_amp_scene *scene;
struct device *dev;
int scene_count;
u16 devid;
};
int fs_amp_load_firmware(struct fs_amp_lib *amp_lib, const char *name);
#endif