Skip to content

Commit 13791bb

Browse files
committed
pinctrl: intel: Implement high impedance support
Implement high impedance support for Intel pin control hardware. It allows to set high impedance and check it. Acked-by: Mika Westerberg <[email protected]> Signed-off-by: Andy Shevchenko <[email protected]>
1 parent 91946cc commit 13791bb

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

drivers/pinctrl/intel/pinctrl-intel.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,23 @@ static int intel_config_get_pull(struct intel_pinctrl *pctrl, unsigned int pin,
652652
return 0;
653653
}
654654

655+
static int intel_config_get_high_impedance(struct intel_pinctrl *pctrl, unsigned int pin,
656+
enum pin_config_param param, u32 *arg)
657+
{
658+
void __iomem *padcfg0;
659+
u32 value;
660+
661+
padcfg0 = intel_get_padcfg(pctrl, pin, PADCFG0);
662+
663+
scoped_guard(raw_spinlock_irqsave, &pctrl->lock)
664+
value = readl(padcfg0);
665+
666+
if (__intel_gpio_get_direction(value) != PAD_CONNECT_NONE)
667+
return -EINVAL;
668+
669+
return 0;
670+
}
671+
655672
static int intel_config_get_debounce(struct intel_pinctrl *pctrl, unsigned int pin,
656673
enum pin_config_param param, u32 *arg)
657674
{
@@ -695,6 +712,12 @@ static int intel_config_get(struct pinctrl_dev *pctldev, unsigned int pin,
695712
return ret;
696713
break;
697714

715+
case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
716+
ret = intel_config_get_high_impedance(pctrl, pin, param, &arg);
717+
if (ret)
718+
return ret;
719+
break;
720+
698721
case PIN_CONFIG_INPUT_DEBOUNCE:
699722
ret = intel_config_get_debounce(pctrl, pin, param, &arg);
700723
if (ret)
@@ -793,6 +816,20 @@ static int intel_config_set_pull(struct intel_pinctrl *pctrl, unsigned int pin,
793816
return 0;
794817
}
795818

819+
static void intel_gpio_set_high_impedance(struct intel_pinctrl *pctrl, unsigned int pin)
820+
{
821+
void __iomem *padcfg0;
822+
u32 value;
823+
824+
padcfg0 = intel_get_padcfg(pctrl, pin, PADCFG0);
825+
826+
guard(raw_spinlock_irqsave)(&pctrl->lock);
827+
828+
value = readl(padcfg0);
829+
value = __intel_gpio_set_direction(value, false, false);
830+
writel(value, padcfg0);
831+
}
832+
796833
static int intel_config_set_debounce(struct intel_pinctrl *pctrl,
797834
unsigned int pin, unsigned int debounce)
798835
{
@@ -855,6 +892,10 @@ static int intel_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
855892
return ret;
856893
break;
857894

895+
case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
896+
intel_gpio_set_high_impedance(pctrl, pin);
897+
break;
898+
858899
case PIN_CONFIG_INPUT_DEBOUNCE:
859900
ret = intel_config_set_debounce(pctrl, pin,
860901
pinconf_to_config_argument(configs[i]));

0 commit comments

Comments
 (0)