13 #include <linux/module.h>
14 #include <linux/sched.h>
15 #include <linux/slab.h>
17 #include <linux/errno.h>
18 #include <linux/kernel.h>
20 #include <linux/string.h>
21 #include <linux/poll.h>
28 #include <hwregs/reg_map.h>
30 #include <hwregs/gio_defs.h>
31 #include <hwregs/intr_vect_defs.h>
35 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO
38 #define VIRT_I2C_ADDR 0x40
50 #define GPIO_MAJOR 120
59 if (dp_cnt % 1000 == 0) \
67 static char gpio_name[] =
"etrax gpio";
73 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO
74 static int virtual_gpio_ioctl(
struct file *
file,
unsigned int cmd,
77 static long gpio_ioctl(
struct file *
file,
unsigned int cmd,
unsigned long arg);
82 static unsigned int gpio_poll(
struct file *filp,
104 static int gpio_some_alarms;
105 static unsigned long gpio_pa_high_alarms;
106 static unsigned long gpio_pa_low_alarms;
110 #define NUM_PORTS (GPIO_MINOR_LAST+1)
111 #define GIO_REG_RD_ADDR(reg) \
112 (volatile unsigned long *)(regi_gio + REG_RD_ADDR_gio_##reg)
113 #define GIO_REG_WR_ADDR(reg) \
114 (volatile unsigned long *)(regi_gio + REG_RD_ADDR_gio_##reg)
116 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO
117 static unsigned long virtual_dummy;
118 static unsigned long virtual_rw_pv_oe = CONFIG_ETRAX_DEF_GIO_PV_OE;
119 static unsigned short cached_virtual_gpio_read;
122 static volatile unsigned long *data_out[
NUM_PORTS] = {
129 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO
134 static volatile unsigned long *data_in[
NUM_PORTS] = {
141 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO
150 CONFIG_ETRAX_PC_CHANGEABLE_DIR,
151 CONFIG_ETRAX_PD_CHANGEABLE_DIR,
152 CONFIG_ETRAX_PE_CHANGEABLE_DIR,
153 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO
154 CONFIG_ETRAX_PV_CHANGEABLE_DIR,
162 CONFIG_ETRAX_PC_CHANGEABLE_BITS,
163 CONFIG_ETRAX_PD_CHANGEABLE_BITS,
164 CONFIG_ETRAX_PE_CHANGEABLE_BITS,
165 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO
166 CONFIG_ETRAX_PV_CHANGEABLE_BITS,
170 static volatile unsigned long *dir_oe[
NUM_PORTS] = {
177 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO
186 unsigned int mask = 0;
189 poll_wait(file, &priv->
alarm_wq, wait);
190 if (priv->
minor == GPIO_MINOR_A) {
243 }
else if (priv->
minor <= GPIO_MINOR_E)
244 data = *data_in[priv->
minor];
258 unsigned long data = 0;
264 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO
265 if (priv->
minor == GPIO_MINOR_V)
266 data = (
unsigned long)cached_virtual_gpio_read;
268 data = *data_in[priv->
minor];
269 if (priv->
minor == GPIO_MINOR_A)
270 priv->
lowalarm |= (1 << CONFIG_ETRAX_VIRTUAL_GPIO_INTERRUPT_PA_PIN);
273 data = *data_in[priv->
minor];
278 "etrax_gpio_wake_up_check %i\n", priv->
minor));
284 spin_unlock_irqrestore(&alarm_lock, flags);
289 gpio_poll_timer_interrupt(
int irq,
void *
dev_id)
291 if (gpio_some_alarms)
297 gpio_pa_interrupt(
int irq,
void *dev_id)
304 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO
305 unsigned char enable_gpiov_ack = 0;
313 spin_lock(&alarm_lock);
314 tmp &= (gpio_pa_high_alarms | gpio_pa_low_alarms);
315 spin_unlock(&alarm_lock);
317 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO
321 if (tmp & (1 << CONFIG_ETRAX_VIRTUAL_GPIO_INTERRUPT_PA_PIN)) {
322 i2c_read(VIRT_I2C_ADDR, (
void *)&cached_virtual_gpio_read,
323 sizeof(cached_virtual_gpio_read));
324 enable_gpiov_ack = 1;
336 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO
340 if (enable_gpiov_ack)
341 tmp2 |= (1 << CONFIG_ETRAX_VIRTUAL_GPIO_INTERRUPT_PA_PIN);
346 if (gpio_some_alarms)
359 volatile unsigned long *
port;
363 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO
364 if (priv->
minor == GPIO_MINOR_V)
367 if (priv->
minor == GPIO_MINOR_LEDS)
376 if (clk_mask == 0 || data_mask == 0)
380 "msb: %i\n", count, data_mask, clk_mask, write_msb));
381 port = data_out[priv->
minor];
387 for (i = 7; i >= 0; i--) {
390 *port = shadow &= ~clk_mask;
394 *port = shadow &= ~data_mask;
400 for (i = 0; i <= 7; i++) {
403 *port = shadow &= ~clk_mask;
407 *port = shadow &= ~data_mask;
420 gpio_open(
struct inode *
inode,
struct file *filp)
423 int p = iminor(inode);
425 if (p > GPIO_MINOR_LAST)
433 memset(priv, 0,
sizeof(*priv));
448 spin_lock_irq(&alarm_lock);
449 priv->
next = alarmlist;
451 spin_unlock_irq(&alarm_lock);
458 gpio_release(
struct inode *inode,
struct file *filp)
463 unsigned long a_high, a_low;
464 unsigned long some_alarms;
468 spin_lock_irq(&alarm_lock);
473 alarmlist = todel->
next;
475 while (p->
next != todel)
487 if (p->
minor == GPIO_MINOR_A) {
488 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO
489 p->
lowalarm |= (1 << CONFIG_ETRAX_VIRTUAL_GPIO_INTERRUPT_PA_PIN);
500 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO
505 a_low |= (1 << CONFIG_ETRAX_VIRTUAL_GPIO_INTERRUPT_PA_PIN);
508 gpio_some_alarms = some_alarms;
509 gpio_pa_high_alarms = a_high;
510 gpio_pa_low_alarms = a_low;
511 spin_unlock_irq(&alarm_lock);
529 dir_shadow = *dir_oe[priv->
minor];
534 if (priv->
minor == GPIO_MINOR_A)
536 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO
537 else if (priv->
minor == GPIO_MINOR_V)
538 dir_shadow ^= 0xFFFF;
541 dir_shadow ^= 0x3FFFF;
552 dir_shadow = *dir_oe[priv->
minor];
559 static int gpio_leds_ioctl(
unsigned int cmd,
unsigned long arg);
562 gpio_ioctl_unlocked(
struct file *file,
unsigned int cmd,
unsigned long arg)
571 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO
572 if (priv->
minor == GPIO_MINOR_V)
573 return virtual_gpio_ioctl(file, cmd, arg);
579 return *data_in[priv->
minor];
584 shadow = *data_out[priv->
minor];
592 shadow = *data_out[priv->
minor];
601 gpio_some_alarms = 1;
602 if (priv->
minor == GPIO_MINOR_A)
603 gpio_pa_high_alarms |=
arg;
604 spin_unlock_irqrestore(&alarm_lock, flags);
610 gpio_some_alarms = 1;
611 if (priv->
minor == GPIO_MINOR_A)
612 gpio_pa_low_alarms |=
arg;
613 spin_unlock_irqrestore(&alarm_lock, flags);
620 if (priv->
minor == GPIO_MINOR_A) {
621 if (gpio_pa_high_alarms & arg ||
622 gpio_pa_low_alarms & arg)
626 spin_unlock_irqrestore(&alarm_lock, flags);
630 return *dir_oe[priv->
minor];
646 dir_shadow = *dir_oe[priv->
minor];
666 val = *data_in[priv->
minor];
673 val = *data_out[priv->
minor];
684 if (
copy_to_user((
unsigned long *)arg, &val,
sizeof(val)))
694 if (
copy_to_user((
unsigned long *)arg, &val,
sizeof(val)))
698 if (priv->
minor == GPIO_MINOR_LEDS)
699 return gpio_leds_ioctl(cmd, arg);
707 static long gpio_ioctl(
struct file *file,
unsigned int cmd,
unsigned long arg)
712 ret = gpio_ioctl_unlocked(file, cmd, arg);
718 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO
720 virtual_gpio_ioctl(
struct file *file,
unsigned int cmd,
unsigned long arg)
731 i2c_read(VIRT_I2C_ADDR, (
void *)&shadow,
sizeof(shadow));
732 shadow |= ~*dir_oe[priv->
minor];
734 i2c_write(VIRT_I2C_ADDR, (
void *)&shadow,
sizeof(shadow));
740 i2c_read(VIRT_I2C_ADDR, (
void *)&shadow,
sizeof(shadow));
741 shadow |= ~*dir_oe[priv->
minor];
743 i2c_write(VIRT_I2C_ADDR, (
void *)&shadow,
sizeof(shadow));
749 spin_lock(&alarm_lock);
750 gpio_some_alarms = 1;
751 spin_unlock(&alarm_lock);
756 spin_lock(&alarm_lock);
757 gpio_some_alarms = 1;
758 spin_unlock(&alarm_lock);
764 spin_lock(&alarm_lock);
765 spin_unlock(&alarm_lock);
770 dir_shadow = *dir_oe[priv->
minor];
790 val = cached_virtual_gpio_read;
791 val &= ~*dir_oe[priv->
minor];
798 i2c_read(VIRT_I2C_ADDR, (
void *)&val,
sizeof(val));
799 val &= *dir_oe[priv->
minor];
800 if (
copy_to_user((
unsigned long *)arg, &val,
sizeof(val)))
808 unsigned short input_mask = ~*dir_oe[priv->
minor];
812 if (
copy_to_user((
unsigned long *)arg, &val,
sizeof(val)))
814 if ((input_mask & val) != input_mask) {
818 unsigned short change = input_mask ^
val;
819 i2c_read(VIRT_I2C_ADDR, (
void *)&shadow,
823 i2c_write(VIRT_I2C_ADDR, (
void *)&shadow,
835 if (
copy_to_user((
unsigned long *)arg, &val,
sizeof(val)))
846 gpio_leds_ioctl(
unsigned int cmd,
unsigned long arg)
853 green = ((
unsigned char) arg) & 1;
854 red = (((
unsigned char) arg) >> 1) & 1;
869 .unlocked_ioctl = gpio_ioctl,
872 .release = gpio_release,
876 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO
878 virtual_gpio_init(
void)
884 shadow = ~virtual_rw_pv_oe;
885 shadow |= CONFIG_ETRAX_DEF_GIO_PV_OUT;
886 i2c_write(VIRT_I2C_ADDR, (
void *)&shadow,
sizeof(shadow));
894 switch (CONFIG_ETRAX_VIRTUAL_GPIO_INTERRUPT_PA_PIN) {
932 gpio_pa_low_alarms |= (1 << CONFIG_ETRAX_VIRTUAL_GPIO_INTERRUPT_PA_PIN);
933 gpio_some_alarms = 1;
946 res = register_chrdev(
GPIO_MAJOR, gpio_name, &gpio_fops);
960 "Axis Communications AB\n");
974 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO