@@ -652,6 +652,23 @@ static int intel_config_get_pull(struct intel_pinctrl *pctrl, unsigned int pin,
652
652
return 0 ;
653
653
}
654
654
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
+
655
672
static int intel_config_get_debounce (struct intel_pinctrl * pctrl , unsigned int pin ,
656
673
enum pin_config_param param , u32 * arg )
657
674
{
@@ -695,6 +712,12 @@ static int intel_config_get(struct pinctrl_dev *pctldev, unsigned int pin,
695
712
return ret ;
696
713
break ;
697
714
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
+
698
721
case PIN_CONFIG_INPUT_DEBOUNCE :
699
722
ret = intel_config_get_debounce (pctrl , pin , param , & arg );
700
723
if (ret )
@@ -793,6 +816,20 @@ static int intel_config_set_pull(struct intel_pinctrl *pctrl, unsigned int pin,
793
816
return 0 ;
794
817
}
795
818
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
+
796
833
static int intel_config_set_debounce (struct intel_pinctrl * pctrl ,
797
834
unsigned int pin , unsigned int debounce )
798
835
{
@@ -855,6 +892,10 @@ static int intel_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
855
892
return ret ;
856
893
break ;
857
894
895
+ case PIN_CONFIG_BIAS_HIGH_IMPEDANCE :
896
+ intel_gpio_set_high_impedance (pctrl , pin );
897
+ break ;
898
+
858
899
case PIN_CONFIG_INPUT_DEBOUNCE :
859
900
ret = intel_config_set_debounce (pctrl , pin ,
860
901
pinconf_to_config_argument (configs [i ]));
0 commit comments