diff options
-rw-r--r-- | drivers/pinctrl/pinctrl-st.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/drivers/pinctrl/pinctrl-st.c b/drivers/pinctrl/pinctrl-st.c index 10ad19c73900..52a437738cc2 100644 --- a/drivers/pinctrl/pinctrl-st.c +++ b/drivers/pinctrl/pinctrl-st.c | |||
@@ -206,7 +206,6 @@ | |||
206 | #define gpio_chip_to_bank(chip) \ | 206 | #define gpio_chip_to_bank(chip) \ |
207 | container_of(chip, struct st_gpio_bank, gpio_chip) | 207 | container_of(chip, struct st_gpio_bank, gpio_chip) |
208 | 208 | ||
209 | |||
210 | enum st_retime_style { | 209 | enum st_retime_style { |
211 | st_retime_style_none, | 210 | st_retime_style_none, |
212 | st_retime_style_packed, | 211 | st_retime_style_packed, |
@@ -781,6 +780,35 @@ static int st_gpio_direction_output(struct gpio_chip *chip, | |||
781 | return 0; | 780 | return 0; |
782 | } | 781 | } |
783 | 782 | ||
783 | static int st_gpio_get_direction(struct gpio_chip *chip, unsigned offset) | ||
784 | { | ||
785 | struct st_gpio_bank *bank = gpio_chip_to_bank(chip); | ||
786 | struct st_pio_control pc = bank->pc; | ||
787 | unsigned long config; | ||
788 | unsigned int direction = 0; | ||
789 | unsigned int function; | ||
790 | unsigned int value; | ||
791 | int i = 0; | ||
792 | |||
793 | /* Alternate function direction is handled by Pinctrl */ | ||
794 | function = st_pctl_get_pin_function(&pc, offset); | ||
795 | if (function) { | ||
796 | st_pinconf_get_direction(&pc, offset, &config); | ||
797 | return !ST_PINCONF_UNPACK_OE(config); | ||
798 | } | ||
799 | |||
800 | /* | ||
801 | * GPIO direction is handled differently | ||
802 | * - See st_gpio_direction() above for an explanation | ||
803 | */ | ||
804 | for (i = 0; i <= 2; i++) { | ||
805 | value = readl(bank->base + REG_PIO_PC(i)); | ||
806 | direction |= ((value >> offset) & 0x1) << i; | ||
807 | } | ||
808 | |||
809 | return (direction == ST_GPIO_DIRECTION_IN); | ||
810 | } | ||
811 | |||
784 | static int st_gpio_xlate(struct gpio_chip *gc, | 812 | static int st_gpio_xlate(struct gpio_chip *gc, |
785 | const struct of_phandle_args *gpiospec, u32 *flags) | 813 | const struct of_phandle_args *gpiospec, u32 *flags) |
786 | { | 814 | { |
@@ -1452,6 +1480,7 @@ static struct gpio_chip st_gpio_template = { | |||
1452 | .set = st_gpio_set, | 1480 | .set = st_gpio_set, |
1453 | .direction_input = st_gpio_direction_input, | 1481 | .direction_input = st_gpio_direction_input, |
1454 | .direction_output = st_gpio_direction_output, | 1482 | .direction_output = st_gpio_direction_output, |
1483 | .get_direction = st_gpio_get_direction, | ||
1455 | .ngpio = ST_GPIO_PINS_PER_BANK, | 1484 | .ngpio = ST_GPIO_PINS_PER_BANK, |
1456 | .of_gpio_n_cells = 1, | 1485 | .of_gpio_n_cells = 1, |
1457 | .of_xlate = st_gpio_xlate, | 1486 | .of_xlate = st_gpio_xlate, |