To define the initial state of a given gpio you can add a gpio-init node to a gpio controller. This doesn't prevent a later consumer to request that pin and only defines a save initial state. Signed-off-by: Uwe Kleine-König <u.kleine-koenig@xxxxxxxxxxxxxx> --- drivers/gpio/gpiolib.c | 43 ++++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index de543fbb1321..4aeba5193726 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -260,13 +260,12 @@ int gpio_direction_input(unsigned gpio) } EXPORT_SYMBOL(gpio_direction_input); -static int gpioinfo_request_one(struct gpio_info *gi, unsigned long flags, - const char *label) +static int gpioinfo_configure(struct gpio_info *gi, unsigned long flags) { int err; /* - * Not all of the flags below are mulit-bit, but, for the sake + * Not all of the flags below are multi-bit, but, for the sake * of consistency, the code is written as if all of them were. */ const bool active_low = (flags & GPIOF_ACTIVE_LOW) == GPIOF_ACTIVE_LOW; @@ -275,10 +274,6 @@ static int gpioinfo_request_one(struct gpio_info *gi, unsigned long flags, const bool init_active = (flags & GPIOF_INIT_ACTIVE) == GPIOF_INIT_ACTIVE; const bool init_high = (flags & GPIOF_INIT_HIGH) == GPIOF_INIT_HIGH; - err = gpioinfo_request(gi, label); - if (err) - return err; - gi->active_low = active_low; if (dir_in) @@ -288,6 +283,19 @@ static int gpioinfo_request_one(struct gpio_info *gi, unsigned long flags, else err = gpioinfo_direction_output(gi, init_high); + return err; +} + +static int gpioinfo_request_one(struct gpio_info *gi, unsigned long flags, + const char *label) +{ + int err; + + err = gpioinfo_request(gi, label); + if (err) + return err; + + err = gpioinfo_configure(gi, flags); if (err) gpioinfo_free(gi); @@ -375,14 +383,15 @@ static int gpiochip_find_base(int start, int ngpio) return base; } -static int of_hog_gpio(struct device_node *np, struct gpio_chip *chip, - unsigned int idx) +static int of_hogninit_gpio(struct device_node *np, struct gpio_chip *chip, + unsigned int idx, bool request) { struct device_node *chip_np = chip->dev->device_node; unsigned long flags = 0; u32 gpio_cells, gpio_num, gpio_flags; int ret, gpio; const char *name = NULL; + struct gpio_info *gi; ret = of_property_read_u32(chip_np, "#gpio-cells", &gpio_cells); if (ret) @@ -417,6 +426,7 @@ static int of_hog_gpio(struct device_node *np, struct gpio_chip *chip, return ret; } + gi = gpio_to_desc(gpio); /* * Note that, in order to be compatible with Linux, the code @@ -439,9 +449,13 @@ static int of_hog_gpio(struct device_node *np, struct gpio_chip *chip, else return -EINVAL; - of_property_read_string(np, "line-name", &name); + if (request) { + of_property_read_string(np, "line-name", &name); - return gpio_request_one(gpio, flags, name); + return gpioinfo_request_one(gi, flags, name); + } else { + return gpioinfo_configure(gi, flags); + } } static int of_gpiochip_scan_hogs(struct gpio_chip *chip) @@ -453,12 +467,15 @@ static int of_gpiochip_scan_hogs(struct gpio_chip *chip) return 0; for_each_available_child_of_node(chip->dev->device_node, np) { - if (!of_property_read_bool(np, "gpio-hog")) + bool hog = of_property_read_bool(np, "gpio-hog"); + bool init = of_property_read_bool(np, "gpio-init"); + + if (!hog && !init) continue; for (ret = 0, i = 0; !ret; - ret = of_hog_gpio(np, chip, i), i++) + ret = of_hogninit_gpio(np, chip, i, hog), i++) ; /* * We ignore -EOVERFLOW because it serves us as an -- 2.11.0 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox