summaryrefslogtreecommitdiff
path: root/arch/arm/mach-ux500/pins.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-ux500/pins.c')
-rw-r--r--arch/arm/mach-ux500/pins.c39
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>