| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 1 | /* linux/arch/arm/mach-exynos4/cpu.c | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 2 |  * | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 3 |  * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. | 
 | 4 |  *		http://www.samsung.com | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 5 |  * | 
 | 6 |  * This program is free software; you can redistribute it and/or modify | 
 | 7 |  * it under the terms of the GNU General Public License version 2 as | 
 | 8 |  * published by the Free Software Foundation. | 
 | 9 | */ | 
 | 10 |  | 
 | 11 | #include <linux/sched.h> | 
 | 12 | #include <linux/sysdev.h> | 
 | 13 |  | 
 | 14 | #include <asm/mach/map.h> | 
 | 15 | #include <asm/mach/irq.h> | 
 | 16 |  | 
 | 17 | #include <asm/proc-fns.h> | 
| Kyungmin Park | 1cf0eb7 | 2010-10-21 15:22:36 +0900 | [diff] [blame] | 18 | #include <asm/hardware/cache-l2x0.h> | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 19 |  | 
 | 20 | #include <plat/cpu.h> | 
 | 21 | #include <plat/clock.h> | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 22 | #include <plat/exynos4.h> | 
| Hyuk Lee | 1036c3a | 2010-10-05 19:07:41 +0900 | [diff] [blame] | 23 | #include <plat/sdhci.h> | 
| Sylwester Nawrocki | 604eefe | 2011-03-12 08:58:01 +0900 | [diff] [blame] | 24 | #include <plat/devs.h> | 
 | 25 | #include <plat/fimc-core.h> | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 26 |  | 
 | 27 | #include <mach/regs-irq.h> | 
 | 28 |  | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 29 | extern int combiner_init(unsigned int combiner_nr, void __iomem *base, | 
 | 30 | 			 unsigned int irq_start); | 
 | 31 | extern void combiner_cascade_irq(unsigned int combiner_nr, unsigned int irq); | 
 | 32 |  | 
 | 33 | /* Initial IO mappings */ | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 34 | static struct map_desc exynos4_iodesc[] __initdata = { | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 35 | 	{ | 
| Changhwan Youn | 2b74015 | 2011-03-11 10:39:35 +0900 | [diff] [blame] | 36 | 		.virtual	= (unsigned long)S5P_VA_SYSTIMER, | 
 | 37 | 		.pfn		= __phys_to_pfn(EXYNOS4_PA_SYSTIMER), | 
 | 38 | 		.length		= SZ_4K, | 
 | 39 | 		.type	 	= MT_DEVICE, | 
 | 40 | 	}, { | 
| Changhwan Youn | 766211e | 2010-08-27 17:57:44 +0900 | [diff] [blame] | 41 | 		.virtual	= (unsigned long)S5P_VA_SYSRAM, | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 42 | 		.pfn		= __phys_to_pfn(EXYNOS4_PA_SYSRAM), | 
| Changhwan Youn | 766211e | 2010-08-27 17:57:44 +0900 | [diff] [blame] | 43 | 		.length		= SZ_4K, | 
 | 44 | 		.type		= MT_DEVICE, | 
 | 45 | 	}, { | 
| Kukjin Kim | c598c47 | 2010-08-18 21:45:49 +0900 | [diff] [blame] | 46 | 		.virtual	= (unsigned long)S5P_VA_CMU, | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 47 | 		.pfn		= __phys_to_pfn(EXYNOS4_PA_CMU), | 
| Kukjin Kim | c598c47 | 2010-08-18 21:45:49 +0900 | [diff] [blame] | 48 | 		.length		= SZ_128K, | 
 | 49 | 		.type		= MT_DEVICE, | 
| Kukjin Kim | 19a2c06 | 2010-08-31 16:30:51 +0900 | [diff] [blame] | 50 | 	}, { | 
| Changhwan Youn | d6d8b48 | 2010-12-03 17:15:40 +0900 | [diff] [blame] | 51 | 		.virtual	= (unsigned long)S5P_VA_PMU, | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 52 | 		.pfn		= __phys_to_pfn(EXYNOS4_PA_PMU), | 
| Changhwan Youn | d6d8b48 | 2010-12-03 17:15:40 +0900 | [diff] [blame] | 53 | 		.length		= SZ_64K, | 
 | 54 | 		.type		= MT_DEVICE, | 
 | 55 | 	}, { | 
| Kukjin Kim | 19a2c06 | 2010-08-31 16:30:51 +0900 | [diff] [blame] | 56 | 		.virtual	= (unsigned long)S5P_VA_COMBINER_BASE, | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 57 | 		.pfn		= __phys_to_pfn(EXYNOS4_PA_COMBINER), | 
| Kukjin Kim | 19a2c06 | 2010-08-31 16:30:51 +0900 | [diff] [blame] | 58 | 		.length		= SZ_4K, | 
 | 59 | 		.type		= MT_DEVICE, | 
 | 60 | 	}, { | 
 | 61 | 		.virtual	= (unsigned long)S5P_VA_COREPERI_BASE, | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 62 | 		.pfn		= __phys_to_pfn(EXYNOS4_PA_COREPERI), | 
| Kukjin Kim | 19a2c06 | 2010-08-31 16:30:51 +0900 | [diff] [blame] | 63 | 		.length		= SZ_8K, | 
 | 64 | 		.type		= MT_DEVICE, | 
 | 65 | 	}, { | 
 | 66 | 		.virtual	= (unsigned long)S5P_VA_L2CC, | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 67 | 		.pfn		= __phys_to_pfn(EXYNOS4_PA_L2CC), | 
| Kukjin Kim | 19a2c06 | 2010-08-31 16:30:51 +0900 | [diff] [blame] | 68 | 		.length		= SZ_4K, | 
 | 69 | 		.type		= MT_DEVICE, | 
 | 70 | 	}, { | 
| Jongpill Lee | 37ea63b | 2010-10-14 15:46:18 +0900 | [diff] [blame] | 71 | 		.virtual	= (unsigned long)S5P_VA_GPIO1, | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 72 | 		.pfn		= __phys_to_pfn(EXYNOS4_PA_GPIO1), | 
| Kukjin Kim | 19a2c06 | 2010-08-31 16:30:51 +0900 | [diff] [blame] | 73 | 		.length		= SZ_4K, | 
 | 74 | 		.type		= MT_DEVICE, | 
 | 75 | 	}, { | 
| Jongpill Lee | 37ea63b | 2010-10-14 15:46:18 +0900 | [diff] [blame] | 76 | 		.virtual	= (unsigned long)S5P_VA_GPIO2, | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 77 | 		.pfn		= __phys_to_pfn(EXYNOS4_PA_GPIO2), | 
| Jongpill Lee | 37ea63b | 2010-10-14 15:46:18 +0900 | [diff] [blame] | 78 | 		.length		= SZ_4K, | 
 | 79 | 		.type		= MT_DEVICE, | 
 | 80 | 	}, { | 
 | 81 | 		.virtual	= (unsigned long)S5P_VA_GPIO3, | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 82 | 		.pfn		= __phys_to_pfn(EXYNOS4_PA_GPIO3), | 
| Jongpill Lee | 37ea63b | 2010-10-14 15:46:18 +0900 | [diff] [blame] | 83 | 		.length		= SZ_256, | 
 | 84 | 		.type		= MT_DEVICE, | 
 | 85 | 	}, { | 
| Sunyoung Kang | dd0b7e2 | 2010-12-22 07:21:17 +0900 | [diff] [blame] | 86 | 		.virtual	= (unsigned long)S5P_VA_DMC0, | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 87 | 		.pfn		= __phys_to_pfn(EXYNOS4_PA_DMC0), | 
| Sunyoung Kang | dd0b7e2 | 2010-12-22 07:21:17 +0900 | [diff] [blame] | 88 | 		.length		= SZ_4K, | 
 | 89 | 		.type		= MT_DEVICE, | 
 | 90 | 	}, { | 
| Kukjin Kim | 19a2c06 | 2010-08-31 16:30:51 +0900 | [diff] [blame] | 91 | 		.virtual	= (unsigned long)S3C_VA_UART, | 
 | 92 | 		.pfn		= __phys_to_pfn(S3C_PA_UART), | 
 | 93 | 		.length		= SZ_512K, | 
 | 94 | 		.type		= MT_DEVICE, | 
| Daein Moon | 09596ba | 2010-10-25 16:30:40 +0900 | [diff] [blame] | 95 | 	}, { | 
 | 96 | 		.virtual	= (unsigned long)S5P_VA_SROMC, | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 97 | 		.pfn		= __phys_to_pfn(EXYNOS4_PA_SROMC), | 
| Daein Moon | 09596ba | 2010-10-25 16:30:40 +0900 | [diff] [blame] | 98 | 		.length		= SZ_4K, | 
 | 99 | 		.type		= MT_DEVICE, | 
| Joonyoung Shim | 8f1d169 | 2011-04-08 13:22:10 +0900 | [diff] [blame] | 100 | 	}, { | 
| Kukjin Kim | 08115a1 | 2011-06-01 15:09:05 -0700 | [diff] [blame] | 101 | 		.virtual	= (unsigned long)S3C_VA_USB_HSPHY, | 
| Joonyoung Shim | 8f1d169 | 2011-04-08 13:22:10 +0900 | [diff] [blame] | 102 | 		.pfn		= __phys_to_pfn(EXYNOS4_PA_HSPHY), | 
 | 103 | 		.length		= SZ_4K, | 
 | 104 | 		.type		= MT_DEVICE, | 
 | 105 | 	} | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 106 | }; | 
 | 107 |  | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 108 | static void exynos4_idle(void) | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 109 | { | 
 | 110 | 	if (!need_resched()) | 
 | 111 | 		cpu_do_idle(); | 
 | 112 |  | 
 | 113 | 	local_irq_enable(); | 
 | 114 | } | 
 | 115 |  | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 116 | /* | 
 | 117 |  * exynos4_map_io | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 118 |  * | 
 | 119 |  * register the standard cpu IO areas | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 120 |  */ | 
 | 121 | void __init exynos4_map_io(void) | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 122 | { | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 123 | 	iotable_init(exynos4_iodesc, ARRAY_SIZE(exynos4_iodesc)); | 
| Hyuk Lee | 1036c3a | 2010-10-05 19:07:41 +0900 | [diff] [blame] | 124 |  | 
 | 125 | 	/* initialize device information early */ | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 126 | 	exynos4_default_sdhci0(); | 
 | 127 | 	exynos4_default_sdhci1(); | 
 | 128 | 	exynos4_default_sdhci2(); | 
 | 129 | 	exynos4_default_sdhci3(); | 
| Sylwester Nawrocki | 604eefe | 2011-03-12 08:58:01 +0900 | [diff] [blame] | 130 |  | 
 | 131 | 	s3c_fimc_setname(0, "exynos4-fimc"); | 
 | 132 | 	s3c_fimc_setname(1, "exynos4-fimc"); | 
 | 133 | 	s3c_fimc_setname(2, "exynos4-fimc"); | 
 | 134 | 	s3c_fimc_setname(3, "exynos4-fimc"); | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 135 | } | 
 | 136 |  | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 137 | void __init exynos4_init_clocks(int xtal) | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 138 | { | 
 | 139 | 	printk(KERN_DEBUG "%s: initializing clocks\n", __func__); | 
 | 140 |  | 
 | 141 | 	s3c24xx_register_baseclocks(xtal); | 
 | 142 | 	s5p_register_clocks(xtal); | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 143 | 	exynos4_register_clocks(); | 
 | 144 | 	exynos4_setup_clocks(); | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 145 | } | 
 | 146 |  | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 147 | void __init exynos4_init_irq(void) | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 148 | { | 
 | 149 | 	int irq; | 
 | 150 |  | 
| Russell King | b580b89 | 2010-12-04 15:55:14 +0000 | [diff] [blame] | 151 | 	gic_init(0, IRQ_LOCALTIMER, S5P_VA_GIC_DIST, S5P_VA_GIC_CPU); | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 152 |  | 
 | 153 | 	for (irq = 0; irq < MAX_COMBINER_NR; irq++) { | 
| Changhwan Youn | 1f2d6c4 | 2010-11-29 17:04:46 +0900 | [diff] [blame] | 154 |  | 
 | 155 | 		/* | 
 | 156 | 		 * From SPI(0) to SPI(39) and SPI(51), SPI(53) are | 
 | 157 | 		 * connected to the interrupt combiner. These irqs | 
 | 158 | 		 * should be initialized to support cascade interrupt. | 
 | 159 | 		 */ | 
 | 160 | 		if ((irq >= 40) && !(irq == 51) && !(irq == 53)) | 
 | 161 | 			continue; | 
 | 162 |  | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 163 | 		combiner_init(irq, (void __iomem *)S5P_VA_COMBINER(irq), | 
 | 164 | 				COMBINER_IRQ(irq, 0)); | 
 | 165 | 		combiner_cascade_irq(irq, IRQ_SPI(irq)); | 
 | 166 | 	} | 
 | 167 |  | 
 | 168 | 	/* The parameters of s5p_init_irq() are for VIC init. | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 169 | 	 * Theses parameters should be NULL and 0 because EXYNOS4 | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 170 | 	 * uses GIC instead of VIC. | 
 | 171 | 	 */ | 
 | 172 | 	s5p_init_irq(NULL, 0); | 
 | 173 | } | 
 | 174 |  | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 175 | struct sysdev_class exynos4_sysclass = { | 
 | 176 | 	.name	= "exynos4-core", | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 177 | }; | 
 | 178 |  | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 179 | static struct sys_device exynos4_sysdev = { | 
 | 180 | 	.cls	= &exynos4_sysclass, | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 181 | }; | 
 | 182 |  | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 183 | static int __init exynos4_core_init(void) | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 184 | { | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 185 | 	return sysdev_class_register(&exynos4_sysclass); | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 186 | } | 
 | 187 |  | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 188 | core_initcall(exynos4_core_init); | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 189 |  | 
