Merge tag 'timer-samsung-for-v3.10' of git://git.kernel.org/pub/scm/linux/kernel...
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-exynos / common.c
1 /*
2  * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
3  *              http://www.samsung.com
4  *
5  * Common Codes for EXYNOS
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  */
11
12 #include <linux/kernel.h>
13 #include <linux/interrupt.h>
14 #include <linux/irq.h>
15 #include <linux/irqchip.h>
16 #include <linux/io.h>
17 #include <linux/device.h>
18 #include <linux/gpio.h>
19 #include <linux/sched.h>
20 #include <linux/serial_core.h>
21 #include <linux/of.h>
22 #include <linux/of_fdt.h>
23 #include <linux/of_irq.h>
24 #include <linux/export.h>
25 #include <linux/irqdomain.h>
26 #include <linux/irqchip.h>
27 #include <linux/of_address.h>
28 #include <linux/clocksource.h>
29 #include <linux/clk-provider.h>
30 #include <linux/irqchip/arm-gic.h>
31
32 #include <asm/proc-fns.h>
33 #include <asm/exception.h>
34 #include <asm/hardware/cache-l2x0.h>
35 #include <asm/mach/map.h>
36 #include <asm/mach/irq.h>
37 #include <asm/cacheflush.h>
38
39 #include <mach/regs-irq.h>
40 #include <mach/regs-pmu.h>
41 #include <mach/regs-gpio.h>
42 #include <mach/irqs.h>
43
44 #include <plat/cpu.h>
45 #include <plat/devs.h>
46 #include <plat/pm.h>
47 #include <plat/sdhci.h>
48 #include <plat/gpio-cfg.h>
49 #include <plat/adc-core.h>
50 #include <plat/fb-core.h>
51 #include <plat/fimc-core.h>
52 #include <plat/iic-core.h>
53 #include <plat/tv-core.h>
54 #include <plat/spi-core.h>
55 #include <plat/regs-serial.h>
56
57 #include "common.h"
58 #define L2_AUX_VAL 0x7C470001
59 #define L2_AUX_MASK 0xC200ffff
60
61 static const char name_exynos4210[] = "EXYNOS4210";
62 static const char name_exynos4212[] = "EXYNOS4212";
63 static const char name_exynos4412[] = "EXYNOS4412";
64 static const char name_exynos5250[] = "EXYNOS5250";
65 static const char name_exynos5440[] = "EXYNOS5440";
66
67 static void exynos4_map_io(void);
68 static void exynos5_map_io(void);
69 static void exynos5440_map_io(void);
70 static void exynos4_init_uarts(struct s3c2410_uartcfg *cfg, int no);
71 static int exynos_init(void);
72
73 unsigned long xxti_f = 0, xusbxti_f = 0;
74
75 static struct cpu_table cpu_ids[] __initdata = {
76         {
77                 .idcode         = EXYNOS4210_CPU_ID,
78                 .idmask         = EXYNOS4_CPU_MASK,
79                 .map_io         = exynos4_map_io,
80                 .init_uarts     = exynos4_init_uarts,
81                 .init           = exynos_init,
82                 .name           = name_exynos4210,
83         }, {
84                 .idcode         = EXYNOS4212_CPU_ID,
85                 .idmask         = EXYNOS4_CPU_MASK,
86                 .map_io         = exynos4_map_io,
87                 .init_uarts     = exynos4_init_uarts,
88                 .init           = exynos_init,
89                 .name           = name_exynos4212,
90         }, {
91                 .idcode         = EXYNOS4412_CPU_ID,
92                 .idmask         = EXYNOS4_CPU_MASK,
93                 .map_io         = exynos4_map_io,
94                 .init_uarts     = exynos4_init_uarts,
95                 .init           = exynos_init,
96                 .name           = name_exynos4412,
97         }, {
98                 .idcode         = EXYNOS5250_SOC_ID,
99                 .idmask         = EXYNOS5_SOC_MASK,
100                 .map_io         = exynos5_map_io,
101                 .init           = exynos_init,
102                 .name           = name_exynos5250,
103         }, {
104                 .idcode         = EXYNOS5440_SOC_ID,
105                 .idmask         = EXYNOS5_SOC_MASK,
106                 .map_io         = exynos5440_map_io,
107                 .init           = exynos_init,
108                 .name           = name_exynos5440,
109         },
110 };
111
112 /* Initial IO mappings */
113
114 static struct map_desc exynos_iodesc[] __initdata = {
115         {
116                 .virtual        = (unsigned long)S5P_VA_CHIPID,
117                 .pfn            = __phys_to_pfn(EXYNOS_PA_CHIPID),
118                 .length         = SZ_4K,
119                 .type           = MT_DEVICE,
120         },
121 };
122
123 #ifdef CONFIG_ARCH_EXYNOS5
124 static struct map_desc exynos5440_iodesc[] __initdata = {
125         {
126                 .virtual        = (unsigned long)S5P_VA_CHIPID,
127                 .pfn            = __phys_to_pfn(EXYNOS5440_PA_CHIPID),
128                 .length         = SZ_4K,
129                 .type           = MT_DEVICE,
130         },
131 };
132 #endif
133
134 static struct map_desc exynos4_iodesc[] __initdata = {
135         {
136                 .virtual        = (unsigned long)S3C_VA_SYS,
137                 .pfn            = __phys_to_pfn(EXYNOS4_PA_SYSCON),
138                 .length         = SZ_64K,
139                 .type           = MT_DEVICE,
140         }, {
141                 .virtual        = (unsigned long)S3C_VA_TIMER,
142                 .pfn            = __phys_to_pfn(EXYNOS4_PA_TIMER),
143                 .length         = SZ_16K,
144                 .type           = MT_DEVICE,
145         }, {
146                 .virtual        = (unsigned long)S3C_VA_WATCHDOG,
147                 .pfn            = __phys_to_pfn(EXYNOS4_PA_WATCHDOG),
148                 .length         = SZ_4K,
149                 .type           = MT_DEVICE,
150         }, {
151                 .virtual        = (unsigned long)S5P_VA_SROMC,
152                 .pfn            = __phys_to_pfn(EXYNOS4_PA_SROMC),
153                 .length         = SZ_4K,
154                 .type           = MT_DEVICE,
155         }, {
156                 .virtual        = (unsigned long)S5P_VA_SYSTIMER,
157                 .pfn            = __phys_to_pfn(EXYNOS4_PA_SYSTIMER),
158                 .length         = SZ_4K,
159                 .type           = MT_DEVICE,
160         }, {
161                 .virtual        = (unsigned long)S5P_VA_PMU,
162                 .pfn            = __phys_to_pfn(EXYNOS4_PA_PMU),
163                 .length         = SZ_64K,
164                 .type           = MT_DEVICE,
165         }, {
166                 .virtual        = (unsigned long)S5P_VA_COMBINER_BASE,
167                 .pfn            = __phys_to_pfn(EXYNOS4_PA_COMBINER),
168                 .length         = SZ_4K,
169                 .type           = MT_DEVICE,
170         }, {
171                 .virtual        = (unsigned long)S5P_VA_GIC_CPU,
172                 .pfn            = __phys_to_pfn(EXYNOS4_PA_GIC_CPU),
173                 .length         = SZ_64K,
174                 .type           = MT_DEVICE,
175         }, {
176                 .virtual        = (unsigned long)S5P_VA_GIC_DIST,
177                 .pfn            = __phys_to_pfn(EXYNOS4_PA_GIC_DIST),
178                 .length         = SZ_64K,
179                 .type           = MT_DEVICE,
180         }, {
181                 .virtual        = (unsigned long)S3C_VA_UART,
182                 .pfn            = __phys_to_pfn(EXYNOS4_PA_UART),
183                 .length         = SZ_512K,
184                 .type           = MT_DEVICE,
185         }, {
186                 .virtual        = (unsigned long)S5P_VA_CMU,
187                 .pfn            = __phys_to_pfn(EXYNOS4_PA_CMU),
188                 .length         = SZ_128K,
189                 .type           = MT_DEVICE,
190         }, {
191                 .virtual        = (unsigned long)S5P_VA_COREPERI_BASE,
192                 .pfn            = __phys_to_pfn(EXYNOS4_PA_COREPERI),
193                 .length         = SZ_8K,
194                 .type           = MT_DEVICE,
195         }, {
196                 .virtual        = (unsigned long)S5P_VA_L2CC,
197                 .pfn            = __phys_to_pfn(EXYNOS4_PA_L2CC),
198                 .length         = SZ_4K,
199                 .type           = MT_DEVICE,
200         }, {
201                 .virtual        = (unsigned long)S5P_VA_DMC0,
202                 .pfn            = __phys_to_pfn(EXYNOS4_PA_DMC0),
203                 .length         = SZ_64K,
204                 .type           = MT_DEVICE,
205         }, {
206                 .virtual        = (unsigned long)S5P_VA_DMC1,
207                 .pfn            = __phys_to_pfn(EXYNOS4_PA_DMC1),
208                 .length         = SZ_64K,
209                 .type           = MT_DEVICE,
210         }, {
211                 .virtual        = (unsigned long)S3C_VA_USB_HSPHY,
212                 .pfn            = __phys_to_pfn(EXYNOS4_PA_HSPHY),
213                 .length         = SZ_4K,
214                 .type           = MT_DEVICE,
215         },
216 };
217
218 static struct map_desc exynos4_iodesc0[] __initdata = {
219         {
220                 .virtual        = (unsigned long)S5P_VA_SYSRAM,
221                 .pfn            = __phys_to_pfn(EXYNOS4_PA_SYSRAM0),
222                 .length         = SZ_4K,
223                 .type           = MT_DEVICE,
224         },
225 };
226
227 static struct map_desc exynos4_iodesc1[] __initdata = {
228         {
229                 .virtual        = (unsigned long)S5P_VA_SYSRAM,
230                 .pfn            = __phys_to_pfn(EXYNOS4_PA_SYSRAM1),
231                 .length         = SZ_4K,
232                 .type           = MT_DEVICE,
233         },
234 };
235
236 static struct map_desc exynos5_iodesc[] __initdata = {
237         {
238                 .virtual        = (unsigned long)S3C_VA_SYS,
239                 .pfn            = __phys_to_pfn(EXYNOS5_PA_SYSCON),
240                 .length         = SZ_64K,
241                 .type           = MT_DEVICE,
242         }, {
243                 .virtual        = (unsigned long)S3C_VA_TIMER,
244                 .pfn            = __phys_to_pfn(EXYNOS5_PA_TIMER),
245                 .length         = SZ_16K,
246                 .type           = MT_DEVICE,
247         }, {
248                 .virtual        = (unsigned long)S3C_VA_WATCHDOG,
249                 .pfn            = __phys_to_pfn(EXYNOS5_PA_WATCHDOG),
250                 .length         = SZ_4K,
251                 .type           = MT_DEVICE,
252         }, {
253                 .virtual        = (unsigned long)S5P_VA_SROMC,
254                 .pfn            = __phys_to_pfn(EXYNOS5_PA_SROMC),
255                 .length         = SZ_4K,
256                 .type           = MT_DEVICE,
257         }, {
258                 .virtual        = (unsigned long)S5P_VA_SYSRAM,
259                 .pfn            = __phys_to_pfn(EXYNOS5_PA_SYSRAM),
260                 .length         = SZ_4K,
261                 .type           = MT_DEVICE,
262         }, {
263                 .virtual        = (unsigned long)S5P_VA_CMU,
264                 .pfn            = __phys_to_pfn(EXYNOS5_PA_CMU),
265                 .length         = 144 * SZ_1K,
266                 .type           = MT_DEVICE,
267         }, {
268                 .virtual        = (unsigned long)S5P_VA_PMU,
269                 .pfn            = __phys_to_pfn(EXYNOS5_PA_PMU),
270                 .length         = SZ_64K,
271                 .type           = MT_DEVICE,
272         }, {
273                 .virtual        = (unsigned long)S3C_VA_UART,
274                 .pfn            = __phys_to_pfn(EXYNOS5_PA_UART),
275                 .length         = SZ_512K,
276                 .type           = MT_DEVICE,
277         },
278 };
279
280 static struct map_desc exynos5440_iodesc0[] __initdata = {
281         {
282                 .virtual        = (unsigned long)S3C_VA_UART,
283                 .pfn            = __phys_to_pfn(EXYNOS5440_PA_UART0),
284                 .length         = SZ_512K,
285                 .type           = MT_DEVICE,
286         },
287 };
288
289 void exynos4_restart(char mode, const char *cmd)
290 {
291         __raw_writel(0x1, S5P_SWRESET);
292 }
293
294 void exynos5_restart(char mode, const char *cmd)
295 {
296         struct device_node *np;
297         u32 val;
298         void __iomem *addr;
299
300         if (of_machine_is_compatible("samsung,exynos5250")) {
301                 val = 0x1;
302                 addr = EXYNOS_SWRESET;
303         } else if (of_machine_is_compatible("samsung,exynos5440")) {
304                 np = of_find_compatible_node(NULL, NULL, "samsung,exynos5440-clock");
305                 addr = of_iomap(np, 0) + 0xcc;
306                 val = (0xfff << 20) | (0x1 << 16);
307         } else {
308                 pr_err("%s: cannot support non-DT\n", __func__);
309                 return;
310         }
311
312         __raw_writel(val, addr);
313 }
314
315 void __init exynos_init_late(void)
316 {
317         if (of_machine_is_compatible("samsung,exynos5440"))
318                 /* to be supported later */
319                 return;
320
321         exynos_pm_late_initcall();
322 }
323
324 /*
325  * exynos_map_io
326  *
327  * register the standard cpu IO areas
328  */
329
330 void __init exynos_init_io(struct map_desc *mach_desc, int size)
331 {
332         struct map_desc *iodesc = exynos_iodesc;
333         int iodesc_sz = ARRAY_SIZE(exynos_iodesc);
334 #if defined(CONFIG_OF) && defined(CONFIG_ARCH_EXYNOS5)
335         unsigned long root = of_get_flat_dt_root();
336
337         /* initialize the io descriptors we need for initialization */
338         if (of_flat_dt_is_compatible(root, "samsung,exynos5440")) {
339                 iodesc = exynos5440_iodesc;
340                 iodesc_sz = ARRAY_SIZE(exynos5440_iodesc);
341         }
342 #endif
343
344         iotable_init(iodesc, iodesc_sz);
345
346         if (mach_desc)
347                 iotable_init(mach_desc, size);
348
349         /* detect cpu id and rev. */
350         s5p_init_cpu(S5P_VA_CHIPID);
351
352         s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids));
353 }
354
355 static void __init exynos4_map_io(void)
356 {
357         iotable_init(exynos4_iodesc, ARRAY_SIZE(exynos4_iodesc));
358
359         if (soc_is_exynos4210() && samsung_rev() == EXYNOS4210_REV_0)
360                 iotable_init(exynos4_iodesc0, ARRAY_SIZE(exynos4_iodesc0));
361         else
362                 iotable_init(exynos4_iodesc1, ARRAY_SIZE(exynos4_iodesc1));
363
364         /* initialize device information early */
365         exynos4_default_sdhci0();
366         exynos4_default_sdhci1();
367         exynos4_default_sdhci2();
368         exynos4_default_sdhci3();
369
370         s3c_adc_setname("samsung-adc-v3");
371
372         s3c_fimc_setname(0, "exynos4-fimc");
373         s3c_fimc_setname(1, "exynos4-fimc");
374         s3c_fimc_setname(2, "exynos4-fimc");
375         s3c_fimc_setname(3, "exynos4-fimc");
376
377         s3c_sdhci_setname(0, "exynos4-sdhci");
378         s3c_sdhci_setname(1, "exynos4-sdhci");
379         s3c_sdhci_setname(2, "exynos4-sdhci");
380         s3c_sdhci_setname(3, "exynos4-sdhci");
381
382         /* The I2C bus controllers are directly compatible with s3c2440 */
383         s3c_i2c0_setname("s3c2440-i2c");
384         s3c_i2c1_setname("s3c2440-i2c");
385         s3c_i2c2_setname("s3c2440-i2c");
386
387         s5p_fb_setname(0, "exynos4-fb");
388         s5p_hdmi_setname("exynos4-hdmi");
389
390         s3c64xx_spi_setname("exynos4210-spi");
391 }
392
393 static void __init exynos5_map_io(void)
394 {
395         iotable_init(exynos5_iodesc, ARRAY_SIZE(exynos5_iodesc));
396 }
397
398 static void __init exynos5440_map_io(void)
399 {
400         iotable_init(exynos5440_iodesc0, ARRAY_SIZE(exynos5440_iodesc0));
401 }
402
403 void __init exynos_init_time(void)
404 {
405         if (of_have_populated_dt()) {
406 #ifdef CONFIG_OF
407                 of_clk_init(NULL);
408                 clocksource_of_init();
409 #endif
410         } else {
411                 /* todo: remove after migrating legacy E4 platforms to dt */
412 #ifdef CONFIG_ARCH_EXYNOS4
413                 exynos4_clk_init(NULL);
414                 exynos4_clk_register_fixed_ext(xxti_f, xusbxti_f);
415 #endif
416                 mct_init();
417         }
418 }
419
420 void __init exynos4_init_irq(void)
421 {
422         unsigned int gic_bank_offset;
423
424         gic_bank_offset = soc_is_exynos4412() ? 0x4000 : 0x8000;
425
426         if (!of_have_populated_dt())
427                 gic_init_bases(0, IRQ_PPI(0), S5P_VA_GIC_DIST, S5P_VA_GIC_CPU, gic_bank_offset, NULL);
428 #ifdef CONFIG_OF
429         else
430                 irqchip_init();
431 #endif
432
433         if (!of_have_populated_dt())
434                 combiner_init(S5P_VA_COMBINER_BASE, NULL);
435
436         /*
437          * The parameters of s5p_init_irq() are for VIC init.
438          * Theses parameters should be NULL and 0 because EXYNOS4
439          * uses GIC instead of VIC.
440          */
441         s5p_init_irq(NULL, 0);
442 }
443
444 void __init exynos5_init_irq(void)
445 {
446 #ifdef CONFIG_OF
447         irqchip_init();
448 #endif
449         /*
450          * The parameters of s5p_init_irq() are for VIC init.
451          * Theses parameters should be NULL and 0 because EXYNOS4
452          * uses GIC instead of VIC.
453          */
454         if (!of_machine_is_compatible("samsung,exynos5440"))
455                 s5p_init_irq(NULL, 0);
456
457         gic_arch_extn.irq_set_wake = s3c_irq_wake;
458 }
459
460 struct bus_type exynos_subsys = {
461         .name           = "exynos-core",
462         .dev_name       = "exynos-core",
463 };
464
465 static struct device exynos4_dev = {
466         .bus    = &exynos_subsys,
467 };
468
469 static int __init exynos_core_init(void)
470 {
471         return subsys_system_register(&exynos_subsys, NULL);
472 }
473 core_initcall(exynos_core_init);
474
475 #ifdef CONFIG_CACHE_L2X0
476 static int __init exynos4_l2x0_cache_init(void)
477 {
478         int ret;
479
480         if (soc_is_exynos5250() || soc_is_exynos5440())
481                 return 0;
482
483         ret = l2x0_of_init(L2_AUX_VAL, L2_AUX_MASK);
484         if (!ret) {
485                 l2x0_regs_phys = virt_to_phys(&l2x0_saved_regs);
486                 clean_dcache_area(&l2x0_regs_phys, sizeof(unsigned long));
487                 return 0;
488         }
489
490         if (!(__raw_readl(S5P_VA_L2CC + L2X0_CTRL) & 0x1)) {
491                 l2x0_saved_regs.phy_base = EXYNOS4_PA_L2CC;
492                 /* TAG, Data Latency Control: 2 cycles */
493                 l2x0_saved_regs.tag_latency = 0x110;
494
495                 if (soc_is_exynos4212() || soc_is_exynos4412())
496                         l2x0_saved_regs.data_latency = 0x120;
497                 else
498                         l2x0_saved_regs.data_latency = 0x110;
499
500                 l2x0_saved_regs.prefetch_ctrl = 0x30000007;
501                 l2x0_saved_regs.pwr_ctrl =
502                         (L2X0_DYNAMIC_CLK_GATING_EN | L2X0_STNDBY_MODE_EN);
503
504                 l2x0_regs_phys = virt_to_phys(&l2x0_saved_regs);
505
506                 __raw_writel(l2x0_saved_regs.tag_latency,
507                                 S5P_VA_L2CC + L2X0_TAG_LATENCY_CTRL);
508                 __raw_writel(l2x0_saved_regs.data_latency,
509                                 S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL);
510
511                 /* L2X0 Prefetch Control */
512                 __raw_writel(l2x0_saved_regs.prefetch_ctrl,
513                                 S5P_VA_L2CC + L2X0_PREFETCH_CTRL);
514
515                 /* L2X0 Power Control */
516                 __raw_writel(l2x0_saved_regs.pwr_ctrl,
517                                 S5P_VA_L2CC + L2X0_POWER_CTRL);
518
519                 clean_dcache_area(&l2x0_regs_phys, sizeof(unsigned long));
520                 clean_dcache_area(&l2x0_saved_regs, sizeof(struct l2x0_regs));
521         }
522
523         l2x0_init(S5P_VA_L2CC, L2_AUX_VAL, L2_AUX_MASK);
524         return 0;
525 }
526 early_initcall(exynos4_l2x0_cache_init);
527 #endif
528
529 static int __init exynos_init(void)
530 {
531         printk(KERN_INFO "EXYNOS: Initializing architecture\n");
532
533         return device_register(&exynos4_dev);
534 }
535
536 /* uart registration process */
537
538 static void __init exynos4_init_uarts(struct s3c2410_uartcfg *cfg, int no)
539 {
540         struct s3c2410_uartcfg *tcfg = cfg;
541         u32 ucnt;
542
543         for (ucnt = 0; ucnt < no; ucnt++, tcfg++)
544                 tcfg->has_fracval = 1;
545
546         s3c24xx_init_uartdevs("exynos4210-uart", exynos4_uart_resources, cfg, no);
547 }
548
549 static void __iomem *exynos_eint_base;
550
551 static DEFINE_SPINLOCK(eint_lock);
552
553 static unsigned int eint0_15_data[16];
554
555 static inline int exynos4_irq_to_gpio(unsigned int irq)
556 {
557         if (irq < IRQ_EINT(0))
558                 return -EINVAL;
559
560         irq -= IRQ_EINT(0);
561         if (irq < 8)
562                 return EXYNOS4_GPX0(irq);
563
564         irq -= 8;
565         if (irq < 8)
566                 return EXYNOS4_GPX1(irq);
567
568         irq -= 8;
569         if (irq < 8)
570                 return EXYNOS4_GPX2(irq);
571
572         irq -= 8;
573         if (irq < 8)
574                 return EXYNOS4_GPX3(irq);
575
576         return -EINVAL;
577 }
578
579 static inline int exynos5_irq_to_gpio(unsigned int irq)
580 {
581         if (irq < IRQ_EINT(0))
582                 return -EINVAL;
583
584         irq -= IRQ_EINT(0);
585         if (irq < 8)
586                 return EXYNOS5_GPX0(irq);
587
588         irq -= 8;
589         if (irq < 8)
590                 return EXYNOS5_GPX1(irq);
591
592         irq -= 8;
593         if (irq < 8)
594                 return EXYNOS5_GPX2(irq);
595
596         irq -= 8;
597         if (irq < 8)
598                 return EXYNOS5_GPX3(irq);
599
600         return -EINVAL;
601 }
602
603 static unsigned int exynos4_eint0_15_src_int[16] = {
604         EXYNOS4_IRQ_EINT0,
605         EXYNOS4_IRQ_EINT1,
606         EXYNOS4_IRQ_EINT2,
607         EXYNOS4_IRQ_EINT3,
608         EXYNOS4_IRQ_EINT4,
609         EXYNOS4_IRQ_EINT5,
610         EXYNOS4_IRQ_EINT6,
611         EXYNOS4_IRQ_EINT7,
612         EXYNOS4_IRQ_EINT8,
613         EXYNOS4_IRQ_EINT9,
614         EXYNOS4_IRQ_EINT10,
615         EXYNOS4_IRQ_EINT11,
616         EXYNOS4_IRQ_EINT12,
617         EXYNOS4_IRQ_EINT13,
618         EXYNOS4_IRQ_EINT14,
619         EXYNOS4_IRQ_EINT15,
620 };
621
622 static unsigned int exynos5_eint0_15_src_int[16] = {
623         EXYNOS5_IRQ_EINT0,
624         EXYNOS5_IRQ_EINT1,
625         EXYNOS5_IRQ_EINT2,
626         EXYNOS5_IRQ_EINT3,
627         EXYNOS5_IRQ_EINT4,
628         EXYNOS5_IRQ_EINT5,
629         EXYNOS5_IRQ_EINT6,
630         EXYNOS5_IRQ_EINT7,
631         EXYNOS5_IRQ_EINT8,
632         EXYNOS5_IRQ_EINT9,
633         EXYNOS5_IRQ_EINT10,
634         EXYNOS5_IRQ_EINT11,
635         EXYNOS5_IRQ_EINT12,
636         EXYNOS5_IRQ_EINT13,
637         EXYNOS5_IRQ_EINT14,
638         EXYNOS5_IRQ_EINT15,
639 };
640 static inline void exynos_irq_eint_mask(struct irq_data *data)
641 {
642         u32 mask;
643
644         spin_lock(&eint_lock);
645         mask = __raw_readl(EINT_MASK(exynos_eint_base, data->irq));
646         mask |= EINT_OFFSET_BIT(data->irq);
647         __raw_writel(mask, EINT_MASK(exynos_eint_base, data->irq));
648         spin_unlock(&eint_lock);
649 }
650
651 static void exynos_irq_eint_unmask(struct irq_data *data)
652 {
653         u32 mask;
654
655         spin_lock(&eint_lock);
656         mask = __raw_readl(EINT_MASK(exynos_eint_base, data->irq));
657         mask &= ~(EINT_OFFSET_BIT(data->irq));
658         __raw_writel(mask, EINT_MASK(exynos_eint_base, data->irq));
659         spin_unlock(&eint_lock);
660 }
661
662 static inline void exynos_irq_eint_ack(struct irq_data *data)
663 {
664         __raw_writel(EINT_OFFSET_BIT(data->irq),
665                      EINT_PEND(exynos_eint_base, data->irq));
666 }
667
668 static void exynos_irq_eint_maskack(struct irq_data *data)
669 {
670         exynos_irq_eint_mask(data);
671         exynos_irq_eint_ack(data);
672 }
673
674 static int exynos_irq_eint_set_type(struct irq_data *data, unsigned int type)
675 {
676         int offs = EINT_OFFSET(data->irq);
677         int shift;
678         u32 ctrl, mask;
679         u32 newvalue = 0;
680
681         switch (type) {
682         case IRQ_TYPE_EDGE_RISING:
683                 newvalue = S5P_IRQ_TYPE_EDGE_RISING;
684                 break;
685
686         case IRQ_TYPE_EDGE_FALLING:
687                 newvalue = S5P_IRQ_TYPE_EDGE_FALLING;
688                 break;
689
690         case IRQ_TYPE_EDGE_BOTH:
691                 newvalue = S5P_IRQ_TYPE_EDGE_BOTH;
692                 break;
693
694         case IRQ_TYPE_LEVEL_LOW:
695                 newvalue = S5P_IRQ_TYPE_LEVEL_LOW;
696                 break;
697
698         case IRQ_TYPE_LEVEL_HIGH:
699                 newvalue = S5P_IRQ_TYPE_LEVEL_HIGH;
700                 break;
701
702         default:
703                 printk(KERN_ERR "No such irq type %d", type);
704                 return -EINVAL;
705         }
706
707         shift = (offs & 0x7) * 4;
708         mask = 0x7 << shift;
709
710         spin_lock(&eint_lock);
711         ctrl = __raw_readl(EINT_CON(exynos_eint_base, data->irq));
712         ctrl &= ~mask;
713         ctrl |= newvalue << shift;
714         __raw_writel(ctrl, EINT_CON(exynos_eint_base, data->irq));
715         spin_unlock(&eint_lock);
716
717         if (soc_is_exynos5250())
718                 s3c_gpio_cfgpin(exynos5_irq_to_gpio(data->irq), S3C_GPIO_SFN(0xf));
719         else
720                 s3c_gpio_cfgpin(exynos4_irq_to_gpio(data->irq), S3C_GPIO_SFN(0xf));
721
722         return 0;
723 }
724
725 static struct irq_chip exynos_irq_eint = {
726         .name           = "exynos-eint",
727         .irq_mask       = exynos_irq_eint_mask,
728         .irq_unmask     = exynos_irq_eint_unmask,
729         .irq_mask_ack   = exynos_irq_eint_maskack,
730         .irq_ack        = exynos_irq_eint_ack,
731         .irq_set_type   = exynos_irq_eint_set_type,
732 #ifdef CONFIG_PM
733         .irq_set_wake   = s3c_irqext_wake,
734 #endif
735 };
736
737 /*
738  * exynos4_irq_demux_eint
739  *
740  * This function demuxes the IRQ from from EINTs 16 to 31.
741  * It is designed to be inlined into the specific handler
742  * s5p_irq_demux_eintX_Y.
743  *
744  * Each EINT pend/mask registers handle eight of them.
745  */
746 static inline void exynos_irq_demux_eint(unsigned int start)
747 {
748         unsigned int irq;
749
750         u32 status = __raw_readl(EINT_PEND(exynos_eint_base, start));
751         u32 mask = __raw_readl(EINT_MASK(exynos_eint_base, start));
752
753         status &= ~mask;
754         status &= 0xff;
755
756         while (status) {
757                 irq = fls(status) - 1;
758                 generic_handle_irq(irq + start);
759                 status &= ~(1 << irq);
760         }
761 }
762
763 static void exynos_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc)
764 {
765         struct irq_chip *chip = irq_get_chip(irq);
766         chained_irq_enter(chip, desc);
767         exynos_irq_demux_eint(IRQ_EINT(16));
768         exynos_irq_demux_eint(IRQ_EINT(24));
769         chained_irq_exit(chip, desc);
770 }
771
772 static void exynos_irq_eint0_15(unsigned int irq, struct irq_desc *desc)
773 {
774         u32 *irq_data = irq_get_handler_data(irq);
775         struct irq_chip *chip = irq_get_chip(irq);
776
777         chained_irq_enter(chip, desc);
778         generic_handle_irq(*irq_data);
779         chained_irq_exit(chip, desc);
780 }
781
782 static int __init exynos_init_irq_eint(void)
783 {
784         int irq;
785
786 #ifdef CONFIG_PINCTRL_SAMSUNG
787         /*
788          * The Samsung pinctrl driver provides an integrated gpio/pinmux/pinconf
789          * functionality along with support for external gpio and wakeup
790          * interrupts. If the samsung pinctrl driver is enabled and includes
791          * the wakeup interrupt support, then the setting up external wakeup
792          * interrupts here can be skipped. This check here is temporary to
793          * allow exynos4 platforms that do not use Samsung pinctrl driver to
794          * co-exist with platforms that do. When all of the Samsung Exynos4
795          * platforms switch over to using the pinctrl driver, the wakeup
796          * interrupt support code here can be completely removed.
797          */
798         static const struct of_device_id exynos_pinctrl_ids[] = {
799                 { .compatible = "samsung,exynos4210-pinctrl", },
800                 { .compatible = "samsung,exynos4x12-pinctrl", },
801                 { .compatible = "samsung,exynos5250-pinctrl", },
802         };
803         struct device_node *pctrl_np, *wkup_np;
804         const char *wkup_compat = "samsung,exynos4210-wakeup-eint";
805
806         for_each_matching_node(pctrl_np, exynos_pinctrl_ids) {
807                 if (of_device_is_available(pctrl_np)) {
808                         wkup_np = of_find_compatible_node(pctrl_np, NULL,
809                                                         wkup_compat);
810                         if (wkup_np)
811                                 return -ENODEV;
812                 }
813         }
814 #endif
815         if (soc_is_exynos5440())
816                 return 0;
817
818         if (soc_is_exynos5250())
819                 exynos_eint_base = ioremap(EXYNOS5_PA_GPIO1, SZ_4K);
820         else
821                 exynos_eint_base = ioremap(EXYNOS4_PA_GPIO2, SZ_4K);
822
823         if (exynos_eint_base == NULL) {
824                 pr_err("unable to ioremap for EINT base address\n");
825                 return -ENOMEM;
826         }
827
828         for (irq = 0 ; irq <= 31 ; irq++) {
829                 irq_set_chip_and_handler(IRQ_EINT(irq), &exynos_irq_eint,
830                                          handle_level_irq);
831                 set_irq_flags(IRQ_EINT(irq), IRQF_VALID);
832         }
833
834         irq_set_chained_handler(EXYNOS_IRQ_EINT16_31, exynos_irq_demux_eint16_31);
835
836         for (irq = 0 ; irq <= 15 ; irq++) {
837                 eint0_15_data[irq] = IRQ_EINT(irq);
838
839                 if (soc_is_exynos5250()) {
840                         irq_set_handler_data(exynos5_eint0_15_src_int[irq],
841                                              &eint0_15_data[irq]);
842                         irq_set_chained_handler(exynos5_eint0_15_src_int[irq],
843                                                 exynos_irq_eint0_15);
844                 } else {
845                         irq_set_handler_data(exynos4_eint0_15_src_int[irq],
846                                              &eint0_15_data[irq]);
847                         irq_set_chained_handler(exynos4_eint0_15_src_int[irq],
848                                                 exynos_irq_eint0_15);
849                 }
850         }
851
852         return 0;
853 }
854 arch_initcall(exynos_init_irq_eint);
855
856 static struct resource exynos4_pmu_resource[] = {
857         DEFINE_RES_IRQ(EXYNOS4_IRQ_PMU),
858         DEFINE_RES_IRQ(EXYNOS4_IRQ_PMU_CPU1),
859 #if defined(CONFIG_SOC_EXYNOS4412)
860         DEFINE_RES_IRQ(EXYNOS4_IRQ_PMU_CPU2),
861         DEFINE_RES_IRQ(EXYNOS4_IRQ_PMU_CPU3),
862 #endif
863 };
864
865 static struct platform_device exynos4_device_pmu = {
866         .name           = "arm-pmu",
867         .num_resources  = ARRAY_SIZE(exynos4_pmu_resource),
868         .resource       = exynos4_pmu_resource,
869 };
870
871 static int __init exynos_armpmu_init(void)
872 {
873         if (!of_have_populated_dt()) {
874                 if (soc_is_exynos4210() || soc_is_exynos4212())
875                         exynos4_device_pmu.num_resources = 2;
876                 platform_device_register(&exynos4_device_pmu);
877         }
878
879         return 0;
880 }
881 arch_initcall(exynos_armpmu_init);