gpio: remove the open_drain API and ops
[oweals/u-boot.git] / include / asm-generic / gpio.h
index 3b96b8209a10b09d2cdcdf1f559c5fa2787831d7..4d5348d8c8ec723ecca2e7319532d59b03f7cf22 100644 (file)
@@ -1,12 +1,16 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
 /*
  * Copyright (c) 2011 The Chromium OS Authors.
  * Copyright (c) 2011, NVIDIA Corp. All rights reserved.
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #ifndef _ASM_GENERIC_GPIO_H_
 #define _ASM_GENERIC_GPIO_H_
 
+#include <dm/ofnode.h>
+
+struct ofnode_phandle_args;
+
 /*
  * Generic GPIO API for U-Boot
  *
@@ -42,7 +46,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
  */
@@ -113,11 +117,10 @@ struct udevice;
 struct gpio_desc {
        struct udevice *dev;    /* Device, NULL for invalid GPIO */
        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_ACTIVE_LOW       (1 << 3)        /* value has active low */
-#define GPIOD_IS_OUT_ACTIVE    (1 << 4)        /* set output active */
+#define GPIOD_IS_OUT           BIT(1)  /* GPIO is an output */
+#define GPIOD_IS_IN            BIT(2)  /* GPIO is an input */
+#define GPIOD_ACTIVE_LOW       BIT(3)  /* value has active low */
+#define GPIOD_IS_OUT_ACTIVE    BIT(4)  /* set output active */
 
        uint offset;            /* GPIO offset within the device */
        /*
@@ -127,13 +130,13 @@ 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()
  * @return true if valid, false if not
  */
-static inline bool dm_gpio_is_valid(struct gpio_desc *desc)
+static inline bool dm_gpio_is_valid(const struct gpio_desc *desc)
 {
        return desc->dev != NULL;
 }
@@ -167,7 +170,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 +189,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.
@@ -206,6 +209,15 @@ int gpio_requestf(unsigned gpio, const char *fmt, ...)
 
 struct fdtdec_phandle_args;
 
+/**
+ * gpio_xlate_offs_flags() - implementation for common use of dm_gpio_ops.xlate
+ *
+ * This routine sets the offset field to args[0] and the flags field to
+ * GPIOD_ACTIVE_LOW if the GPIO_ACTIVE_LOW flag is present in args[1].
+ */
+int gpio_xlate_offs_flags(struct udevice *dev, struct gpio_desc *desc,
+                         struct ofnode_phandle_args *args);
+
 /**
  * struct struct dm_gpio_ops - Driver model GPIO operations
  *
@@ -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
@@ -235,7 +247,7 @@ struct fdtdec_phandle_args;
  */
 struct dm_gpio_ops {
        int (*request)(struct udevice *dev, unsigned offset, const char *label);
-       int (*free)(struct udevice *dev, unsigned offset);
+       int (*rfree)(struct udevice *dev, unsigned int offset);
        int (*direction_input)(struct udevice *dev, unsigned offset);
        int (*direction_output)(struct udevice *dev, unsigned offset,
                                int value);
@@ -258,12 +270,11 @@ struct dm_gpio_ops {
         *
         *   @desc->dev to @dev
         *   @desc->flags to 0
-        *   @desc->offset to the value of the first argument in args, if any,
-        *              otherwise -1 (which is invalid)
+        *   @desc->offset to 0
         *
-        * This method is optional so if the above defaults suit it can be
-        * omitted. Typical behaviour is to set up the GPIOD_ACTIVE_LOW flag
-        * in desc->flags.
+        * This method is optional and defaults to gpio_xlate_offs_flags,
+        * which will parse offset and the GPIO_ACTIVE_LOW flag in the first
+        * two arguments.
         *
         * Note that @dev is passed in as a parameter to follow driver model
         * uclass conventions, even though it is already available as
@@ -271,11 +282,11 @@ 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,
-                    struct fdtdec_phandle_args *args);
+                    struct ofnode_phandle_args *args);
 };
 
 /**
@@ -321,6 +332,36 @@ 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_hog_lookup_name() - Look up a named GPIO and return the gpio descr.
+ *
+ * @name:      Name to look up
+ * @desc:      Returns GPIO description, on success, else NULL
+ * @return:    Returns 0 if OK, else -ENODEV
+ */
+int gpio_hog_lookup_name(const char *name, struct gpio_desc **desc);
+
+/**
+ * gpio_hog_probe_all() - probe all gpio devices with
+ * gpio-hog subnodes.
+ *
+ * @return:    Returns return value from device_probe()
+ */
+int gpio_hog_probe_all(void);
+
 /**
  * gpio_lookup_name - Look up a GPIO name and return its details
  *
@@ -336,15 +377,36 @@ 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);
+
+/**
+ * dm_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.
+ *
+ * @desc_list: List of GPIOs to collect
+ * @count: Number of GPIOs
+ * @return resulting integer value, or -ve on error
+ */
+int dm_gpio_get_values_as_int(const struct gpio_desc *desc_list, int count);
+
+/**
+ * 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 +451,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 +473,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
  *
@@ -430,9 +504,8 @@ int gpio_get_list_count(struct udevice *dev, const char *list_name);
  * This is a version of gpio_request_list_by_name() that does not use a
  * device. Avoid it unless the caller is not yet using driver model
  */