| Kyungmin Park | 1cf0eb7 | 2010-10-21 15:22:36 +0900 | [diff] [blame] | 190 | #ifdef CONFIG_CACHE_L2X0 | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 191 | static int __init exynos4_l2x0_cache_init(void) | 
| Kyungmin Park | 1cf0eb7 | 2010-10-21 15:22:36 +0900 | [diff] [blame] | 192 | { | 
 | 193 | 	/* TAG, Data Latency Control: 2cycle */ | 
 | 194 | 	__raw_writel(0x110, S5P_VA_L2CC + L2X0_TAG_LATENCY_CTRL); | 
 | 195 | 	__raw_writel(0x110, S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL); | 
 | 196 |  | 
 | 197 | 	/* L2X0 Prefetch Control */ | 
 | 198 | 	__raw_writel(0x30000007, S5P_VA_L2CC + L2X0_PREFETCH_CTRL); | 
 | 199 |  | 
 | 200 | 	/* L2X0 Power Control */ | 
 | 201 | 	__raw_writel(L2X0_DYNAMIC_CLK_GATING_EN | L2X0_STNDBY_MODE_EN, | 
 | 202 | 		     S5P_VA_L2CC + L2X0_POWER_CTRL); | 
 | 203 |  | 
| Changhwan Youn | a50eb1c | 2010-11-26 13:21:53 +0900 | [diff] [blame] | 204 | 	l2x0_init(S5P_VA_L2CC, 0x7C470001, 0xC200ffff); | 
| Kyungmin Park | 1cf0eb7 | 2010-10-21 15:22:36 +0900 | [diff] [blame] | 205 |  | 
 | 206 | 	return 0; | 
 | 207 | } | 
 | 208 |  | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 209 | early_initcall(exynos4_l2x0_cache_init); | 
| Kyungmin Park | 1cf0eb7 | 2010-10-21 15:22:36 +0900 | [diff] [blame] | 210 | #endif | 
 | 211 |  | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 212 | int __init exynos4_init(void) | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 213 | { | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 214 | 	printk(KERN_INFO "EXYNOS4: Initializing architecture\n"); | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 215 |  | 
 | 216 | 	/* set idle function */ | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 217 | 	pm_idle = exynos4_idle; | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 218 |  | 
| Kukjin Kim | 7d30e8b | 2011-02-14 16:33:10 +0900 | [diff] [blame] | 219 | 	return sysdev_register(&exynos4_sysdev); | 
| Changhwan Youn | 2b12b5c | 2010-07-26 21:08:52 +0900 | [diff] [blame] | 220 | } |