diff options
author | Yung Ti Su <andysu@google.com> | 2019-09-09 17:58:43 +0800 |
---|---|---|
committer | Yung Ti Su <andysu@google.com> | 2020-03-13 17:57:23 +0800 |
commit | 30fa986e6ccff62b107f12effb54e424cfb4c894 (patch) | |
tree | 69e79288da269dc8a08f376d8c9f721f8b6ab3cf | |
parent | 1a9433698ae40bff9227ddfa8b2a804aea909070 (diff) | |
download | msm-extra-30fa986e6ccff62b107f12effb54e424cfb4c894.tar.gz |
Add the payload function using the mixer control SND_SOC_BYTES_TLV()
"Ambient Payload" is for get_model_state()
"Ambient Process Payload" is for the music detection payload
Bug: 129679739
Test: manual
Change-Id: Id52a2015d5c527fffcfa54fe472d5851474ee2a2
Signed-off-by: Yung Ti Su <andysu@google.com>
-rw-r--r-- | asoc/codecs/rt5514.c | 155 | ||||
-rw-r--r-- | asoc/codecs/rt5514.h | 8 |
2 files changed, 88 insertions, 75 deletions
diff --git a/asoc/codecs/rt5514.c b/asoc/codecs/rt5514.c index 41c2648f..d8aa2bd2 100644 --- a/asoc/codecs/rt5514.c +++ b/asoc/codecs/rt5514.c @@ -176,14 +176,6 @@ static bool rt5514_volatile_register(struct device *dev, unsigned int reg) static bool rt5514_readable_register(struct device *dev, unsigned int reg) { switch (reg) { - case 0x1100: - case 0x1104: - case 0x1108: - case 0x110c: - case 0x1110: - case 0x1114: - case 0x1118: - case 0x111c: case RT5514_RESET: case RT5514_PWR_ANA1: case RT5514_PWR_ANA2: @@ -237,71 +229,6 @@ static bool rt5514_readable_register(struct device *dev, unsigned int reg) } } -static bool rt5514_i2c_readable_register(struct device *dev, - unsigned int reg) -{ - switch (reg) { - case RT5514_DSP_MAPPING | 0x1100: - case RT5514_DSP_MAPPING | 0x1104: - case RT5514_DSP_MAPPING | 0x1108: - case RT5514_DSP_MAPPING | 0x110c: - case RT5514_DSP_MAPPING | 0x1110: - case RT5514_DSP_MAPPING | 0x1114: - case RT5514_DSP_MAPPING | 0x1118: - case RT5514_DSP_MAPPING | 0x111c: - case RT5514_DSP_MAPPING | RT5514_RESET: - case RT5514_DSP_MAPPING | RT5514_PWR_ANA1: - case RT5514_DSP_MAPPING | RT5514_PWR_ANA2: - case RT5514_DSP_MAPPING | RT5514_I2S_CTRL1: - case RT5514_DSP_MAPPING | RT5514_I2S_CTRL2: - case RT5514_DSP_MAPPING | RT5514_VAD_CTRL6: - case RT5514_DSP_MAPPING | RT5514_EXT_VAD_CTRL: - case RT5514_DSP_MAPPING | RT5514_DIG_IO_CTRL: - case RT5514_DSP_MAPPING | RT5514_PAD_CTRL1: - case RT5514_DSP_MAPPING | RT5514_DMIC_DATA_CTRL: - case RT5514_DSP_MAPPING | RT5514_DIG_SOURCE_CTRL: - case RT5514_DSP_MAPPING | RT5514_SRC_CTRL: - case RT5514_DSP_MAPPING | RT5514_DOWNFILTER2_CTRL1: - case RT5514_DSP_MAPPING | RT5514_PLL_SOURCE_CTRL: - case RT5514_DSP_MAPPING | RT5514_CLK_CTRL1: - case RT5514_DSP_MAPPING | RT5514_CLK_CTRL2: - case RT5514_DSP_MAPPING | RT5514_PLL3_CALIB_CTRL1: - case RT5514_DSP_MAPPING | RT5514_PLL3_CALIB_CTRL5: - case RT5514_DSP_MAPPING | RT5514_DELAY_BUF_CTRL1: - case RT5514_DSP_MAPPING | RT5514_DELAY_BUF_CTRL3: - case RT5514_DSP_MAPPING | RT5514_DOWNFILTER0_CTRL1: - case RT5514_DSP_MAPPING | RT5514_DOWNFILTER0_CTRL2: - case RT5514_DSP_MAPPING | RT5514_DOWNFILTER0_CTRL3: - case RT5514_DSP_MAPPING | RT5514_DOWNFILTER1_CTRL1: - case RT5514_DSP_MAPPING | RT5514_DOWNFILTER1_CTRL2: - case RT5514_DSP_MAPPING | RT5514_DOWNFILTER1_CTRL3: - case RT5514_DSP_MAPPING | RT5514_ANA_CTRL_LDO10: - case RT5514_DSP_MAPPING | RT5514_ANA_CTRL_LDO18_16: - case RT5514_DSP_MAPPING | RT5514_ANA_CTRL_ADC12: - case RT5514_DSP_MAPPING | RT5514_ANA_CTRL_ADC21: - case RT5514_DSP_MAPPING | RT5514_ANA_CTRL_ADC22: - case RT5514_DSP_MAPPING | RT5514_ANA_CTRL_ADC23: - case RT5514_DSP_MAPPING | RT5514_ANA_CTRL_MICBST: - case RT5514_DSP_MAPPING | RT5514_ANA_CTRL_ADCFED: - case RT5514_DSP_MAPPING | RT5514_ANA_CTRL_INBUF: - case RT5514_DSP_MAPPING | RT5514_ANA_CTRL_VREF: - case RT5514_DSP_MAPPING | RT5514_ANA_CTRL_PLL3: - case RT5514_DSP_MAPPING | RT5514_ANA_CTRL_PLL1_1: - case RT5514_DSP_MAPPING | RT5514_ANA_CTRL_PLL1_2: - case RT5514_DSP_MAPPING | RT5514_DMIC_LP_CTRL: - case RT5514_DSP_MAPPING | RT5514_MISC_CTRL_DSP: - case RT5514_DSP_MAPPING | RT5514_DSP_CTRL1: - case RT5514_DSP_MAPPING | RT5514_DSP_CTRL3: - case RT5514_DSP_MAPPING | RT5514_DSP_CTRL4: - case RT5514_DSP_MAPPING | RT5514_VENDOR_ID1: - case RT5514_DSP_MAPPING | RT5514_VENDOR_ID2: - return true; - - default: - return false; - } -} - /* {-3, 0, +3, +4.5, +7.5, +9.5, +12, +14, +17} dB */ static const DECLARE_TLV_DB_RANGE(bst_tlv, 0, 2, TLV_DB_SCALE_ITEM(-300, 300, 0), @@ -823,6 +750,82 @@ done: return ret; } +static int rt5514_ambient_payload_put(struct snd_kcontrol *kcontrol, + const unsigned int __user *bytes, unsigned int size) +{ + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); + struct rt5514_priv *rt5514 = snd_soc_component_get_drvdata(component); + int ret = 0; + char payload[AMBIENT_COMMON_MAX_PAYLOAD_BUFFER_SIZE]; + unsigned int payload_addr; + + if (copy_from_user(payload, bytes, size)) + return -EFAULT; + + /* AmbientHotwordType */ + regmap_write(rt5514->i2c_regmap, 0x18002fd0, payload[0]); + regmap_write(rt5514->i2c_regmap, 0x18001014, 2); + regmap_read(rt5514->i2c_regmap, 0x18002fd4, &payload_addr); + regmap_read(rt5514->i2c_regmap, 0x18002fd8, &rt5514->payload.size); + regmap_read(rt5514->i2c_regmap, 0x18002fdc, &rt5514->payload.status); + + if ((payload_addr & 0xfff00000) == 0x4ff00000) + rt5514_spi_burst_read(payload_addr, (u8 *)&rt5514->payload.data, + AMBIENT_COMMON_MAX_PAYLOAD_BUFFER_SIZE); + else + return -EFAULT; + + return ret; +} + +static int rt5514_ambient_payload_get(struct snd_kcontrol *kcontrol, + unsigned int __user *bytes, unsigned int size) +{ + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); + struct rt5514_priv *rt5514 = snd_soc_component_get_drvdata(component); + struct snd_soc_codec *codec = rt5514->codec; + int ret = 0; + + if (size != sizeof(RT5514_PAYLOAD)) + return -EINVAL; + + if (copy_to_user(bytes, &rt5514->payload, sizeof(RT5514_PAYLOAD))) { + dev_warn(codec->dev, "%s(), copy_to_user fail\n", __func__); + ret = -EFAULT; + } + + return ret; +} + +static int rt5514_ambient_process_payload_get(struct snd_kcontrol *kcontrol, + unsigned int __user *bytes, unsigned int size) +{ + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); + struct rt5514_priv *rt5514 = snd_soc_component_get_drvdata(component); + struct snd_soc_codec *codec = rt5514->codec; + int ret = 0; + unsigned int payload_addr; + + if (size != sizeof(RT5514_PAYLOAD)) + return -EINVAL; + + regmap_read(rt5514->i2c_regmap, 0x18002fe0, &payload_addr); + regmap_read(rt5514->i2c_regmap, 0x18002fe4, &rt5514->payload.size); + + if ((payload_addr & 0xfff00000) == 0x4ff00000) + rt5514_spi_burst_read(payload_addr, (u8 *)&rt5514->payload.data, + AMBIENT_COMMON_MAX_PAYLOAD_BUFFER_SIZE); + else + return -EFAULT; + + if (copy_to_user(bytes, &rt5514->payload, sizeof(RT5514_PAYLOAD))) { + dev_warn(codec->dev, "%s(), copy_to_user fail\n", __func__); + ret = -EFAULT; + } + + return ret; +} + static const struct snd_kcontrol_new rt5514_snd_controls[] = { SOC_DOUBLE_TLV("MIC Boost Volume", RT5514_ANA_CTRL_MICBST, RT5514_SEL_BSTL_SFT, RT5514_SEL_BSTR_SFT, 8, 0, bst_tlv), @@ -844,6 +847,10 @@ static const struct snd_kcontrol_new rt5514_snd_controls[] = { rt5514_dsp_frame_flag_get, NULL), SOC_SINGLE_EXT("DSP Test", SND_SOC_NOPM, 0, 1, 0, rt5514_dsp_test_get, rt5514_dsp_test_put), + SND_SOC_BYTES_TLV("Ambient Payload", sizeof(RT5514_PAYLOAD), + rt5514_ambient_payload_get, rt5514_ambient_payload_put), + SND_SOC_BYTES_TLV("Ambient Process Payload", sizeof(RT5514_PAYLOAD), + rt5514_ambient_process_payload_get, NULL), }; /* ADC Mixer*/ @@ -1630,8 +1637,6 @@ static const struct regmap_config rt5514_i2c_regmap = { .reg_bits = 32, .val_bits = 32, - .readable_reg = rt5514_i2c_readable_register, - .cache_type = REGCACHE_NONE, }; diff --git a/asoc/codecs/rt5514.h b/asoc/codecs/rt5514.h index cde26d9e..6d28bdc1 100644 --- a/asoc/codecs/rt5514.h +++ b/asoc/codecs/rt5514.h @@ -248,6 +248,7 @@ #define RT5514_FIRMWARE3 "rt5514_dsp_fw3.bin" #define RT5514_FIRMWARE4 "rt5514_dsp_fw4.bin" +#define AMBIENT_COMMON_MAX_PAYLOAD_BUFFER_SIZE (128) #define BUFFER_SIZE 10 /* System Clock Source */ @@ -262,6 +263,12 @@ enum { RT5514_PLL1_S_BCLK, }; +typedef struct _payload_st { + unsigned int size; + unsigned int status; + char data[AMBIENT_COMMON_MAX_PAYLOAD_BUFFER_SIZE]; +} RT5514_PAYLOAD; + struct rt5514_priv { struct rt5514_platform_data pdata; struct snd_soc_codec *codec; @@ -279,6 +286,7 @@ struct rt5514_priv { unsigned int hotword_model_len, musdet_model_len; unsigned int pll3_cal_value; int codec_state; + RT5514_PAYLOAD payload; }; enum { |