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>
11 #include <linux/module.h>
12 #include <linux/errno.h>
13 #include <linux/kernel.h>
14 #include <linux/init.h>
15 #include <linux/nsc_gpio.h>
16 #include <linux/platform_device.h>
17 #include <linux/uaccess.h>
20 #define NAME "nsc_gpio"
22 void nsc_gpio_dump(struct nsc_gpio_ops
*amp
, unsigned index
)
24 /* retrieve current config w/o changing it */
25 u32 config
= amp
->gpio_config(index
, ~0, 0);
27 /* user requested via 'v' command, so its INFO */
28 dev_info(amp
->dev
, "io%02u: 0x%04x %s %s %s %s %s %s %s\tio:%d/%d\n",
30 (config
& 1) ? "OE" : "TS", /* output-enabled/tristate */
31 (config
& 2) ? "PP" : "OD", /* push pull / open drain */
32 (config
& 4) ? "PUE" : "PUD", /* pull up enabled/disabled */
33 (config
& 8) ? "LOCKED" : "", /* locked / unlocked */
34 (config
& 16) ? "LEVEL" : "EDGE",/* level/edge input */
35 (config
& 32) ? "HI" : "LO", /* trigger on rise/fall edge */
36 (config
& 64) ? "DEBOUNCE" : "", /* debounce */
38 amp
->gpio_get(index
), amp
->gpio_current(index
));
41 ssize_t
nsc_gpio_write(struct file
*file
, const char __user
*data
,
42 size_t len
, loff_t
*ppos
)
44 unsigned m
= iminor(file_inode(file
));
45 struct nsc_gpio_ops
*amp
= file
->private_data
;
46 struct device
*dev
= amp
->dev
;
50 for (i
= 0; i
< len
; ++i
) {
52 if (get_user(c
, data
+ i
))
62 dev_dbg(dev
, "GPIO%d output enabled\n", m
);
63 amp
->gpio_config(m
, ~1, 1);
66 dev_dbg(dev
, "GPIO%d output disabled\n", m
);
67 amp
->gpio_config(m
, ~1, 0);
70 dev_dbg(dev
, "GPIO%d output is push pull\n", m
);
71 amp
->gpio_config(m
, ~2, 2);
74 dev_dbg(dev
, "GPIO%d output is open drain\n", m
);
75 amp
->gpio_config(m
, ~2, 0);
78 dev_dbg(dev
, "GPIO%d pull up enabled\n", m
);
79 amp
->gpio_config(m
, ~4, 4);
82 dev_dbg(dev
, "GPIO%d pull up disabled\n", m
);
83 amp
->gpio_config(m
, ~4, 0);
86 /* View Current pin settings */
87 amp
->gpio_dump(amp
, m
);
90 /* end of settings string, do nothing */
93 dev_err(dev
, "io%2d bad setting: chr<0x%2x>\n",
99 return -EINVAL
; /* full string handled, report error */
104 ssize_t
nsc_gpio_read(struct file
*file
, char __user
* buf
,
105 size_t len
, loff_t
* ppos
)
107 unsigned m
= iminor(file_inode(file
));
109 struct nsc_gpio_ops
*amp
= file
->private_data
;
111 value
= amp
->gpio_get(m
);
112 if (put_user(value
? '1' : '0', buf
))
118 /* common file-ops routines for both scx200_gpio and pc87360_gpio */
119 EXPORT_SYMBOL(nsc_gpio_write
);
120 EXPORT_SYMBOL(nsc_gpio_read
);
121 EXPORT_SYMBOL(nsc_gpio_dump
);
123 static int __init
nsc_gpio_init(void)
125 printk(KERN_DEBUG NAME
" initializing\n");
129 static void __exit
nsc_gpio_cleanup(void)
131 printk(KERN_DEBUG NAME
" cleanup\n");
134 module_init(nsc_gpio_init
);
135 module_exit(nsc_gpio_cleanup
);
137 MODULE_AUTHOR("Jim Cromie <jim.cromie@gmail.com>");
138 MODULE_DESCRIPTION("NatSemi GPIO Common Methods");
139 MODULE_LICENSE("GPL");