1 /* linux/drivers/char/nsc_gpio.c
3 National Semiconductor common GPIO device-file/VFS methods.
4 Allows a user space process to control the GPIO pins.
6 Copyright (c) 2001,2002 Christer Weinigel <wingel@nano-system.com>
7 Copyright (c) 2005 Jim Cromie <jim.cromie@gmail.com>
10 #include <linux/config.h>
12 #include <linux/module.h>
13 #include <linux/errno.h>
14 #include <linux/kernel.h>
15 #include <linux/init.h>
16 #include <linux/nsc_gpio.h>
17 #include <linux/platform_device.h>
18 #include <asm/uaccess.h>
21 #define NAME "nsc_gpio"
23 void nsc_gpio_dump(struct nsc_gpio_ops
*amp
, unsigned index
)
25 /* retrieve current config w/o changing it */
26 u32 config
= amp
->gpio_config(index
, ~0, 0);
28 /* user requested via 'v' command, so its INFO */
29 dev_info(amp
->dev
, "io%02u: 0x%04x %s %s %s %s %s %s %s\tio:%d/%d\n",
31 (config
& 1) ? "OE" : "TS", /* output-enabled/tristate */
32 (config
& 2) ? "PP" : "OD", /* push pull / open drain */
33 (config
& 4) ? "PUE" : "PUD", /* pull up enabled/disabled */
34 (config
& 8) ? "LOCKED" : "", /* locked / unlocked */
35 (config
& 16) ? "LEVEL" : "EDGE",/* level/edge input */
36 (config
& 32) ? "HI" : "LO", /* trigger on rise/fall edge */
37 (config
& 64) ? "DEBOUNCE" : "", /* debounce */
39 amp
->gpio_get(index
), amp
->gpio_current(index
));
42 ssize_t
nsc_gpio_write(struct file
*file
, const char __user
*data
,
43 size_t len
, loff_t
*ppos
)
45 unsigned m
= iminor(file
->f_dentry
->d_inode
);
46 struct nsc_gpio_ops
*amp
= file
->private_data
;
47 struct device
*dev
= amp
->dev
;
51 for (i
= 0; i
< len
; ++i
) {
53 if (get_user(c
, data
+ i
))
63 dev_dbg(dev
, "GPIO%d output enabled\n", m
);
64 amp
->gpio_config(m
, ~1, 1);
67 dev_dbg(dev
, "GPIO%d output disabled\n", m
);
68 amp
->gpio_config(m
, ~1, 0);
71 dev_dbg(dev
, "GPIO%d output is push pull\n",
73 amp
->gpio_config(m
, ~2, 2);
76 dev_dbg(dev
, "GPIO%d output is open drain\n",
78 amp
->gpio_config(m
, ~2, 0);
81 dev_dbg(dev
, "GPIO%d pull up enabled\n", m
);
82 amp
->gpio_config(m
, ~4, 4);
85 dev_dbg(dev
, "GPIO%d pull up disabled\n", m
);
86 amp
->gpio_config(m
, ~4, 0);
89 /* View Current pin settings */
90 amp
->gpio_dump(amp
, m
);
93 /* end of settings string, do nothing */
96 dev_err(dev
, "io%2d bad setting: chr<0x%2x>\n",
102 return -EINVAL
; /* full string handled, report error */
107 ssize_t
nsc_gpio_read(struct file
*file
, char __user
* buf
,
108 size_t len
, loff_t
* ppos
)
110 unsigned m
= iminor(file
->f_dentry
->d_inode
);
112 struct nsc_gpio_ops
*amp
= file
->private_data
;
114 value
= amp
->gpio_get(m
);
115 if (put_user(value
? '1' : '0', buf
))
121 /* common file-ops routines for both scx200_gpio and pc87360_gpio */
122 EXPORT_SYMBOL(nsc_gpio_write
);
123 EXPORT_SYMBOL(nsc_gpio_read
);
124 EXPORT_SYMBOL(nsc_gpio_dump
);
126 static int __init
nsc_gpio_init(void)
128 printk(KERN_DEBUG NAME
" initializing\n");
132 static void __exit
nsc_gpio_cleanup(void)
134 printk(KERN_DEBUG NAME
" cleanup\n");
137 module_init(nsc_gpio_init
);
138 module_exit(nsc_gpio_cleanup
);
140 MODULE_AUTHOR("Jim Cromie <jim.cromie@gmail.com>");
141 MODULE_DESCRIPTION("NatSemi GPIO Common Methods");
142 MODULE_LICENSE("GPL");