diff options
Diffstat (limited to 'arch/arm/mach-ux500/pins.c')
-rw-r--r-- | arch/arm/mach-ux500/pins.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/arch/arm/mach-ux500/pins.c b/arch/arm/mach-ux500/pins.c index 4738103646d..c506080a115 100644 --- a/arch/arm/mach-ux500/pins.c +++ b/arch/arm/mach-ux500/pins.c @@ -12,6 +12,7 @@ #include <linux/spinlock.h> #include <linux/err.h> #include <plat/pincfg.h> +#include <linux/gpio.h> #include "pins.h" @@ -87,6 +88,44 @@ void ux500_pins_put(struct ux500_pins *pins) WARN_ON(!pins); } +void __init ux500_offchip_gpio_init(struct ux500_pins *pins) +{ + int err; + int i; + int gpio; + int output; + int value; + pin_cfg_t cfg; + + for (i=0; i < pins->num; i++) { + cfg = pins->cfg[i]; + gpio = PIN_NUM(cfg); + output = PIN_DIR(cfg); + value = PIN_VAL(cfg); + + err = gpio_request(gpio, "offchip_gpio_init"); + if (err < 0) { + pr_err("pins: gpio_request for gpio=%d failed with" + "err: %d\n", gpio, err); + /* Pin already requested. Try to configure rest. */ + continue; + } + + if (!output) { + err = gpio_direction_input(gpio); + if (err < 0) + pr_err("pins: gpio_direction_input for gpio=%d" + "failed with err: %d\n", gpio, err); + } else { + err = gpio_direction_output(gpio, value); + if (err < 0) + pr_err("pins: gpio_direction_output for gpio=" + "%d failed with err: %d\n", gpio, err); + } + gpio_free(gpio); + } +} + #ifdef CONFIG_DEBUG_FS #include <linux/debugfs.h> #include <linux/seq_file.h> |