ktime_t                 v5_ts;
 };
 
-static bool cec_gpio_read(struct cec_adapter *adap)
+static int cec_gpio_read(struct cec_adapter *adap)
 {
        struct cec_gpio *cec = cec_get_drvdata(adap);
 
        if (cec->cec_is_low)
-               return false;
+               return 0;
        return gpiod_get_value(cec->cec_gpio);
 }
 
 static irqreturn_t cec_5v_gpio_irq_handler(int irq, void *priv)
 {
        struct cec_gpio *cec = priv;
-       bool is_high = gpiod_get_value(cec->v5_gpio);
+       int val = gpiod_get_value(cec->v5_gpio);
+       bool is_high = val > 0;
 
-       if (is_high == cec->v5_is_high)
+       if (val < 0 || is_high == cec->v5_is_high)
                return IRQ_HANDLED;
        cec->v5_ts = ktime_get();
        cec->v5_is_high = is_high;
 static irqreturn_t cec_hpd_gpio_irq_handler(int irq, void *priv)
 {
        struct cec_gpio *cec = priv;
-       bool is_high = gpiod_get_value(cec->hpd_gpio);
+       int val = gpiod_get_value(cec->hpd_gpio);
+       bool is_high = val > 0;
 
-       if (is_high == cec->hpd_is_high)
+       if (val < 0 || is_high == cec->hpd_is_high)
                return IRQ_HANDLED;
        cec->hpd_ts = ktime_get();
        cec->hpd_is_high = is_high;
 static irqreturn_t cec_gpio_irq_handler(int irq, void *priv)
 {
        struct cec_gpio *cec = priv;
+       int val = gpiod_get_value(cec->cec_gpio);
 
-       cec_pin_changed(cec->adap, gpiod_get_value(cec->cec_gpio));
+       if (val >= 0)
+               cec_pin_changed(cec->adap, val > 0);
        return IRQ_HANDLED;
 }
 
 
 
 /**
  * struct cec_pin_ops - low-level CEC pin operations
- * @read:      read the CEC pin. Return true if high, false if low.
+ * @read:      read the CEC pin. Returns > 0 if high, 0 if low, or an error
+ *             if negative.
  * @low:       drive the CEC pin low.
  * @high:      stop driving the CEC pin. The pull-up will drive the pin
  *             high, unless someone else is driving the pin low.
  * @free:      optional. Free any allocated resources. Called when the
  *             adapter is deleted.
  * @status:    optional, log status information.
- * @read_hpd:  read the HPD pin. Return true if high, false if low or
- *             an error if negative. If NULL or -ENOTTY is returned,
- *             then this is not supported.
- * @read_5v:   read the 5V pin. Return true if high, false if low or
- *             an error if negative. If NULL or -ENOTTY is returned,
- *             then this is not supported.
- *
+ * @read_hpd:  optional. Read the HPD pin. Returns > 0 if high, 0 if low or
+ *             an error if negative.
+ * @read_5v:   optional. Read the 5V pin. Returns > 0 if high, 0 if low or
+ *             an error if negative.
  * @received:  optional. High-level CEC message callback. Allows the driver
  *             to process CEC messages.
  *
  * cec pin framework to manipulate the CEC pin.
  */
 struct cec_pin_ops {
-       bool (*read)(struct cec_adapter *adap);
+       int  (*read)(struct cec_adapter *adap);
        void (*low)(struct cec_adapter *adap);
        void (*high)(struct cec_adapter *adap);
        bool (*enable_irq)(struct cec_adapter *adap);