11#include <linux/module.h>
12#include <linux/kernel.h>
13#include <linux/init.h>
16#include <linux/sched.h>
17#include <linux/interrupt.h>
20#include <linux/gpio.h>
21#include <linux/pinctrl/consumer.h>
23#include <linux/kdev_t.h>
24#include <linux/device.h>
25#include <linux/cdev.h>
29MODULE_LICENSE (
"GPL");
30MODULE_AUTHOR (
"Andreas Terstegge");
31MODULE_DESCRIPTION(
"A fast IOCTL-based GPIO driver for the BBB");
33#define MOD_STR "gpio_bbb: "
35static int open_count = 0;
38static struct class *cl;
39static struct cdev c_dev;
41static wait_queue_head_t queue;
44static int irq_enabled[GPIO_COUNT];
45static u16 gpio_mode[GPIO_COUNT];
50#define CTRL_MODULE_ADDR 0x44e10000
51#define CTRL_MODULE_LEN 0xa00
52void __iomem *ctrl_module_base;
54unsigned int GPIO_BANK_ADDR[4] = {
60#define GPIO_BANK_LEN 0x200
61void __iomem *gpio_base[4];
66#define GPIO_IRQSTATUS_RAW_0 0x024
67#define GPIO_IRQSTATUS_0 0x02c
68#define GPIO_IRQSTATUS_SET_0 0x034
69#define GPIO_IRQSTATUS_CLR_0 0x03c
71#define GPIO_DATAIN 0x138
72#define GPIO_DATAOUT 0x13c
73#define GPIO_LEVELDETECT0 0x140
74#define GPIO_LEVELDETECT1 0x144
75#define GPIO_RISINGDETECT 0x148
76#define GPIO_FALLINGDETECT 0x14c
77#define GPIO_SETDATAOUT 0x194
78#define GPIO_CLEARDATAOUT 0x190
85#define GPIO0 (00 << 5)
86#define GPIO1 (01 << 5)
87#define GPIO2 (02 << 5)
88#define GPIO3 (03 << 5)
89u8 gpio_data[GPIO_COUNT] = {
168 DISABLE | GPIO0 | 16,
169 DISABLE | GPIO0 | 17,
170 DISABLE | GPIO0 | 21,
171 DISABLE | GPIO0 | 28,
173 DISABLE | GPIO3 | 10,
174 DISABLE | GPIO2 | 18,
175 DISABLE | GPIO2 | 19,
176 DISABLE | GPIO2 | 20,
178 DISABLE | GPIO2 | 21,
179 DISABLE | GPIO0 | 29,
231struct file_operations Fops = {
233 .release = device_release,
235 .write = device_write,
236 .unlocked_ioctl = device_ioctl,
239module_init (gpio_bbb_start);
240module_exit (gpio_bbb_end);
246static int __init gpio_bbb_start (
void) {
252 if (ret < 0)
return ret;
254 cl = class_create( THIS_MODULE,
"chardev" );
256 printk (KERN_ALERT MOD_STR
"Class creation failed\n" );
260 cl->dev_uevent = my_dev_uevent;
263 devnum = MKDEV(MAJOR_NUM, 0);
264 dev = device_create( cl, NULL, devnum, NULL, GPIO_DEV_NAME );
266 printk(KERN_ALERT MOD_STR
"Device creation failed\n" );
271 cdev_init( &c_dev, &Fops );
272 ret = cdev_add( &c_dev, devnum, 1 );
274 printk (KERN_ALERT MOD_STR
"Device addition failed\n" );
275 device_destroy(cl, devnum);
280 memset(&irq_enabled, 0, GPIO_COUNT);
282 init_waitqueue_head(&queue);
283 printk(KERN_INFO MOD_STR
"Device %s registered\n",
"/dev/"GPIO_DEV_NAME);
287static int my_dev_uevent(
struct device *dev,
struct kobj_uevent_env *env)
289 add_uevent_var(env,
"DEVMODE=%#o", 0666);
293static void __exit gpio_bbb_end(
void) {
300 device_destroy (cl, devnum);
302 printk(KERN_INFO MOD_STR
"Device %s unregistered\n",
"/dev/"GPIO_DEV_NAME);
309static int device_open (
struct inode *inode,
struct file *file) {
314static int device_release(
struct inode *inode,
struct file *file) {
316 if (open_count == 0) {
322static ssize_t device_read(
struct file *filp,
char *buff,
323 size_t len, loff_t *off) {
326 wait_event_interruptible(queue, gpio_irq != -1);
331static ssize_t device_write(
struct file *filp,
const char *buff,
332 size_t len, loff_t *off) {
338 wake_up_interruptible(&queue);
342long device_ioctl(
struct file *file,
343 unsigned int ioctl_num,
344 unsigned long ioctl_param) {
346 u8 gpio_num = ioctl_param & 0x7f;
349 case IOCTL_GPIO_MODE:
350 return _gpioMode(gpio_num, ioctl_param >> 8);
351 case IOCTL_GPIO_READ:
352 return _gpioRead(gpio_num);
353 case IOCTL_GPIO_WRITE:
354 return _gpioWrite(gpio_num, ioctl_param >> 8);
355 case IOCTL_GPIO_TOGGLE:
356 return _gpioToggle(gpio_num);
357 case IOCTL_GPIO_ATTACH_IRQ:
358 return _gpioAttachIrq(gpio_num, ioctl_param >> 8);
359 case IOCTL_GPIO_DETACH_IRQ:
360 return _gpioDetachIrq(gpio_num);
361 case IOCTL_GPIO_ENABLE_IRQ:
362 return _gpioEnableIrq(gpio_num);
363 case IOCTL_GPIO_DISABLE_IRQ:
364 return _gpioDisableIrq(gpio_num);
365 case IOCTL_SET_DEBOUNCE:
366 if (!(gpio_mode[gpio_num] & GPIO_REQUESTED))
return -EINVAL;
367 return gpio_set_debounce(gpio_num, ioctl_param >> 8);
376static int _gpioMode(u8 gpio_num, u16 flags) {
377 u8 gpio_bank = gpio_num >> 5;
378 u32 gpio_mask = 1 << (gpio_num & 0x1f);
383 u16 offset = _gpio_to_offset (gpio_num);
384 if (!(gpio_mode[gpio_num] & GPIO_REQUESTED)) {
385 if (offset < 0)
return offset;
387 printk(KERN_INFO MOD_STR
"Requesting GPIO #%i\n", gpio_num);
388 ret = gpio_request(gpio_num, GPIO_DEV_NAME);
392 if (flags == GPIO_INPUT) {
394 ret = ioread32(ctrl_module_base + offset);
397 MOD_STR
"Enabling receiver on already used GPIO #%i\n", gpio_num);
398 _ioset32 (0x20, ctrl_module_base + offset);
399 gpio_mode[gpio_num] = flags;
407 gpio_mode[gpio_num] = flags | GPIO_REQUESTED;
411 if (flags & GPIO_INPUT) val |= 0x20;
412 if (flags & GPIO_PULLDOWN) val ^= 0x08;
413 if (flags & GPIO_PULLUP) val ^= 0x18;
414 if (flags & GPIO_SLOW) val |= 0x40;
415 if (flags & GPIO_FAST) val &= ~0x40;
416 iowrite32(val, ctrl_module_base + offset);
417 printk(KERN_INFO MOD_STR
"GPIO #%i set to mode 0x%02X\n", gpio_num, val);
420 if (flags & GPIO_INPUT) {
421 _ioset32 (gpio_mask, gpio_base[gpio_bank] + GPIO_OE);
423 if (flags & GPIO_OUTPUT) {
424 _ioclear32(gpio_mask, gpio_base[gpio_bank] + GPIO_OE);
426 if (flags & GPIO_OUTPUT_OPEN_SOURCE) {
427 iowrite32(gpio_mask, gpio_base[gpio_bank] + GPIO_SETDATAOUT);
429 if (flags & GPIO_OUTPUT_OPEN_DRAIN) {
430 iowrite32(gpio_mask, gpio_base[gpio_bank] + GPIO_CLEARDATAOUT);
432 if (flags & GPIO_INIT_HIGH) {
433 _gpioWrite(gpio_num, 1);
435 if (flags & GPIO_INIT_LOW) {
436 _gpioWrite(gpio_num, 0);
441static int _gpioRead(u8 gpio_num) {
442 u8 gpio_bank = gpio_num >> 5;
443 u32 gpio_mask = 1 << (gpio_num & 0x1f);
446 if (gpio_mode[gpio_num] & GPIO_INPUT) {
447 val = ioread32(gpio_base[gpio_bank] + GPIO_DATAIN) & gpio_mask;
449 val = ioread32(gpio_base[gpio_bank] + GPIO_DATAOUT) & gpio_mask;
451 return (val) ? 1 : 0;
454static int _gpioWrite (u8 gpio_num,
int value) {
455 u8 gpio_bank = gpio_num >> 5;
456 u32 gpio_mask = 1 << (gpio_num & 0x1f);
459 if (!(gpio_mode[gpio_num] & GPIO_REQUESTED))
return -EPERM;
460 flags = gpio_mode[gpio_num];
462 if (flags & GPIO_OUTPUT_OPEN_DRAIN) {
463 _ioset32(gpio_mask, gpio_base[gpio_bank] + GPIO_OE);
466 if (flags & GPIO_OUTPUT_OPEN_SOURCE) {
467 _ioclear32(gpio_mask, gpio_base[gpio_bank] + GPIO_OE);
470 iowrite32(gpio_mask, gpio_base[gpio_bank] + GPIO_SETDATAOUT);
473 if (flags & GPIO_OUTPUT_OPEN_DRAIN) {
474 _ioclear32(gpio_mask, gpio_base[gpio_bank] + GPIO_OE);
477 if (flags & GPIO_OUTPUT_OPEN_SOURCE) {
478 _ioset32(gpio_mask, gpio_base[gpio_bank] + GPIO_OE);
481 iowrite32(gpio_mask, gpio_base[gpio_bank] + GPIO_CLEARDATAOUT);
486static int _gpioToggle (u8 gpio_num) {
487 u8 gpio_bank = gpio_num >> 5;
488 u32 gpio_mask = 1 << (gpio_num & 0x1f);
490 u32 val = ioread32(gpio_base[gpio_bank] + GPIO_DATAOUT) & gpio_mask;
491 return _gpioWrite(gpio_num, !val);
494static int _gpioAttachIrq(u8 gpio_num, u16 flags) {
495 u8 gpio_bank = gpio_num >> 5;
496 u32 gpio_mask = 1 << (gpio_num & 0x1f);
500 if (!irq_enabled[gpio_num]) {
501 irq = gpio_to_irq(gpio_num);
503 ret = request_any_context_irq (irq, _gpio_irq_handler, IRQF_SHARED,
"gpio_bbb", &gpio_data);
505 printk(KERN_ERR MOD_STR
"Failed to request IRQ %i (error %i)\n", irq, ret);
509 irq_set_irq_type(irq, IRQ_TYPE_NONE);
510 irq_enabled[gpio_num] = irq;
511 printk(KERN_INFO MOD_STR
"Using IRQ #%i for GPIO #%i\n", irq, gpio_num);
514 _ioclear32(gpio_mask, gpio_base[gpio_bank] + GPIO_RISINGDETECT);
515 _ioclear32(gpio_mask, gpio_base[gpio_bank] + GPIO_FALLINGDETECT);
516 _ioclear32(gpio_mask, gpio_base[gpio_bank] + GPIO_LEVELDETECT1);
517 _ioclear32(gpio_mask, gpio_base[gpio_bank] + GPIO_LEVELDETECT0);
518 if (flags & GPIO_RISING)
519 _ioset32 (gpio_mask, gpio_base[gpio_bank] + GPIO_RISINGDETECT);
520 if (flags & GPIO_FALLING)
521 _ioset32 (gpio_mask, gpio_base[gpio_bank] + GPIO_FALLINGDETECT);
522 if (flags & GPIO_LEVEL_HIGH)
523 _ioset32 (gpio_mask, gpio_base[gpio_bank] + GPIO_LEVELDETECT1);
524 if (flags & GPIO_LEVEL_LOW)
525 _ioset32 (gpio_mask, gpio_base[gpio_bank] + GPIO_LEVELDETECT0);
529static int _gpioDetachIrq(u8 gpio_num) {
530 u8 gpio_bank = gpio_num >> 5;
531 u32 gpio_mask = 1 << (gpio_num & 0x1f);
533 if (!irq_enabled[gpio_num])
return -EINVAL;
535 iowrite32(gpio_mask, gpio_base[gpio_bank] + GPIO_IRQSTATUS_CLR_0);
536 iowrite32(gpio_mask, gpio_base[gpio_bank] + GPIO_IRQSTATUS_0);
538 _release_irq (gpio_num);
542static int _gpioEnableIrq(u8 gpio_num) {
543 u8 gpio_bank = gpio_num >> 5;
544 u32 gpio_mask = 1 << (gpio_num & 0x1f);
546 if (!irq_enabled[gpio_num])
return -EINVAL;
548 iowrite32(gpio_mask, gpio_base[gpio_bank] + GPIO_IRQSTATUS_0);
549 iowrite32(gpio_mask, gpio_base[gpio_bank] + GPIO_IRQSTATUS_SET_0);
553static int _gpioDisableIrq(u8 gpio_num) {
554 u8 gpio_bank = gpio_num >> 5;
555 u32 gpio_mask = 1 << (gpio_num & 0x1f);
557 if (!irq_enabled[gpio_num])
return -EINVAL;
558 iowrite32(gpio_mask, gpio_base[gpio_bank] + GPIO_IRQSTATUS_CLR_0);
559 iowrite32(gpio_mask, gpio_base[gpio_bank] + GPIO_IRQSTATUS_0);
567static void _ioset32(u32 v,
void __iomem *addr) {
569 tmp = ioread32(addr);
571 iowrite32(tmp, addr);
574static void _ioclear32(u32 v,
void __iomem *addr) {
576 tmp = ioread32(addr);
578 iowrite32(tmp, addr);
581static int _map_memory(
void) {
583 ctrl_module_base = ioremap(CTRL_MODULE_ADDR, CTRL_MODULE_LEN);
584 if(!ctrl_module_base) {
585 printk (KERN_ALERT MOD_STR
"Failed to map memory for CTRL_MODULE.%c\n", 0x20);
588 for (i=0; i < 4; ++i) {
589 gpio_base[i] = ioremap(GPIO_BANK_ADDR[i], GPIO_BANK_LEN);
591 printk (KERN_ALERT MOD_STR
"Failed to map memory for GPIO bank %d.\n", i);
592 iounmap(ctrl_module_base);
593 for (--i; i >= 0; --i) iounmap(gpio_base[i]);
600static void _unmap_memory(
void) {
602 iounmap (ctrl_module_base);
603 for(i=0; i < 4; ++i) iounmap (gpio_base[i]);
606static u16 _gpio_to_offset(u8 gpio_num) {
608 u8 entry = gpio_num | ENABLE;
609 for (offset = 0; offset < GPIO_COUNT; ++offset) {
610 if (gpio_data[offset] == entry)
613 if (offset == GPIO_COUNT)
return -EINVAL;
619static u8 _irq_to_gpio(
int irq) {
621 for (i=0; i < GPIO_COUNT; ++i) {
622 if (irq_enabled[i] == irq)
break;
624 return (i==GPIO_COUNT) ? -1 : i;
627static void _release_irq(u8 gpio_num) {
628 u8 gpio_bank = gpio_num >> 5;
629 u32 gpio_mask = 1 << (gpio_num & 0x1f);
631 if (irq_enabled[gpio_num]) {
632 printk (KERN_INFO MOD_STR
"Releasing IRQ #%i\n", irq_enabled[gpio_num]);
633 free_irq (irq_enabled[gpio_num], &gpio_data);
634 irq_enabled[gpio_num] = 0;
635 if (!(gpio_mode[gpio_num] & GPIO_REQUESTED)) {
640 offset = _gpio_to_offset(gpio_num);
643 _ioclear32(0x20, ctrl_module_base + offset);
645 _ioclear32(gpio_mask, gpio_base[gpio_bank] + GPIO_OE);
651static void _release_all_irqs(
void) {
653 for (i=0; i < GPIO_COUNT; ++i) {
655 if (gpio_mode[i] & GPIO_REQUESTED) {
656 printk(KERN_INFO MOD_STR
"Freeing GPIO #%i\n", i);
658 pinctrl_free_gpio(i);
667irqreturn_t _gpio_irq_handler(
int irq,
void *dev_id) {
670 if (dev_id != (
void *)&gpio_data) {
674 gpio_num = _irq_to_gpio(irq);
677 wake_up_interruptible(&queue);