treewide: make drive settings an enum
authorBartosz Golaszewski <bgolaszewski@baylibre.com>
Thu, 17 Dec 2020 14:07:34 +0000 (15:07 +0100)
committerBartosz Golaszewski <bgolaszewski@baylibre.com>
Tue, 19 Jan 2021 09:49:36 +0000 (10:49 +0100)
Open-source and open-drain drive settings are mutually exclusive just like
the bias settings. Make them into an enum so that becomes clear.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
bindings/cxx/gpiod.hpp
bindings/cxx/line.cpp
bindings/cxx/tests/tests-line.cpp
bindings/python/gpiodmodule.c
bindings/python/tests/gpiod_py_test.py
include/gpiod.h
lib/core.c
tests/tests-line.c
tools/gpioinfo.c

index dbcae6c0c9fbc8825b91c6d9bb640dc5ba6a2c93..9028822de76569aaa8795846ea4b01800fb36b84 100644 (file)
@@ -332,16 +332,10 @@ public:
        GPIOD_API bool is_used(void) const;
 
        /**
-        * @brief Check if this line represents an open-drain GPIO.
-        * @return True if the line is an open-drain GPIO, false otherwise.
+        * @brief Get current drive setting of this line.
+        * @return Current drive setting.
         */
-       GPIOD_API bool is_open_drain(void) const;
-
-       /**
-        * @brief Check if this line represents an open-source GPIO.
-        * @return True if the line is an open-source GPIO, false otherwise.
-        */
-       GPIOD_API bool is_open_source(void) const;
+       GPIOD_API int drive(void) const;
 
        /**
         * @brief Request this line.
@@ -482,6 +476,18 @@ public:
                /**< Line's direction setting is output. */
        };
 
+       /**
+        * @brief Possible drive settings.
+        */
+       enum : int {
+               DRIVE_PUSH_PULL = 1,
+               /**< Drive setting is unknown. */
+               DRIVE_OPEN_DRAIN,
+               /**< Line output is open-drain. */
+               DRIVE_OPEN_SOURCE,
+               /**< Line output is open-source. */
+       };
+
        /**
         * @brief Possible bias settings.
         */
index 99eb246a34346c963ba1f2feb4dac569984a73e6..df75c8c72b9af545ac080144e6cf763a045461ed 100644 (file)
@@ -13,6 +13,12 @@ namespace gpiod {
 
 namespace {
 
+const ::std::map<int, int> drive_mapping = {
+       { GPIOD_LINE_DRIVE_PUSH_PULL,   line::DRIVE_PUSH_PULL, },
+       { GPIOD_LINE_DRIVE_OPEN_DRAIN,  line::DRIVE_OPEN_DRAIN, },
+       { GPIOD_LINE_DRIVE_OPEN_SOURCE, line::DRIVE_OPEN_SOURCE, },
+};
+
 const ::std::map<int, int> bias_mapping = {
        { GPIOD_LINE_BIAS_PULL_UP,      line::BIAS_PULL_UP, },
        { GPIOD_LINE_BIAS_PULL_DOWN,    line::BIAS_PULL_DOWN, },
@@ -98,20 +104,12 @@ bool line::is_used(void) const
        return ::gpiod_line_is_used(this->_m_line);
 }
 
-bool line::is_open_drain(void) const
-{
-       this->throw_if_null();
-       line::chip_guard lock_chip(*this);
-
-       return ::gpiod_line_is_open_drain(this->_m_line);
-}
-
-bool line::is_open_source(void) const
+int line::drive(void) const
 {
        this->throw_if_null();
        line::chip_guard lock_chip(*this);
 
-       return ::gpiod_line_is_open_source(this->_m_line);
+       return drive_mapping.at(::gpiod_line_drive(this->_m_line));
 }
 
 void line::request(const line_request& config, int default_val) const
index 97d12be1cfbd99a80cda188e6b355ea7b3436c96..e201b99a053c269542a316a67f2bad6e7462a349 100644 (file)
@@ -33,8 +33,7 @@ TEST_CASE("Line information can be correctly retrieved", "[line]")
                REQUIRE(line.consumer().empty());
                REQUIRE_FALSE(line.is_requested());
                REQUIRE_FALSE(line.is_used());
-               REQUIRE_FALSE(line.is_open_drain());
-               REQUIRE_FALSE(line.is_open_source());
+               REQUIRE(line.drive() == ::gpiod::line::DRIVE_PUSH_PULL);
                REQUIRE(line.bias() == ::gpiod::line::BIAS_UNKNOWN);
        }
 
@@ -52,8 +51,7 @@ TEST_CASE("Line information can be correctly retrieved", "[line]")
                REQUIRE_FALSE(line.is_active_low());
                REQUIRE(line.is_requested());
                REQUIRE(line.is_used());
-               REQUIRE_FALSE(line.is_open_drain());
-               REQUIRE_FALSE(line.is_open_source());
+               REQUIRE(line.drive() == ::gpiod::line::DRIVE_PUSH_PULL);
                REQUIRE(line.bias() == ::gpiod::line::BIAS_UNKNOWN);
        }
 
