irq.c 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049
  1. /*
  2. * S3C24XX IRQ handling
  3. *
  4. * Copyright (c) 2003-2004 Simtec Electronics
  5. * Ben Dooks <ben@simtec.co.uk>
  6. * Copyright (c) 2012 Heiko Stuebner <heiko@sntech.de>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. */
  18. #include <linux/init.h>
  19. #include <linux/slab.h>
  20. #include <linux/module.h>
  21. #include <linux/io.h>
  22. #include <linux/err.h>
  23. #include <linux/interrupt.h>
  24. #include <linux/ioport.h>
  25. #include <linux/device.h>
  26. #include <linux/irqdomain.h>
  27. #include <asm/mach/irq.h>
  28. #include <mach/regs-irq.h>
  29. #include <mach/regs-gpio.h>
  30. #include <plat/cpu.h>
  31. #include <plat/regs-irqtype.h>
  32. #include <plat/pm.h>
  33. #define S3C_IRQTYPE_NONE 0
  34. #define S3C_IRQTYPE_EINT 1
  35. #define S3C_IRQTYPE_EDGE 2
  36. #define S3C_IRQTYPE_LEVEL 3
  37. struct s3c_irq_data {
  38. unsigned int type;
  39. unsigned long parent_irq;
  40. /* data gets filled during init */
  41. struct s3c_irq_intc *intc;
  42. unsigned long sub_bits;
  43. struct s3c_irq_intc *sub_intc;
  44. };
  45. /*
  46. * Sructure holding the controller data
  47. * @reg_pending register holding pending irqs
  48. * @reg_intpnd special register intpnd in main intc
  49. * @reg_mask mask register
  50. * @domain irq_domain of the controller
  51. * @parent parent controller for ext and sub irqs
  52. * @irqs irq-data, always s3c_irq_data[32]
  53. */
  54. struct s3c_irq_intc {
  55. void __iomem *reg_pending;
  56. void __iomem *reg_intpnd;
  57. void __iomem *reg_mask;
  58. struct irq_domain *domain;
  59. struct s3c_irq_intc *parent;
  60. struct s3c_irq_data *irqs;
  61. };
  62. static void s3c_irq_mask(struct irq_data *data)
  63. {
  64. struct s3c_irq_intc *intc = data->domain->host_data;
  65. struct s3c_irq_intc *parent_intc = intc->parent;
  66. struct s3c_irq_data *irq_data = &intc->irqs[data->hwirq];
  67. struct s3c_irq_data *parent_data;
  68. unsigned long mask;
  69. unsigned int irqno;
  70. mask = __raw_readl(intc->reg_mask);
  71. mask |= (1UL << data->hwirq);
  72. __raw_writel(mask, intc->reg_mask);
  73. if (parent_intc) {
  74. parent_data = &parent_intc->irqs[irq_data->parent_irq];
  75. /* check to see if we need to mask the parent IRQ */
  76. if ((mask & parent_data->sub_bits) == parent_data->sub_bits) {
  77. irqno = irq_find_mapping(parent_intc->domain,
  78. irq_data->parent_irq);
  79. s3c_irq_mask(irq_get_irq_data(irqno));
  80. }
  81. }
  82. }
  83. static void s3c_irq_unmask(struct irq_data *data)
  84. {
  85. struct s3c_irq_intc *intc = data->domain->host_data;
  86. struct s3c_irq_intc *parent_intc = intc->parent;
  87. struct s3c_irq_data *irq_data = &intc->irqs[data->hwirq];
  88. unsigned long mask;
  89. unsigned int irqno;
  90. mask = __raw_readl(intc->reg_mask);
  91. mask &= ~(1UL << data->hwirq);
  92. __raw_writel(mask, intc->reg_mask);
  93. if (parent_intc) {
  94. irqno = irq_find_mapping(parent_intc->domain,
  95. irq_data->parent_irq);
  96. s3c_irq_unmask(irq_get_irq_data(irqno));
  97. }
  98. }
  99. static inline void s3c_irq_ack(struct irq_data *data)
  100. {
  101. struct s3c_irq_intc *intc = data->domain->host_data;
  102. unsigned long bitval = 1UL << data->hwirq;
  103. __raw_writel(bitval, intc->reg_pending);
  104. if (intc->reg_intpnd)
  105. __raw_writel(bitval, intc->reg_intpnd);
  106. }
  107. static int s3c_irqext_type_set(void __iomem *gpcon_reg,
  108. void __iomem *extint_reg,
  109. unsigned long gpcon_offset,
  110. unsigned long extint_offset,
  111. unsigned int type)
  112. {
  113. unsigned long newvalue = 0, value;
  114. /* Set the GPIO to external interrupt mode */
  115. value = __raw_readl(gpcon_reg);
  116. value = (value & ~(3 << gpcon_offset)) | (0x02 << gpcon_offset);
  117. __raw_writel(value, gpcon_reg);
  118. /* Set the external interrupt to pointed trigger type */
  119. switch (type)
  120. {
  121. case IRQ_TYPE_NONE:
  122. pr_warn("No edge setting!\n");
  123. break;
  124. case IRQ_TYPE_EDGE_RISING:
  125. newvalue = S3C2410_EXTINT_RISEEDGE;
  126. break;
  127. case IRQ_TYPE_EDGE_FALLING:
  128. newvalue = S3C2410_EXTINT_FALLEDGE;
  129. break;
  130. case IRQ_TYPE_EDGE_BOTH:
  131. newvalue = S3C2410_EXTINT_BOTHEDGE;
  132. break;
  133. case IRQ_TYPE_LEVEL_LOW:
  134. newvalue = S3C2410_EXTINT_LOWLEV;
  135. break;
  136. case IRQ_TYPE_LEVEL_HIGH:
  137. newvalue = S3C2410_EXTINT_HILEV;
  138. break;
  139. default:
  140. pr_err("No such irq type %d", type);
  141. return -EINVAL;
  142. }
  143. value = __raw_readl(extint_reg);
  144. value = (value & ~(7 << extint_offset)) | (newvalue << extint_offset);
  145. __raw_writel(value, extint_reg);
  146. return 0;
  147. }
  148. static int s3c_irqext_type(struct irq_data *data, unsigned int type)
  149. {
  150. void __iomem *extint_reg;
  151. void __iomem *gpcon_reg;
  152. unsigned long gpcon_offset, extint_offset;
  153. if ((data->hwirq >= 4) && (data->hwirq <= 7)) {
  154. gpcon_reg = S3C2410_GPFCON;
  155. extint_reg = S3C24XX_EXTINT0;
  156. gpcon_offset = (data->hwirq) * 2;
  157. extint_offset = (data->hwirq) * 4;
  158. } else if ((data->hwirq >= 8) && (data->hwirq <= 15)) {
  159. gpcon_reg = S3C2410_GPGCON;
  160. extint_reg = S3C24XX_EXTINT1;
  161. gpcon_offset = (data->hwirq - 8) * 2;
  162. extint_offset = (data->hwirq - 8) * 4;
  163. } else if ((data->hwirq >= 16) && (data->hwirq <= 23)) {
  164. gpcon_reg = S3C2410_GPGCON;
  165. extint_reg = S3C24XX_EXTINT2;
  166. gpcon_offset = (data->hwirq - 8) * 2;
  167. extint_offset = (data->hwirq - 16) * 4;
  168. } else {
  169. return -EINVAL;
  170. }
  171. return s3c_irqext_type_set(gpcon_reg, extint_reg, gpcon_offset,
  172. extint_offset, type);
  173. }
  174. static int s3c_irqext0_type(struct irq_data *data, unsigned int type)
  175. {
  176. void __iomem *extint_reg;
  177. void __iomem *gpcon_reg;
  178. unsigned long gpcon_offset, extint_offset;
  179. if ((data->hwirq >= 0) && (data->hwirq <= 3)) {
  180. gpcon_reg = S3C2410_GPFCON;
  181. extint_reg = S3C24XX_EXTINT0;
  182. gpcon_offset = (data->hwirq) * 2;
  183. extint_offset = (data->hwirq) * 4;
  184. } else {
  185. return -EINVAL;
  186. }
  187. return s3c_irqext_type_set(gpcon_reg, extint_reg, gpcon_offset,
  188. extint_offset, type);
  189. }
  190. static struct irq_chip s3c_irq_chip = {
  191. .name = "s3c",
  192. .irq_ack = s3c_irq_ack,
  193. .irq_mask = s3c_irq_mask,
  194. .irq_unmask = s3c_irq_unmask,
  195. .irq_set_wake = s3c_irq_wake
  196. };
  197. static struct irq_chip s3c_irq_level_chip = {
  198. .name = "s3c-level",
  199. .irq_mask = s3c_irq_mask,
  200. .irq_unmask = s3c_irq_unmask,
  201. .irq_ack = s3c_irq_ack,
  202. };
  203. static struct irq_chip s3c_irqext_chip = {
  204. .name = "s3c-ext",
  205. .irq_mask = s3c_irq_mask,
  206. .irq_unmask = s3c_irq_unmask,
  207. .irq_ack = s3c_irq_ack,
  208. .irq_set_type = s3c_irqext_type,
  209. .irq_set_wake = s3c_irqext_wake
  210. };
  211. static struct irq_chip s3c_irq_eint0t4 = {
  212. .name = "s3c-ext0",
  213. .irq_ack = s3c_irq_ack,
  214. .irq_mask = s3c_irq_mask,
  215. .irq_unmask = s3c_irq_unmask,
  216. .irq_set_wake = s3c_irq_wake,
  217. .irq_set_type = s3c_irqext0_type,
  218. };
  219. static void s3c_irq_demux(unsigned int irq, struct irq_desc *desc)
  220. {
  221. struct irq_chip *chip = irq_desc_get_chip(desc);
  222. struct s3c_irq_intc *intc = desc->irq_data.domain->host_data;
  223. struct s3c_irq_data *irq_data = &intc->irqs[desc->irq_data.hwirq];
  224. struct s3c_irq_intc *sub_intc = irq_data->sub_intc;
  225. unsigned long src;
  226. unsigned long msk;
  227. unsigned int n;
  228. chained_irq_enter(chip, desc);
  229. src = __raw_readl(sub_intc->reg_pending);
  230. msk = __raw_readl(sub_intc->reg_mask);
  231. src &= ~msk;
  232. src &= irq_data->sub_bits;
  233. while (src) {
  234. n = __ffs(src);
  235. src &= ~(1 << n);
  236. generic_handle_irq(irq_find_mapping(sub_intc->domain, n));
  237. }
  238. chained_irq_exit(chip, desc);
  239. }
  240. #ifdef CONFIG_FIQ
  241. /**
  242. * s3c24xx_set_fiq - set the FIQ routing
  243. * @irq: IRQ number to route to FIQ on processor.
  244. * @on: Whether to route @irq to the FIQ, or to remove the FIQ routing.
  245. *
  246. * Change the state of the IRQ to FIQ routing depending on @irq and @on. If
  247. * @on is true, the @irq is checked to see if it can be routed and the
  248. * interrupt controller updated to route the IRQ. If @on is false, the FIQ
  249. * routing is cleared, regardless of which @irq is specified.
  250. */
  251. int s3c24xx_set_fiq(unsigned int irq, bool on)
  252. {
  253. u32 intmod;
  254. unsigned offs;
  255. if (on) {
  256. offs = irq - FIQ_START;
  257. if (offs > 31)
  258. return -EINVAL;
  259. intmod = 1 << offs;
  260. } else {
  261. intmod = 0;
  262. }
  263. __raw_writel(intmod, S3C2410_INTMOD);
  264. return 0;
  265. }
  266. EXPORT_SYMBOL_GPL(s3c24xx_set_fiq);
  267. #endif
  268. static int s3c24xx_irq_map(struct irq_domain *h, unsigned int virq,
  269. irq_hw_number_t hw)
  270. {
  271. struct s3c_irq_intc *intc = h->host_data;
  272. struct s3c_irq_data *irq_data = &intc->irqs[hw];
  273. struct s3c_irq_intc *parent_intc;
  274. struct s3c_irq_data *parent_irq_data;
  275. unsigned int irqno;
  276. /* attach controller pointer to irq_data */
  277. irq_data->intc = intc;
  278. parent_intc = intc->parent;
  279. /* set handler and flags */
  280. switch (irq_data->type) {
  281. case S3C_IRQTYPE_NONE:
  282. return 0;
  283. case S3C_IRQTYPE_EINT:
  284. /* On the S3C2412, the EINT0to3 have a parent irq
  285. * but need the s3c_irq_eint0t4 chip
  286. */
  287. if (parent_intc && (!soc_is_s3c2412() || hw >= 4))
  288. irq_set_chip_and_handler(virq, &s3c_irqext_chip,
  289. handle_edge_irq);
  290. else
  291. irq_set_chip_and_handler(virq, &s3c_irq_eint0t4,
  292. handle_edge_irq);
  293. break;
  294. case S3C_IRQTYPE_EDGE:
  295. if (parent_intc || intc->reg_pending == S3C2416_SRCPND2)
  296. irq_set_chip_and_handler(virq, &s3c_irq_level_chip,
  297. handle_edge_irq);
  298. else
  299. irq_set_chip_and_handler(virq, &s3c_irq_chip,
  300. handle_edge_irq);
  301. break;
  302. case S3C_IRQTYPE_LEVEL:
  303. if (parent_intc)
  304. irq_set_chip_and_handler(virq, &s3c_irq_level_chip,
  305. handle_level_irq);
  306. else
  307. irq_set_chip_and_handler(virq, &s3c_irq_chip,
  308. handle_level_irq);
  309. break;
  310. default:
  311. pr_err("irq-s3c24xx: unsupported irqtype %d\n", irq_data->type);
  312. return -EINVAL;
  313. }
  314. set_irq_flags(virq, IRQF_VALID);
  315. if (parent_intc && irq_data->type != S3C_IRQTYPE_NONE) {
  316. if (irq_data->parent_irq > 31) {
  317. pr_err("irq-s3c24xx: parent irq %lu is out of range\n",
  318. irq_data->parent_irq);
  319. goto err;
  320. }
  321. parent_irq_data = &parent_intc->irqs[irq_data->parent_irq];
  322. parent_irq_data->sub_intc = intc;
  323. parent_irq_data->sub_bits |= (1UL << hw);
  324. /* attach the demuxer to the parent irq */
  325. irqno = irq_find_mapping(parent_intc->domain,
  326. irq_data->parent_irq);
  327. if (!irqno) {
  328. pr_err("irq-s3c24xx: could not find mapping for parent irq %lu\n",
  329. irq_data->parent_irq);
  330. goto err;
  331. }
  332. irq_set_chained_handler(irqno, s3c_irq_demux);
  333. }
  334. return 0;
  335. err:
  336. set_irq_flags(virq, 0);
  337. /* the only error can result from bad mapping data*/
  338. return -EINVAL;
  339. }
  340. static struct irq_domain_ops s3c24xx_irq_ops = {
  341. .map = s3c24xx_irq_map,
  342. .xlate = irq_domain_xlate_twocell,
  343. };
  344. static void s3c24xx_clear_intc(struct s3c_irq_intc *intc)
  345. {
  346. void __iomem *reg_source;
  347. unsigned long pend;
  348. unsigned long last;
  349. int i;
  350. /* if intpnd is set, read the next pending irq from there */
  351. reg_source = intc->reg_intpnd ? intc->reg_intpnd : intc->reg_pending;
  352. last = 0;
  353. for (i = 0; i < 4; i++) {
  354. pend = __raw_readl(reg_source);
  355. if (pend == 0 || pend == last)
  356. break;
  357. __raw_writel(pend, intc->reg_pending);
  358. if (intc->reg_intpnd)
  359. __raw_writel(pend, intc->reg_intpnd);
  360. pr_info("irq: clearing pending status %08x\n", (int)pend);
  361. last = pend;
  362. }
  363. }
  364. static struct s3c_irq_intc *s3c24xx_init_intc(struct device_node *np,
  365. struct s3c_irq_data *irq_data,
  366. struct s3c_irq_intc *parent,
  367. unsigned long address)
  368. {
  369. struct s3c_irq_intc *intc;
  370. void __iomem *base = (void *)0xf6000000; /* static mapping */
  371. int irq_num;
  372. int irq_start;
  373. int ret;
  374. intc = kzalloc(sizeof(struct s3c_irq_intc), GFP_KERNEL);
  375. if (!intc)
  376. return ERR_PTR(-ENOMEM);
  377. intc->irqs = irq_data;
  378. if (parent)
  379. intc->parent = parent;
  380. /* select the correct data for the controller.
  381. * Need to hard code the irq num start and offset
  382. * to preserve the static mapping for now
  383. */
  384. switch (address) {
  385. case 0x4a000000:
  386. pr_debug("irq: found main intc\n");
  387. intc->reg_pending = base;
  388. intc->reg_mask = base + 0x08;
  389. intc->reg_intpnd = base + 0x10;
  390. irq_num = 32;
  391. irq_start = S3C2410_IRQ(0);
  392. break;
  393. case 0x4a000018:
  394. pr_debug("irq: found subintc\n");
  395. intc->reg_pending = base + 0x18;
  396. intc->reg_mask = base + 0x1c;
  397. irq_num = 29;
  398. irq_start = S3C2410_IRQSUB(0);
  399. break;
  400. case 0x4a000040:
  401. pr_debug("irq: found intc2\n");
  402. intc->reg_pending = base + 0x40;
  403. intc->reg_mask = base + 0x48;
  404. intc->reg_intpnd = base + 0x50;
  405. irq_num = 8;
  406. irq_start = S3C2416_IRQ(0);
  407. break;
  408. case 0x560000a4:
  409. pr_debug("irq: found eintc\n");
  410. base = (void *)0xfd000000;
  411. intc->reg_mask = base + 0xa4;
  412. intc->reg_pending = base + 0x08;
  413. irq_num = 24;
  414. irq_start = S3C2410_IRQ(32);
  415. break;
  416. default:
  417. pr_err("irq: unsupported controller address\n");
  418. ret = -EINVAL;
  419. goto err;
  420. }
  421. /* now that all the data is complete, init the irq-domain */
  422. s3c24xx_clear_intc(intc);
  423. intc->domain = irq_domain_add_legacy(np, irq_num, irq_start,
  424. 0, &s3c24xx_irq_ops,
  425. intc);
  426. if (!intc->domain) {
  427. pr_err("irq: could not create irq-domain\n");
  428. ret = -EINVAL;
  429. goto err;
  430. }
  431. return intc;
  432. err:
  433. kfree(intc);
  434. return ERR_PTR(ret);
  435. }
  436. static struct s3c_irq_data init_eint[32] = {
  437. { .type = S3C_IRQTYPE_NONE, }, /* reserved */
  438. { .type = S3C_IRQTYPE_NONE, }, /* reserved */
  439. { .type = S3C_IRQTYPE_NONE, }, /* reserved */
  440. { .type = S3C_IRQTYPE_NONE, }, /* reserved */
  441. { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT4 */
  442. { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT5 */
  443. { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT6 */
  444. { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT7 */
  445. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT8 */
  446. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT9 */
  447. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT10 */
  448. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT11 */
  449. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT12 */
  450. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT13 */
  451. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT14 */
  452. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT15 */
  453. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT16 */
  454. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT17 */
  455. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT18 */
  456. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT19 */
  457. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT20 */
  458. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT21 */
  459. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT22 */
  460. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT23 */
  461. };
  462. #ifdef CONFIG_CPU_S3C2410
  463. static struct s3c_irq_data init_s3c2410base[32] = {
  464. { .type = S3C_IRQTYPE_EINT, }, /* EINT0 */
  465. { .type = S3C_IRQTYPE_EINT, }, /* EINT1 */
  466. { .type = S3C_IRQTYPE_EINT, }, /* EINT2 */
  467. { .type = S3C_IRQTYPE_EINT, }, /* EINT3 */
  468. { .type = S3C_IRQTYPE_LEVEL, }, /* EINT4to7 */
  469. { .type = S3C_IRQTYPE_LEVEL, }, /* EINT8to23 */
  470. { .type = S3C_IRQTYPE_NONE, }, /* reserved */
  471. { .type = S3C_IRQTYPE_EDGE, }, /* nBATT_FLT */
  472. { .type = S3C_IRQTYPE_EDGE, }, /* TICK */
  473. { .type = S3C_IRQTYPE_EDGE, }, /* WDT */
  474. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER0 */
  475. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER1 */
  476. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER2 */
  477. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER3 */
  478. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER4 */
  479. { .type = S3C_IRQTYPE_LEVEL, }, /* UART2 */
  480. { .type = S3C_IRQTYPE_EDGE, }, /* LCD */
  481. { .type = S3C_IRQTYPE_EDGE, }, /* DMA0 */
  482. { .type = S3C_IRQTYPE_EDGE, }, /* DMA1 */
  483. { .type = S3C_IRQTYPE_EDGE, }, /* DMA2 */
  484. { .type = S3C_IRQTYPE_EDGE, }, /* DMA3 */
  485. { .type = S3C_IRQTYPE_EDGE, }, /* SDI */
  486. { .type = S3C_IRQTYPE_EDGE, }, /* SPI0 */
  487. { .type = S3C_IRQTYPE_LEVEL, }, /* UART1 */
  488. { .type = S3C_IRQTYPE_NONE, }, /* reserved */
  489. { .type = S3C_IRQTYPE_EDGE, }, /* USBD */
  490. { .type = S3C_IRQTYPE_EDGE, }, /* USBH */
  491. { .type = S3C_IRQTYPE_EDGE, }, /* IIC */
  492. { .type = S3C_IRQTYPE_LEVEL, }, /* UART0 */
  493. { .type = S3C_IRQTYPE_EDGE, }, /* SPI1 */
  494. { .type = S3C_IRQTYPE_EDGE, }, /* RTC */
  495. { .type = S3C_IRQTYPE_LEVEL, }, /* ADCPARENT */
  496. };
  497. static struct s3c_irq_data init_s3c2410subint[32] = {
  498. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-RX */
  499. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-TX */
  500. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-ERR */
  501. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-RX */
  502. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-TX */
  503. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-ERR */
  504. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-RX */
  505. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-TX */
  506. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-ERR */
  507. { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* TC */
  508. { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* ADC */
  509. };
  510. void __init s3c2410_init_irq(void)
  511. {
  512. struct s3c_irq_intc *main_intc;
  513. #ifdef CONFIG_FIQ
  514. init_FIQ(FIQ_START);
  515. #endif
  516. main_intc = s3c24xx_init_intc(NULL, &init_s3c2410base[0], NULL, 0x4a000000);
  517. if (IS_ERR(main_intc)) {
  518. pr_err("irq: could not create main interrupt controller\n");
  519. return;
  520. }
  521. s3c24xx_init_intc(NULL, &init_s3c2410subint[0], main_intc, 0x4a000018);
  522. s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4);
  523. }
  524. #endif
  525. #ifdef CONFIG_CPU_S3C2412
  526. static struct s3c_irq_data init_s3c2412base[32] = {
  527. { .type = S3C_IRQTYPE_LEVEL, }, /* EINT0 */
  528. { .type = S3C_IRQTYPE_LEVEL, }, /* EINT1 */
  529. { .type = S3C_IRQTYPE_LEVEL, }, /* EINT2 */
  530. { .type = S3C_IRQTYPE_LEVEL, }, /* EINT3 */
  531. { .type = S3C_IRQTYPE_LEVEL, }, /* EINT4to7 */
  532. { .type = S3C_IRQTYPE_LEVEL, }, /* EINT8to23 */
  533. { .type = S3C_IRQTYPE_NONE, }, /* reserved */
  534. { .type = S3C_IRQTYPE_EDGE, }, /* nBATT_FLT */
  535. { .type = S3C_IRQTYPE_EDGE, }, /* TICK */
  536. { .type = S3C_IRQTYPE_EDGE, }, /* WDT */
  537. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER0 */
  538. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER1 */
  539. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER2 */
  540. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER3 */
  541. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER4 */
  542. { .type = S3C_IRQTYPE_LEVEL, }, /* UART2 */
  543. { .type = S3C_IRQTYPE_EDGE, }, /* LCD */
  544. { .type = S3C_IRQTYPE_EDGE, }, /* DMA0 */
  545. { .type = S3C_IRQTYPE_EDGE, }, /* DMA1 */
  546. { .type = S3C_IRQTYPE_EDGE, }, /* DMA2 */
  547. { .type = S3C_IRQTYPE_EDGE, }, /* DMA3 */
  548. { .type = S3C_IRQTYPE_LEVEL, }, /* SDI/CF */
  549. { .type = S3C_IRQTYPE_EDGE, }, /* SPI0 */
  550. { .type = S3C_IRQTYPE_LEVEL, }, /* UART1 */
  551. { .type = S3C_IRQTYPE_NONE, }, /* reserved */
  552. { .type = S3C_IRQTYPE_EDGE, }, /* USBD */
  553. { .type = S3C_IRQTYPE_EDGE, }, /* USBH */
  554. { .type = S3C_IRQTYPE_EDGE, }, /* IIC */
  555. { .type = S3C_IRQTYPE_LEVEL, }, /* UART0 */
  556. { .type = S3C_IRQTYPE_EDGE, }, /* SPI1 */
  557. { .type = S3C_IRQTYPE_EDGE, }, /* RTC */
  558. { .type = S3C_IRQTYPE_LEVEL, }, /* ADCPARENT */
  559. };
  560. static struct s3c_irq_data init_s3c2412eint[32] = {
  561. { .type = S3C_IRQTYPE_EINT, .parent_irq = 0 }, /* EINT0 */
  562. { .type = S3C_IRQTYPE_EINT, .parent_irq = 1 }, /* EINT1 */
  563. { .type = S3C_IRQTYPE_EINT, .parent_irq = 2 }, /* EINT2 */
  564. { .type = S3C_IRQTYPE_EINT, .parent_irq = 3 }, /* EINT3 */
  565. { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT4 */
  566. { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT5 */
  567. { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT6 */
  568. { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT7 */
  569. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT8 */
  570. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT9 */
  571. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT10 */
  572. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT11 */
  573. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT12 */
  574. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT13 */
  575. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT14 */
  576. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT15 */
  577. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT16 */
  578. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT17 */
  579. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT18 */
  580. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT19 */
  581. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT20 */
  582. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT21 */
  583. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT22 */
  584. { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT23 */
  585. };
  586. static struct s3c_irq_data init_s3c2412subint[32] = {
  587. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-RX */
  588. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-TX */
  589. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-ERR */
  590. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-RX */
  591. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-TX */
  592. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-ERR */
  593. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-RX */
  594. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-TX */
  595. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-ERR */
  596. { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* TC */
  597. { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* ADC */
  598. { .type = S3C_IRQTYPE_NONE, },
  599. { .type = S3C_IRQTYPE_NONE, },
  600. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 21 }, /* SDI */
  601. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 21 }, /* CF */
  602. };
  603. void s3c2412_init_irq(void)
  604. {
  605. struct s3c_irq_intc *main_intc;
  606. pr_info("S3C2412: IRQ Support\n");
  607. #ifdef CONFIG_FIQ
  608. init_FIQ(FIQ_START);
  609. #endif
  610. main_intc = s3c24xx_init_intc(NULL, &init_s3c2412base[0], NULL, 0x4a000000);
  611. if (IS_ERR(main_intc)) {
  612. pr_err("irq: could not create main interrupt controller\n");
  613. return;
  614. }
  615. s3c24xx_init_intc(NULL, &init_s3c2412eint[0], main_intc, 0x560000a4);
  616. s3c24xx_init_intc(NULL, &init_s3c2412subint[0], main_intc, 0x4a000018);
  617. }
  618. #endif
  619. #ifdef CONFIG_CPU_S3C2416
  620. static struct s3c_irq_data init_s3c2416base[32] = {
  621. { .type = S3C_IRQTYPE_EINT, }, /* EINT0 */
  622. { .type = S3C_IRQTYPE_EINT, }, /* EINT1 */
  623. { .type = S3C_IRQTYPE_EINT, }, /* EINT2 */
  624. { .type = S3C_IRQTYPE_EINT, }, /* EINT3 */
  625. { .type = S3C_IRQTYPE_LEVEL, }, /* EINT4to7 */
  626. { .type = S3C_IRQTYPE_LEVEL, }, /* EINT8to23 */
  627. { .type = S3C_IRQTYPE_NONE, }, /* reserved */
  628. { .type = S3C_IRQTYPE_EDGE, }, /* nBATT_FLT */
  629. { .type = S3C_IRQTYPE_EDGE, }, /* TICK */
  630. { .type = S3C_IRQTYPE_LEVEL, }, /* WDT/AC97 */
  631. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER0 */
  632. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER1 */
  633. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER2 */
  634. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER3 */
  635. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER4 */
  636. { .type = S3C_IRQTYPE_LEVEL, }, /* UART2 */
  637. { .type = S3C_IRQTYPE_LEVEL, }, /* LCD */
  638. { .type = S3C_IRQTYPE_LEVEL, }, /* DMA */
  639. { .type = S3C_IRQTYPE_LEVEL, }, /* UART3 */
  640. { .type = S3C_IRQTYPE_NONE, }, /* reserved */
  641. { .type = S3C_IRQTYPE_EDGE, }, /* SDI1 */
  642. { .type = S3C_IRQTYPE_EDGE, }, /* SDI0 */
  643. { .type = S3C_IRQTYPE_EDGE, }, /* SPI0 */
  644. { .type = S3C_IRQTYPE_LEVEL, }, /* UART1 */
  645. { .type = S3C_IRQTYPE_EDGE, }, /* NAND */
  646. { .type = S3C_IRQTYPE_EDGE, }, /* USBD */
  647. { .type = S3C_IRQTYPE_EDGE, }, /* USBH */
  648. { .type = S3C_IRQTYPE_EDGE, }, /* IIC */
  649. { .type = S3C_IRQTYPE_LEVEL, }, /* UART0 */
  650. { .type = S3C_IRQTYPE_NONE, },
  651. { .type = S3C_IRQTYPE_EDGE, }, /* RTC */
  652. { .type = S3C_IRQTYPE_LEVEL, }, /* ADCPARENT */
  653. };
  654. static struct s3c_irq_data init_s3c2416subint[32] = {
  655. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-RX */
  656. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-TX */
  657. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-ERR */
  658. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-RX */
  659. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-TX */
  660. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-ERR */
  661. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-RX */
  662. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-TX */
  663. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-ERR */
  664. { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* TC */
  665. { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* ADC */
  666. { .type = S3C_IRQTYPE_NONE }, /* reserved */
  667. { .type = S3C_IRQTYPE_NONE }, /* reserved */
  668. { .type = S3C_IRQTYPE_NONE }, /* reserved */
  669. { .type = S3C_IRQTYPE_NONE }, /* reserved */
  670. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 16 }, /* LCD2 */
  671. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 16 }, /* LCD3 */
  672. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 16 }, /* LCD4 */
  673. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA0 */
  674. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA1 */
  675. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA2 */
  676. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA3 */
  677. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA4 */
  678. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA5 */
  679. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 18 }, /* UART3-RX */
  680. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 18 }, /* UART3-TX */
  681. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 18 }, /* UART3-ERR */
  682. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 9 }, /* WDT */
  683. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 9 }, /* AC97 */
  684. };
  685. static struct s3c_irq_data init_s3c2416_second[32] = {
  686. { .type = S3C_IRQTYPE_EDGE }, /* 2D */
  687. { .type = S3C_IRQTYPE_EDGE }, /* IIC1 */
  688. { .type = S3C_IRQTYPE_NONE }, /* reserved */
  689. { .type = S3C_IRQTYPE_NONE }, /* reserved */
  690. { .type = S3C_IRQTYPE_EDGE }, /* PCM0 */
  691. { .type = S3C_IRQTYPE_EDGE }, /* PCM1 */
  692. { .type = S3C_IRQTYPE_EDGE }, /* I2S0 */
  693. { .type = S3C_IRQTYPE_EDGE }, /* I2S1 */
  694. };
  695. void __init s3c2416_init_irq(void)
  696. {
  697. struct s3c_irq_intc *main_intc;
  698. pr_info("S3C2416: IRQ Support\n");
  699. #ifdef CONFIG_FIQ
  700. init_FIQ(FIQ_START);
  701. #endif
  702. main_intc = s3c24xx_init_intc(NULL, &init_s3c2416base[0], NULL, 0x4a000000);
  703. if (IS_ERR(main_intc)) {
  704. pr_err("irq: could not create main interrupt controller\n");
  705. return;
  706. }
  707. s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4);
  708. s3c24xx_init_intc(NULL, &init_s3c2416subint[0], main_intc, 0x4a000018);
  709. s3c24xx_init_intc(NULL, &init_s3c2416_second[0], NULL, 0x4a000040);
  710. }
  711. #endif
  712. #ifdef CONFIG_CPU_S3C2440
  713. static struct s3c_irq_data init_s3c2440base[32] = {
  714. { .type = S3C_IRQTYPE_EINT, }, /* EINT0 */
  715. { .type = S3C_IRQTYPE_EINT, }, /* EINT1 */
  716. { .type = S3C_IRQTYPE_EINT, }, /* EINT2 */
  717. { .type = S3C_IRQTYPE_EINT, }, /* EINT3 */
  718. { .type = S3C_IRQTYPE_LEVEL, }, /* EINT4to7 */
  719. { .type = S3C_IRQTYPE_LEVEL, }, /* EINT8to23 */
  720. { .type = S3C_IRQTYPE_LEVEL, }, /* CAM */
  721. { .type = S3C_IRQTYPE_EDGE, }, /* nBATT_FLT */
  722. { .type = S3C_IRQTYPE_EDGE, }, /* TICK */
  723. { .type = S3C_IRQTYPE_LEVEL, }, /* WDT/AC97 */
  724. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER0 */
  725. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER1 */
  726. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER2 */
  727. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER3 */
  728. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER4 */
  729. { .type = S3C_IRQTYPE_LEVEL, }, /* UART2 */
  730. { .type = S3C_IRQTYPE_EDGE, }, /* LCD */
  731. { .type = S3C_IRQTYPE_EDGE, }, /* DMA0 */
  732. { .type = S3C_IRQTYPE_EDGE, }, /* DMA1 */
  733. { .type = S3C_IRQTYPE_EDGE, }, /* DMA2 */
  734. { .type = S3C_IRQTYPE_EDGE, }, /* DMA3 */
  735. { .type = S3C_IRQTYPE_EDGE, }, /* SDI */
  736. { .type = S3C_IRQTYPE_EDGE, }, /* SPI0 */
  737. { .type = S3C_IRQTYPE_LEVEL, }, /* UART1 */
  738. { .type = S3C_IRQTYPE_LEVEL, }, /* NFCON */
  739. { .type = S3C_IRQTYPE_EDGE, }, /* USBD */
  740. { .type = S3C_IRQTYPE_EDGE, }, /* USBH */
  741. { .type = S3C_IRQTYPE_EDGE, }, /* IIC */
  742. { .type = S3C_IRQTYPE_LEVEL, }, /* UART0 */
  743. { .type = S3C_IRQTYPE_EDGE, }, /* SPI1 */
  744. { .type = S3C_IRQTYPE_EDGE, }, /* RTC */
  745. { .type = S3C_IRQTYPE_LEVEL, }, /* ADCPARENT */
  746. };
  747. static struct s3c_irq_data init_s3c2440subint[32] = {
  748. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-RX */
  749. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-TX */
  750. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-ERR */
  751. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-RX */
  752. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-TX */
  753. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-ERR */
  754. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-RX */
  755. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-TX */
  756. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-ERR */
  757. { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* TC */
  758. { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* ADC */
  759. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* TC */
  760. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* ADC */
  761. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 9 }, /* WDT */
  762. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 9 }, /* AC97 */
  763. };
  764. void __init s3c2440_init_irq(void)
  765. {
  766. struct s3c_irq_intc *main_intc;
  767. pr_info("S3C2440: IRQ Support\n");
  768. #ifdef CONFIG_FIQ
  769. init_FIQ(FIQ_START);
  770. #endif
  771. main_intc = s3c24xx_init_intc(NULL, &init_s3c2440base[0], NULL, 0x4a000000);
  772. if (IS_ERR(main_intc)) {
  773. pr_err("irq: could not create main interrupt controller\n");
  774. return;
  775. }
  776. s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4);
  777. s3c24xx_init_intc(NULL, &init_s3c2440subint[0], main_intc, 0x4a000018);
  778. }
  779. #endif
  780. #ifdef CONFIG_CPU_S3C2442
  781. static struct s3c_irq_data init_s3c2442base[32] = {
  782. { .type = S3C_IRQTYPE_EINT, }, /* EINT0 */
  783. { .type = S3C_IRQTYPE_EINT, }, /* EINT1 */
  784. { .type = S3C_IRQTYPE_EINT, }, /* EINT2 */
  785. { .type = S3C_IRQTYPE_EINT, }, /* EINT3 */
  786. { .type = S3C_IRQTYPE_LEVEL, }, /* EINT4to7 */
  787. { .type = S3C_IRQTYPE_LEVEL, }, /* EINT8to23 */
  788. { .type = S3C_IRQTYPE_LEVEL, }, /* CAM */
  789. { .type = S3C_IRQTYPE_EDGE, }, /* nBATT_FLT */
  790. { .type = S3C_IRQTYPE_EDGE, }, /* TICK */
  791. { .type = S3C_IRQTYPE_EDGE, }, /* WDT */
  792. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER0 */
  793. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER1 */
  794. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER2 */
  795. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER3 */
  796. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER4 */
  797. { .type = S3C_IRQTYPE_LEVEL, }, /* UART2 */
  798. { .type = S3C_IRQTYPE_EDGE, }, /* LCD */
  799. { .type = S3C_IRQTYPE_EDGE, }, /* DMA0 */
  800. { .type = S3C_IRQTYPE_EDGE, }, /* DMA1 */
  801. { .type = S3C_IRQTYPE_EDGE, }, /* DMA2 */
  802. { .type = S3C_IRQTYPE_EDGE, }, /* DMA3 */
  803. { .type = S3C_IRQTYPE_EDGE, }, /* SDI */
  804. { .type = S3C_IRQTYPE_EDGE, }, /* SPI0 */
  805. { .type = S3C_IRQTYPE_LEVEL, }, /* UART1 */
  806. { .type = S3C_IRQTYPE_LEVEL, }, /* NFCON */
  807. { .type = S3C_IRQTYPE_EDGE, }, /* USBD */
  808. { .type = S3C_IRQTYPE_EDGE, }, /* USBH */
  809. { .type = S3C_IRQTYPE_EDGE, }, /* IIC */
  810. { .type = S3C_IRQTYPE_LEVEL, }, /* UART0 */
  811. { .type = S3C_IRQTYPE_EDGE, }, /* SPI1 */
  812. { .type = S3C_IRQTYPE_EDGE, }, /* RTC */
  813. { .type = S3C_IRQTYPE_LEVEL, }, /* ADCPARENT */
  814. };
  815. static struct s3c_irq_data init_s3c2442subint[32] = {
  816. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-RX */
  817. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-TX */
  818. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-ERR */
  819. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-RX */
  820. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-TX */
  821. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-ERR */
  822. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-RX */
  823. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-TX */
  824. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-ERR */
  825. { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* TC */
  826. { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* ADC */
  827. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* TC */
  828. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* ADC */
  829. };
  830. void __init s3c2442_init_irq(void)
  831. {
  832. struct s3c_irq_intc *main_intc;
  833. pr_info("S3C2442: IRQ Support\n");
  834. #ifdef CONFIG_FIQ
  835. init_FIQ(FIQ_START);
  836. #endif
  837. main_intc = s3c24xx_init_intc(NULL, &init_s3c2442base[0], NULL, 0x4a000000);
  838. if (IS_ERR(main_intc)) {
  839. pr_err("irq: could not create main interrupt controller\n");
  840. return;
  841. }
  842. s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4);
  843. s3c24xx_init_intc(NULL, &init_s3c2442subint[0], main_intc, 0x4a000018);
  844. }
  845. #endif
  846. #ifdef CONFIG_CPU_S3C2443
  847. static struct s3c_irq_data init_s3c2443base[32] = {
  848. { .type = S3C_IRQTYPE_EINT, }, /* EINT0 */
  849. { .type = S3C_IRQTYPE_EINT, }, /* EINT1 */
  850. { .type = S3C_IRQTYPE_EINT, }, /* EINT2 */
  851. { .type = S3C_IRQTYPE_EINT, }, /* EINT3 */
  852. { .type = S3C_IRQTYPE_LEVEL, }, /* EINT4to7 */
  853. { .type = S3C_IRQTYPE_LEVEL, }, /* EINT8to23 */
  854. { .type = S3C_IRQTYPE_LEVEL, }, /* CAM */
  855. { .type = S3C_IRQTYPE_EDGE, }, /* nBATT_FLT */
  856. { .type = S3C_IRQTYPE_EDGE, }, /* TICK */
  857. { .type = S3C_IRQTYPE_LEVEL, }, /* WDT/AC97 */
  858. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER0 */
  859. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER1 */
  860. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER2 */
  861. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER3 */
  862. { .type = S3C_IRQTYPE_EDGE, }, /* TIMER4 */
  863. { .type = S3C_IRQTYPE_LEVEL, }, /* UART2 */
  864. { .type = S3C_IRQTYPE_LEVEL, }, /* LCD */
  865. { .type = S3C_IRQTYPE_LEVEL, }, /* DMA */
  866. { .type = S3C_IRQTYPE_LEVEL, }, /* UART3 */
  867. { .type = S3C_IRQTYPE_EDGE, }, /* CFON */
  868. { .type = S3C_IRQTYPE_EDGE, }, /* SDI1 */
  869. { .type = S3C_IRQTYPE_EDGE, }, /* SDI0 */
  870. { .type = S3C_IRQTYPE_EDGE, }, /* SPI0 */
  871. { .type = S3C_IRQTYPE_LEVEL, }, /* UART1 */
  872. { .type = S3C_IRQTYPE_EDGE, }, /* NAND */
  873. { .type = S3C_IRQTYPE_EDGE, }, /* USBD */
  874. { .type = S3C_IRQTYPE_EDGE, }, /* USBH */
  875. { .type = S3C_IRQTYPE_EDGE, }, /* IIC */
  876. { .type = S3C_IRQTYPE_LEVEL, }, /* UART0 */
  877. { .type = S3C_IRQTYPE_EDGE, }, /* SPI1 */
  878. { .type = S3C_IRQTYPE_EDGE, }, /* RTC */
  879. { .type = S3C_IRQTYPE_LEVEL, }, /* ADCPARENT */
  880. };
  881. static struct s3c_irq_data init_s3c2443subint[32] = {
  882. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-RX */
  883. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-TX */
  884. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-ERR */
  885. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-RX */
  886. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-TX */
  887. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-ERR */
  888. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-RX */
  889. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-TX */
  890. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-ERR */
  891. { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* TC */
  892. { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* ADC */
  893. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* CAM_C */
  894. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* CAM_P */
  895. { .type = S3C_IRQTYPE_NONE }, /* reserved */
  896. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 16 }, /* LCD1 */
  897. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 16 }, /* LCD2 */
  898. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 16 }, /* LCD3 */
  899. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 16 }, /* LCD4 */
  900. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA0 */
  901. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA1 */
  902. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA2 */
  903. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA3 */
  904. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA4 */
  905. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA5 */
  906. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 18 }, /* UART3-RX */
  907. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 18 }, /* UART3-TX */
  908. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 18 }, /* UART3-ERR */
  909. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 9 }, /* WDT */
  910. { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 9 }, /* AC97 */
  911. };
  912. void __init s3c2443_init_irq(void)
  913. {
  914. struct s3c_irq_intc *main_intc;
  915. pr_info("S3C2443: IRQ Support\n");
  916. #ifdef CONFIG_FIQ
  917. init_FIQ(FIQ_START);
  918. #endif
  919. main_intc = s3c24xx_init_intc(NULL, &init_s3c2443base[0], NULL, 0x4a000000);
  920. if (IS_ERR(main_intc)) {
  921. pr_err("irq: could not create main interrupt controller\n");
  922. return;
  923. }
  924. s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4);
  925. s3c24xx_init_intc(NULL, &init_s3c2443subint[0], main_intc, 0x4a000018);
  926. }
  927. #endif