gpio.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. /*
  2. * Gemini gpiochip and interrupt routines
  3. *
  4. * Copyright (C) 2008-2009 Paulius Zaleckas <paulius.zaleckas@teltonika.lt>
  5. *
  6. * Based on plat-mxc/gpio.c:
  7. * MXC GPIO support. (c) 2008 Daniel Mack <daniel@caiaq.de>
  8. * Copyright 2008 Juergen Beisert, kernel@pengutronix.de
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation; either version 2 of the License, or
  13. * (at your option) any later version.
  14. */
  15. #include <linux/kernel.h>
  16. #include <linux/init.h>
  17. #include <linux/io.h>
  18. #include <linux/irq.h>
  19. #include <linux/gpio.h>
  20. #include <mach/hardware.h>
  21. #include <mach/irqs.h>
  22. #define GPIO_BASE(x) IO_ADDRESS(GEMINI_GPIO_BASE(x))
  23. /* GPIO registers definition */
  24. #define GPIO_DATA_OUT 0x0
  25. #define GPIO_DATA_IN 0x4
  26. #define GPIO_DIR 0x8
  27. #define GPIO_DATA_SET 0x10
  28. #define GPIO_DATA_CLR 0x14
  29. #define GPIO_PULL_EN 0x18
  30. #define GPIO_PULL_TYPE 0x1C
  31. #define GPIO_INT_EN 0x20
  32. #define GPIO_INT_STAT 0x24
  33. #define GPIO_INT_MASK 0x2C
  34. #define GPIO_INT_CLR 0x30
  35. #define GPIO_INT_TYPE 0x34
  36. #define GPIO_INT_BOTH_EDGE 0x38
  37. #define GPIO_INT_LEVEL 0x3C
  38. #define GPIO_DEBOUNCE_EN 0x40
  39. #define GPIO_DEBOUNCE_PRESCALE 0x44
  40. #define GPIO_PORT_NUM 3
  41. static void _set_gpio_irqenable(unsigned int base, unsigned int index,
  42. int enable)
  43. {
  44. unsigned int reg;
  45. reg = __raw_readl(base + GPIO_INT_EN);
  46. reg = (reg & (~(1 << index))) | (!!enable << index);
  47. __raw_writel(reg, base + GPIO_INT_EN);
  48. }
  49. static void gpio_ack_irq(unsigned int irq)
  50. {
  51. unsigned int gpio = irq_to_gpio(irq);
  52. unsigned int base = GPIO_BASE(gpio / 32);
  53. __raw_writel(1 << (gpio % 32), base + GPIO_INT_CLR);
  54. }
  55. static void gpio_mask_irq(unsigned int irq)
  56. {
  57. unsigned int gpio = irq_to_gpio(irq);
  58. unsigned int base = GPIO_BASE(gpio / 32);
  59. _set_gpio_irqenable(base, gpio % 32, 0);
  60. }
  61. static void gpio_unmask_irq(unsigned int irq)
  62. {
  63. unsigned int gpio = irq_to_gpio(irq);
  64. unsigned int base = GPIO_BASE(gpio / 32);
  65. _set_gpio_irqenable(base, gpio % 32, 1);
  66. }
  67. static int gpio_set_irq_type(unsigned int irq, unsigned int type)
  68. {
  69. unsigned int gpio = irq_to_gpio(irq);
  70. unsigned int gpio_mask = 1 << (gpio % 32);
  71. unsigned int base = GPIO_BASE(gpio / 32);
  72. unsigned int reg_both, reg_level, reg_type;
  73. reg_type = __raw_readl(base + GPIO_INT_TYPE);
  74. reg_level = __raw_readl(base + GPIO_INT_BOTH_EDGE);
  75. reg_both = __raw_readl(base + GPIO_INT_BOTH_EDGE);
  76. switch (type) {
  77. case IRQ_TYPE_EDGE_BOTH:
  78. reg_type &= ~gpio_mask;
  79. reg_both |= gpio_mask;
  80. break;
  81. case IRQ_TYPE_EDGE_RISING:
  82. reg_type &= ~gpio_mask;
  83. reg_both &= ~gpio_mask;
  84. reg_level &= ~gpio_mask;
  85. break;
  86. case IRQ_TYPE_EDGE_FALLING:
  87. reg_type &= ~gpio_mask;
  88. reg_both &= ~gpio_mask;
  89. reg_level |= gpio_mask;
  90. break;
  91. case IRQ_TYPE_LEVEL_HIGH:
  92. reg_type |= gpio_mask;
  93. reg_level &= ~gpio_mask;
  94. break;
  95. case IRQ_TYPE_LEVEL_LOW:
  96. reg_type |= gpio_mask;
  97. reg_level |= gpio_mask;
  98. break;
  99. default:
  100. return -EINVAL;
  101. }
  102. __raw_writel(reg_type, base + GPIO_INT_TYPE);
  103. __raw_writel(reg_level, base + GPIO_INT_BOTH_EDGE);
  104. __raw_writel(reg_both, base + GPIO_INT_BOTH_EDGE);
  105. gpio_ack_irq(irq);
  106. return 0;
  107. }
  108. static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
  109. {
  110. unsigned int gpio_irq_no, irq_stat;
  111. unsigned int port = (unsigned int)get_irq_data(irq);
  112. irq_stat = __raw_readl(GPIO_BASE(port) + GPIO_INT_STAT);
  113. gpio_irq_no = GPIO_IRQ_BASE + port * 32;
  114. for (; irq_stat != 0; irq_stat >>= 1, gpio_irq_no++) {
  115. if ((irq_stat & 1) == 0)
  116. continue;
  117. BUG_ON(!(irq_desc[gpio_irq_no].handle_irq));
  118. irq_desc[gpio_irq_no].handle_irq(gpio_irq_no,
  119. &irq_desc[gpio_irq_no]);
  120. }
  121. }
  122. static struct irq_chip gpio_irq_chip = {
  123. .name = "GPIO",
  124. .ack = gpio_ack_irq,
  125. .mask = gpio_mask_irq,
  126. .unmask = gpio_unmask_irq,
  127. .set_type = gpio_set_irq_type,
  128. };
  129. static void _set_gpio_direction(struct gpio_chip *chip, unsigned offset,
  130. int dir)
  131. {
  132. unsigned int base = GPIO_BASE(offset / 32);
  133. unsigned int reg;
  134. reg = __raw_readl(base + GPIO_DIR);
  135. if (dir)
  136. reg |= 1 << (offset % 32);
  137. else
  138. reg &= ~(1 << (offset % 32));
  139. __raw_writel(reg, base + GPIO_DIR);
  140. }
  141. static void gemini_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
  142. {
  143. unsigned int base = GPIO_BASE(offset / 32);
  144. if (value)
  145. __raw_writel(1 << (offset % 32), base + GPIO_DATA_SET);
  146. else
  147. __raw_writel(1 << (offset % 32), base + GPIO_DATA_CLR);
  148. }
  149. static int gemini_gpio_get(struct gpio_chip *chip, unsigned offset)
  150. {
  151. unsigned int base = GPIO_BASE(offset / 32);
  152. return (__raw_readl(base + GPIO_DATA_IN) >> (offset % 32)) & 1;
  153. }
  154. static int gemini_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
  155. {
  156. _set_gpio_direction(chip, offset, 0);
  157. return 0;
  158. }
  159. static int gemini_gpio_direction_output(struct gpio_chip *chip, unsigned offset,
  160. int value)
  161. {
  162. _set_gpio_direction(chip, offset, 1);
  163. gemini_gpio_set(chip, offset, value);
  164. return 0;
  165. }
  166. static struct gpio_chip gemini_gpio_chip = {
  167. .label = "Gemini",
  168. .direction_input = gemini_gpio_direction_input,
  169. .get = gemini_gpio_get,
  170. .direction_output = gemini_gpio_direction_output,
  171. .set = gemini_gpio_set,
  172. .base = 0,
  173. .ngpio = GPIO_PORT_NUM * 32,
  174. };
  175. void __init gemini_gpio_init(void)
  176. {
  177. int i, j;
  178. for (i = 0; i < GPIO_PORT_NUM; i++) {
  179. /* disable, unmask and clear all interrupts */
  180. __raw_writel(0x0, GPIO_BASE(i) + GPIO_INT_EN);
  181. __raw_writel(0x0, GPIO_BASE(i) + GPIO_INT_MASK);
  182. __raw_writel(~0x0, GPIO_BASE(i) + GPIO_INT_CLR);
  183. for (j = GPIO_IRQ_BASE + i * 32;
  184. j < GPIO_IRQ_BASE + (i + 1) * 32; j++) {
  185. set_irq_chip(j, &gpio_irq_chip);
  186. set_irq_handler(j, handle_edge_irq);
  187. set_irq_flags(j, IRQF_VALID);
  188. }
  189. set_irq_chained_handler(IRQ_GPIO(i), gpio_irq_handler);
  190. set_irq_data(IRQ_GPIO(i), (void *)i);
  191. }
  192. BUG_ON(gpiochip_add(&gemini_gpio_chip));
  193. }