]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: rt1320-sdw: kcontrol for brown-out feature update
authorJack Yu <jack.yu@realtek.com>
Thu, 9 Apr 2026 06:01:01 +0000 (14:01 +0800)
committerMark Brown <broonie@kernel.org>
Thu, 9 Apr 2026 19:41:48 +0000 (20:41 +0100)
Create a kcontrol to enable or disable brown-out dynamically.

Signed-off-by: Jack Yu <jack.yu@realtek.com>
Link: https://patch.msgid.link/20260409060102.4177554-1-jack.yu@realtek.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/rt1320-sdw.c
sound/soc/codecs/rt1320-sdw.h

index 8bb7e8497c726edb9805f8fe53c6dad138423ab3..168d2f39172356db25ca45a33321a6e358e10aab 100644 (file)
@@ -2486,6 +2486,45 @@ static int rt1320_rae_update_put(struct snd_kcontrol *kcontrol,
        return 0;
 }
 
+static int rt1320_brown_out_put(struct snd_kcontrol *kcontrol,
+                                struct snd_ctl_elem_value *ucontrol)
+{
+       struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
+       struct rt1320_sdw_priv *rt1320 = snd_soc_component_get_drvdata(component);
+       int ret, changed = 0;
+
+       if (!rt1320->hw_init)
+               return 0;
+
+       ret = pm_runtime_resume(component->dev);
+       if (ret < 0 && ret != -EACCES)
+               return ret;
+
+       if (rt1320->brown_out != ucontrol->value.integer.value[0]) {
+               changed = 1;
+               rt1320->brown_out = ucontrol->value.integer.value[0];
+       }
+
+       if (rt1320->brown_out == 0)
+               regmap_write(rt1320->regmap, 0xdb03, 0x00);
+       else
+               regmap_write(rt1320->regmap, 0xdb03, 0xf0);
+
+
+       return changed;
+}
+
+static int rt1320_brown_out_get(struct snd_kcontrol *kcontrol,
+                                    struct snd_ctl_elem_value *ucontrol)
+{
+       struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
+       struct rt1320_sdw_priv *rt1320 = snd_soc_component_get_drvdata(component);
+
+       ucontrol->value.integer.value[0] = rt1320->brown_out;
+
+       return 0;
+}
+
 static int rt1320_r0_temperature_get(struct snd_kcontrol *kcontrol,
                                     struct snd_ctl_elem_value *ucontrol)
 {
@@ -2545,6 +2584,8 @@ static const struct snd_kcontrol_new rt1320_snd_controls[] = {
                rt1320_r0_temperature_get, rt1320_r0_temperature_put),
        SOC_SINGLE_EXT("RAE Update", SND_SOC_NOPM, 0, 1, 0,
                rt1320_rae_update_get, rt1320_rae_update_put),
+       SOC_SINGLE_EXT("Brown Out Switch", SND_SOC_NOPM, 0, 1, 0,
+               rt1320_brown_out_get, rt1320_brown_out_put),
 };
 
 static const struct snd_kcontrol_new rt1320_spk_l_dac =
@@ -2904,6 +2945,7 @@ static int rt1320_sdw_init(struct device *dev, struct regmap *regmap,
        rt1320->fu_dapm_mute = true;
        rt1320->fu_mixer_mute[0] = rt1320->fu_mixer_mute[1] =
                rt1320->fu_mixer_mute[2] = rt1320->fu_mixer_mute[3] = true;
+       rt1320->brown_out = 1;
 
        INIT_WORK(&rt1320->load_dspfw_work, rt1320_load_dspfw_work);
 
index 5a9f496dd848ff9b27d4e3bc7b899ec57b97e285..4a1d3fc4c8eecdf018e8ab3fb4d40ff40f252091 100644 (file)
@@ -159,6 +159,7 @@ struct rt1320_sdw_priv {
        bool hw_init;
        bool first_hw_init;
        int version_id;
+       int brown_out;
        unsigned int dev_id;
        bool fu_dapm_mute;
        bool fu_mixer_mute[4];