summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Lee <lerobert@google.com>2021-12-20 07:44:41 +0000
committerRobert Lee <lerobert@google.com>2021-12-22 03:18:53 +0000
commit21f6ebc43de7372004953e4c92858a3692fcd9fd (patch)
treecd07be0f32e293b266ffab711a81b031111e806b
parent427b89f0a9e9a31b0f8537a0cc1f99d6e206e876 (diff)
downloadamplifiers-21f6ebc43de7372004953e4c92858a3692fcd9fd.tar.gz
cs35l41: add new control for setting default sample rate
Bug: 206060532 Test: builds Change-Id: I2d9bf232a7bf72c7500f2dcc6e30db9e17dedee7 Signed-off-by: Robert Lee <lerobert@google.com>
-rw-r--r--cs35l41/cs35l41.c41
-rw-r--r--cs35l41/cs35l41.h3
2 files changed, 44 insertions, 0 deletions
diff --git a/cs35l41/cs35l41.c b/cs35l41/cs35l41.c
index 42ed4ef..703c2dd 100644
--- a/cs35l41/cs35l41.c
+++ b/cs35l41/cs35l41.c
@@ -1502,6 +1502,45 @@ static int cs35l41_put_ramp_knee_time(struct snd_kcontrol *kcontrol,
return 0;
}
+static int cs35l41_default_96k_get(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_component *component;
+ struct cs35l41_private *cs35l41;
+
+ component = snd_soc_kcontrol_component(kcontrol);
+ cs35l41 = snd_soc_component_get_drvdata(component);
+
+ ucontrol->value.integer.value[0] =
+ (cs35l41->reset_cache.fs_cfg == CS35L41_FS_96K);
+ return 0;
+}
+
+static int cs35l41_default_96k_put(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_component *component;
+ struct cs35l41_private *cs35l41;
+
+ component = snd_soc_kcontrol_component(kcontrol);
+ cs35l41 = snd_soc_component_get_drvdata(component);
+
+ if (ucontrol->value.integer.value[0] < 0 ||
+ ucontrol->value.integer.value[0] > 1)
+ return -EINVAL;
+
+ cs35l41->reset_cache.fs_cfg =
+ ucontrol->value.integer.value[0] == 1 ?
+ CS35L41_FS_96K : CS35L41_FS_48K;
+
+ regmap_update_bits(cs35l41->regmap, CS35L41_GLOBAL_CLK_CTRL,
+ CS35L41_GLOBAL_FS_MASK,
+ cs35l41->reset_cache.fs_cfg << CS35L41_GLOBAL_FS_SHIFT);
+
+ pr_info("update global fs to %d\n", cs35l41->reset_cache.fs_cfg);
+ return 0;
+}
+
static const char * const cs35l41_output_dev_text[] = {
"Speaker",
"Receiver",
@@ -1632,6 +1671,8 @@ static const struct snd_kcontrol_new cs35l41_aud_controls[] = {
SOC_SINGLE_EXT("IMP", SND_SOC_NOPM, 0, 0xFFFFFFFF, 0,
cs35l41_imp_get, cs35l41_imp_put),
#endif
+ SOC_SINGLE_EXT("Default 96K", SND_SOC_NOPM, 0, 1, 0,
+ cs35l41_default_96k_get, cs35l41_default_96k_put),
};
static const struct cs35l41_otp_map_element_t *cs35l41_find_otp_map(u32 otp_id)
diff --git a/cs35l41/cs35l41.h b/cs35l41/cs35l41.h
index 91430ca..3293215 100644
--- a/cs35l41/cs35l41.h
+++ b/cs35l41/cs35l41.h
@@ -733,6 +733,9 @@
#define CS35L41_SPI_MAX_FREQ_OTP 4000000
+#define CS35L41_FS_48K 0x03
+#define CS35L41_FS_96K 0x04
+
#define CS35L41_RX_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE)
#define CS35L41_TX_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE \
| SNDRV_PCM_FMTBIT_S32_LE)