* [PATCH 0/2] gpiolib: add request and free support @ 2012-12-20 13:12 Jean-Christophe PLAGNIOL-VILLARD 2012-12-20 14:23 ` [PATCH 1/2] gpiolib: add gpio_request and gpio_free support Jean-Christophe PLAGNIOL-VILLARD 0 siblings, 1 reply; 5+ messages in thread From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-12-20 13:12 UTC (permalink / raw) To: barebox HI, 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 b6accb5e560c3b39e738fad619a140f6247d27c6: commands: flash: add missing newlines to error messages (2012-12-14 08:43:44 +0100) are available in the git repository at: git://git.jcrosoft.org/barebox.git delivery/gpiolib for you to fetch changes up to b1e244b763731fb16fee15a93f45fc8c5455628a: gpiolib: add command to dump the current gpio status (2012-12-18 23:09:05 +0800) ---------------------------------------------------------------- Jean-Christophe PLAGNIOL-VILLARD (2): gpiolib: add gpio_request and gpio_free support gpiolib: add command to dump the current gpio status drivers/gpio/gpio.c | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------- include/gpio.h | 7 +++++++ 2 files changed, 124 insertions(+), 7 deletions(-) Best Regards, J. _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/2] gpiolib: add gpio_request and gpio_free support 2012-12-20 13:12 [PATCH 0/2] gpiolib: add request and free support Jean-Christophe PLAGNIOL-VILLARD @ 2012-12-20 14:23 ` Jean-Christophe PLAGNIOL-VILLARD 2012-12-20 14:24 ` [PATCH 2/2] gpiolib: add command to dump the current gpio status Jean-Christophe PLAGNIOL-VILLARD 2012-12-21 7:12 ` [PATCH 1/2] gpiolib: add gpio_request and gpio_free support Sascha Hauer 0 siblings, 2 replies; 5+ messages in thread From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-12-20 14:23 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> --- drivers/gpio/gpio.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++----- include/gpio.h | 7 +++++ 2 files changed, 87 insertions(+), 7 deletions(-) diff --git a/drivers/gpio/gpio.c b/drivers/gpio/gpio.c index 042a062..e29f0ba 100644 --- a/drivers/gpio/gpio.c +++ b/drivers/gpio/gpio.c @@ -1,19 +1,71 @@ #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]; + +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 -ENODEV; + 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 (!gi->requested && gpio_request(gpio, "gpio")) + return; if (!chip->ops->set) return; chip->ops->set(chip, gpio - chip->base, value); @@ -22,12 +74,19 @@ 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; + if (!gi->requested) { + ret = gpio_request(gpio, "gpio"); + if (ret) + return ret; + } if (!chip->ops->get) return -ENOSYS; return chip->ops->get(chip, gpio - chip->base); @@ -36,12 +95,19 @@ 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; + if (!gi->requested) { + ret = gpio_request(gpio, "gpio"); + if (ret) + return ret; + } if (!chip->ops->direction_output) return -ENOSYS; return chip->ops->direction_output(chip, gpio - chip->base, value); @@ -50,12 +116,19 @@ 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; + if (!gi->requested) { + ret = gpio_request(gpio, "gpio"); + if (ret) + return ret; + } if (!chip->ops->direction_input) return -ENOSYS; return chip->ops->direction_input(chip, gpio - chip->base); @@ -72,7 +145,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 +180,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] 5+ messages in thread
* [PATCH 2/2] gpiolib: add command to dump the current gpio status 2012-12-20 14:23 ` [PATCH 1/2] gpiolib: add gpio_request and gpio_free support Jean-Christophe PLAGNIOL-VILLARD @ 2012-12-20 14:24 ` Jean-Christophe PLAGNIOL-VILLARD 2012-12-21 7:12 ` [PATCH 1/2] gpiolib: add gpio_request and gpio_free support Sascha Hauer 1 sibling, 0 replies; 5+ messages in thread From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-12-20 14:24 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 e29f0ba..4c68819 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> @@ -196,3 +198,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] 5+ messages in thread
* Re: [PATCH 1/2] gpiolib: add gpio_request and gpio_free support 2012-12-20 14:23 ` [PATCH 1/2] gpiolib: add gpio_request and gpio_free support Jean-Christophe PLAGNIOL-VILLARD 2012-12-20 14:24 ` [PATCH 2/2] gpiolib: add command to dump the current gpio status Jean-Christophe PLAGNIOL-VILLARD @ 2012-12-21 7:12 ` Sascha Hauer 2012-12-21 10:33 ` Jean-Christophe PLAGNIOL-VILLARD 1 sibling, 1 reply; 5+ messages in thread From: Sascha Hauer @ 2012-12-21 7:12 UTC (permalink / raw) To: Jean-Christophe PLAGNIOL-VILLARD; +Cc: barebox On Thu, Dec 20, 2012 at 03:23:59PM +0100, Jean-Christophe PLAGNIOL-VILLARD wrote: > 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> > --- > drivers/gpio/gpio.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++----- > include/gpio.h | 7 +++++ > 2 files changed, 87 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpio/gpio.c b/drivers/gpio/gpio.c > index 042a062..e29f0ba 100644 > --- a/drivers/gpio/gpio.c > +++ b/drivers/gpio/gpio.c > @@ -1,19 +1,71 @@ > #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]; > + > +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 -ENODEV; -EBUSY? > 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 (!gi->requested && gpio_request(gpio, "gpio")) > + return; Could you factor out this into a gpio_ensure_requested function? This way we would have a single point where the implicit gpio_request calls are handled. Sascha -- 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] 5+ messages in thread
* Re: [PATCH 1/2] gpiolib: add gpio_request and gpio_free support 2012-12-21 7:12 ` [PATCH 1/2] gpiolib: add gpio_request and gpio_free support Sascha Hauer @ 2012-12-21 10:33 ` Jean-Christophe PLAGNIOL-VILLARD 0 siblings, 0 replies; 5+ messages in thread From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-12-21 10:33 UTC (permalink / raw) To: Sascha Hauer; +Cc: barebox On 08:12 Fri 21 Dec , Sascha Hauer wrote: > On Thu, Dec 20, 2012 at 03:23:59PM +0100, Jean-Christophe PLAGNIOL-VILLARD wrote: > > 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> > > --- > > drivers/gpio/gpio.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++----- > > include/gpio.h | 7 +++++ > > 2 files changed, 87 insertions(+), 7 deletions(-) > > > > diff --git a/drivers/gpio/gpio.c b/drivers/gpio/gpio.c > > index 042a062..e29f0ba 100644 > > --- a/drivers/gpio/gpio.c > > +++ b/drivers/gpio/gpio.c > > @@ -1,19 +1,71 @@ > > #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]; > > + > > +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 -ENODEV; > > -EBUSY? > > > 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 (!gi->requested && gpio_request(gpio, "gpio")) > > + return; > > Could you factor out this into a gpio_ensure_requested function? This > way we would have a single point where the implicit gpio_request calls > are handled. ok Best Regards, J. _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2012-12-21 10:35 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2012-12-20 13:12 [PATCH 0/2] gpiolib: add request and free support Jean-Christophe PLAGNIOL-VILLARD 2012-12-20 14:23 ` [PATCH 1/2] gpiolib: add gpio_request and gpio_free support Jean-Christophe PLAGNIOL-VILLARD 2012-12-20 14:24 ` [PATCH 2/2] gpiolib: add command to dump the current gpio status Jean-Christophe PLAGNIOL-VILLARD 2012-12-21 7:12 ` [PATCH 1/2] gpiolib: add gpio_request and gpio_free support Sascha Hauer 2012-12-21 10:33 ` Jean-Christophe PLAGNIOL-VILLARD
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox