summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYung Ti Su <andysu@google.com>2019-09-09 17:58:43 +0800
committerYung Ti Su <andysu@google.com>2020-03-13 17:57:23 +0800
commit30fa986e6ccff62b107f12effb54e424cfb4c894 (patch)
tree69e79288da269dc8a08f376d8c9f721f8b6ab3cf
parent1a9433698ae40bff9227ddfa8b2a804aea909070 (diff)
downloadmsm-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.c155
-rw-r--r--asoc/codecs/rt5514.h8
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 {