efi_loader: type of efi_secure_mode
[oweals/u-boot.git] / include / asm-generic / gpio.h
index d6cf18744fda47e2103a597677c9bf560c00022f..e16c2f31d9d2a5895ddd854e03805e5e40752c3a 100644 (file)
@@ -8,6 +8,7 @@
 #define _ASM_GENERIC_GPIO_H_
 
 #include <dm/ofnode.h>
+#include <linux/bitops.h>
 
 struct ofnode_phandle_args;
 
@@ -117,11 +118,14 @@ 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 input */
-#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)  /* GPIO is active when value is low */
+#define GPIOD_IS_OUT_ACTIVE    BIT(4)  /* set output active */
+#define GPIOD_OPEN_DRAIN       BIT(5)  /* GPIO is open drain type */
+#define GPIOD_OPEN_SOURCE      BIT(6)  /* GPIO is open source type */
+#define GPIOD_PULL_UP          BIT(7)  /* GPIO has pull-up enabled */
+#define GPIOD_PULL_DOWN                BIT(8)  /* GPIO has pull-down enabled */
 
        uint offset;            /* GPIO offset within the device */
        /*
@@ -130,6 +134,12 @@ struct gpio_desc {
         */
 };
 
+/* helper to compute the value of the gpio output */
+#define GPIOD_FLAGS_OUTPUT_MASK (GPIOD_ACTIVE_LOW | GPIOD_IS_OUT_ACTIVE)
+#define GPIOD_FLAGS_OUTPUT(flags) \
+       (((((flags) & GPIOD_FLAGS_OUTPUT_MASK) == GPIOD_IS_OUT_ACTIVE) || \
+         (((flags) & GPIOD_FLAGS_OUTPUT_MASK) == GPIOD_ACTIVE_LOW)))
+
 /**
  * dm_gpio_is_valid() - Check if a GPIO is valid
  *
@@ -248,14 +258,12 @@ int gpio_xlate_offs_flags(struct udevice *dev, struct gpio_desc *desc,
  */
 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);
        int (*get_value)(struct udevice *dev, unsigned offset);
        int (*set_value)(struct udevice *dev, unsigned offset, int value);
-       int (*get_open_drain)(struct udevice *dev, unsigned offset);
-       int (*set_open_drain)(struct udevice *dev, unsigned offset, int value);
        /**
         * get_function() Get the GPIO function
         *
@@ -290,6 +298,37 @@ struct dm_gpio_ops {
         */
        int (*xlate)(struct udevice *dev, struct gpio_desc *desc,
                     struct ofnode_phandle_args *args);
+
+       /**
+        * set_dir_flags() - Set GPIO dir flags
+        *
+        * This function should set up the GPIO configuration according to the
+        * information provide by the direction flags bitfield.
+        *
+        * This method is optional.
+        *
+        * @dev:        GPIO device
+        * @offset:     GPIO offset within that device
+        * @flags:      GPIO configuration to use
+        * @return 0 if OK, -ve on error
+        */
+       int (*set_dir_flags)(struct udevice *dev, unsigned int offset,
+                            ulong flags);
+
+       /**
+        * get_dir_flags() - Get GPIO dir flags
+        *
+        * This function return the GPIO direction flags used.
+        *
+        * This method is optional.
+        *
+        * @dev:        GPIO device
+        * @offset:     GPIO offset within that device
+        * @flags:      place to put the used direction flags by GPIO
+        * @return 0 if OK, -ve on error
+        */
+       int (*get_dir_flags)(struct udevice *dev, unsigned int offset,
+                            ulong *flags);
 };
 
 /**
@@ -587,63 +626,41 @@ int dm_gpio_get_value(const struct gpio_desc *desc);
 int dm_gpio_set_value(const struct gpio_desc *desc, int value);
 
 /**
- * dm_gpio_get_open_drain() - Check if open-drain-mode of a GPIO is active
- *
- * This checks if open-drain-mode for a GPIO is enabled or not. This method is
- * optional.
- *
- * @desc:      GPIO description containing device, offset and flags,
- *             previously returned by gpio_request_by_name()
- * @return Value of open drain mode for GPIO (0 for inactive, 1 for active) or
- *        -ve on error
- */
-int dm_gpio_get_open_drain(struct gpio_desc *desc);
-
-/**
- * dm_gpio_set_open_drain() - Switch open-drain-mode of a GPIO on or off
- *
- * This enables or disables open-drain mode for a GPIO. This method is
- * optional; if the driver does not support it, nothing happens when the method
- * is called.
+ * dm_gpio_set_dir() - Set the direction for a GPIO
  *
- * In open-drain mode, instead of actively driving the output (Push-pull
- * output), the GPIO's pin is connected to the collector (for a NPN transistor)
- * or the drain (for a MOSFET) of a transistor, respectively. The pin then
- * either forms an open circuit or a connection to ground, depending on the
- * state of the transistor.
+ * This sets up the direction according to the GPIO flags: desc->flags.
  *
  * @desc:      GPIO description containing device, offset and flags,
  *             previously returned by gpio_request_by_name()
  * @return 0 if OK, -ve on error
  */
-int dm_gpio_set_open_drain(struct gpio_desc *desc, int value);
+int dm_gpio_set_dir(struct gpio_desc *desc);
 
 /**
- * dm_gpio_set_dir() - Set the direction for a GPIO
+ * dm_gpio_set_dir_flags() - Set direction using description and added flags
  *
- * This sets up the direction according tot the provided flags. It will do
- * nothing unless the direction is actually specified.
+ * This sets up the direction according to the provided flags and the GPIO
+ * description (desc->flags) which include direction information.
+ * Note that desc->flags is updated by this function.
  *
  * @desc:      GPIO description containing device, offset and flags,
  *             previously returned by gpio_request_by_name()
- * @return 0 if OK, -ve on error
+ * @flags:     New flags to use
+ * @return 0 if OK, -ve on error, in which case desc->flags is not updated
  */
-int dm_gpio_set_dir(struct gpio_desc *desc);
+int dm_gpio_set_dir_flags(struct gpio_desc *desc, ulong flags);
 
 /**
- * dm_gpio_set_dir_flags() - Set direction using specific flags
+ * dm_gpio_get_dir_flags() - Get direction flags
  *
- * This is like dm_gpio_set_dir() except that the flags value is provided
- * instead of being used from desc->flags. This is needed because in many
- * cases the GPIO description does not include direction information.
- * Note that desc->flags is updated by this function.
+ * read the current direction flags
  *
  * @desc:      GPIO description containing device, offset and flags,
  *             previously returned by gpio_request_by_name()
- * @flags:     New flags to use
+ * @flags:     place to put the used flags
  * @return 0 if OK, -ve on error, in which case desc->flags is not updated
  */
-int dm_gpio_set_dir_flags(struct gpio_desc *desc, ulong flags);
+int dm_gpio_get_dir_flags(struct gpio_desc *desc, ulong *flags);
 
 /**
  * gpio_get_number() - Get the global GPIO number of a GPIO