* [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; 6+ 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] 6+ 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; 6+ 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] 6+ 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; 6+ 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] 6+ 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; 6+ 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] 6+ 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; 6+ 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] 6+ 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; 6+ 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] 6+ messages in thread
end of thread, other threads:[~2012-12-21 13:27 UTC | newest]
Thread overview: 6+ 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
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
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox