On 28. 11. 18 18:14, Brandon Maier wrote: > The Zynq's gpios can be configured by the bootloader. But Linux will > erroneously report all gpios as inputs unless we implement > get_direction(). > > Signed-off-by: Brandon Maier <brandon.maier@xxxxxxxxxxxxxxxxxxx> You email here doesn't correspond with email you used for sending this patch. You should fix that. > --- > drivers/gpio/gpio-zynq.c | 23 +++++++++++++++++++++++ > 1 file changed, 23 insertions(+) > > diff --git a/drivers/gpio/gpio-zynq.c b/drivers/gpio/gpio-zynq.c > index 3f5fcdd5a429..6bb914ef83c7 100644 > --- a/drivers/gpio/gpio-zynq.c > +++ b/drivers/gpio/gpio-zynq.c > @@ -357,6 +357,28 @@ static int zynq_gpio_dir_out(struct gpio_chip *chip, unsigned int pin, > return 0; > } > > +/** > + * zynq_gpio_get_direction - Read the direction of the specified GPIO pin > + * @chip: gpio_chip instance to be worked on > + * @pin: gpio pin number within the device > + * > + * This function returns the direction of the specified GPIO. > + * > + * Return: 0 for output, 1 for input > + */ > +static int zynq_gpio_get_direction(struct gpio_chip *chip, unsigned int pin) > +{ > + u32 reg; > + unsigned int bank_num, bank_pin_num; > + struct zynq_gpio *gpio = gpiochip_get_data(chip); > + > + zynq_gpio_get_bank_pin(pin, &bank_num, &bank_pin_num, gpio); > + > + reg = readl_relaxed(gpio->base_addr + ZYNQ_GPIO_DIRM_OFFSET(bank_num)); > + > + return !(reg & BIT(bank_pin_num)); > +} > + > /** > * zynq_gpio_irq_mask - Disable the interrupts for a gpio pin > * @irq_data: per irq and chip data passed down to chip functions > @@ -827,6 +849,7 @@ static int zynq_gpio_probe(struct platform_device *pdev) > chip->free = zynq_gpio_free; > chip->direction_input = zynq_gpio_dir_in; > chip->direction_output = zynq_gpio_dir_out; > + chip->get_direction = zynq_gpio_get_direction; > chip->base = of_alias_get_id(pdev->dev.of_node, "gpio"); > chip->ngpio = gpio->p_data->ngpio; > > When email is fixed feel free to add my Tested-by: Michal Simek <michal.simek@xxxxxxxxxx> Thanks, Michal