/* 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__