ALT Linux kernel packages development
 help / color / mirror / Atom feed
From: kovalev@altlinux.org
To: devel-kernel@lists.altlinux.org
Subject: [d-kernel] [PATCH 16/33] ASoC: codecs: ES8326: Adding new volume kcontrols
Date: Mon, 29 Jul 2024 08:10:05 +0300
Message-ID: <20240729051022.98198-17-kovalev@altlinux.org> (raw)
In-Reply-To: <20240729051022.98198-1-kovalev@altlinux.org>

From: Zhu Ning <zhuning0077@gmail.com>

commit 966323dd9a65dde599f59176280468a0cb04c875 upstream.

ES8326 features a headphone volume control register and four DAC
volume control registers.
We add new volume Kcontrols for these registers to enhance the
configurability of the volume settings, providing users with
greater flexibility.

Signed-off-by: Zhu Ning <zhuning0077@gmail.com>
Link: https://msgid.link/r/20240124064806.30511-2-zhuning0077@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Vasiliy Kovalev <kovalev@altlinux.org>
---
 sound/soc/codecs/es8326.c | 92 ++++++++++++++++++++++++++++++++++++++-
 sound/soc/codecs/es8326.h |  5 ++-
 2 files changed, 95 insertions(+), 2 deletions(-)

diff --git a/sound/soc/codecs/es8326.c b/sound/soc/codecs/es8326.c
index 92047b3c3bac36..6effbe3d31ddf1 100644
--- a/sound/soc/codecs/es8326.c
+++ b/sound/soc/codecs/es8326.c
@@ -36,6 +36,8 @@ struct es8326_priv {
 	u8 jack_pol;
 	u8 interrupt_src;
 	u8 interrupt_clk;
+	u8 hpl_vol;
+	u8 hpr_vol;
 	bool jd_inverted;
 	unsigned int sysclk;
 
@@ -121,6 +123,72 @@ static int es8326_crosstalk2_set(struct snd_kcontrol *kcontrol,
 	return 0;
 }
 
+static int es8326_hplvol_get(struct snd_kcontrol *kcontrol,
+		struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
+	struct es8326_priv *es8326 = snd_soc_component_get_drvdata(component);
+
+	ucontrol->value.integer.value[0] = es8326->hpl_vol;
+
+	return 0;
+}
+
+static int es8326_hplvol_set(struct snd_kcontrol *kcontrol,
+		struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
+	struct es8326_priv *es8326 = snd_soc_component_get_drvdata(component);
+	unsigned int hp_vol;
+
+	hp_vol = ucontrol->value.integer.value[0];
+	if (hp_vol > 5)
+		return -EINVAL;
+	if (es8326->hpl_vol != hp_vol) {
+		es8326->hpl_vol = hp_vol;
+		if (hp_vol >= 3)
+			hp_vol++;
+		regmap_update_bits(es8326->regmap, ES8326_HP_VOL,
+				0x70, (hp_vol << 4));
+		return 1;
+	}
+
+	return 0;
+}
+
+static int es8326_hprvol_get(struct snd_kcontrol *kcontrol,
+		struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
+	struct es8326_priv *es8326 = snd_soc_component_get_drvdata(component);
+
+	ucontrol->value.integer.value[0] = es8326->hpr_vol;
+
+	return 0;
+}
+
+static int es8326_hprvol_set(struct snd_kcontrol *kcontrol,
+		struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
+	struct es8326_priv *es8326 = snd_soc_component_get_drvdata(component);
+	unsigned int hp_vol;
+
+	hp_vol = ucontrol->value.integer.value[0];
+	if (hp_vol > 5)
+		return -EINVAL;
+	if (es8326->hpr_vol != hp_vol) {
+		es8326->hpr_vol = hp_vol;
+		if (hp_vol >= 3)
+			hp_vol++;
+		regmap_update_bits(es8326->regmap, ES8326_HP_VOL,
+				0x07, hp_vol);
+		return 1;
+	}
+
+	return 0;
+}
+
 static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(dac_vol_tlv, -9550, 50, 0);
 static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(adc_vol_tlv, -9550, 50, 0);
 static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(adc_analog_pga_tlv, 0, 300, 0);
@@ -151,15 +219,24 @@ static const char *const winsize[] = {
 static const char *const dacpol_txt[] =	{
 	"Normal", "R Invert", "L Invert", "L + R Invert" };
 
+static const char *const hp_spkvol_switch[] = {
+	"HPVOL: HPL+HPL, SPKVOL: HPL+HPL",
+	"HPVOL: HPL+HPR, SPKVOL: HPL+HPR",
+	"HPVOL: HPL+HPL, SPKVOL: SPKL+SPKR",
+	"HPVOL: HPL+HPR, SPKVOL: SPKL+SPKR",
+};
+
 static const struct soc_enum dacpol =
 	SOC_ENUM_SINGLE(ES8326_DAC_DSM, 4, 4, dacpol_txt);
 static const struct soc_enum alc_winsize =
 	SOC_ENUM_SINGLE(ES8326_ADC_RAMPRATE, 4, 16, winsize);
 static const struct soc_enum drc_winsize =
 	SOC_ENUM_SINGLE(ES8326_DRC_WINSIZE, 4, 16, winsize);
+static const struct soc_enum hpvol_spkvol_switch =
+	SOC_ENUM_SINGLE(ES8326_HP_MISC, 6, 4, hp_spkvol_switch);
 
 static const struct snd_kcontrol_new es8326_snd_controls[] = {
-	SOC_SINGLE_TLV("DAC Playback Volume", ES8326_DAC_VOL, 0, 0xbf, 0, dac_vol_tlv),
+	SOC_SINGLE_TLV("DAC Playback Volume", ES8326_DACL_VOL, 0, 0xbf, 0, dac_vol_tlv),
 	SOC_ENUM("Playback Polarity", dacpol),
 	SOC_SINGLE_TLV("DAC Ramp Rate", ES8326_DAC_RAMPRATE, 0, 0x0f, 0, softramp_rate),
 	SOC_SINGLE_TLV("DRC Recovery Level", ES8326_DRC_RECOVERY, 0, 4, 0, drc_recovery_tlv),
@@ -182,6 +259,17 @@ static const struct snd_kcontrol_new es8326_snd_controls[] = {
 			es8326_crosstalk1_get, es8326_crosstalk1_set),
 	SOC_SINGLE_EXT("CROSSTALK2", SND_SOC_NOPM, 0, 31, 0,
 			es8326_crosstalk2_get, es8326_crosstalk2_set),
+	SOC_SINGLE_EXT("HPL Volume", SND_SOC_NOPM, 0, 5, 0,
+			es8326_hplvol_get, es8326_hplvol_set),
+	SOC_SINGLE_EXT("HPR Volume", SND_SOC_NOPM, 0, 5, 0,
+			es8326_hprvol_get, es8326_hprvol_set),
+
+	SOC_SINGLE_TLV("HPL Playback Volume", ES8326_DACL_VOL, 0, 0xbf, 0, dac_vol_tlv),
+	SOC_SINGLE_TLV("HPR Playback Volume", ES8326_DACR_VOL, 0, 0xbf, 0, dac_vol_tlv),
+	SOC_SINGLE_TLV("SPKL Playback Volume", ES8326_SPKL_VOL, 0, 0xbf, 0, dac_vol_tlv),
+	SOC_SINGLE_TLV("SPKR Playback Volume", ES8326_SPKR_VOL, 0, 0xbf, 0, dac_vol_tlv),
+
+	SOC_ENUM("HPVol SPKVol Switch", hpvol_spkvol_switch),
 };
 
 static const struct snd_soc_dapm_widget es8326_dapm_widgets[] = {
@@ -972,6 +1060,8 @@ static int es8326_resume(struct snd_soc_component *component)
 
 	es8326->jack_remove_retry = 0;
 	es8326->hp = 0;
+	es8326->hpl_vol = 0x03;
+	es8326->hpr_vol = 0x03;
 	return 0;
 }
 
diff --git a/sound/soc/codecs/es8326.h b/sound/soc/codecs/es8326.h
index 4234bbb900c453..ee12caef810532 100644
--- a/sound/soc/codecs/es8326.h
+++ b/sound/soc/codecs/es8326.h
@@ -69,7 +69,7 @@
 #define ES8326_DAC_DSM		0x4D
 #define ES8326_DAC_RAMPRATE	0x4E
 #define ES8326_DAC_VPPSCALE	0x4F
-#define ES8326_DAC_VOL		0x50
+#define ES8326_DACL_VOL	        0x50
 #define ES8326_DRC_RECOVERY	0x53
 #define ES8326_DRC_WINSIZE	0x54
 #define ES8326_DAC_CROSSTALK	0x55
@@ -81,6 +81,9 @@
 #define ES8326_SDINOUT23_IO	0x5B
 #define ES8326_JACK_PULSE	0x5C
 
+#define ES8326_DACR_VOL		0xF4
+#define ES8326_SPKL_VOL		0xF5
+#define ES8326_SPKR_VOL		0xF6
 #define ES8326_HP_MISC		0xF7
 #define ES8326_CTIA_OMTP_STA	0xF8
 #define ES8326_PULLUP_CTL	0xF9
-- 
2.33.8



  parent reply	other threads:[~2024-07-29  5:10 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-29  5:09 [d-kernel] [PATCH c10f2/c10f1 6.1.y 0/33] ASoC: codecs: es83x6: fix support kovalev
2024-07-29  5:09 ` [d-kernel] [PATCH 01/33] ASoC: codecs: ES8316: fix build warning kovalev
2024-07-29  5:09 ` [d-kernel] [PATCH 02/33] ASoC: codecs: ES8326: Add es8326_mute function kovalev
2024-07-29  5:09 ` [d-kernel] [PATCH 03/33] ASoC: codecs: ES8326: Change Hp_detect register names kovalev
2024-07-29  5:09 ` [d-kernel] [PATCH 04/33] ASoC: codecs: ES8326: Change Volatile Reg function kovalev
2024-07-29  5:09 ` [d-kernel] [PATCH 05/33] ASoC: codecs: ES8326: Fix power-up sequence kovalev
2024-07-29  5:09 ` [d-kernel] [PATCH 06/33] ASOC: codecs: ES8326: Add calibration support for version_b kovalev
2024-07-29  5:09 ` [d-kernel] [PATCH 07/33] ASoC: codecs: ES8326: Update jact detection function kovalev
2024-07-29  5:09 ` [d-kernel] [PATCH 08/33] ASoC: codecs: ES8326: Add chip version flag kovalev
2024-07-29  5:09 ` [d-kernel] [PATCH 09/33] ASoC: codecs: ES8326: Changing initialisation and broadcasting kovalev
2024-07-29  5:09 ` [d-kernel] [PATCH 10/33] ASoC: codecs: ES8326: Changing the headset detection time kovalev
2024-07-29  5:10 ` [d-kernel] [PATCH 11/33] ASoC: codecs: ES8326: improving crosstalk performance kovalev
2024-07-29  5:10 ` [d-kernel] [PATCH 12/33] ASoC: codecs: ES8326: Improving the THD+N performance kovalev
2024-07-29  5:10 ` [d-kernel] [PATCH 13/33] ASoC: codecs: ES8326: Minimize the pop noise on headphone kovalev
2024-07-29  5:10 ` [d-kernel] [PATCH 14/33] ASoC: codecs: ES8326: fix the capture noise issue kovalev
2024-07-29  5:10 ` [d-kernel] [PATCH 15/33] ASoC: codecs: ES8326: Remove executable bit kovalev
2024-07-29  5:10 ` kovalev [this message]
2024-07-29  5:10 ` [d-kernel] [PATCH 17/33] ASoC: codecs: ES8326: Changing members of private structure kovalev
2024-07-29  5:10 ` [d-kernel] [PATCH 18/33] ASoC: codecs: ES8326: Reducing power consumption kovalev
2024-07-29  5:10 ` [d-kernel] [PATCH 19/33] ASoC: codecs: ES8326: Delete unused REG_SUPPLY kovalev
2024-07-29  5:10 ` [d-kernel] [PATCH 20/33] ASoC: codecs: ES8326: Solve error interruption issue kovalev
2024-07-29  5:10 ` [d-kernel] [PATCH 21/33] ASoC: codecs: ES8326: modify clock table kovalev
2024-07-29  5:10 ` [d-kernel] [PATCH 22/33] ASoC: codecs: ES8326: Solve a headphone detection issue after suspend and resume kovalev
2024-07-29  5:10 ` [d-kernel] [PATCH 23/33] ASoC: codecs: ES8326: Removing the control of ADC_SCALE kovalev
2024-07-29  5:10 ` [d-kernel] [PATCH 24/33] ASoC: codecs: ES8326: solve hp and button detect issue kovalev
2024-07-29  5:10 ` [d-kernel] [PATCH 25/33] ASoC: codecs: ES8326: Solve headphone detection issue kovalev
2024-07-29  5:10 ` [d-kernel] [PATCH 26/33] ASoC: codecs: ES8326: Slove " kovalev
2024-07-29  5:10 ` [d-kernel] [PATCH 27/33] ASoC: codecs: ES8326: Minimize the pop noise kovalev
2024-07-29  5:10 ` [d-kernel] [PATCH 28/33] ASoC: codecs: ES8326: regcache_sync error issue kovalev
2024-07-29  5:10 ` [d-kernel] [PATCH 29/33] ASoC: codecs: ES8326: suspend issue kovalev
2024-07-29  5:10 ` [d-kernel] [PATCH 30/33] ASoC: Intel: sof-essx8336 - add DMI info for Aquarius laptops kovalev
2024-07-29  5:10 ` [d-kernel] [PATCH 31/33] ASoC: Intel: sof-essx8336 - add DMI info of the Kraftway ACCORD S15T laptop kovalev
2024-07-29  5:10 ` [d-kernel] [PATCH 32/33] ASoC: Intel: sof-essx8336 - add DMI info of the ACD Smart Solutions TG819S laptop kovalev
2024-07-29  5:10 ` [d-kernel] [PATCH 33/33] ASoC: Intel: sof-essx8336: force card->name for the es8326 codec kovalev
2024-07-29  5:47 ` [d-kernel] [PATCH c10f2/c10f1 6.1.y 0/33] ASoC: codecs: es83x6: fix support Vitaly Chikunov
2024-07-30  7:48   ` Vasiliy Kovalev

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240729051022.98198-17-kovalev@altlinux.org \
    --to=kovalev@altlinux.org \
    --cc=devel-kernel@lists.altlinux.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

ALT Linux kernel packages development

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel-kernel/0 devel-kernel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel-kernel devel-kernel/ http://lore.altlinux.org/devel-kernel \
		devel-kernel@altlinux.org devel-kernel@altlinux.ru devel-kernel@altlinux.com
	public-inbox-index devel-kernel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel-kernel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git