kernel_samsung_a34x-permissive/sound/soc/codecs/aw8896.h
2024-04-28 15:51:13 +02:00

145 lines
3.5 KiB
C

#ifndef _AW8896_H_
#define _AW8896_H_
#include <linux/version.h>
#include <sound/control.h>
#include <sound/soc.h>
#if KERNEL_VERSION(4, 19, 1) <= LINUX_VERSION_CODE
#define AW_KERNEL_VER_OVER_4_19_1
#endif
#ifdef AW_KERNEL_VER_OVER_4_19_1
#define aw_snd_soc_codec_t struct snd_soc_component
#define aw_snd_soc_codec_driver_t const struct snd_soc_component_driver
#else
#define aw_snd_soc_codec_t struct snd_soc_codec
#define aw_snd_soc_codec_driver_t const struct snd_soc_codec_driver
#endif
struct aw_componet_codec_ops {
aw_snd_soc_codec_t *(*aw_snd_soc_kcontrol_codec)(
struct snd_kcontrol *kcontrol);
void *(*aw_snd_soc_codec_get_drvdata)(aw_snd_soc_codec_t *codec);
int (*aw_snd_soc_add_codec_controls)(aw_snd_soc_codec_t *codec,
const struct snd_kcontrol_new *controls,
unsigned int num_controls);
void (*aw_snd_soc_unregister_codec)(struct device *dev);
int (*aw_snd_soc_register_codec)(struct device *dev,
aw_snd_soc_codec_driver_t *codec_drv,
struct snd_soc_dai_driver *dai_drv,
int num_dai);
};
/*
* i2c transaction on Linux limited to 64k
* (See Linux kernel documentation: Documentation/i2c/writing-clients)
*/
#define MAX_I2C_BUFFER_SIZE 65536
#define MAX_RAM_WRITE_BYTE_SIZE 128
#define AW8896_FLAG_DSP_START_ON_MUTE (1 << 0)
#define AW8896_FLAG_SKIP_INTERRUPTS (1 << 1)
#define AW8896_FLAG_SAAM_AVAILABLE (1 << 2)
#define AW8896_FLAG_STEREO_DEVICE (1 << 3)
#define AW8896_FLAG_MULTI_MIC_INPUTS (1 << 4)
#define AW8896_FLAG_DSP_START_ON (1 << 5)
#define AW8896_NUM_RATES 9
#define AW8896_MAX_REGISTER 0xff
#define AWINIC_DSP_I2C_WRITES
#define AW8896_DSP_FW_BASE 0x8c00
#define AW8896_DSP_FW_BACKUP_BASE 0x8d80
#define AW8896_DSP_FW_VER_BASE 0x0f80
#define AW8896_DSP_FW_SIZE (512)
enum aw8896_chipid {
AW8990_ID,
};
enum aw8896_mode_spk_rcv {
AW8896_SPEAKER_MODE = 0,
AW8896_RECEIVER_MODE = 1,
};
enum aw8896_dsp_fw_version {
AW8896_DSP_FW_VER_D = 0,
AW8896_DSP_FW_VER_E = 1,
};
enum aw8896_dsp_init_state {
AW8896_DSP_INIT_STOPPED, /* DSP not running */
AW8896_DSP_INIT_RECOVER, /* DSP error detected at runtime */
AW8896_DSP_INIT_FAIL, /* DSP init failed */
AW8896_DSP_INIT_PENDING, /* DSP start requested */
AW8896_DSP_INIT_DONE, /* DSP running */
AW8896_DSP_INIT_INVALIDATED, /* DSP was running, requires re-init */
};
enum aw8896_dsp_fw_state {
AW8896_DSP_FW_NONE = 0,
AW8896_DSP_FW_PENDING,
AW8896_DSP_FW_FAIL,
AW8896_DSP_FW_FAIL_COUNT,
AW8896_DSP_FW_FAIL_REG_DSP,
AW8896_DSP_FW_FAIL_PROBE,
AW8896_DSP_FW_OK,
};
enum aw8896_dsp_cfg_state {
AW8896_DSP_CFG_NONE = 0,
AW8896_DSP_CFG_PENDING,
AW8896_DSP_CFG_FAIL,
AW8896_DSP_CFG_FAIL_COUNT,
AW8896_DSP_CFG_FAIL_REG_DSP,
AW8896_DSP_CFG_FAIL_PROBE,
AW8896_DSP_CFG_OK,
};
struct aw8896 {
struct regmap *regmap;
struct i2c_client *i2c;
aw_snd_soc_codec_t *codec;
struct mutex lock;
int dsp_init;
int dsp_fw_state;
int dsp_fw_len;
int sysclk;
u16 rev;
int rate;
struct device *dev;
struct input_dev *input;
int rst_gpio;
int reset_gpio;
int power_gpio;
int irq_gpio;
#ifdef CONFIG_DEBUG_FS
struct dentry *dbg_dir;
#endif
u8 reg;
unsigned int flags;
unsigned int chipid;
unsigned int init;
unsigned int spk_rcv_mode;
unsigned int call_in_kctl;
};
struct aw8896_container {
int len;
unsigned char data[];
};
int aw8896_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id);
int aw8896_i2c_remove(struct i2c_client *i2c);
#endif