pinctrl: intel: Fix 2 kOhm bias which is 833 Ohm
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Wed, 14 Oct 2020 10:46:37 +0000 (13:46 +0300)
committerAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Mon, 26 Oct 2020 11:26:49 +0000 (13:26 +0200)
2 kOhm bias was never an option in Intel GPIO hardware, the available
matrix is:

000 none
001 1 kOhm (if available)
010 5 kOhm
100 20 kOhm

As easy to get the 3 resistors are gated separately and according to
parallel circuits calculations we may get combinations of the above where
the result is always strictly less than minimal resistance. Hence,
additional values can be:

011 ~833.3 Ohm
101 ~952.4 Ohm
110 ~4 kOhm
111 ~800 Ohm

That said, convert TERM definitions to be the bit masks to reflect the above.

While at it, enable the same setting for pull down case.

Fixes: 7981c0015af2 ("pinctrl: intel: Add Intel Sunrisepoint pin controller and GPIO support")
Cc: Jamie McClymont <jamie@kwiius.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
drivers/pinctrl/intel/pinctrl-intel.c

index 154ce3f..f97b049 100644 (file)
 #define PADCFG1_TERM_UP                        BIT(13)
 #define PADCFG1_TERM_SHIFT             10
 #define PADCFG1_TERM_MASK              GENMASK(12, 10)
-#define PADCFG1_TERM_20K               4
-#define PADCFG1_TERM_2K                        3
-#define PADCFG1_TERM_5K                        2
-#define PADCFG1_TERM_1K                        1
+#define PADCFG1_TERM_20K               BIT(2)
+#define PADCFG1_TERM_5K                        BIT(1)
+#define PADCFG1_TERM_1K                        BIT(0)
+#define PADCFG1_TERM_833               (BIT(1) | BIT(0))
 
 #define PADCFG2                                0x008
 #define PADCFG2_DEBEN                  BIT(0)
@@ -549,12 +549,12 @@ static int intel_config_get_pull(struct intel_pinctrl *pctrl, unsigned int pin,
                        return -EINVAL;
 
                switch (term) {
+               case PADCFG1_TERM_833:
+                       *arg = 833;
+                       break;
                case PADCFG1_TERM_1K:
                        *arg = 1000;
                        break;
-               case PADCFG1_TERM_2K:
-                       *arg = 2000;
-                       break;
                case PADCFG1_TERM_5K:
                        *arg = 5000;
                        break;
@@ -570,6 +570,11 @@ static int intel_config_get_pull(struct intel_pinctrl *pctrl, unsigned int pin,
                        return -EINVAL;
 
                switch (term) {
+               case PADCFG1_TERM_833:
+                       if (!(community->features & PINCTRL_FEATURE_1K_PD))
+                               return -EINVAL;
+                       *arg = 833;
+                       break;
                case PADCFG1_TERM_1K:
                        if (!(community->features & PINCTRL_FEATURE_1K_PD))
                                return -EINVAL;
@@ -685,12 +690,12 @@ static int intel_config_set_pull(struct intel_pinctrl *pctrl, unsigned int pin,
                case 5000:
                        value |= PADCFG1_TERM_5K << PADCFG1_TERM_SHIFT;
                        break;
-               case 2000:
-                       value |= PADCFG1_TERM_2K << PADCFG1_TERM_SHIFT;
-                       break;
                case 1000:
                        value |= PADCFG1_TERM_1K << PADCFG1_TERM_SHIFT;
                        break;
+               case 833:
+                       value |= PADCFG1_TERM_833 << PADCFG1_TERM_SHIFT;
+                       break;
                default:
                        ret = -EINVAL;
                }
@@ -714,6 +719,13 @@ static int intel_config_set_pull(struct intel_pinctrl *pctrl, unsigned int pin,
                        }
                        value |= PADCFG1_TERM_1K << PADCFG1_TERM_SHIFT;
                        break;
+               case 833:
+                       if (!(community->features & PINCTRL_FEATURE_1K_PD)) {
+                               ret = -EINVAL;
+                               break;
+                       }
+                       value |= PADCFG1_TERM_833 << PADCFG1_TERM_SHIFT;
+                       break;
                default:
                        ret = -EINVAL;
                }