aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/pinctrl/pinctrl-st.c31
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
210enum st_retime_style { 209enum 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
783static 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
784static int st_gpio_xlate(struct gpio_chip *gc, 812static 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,