@@ -73,8 +71,7 @@ TEST_CASE("Line information can be correctly retrieved", "[line]")
                REQUIRE(line.is_active_low());
                REQUIRE(line.is_requested());
                REQUIRE(line.is_used());
-               REQUIRE(line.is_open_drain());
-               REQUIRE_FALSE(line.is_open_source());
+               REQUIRE(line.drive() == ::gpiod::line::DRIVE_OPEN_DRAIN);
                REQUIRE(line.bias() == ::gpiod::line::BIAS_UNKNOWN);
        }
 
@@ -93,8 +90,7 @@ TEST_CASE("Line information can be correctly retrieved", "[line]")
                REQUIRE_FALSE(line.is_active_low());
                REQUIRE(line.is_requested());
                REQUIRE(line.is_used());
-               REQUIRE_FALSE(line.is_open_drain());
-               REQUIRE(line.is_open_source());
+               REQUIRE(line.drive() == ::gpiod::line::DRIVE_OPEN_SOURCE);
                REQUIRE(line.bias() == ::gpiod::line::BIAS_UNKNOWN);
        }
 
@@ -113,8 +109,7 @@ TEST_CASE("Line information can be correctly retrieved", "[line]")
                REQUIRE_FALSE(line.is_active_low());
                REQUIRE(line.is_requested());
                REQUIRE(line.is_used());
-               REQUIRE_FALSE(line.is_open_drain());
-               REQUIRE_FALSE(line.is_open_source());
+               REQUIRE(line.drive() == ::gpiod::line::DRIVE_PUSH_PULL);
                REQUIRE(line.bias() == ::gpiod::line::BIAS_DISABLED);
        }
 
@@ -133,8 +128,7 @@ TEST_CASE("Line information can be correctly retrieved", "[line]")
                REQUIRE_FALSE(line.is_active_low());;
                REQUIRE(line.is_requested());
                REQUIRE(line.is_used());
-               REQUIRE_FALSE(line.is_open_drain());
-               REQUIRE_FALSE(line.is_open_source());
+               REQUIRE(line.drive() == ::gpiod::line::DRIVE_PUSH_PULL);
                REQUIRE(line.bias() == ::gpiod::line::BIAS_PULL_DOWN);
        }
 
@@ -153,8 +147,7 @@ TEST_CASE("Line information can be correctly retrieved", "[line]")
                REQUIRE_FALSE(line.is_active_low());
                REQUIRE(line.is_requested());
                REQUIRE(line.is_used());
