|
@@ -350,9 +350,9 @@ static ssize_t gpio_direction_store(struct device *dev,
|
|
|
if (!test_bit(FLAG_EXPORT, &desc->flags))
|
|
|
status = -EIO;
|
|
|
else if (sysfs_streq(buf, "high"))
|
|
|
- status = gpiod_direction_output(desc, 1);
|
|
|
+ status = gpiod_direction_output_raw(desc, 1);
|
|
|
else if (sysfs_streq(buf, "out") || sysfs_streq(buf, "low"))
|
|
|
- status = gpiod_direction_output(desc, 0);
|
|
|
+ status = gpiod_direction_output_raw(desc, 0);
|
|
|
else if (sysfs_streq(buf, "in"))
|
|
|
status = gpiod_direction_input(desc);
|
|
|
else
|
|
@@ -1590,7 +1590,7 @@ int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
|
|
|
if (flags & GPIOF_DIR_IN)
|
|
|
err = gpiod_direction_input(desc);
|
|
|
else
|
|
|
- err = gpiod_direction_output(desc,
|
|
|
+ err = gpiod_direction_output_raw(desc,
|
|
|
(flags & GPIOF_INIT_HIGH) ? 1 : 0);
|
|
|
|
|
|
if (err)
|
|
@@ -1756,28 +1756,13 @@ fail:
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(gpiod_direction_input);
|
|
|
|
|
|
-/**
|
|
|
- * gpiod_direction_output - set the GPIO direction to input
|
|
|
- * @desc: GPIO to set to output
|
|
|
- * @value: initial output value of the GPIO
|
|
|
- *
|
|
|
- * Set the direction of the passed GPIO to output, such as gpiod_set_value() can
|
|
|
- * be called safely on it. The initial value of the output must be specified.
|
|
|
- *
|
|
|
- * Return 0 in case of success, else an error code.
|
|
|
- */
|
|
|
-int gpiod_direction_output(struct gpio_desc *desc, int value)
|
|
|
+static int _gpiod_direction_output_raw(struct gpio_desc *desc, int value)
|
|
|
{
|
|
|
unsigned long flags;
|
|
|
struct gpio_chip *chip;
|
|
|
int status = -EINVAL;
|
|
|
int offset;
|
|
|
|
|
|
- if (!desc || !desc->chip) {
|
|
|
- pr_warn("%s: invalid GPIO\n", __func__);
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
-
|
|
|
/* GPIOs used for IRQs shall not be set as output */
|
|
|
if (test_bit(FLAG_USED_AS_IRQ, &desc->flags)) {
|
|
|
gpiod_err(desc,
|
|
@@ -1840,6 +1825,50 @@ fail:
|
|
|
gpiod_dbg(desc, "%s: gpio status %d\n", __func__, status);
|
|
|
return status;
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ * gpiod_direction_output_raw - set the GPIO direction to output
|
|
|
+ * @desc: GPIO to set to output
|
|
|
+ * @value: initial output value of the GPIO
|
|
|
+ *
|
|
|
+ * Set the direction of the passed GPIO to output, such as gpiod_set_value() can
|
|
|
+ * be called safely on it. The initial value of the output must be specified
|
|
|
+ * as raw value on the physical line without regard for the ACTIVE_LOW status.
|
|
|
+ *
|
|
|
+ * Return 0 in case of success, else an error code.
|
|
|
+ */
|
|
|
+int gpiod_direction_output_raw(struct gpio_desc *desc, int value)
|
|
|
+{
|
|
|
+ if (!desc || !desc->chip) {
|
|
|
+ pr_warn("%s: invalid GPIO\n", __func__);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ return _gpiod_direction_output_raw(desc, value);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(gpiod_direction_output_raw);
|
|
|
+
|
|
|
+/**
|
|
|
+ * gpiod_direction_output - set the GPIO direction to input
|
|
|
+ * @desc: GPIO to set to output
|
|
|
+ * @value: initial output value of the GPIO
|
|
|
+ *
|
|
|
+ * Set the direction of the passed GPIO to output, such as gpiod_set_value() can
|
|
|
+ * be called safely on it. The initial value of the output must be specified
|
|
|
+ * as the logical value of the GPIO, i.e. taking its ACTIVE_LOW status into
|
|
|
+ * account.
|
|
|
+ *
|
|
|
+ * Return 0 in case of success, else an error code.
|
|
|
+ */
|
|
|
+int gpiod_direction_output(struct gpio_desc *desc, int value)
|
|
|
+{
|
|
|
+ if (!desc || !desc->chip) {
|
|
|
+ pr_warn("%s: invalid GPIO\n", __func__);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))
|
|
|
+ value = !value;
|
|
|
+ return _gpiod_direction_output_raw(desc, value);
|
|
|
+}
|
|
|
EXPORT_SYMBOL_GPL(gpiod_direction_output);
|
|
|
|
|
|
/**
|