at86rf230: add warning if edge-triggered irq
authorAlexander Aring <alex.aring@gmail.com>
Fri, 27 Feb 2015 08:58:30 +0000 (09:58 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Fri, 27 Feb 2015 17:42:44 +0000 (18:42 +0100)
While testing I experience a deadlock while using the at86rf233 on a
raspberry pi. The reason was an edge triggered gpio irq because the irq
triggered while irq was disabled. This issue doesn't happend on a level
triggered irq because the irq will hit after calling enable_irq.

This patch adds a warning that it's not recommended to use a edge-triggered
irq type. Also change the examples to high-level irqtype.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Documentation/devicetree/bindings/net/ieee802154/at86rf230.txt
drivers/net/ieee802154/at86rf230.c

index 1ae5100..168f1be 100644 (file)
@@ -6,7 +6,8 @@ Required properties:
   - spi-max-frequency: maximal bus speed, should be set to 7500000 depends
                        sync or async operation mode
   - reg:               the chipselect index
-  - interrupts:                the interrupt generated by the device
+  - interrupts:                the interrupt generated by the device. Non high-level
+                       can occur deadlocks while handling isr.
 
 Optional properties:
   - reset-gpio:                GPIO spec for the rstn pin
@@ -20,7 +21,7 @@ Example:
                compatible = "atmel,at86rf231";
                spi-max-frequency = <7500000>;
                reg = <0>;
-               interrupts = <19 1>;
+               interrupts = <19 4>;
                interrupt-parent = <&gpio3>;
                xtal-trim = /bits/ 8 <0x06>;
        };
index c7a30ce..1d438bc 100644 (file)
@@ -1321,6 +1321,10 @@ static int at86rf230_hw_init(struct at86rf230_local *lp, u8 xtal_trim)
                return rc;
 
        irq_type = irq_get_trigger_type(lp->spi->irq);
+       if (irq_type == IRQ_TYPE_EDGE_RISING ||
+           irq_type == IRQ_TYPE_EDGE_FALLING)
+               dev_warn(&lp->spi->dev,
+                        "Using edge triggered irq's are not recommended!\n");
        if (irq_type == IRQ_TYPE_EDGE_FALLING ||
            irq_type == IRQ_TYPE_LEVEL_LOW)
                irq_pol = IRQ_ACTIVE_LOW;