ite_gpio.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. /*
  2. * FILE NAME ite_gpio.c
  3. *
  4. * BRIEF MODULE DESCRIPTION
  5. * API for ITE GPIO device.
  6. * Driver for ITE GPIO device.
  7. *
  8. * Author: MontaVista Software, Inc. <source@mvista.com>
  9. * Hai-Pao Fan <haipao@mvista.com>
  10. *
  11. * Copyright 2001 MontaVista Software Inc.
  12. *
  13. * This program is free software; you can redistribute it and/or modify it
  14. * under the terms of the GNU General Public License as published by the
  15. * Free Software Foundation; either version 2 of the License, or (at your
  16. * option) any later version.
  17. *
  18. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
  19. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  20. * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
  21. * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  22. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  23. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  24. * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  25. * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  26. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  27. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28. *
  29. * You should have received a copy of the GNU General Public License along
  30. * with this program; if not, write to the Free Software Foundation, Inc.,
  31. * 675 Mass Ave, Cambridge, MA 02139, USA.
  32. */
  33. #include <linux/module.h>
  34. #include <linux/types.h>
  35. #include <linux/kernel.h>
  36. #include <linux/miscdevice.h>
  37. #include <linux/init.h>
  38. #include <linux/ioport.h>
  39. #include <asm/uaccess.h>
  40. #include <asm/addrspace.h>
  41. #include <asm/it8172/it8172_int.h>
  42. #include <linux/sched.h>
  43. #include <linux/ite_gpio.h>
  44. #define ite_gpio_base 0x14013800
  45. #define ITE_GPADR (*(volatile __u8 *)(0x14013800 + KSEG1))
  46. #define ITE_GPBDR (*(volatile __u8 *)(0x14013808 + KSEG1))
  47. #define ITE_GPCDR (*(volatile __u8 *)(0x14013810 + KSEG1))
  48. #define ITE_GPACR (*(volatile __u16 *)(0x14013802 + KSEG1))
  49. #define ITE_GPBCR (*(volatile __u16 *)(0x1401380a + KSEG1))
  50. #define ITE_GPCCR (*(volatile __u16 *)(0x14013812 + KSEG1))
  51. #define ITE_GPAICR (*(volatile __u16 *)(0x14013804 + KSEG1))
  52. #define ITE_GPBICR (*(volatile __u16 *)(0x1401380c + KSEG1))
  53. #define ITE_GPCICR (*(volatile __u16 *)(0x14013814 + KSEG1))
  54. #define ITE_GPAISR (*(volatile __u8 *)(0x14013806 + KSEG1))
  55. #define ITE_GPBISR (*(volatile __u8 *)(0x1401380e + KSEG1))
  56. #define ITE_GPCISR (*(volatile __u8 *)(0x14013816 + KSEG1))
  57. #define ITE_GCR (*(volatile __u8 *)(0x14013818 + KSEG1))
  58. #define MAX_GPIO_LINE 21
  59. static int ite_gpio_irq=IT8172_GPIO_IRQ;
  60. static long ite_irq_counter[MAX_GPIO_LINE];
  61. wait_queue_head_t ite_gpio_wait[MAX_GPIO_LINE];
  62. static int ite_gpio_irq_pending[MAX_GPIO_LINE];
  63. static int ite_gpio_debug=0;
  64. #define DEB(x) if (ite_gpio_debug>=1) x
  65. int ite_gpio_in(__u32 device, __u32 mask, volatile __u32 *data)
  66. {
  67. DEB(printk("ite_gpio_in mask=0x%x\n",mask));
  68. switch (device) {
  69. case ITE_GPIO_PORTA:
  70. ITE_GPACR = (__u16)mask; /* 0xffff */
  71. *data = ITE_GPADR;
  72. break;
  73. case ITE_GPIO_PORTB:
  74. ITE_GPBCR = (__u16)mask; /* 0xffff */
  75. *data = ITE_GPBDR;
  76. break;
  77. case ITE_GPIO_PORTC:
  78. ITE_GPCCR = (__u16)mask; /* 0x03ff */
  79. *data = ITE_GPCDR;
  80. break;
  81. default:
  82. return -EFAULT;
  83. }
  84. return 0;
  85. }
  86. int ite_gpio_out(__u32 device, __u32 mask, __u32 data)
  87. {
  88. switch (device) {
  89. case ITE_GPIO_PORTA:
  90. ITE_GPACR = (__u16)mask; /* 0x5555 */
  91. ITE_GPADR = (__u8)data;
  92. break;
  93. case ITE_GPIO_PORTB:
  94. ITE_GPBCR = (__u16)mask; /* 0x5555 */
  95. ITE_GPBDR = (__u8)data;
  96. break;
  97. case ITE_GPIO_PORTC:
  98. ITE_GPCCR = (__u16)mask; /* 0x0155 */
  99. ITE_GPCDR = (__u8)data;
  100. break;
  101. default:
  102. return -EFAULT;
  103. }
  104. return 0;
  105. }
  106. int ite_gpio_int_ctrl(__u32 device, __u32 mask, __u32 data)
  107. {
  108. switch (device) {
  109. case ITE_GPIO_PORTA:
  110. ITE_GPAICR = (ITE_GPAICR & ~mask) | (data & mask);
  111. break;
  112. case ITE_GPIO_PORTB:
  113. ITE_GPBICR = (ITE_GPBICR & ~mask) | (data & mask);
  114. break;
  115. case ITE_GPIO_PORTC:
  116. ITE_GPCICR = (ITE_GPCICR & ~mask) | (data & mask);
  117. break;
  118. default:
  119. return -EFAULT;
  120. }
  121. return 0;
  122. }
  123. int ite_gpio_in_status(__u32 device, __u32 mask, volatile __u32 *data)
  124. {
  125. int ret=-1;
  126. if ((MAX_GPIO_LINE > *data) && (*data >= 0))
  127. ret=ite_gpio_irq_pending[*data];
  128. DEB(printk("ite_gpio_in_status %d ret=%d\n",*data, ret));
  129. switch (device) {
  130. case ITE_GPIO_PORTA:
  131. *data = ITE_GPAISR & mask;
  132. break;
  133. case ITE_GPIO_PORTB:
  134. *data = ITE_GPBISR & mask;
  135. break;
  136. case ITE_GPIO_PORTC:
  137. *data = ITE_GPCISR & mask;
  138. break;
  139. default:
  140. return -EFAULT;
  141. }
  142. return ret;
  143. }
  144. int ite_gpio_out_status(__u32 device, __u32 mask, __u32 data)
  145. {
  146. switch (device) {
  147. case ITE_GPIO_PORTA:
  148. ITE_GPAISR = (ITE_GPAISR & ~mask) | (data & mask);
  149. break;
  150. case ITE_GPIO_PORTB:
  151. ITE_GPBISR = (ITE_GPBISR & ~mask) | (data & mask);
  152. break;
  153. case ITE_GPIO_PORTC:
  154. ITE_GPCISR = (ITE_GPCISR & ~mask) | (data & mask);
  155. break;
  156. default:
  157. return -EFAULT;
  158. }
  159. return 0;
  160. }
  161. int ite_gpio_gen_ctrl(__u32 device, __u32 mask, __u32 data)
  162. {
  163. ITE_GCR = (ITE_GCR & ~mask) | (data & mask);
  164. return 0;
  165. }
  166. int ite_gpio_int_wait (__u32 device, __u32 mask, __u32 data)
  167. {
  168. int i,line=0, ret=0;
  169. unsigned long flags;
  170. switch (device) {
  171. case ITE_GPIO_PORTA:
  172. line = data & mask;
  173. break;
  174. case ITE_GPIO_PORTB:
  175. line = (data & mask) <<8;
  176. break;
  177. case ITE_GPIO_PORTC:
  178. line = (data & mask) <<16;
  179. break;
  180. }
  181. for (i=MAX_GPIO_LINE-1; i >= 0; i--) {
  182. if ( (line) & (1 << i))
  183. break;
  184. }
  185. DEB(printk("wait device=0x%d mask=0x%x data=0x%x index %d\n",
  186. device, mask, data, i));
  187. if (line & ~(1<<i))
  188. return -EFAULT;
  189. if (ite_gpio_irq_pending[i]==1)
  190. return -EFAULT;
  191. save_flags (flags);
  192. cli();
  193. ite_gpio_irq_pending[i] = 1;
  194. ret = interruptible_sleep_on_timeout(&ite_gpio_wait[i], 3*HZ);
  195. restore_flags (flags);
  196. ite_gpio_irq_pending[i] = 0;
  197. return ret;
  198. }
  199. EXPORT_SYMBOL(ite_gpio_in);
  200. EXPORT_SYMBOL(ite_gpio_out);
  201. EXPORT_SYMBOL(ite_gpio_int_ctrl);
  202. EXPORT_SYMBOL(ite_gpio_in_status);
  203. EXPORT_SYMBOL(ite_gpio_out_status);
  204. EXPORT_SYMBOL(ite_gpio_gen_ctrl);
  205. EXPORT_SYMBOL(ite_gpio_int_wait);
  206. static int ite_gpio_open(struct inode *inode, struct file *file)
  207. {
  208. return 0;
  209. }
  210. static int ite_gpio_release(struct inode *inode, struct file *file)
  211. {
  212. return 0;
  213. }
  214. static int ite_gpio_ioctl(struct inode *inode, struct file *file,
  215. unsigned int cmd, unsigned long arg)
  216. {
  217. static struct ite_gpio_ioctl_data ioctl_data;
  218. if (copy_from_user(&ioctl_data, (struct ite_gpio_ioctl_data *)arg,
  219. sizeof(ioctl_data)))
  220. return -EFAULT;
  221. if ((ioctl_data.device < ITE_GPIO_PORTA) ||
  222. (ioctl_data.device > ITE_GPIO_PORTC) )
  223. return -EFAULT;
  224. switch(cmd) {
  225. case ITE_GPIO_IN:
  226. if (ite_gpio_in(ioctl_data.device, ioctl_data.mask,
  227. &ioctl_data.data))
  228. return -EFAULT;
  229. if (copy_to_user((struct ite_gpio_ioctl_data *)arg,
  230. &ioctl_data, sizeof(ioctl_data)))
  231. return -EFAULT;
  232. break;
  233. case ITE_GPIO_OUT:
  234. return ite_gpio_out(ioctl_data.device,
  235. ioctl_data.mask, ioctl_data.data);
  236. break;
  237. case ITE_GPIO_INT_CTRL:
  238. return ite_gpio_int_ctrl(ioctl_data.device,
  239. ioctl_data.mask, ioctl_data.data);
  240. break;
  241. case ITE_GPIO_IN_STATUS:
  242. if (ite_gpio_in_status(ioctl_data.device, ioctl_data.mask,
  243. &ioctl_data.data))
  244. return -EFAULT;
  245. if (copy_to_user((struct ite_gpio_ioctl_data *)arg,
  246. &ioctl_data, sizeof(ioctl_data)))
  247. return -EFAULT;
  248. break;
  249. case ITE_GPIO_OUT_STATUS:
  250. return ite_gpio_out_status(ioctl_data.device,
  251. ioctl_data.mask, ioctl_data.data);
  252. break;
  253. case ITE_GPIO_GEN_CTRL:
  254. return ite_gpio_gen_ctrl(ioctl_data.device,
  255. ioctl_data.mask, ioctl_data.data);
  256. break;
  257. case ITE_GPIO_INT_WAIT:
  258. return ite_gpio_int_wait(ioctl_data.device,
  259. ioctl_data.mask, ioctl_data.data);
  260. break;
  261. default:
  262. return -ENOIOCTLCMD;
  263. }
  264. return 0;
  265. }
  266. static void ite_gpio_irq_handler(int this_irq, void *dev_id,
  267. struct pt_regs *regs)
  268. {
  269. int i,line;
  270. line = ITE_GPCISR & 0x1f;
  271. for (i=4; i >=0; i--) {
  272. if ( line & (1 << i)) {
  273. ++ite_irq_counter[i+16];
  274. ite_gpio_irq_pending[i+16] = 2;
  275. wake_up_interruptible(&ite_gpio_wait[i+16]);
  276. DEB(printk("interrupt 0x%x %d\n", &ite_gpio_wait[i+16], i+16));
  277. ITE_GPCISR = ITE_GPCISR & (1<<i);
  278. return;
  279. }
  280. }
  281. line = ITE_GPBISR;
  282. for (i=7; i >= 0; i--) {
  283. if ( line & (1 << i)) {
  284. ++ite_irq_counter[i+8];
  285. ite_gpio_irq_pending[i+8] = 2;
  286. wake_up_interruptible(&ite_gpio_wait[i+8]);
  287. DEB(printk("interrupt 0x%x %d\n",ITE_GPBISR, i+8));
  288. ITE_GPBISR = ITE_GPBISR & (1<<i);
  289. return;
  290. }
  291. }
  292. line = ITE_GPAISR;
  293. for (i=7; i >= 0; i--) {
  294. if ( line & (1 << i)) {
  295. ++ite_irq_counter[i];
  296. ite_gpio_irq_pending[i] = 2;
  297. wake_up_interruptible(&ite_gpio_wait[i]);
  298. DEB(printk("interrupt 0x%x %d\n",ITE_GPAISR, i));
  299. ITE_GPAISR = ITE_GPAISR & (1<<i);
  300. return;
  301. }
  302. }
  303. }
  304. static struct file_operations ite_gpio_fops = {
  305. .owner = THIS_MODULE,
  306. .ioctl = ite_gpio_ioctl,
  307. .open = ite_gpio_open,
  308. .release = ite_gpio_release,
  309. };
  310. static struct miscdevice ite_gpio_miscdev = {
  311. MISC_DYNAMIC_MINOR,
  312. "ite_gpio",
  313. &ite_gpio_fops
  314. };
  315. int __init ite_gpio_init(void)
  316. {
  317. int i;
  318. if (misc_register(&ite_gpio_miscdev))
  319. return -ENODEV;
  320. if (!request_region(ite_gpio_base, 0x1c, "ITE GPIO"))
  321. {
  322. misc_deregister(&ite_gpio_miscdev);
  323. return -EIO;
  324. }
  325. /* initialize registers */
  326. ITE_GPACR = 0xffff;
  327. ITE_GPBCR = 0xffff;
  328. ITE_GPCCR = 0xffff;
  329. ITE_GPAICR = 0x00ff;
  330. ITE_GPBICR = 0x00ff;
  331. ITE_GPCICR = 0x00ff;
  332. ITE_GCR = 0;
  333. for (i = 0; i < MAX_GPIO_LINE; i++) {
  334. ite_gpio_irq_pending[i]=0;
  335. init_waitqueue_head(&ite_gpio_wait[i]);
  336. }
  337. if (request_irq(ite_gpio_irq, ite_gpio_irq_handler, SA_SHIRQ, "gpio", 0) < 0) {
  338. misc_deregister(&ite_gpio_miscdev);
  339. release_region(ite_gpio_base, 0x1c);
  340. return 0;
  341. }
  342. printk("GPIO at 0x%x (irq = %d)\n", ite_gpio_base, ite_gpio_irq);
  343. return 0;
  344. }
  345. static void __exit ite_gpio_exit(void)
  346. {
  347. misc_deregister(&ite_gpio_miscdev);
  348. }
  349. module_init(ite_gpio_init);
  350. module_exit(ite_gpio_exit);
  351. MODULE_LICENSE("GPL");