From 21f6ebc43de7372004953e4c92858a3692fcd9fd Mon Sep 17 00:00:00 2001 From: Robert Lee Date: Mon, 20 Dec 2021 07:44:41 +0000 Subject: cs35l41: add new control for setting default sample rate Bug: 206060532 Test: builds Change-Id: I2d9bf232a7bf72c7500f2dcc6e30db9e17dedee7 Signed-off-by: Robert Lee --- cs35l41/cs35l41.c | 41 +++++++++++++++++++++++++++++++++++++++++ cs35l41/cs35l41.h | 3 +++ 2 files changed, 44 insertions(+) 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) -- cgit v1.2.3