common.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. /*
  2. * linux/arch/arm/mach-h720x/common.c
  3. *
  4. * Copyright (C) 2003 Thomas Gleixner <tglx@linutronix.de>
  5. * 2003 Robert Schwebel <r.schwebel@pengutronix.de>
  6. * 2004 Sascha Hauer <s.hauer@pengutronix.de>
  7. *
  8. * common stuff for Hynix h720x processors
  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 version 2 as
  12. * published by the Free Software Foundation.
  13. *
  14. */
  15. #include <linux/sched.h>
  16. #include <linux/slab.h>
  17. #include <linux/mman.h>
  18. #include <linux/init.h>
  19. #include <linux/interrupt.h>
  20. #include <asm/page.h>
  21. #include <asm/pgtable.h>
  22. #include <asm/dma.h>
  23. #include <asm/io.h>
  24. #include <asm/hardware.h>
  25. #include <asm/irq.h>
  26. #include <asm/mach/irq.h>
  27. #include <asm/mach/map.h>
  28. #include <asm/arch/irqs.h>
  29. #include <asm/mach/dma.h>
  30. #if 0
  31. #define IRQDBG(args...) printk(args)
  32. #else
  33. #define IRQDBG(args...) do {} while(0)
  34. #endif
  35. void __init arch_dma_init(dma_t *dma)
  36. {
  37. }
  38. /*
  39. * Return usecs since last timer reload
  40. * (timercount * (usecs perjiffie)) / (ticks per jiffie)
  41. */
  42. unsigned long h720x_gettimeoffset(void)
  43. {
  44. return (CPU_REG (TIMER_VIRT, TM0_COUNT) * tick_usec) / LATCH;
  45. }
  46. /*
  47. * mask Global irq's
  48. */
  49. static void mask_global_irq (unsigned int irq )
  50. {
  51. CPU_REG (IRQC_VIRT, IRQC_IER) &= ~(1 << irq);
  52. }
  53. /*
  54. * unmask Global irq's
  55. */
  56. static void unmask_global_irq (unsigned int irq )
  57. {
  58. CPU_REG (IRQC_VIRT, IRQC_IER) |= (1 << irq);
  59. }
  60. /*
  61. * ack GPIO irq's
  62. * Ack only for edge triggered int's valid
  63. */
  64. static void inline ack_gpio_irq(u32 irq)
  65. {
  66. u32 reg_base = GPIO_VIRT(IRQ_TO_REGNO(irq));
  67. u32 bit = IRQ_TO_BIT(irq);
  68. if ( (CPU_REG (reg_base, GPIO_EDGE) & bit))
  69. CPU_REG (reg_base, GPIO_CLR) = bit;
  70. }
  71. /*
  72. * mask GPIO irq's
  73. */
  74. static void inline mask_gpio_irq(u32 irq)
  75. {
  76. u32 reg_base = GPIO_VIRT(IRQ_TO_REGNO(irq));
  77. u32 bit = IRQ_TO_BIT(irq);
  78. CPU_REG (reg_base, GPIO_MASK) &= ~bit;
  79. }
  80. /*
  81. * unmask GPIO irq's
  82. */
  83. static void inline unmask_gpio_irq(u32 irq)
  84. {
  85. u32 reg_base = GPIO_VIRT(IRQ_TO_REGNO(irq));
  86. u32 bit = IRQ_TO_BIT(irq);
  87. CPU_REG (reg_base, GPIO_MASK) |= bit;
  88. }
  89. static void
  90. h720x_gpio_handler(unsigned int mask, unsigned int irq,
  91. struct irqdesc *desc, struct pt_regs *regs)
  92. {
  93. IRQDBG("%s irq: %d\n",__FUNCTION__,irq);
  94. desc = irq_desc + irq;
  95. while (mask) {
  96. if (mask & 1) {
  97. IRQDBG("handling irq %d\n", irq);
  98. desc_handle_irq(irq, desc, regs);
  99. }
  100. irq++;
  101. desc++;
  102. mask >>= 1;
  103. }
  104. }
  105. static void
  106. h720x_gpioa_demux_handler(unsigned int irq_unused, struct irqdesc *desc,
  107. struct pt_regs *regs)
  108. {
  109. unsigned int mask, irq;
  110. mask = CPU_REG(GPIO_A_VIRT,GPIO_STAT);
  111. irq = IRQ_CHAINED_GPIOA(0);
  112. IRQDBG("%s mask: 0x%08x irq: %d\n",__FUNCTION__,mask,irq);
  113. h720x_gpio_handler(mask, irq, desc, regs);
  114. }
  115. static void
  116. h720x_gpiob_demux_handler(unsigned int irq_unused, struct irqdesc *desc,
  117. struct pt_regs *regs)
  118. {
  119. unsigned int mask, irq;
  120. mask = CPU_REG(GPIO_B_VIRT,GPIO_STAT);
  121. irq = IRQ_CHAINED_GPIOB(0);
  122. IRQDBG("%s mask: 0x%08x irq: %d\n",__FUNCTION__,mask,irq);
  123. h720x_gpio_handler(mask, irq, desc, regs);
  124. }
  125. static void
  126. h720x_gpioc_demux_handler(unsigned int irq_unused, struct irqdesc *desc,
  127. struct pt_regs *regs)
  128. {
  129. unsigned int mask, irq;
  130. mask = CPU_REG(GPIO_C_VIRT,GPIO_STAT);
  131. irq = IRQ_CHAINED_GPIOC(0);
  132. IRQDBG("%s mask: 0x%08x irq: %d\n",__FUNCTION__,mask,irq);
  133. h720x_gpio_handler(mask, irq, desc, regs);
  134. }
  135. static void
  136. h720x_gpiod_demux_handler(unsigned int irq_unused, struct irqdesc *desc,
  137. struct pt_regs *regs)
  138. {
  139. unsigned int mask, irq;
  140. mask = CPU_REG(GPIO_D_VIRT,GPIO_STAT);
  141. irq = IRQ_CHAINED_GPIOD(0);
  142. IRQDBG("%s mask: 0x%08x irq: %d\n",__FUNCTION__,mask,irq);
  143. h720x_gpio_handler(mask, irq, desc, regs);
  144. }
  145. #ifdef CONFIG_CPU_H7202
  146. static void
  147. h720x_gpioe_demux_handler(unsigned int irq_unused, struct irqdesc *desc,
  148. struct pt_regs *regs)
  149. {
  150. unsigned int mask, irq;
  151. mask = CPU_REG(GPIO_E_VIRT,GPIO_STAT);
  152. irq = IRQ_CHAINED_GPIOE(0);
  153. IRQDBG("%s mask: 0x%08x irq: %d\n",__FUNCTION__,mask,irq);
  154. h720x_gpio_handler(mask, irq, desc, regs);
  155. }
  156. #endif
  157. static struct irqchip h720x_global_chip = {
  158. .ack = mask_global_irq,
  159. .mask = mask_global_irq,
  160. .unmask = unmask_global_irq,
  161. };
  162. static struct irqchip h720x_gpio_chip = {
  163. .ack = ack_gpio_irq,
  164. .mask = mask_gpio_irq,
  165. .unmask = unmask_gpio_irq,
  166. };
  167. /*
  168. * Initialize IRQ's, mask all, enable multiplexed irq's
  169. */
  170. void __init h720x_init_irq (void)
  171. {
  172. int irq;
  173. /* Mask global irq's */
  174. CPU_REG (IRQC_VIRT, IRQC_IER) = 0x0;
  175. /* Mask all multiplexed irq's */
  176. CPU_REG (GPIO_A_VIRT, GPIO_MASK) = 0x0;
  177. CPU_REG (GPIO_B_VIRT, GPIO_MASK) = 0x0;
  178. CPU_REG (GPIO_C_VIRT, GPIO_MASK) = 0x0;
  179. CPU_REG (GPIO_D_VIRT, GPIO_MASK) = 0x0;
  180. /* Initialize global IRQ's, fast path */
  181. for (irq = 0; irq < NR_GLBL_IRQS; irq++) {
  182. set_irq_chip(irq, &h720x_global_chip);
  183. set_irq_handler(irq, do_level_IRQ);
  184. set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
  185. }
  186. /* Initialize multiplexed IRQ's, slow path */
  187. for (irq = IRQ_CHAINED_GPIOA(0) ; irq <= IRQ_CHAINED_GPIOD(31); irq++) {
  188. set_irq_chip(irq, &h720x_gpio_chip);
  189. set_irq_handler(irq, do_edge_IRQ);
  190. set_irq_flags(irq, IRQF_VALID );
  191. }
  192. set_irq_chained_handler(IRQ_GPIOA, h720x_gpioa_demux_handler);
  193. set_irq_chained_handler(IRQ_GPIOB, h720x_gpiob_demux_handler);
  194. set_irq_chained_handler(IRQ_GPIOC, h720x_gpioc_demux_handler);
  195. set_irq_chained_handler(IRQ_GPIOD, h720x_gpiod_demux_handler);
  196. #ifdef CONFIG_CPU_H7202
  197. for (irq = IRQ_CHAINED_GPIOE(0) ; irq <= IRQ_CHAINED_GPIOE(31); irq++) {
  198. set_irq_chip(irq, &h720x_gpio_chip);
  199. set_irq_handler(irq, do_edge_IRQ);
  200. set_irq_flags(irq, IRQF_VALID );
  201. }
  202. set_irq_chained_handler(IRQ_GPIOE, h720x_gpioe_demux_handler);
  203. #endif
  204. /* Enable multiplexed irq's */
  205. CPU_REG (IRQC_VIRT, IRQC_IER) = IRQ_ENA_MUX;
  206. }
  207. static struct map_desc h720x_io_desc[] __initdata = {
  208. { IO_VIRT, IO_PHYS, IO_SIZE, MT_DEVICE },
  209. };
  210. /* Initialize io tables */
  211. void __init h720x_map_io(void)
  212. {
  213. iotable_init(h720x_io_desc,ARRAY_SIZE(h720x_io_desc));
  214. }