]> git.karo-electronics.de Git - karo-tx-uboot.git/blobdiff - include/asm-generic/gpio.h
ARM: uniphier: remove unused macro
[karo-tx-uboot.git] / include / asm-generic / gpio.h
index 3b96b8209a10b09d2cdcdf1f559c5fa2787831d7..eb801ac3783525e4836ea600ba2b51d65c0fda10 100644 (file)
  * an error value of -1.
  */
 
+enum gpio_flags {
+       GPIOFLAG_INPUT,
+       GPIOFLAG_OUTPUT_INIT_LOW,
+       GPIOFLAG_OUTPUT_INIT_HIGH,
+};
+
+struct gpio {
+       unsigned int gpio;
+       enum gpio_flags flags;
+       const char *label;
+};
+
 /**
  * @deprecated Please use driver model instead
  * Request a GPIO. This should be called before any of the other functions
@@ -42,7 +54,7 @@
  * Note: With driver model, the label is allocated so there is no need for
  * the caller to preserve it.
  *
- * @param gp   GPIO number
+ * @param gpio GPIO number
  * @param label        User label for this GPIO
  * @return 0 if ok, -1 on error
  */
@@ -115,7 +127,7 @@ struct gpio_desc {
        unsigned long flags;
 #define GPIOD_REQUESTED                (1 << 0)        /* Requested/claimed */
 #define GPIOD_IS_OUT           (1 << 1)        /* GPIO is an output */
-#define GPIOD_IS_IN            (1 << 2)        /* GPIO is an output */
+#define GPIOD_IS_IN            (1 << 2)        /* GPIO is an input */
 #define GPIOD_ACTIVE_LOW       (1 << 3)        /* value has active low */
 #define GPIOD_IS_OUT_ACTIVE    (1 << 4)        /* set output active */
 
@@ -127,7 +139,7 @@ struct gpio_desc {
 };
 
 /**
- * dm_gpio_is_valid() - Check if a GPIO is gpio_is_valie
+ * dm_gpio_is_valid() - Check if a GPIO is valid
  *
  * @desc:      GPIO description containing device, offset and flags,
  *             previously returned by gpio_request_by_name()
@@ -167,7 +179,7 @@ int gpio_get_status(struct udevice *dev, int offset, char *buf, int buffsize);
  *
  * @dev:       Device to check
  * @offset:    Offset of device GPIO to check
- * @namep:     If non-NULL, this is set to the nane given when the GPIO
+ * @namep:     If non-NULL, this is set to the name given when the GPIO
  *             was requested, or -1 if it has not been requested
  * @return  -ENODATA if the driver returned an unknown function,
  * -ENODEV if the device is not active, -EINVAL if the offset is invalid.
@@ -186,7 +198,7 @@ int gpio_get_function(struct udevice *dev, int offset, const char **namep);
  *
  * @dev:       Device to check
  * @offset:    Offset of device GPIO to check
- * @namep:     If non-NULL, this is set to the nane given when the GPIO
+ * @namep:     If non-NULL, this is set to the name given when the GPIO
  *             was requested, or -1 if it has not been requested
  * @return  -ENODATA if the driver returned an unknown function,
  * -ENODEV if the device is not active, -EINVAL if the offset is invalid.
@@ -219,7 +231,7 @@ struct fdtdec_phandle_args;
  * Also it would be useful to standardise additional functions like
  * pullup, slew rate and drive strength.
  *
- * gpio_request)( and gpio_free() are optional - if NULL then they will
+ * gpio_request() and gpio_free() are optional - if NULL then they will
  * not be called.
  *
  * Note that @offset is the offset from the base GPIO of the device. So
@@ -271,7 +283,7 @@ struct dm_gpio_ops {
         *
         * @dev:        GPIO device
         * @desc:       Place to put GPIO description
-        * @args:       Arguments provided in descripion
+        * @args:       Arguments provided in description
         * @return 0 if OK, -ve on error
         */
        int (*xlate)(struct udevice *dev, struct gpio_desc *desc,
@@ -321,6 +333,19 @@ struct gpio_dev_priv {
  */
 const char *gpio_get_bank_info(struct udevice *dev, int *offset_count);
 
+/**
+ * dm_gpio_lookup_name() - Look up a named GPIO and return its description
+ *
+ * The name of a GPIO is typically its bank name followed by a number from 0.
+ * For example A0 is the first GPIO in bank A. Each bank is a separate driver
+ * model device.
+ *
+ * @name:      Name to look up
+ * @desc:      Returns description, on success
+ * @return 0 if OK, -ve on error
+ */
+int dm_gpio_lookup_name(const char *name, struct gpio_desc *desc);
+
 /**
  * gpio_lookup_name - Look up a GPIO name and return its details
  *
@@ -336,15 +361,24 @@ int gpio_lookup_name(const char *name, struct udevice **devp,
                     unsigned int *offsetp, unsigned int *gpiop);
 
 /**
- * get_gpios() - Turn the values of a list of GPIOs into an integer
+ * gpio_get_values_as_int() - Turn the values of a list of GPIOs into an int
  *
  * This puts the value of the first GPIO into bit 0, the second into bit 1,
  * etc. then returns the resulting integer.
  *
  * @gpio_list: List of GPIOs to collect
- * @return resulting integer value
+ * @return resulting integer value, or -ve on error
  */
-unsigned gpio_get_values_as_int(const int *gpio_list);
+int gpio_get_values_as_int(const int *gpio_list);
+
+/**
+ * gpio_claim_vector() - claim a number of GPIOs for input
+ *
+ * @gpio_num_array:    array of gpios to claim, terminated by -1
+ * @fmt:               format string for GPIO names, e.g. "board_id%d"
+ * @return 0 if OK, -ve on error
+ */
+int gpio_claim_vector(const int *gpio_num_array, const char *fmt);
 
 /**
  * gpio_request_by_name() - Locate and request a GPIO by name
@@ -389,7 +423,7 @@ int gpio_request_by_name(struct udevice *dev, const char *list_name,
 /**
  * gpio_request_list_by_name() - Request a list of GPIOs
  *
- * Reads all the GPIOs from a list and requetss them. See
+ * Reads all the GPIOs from a list and requests them. See
  * gpio_request_by_name() for additional details. Lists should not be
  * misused to hold unrelated or optional GPIOs. They should only be used
  * for things like parallel data lines. A zero phandle terminates the list
@@ -411,6 +445,18 @@ int gpio_request_list_by_name(struct udevice *dev, const char *list_name,
                              struct gpio_desc *desc_list, int max_count,
                              int flags);
 
+/**
+ * dm_gpio_request() - manually request a GPIO
+ *
+ * Note: This function should only be used for testing / debugging. Instead.
+ * use gpio_request_by_name() to pull GPIOs from the device tree.
+ *
+ * @desc:      GPIO description of GPIO to request (see dm_gpio_lookup_name())
+ * @label:     Label to attach to the GPIO while claimed
+ * @return 0 if OK, -ve on error
+ */
+int dm_gpio_request(struct gpio_desc *desc, const char *label);
+
 /**
  * gpio_get_list_count() - Returns the number of GPIOs in a list
  *
@@ -524,7 +570,7 @@ int dm_gpio_set_dir_flags(struct gpio_desc *desc, ulong flags);
 /**
  * gpio_get_number() - Get the global GPIO number of a GPIO
  *
- * This should only be used for debugging or interest. It returns the nummber
+ * This should only be used for debugging or interest. It returns the number
  * that should be used for gpio_get_value() etc. to access this GPIO.
  *
  * @desc:      GPIO description containing device, offset and flags,
@@ -533,4 +579,73 @@ int dm_gpio_set_dir_flags(struct gpio_desc *desc, ulong flags);
  */
 int gpio_get_number(struct gpio_desc *desc);
 
+/**
+ * @deprecated Please use driver model instead
+ * Request a GPIO and configure it
+ * @param gpios        pointer to array of gpio defs
+ * @param count        number of GPIOs to set up
+ */
+static inline int gpio_request_one(unsigned int gpio, enum gpio_flags flags,
+                               const char *label)
+{
+       int ret;
+
+       ret = gpio_request(gpio, label);
+       if (ret)
+               return ret;
+
+       if (flags == GPIOFLAG_INPUT)
+               gpio_direction_input(gpio);
+       else if (flags == GPIOFLAG_OUTPUT_INIT_LOW)
+               gpio_direction_output(gpio, 0);
+       else if (flags == GPIOFLAG_OUTPUT_INIT_HIGH)
+               gpio_direction_output(gpio, 1);
+
+       return ret;
+}
+
+/**
+ * Request a set of GPIOs and configure them
+ * @param gpios        pointer to array of gpio defs
+ * @param count        number of GPIOs to set up
+ */
+static inline int gpio_request_array(const struct gpio *gpios, int count)
+{
+       int ret;
+       int i;
+
+       for (i = 0; i < count; i++) {
+               ret = gpio_request_one(gpios[i].gpio, gpios[i].flags,
+                               gpios[i].label);
+               if (ret) {
+                       printf("Failed to request GPIO%d (%u of %u): %d\n",
+                               gpios[i].gpio, i, count, ret);
+                       goto error;
+               }
+       }
+       return 0;
+
+error:
+       while (--i >= 0)
+               gpio_free(gpios[i].gpio);
+
+       return ret;
+}
+
+/**
+ * @deprecated Please use driver model instead
+ * Release a set of GPIOs
+ * @param gpios        pointer to array of gpio defs
+ * @param count        number of GPIOs to set up
+ */
+static inline int gpio_free_array(const struct gpio *gpios, int count)
+{
+       int ret = 0;
+       int i;
+
+       for (i = 0; i < count; i++)
+               ret |= gpio_free(gpios[i].gpio);
+
+       return ret;
+}
 #endif /* _ASM_GENERIC_GPIO_H_ */