bindings: python: add support for bias flags
authorKent Gibson <warthog618@gmail.com>
Sun, 1 Dec 2019 03:23:52 +0000 (11:23 +0800)
committerBartosz Golaszewski <bgolaszewski@baylibre.com>
Tue, 10 Dec 2019 07:58:55 +0000 (08:58 +0100)
Add support for bias flags in line requests and returning the line bias
setting via a bias accessor.

Based on initial work by Drew Fustini <drew@pdp7.com>.

Signed-off-by: Kent Gibson <warthog618@gmail.com>
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
bindings/python/gpiodmodule.c

index 2f6ef51cca5e10e2e1a3efa9326f46d9154a91df..47237713e4c0d7be8182ec8de7f0c677b5edc834 100644 (file)
@@ -60,6 +60,9 @@ enum {
        gpiod_LINE_REQ_FLAG_OPEN_DRAIN          = GPIOD_BIT(0),
        gpiod_LINE_REQ_FLAG_OPEN_SOURCE         = GPIOD_BIT(1),
        gpiod_LINE_REQ_FLAG_ACTIVE_LOW          = GPIOD_BIT(2),
+       gpiod_LINE_REQ_FLAG_BIAS_DISABLE        = GPIOD_BIT(3),
+       gpiod_LINE_REQ_FLAG_BIAS_PULL_DOWN      = GPIOD_BIT(4),
+       gpiod_LINE_REQ_FLAG_BIAS_PULL_UP        = GPIOD_BIT(5),
 };
 
 enum {
@@ -72,6 +75,13 @@ enum {
        gpiod_ACTIVE_LOW,
 };
 
+enum {
+       gpiod_BIAS_AS_IS = 1,
+       gpiod_BIAS_DISABLE,
+       gpiod_BIAS_PULL_UP,
+       gpiod_BIAS_PULL_DOWN,
+};
+
 enum {
        gpiod_RISING_EDGE = 1,
        gpiod_FALLING_EDGE,
@@ -358,6 +368,34 @@ static PyObject *gpiod_Line_active_state(gpiod_LineObject *self,
        return ret;
 }
 
+PyDoc_STRVAR(gpiod_Line_bias_doc,
+"bias() -> integer\n"
+"\n"
+"Get the bias setting of this GPIO line.");
+
+static PyObject *gpiod_Line_bias(gpiod_LineObject *self,
+                                PyObject *Py_UNUSED(ignored))
+{
+       int bias;
+
+       if (gpiod_ChipIsClosed(self->owner))
+               return NULL;
+
+       bias = gpiod_line_bias(self->line);
+
+       switch (bias) {
+       case GPIOD_LINE_BIAS_PULL_UP:
+               return Py_BuildValue("I", gpiod_BIAS_PULL_UP);
+       case GPIOD_LINE_BIAS_PULL_DOWN:
+               return Py_BuildValue("I", gpiod_BIAS_PULL_DOWN);
+       case GPIOD_LINE_BIAS_DISABLE:
+               return Py_BuildValue("I", gpiod_BIAS_DISABLE);
+       case GPIOD_LINE_BIAS_AS_IS:
+       default:
+               return Py_BuildValue("I", gpiod_BIAS_AS_IS);
+       }
+}
+
 PyDoc_STRVAR(gpiod_Line_is_used_doc,
 "is_used() -> boolean\n"
 "\n"
@@ -752,6 +790,12 @@ static PyMethodDef gpiod_Line_methods[] = {
                .ml_flags = METH_NOARGS,
                .ml_doc = gpiod_Line_active_state_doc,
        },
+       {
+               .ml_name = "bias",
+               .ml_meth = (PyCFunction)gpiod_Line_bias,
+               .ml_flags = METH_NOARGS,
+               .ml_doc = gpiod_Line_bias_doc,
+       },
        {
                .ml_name = "is_used",
                .ml_meth = (PyCFunction)gpiod_Line_is_used,
@@ -1030,6 +1074,12 @@ static void gpiod_MakeRequestConfig(struct gpiod_line_request_config *conf,
                conf->flags |= GPIOD_LINE_REQUEST_FLAG_OPEN_SOURCE;
        if (flags & gpiod_LINE_REQ_FLAG_ACTIVE_LOW)
                conf->flags |= GPIOD_LINE_REQUEST_FLAG_ACTIVE_LOW;
+       if (flags & gpiod_LINE_REQ_FLAG_BIAS_DISABLE)
+               conf->flags |= GPIOD_LINE_REQUEST_FLAG_BIAS_DISABLE;
+       if (flags & gpiod_LINE_REQ_FLAG_BIAS_PULL_DOWN)
+               conf->flags |= GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_DOWN;
+       if (flags & gpiod_LINE_REQ_FLAG_BIAS_PULL_UP)
+               conf->flags |= GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_UP;
 }
 
 PyDoc_STRVAR(gpiod_LineBulk_request_doc,
@@ -2313,6 +2363,26 @@ static gpiod_ConstDescr gpiod_ConstList[] = {
                .name = "ACTIVE_LOW",
                .val = gpiod_ACTIVE_LOW,
        },
+       {
+               .typeobj = &gpiod_LineType,
+               .name = "BIAS_AS_IS",
+               .val = gpiod_BIAS_AS_IS,
+       },
+       {
+               .typeobj = &gpiod_LineType,
+               .name = "BIAS_DISABLE",
+               .val = gpiod_BIAS_DISABLE,
+       },
+       {
+               .typeobj = &gpiod_LineType,
+               .name = "BIAS_PULL_UP",
+               .val = gpiod_BIAS_PULL_UP,
+       },
+       {
+               .typeobj = &gpiod_LineType,
+               .name = "BIAS_PULL_DOWN",
+               .val = gpiod_BIAS_PULL_DOWN,
+       },
        {
                .typeobj = &gpiod_LineEventType,
                .name = "RISING_EDGE",
@@ -2381,6 +2451,18 @@ static gpiod_ModuleConst gpiod_ModuleConsts[] = {
                .name = "LINE_REQ_FLAG_ACTIVE_LOW",
                .value = gpiod_LINE_REQ_FLAG_ACTIVE_LOW,
        },
+       {
+               .name = "LINE_REQ_FLAG_BIAS_DISABLE",
+               .value = gpiod_LINE_REQ_FLAG_BIAS_DISABLE,
+       },
+       {
+               .name = "LINE_REQ_FLAG_BIAS_PULL_DOWN",
+               .value = gpiod_LINE_REQ_FLAG_BIAS_PULL_DOWN,
+       },
+       {
+               .name = "LINE_REQ_FLAG_BIAS_PULL_UP",
+               .value = gpiod_LINE_REQ_FLAG_BIAS_PULL_UP,
+       },
        { }
 };