|
58 | 58 | #define CHV_PADCTRL1_CFGLOCK BIT(31)
|
59 | 59 | #define CHV_PADCTRL1_INVRXTX_SHIFT 4
|
60 | 60 | #define CHV_PADCTRL1_INVRXTX_MASK GENMASK(7, 4)
|
| 61 | +#define CHV_PADCTRL1_INVRXTX_TXDATA BIT(7) |
61 | 62 | #define CHV_PADCTRL1_INVRXTX_RXDATA BIT(6)
|
62 | 63 | #define CHV_PADCTRL1_INVRXTX_TXENABLE BIT(5)
|
63 | 64 | #define CHV_PADCTRL1_ODEN BIT(3)
|
@@ -792,11 +793,22 @@ static int chv_pinmux_set_mux(struct pinctrl_dev *pctldev,
|
792 | 793 | static void chv_gpio_clear_triggering(struct chv_pinctrl *pctrl,
|
793 | 794 | unsigned int offset)
|
794 | 795 | {
|
| 796 | + u32 invrxtx_mask = CHV_PADCTRL1_INVRXTX_MASK; |
795 | 797 | u32 value;
|
796 | 798 |
|
| 799 | + /* |
| 800 | + * One some devices the GPIO should output the inverted value from what |
| 801 | + * device-drivers / ACPI code expects (inverted external buffer?). The |
| 802 | + * BIOS makes this work by setting the CHV_PADCTRL1_INVRXTX_TXDATA flag, |
| 803 | + * preserve this flag if the pin is already setup as GPIO. |
| 804 | + */ |
| 805 | + value = chv_readl(pctrl, offset, CHV_PADCTRL0); |
| 806 | + if (value & CHV_PADCTRL0_GPIOEN) |
| 807 | + invrxtx_mask &= ~CHV_PADCTRL1_INVRXTX_TXDATA; |
| 808 | + |
797 | 809 | value = chv_readl(pctrl, offset, CHV_PADCTRL1);
|
798 | 810 | value &= ~CHV_PADCTRL1_INTWAKECFG_MASK;
|
799 |
| - value &= ~CHV_PADCTRL1_INVRXTX_MASK; |
| 811 | + value &= ~invrxtx_mask; |
800 | 812 | chv_writel(pctrl, offset, CHV_PADCTRL1, value);
|
801 | 813 | }
|
802 | 814 |
|
|
0 commit comments