blob: 64285e0d348154c461bf79553b964417751a1126 [file] [log] [blame]
Kyle Swenson8d8f6542021-03-15 11:02:55 -06001/*
2 * Etrax general port I/O device
3 *
4 * Copyright (c) 1999-2007 Axis Communications AB
5 *
6 * Authors: Bjorn Wesen (initial version)
7 * Ola Knutsson (LED handling)
8 * Johan Adolfsson (read/set directions, write, port G)
9 */
10
11
12#include <linux/module.h>
13#include <linux/sched.h>
14#include <linux/slab.h>
15#include <linux/ioport.h>
16#include <linux/errno.h>
17#include <linux/kernel.h>
18#include <linux/fs.h>
19#include <linux/string.h>
20#include <linux/poll.h>
21#include <linux/init.h>
22#include <linux/interrupt.h>
23
24#include <asm/etraxgpio.h>
25#include <arch/svinto.h>
26#include <asm/io.h>
27#include <asm/irq.h>
28#include <arch/io_interface_mux.h>
29
30#define GPIO_MAJOR 120 /* experimental MAJOR number */
31
32#define D(x)
33
34#if 0
35static int dp_cnt;
36#define DP(x) do { dp_cnt++; if (dp_cnt % 1000 == 0) x; }while(0)
37#else
38#define DP(x)
39#endif
40
41static char gpio_name[] = "etrax gpio";
42
43#if 0
44static wait_queue_head_t *gpio_wq;
45#endif
46
47static long gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
48static ssize_t gpio_write(struct file *file, const char __user *buf,
49 size_t count, loff_t *off);
50static int gpio_open(struct inode *inode, struct file *filp);
51static int gpio_release(struct inode *inode, struct file *filp);
52static unsigned int gpio_poll(struct file *filp, struct poll_table_struct *wait);
53
54/* private data per open() of this driver */
55
56struct gpio_private {
57 struct gpio_private *next;
58 /* These fields are for PA and PB only */
59 volatile unsigned char *port, *shadow;
60 volatile unsigned char *dir, *dir_shadow;
61 unsigned char changeable_dir;
62 unsigned char changeable_bits;
63 unsigned char clk_mask;
64 unsigned char data_mask;
65 unsigned char write_msb;
66 unsigned char pad1, pad2, pad3;
67 /* These fields are generic */
68 unsigned long highalarm, lowalarm;
69 wait_queue_head_t alarm_wq;
70 int minor;
71};
72
73/* linked list of alarms to check for */
74
75static struct gpio_private *alarmlist;
76
77static int gpio_some_alarms; /* Set if someone uses alarm */
78static unsigned long gpio_pa_irq_enabled_mask;
79
80static DEFINE_SPINLOCK(gpio_lock); /* Protect directions etc */
81
82/* Port A and B use 8 bit access, but Port G is 32 bit */
83#define NUM_PORTS (GPIO_MINOR_B+1)
84
85static volatile unsigned char *ports[NUM_PORTS] = {
86 R_PORT_PA_DATA,
87 R_PORT_PB_DATA,
88};
89static volatile unsigned char *shads[NUM_PORTS] = {
90 &port_pa_data_shadow,
91 &port_pb_data_shadow
92};
93
94/* What direction bits that are user changeable 1=changeable*/
95#ifndef CONFIG_ETRAX_PA_CHANGEABLE_DIR
96#define CONFIG_ETRAX_PA_CHANGEABLE_DIR 0x00
97#endif
98#ifndef CONFIG_ETRAX_PB_CHANGEABLE_DIR
99#define CONFIG_ETRAX_PB_CHANGEABLE_DIR 0x00
100#endif
101
102#ifndef CONFIG_ETRAX_PA_CHANGEABLE_BITS
103#define CONFIG_ETRAX_PA_CHANGEABLE_BITS 0xFF
104#endif
105#ifndef CONFIG_ETRAX_PB_CHANGEABLE_BITS
106#define CONFIG_ETRAX_PB_CHANGEABLE_BITS 0xFF
107#endif
108
109
110static unsigned char changeable_dir[NUM_PORTS] = {
111 CONFIG_ETRAX_PA_CHANGEABLE_DIR,
112 CONFIG_ETRAX_PB_CHANGEABLE_DIR
113};
114static unsigned char changeable_bits[NUM_PORTS] = {
115 CONFIG_ETRAX_PA_CHANGEABLE_BITS,
116 CONFIG_ETRAX_PB_CHANGEABLE_BITS
117};
118
119static volatile unsigned char *dir[NUM_PORTS] = {
120 R_PORT_PA_DIR,
121 R_PORT_PB_DIR
122};
123
124static volatile unsigned char *dir_shadow[NUM_PORTS] = {
125 &port_pa_dir_shadow,
126 &port_pb_dir_shadow
127};
128
129/* All bits in port g that can change dir. */
130static const unsigned long int changeable_dir_g_mask = 0x01FFFF01;
131
132/* Port G is 32 bit, handle it special, some bits are both inputs
133 and outputs at the same time, only some of the bits can change direction
134 and some of them in groups of 8 bit. */
135static unsigned long changeable_dir_g;
136static unsigned long dir_g_in_bits;
137static unsigned long dir_g_out_bits;
138static unsigned long dir_g_shadow; /* 1=output */
139
140#define USE_PORTS(priv) ((priv)->minor <= GPIO_MINOR_B)
141
142
143static unsigned int gpio_poll(struct file *file, poll_table *wait)
144{
145 unsigned int mask = 0;
146 struct gpio_private *priv = file->private_data;
147 unsigned long data;
148 unsigned long flags;
149
150 spin_lock_irqsave(&gpio_lock, flags);
151
152 poll_wait(file, &priv->alarm_wq, wait);
153 if (priv->minor == GPIO_MINOR_A) {
154 unsigned long tmp;
155 data = *R_PORT_PA_DATA;
156 /* PA has support for high level interrupt -
157 * lets activate for those low and with highalarm set
158 */
159 tmp = ~data & priv->highalarm & 0xFF;
160 tmp = (tmp << R_IRQ_MASK1_SET__pa0__BITNR);
161
162 gpio_pa_irq_enabled_mask |= tmp;
163 *R_IRQ_MASK1_SET = tmp;
164 } else if (priv->minor == GPIO_MINOR_B)
165 data = *R_PORT_PB_DATA;
166 else if (priv->minor == GPIO_MINOR_G)
167 data = *R_PORT_G_DATA;
168 else {
169 mask = 0;
170 goto out;
171 }
172
173 if ((data & priv->highalarm) ||
174 (~data & priv->lowalarm)) {
175 mask = POLLIN|POLLRDNORM;
176 }
177
178out:
179 spin_unlock_irqrestore(&gpio_lock, flags);
180 DP(printk("gpio_poll ready: mask 0x%08X\n", mask));
181
182 return mask;
183}
184
185int etrax_gpio_wake_up_check(void)
186{
187 struct gpio_private *priv;
188 unsigned long data = 0;
189 int ret = 0;
190 unsigned long flags;
191
192 spin_lock_irqsave(&gpio_lock, flags);
193 priv = alarmlist;
194 while (priv) {
195 if (USE_PORTS(priv))
196 data = *priv->port;
197 else if (priv->minor == GPIO_MINOR_G)
198 data = *R_PORT_G_DATA;
199
200 if ((data & priv->highalarm) ||
201 (~data & priv->lowalarm)) {
202 DP(printk("etrax_gpio_wake_up_check %i\n",priv->minor));
203 wake_up_interruptible(&priv->alarm_wq);
204 ret = 1;
205 }
206 priv = priv->next;
207 }
208 spin_unlock_irqrestore(&gpio_lock, flags);
209 return ret;
210}
211
212static irqreturn_t
213gpio_poll_timer_interrupt(int irq, void *dev_id)
214{
215 if (gpio_some_alarms) {
216 etrax_gpio_wake_up_check();
217 return IRQ_HANDLED;
218 }
219 return IRQ_NONE;
220}
221
222static irqreturn_t
223gpio_interrupt(int irq, void *dev_id)
224{
225 unsigned long tmp;
226 unsigned long flags;
227
228 spin_lock_irqsave(&gpio_lock, flags);
229
230 /* Find what PA interrupts are active */
231 tmp = (*R_IRQ_READ1);
232
233 /* Find those that we have enabled */
234 tmp &= gpio_pa_irq_enabled_mask;
235
236 /* Clear them.. */
237 *R_IRQ_MASK1_CLR = tmp;
238 gpio_pa_irq_enabled_mask &= ~tmp;
239
240 spin_unlock_irqrestore(&gpio_lock, flags);
241
242 if (gpio_some_alarms)
243 return IRQ_RETVAL(etrax_gpio_wake_up_check());
244
245 return IRQ_NONE;
246}
247
248static void gpio_write_bit(struct gpio_private *priv,
249 unsigned char data, int bit)
250{
251 *priv->port = *priv->shadow &= ~(priv->clk_mask);
252 if (data & 1 << bit)
253 *priv->port = *priv->shadow |= priv->data_mask;
254 else
255 *priv->port = *priv->shadow &= ~(priv->data_mask);
256
257 /* For FPGA: min 5.0ns (DCC) before CCLK high */
258 *priv->port = *priv->shadow |= priv->clk_mask;
259}
260
261static void gpio_write_byte(struct gpio_private *priv, unsigned char data)
262{
263 int i;
264
265 if (priv->write_msb)
266 for (i = 7; i >= 0; i--)
267 gpio_write_bit(priv, data, i);
268 else
269 for (i = 0; i <= 7; i++)
270 gpio_write_bit(priv, data, i);
271}
272
273static ssize_t gpio_write(struct file *file, const char __user *buf,
274 size_t count, loff_t *off)
275{
276 struct gpio_private *priv = file->private_data;
277 unsigned long flags;
278 ssize_t retval = count;
279
280 if (priv->minor != GPIO_MINOR_A && priv->minor != GPIO_MINOR_B)
281 return -EFAULT;
282
283 if (!access_ok(VERIFY_READ, buf, count))
284 return -EFAULT;
285
286 spin_lock_irqsave(&gpio_lock, flags);
287
288 /* It must have been configured using the IO_CFG_WRITE_MODE */
289 /* Perhaps a better error code? */
290 if (priv->clk_mask == 0 || priv->data_mask == 0) {
291 retval = -EPERM;
292 goto out;
293 }
294
295 D(printk(KERN_DEBUG "gpio_write: %02X to data 0x%02X "
296 "clk 0x%02X msb: %i\n",
297 count, priv->data_mask, priv->clk_mask, priv->write_msb));
298
299 while (count--)
300 gpio_write_byte(priv, *buf++);
301
302out:
303 spin_unlock_irqrestore(&gpio_lock, flags);
304 return retval;
305}
306
307
308
309static int
310gpio_open(struct inode *inode, struct file *filp)
311{
312 struct gpio_private *priv;
313 int p = iminor(inode);
314 unsigned long flags;
315
316 if (p > GPIO_MINOR_LAST)
317 return -EINVAL;
318
319 priv = kzalloc(sizeof(struct gpio_private), GFP_KERNEL);
320
321 if (!priv)
322 return -ENOMEM;
323
324 priv->minor = p;
325
326 /* initialize the io/alarm struct */
327
328 if (USE_PORTS(priv)) { /* A and B */
329 priv->port = ports[p];
330 priv->shadow = shads[p];
331 priv->dir = dir[p];
332 priv->dir_shadow = dir_shadow[p];
333 priv->changeable_dir = changeable_dir[p];
334 priv->changeable_bits = changeable_bits[p];
335 } else {
336 priv->port = NULL;
337 priv->shadow = NULL;
338 priv->dir = NULL;
339 priv->dir_shadow = NULL;
340 priv->changeable_dir = 0;
341 priv->changeable_bits = 0;
342 }
343
344 priv->highalarm = 0;
345 priv->lowalarm = 0;
346 priv->clk_mask = 0;
347 priv->data_mask = 0;
348 init_waitqueue_head(&priv->alarm_wq);
349
350 filp->private_data = priv;
351
352 /* link it into our alarmlist */
353 spin_lock_irqsave(&gpio_lock, flags);
354 priv->next = alarmlist;
355 alarmlist = priv;
356 spin_unlock_irqrestore(&gpio_lock, flags);
357
358 return 0;
359}
360
361static int
362gpio_release(struct inode *inode, struct file *filp)
363{
364 struct gpio_private *p;
365 struct gpio_private *todel;
366 unsigned long flags;
367
368 spin_lock_irqsave(&gpio_lock, flags);
369
370 p = alarmlist;
371 todel = filp->private_data;
372
373 /* unlink from alarmlist and free the private structure */
374
375 if (p == todel) {
376 alarmlist = todel->next;
377 } else {
378 while (p->next != todel)
379 p = p->next;
380 p->next = todel->next;
381 }
382
383 kfree(todel);
384 /* Check if there are still any alarms set */
385 p = alarmlist;
386 while (p) {
387 if (p->highalarm | p->lowalarm) {
388 gpio_some_alarms = 1;
389 goto out;
390 }
391 p = p->next;
392 }
393 gpio_some_alarms = 0;
394out:
395 spin_unlock_irqrestore(&gpio_lock, flags);
396 return 0;
397}
398
399/* Main device API. ioctl's to read/set/clear bits, as well as to
400 * set alarms to wait for using a subsequent select().
401 */
402unsigned long inline setget_input(struct gpio_private *priv, unsigned long arg)
403{
404 /* Set direction 0=unchanged 1=input,
405 * return mask with 1=input */
406 if (USE_PORTS(priv)) {
407 *priv->dir = *priv->dir_shadow &=
408 ~((unsigned char)arg & priv->changeable_dir);
409 return ~(*priv->dir_shadow) & 0xFF; /* Only 8 bits */
410 }
411
412 if (priv->minor != GPIO_MINOR_G)
413 return 0;
414
415 /* We must fiddle with R_GEN_CONFIG to change dir */
416 if (((arg & dir_g_in_bits) != arg) &&
417 (arg & changeable_dir_g)) {
418 arg &= changeable_dir_g;
419 /* Clear bits in genconfig to set to input */
420 if (arg & (1<<0)) {
421 genconfig_shadow &= ~IO_MASK(R_GEN_CONFIG, g0dir);
422 dir_g_in_bits |= (1<<0);
423 dir_g_out_bits &= ~(1<<0);
424 }
425 if ((arg & 0x0000FF00) == 0x0000FF00) {
426 genconfig_shadow &= ~IO_MASK(R_GEN_CONFIG, g8_15dir);
427 dir_g_in_bits |= 0x0000FF00;
428 dir_g_out_bits &= ~0x0000FF00;
429 }
430 if ((arg & 0x00FF0000) == 0x00FF0000) {
431 genconfig_shadow &= ~IO_MASK(R_GEN_CONFIG, g16_23dir);
432 dir_g_in_bits |= 0x00FF0000;
433 dir_g_out_bits &= ~0x00FF0000;
434 }
435 if (arg & (1<<24)) {
436 genconfig_shadow &= ~IO_MASK(R_GEN_CONFIG, g24dir);
437 dir_g_in_bits |= (1<<24);
438 dir_g_out_bits &= ~(1<<24);
439 }
440 D(printk(KERN_DEBUG "gpio: SETINPUT on port G set "
441 "genconfig to 0x%08lX "
442 "in_bits: 0x%08lX "
443 "out_bits: 0x%08lX\n",
444 (unsigned long)genconfig_shadow,
445 dir_g_in_bits, dir_g_out_bits));
446 *R_GEN_CONFIG = genconfig_shadow;
447 /* Must be a >120 ns delay before writing this again */
448
449 }
450 return dir_g_in_bits;
451} /* setget_input */
452
453unsigned long inline setget_output(struct gpio_private *priv, unsigned long arg)
454{
455 if (USE_PORTS(priv)) {
456 *priv->dir = *priv->dir_shadow |=
457 ((unsigned char)arg & priv->changeable_dir);
458 return *priv->dir_shadow;
459 }
460 if (priv->minor != GPIO_MINOR_G)
461 return 0;
462
463 /* We must fiddle with R_GEN_CONFIG to change dir */
464 if (((arg & dir_g_out_bits) != arg) &&
465 (arg & changeable_dir_g)) {
466 /* Set bits in genconfig to set to output */
467 if (arg & (1<<0)) {
468 genconfig_shadow |= IO_MASK(R_GEN_CONFIG, g0dir);
469 dir_g_out_bits |= (1<<0);
470 dir_g_in_bits &= ~(1<<0);
471 }
472 if ((arg & 0x0000FF00) == 0x0000FF00) {
473 genconfig_shadow |= IO_MASK(R_GEN_CONFIG, g8_15dir);
474 dir_g_out_bits |= 0x0000FF00;
475 dir_g_in_bits &= ~0x0000FF00;
476 }
477 if ((arg & 0x00FF0000) == 0x00FF0000) {
478 genconfig_shadow |= IO_MASK(R_GEN_CONFIG, g16_23dir);
479 dir_g_out_bits |= 0x00FF0000;
480 dir_g_in_bits &= ~0x00FF0000;
481 }
482 if (arg & (1<<24)) {
483 genconfig_shadow |= IO_MASK(R_GEN_CONFIG, g24dir);
484 dir_g_out_bits |= (1<<24);
485 dir_g_in_bits &= ~(1<<24);
486 }
487 D(printk(KERN_INFO "gpio: SETOUTPUT on port G set "
488 "genconfig to 0x%08lX "
489 "in_bits: 0x%08lX "
490 "out_bits: 0x%08lX\n",
491 (unsigned long)genconfig_shadow,
492 dir_g_in_bits, dir_g_out_bits));
493 *R_GEN_CONFIG = genconfig_shadow;
494 /* Must be a >120 ns delay before writing this again */
495 }
496 return dir_g_out_bits & 0x7FFFFFFF;
497} /* setget_output */
498
499static int
500gpio_leds_ioctl(unsigned int cmd, unsigned long arg);
501
502static long gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
503{
504 unsigned long flags;
505 unsigned long val;
506 int ret = 0;
507
508 struct gpio_private *priv = file->private_data;
509 if (_IOC_TYPE(cmd) != ETRAXGPIO_IOCTYPE)
510 return -EINVAL;
511
512 switch (_IOC_NR(cmd)) {
513 case IO_READBITS: /* Use IO_READ_INBITS and IO_READ_OUTBITS instead */
514 // read the port
515 spin_lock_irqsave(&gpio_lock, flags);
516 if (USE_PORTS(priv)) {
517 ret = *priv->port;
518 } else if (priv->minor == GPIO_MINOR_G) {
519 ret = (*R_PORT_G_DATA) & 0x7FFFFFFF;
520 }
521 spin_unlock_irqrestore(&gpio_lock, flags);
522
523 break;
524 case IO_SETBITS:
525 // set changeable bits with a 1 in arg
526 spin_lock_irqsave(&gpio_lock, flags);
527
528 if (USE_PORTS(priv)) {
529 *priv->port = *priv->shadow |=
530 ((unsigned char)arg & priv->changeable_bits);
531 } else if (priv->minor == GPIO_MINOR_G) {
532 *R_PORT_G_DATA = port_g_data_shadow |= (arg & dir_g_out_bits);
533 }
534 spin_unlock_irqrestore(&gpio_lock, flags);
535
536 break;
537 case IO_CLRBITS:
538 // clear changeable bits with a 1 in arg
539 spin_lock_irqsave(&gpio_lock, flags);
540 if (USE_PORTS(priv)) {
541 *priv->port = *priv->shadow &=
542 ~((unsigned char)arg & priv->changeable_bits);
543 } else if (priv->minor == GPIO_MINOR_G) {
544 *R_PORT_G_DATA = port_g_data_shadow &= ~((unsigned long)arg & dir_g_out_bits);
545 }
546 spin_unlock_irqrestore(&gpio_lock, flags);
547 break;
548 case IO_HIGHALARM:
549 // set alarm when bits with 1 in arg go high
550 spin_lock_irqsave(&gpio_lock, flags);
551 priv->highalarm |= arg;
552 gpio_some_alarms = 1;
553 spin_unlock_irqrestore(&gpio_lock, flags);
554 break;
555 case IO_LOWALARM:
556 // set alarm when bits with 1 in arg go low
557 spin_lock_irqsave(&gpio_lock, flags);
558 priv->lowalarm |= arg;
559 gpio_some_alarms = 1;
560 spin_unlock_irqrestore(&gpio_lock, flags);
561 break;
562 case IO_CLRALARM:
563 /* clear alarm for bits with 1 in arg */
564 spin_lock_irqsave(&gpio_lock, flags);
565 priv->highalarm &= ~arg;
566 priv->lowalarm &= ~arg;
567 {
568 /* Must update gpio_some_alarms */
569 struct gpio_private *p = alarmlist;
570 int some_alarms;
571 p = alarmlist;
572 some_alarms = 0;
573 while (p) {
574 if (p->highalarm | p->lowalarm) {
575 some_alarms = 1;
576 break;
577 }
578 p = p->next;
579 }
580 gpio_some_alarms = some_alarms;
581 }
582 spin_unlock_irqrestore(&gpio_lock, flags);
583 break;
584 case IO_READDIR: /* Use IO_SETGET_INPUT/OUTPUT instead! */
585 /* Read direction 0=input 1=output */
586 spin_lock_irqsave(&gpio_lock, flags);
587 if (USE_PORTS(priv)) {
588 ret = *priv->dir_shadow;
589 } else if (priv->minor == GPIO_MINOR_G) {
590 /* Note: Some bits are both in and out,
591 * Those that are dual is set here as well.
592 */
593 ret = (dir_g_shadow | dir_g_out_bits) & 0x7FFFFFFF;
594 }
595 spin_unlock_irqrestore(&gpio_lock, flags);
596 break;
597 case IO_SETINPUT: /* Use IO_SETGET_INPUT instead! */
598 /* Set direction 0=unchanged 1=input,
599 * return mask with 1=input
600 */
601 spin_lock_irqsave(&gpio_lock, flags);
602 ret = setget_input(priv, arg) & 0x7FFFFFFF;
603 spin_unlock_irqrestore(&gpio_lock, flags);
604 break;
605 case IO_SETOUTPUT: /* Use IO_SETGET_OUTPUT instead! */
606 /* Set direction 0=unchanged 1=output,
607 * return mask with 1=output
608 */
609 spin_lock_irqsave(&gpio_lock, flags);
610 ret = setget_output(priv, arg) & 0x7FFFFFFF;
611 spin_unlock_irqrestore(&gpio_lock, flags);
612 break;
613 case IO_SHUTDOWN:
614 spin_lock_irqsave(&gpio_lock, flags);
615 SOFT_SHUTDOWN();
616 spin_unlock_irqrestore(&gpio_lock, flags);
617 break;
618 case IO_GET_PWR_BT:
619 spin_lock_irqsave(&gpio_lock, flags);
620#if defined (CONFIG_ETRAX_SOFT_SHUTDOWN)
621 ret = (*R_PORT_G_DATA & ( 1 << CONFIG_ETRAX_POWERBUTTON_BIT));
622#else
623 ret = 0;
624#endif
625 spin_unlock_irqrestore(&gpio_lock, flags);
626 break;
627 case IO_CFG_WRITE_MODE:
628 spin_lock_irqsave(&gpio_lock, flags);
629 priv->clk_mask = arg & 0xFF;
630 priv->data_mask = (arg >> 8) & 0xFF;
631 priv->write_msb = (arg >> 16) & 0x01;
632 /* Check if we're allowed to change the bits and
633 * the direction is correct
634 */
635 if (!((priv->clk_mask & priv->changeable_bits) &&
636 (priv->data_mask & priv->changeable_bits) &&
637 (priv->clk_mask & *priv->dir_shadow) &&
638 (priv->data_mask & *priv->dir_shadow)))
639 {
640 priv->clk_mask = 0;
641 priv->data_mask = 0;
642 ret = -EPERM;
643 }
644 spin_unlock_irqrestore(&gpio_lock, flags);
645 break;
646 case IO_READ_INBITS:
647 /* *arg is result of reading the input pins */
648 spin_lock_irqsave(&gpio_lock, flags);
649 if (USE_PORTS(priv)) {
650 val = *priv->port;
651 } else if (priv->minor == GPIO_MINOR_G) {
652 val = *R_PORT_G_DATA;
653 }
654 spin_unlock_irqrestore(&gpio_lock, flags);
655 if (copy_to_user((void __user *)arg, &val, sizeof(val)))
656 ret = -EFAULT;
657 break;
658 case IO_READ_OUTBITS:
659 /* *arg is result of reading the output shadow */
660 spin_lock_irqsave(&gpio_lock, flags);
661 if (USE_PORTS(priv)) {
662 val = *priv->shadow;
663 } else if (priv->minor == GPIO_MINOR_G) {
664 val = port_g_data_shadow;
665 }
666 spin_unlock_irqrestore(&gpio_lock, flags);
667 if (copy_to_user((void __user *)arg, &val, sizeof(val)))
668 ret = -EFAULT;
669 break;
670 case IO_SETGET_INPUT:
671 /* bits set in *arg is set to input,
672 * *arg updated with current input pins.
673 */
674 if (copy_from_user(&val, (void __user *)arg, sizeof(val)))
675 {
676 ret = -EFAULT;
677 break;
678 }
679 spin_lock_irqsave(&gpio_lock, flags);
680 val = setget_input(priv, val);
681 spin_unlock_irqrestore(&gpio_lock, flags);
682 if (copy_to_user((void __user *)arg, &val, sizeof(val)))
683 ret = -EFAULT;
684 break;
685 case IO_SETGET_OUTPUT:
686 /* bits set in *arg is set to output,
687 * *arg updated with current output pins.
688 */
689 if (copy_from_user(&val, (void __user *)arg, sizeof(val))) {
690 ret = -EFAULT;
691 break;
692 }
693 spin_lock_irqsave(&gpio_lock, flags);
694 val = setget_output(priv, val);
695 spin_unlock_irqrestore(&gpio_lock, flags);
696 if (copy_to_user((void __user *)arg, &val, sizeof(val)))
697 ret = -EFAULT;
698 break;
699 default:
700 spin_lock_irqsave(&gpio_lock, flags);
701 if (priv->minor == GPIO_MINOR_LEDS)
702 ret = gpio_leds_ioctl(cmd, arg);
703 else
704 ret = -EINVAL;
705 spin_unlock_irqrestore(&gpio_lock, flags);
706 } /* switch */
707
708 return ret;
709}
710
711static int
712gpio_leds_ioctl(unsigned int cmd, unsigned long arg)
713{
714 unsigned char green;
715 unsigned char red;
716
717 switch (_IOC_NR(cmd)) {
718 case IO_LEDACTIVE_SET:
719 green = ((unsigned char)arg) & 1;
720 red = (((unsigned char)arg) >> 1) & 1;
721 CRIS_LED_ACTIVE_SET_G(green);
722 CRIS_LED_ACTIVE_SET_R(red);
723 break;
724
725 case IO_LED_SETBIT:
726 CRIS_LED_BIT_SET(arg);
727 break;
728
729 case IO_LED_CLRBIT:
730 CRIS_LED_BIT_CLR(arg);
731 break;
732
733 default:
734 return -EINVAL;
735 } /* switch */
736
737 return 0;
738}
739
740static const struct file_operations gpio_fops = {
741 .owner = THIS_MODULE,
742 .poll = gpio_poll,
743 .unlocked_ioctl = gpio_ioctl,
744 .write = gpio_write,
745 .open = gpio_open,
746 .release = gpio_release,
747 .llseek = noop_llseek,
748};
749
750static void ioif_watcher(const unsigned int gpio_in_available,
751 const unsigned int gpio_out_available,
752 const unsigned char pa_available,
753 const unsigned char pb_available)
754{
755 unsigned long int flags;
756
757 D(printk(KERN_DEBUG "gpio.c: ioif_watcher called\n"));
758 D(printk(KERN_DEBUG "gpio.c: G in: 0x%08x G out: 0x%08x "
759 "PA: 0x%02x PB: 0x%02x\n",
760 gpio_in_available, gpio_out_available,
761 pa_available, pb_available));
762
763 spin_lock_irqsave(&gpio_lock, flags);
764
765 dir_g_in_bits = gpio_in_available;
766 dir_g_out_bits = gpio_out_available;
767
768 /* Initialise the dir_g_shadow etc. depending on genconfig */
769 /* 0=input 1=output */
770 if (genconfig_shadow & IO_STATE(R_GEN_CONFIG, g0dir, out))
771 dir_g_shadow |= (1 << 0);
772 if (genconfig_shadow & IO_STATE(R_GEN_CONFIG, g8_15dir, out))
773 dir_g_shadow |= 0x0000FF00;
774 if (genconfig_shadow & IO_STATE(R_GEN_CONFIG, g16_23dir, out))
775 dir_g_shadow |= 0x00FF0000;
776 if (genconfig_shadow & IO_STATE(R_GEN_CONFIG, g24dir, out))
777 dir_g_shadow |= (1 << 24);
778
779 changeable_dir_g = changeable_dir_g_mask;
780 changeable_dir_g &= dir_g_out_bits;
781 changeable_dir_g &= dir_g_in_bits;
782
783 /* Correct the bits that can change direction */
784 dir_g_out_bits &= ~changeable_dir_g;
785 dir_g_out_bits |= dir_g_shadow;
786 dir_g_in_bits &= ~changeable_dir_g;
787 dir_g_in_bits |= (~dir_g_shadow & changeable_dir_g);
788
789 spin_unlock_irqrestore(&gpio_lock, flags);
790
791 printk(KERN_INFO "GPIO port G: in_bits: 0x%08lX out_bits: 0x%08lX "
792 "val: %08lX\n",
793 dir_g_in_bits, dir_g_out_bits, (unsigned long)*R_PORT_G_DATA);
794 printk(KERN_INFO "GPIO port G: dir: %08lX changeable: %08lX\n",
795 dir_g_shadow, changeable_dir_g);
796}
797
798/* main driver initialization routine, called from mem.c */
799
800static int __init gpio_init(void)
801{
802 int res;
803#if defined (CONFIG_ETRAX_CSP0_LEDS)
804 int i;
805#endif
806
807 res = register_chrdev(GPIO_MAJOR, gpio_name, &gpio_fops);
808 if (res < 0) {
809 printk(KERN_ERR "gpio: couldn't get a major number.\n");
810 return res;
811 }
812
813 /* Clear all leds */
814#if defined (CONFIG_ETRAX_CSP0_LEDS) || defined (CONFIG_ETRAX_PA_LEDS) || defined (CONFIG_ETRAX_PB_LEDS)
815 CRIS_LED_NETWORK_SET(0);
816 CRIS_LED_ACTIVE_SET(0);
817 CRIS_LED_DISK_READ(0);
818 CRIS_LED_DISK_WRITE(0);
819
820#if defined (CONFIG_ETRAX_CSP0_LEDS)
821 for (i = 0; i < 32; i++)
822 CRIS_LED_BIT_SET(i);
823#endif
824
825#endif
826 /* The I/O interface allocation watcher will be called when
827 * registering it. */
828 if (cris_io_interface_register_watcher(ioif_watcher)){
829 printk(KERN_WARNING "gpio_init: Failed to install IO "
830 "if allocator watcher\n");
831 }
832
833 printk(KERN_INFO "ETRAX 100LX GPIO driver v2.5, (c) 2001-2008 "
834 "Axis Communications AB\n");
835 /* We call etrax_gpio_wake_up_check() from timer interrupt and
836 * from default_idle() in kernel/process.c
837 * The check in default_idle() reduces latency from ~15 ms to ~6 ms
838 * in some tests.
839 */
840 res = request_irq(TIMER0_IRQ_NBR, gpio_poll_timer_interrupt,
841 IRQF_SHARED, "gpio poll", gpio_name);
842 if (res) {
843 printk(KERN_CRIT "err: timer0 irq for gpio\n");
844 return res;
845 }
846 res = request_irq(PA_IRQ_NBR, gpio_interrupt,
847 IRQF_SHARED, "gpio PA", gpio_name);
848 if (res)
849 printk(KERN_CRIT "err: PA irq for gpio\n");
850
851 return res;
852}
853
854/* this makes sure that gpio_init is called during kernel boot */
855module_init(gpio_init);
856