-               REQUIRE_FALSE(line.is_open_drain());
-               REQUIRE_FALSE(line.is_open_source());
+               REQUIRE(line.drive() == ::gpiod::line::DRIVE_PUSH_PULL);
                REQUIRE(line.bias() == ::gpiod::line::BIAS_PULL_UP);
        }
 
@@ -364,23 +357,19 @@ TEST_CASE("Line can be reconfigured", "[line]")
                config.flags = 0;
                line.request(config);
                REQUIRE(line.direction() == ::gpiod::line::DIRECTION_OUTPUT);
-               REQUIRE_FALSE(line.is_open_drain());
-               REQUIRE_FALSE(line.is_open_source());
+               REQUIRE(line.drive() == ::gpiod::line::DRIVE_PUSH_PULL);
 
                line.set_flags(::gpiod::line_request::FLAG_OPEN_DRAIN);
                REQUIRE(line.direction() == ::gpiod::line::DIRECTION_OUTPUT);
-               REQUIRE(line.is_open_drain());
-               REQUIRE_FALSE(line.is_open_source());
+               REQUIRE(line.drive() == ::gpiod::line::DRIVE_OPEN_DRAIN);
 
                line.set_flags(::gpiod::line_request::FLAG_OPEN_SOURCE);
                REQUIRE(line.direction() == ::gpiod::line::DIRECTION_OUTPUT);
-               REQUIRE_FALSE(line.is_open_drain());
-               REQUIRE(line.is_open_source());
+               REQUIRE(line.drive() == ::gpiod::line::DRIVE_OPEN_SOURCE);
 
                line.set_flags(0);
                REQUIRE(line.direction() == ::gpiod::line::DIRECTION_OUTPUT);
-               REQUIRE_FALSE(line.is_open_drain());
-               REQUIRE_FALSE(line.is_open_source());
+               REQUIRE(line.drive() == ::gpiod::line::DRIVE_PUSH_PULL);
        }
 
        SECTION("set flags (single line, bias)")
@@ -390,23 +379,19 @@ TEST_CASE("Line can be reconfigured", "[line]")
                config.flags = 0;
                line.request(config);
                REQUIRE(line.direction() == ::gpiod::line::DIRECTION_OUTPUT);
-               REQUIRE_FALSE(line.is_open_drain());
-               REQUIRE_FALSE(line.is_open_source());
+               REQUIRE(line.drive() == ::gpiod::line::DRIVE_PUSH_PULL);
 
                line.set_flags(::gpiod::line_request::FLAG_OPEN_DRAIN);
                REQUIRE(line.direction() == ::gpiod::line::DIRECTION_OUTPUT);
-               REQUIRE(line.is_open_drain());
-               REQUIRE_FALSE(line.is_open_source());
+               REQUIRE(line.drive() == ::gpiod::line::DRIVE_OPEN_DRAIN);
 
                line.set_flags(::gpiod::line_request::FLAG_OPEN_SOURCE);
                REQUIRE(line.direction() == ::gpiod::line::DIRECTION_OUTPUT);
-               REQUIRE_FALSE(line.is_open_drain());
-               REQUIRE(line.is_open_source());
+               REQUIRE(line.drive() == ::gpiod::line::DRIVE_OPEN_SOURCE);
 
                line.set_flags(0);
                REQUIRE(line.direction() == ::gpiod::line::DIRECTION_OUTPUT);
-               REQUIRE_FALSE(line.is_open_drain());
-               REQUIRE_FALSE(line.is_open_source());
+               REQUIRE(line.drive() == ::gpiod::line::DRIVE_PUSH_PULL);
        }
 
        SECTION("set direction input (single line)")
index b1d8f35c4e547f4b51cfcf1fa4134ab3c15b3f36..a6a336ec94c18ef0af0b98962ae31c83c57ac4ac 100644 (file)
@@ -67,6 +67,12 @@ enum {
        gpiod_DIRECTION_OUTPUT,
 };
 
