* [PATCH 0/2 v2] gpiolib: add request and free support @ 2012-12-21 13:25 Jean-Christophe PLAGNIOL-VILLARD 2012-12-21 13:26 ` [PATCH 1/2 v2] gpiolib: add gpio_request and gpio_free support Jean-Christophe PLAGNIOL-VILLARD 2012-12-22 18:40 ` [PATCH 0/2 v2] gpiolib: add request and free support Sascha Hauer 0 siblings, 2 replies; 4+ messages in thread From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-12-21 13:25 UTC (permalink / raw) To: barebox HI, v2: introduce gpio_ensure_requested This allow to trac which gpio is used for what and allow drivers to have custom request and free as example on at91 mux the pin as gpio on request The following changes since commit b46b57f35a27090cfbac4900d1a3d522d7898e53: MFD MC34708: Add dependence on SPI (2012-12-21 12:18:08 +0100) are available in the git repository at: git://git.jcrosoft.org/barebox.git delivery/gpiolib for you to fetch changes up to 56685f7f8f617724c320013a4ca4946b92b00f67: gpiolib: add command to dump the current gpio status (2012-12-21 21:10:25 +0800) ---------------------------------------------------------------- Jean-Christophe PLAGNIOL-VILLARD (2): gpiolib: add gpio_request and gpio_free support gpiolib: add command to dump the current gpio status Best Regards, J. _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/2 v2] gpiolib: add gpio_request and gpio_free support 2012-12-21 13:25 [PATCH 0/2 v2] gpiolib: add request and free support Jean-Christophe PLAGNIOL-VILLARD @ 2012-12-21 13:26 ` Jean-Christophe PLAGNIOL-VILLARD 2012-12-21 13:26 ` [PATCH 2/2] gpiolib: add command to dump the current gpio status Jean-Christophe PLAGNIOL-VILLARD 2012-12-22 18:40 ` [PATCH 0/2 v2] gpiolib: add request and free support Sascha Hauer 1 sibling, 1 reply; 4+ messages in thread From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-12-21 13:26 UTC (permalink / raw) To: barebox as today if no request or free provided do not complain if the gpio is not request auto requested at first use Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> --- v2: introduce gpio_ensure_requested Best Regards, J. drivers/gpio/gpio.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++---- include/gpio.h | 7 ++++ 2 files changed, 89 insertions(+), 7 deletions(-) diff --git a/drivers/gpio/gpio.c b/drivers/gpio/gpio.c index 042a062..ed9f923 100644 --- a/drivers/gpio/gpio.c +++ b/drivers/gpio/gpio.c @@ -1,19 +1,79 @@ #include <common.h> #include <gpio.h> #include <errno.h> +#include <malloc.h> static LIST_HEAD(chip_list); -static struct gpio_chip *gpio_desc[ARCH_NR_GPIOS]; +struct gpio_info { + struct gpio_chip *chip; + bool requested; + char *label; +}; + +static struct gpio_info gpio_desc[ARCH_NR_GPIOS]; + +static int gpio_ensure_requested(struct gpio_info *gi, int gpio) +{ + if (gi->requested) + return 0; + + return gpio_request(gpio, "gpio"); +} + +int gpio_request(unsigned gpio, const char *label) +{ + struct gpio_info *gi = &gpio_desc[gpio]; + struct gpio_chip *chip = gi->chip; + int ret; + + if (!gpio_is_valid(gpio)) + return -EINVAL; + if (!chip) + return -EINVAL; + if (gi->requested) + return -EBUSY; + if (chip->ops->request) { + ret = chip->ops->request(chip, gpio - chip->base); + if (ret) + return ret; + } + + gi->requested = true; + gi->label = xstrdup(label); + + return 0; +} + +void gpio_free(unsigned gpio) +{ + struct gpio_info *gi = &gpio_desc[gpio]; + struct gpio_chip *chip = gi->chip; + + if (!gpio_is_valid(gpio)) + return; + if (!chip) + return; + if (!gi->requested) + return; + if (chip->ops->free) + chip->ops->free(chip, gpio - chip->base); + + gi->requested = false; + free(gi->label); +} void gpio_set_value(unsigned gpio, int value) { - struct gpio_chip *chip = gpio_desc[gpio]; + struct gpio_info *gi = &gpio_desc[gpio]; + struct gpio_chip *chip = gi->chip; if (!gpio_is_valid(gpio)) return; if (!chip) return; + if (gpio_ensure_requested(gi, gpio)) + return; if (!chip->ops->set) return; chip->ops->set(chip, gpio - chip->base, value); @@ -22,12 +82,17 @@ EXPORT_SYMBOL(gpio_set_value); int gpio_get_value(unsigned gpio) { - struct gpio_chip *chip = gpio_desc[gpio]; + struct gpio_info *gi = &gpio_desc[gpio]; + struct gpio_chip *chip = gi->chip; + int ret; if (!gpio_is_valid(gpio)) return -EINVAL; if (!chip) return -ENODEV; + ret = gpio_ensure_requested(gi, gpio); + if (ret) + return ret; if (!chip->ops->get) return -ENOSYS; return chip->ops->get(chip, gpio - chip->base); @@ -36,12 +101,17 @@ EXPORT_SYMBOL(gpio_get_value); int gpio_direction_output(unsigned gpio, int value) { - struct gpio_chip *chip = gpio_desc[gpio]; + struct gpio_info *gi = &gpio_desc[gpio]; + struct gpio_chip *chip = gi->chip; + int ret; if (!gpio_is_valid(gpio)) return -EINVAL; if (!chip) return -ENODEV; + ret = gpio_ensure_requested(gi, gpio); + if (ret) + return ret; if (!chip->ops->direction_output) return -ENOSYS; return chip->ops->direction_output(chip, gpio - chip->base, value); @@ -50,12 +120,17 @@ EXPORT_SYMBOL(gpio_direction_output); int gpio_direction_input(unsigned gpio) { - struct gpio_chip *chip = gpio_desc[gpio]; + struct gpio_info *gi = &gpio_desc[gpio]; + struct gpio_chip *chip = gi->chip; + int ret; if (!gpio_is_valid(gpio)) return -EINVAL; if (!chip) return -ENODEV; + ret = gpio_ensure_requested(gi, gpio); + if (ret) + return ret; if (!chip->ops->direction_input) return -ENOSYS; return chip->ops->direction_input(chip, gpio - chip->base); @@ -72,7 +147,7 @@ static int gpiochip_find_base(int start, int ngpio) start = 0; for (i = start; i < ARCH_NR_GPIOS; i++) { - struct gpio_chip *chip = gpio_desc[i]; + struct gpio_chip *chip = gpio_desc[i].chip; if (!chip) { spare++; @@ -107,7 +182,7 @@ int gpiochip_add(struct gpio_chip *chip) list_add_tail(&chip->list, &chip_list); for (i = chip->base; i < chip->base + chip->ngpio; i++) - gpio_desc[i] = chip; + gpio_desc[i].chip = chip; return 0; } diff --git a/include/gpio.h b/include/gpio.h index 9fb11c3..eedb980 100644 --- a/include/gpio.h +++ b/include/gpio.h @@ -3,6 +3,7 @@ #include <asm/gpio.h> +#ifndef CONFIG_GPIOLIB static inline int gpio_request(unsigned gpio, const char *label) { return 0; @@ -11,10 +12,16 @@ static inline int gpio_request(unsigned gpio, const char *label) static inline void gpio_free(unsigned gpio) { } +#else +int gpio_request(unsigned gpio, const char *label); +void gpio_free(unsigned gpio); +#endif struct gpio_chip; struct gpio_ops { + int (*request)(struct gpio_chip *chip, unsigned offset); + void (*free)(struct gpio_chip *chip, unsigned offset); int (*direction_input)(struct gpio_chip *chip, unsigned offset); int (*direction_output)(struct gpio_chip *chip, unsigned offset, int value); int (*get)(struct gpio_chip *chip, unsigned offset); -- 1.7.10.4 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 2/2] gpiolib: add command to dump the current gpio status 2012-12-21 13:26 ` [PATCH 1/2 v2] gpiolib: add gpio_request and gpio_free support Jean-Christophe PLAGNIOL-VILLARD @ 2012-12-21 13:26 ` Jean-Christophe PLAGNIOL-VILLARD 0 siblings, 0 replies; 4+ messages in thread From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-12-21 13:26 UTC (permalink / raw) To: barebox This will allow to known which gpio is requested by what Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> --- drivers/gpio/gpio.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/drivers/gpio/gpio.c b/drivers/gpio/gpio.c index ed9f923..d37f5a0 100644 --- a/drivers/gpio/gpio.c +++ b/drivers/gpio/gpio.c @@ -1,4 +1,6 @@ #include <common.h> +#include <command.h> +#include <complete.h> #include <gpio.h> #include <errno.h> #include <malloc.h> @@ -198,3 +200,38 @@ int gpio_get_num(struct device_d *dev, int gpio) return -ENODEV; } + +#ifdef CONFIG_CMD_GPIO +static int do_gpiolib(int argc, char *argv[]) +{ + int i; + + printf("gpiolib: gpio lists\n"); + printf("%*crequested label\n", 11, ' '); + + for (i = 0; i < ARCH_NR_GPIOS; i++) { + struct gpio_info *gi = &gpio_desc[i]; + + if (!gi->chip) + continue; + + printf("gpio %*d: %*s %s\n", 4, + i, 9, gi->requested ? "true" : "false", + gi->label ? gi->label : ""); + } + + return 0; +} + +BAREBOX_CMD_HELP_START(gpiolib) +BAREBOX_CMD_HELP_USAGE("gpiolib\n") +BAREBOX_CMD_HELP_SHORT("dump current registered gpio\n"); +BAREBOX_CMD_HELP_END + +BAREBOX_CMD_START(gpiolib) + .cmd = do_gpiolib, + .usage = "dump current registered gpio", + BAREBOX_CMD_HELP(cmd_gpiolib_help) + BAREBOX_CMD_COMPLETE(empty_complete) +BAREBOX_CMD_END +#endif -- 1.7.10.4 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 0/2 v2] gpiolib: add request and free support 2012-12-21 13:25 [PATCH 0/2 v2] gpiolib: add request and free support Jean-Christophe PLAGNIOL-VILLARD 2012-12-21 13:26 ` [PATCH 1/2 v2] gpiolib: add gpio_request and gpio_free support Jean-Christophe PLAGNIOL-VILLARD @ 2012-12-22 18:40 ` Sascha Hauer 1 sibling, 0 replies; 4+ messages in thread From: Sascha Hauer @ 2012-12-22 18:40 UTC (permalink / raw) To: Jean-Christophe PLAGNIOL-VILLARD; +Cc: barebox On Fri, Dec 21, 2012 at 02:25:30PM +0100, Jean-Christophe PLAGNIOL-VILLARD wrote: > HI, > > v2: > introduce gpio_ensure_requested > > This allow to trac which gpio is used for what > and allow drivers to have custom request and free > > as example on at91 mux the pin as gpio on request > > The following changes since commit b46b57f35a27090cfbac4900d1a3d522d7898e53: > > MFD MC34708: Add dependence on SPI (2012-12-21 12:18:08 +0100) > > are available in the git repository at: > > git://git.jcrosoft.org/barebox.git delivery/gpiolib Applied, thanks Sascha > > for you to fetch changes up to 56685f7f8f617724c320013a4ca4946b92b00f67: > > gpiolib: add command to dump the current gpio status (2012-12-21 21:10:25 +0800) > > ---------------------------------------------------------------- > Jean-Christophe PLAGNIOL-VILLARD (2): > gpiolib: add gpio_request and gpio_free support > gpiolib: add command to dump the current gpio status > > Best Regards, > J. > > _______________________________________________ > barebox mailing list > barebox@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/barebox > -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2012-12-22 18:40 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2012-12-21 13:25 [PATCH 0/2 v2] gpiolib: add request and free support Jean-Christophe PLAGNIOL-VILLARD 2012-12-21 13:26 ` [PATCH 1/2 v2] gpiolib: add gpio_request and gpio_free support Jean-Christophe PLAGNIOL-VILLARD 2012-12-21 13:26 ` [PATCH 2/2] gpiolib: add command to dump the current gpio status Jean-Christophe PLAGNIOL-VILLARD 2012-12-22 18:40 ` [PATCH 0/2 v2] gpiolib: add request and free support Sascha Hauer
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox