/dts-v1/;
/plugin/;
&{/soc/pinctrl@1c20800} {
anemometerirq_pins: anemometerirq_pins {
pins = "PB4";
function = "gpio_in";
bias-pull-up;
};
};
&{/soc} {
anemometerobserver {
compatible = "anemometer-irq";
pinctrl-names = "default";
pinctrl-0 = <&anemometerirq_pins>;
interrupt-parent = <&pio>;
interrupts = <1 4 2>; // Bank 1, pin 4, IRQ_TYPE_EDGE_FALLING
//status = "okay";
};
};
dtc -I dts -O dtb -o sun50i-a64-irq-PB4.dtbo sun50i-a64-irq-PB4.dts
#include <linux/interrupt.h>
#include <linux/module.h>
#include <linux/of_platform.h>
/* Inspired by https://linux-sunxi.org/External_interrupts */
static irqreturn_t anemometer_irq_handler(int irq, void *dev_id)
{
//printk(KERN_INFO "anemometer_irq: Interrupt received!\n");
return IRQ_HANDLED;
}
static int anemometer_probe(struct platform_device *pdev)
{
int irq, ret;
irq = platform_get_irq (pdev, 0);
if (irq < 0) {
printk(KERN_ERR "Failed to get IRQ: %d\n", irq);
return irq;
}
ret = request_threaded_irq(irq, NULL, anemometer_irq_handler,
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
"anemometer-irq", NULL);
if (ret) {
dev_err(&pdev->dev, "Failed to request IRQ %d: %d\n", irq, ret);
return ret;
}
dev_info(&pdev->dev, "Anemometer IRQ %d registered successfully\n", irq);
return 0;
}
static int anemometer_remove(struct platform_device *pdev)
{
int irq = platform_get_irq(pdev, 0);
if (irq > 0)
free_irq(irq, NULL);
return 0;
}
static const struct of_device_id anemometer_dt_ids[] = {
{ .compatible = "anemometer-irq" },
{ }
};
MODULE_DEVICE_TABLE(of, anemometer_dt_ids);
static struct platform_driver anemometer_driver = {
.probe = anemometer_probe,
.remove = anemometer_remove,
.driver = {
.name = "anemometer-irq",
.of_match_table = anemometer_dt_ids,
},
};
module_platform_driver(anemometer_driver);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Ilario Gelmetti");
MODULE_DESCRIPTION("Anemometer Switch Monitor");
obj-m += anemometer-irq.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
make
insmod anemometer-irq.ko
# grep PB4 /sys/kernel/debug/pinctrl/1c20800.pinctrl/pinmux-pins
pin 36 (PB4): device soc:anemometerobserver function gpio_in group PB4