@@ -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+
655672static 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+
796833static 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