+enum {
+       gpiod_DRIVE_PUSH_PULL,
+       gpiod_DRIVE_OPEN_DRAIN,
+       gpiod_DRIVE_OPEN_SOURCE,
+};
+
 enum {
        gpiod_BIAS_UNKNOWN = 1,
        gpiod_BIAS_DISABLED,
@@ -397,38 +403,30 @@ static PyObject *gpiod_Line_is_used(gpiod_LineObject *self,
        Py_RETURN_FALSE;
 }
 
-PyDoc_STRVAR(gpiod_Line_is_open_drain_doc,
-"is_open_drain() -> boolean\n"
+PyDoc_STRVAR(gpiod_Line_drive_doc,
+"drive() -> integer\n"
 "\n"
-"Check if this line represents an open-drain GPIO.");
+"Get the current drive setting of this GPIO line.");
 
-static PyObject *gpiod_Line_is_open_drain(gpiod_LineObject *self,
-                                         PyObject *Py_UNUSED(ignored))
+static PyObject *gpiod_Line_drive(gpiod_LineObject *self,
+                                 PyObject *Py_UNUSED(ignored))
 {
-       if (gpiod_ChipIsClosed(self->owner))
-               return NULL;
-
-       if (gpiod_line_is_open_drain(self->line))
-               Py_RETURN_TRUE;
-
-       Py_RETURN_FALSE;
-}
+       int drive;
 
-PyDoc_STRVAR(gpiod_Line_is_open_source_doc,
-"is_open_source() -> boolean\n"
-"\n"
-"Check if this line represents an open-source GPIO.");
-
-static PyObject *gpiod_Line_is_open_source(gpiod_LineObject *self,
-                                          PyObject *Py_UNUSED(ignored))
-{
        if (gpiod_ChipIsClosed(self->owner))
                return NULL;
 
-       if (gpiod_line_is_open_source(self->line))
-               Py_RETURN_TRUE;
+       drive = gpiod_line_drive(self->line);
 
-       Py_RETURN_FALSE;
+       switch (drive) {
+       case GPIOD_LINE_DRIVE_OPEN_DRAIN:
+               return Py_BuildValue("I", gpiod_DRIVE_OPEN_DRAIN);
+       case GPIOD_LINE_DRIVE_OPEN_SOURCE:
+               return Py_BuildValue("I", gpiod_DRIVE_OPEN_SOURCE);
+       case GPIOD_LINE_DRIVE_PUSH_PULL:
+       default:
+               return Py_BuildValue("I", gpiod_DRIVE_PUSH_PULL);
+       }
 }
 
 PyDoc_STRVAR(gpiod_Line_request_doc,
@@ -978,16 +976,10 @@ static PyMethodDef gpiod_Line_methods[] = {
                .ml_doc = gpiod_Line_is_used_doc,
        },
        {
-               .ml_name = "is_open_drain",
-               .ml_meth = (PyCFunction)gpiod_Line_is_open_drain,
+               .ml_name = "drive",
+               .ml_meth = (PyCFunction)gpiod_Line_drive,
                .ml_flags = METH_NOARGS,
-               .ml_doc = gpiod_Line_is_open_drain_doc,
-       },
-       {
-               .ml_name = "is_open_source",
-               .ml_meth = (PyCFunction)gpiod_Line_is_open_source,
-               .ml_flags = METH_NOARGS,
-               .ml_doc = gpiod_Line_is_open_source_doc,
+               .ml_doc = gpiod_Line_drive_doc,
        },
        {
                .ml_name = "request",
@@ -2525,6 +2517,21 @@ static gpiod_ConstDescr gpiod_ConstList[] = {
                .name = "DIRECTION_OUTPUT",
                .val = gpiod_DIRECTION_OUTPUT,
        },
+       {
+               .typeobj = &gpiod_LineType,
+               .name = "DRIVE_PUSH_PULL",
+               .val = gpiod_DRIVE_PUSH_PULL,
+       },
+       {
+               .typeobj = &gpiod_LineType,
+               .name = "DRIVE_OPEN_DRAIN",
+               .val = gpiod_DRIVE_OPEN_DRAIN,
+       },
+       {
+               .typeobj = &gpiod_LineType,
+               .name = "DRIVE_OPEN_SOURCE",
+               .val = gpiod_DRIVE_OPEN_SOURCE,
+       },
        {
                .typeobj = &gpiod_LineType,
                .name = "BIAS_UNKNOWN",
index 3c6e24b46515a9b4f9d27c9609f050d77a3c7d4f..324f5e32d442e586cb6e03b8f16e8b77c04acdb7 100755 (executable)
@@ -239,8 +239,7 @@ class LineInfo(MockupTestCase):
             self.assertEqual(line.consumer(), default_consumer)
             self.assertTrue(line.is_used())
             self.assertTrue(line.is_requested())
-            self.assertTrue(line.is_open_drain())
-            self.assertFalse(line.is_open_source())
+            self.assertEqual(line.drive(), gpiod.Line.DRIVE_OPEN_DRAIN)
             self.assertEqual(line.bias(), gpiod.Line.BIAS_UNKNOWN)
 
     def test_exported_open_drain_line(self):
@@ -257,8 +256,7 @@ class LineInfo(MockupTestCase):
             self.assertEqual(line.consumer(), default_consumer)
             self.assertTrue(line.is_used())
             self.assertTrue(line.is_requested())
-            self.assertTrue(line.is_open_drain())
-            self.assertFalse(line.is_open_source())
+            self.assertEqual(line.drive(), gpiod.Line.DRIVE_OPEN_DRAIN)
             self.assertEqual(line.bias(), gpiod.Line.BIAS_UNKNOWN)
 
     def test_exported_open_source_line(self):
@@ -275,8 +273,7 @@ class LineInfo(MockupTestCase):
             self.assertEqual(line.consumer(), default_consumer)
             self.assertTrue(line.is_used())
             self.assertTrue(line.is_requested())
-            self.assertFalse(line.is_open_drain())
-            self.assertTrue(line.is_open_source())
+            self.assertEqual(line.drive(), gpiod.Line.DRIVE_OPEN_SOURCE)
             self.assertEqual(line.bias(), gpiod.Line.BIAS_UNKNOWN)
 
     def test_exported_bias_disable_line(self):
@@ -293,8 +290,7 @@ class LineInfo(MockupTestCase):
             self.assertEqual(line.consumer(), default_consumer)
             self.assertTrue(line.is_used())
             self.assertTrue(line.is_requested())
-            self.assertFalse(line.is_open_drain())
-            self.assertFalse(line.is_open_source())
+            self.assertEqual(line.drive(), gpiod.Line.DRIVE_PUSH_PULL)
             self.assertEqual(line.bias(), gpiod.Line.BIAS_DISABLED)
 
     def test_exported_bias_pull_down_line(self):
@@ -311,8 +307,7 @@ class LineInfo(MockupTestCase):
             self.assertEqual(line.consumer(), default_consumer)
             self.assertTrue(line.is_used())
             self.assertTrue(line.is_requested())
-            self.assertFalse(line.is_open_drain())
-            self.assertFalse(line.is_open_source())
+            self.assertEqual(line.drive(), gpiod.Line.DRIVE_PUSH_PULL)
             self.assertEqual(line.bias(), gpiod.Line.BIAS_PULL_DOWN)
 
     def test_exported_bias_pull_up_line(self):
@@ -329,8 +324,7 @@ class LineInfo(MockupTestCase):
             self.assertEqual(line.consumer(), default_consumer)
             self.assertTrue(line.is_used())
             self.assertTrue(line.is_requested())
-            self.assertFalse(line.is_open_drain())
-            self.assertFalse(line.is_open_source())
+            self.assertEqual(line.drive(), gpiod.Line.DRIVE_PUSH_PULL)
             self.assertEqual(line.bias(), gpiod.Line.BIAS_PULL_UP)
 
     def test_update_line_info(self):
index 919128f29a66780f370ff05df906a1e886a58f02..532f70a7319d97741e6117043eff3632a57bbf24 100644 (file)
@@ -280,6 +280,18 @@ enum {
        /**< Direction is output - we're driving the GPIO line. */
 };
 
+/**
+ * @brief Possible drive settings.
+ */
+enum {
+       GPIOD_LINE_DRIVE_PUSH_PULL = 1,
+       /**< Drive setting is push-pull. */
+       GPIOD_LINE_DRIVE_OPEN_DRAIN,
+       /**< Line output is open-drain. */
+       GPIOD_LINE_DRIVE_OPEN_SOURCE,
+       /**< Line output is open-source. */
+};
+
 /**
  * @brief Possible internal bias settings.
  */
@@ -353,18 +365,12 @@ int gpiod_line_bias(struct gpiod_line *line) GPIOD_API;
 bool gpiod_line_is_used(struct gpiod_line *line) GPIOD_API;
 
 /**
- * @brief Check if the line is an open-drain GPIO.
- * @param line GPIO line object.
- * @return True if the line is an open-drain GPIO, false otherwise.
- */
-bool gpiod_line_is_open_drain(struct gpiod_line *line) GPIOD_API;
-
-/**
- * @brief Check if the line is an open-source GPIO.
+ * @brief Read the GPIO line drive setting.
  * @param line GPIO line object.
- * @return True if the line is an open-source GPIO, false otherwise.
+ * @return Returns GPIOD_LINE_DRIVE_PUSH_PULL, GPIOD_LINE_DRIVE_OPEN_DRAIN or
+ *         GPIOD_LINE_DRIVE_OPEN_SOURCE.
  */
-bool gpiod_line_is_open_source(struct gpiod_line *line) GPIOD_API;
+int gpiod_line_drive(struct gpiod_line *line) GPIOD_API;
 
 /**
  * @brief Re-read the line info.
index 55766ec63e1bc68ceb6d500ab5d826650bf5a082..d560335e4f8460dbb0b7fa34c782c6028d23b835 100644 (file)
@@ -493,14 +493,14 @@ bool gpiod_line_is_used(struct gpiod_line *line)
        return line->info_flags & GPIOLINE_FLAG_KERNEL;
 }
 
-bool gpiod_line_is_open_drain(struct gpiod_line *line)
+int gpiod_line_drive(struct gpiod_line *line)
 {
-       return line->info_flags & GPIOLINE_FLAG_OPEN_DRAIN;
-}
+       if (line->info_flags & GPIOLINE_FLAG_OPEN_DRAIN)
+               return GPIOD_LINE_DRIVE_OPEN_DRAIN;
+       if (line->info_flags & GPIOLINE_FLAG_OPEN_SOURCE)
+               return GPIOD_LINE_DRIVE_OPEN_SOURCE;
 
-bool gpiod_line_is_open_source(struct gpiod_line *line)
-{
-       return line->info_flags & GPIOLINE_FLAG_OPEN_SOURCE;
+       return GPIOD_LINE_DRIVE_PUSH_PULL;
 }
 
 static int line_info_v2_to_info_flags(struct gpio_v2_line_info *info)
index 0f8e20ef5a78086cca05ab082d600b8dbadf0bdc..2bfb8b4a8d5d68551b8da091b891f868548fa23a 100644 (file)
@@ -455,20 +455,19 @@ GPIOD_TEST_CASE(set_flags_drive, 0, { 8 })
        ret = gpiod_line_request_output(line, GPIOD_TEST_CONSUMER, 0);
        g_assert_cmpint(ret, ==, 0);
        gpiod_test_return_if_failed();
-       g_assert_cmpint(gpiod_line_is_open_drain(line), ==, false);
-       g_assert_cmpint(gpiod_line_is_open_source(line), ==, false);
+       g_assert_cmpint(gpiod_line_drive(line), ==, GPIOD_LINE_DRIVE_PUSH_PULL);
 
        ret = gpiod_line_set_flags(line,
                GPIOD_LINE_REQUEST_FLAG_OPEN_DRAIN);
        g_assert_cmpint(ret, ==, 0);
-       g_assert_cmpint(gpiod_line_is_open_drain(line), ==, true);
-       g_assert_cmpint(gpiod_line_is_open_source(line), ==, false);
+       g_assert_cmpint(gpiod_line_drive(line), ==,
+                       GPIOD_LINE_DRIVE_OPEN_DRAIN);
 
        ret = gpiod_line_set_flags(line,
                GPIOD_LINE_REQUEST_FLAG_OPEN_SOURCE);
        g_assert_cmpint(ret, ==, 0);
-       g_assert_cmpint(gpiod_line_is_open_drain(line), ==, false);
-       g_assert_cmpint(gpiod_line_is_open_source(line), ==, true);
+       g_assert_cmpint(gpiod_line_drive(line), ==,
+                       GPIOD_LINE_DRIVE_OPEN_SOURCE);
 }
 
 GPIOD_TEST_CASE(set_direction, 0, { 8 })
@@ -760,8 +759,7 @@ GPIOD_TEST_CASE(misc_flags, 0, { 8 })
        gpiod_test_return_if_failed();
 
        g_assert_false(gpiod_line_is_used(line));
-       g_assert_false(gpiod_line_is_open_drain(line));
-       g_assert_false(gpiod_line_is_open_source(line));
+       g_assert_cmpint(gpiod_line_drive(line), ==, GPIOD_LINE_DRIVE_PUSH_PULL);
        g_assert_cmpint(gpiod_line_bias(line), ==, GPIOD_LINE_BIAS_UNKNOWN);
 
        config.request_type = GPIOD_LINE_REQUEST_DIRECTION_OUTPUT;
@@ -773,8 +771,8 @@ GPIOD_TEST_CASE(misc_flags, 0, { 8 })
        gpiod_test_return_if_failed();
 
        g_assert_true(gpiod_line_is_used(line));
-       g_assert_true(gpiod_line_is_open_drain(line));
-       g_assert_false(gpiod_line_is_open_source(line));
+       g_assert_cmpint(gpiod_line_drive(line), ==,
+                       GPIOD_LINE_DRIVE_OPEN_DRAIN);
        g_assert_cmpint(gpiod_line_bias(line), ==, GPIOD_LINE_BIAS_UNKNOWN);
        g_assert_cmpint(gpiod_line_direction(line), ==,
                        GPIOD_LINE_DIRECTION_OUTPUT);
@@ -788,8 +786,8 @@ GPIOD_TEST_CASE(misc_flags, 0, { 8 })
        gpiod_test_return_if_failed();
 
        g_assert_true(gpiod_line_is_used(line));
-       g_assert_false(gpiod_line_is_open_drain(line));
-       g_assert_true(gpiod_line_is_open_source(line));
+       g_assert_cmpint(gpiod_line_drive(line), ==,
+                       GPIOD_LINE_DRIVE_OPEN_SOURCE);
        g_assert_cmpint(gpiod_line_bias(line), ==, GPIOD_LINE_BIAS_UNKNOWN);
        g_assert_cmpint(gpiod_line_direction(line), ==,
                        GPIOD_LINE_DIRECTION_OUTPUT);
@@ -827,8 +825,8 @@ GPIOD_TEST_CASE(misc_flags_work_together, 0, { 8 })
        gpiod_test_return_if_failed();
 
        g_assert_true(gpiod_line_is_used(line));
-       g_assert_true(gpiod_line_is_open_drain(line));
-       g_assert_false(gpiod_line_is_open_source(line));
+       g_assert_cmpint(gpiod_line_drive(line), ==,
+                       GPIOD_LINE_DRIVE_OPEN_DRAIN);
        g_assert_cmpint(gpiod_line_bias(line), ==, GPIOD_LINE_BIAS_UNKNOWN);
        g_assert_true(gpiod_line_is_active_low(line));
        g_assert_cmpint(gpiod_line_direction(line), ==,
@@ -844,8 +842,8 @@ GPIOD_TEST_CASE(misc_flags_work_together, 0, { 8 })
        gpiod_test_return_if_failed();
 
        g_assert_true(gpiod_line_is_used(line));
-       g_assert_false(gpiod_line_is_open_drain(line));
-       g_assert_true(gpiod_line_is_open_source(line));
+       g_assert_cmpint(gpiod_line_drive(line), ==,
+                       GPIOD_LINE_DRIVE_OPEN_SOURCE);
        g_assert_cmpint(gpiod_line_bias(line), ==, GPIOD_LINE_BIAS_UNKNOWN);
        g_assert_true(gpiod_line_is_active_low(line));
 
@@ -865,8 +863,7 @@ GPIOD_TEST_CASE(misc_flags_work_together, 0, { 8 })
        gpiod_test_return_if_failed();
 
        g_assert_true(gpiod_line_is_used(line));
-       g_assert_false(gpiod_line_is_open_drain(line));
-       g_assert_false(gpiod_line_is_open_source(line));
+       g_assert_cmpint(gpiod_line_drive(line), ==, GPIOD_LINE_DRIVE_PUSH_PULL);
        g_assert_cmpint(gpiod_line_bias(line), ==, GPIOD_LINE_BIAS_PULL_DOWN);
        g_assert_true(gpiod_line_is_active_low(line));
        g_assert_cmpint(gpiod_line_direction(line), ==,
@@ -885,8 +882,7 @@ GPIOD_TEST_CASE(misc_flags_work_together, 0, { 8 })
        gpiod_test_return_if_failed();
 
        g_assert_true(gpiod_line_is_used(line));
-       g_assert_false(gpiod_line_is_open_drain(line));
-       g_assert_false(gpiod_line_is_open_source(line));
+       g_assert_cmpint(gpiod_line_drive(line), ==, GPIOD_LINE_DRIVE_PUSH_PULL);
        g_assert_cmpint(gpiod_line_bias(line), ==, GPIOD_LINE_BIAS_PULL_UP);
        g_assert_true(gpiod_line_is_active_low(line));
        g_assert_cmpint(gpiod_line_direction(line), ==,
index 845113ae91a4fb4185539bb31e65ddb4eeae6373..729b1799652d5426e9976aa21978bdda68b7951b 100644 (file)
@@ -37,6 +37,16 @@ static bool line_bias_is_disabled(struct gpiod_line *line)
        return gpiod_line_bias(line) == GPIOD_LINE_BIAS_DISABLED;
 }
 
+static bool line_drive_is_open_drain(struct gpiod_line *line)
+{
+       return gpiod_line_drive(line) == GPIOD_LINE_DRIVE_OPEN_DRAIN;
+}
+
+static bool line_drive_is_open_source(struct gpiod_line *line)
+{
+       return gpiod_line_drive(line) == GPIOD_LINE_DRIVE_OPEN_SOURCE;
+}
+
 static const struct flag flags[] = {
        {
                .name = "used",
@@ -44,11 +54,11 @@ static const struct flag flags[] = {
        },
        {
                .name = "open-drain",
-               .is_set = gpiod_line_is_open_drain,
+               .is_set = line_drive_is_open_drain,
        },
        {
                .name = "open-source",
-               .is_set = gpiod_line_is_open_source,
+               .is_set = line_drive_is_open_source,
        },
        {
                .name = "pull-up",