ASoC: rt5651: Allow specifying over-current threshold through a device-property
authorHans de Goede <hdegoede@redhat.com>
Sun, 4 Mar 2018 14:35:52 +0000 (15:35 +0100)
committerMark Brown <broonie@kernel.org>
Wed, 7 Mar 2018 12:47:13 +0000 (12:47 +0000)
OVer-Current-Detection (OVCD) for the micbias current is used to detect
if an inserted jack is a headset or headphones (mic shorted to ground).

Some boards may need different values for the OVCD current threshold
because of a resistor on the board in serial with or parallel to the
jack mic contact.

This commit adds support for configuring the OCVD current threshold
through the "realtek,over-current-threshold-microamp" device-property.

Note this commit changes the default value from 600uA to 2000uA,
because testing has shown 600uA to be a poor default.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/rt5651.c
sound/soc/codecs/rt5651.h

index 50e1c501b6b9b7233a53348f50ccd227bb1f4b58..7ff1bc892cfd447e8d284d44c05a3746163cb94f 100644 (file)
@@ -1638,7 +1638,7 @@ static int rt5651_set_jack(struct snd_soc_component *component,
                                      RT5651_PWR_CLK12M_MASK |
                                      RT5651_PWR_MB_MASK,
                                      RT5651_MIC1_OVCD_EN |
-                                     RT5651_MIC1_OVTH_600UA |
+                                     rt5651->ovcd_th |
                                      RT5651_PWR_MB_PU |
                                      RT5651_PWR_CLK12M_PU);
 
@@ -1684,6 +1684,26 @@ static void rt5651_apply_properties(struct snd_soc_component *component)
        if (device_property_read_u32(component->dev,
                                     "realtek,jack-detect-source", &val) == 0)
                rt5651->jd_src = val;
+
+       rt5651->ovcd_th = RT5651_MIC1_OVTH_2000UA;
+
+       if (device_property_read_u32(component->dev,
+                       "realtek,over-current-threshold-microamp", &val) == 0) {
+               switch (val) {
+               case 600:
+                       rt5651->ovcd_th = RT5651_MIC1_OVTH_600UA;
+                       break;
+               case 1500:
+                       rt5651->ovcd_th = RT5651_MIC1_OVTH_1500UA;
+                       break;
+               case 2000:
+                       rt5651->ovcd_th = RT5651_MIC1_OVTH_2000UA;
+                       break;
+               default:
+                       dev_warn(component->dev, "Warning: Invalid over-current-threshold-microamp value: %d, defaulting to 2000uA\n",
+                                val);
+               }
+       }
 }
 
 static int rt5651_probe(struct snd_soc_component *component)
index f3158488fc89a3b0a2c119c251806946bb3888bb..9cd5c279d0d660775eec1f150ea30311e0345511 100644 (file)
@@ -2064,6 +2064,7 @@ struct rt5651_priv {
        struct snd_soc_jack *hp_jack;
        struct delayed_work jack_detect_work;
        enum rt5651_jd_src jd_src;
+       unsigned int ovcd_th;
 
        int irq;
        int sysclk;