151 lines
2.8 KiB
C
151 lines
2.8 KiB
C
/* SPDX-License-Identifier: GPL-2.0+ */
|
|
/*
|
|
* fs-amp-lib.h --- Common library for FourSemi Audio Amplifiers
|
|
*
|
|
* Copyright (C) 2016-2025 Shanghai FourSemi Semiconductor Co.,Ltd.
|
|
*/
|
|
|
|
#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) /* 100ms */
|
|
|
|
#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; /* FS_CMD_UPDATE */
|
|
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 {
|
|
/* Index type */
|
|
u16 type;
|
|
/* Offset address starting from the end of header */
|
|
u16 offset;
|
|
};
|
|
|
|
struct fs_fwm_table {
|
|
char name[FS_TABLE_NAME_LEN];
|
|
u16 size; /* size of buf */
|
|
u8 buf[];
|
|
};
|
|
|
|
struct fs_scene_index {
|
|
/* Offset address(scene name) in string table */
|
|
u16 name;
|
|
/* Offset address(scene reg) in register table */
|
|
u16 reg;
|
|
/* Offset address(scene model) in model table */
|
|
u16 model;
|
|
/* Offset address(scene effect) in effect table */
|
|
u16 effect;
|
|
};
|
|
|
|
struct fs_reg_table {
|
|
u16 size; /* size of buf */
|
|
u8 buf[];
|
|
};
|
|
|
|
struct fs_file_table {
|
|
u16 name;
|
|
u16 size; /* size of buf */
|
|
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; /* Offset address(project name) in string table */
|
|
u16 device; /* Offset address(device name) in string table */
|
|
struct fs_fwm_date date;
|
|
u16 crc16;
|
|
u16 crc_size; /* Starting position for CRC checking */
|
|
u16 chip_type;
|
|
u16 addr; /* 7-bit i2c address */
|
|
u16 spkid;
|
|
u16 rsvd[6];
|
|
u8 params[];
|
|
};
|
|
|
|
#pragma pack(pop)
|
|
|
|
struct fs_i2s_srate {
|
|
u32 srate; /* Sample rate */
|
|
u16 i2ssr; /* Value of Bit field[I2SSR] */
|
|
};
|
|
|
|
struct fs_pll_div {
|
|
unsigned int bclk; /* Rate of bit clock */
|
|
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 // __FS_AMP_LIB_H__
|