diff options
| author | Sean Paul <seanpaul@chromium.org> | 2012-10-25 16:31:06 +0000 | 
|---|---|---|
| committer | Gerald Van Baren <gvb@unssw.com> | 2012-11-12 23:14:57 -0500 | 
| commit | 202ff7537558edfd759b400cfe9e56c56fc7868c (patch) | |
| tree | 3a24471fde372eeb2da00b04d3a8d6522e407159 | |
| parent | aadef0a1bc3db81708471c9d18eb6c756659196f (diff) | |
| download | olio-uboot-2014.01-202ff7537558edfd759b400cfe9e56c56fc7868c.tar.xz olio-uboot-2014.01-202ff7537558edfd759b400cfe9e56c56fc7868c.zip | |
fdt: Add polarity-aware gpio functions to fdtdec
Add get and set gpio functions to fdtdec that take into account the
polarity field in fdtdec_gpio_state.flags.
Signed-off-by: Sean Paul <seanpaul@chromium.org>
Signed-off-by: Simon Glass <sjg@chromium.org>
| -rw-r--r-- | include/fdtdec.h | 16 | ||||
| -rw-r--r-- | lib/fdtdec.c | 20 | 
2 files changed, 36 insertions, 0 deletions
| diff --git a/include/fdtdec.h b/include/fdtdec.h index b5d7d2f54..5164ce24e 100644 --- a/include/fdtdec.h +++ b/include/fdtdec.h @@ -90,6 +90,22 @@ struct fdt_gpio_state {  #define fdt_gpio_isvalid(x) ((x)->gpio != FDT_GPIO_NONE)  /** + * Read the GPIO taking into account the polarity of the pin. + * + * @param gpio		pointer to the decoded gpio + * @return value of the gpio if successful, < 0 if unsuccessful + */ +int fdtdec_get_gpio(struct fdt_gpio_state *gpio); + +/** + * Write the GPIO taking into account the polarity of the pin. + * + * @param gpio		pointer to the decoded gpio + * @return 0 if successful + */ +int fdtdec_set_gpio(struct fdt_gpio_state *gpio, int val); + +/**   * Find the next numbered alias for a peripheral. This is used to enumerate   * all the peripherals of a certain type.   * diff --git a/lib/fdtdec.c b/lib/fdtdec.c index 150512e5a..e1b17a5fe 100644 --- a/lib/fdtdec.c +++ b/lib/fdtdec.c @@ -487,6 +487,26 @@ int fdtdec_decode_gpio(const void *blob, int node, const char *prop_name,  	return err == 1 ? 0 : err;  } +int fdtdec_get_gpio(struct fdt_gpio_state *gpio) +{ +	int val; + +	if (!fdt_gpio_isvalid(gpio)) +		return -1; + +	val = gpio_get_value(gpio->gpio); +	return gpio->flags & FDT_GPIO_ACTIVE_LOW ? val ^ 1 : val; +} + +int fdtdec_set_gpio(struct fdt_gpio_state *gpio, int val) +{ +	if (!fdt_gpio_isvalid(gpio)) +		return -1; + +	val = gpio->flags & FDT_GPIO_ACTIVE_LOW ? val ^ 1 : val; +	return gpio_set_value(gpio->gpio, val); +} +  int fdtdec_setup_gpio(struct fdt_gpio_state *gpio)  {  	/* |