-int gpio_request_by_name_nodev(const void *blob, int node,
-                              const char *list_name,
-                              int index, struct gpio_desc *desc, int flags);
+int gpio_request_by_name_nodev(ofnode node, const char *list_name, int index,
+                              struct gpio_desc *desc, int flags);
 
 /**
  * gpio_request_list_by_name_nodev() - request GPIOs without a device
@@ -440,11 +513,27 @@ int gpio_request_by_name_nodev(const void *blob, int node,
  * This is a version of gpio_request_list_by_name() that does not use a
  * device. Avoid it unless the caller is not yet using driver model
  */
-int gpio_request_list_by_name_nodev(const void *blob, int node,
-                                   const char *list_name,
+int gpio_request_list_by_name_nodev(ofnode node, const char *list_name,
                                    struct gpio_desc *desc_list, int max_count,
                                    int flags);
 
+/**
+ * gpio_dev_request_index() - request single GPIO from gpio device
+ *
+ * @dev:       GPIO device
+ * @nodename:  Name of node for which gpio gets requested, used
+ *             for the gpio label name
+ * @list_name: Name of GPIO list (e.g. "board-id-gpios")
+ * @index:     Index number of the GPIO in that list use request (0=first)
+ * @flags:     GPIOD_* flags
+ * @dtflags:   GPIO flags read from DT defined see GPIOD_*
+ * @desc:      returns GPIO descriptor filled from this function
+ * @return:    return value from gpio_request_tail()
+ */
+int gpio_dev_request_index(struct udevice *dev, const char *nodename,
+                          char *list_name, int index, int flags,
+                          int dtflags, struct gpio_desc *desc);
+
 /**
  * dm_gpio_free() - Free a single GPIO
  *
@@ -490,9 +579,9 @@ int gpio_free_list_nodev(struct gpio_desc *desc, int count);
  *             previously returned by gpio_request_by_name()
  * @return GPIO value (0 for inactive, 1 for active) or -ve on error
  */
-int dm_gpio_get_value(struct gpio_desc *desc);
+int dm_gpio_get_value(const struct gpio_desc *desc);
 
-int dm_gpio_set_value(struct gpio_desc *desc, int value);
+int dm_gpio_set_value(const struct gpio_desc *desc, int value);
 
 /**
  * dm_gpio_set_dir() - Set the direction for a GPIO
@@ -524,13 +613,13 @@ 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,
  *             previously returned by gpio_request_by_name()
  * @return GPIO number, or -ve if not found
  */
-int gpio_get_number(struct gpio_desc *desc);
+int gpio_get_number(const struct gpio_desc *desc);
 
 #endif /* _ASM_GENERIC_GPIO_H_ */