| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Copyright (c) 2013 Samsung Electronics Co., Ltd. |
|---|
| 3 | 4 | * Copyright (c) 2013 Linaro Ltd. |
|---|
| 4 | 5 | * Author: Thomas Abraham <thomas.ab@samsung.com> |
|---|
| 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 | 6 | * |
|---|
| 10 | 7 | * Common Clock Framework support for all Exynos4 SoCs. |
|---|
| 11 | 8 | */ |
|---|
| .. | .. |
|---|
| 14 | 11 | #include <linux/slab.h> |
|---|
| 15 | 12 | #include <linux/clk.h> |
|---|
| 16 | 13 | #include <linux/clk-provider.h> |
|---|
| 14 | +#include <linux/io.h> |
|---|
| 17 | 15 | #include <linux/of.h> |
|---|
| 18 | 16 | #include <linux/of_address.h> |
|---|
| 19 | | -#include <linux/syscore_ops.h> |
|---|
| 20 | 17 | |
|---|
| 21 | 18 | #include "clk.h" |
|---|
| 22 | 19 | #include "clk-cpu.h" |
|---|
| .. | .. |
|---|
| 123 | 120 | #define CLKOUT_CMU_CPU 0x14a00 |
|---|
| 124 | 121 | #define PWR_CTRL1 0x15020 |
|---|
| 125 | 122 | #define E4X12_PWR_CTRL2 0x15024 |
|---|
| 126 | | -#define E4X12_DIV_ISP0 0x18300 |
|---|
| 127 | | -#define E4X12_DIV_ISP1 0x18304 |
|---|
| 128 | | -#define E4X12_GATE_ISP0 0x18800 |
|---|
| 129 | | -#define E4X12_GATE_ISP1 0x18804 |
|---|
| 130 | 123 | |
|---|
| 131 | 124 | /* Below definitions are used for PWR_CTRL settings */ |
|---|
| 132 | 125 | #define PWR_CTRL1_CORE2_DOWN_RATIO(x) (((x) & 0x7) << 28) |
|---|
| .. | .. |
|---|
| 158 | 151 | static enum exynos4_soc exynos4_soc; |
|---|
| 159 | 152 | |
|---|
| 160 | 153 | /* |
|---|
| 161 | | - * Support for CMU save/restore across system suspends |
|---|
| 162 | | - */ |
|---|
| 163 | | -#ifdef CONFIG_PM_SLEEP |
|---|
| 164 | | -static struct samsung_clk_reg_dump *exynos4_save_common; |
|---|
| 165 | | -static struct samsung_clk_reg_dump *exynos4_save_soc; |
|---|
| 166 | | -static struct samsung_clk_reg_dump *exynos4_save_pll; |
|---|
| 167 | | - |
|---|
| 168 | | -/* |
|---|
| 169 | 154 | * list of controller registers to be saved and restored during a |
|---|
| 170 | 155 | * suspend/resume cycle. |
|---|
| 171 | 156 | */ |
|---|
| .. | .. |
|---|
| 192 | 177 | E4X12_PWR_CTRL2, |
|---|
| 193 | 178 | }; |
|---|
| 194 | 179 | |
|---|
| 195 | | -static const unsigned long exynos4_clk_pll_regs[] __initconst = { |
|---|
| 180 | +static const unsigned long exynos4_clk_regs[] __initconst = { |
|---|
| 196 | 181 | EPLL_LOCK, |
|---|
| 197 | 182 | VPLL_LOCK, |
|---|
| 198 | 183 | EPLL_CON0, |
|---|
| .. | .. |
|---|
| 201 | 186 | VPLL_CON0, |
|---|
| 202 | 187 | VPLL_CON1, |
|---|
| 203 | 188 | VPLL_CON2, |
|---|
| 204 | | -}; |
|---|
| 205 | | - |
|---|
| 206 | | -static const unsigned long exynos4_clk_regs[] __initconst = { |
|---|
| 207 | 189 | SRC_LEFTBUS, |
|---|
| 208 | 190 | DIV_LEFTBUS, |
|---|
| 209 | 191 | GATE_IP_LEFTBUS, |
|---|
| .. | .. |
|---|
| 276 | 258 | }; |
|---|
| 277 | 259 | |
|---|
| 278 | 260 | static const struct samsung_clk_reg_dump src_mask_suspend[] = { |
|---|
| 261 | + { .offset = VPLL_CON0, .value = 0x80600302, }, |
|---|
| 262 | + { .offset = EPLL_CON0, .value = 0x806F0302, }, |
|---|
| 279 | 263 | { .offset = SRC_MASK_TOP, .value = 0x00000001, }, |
|---|
| 280 | 264 | { .offset = SRC_MASK_CAM, .value = 0x11111111, }, |
|---|
| 281 | 265 | { .offset = SRC_MASK_TV, .value = 0x00000111, }, |
|---|
| .. | .. |
|---|
| 290 | 274 | static const struct samsung_clk_reg_dump src_mask_suspend_e4210[] = { |
|---|
| 291 | 275 | { .offset = E4210_SRC_MASK_LCD1, .value = 0x00001111, }, |
|---|
| 292 | 276 | }; |
|---|
| 293 | | - |
|---|
| 294 | | -#define PLL_ENABLED (1 << 31) |
|---|
| 295 | | -#define PLL_LOCKED (1 << 29) |
|---|
| 296 | | - |
|---|
| 297 | | -static void exynos4_clk_enable_pll(u32 reg) |
|---|
| 298 | | -{ |
|---|
| 299 | | - u32 pll_con = readl(reg_base + reg); |
|---|
| 300 | | - pll_con |= PLL_ENABLED; |
|---|
| 301 | | - writel(pll_con, reg_base + reg); |
|---|
| 302 | | - |
|---|
| 303 | | - while (!(pll_con & PLL_LOCKED)) { |
|---|
| 304 | | - cpu_relax(); |
|---|
| 305 | | - pll_con = readl(reg_base + reg); |
|---|
| 306 | | - } |
|---|
| 307 | | -} |
|---|
| 308 | | - |
|---|
| 309 | | -static void exynos4_clk_wait_for_pll(u32 reg) |
|---|
| 310 | | -{ |
|---|
| 311 | | - u32 pll_con; |
|---|
| 312 | | - |
|---|
| 313 | | - pll_con = readl(reg_base + reg); |
|---|
| 314 | | - if (!(pll_con & PLL_ENABLED)) |
|---|
| 315 | | - return; |
|---|
| 316 | | - |
|---|
| 317 | | - while (!(pll_con & PLL_LOCKED)) { |
|---|
| 318 | | - cpu_relax(); |
|---|
| 319 | | - pll_con = readl(reg_base + reg); |
|---|
| 320 | | - } |
|---|
| 321 | | -} |
|---|
| 322 | | - |
|---|
| 323 | | -static int exynos4_clk_suspend(void) |
|---|
| 324 | | -{ |
|---|
| 325 | | - samsung_clk_save(reg_base, exynos4_save_common, |
|---|
| 326 | | - ARRAY_SIZE(exynos4_clk_regs)); |
|---|
| 327 | | - samsung_clk_save(reg_base, exynos4_save_pll, |
|---|
| 328 | | - ARRAY_SIZE(exynos4_clk_pll_regs)); |
|---|
| 329 | | - |
|---|
| 330 | | - exynos4_clk_enable_pll(EPLL_CON0); |
|---|
| 331 | | - exynos4_clk_enable_pll(VPLL_CON0); |
|---|
| 332 | | - |
|---|
| 333 | | - if (exynos4_soc == EXYNOS4210) { |
|---|
| 334 | | - samsung_clk_save(reg_base, exynos4_save_soc, |
|---|
| 335 | | - ARRAY_SIZE(exynos4210_clk_save)); |
|---|
| 336 | | - samsung_clk_restore(reg_base, src_mask_suspend_e4210, |
|---|
| 337 | | - ARRAY_SIZE(src_mask_suspend_e4210)); |
|---|
| 338 | | - } else { |
|---|
| 339 | | - samsung_clk_save(reg_base, exynos4_save_soc, |
|---|
| 340 | | - ARRAY_SIZE(exynos4x12_clk_save)); |
|---|
| 341 | | - } |
|---|
| 342 | | - |
|---|
| 343 | | - samsung_clk_restore(reg_base, src_mask_suspend, |
|---|
| 344 | | - ARRAY_SIZE(src_mask_suspend)); |
|---|
| 345 | | - |
|---|
| 346 | | - return 0; |
|---|
| 347 | | -} |
|---|
| 348 | | - |
|---|
| 349 | | -static void exynos4_clk_resume(void) |
|---|
| 350 | | -{ |
|---|
| 351 | | - samsung_clk_restore(reg_base, exynos4_save_pll, |
|---|
| 352 | | - ARRAY_SIZE(exynos4_clk_pll_regs)); |
|---|
| 353 | | - |
|---|
| 354 | | - exynos4_clk_wait_for_pll(EPLL_CON0); |
|---|
| 355 | | - exynos4_clk_wait_for_pll(VPLL_CON0); |
|---|
| 356 | | - |
|---|
| 357 | | - samsung_clk_restore(reg_base, exynos4_save_common, |
|---|
| 358 | | - ARRAY_SIZE(exynos4_clk_regs)); |
|---|
| 359 | | - |
|---|
| 360 | | - if (exynos4_soc == EXYNOS4210) |
|---|
| 361 | | - samsung_clk_restore(reg_base, exynos4_save_soc, |
|---|
| 362 | | - ARRAY_SIZE(exynos4210_clk_save)); |
|---|
| 363 | | - else |
|---|
| 364 | | - samsung_clk_restore(reg_base, exynos4_save_soc, |
|---|
| 365 | | - ARRAY_SIZE(exynos4x12_clk_save)); |
|---|
| 366 | | -} |
|---|
| 367 | | - |
|---|
| 368 | | -static struct syscore_ops exynos4_clk_syscore_ops = { |
|---|
| 369 | | - .suspend = exynos4_clk_suspend, |
|---|
| 370 | | - .resume = exynos4_clk_resume, |
|---|
| 371 | | -}; |
|---|
| 372 | | - |
|---|
| 373 | | -static void __init exynos4_clk_sleep_init(void) |
|---|
| 374 | | -{ |
|---|
| 375 | | - exynos4_save_common = samsung_clk_alloc_reg_dump(exynos4_clk_regs, |
|---|
| 376 | | - ARRAY_SIZE(exynos4_clk_regs)); |
|---|
| 377 | | - if (!exynos4_save_common) |
|---|
| 378 | | - goto err_warn; |
|---|
| 379 | | - |
|---|
| 380 | | - if (exynos4_soc == EXYNOS4210) |
|---|
| 381 | | - exynos4_save_soc = samsung_clk_alloc_reg_dump( |
|---|
| 382 | | - exynos4210_clk_save, |
|---|
| 383 | | - ARRAY_SIZE(exynos4210_clk_save)); |
|---|
| 384 | | - else |
|---|
| 385 | | - exynos4_save_soc = samsung_clk_alloc_reg_dump( |
|---|
| 386 | | - exynos4x12_clk_save, |
|---|
| 387 | | - ARRAY_SIZE(exynos4x12_clk_save)); |
|---|
| 388 | | - if (!exynos4_save_soc) |
|---|
| 389 | | - goto err_common; |
|---|
| 390 | | - |
|---|
| 391 | | - exynos4_save_pll = samsung_clk_alloc_reg_dump(exynos4_clk_pll_regs, |
|---|
| 392 | | - ARRAY_SIZE(exynos4_clk_pll_regs)); |
|---|
| 393 | | - if (!exynos4_save_pll) |
|---|
| 394 | | - goto err_soc; |
|---|
| 395 | | - |
|---|
| 396 | | - register_syscore_ops(&exynos4_clk_syscore_ops); |
|---|
| 397 | | - return; |
|---|
| 398 | | - |
|---|
| 399 | | -err_soc: |
|---|
| 400 | | - kfree(exynos4_save_soc); |
|---|
| 401 | | -err_common: |
|---|
| 402 | | - kfree(exynos4_save_common); |
|---|
| 403 | | -err_warn: |
|---|
| 404 | | - pr_warn("%s: failed to allocate sleep save data, no sleep support!\n", |
|---|
| 405 | | - __func__); |
|---|
| 406 | | -} |
|---|
| 407 | | -#else |
|---|
| 408 | | -static void __init exynos4_clk_sleep_init(void) {} |
|---|
| 409 | | -#endif |
|---|
| 410 | 277 | |
|---|
| 411 | 278 | /* list of all parent clock list */ |
|---|
| 412 | 279 | PNAME(mout_apll_p) = { "fin_pll", "fout_apll", }; |
|---|
| .. | .. |
|---|
| 841 | 708 | DIV(0, "div_c2c_aclk", "div_c2c", DIV_DMC1, 12, 3), |
|---|
| 842 | 709 | }; |
|---|
| 843 | 710 | |
|---|
| 844 | | -static struct samsung_div_clock exynos4x12_isp_div_clks[] = { |
|---|
| 845 | | - DIV_F(CLK_DIV_ISP0, "div_isp0", "aclk200", E4X12_DIV_ISP0, 0, 3, |
|---|
| 846 | | - CLK_GET_RATE_NOCACHE, 0), |
|---|
| 847 | | - DIV_F(CLK_DIV_ISP1, "div_isp1", "aclk200", E4X12_DIV_ISP0, 4, 3, |
|---|
| 848 | | - CLK_GET_RATE_NOCACHE, 0), |
|---|
| 849 | | - DIV(0, "div_mpwm", "div_isp1", E4X12_DIV_ISP1, 0, 3), |
|---|
| 850 | | - DIV_F(CLK_DIV_MCUISP0, "div_mcuisp0", "aclk400_mcuisp", E4X12_DIV_ISP1, |
|---|
| 851 | | - 4, 3, CLK_GET_RATE_NOCACHE, 0), |
|---|
| 852 | | - DIV_F(CLK_DIV_MCUISP1, "div_mcuisp1", "div_mcuisp0", E4X12_DIV_ISP1, |
|---|
| 853 | | - 8, 3, CLK_GET_RATE_NOCACHE, 0), |
|---|
| 854 | | -}; |
|---|
| 855 | | - |
|---|
| 856 | 711 | /* list of gate clocks supported in all exynos4 soc's */ |
|---|
| 857 | 712 | static const struct samsung_gate_clock exynos4_gate_clks[] __initconst = { |
|---|
| 858 | 713 | GATE(CLK_PPMULEFT, "ppmuleft", "aclk200", GATE_IP_LEFTBUS, 1, 0, 0), |
|---|
| .. | .. |
|---|
| 1103 | 958 | |
|---|
| 1104 | 959 | /* list of gate clocks supported in exynos4x12 soc */ |
|---|
| 1105 | 960 | static const struct samsung_gate_clock exynos4x12_gate_clks[] __initconst = { |
|---|
| 961 | + GATE(CLK_ASYNC_G3D, "async_g3d", "aclk200", GATE_IP_LEFTBUS, 6, 0, 0), |
|---|
| 1106 | 962 | GATE(CLK_AUDSS, "audss", "sclk_epll", E4X12_GATE_IP_MAUDIO, 0, 0, 0), |
|---|
| 1107 | 963 | GATE(CLK_MDNIE0, "mdnie0", "aclk160", GATE_IP_LCD0, 2, 0, 0), |
|---|
| 1108 | 964 | GATE(CLK_ROTATOR, "rotator", "aclk200", E4X12_GATE_IP_IMAGE, 1, 0, 0), |
|---|
| .. | .. |
|---|
| 1148 | 1004 | GATE(CLK_SMMU_G2D, "smmu_g2d", "aclk200", GATE_IP_DMC, 24, 0, 0), |
|---|
| 1149 | 1005 | GATE(CLK_TMU_APBIF, "tmu_apbif", "aclk100", E4X12_GATE_IP_PERIR, 17, 0, |
|---|
| 1150 | 1006 | 0), |
|---|
| 1151 | | -}; |
|---|
| 1152 | | - |
|---|
| 1153 | | -static struct samsung_gate_clock exynos4x12_isp_gate_clks[] = { |
|---|
| 1154 | | - GATE(CLK_FIMC_ISP, "isp", "aclk200", E4X12_GATE_ISP0, 0, |
|---|
| 1155 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1156 | | - GATE(CLK_FIMC_DRC, "drc", "aclk200", E4X12_GATE_ISP0, 1, |
|---|
| 1157 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1158 | | - GATE(CLK_FIMC_FD, "fd", "aclk200", E4X12_GATE_ISP0, 2, |
|---|
| 1159 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1160 | | - GATE(CLK_FIMC_LITE0, "lite0", "aclk200", E4X12_GATE_ISP0, 3, |
|---|
| 1161 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1162 | | - GATE(CLK_FIMC_LITE1, "lite1", "aclk200", E4X12_GATE_ISP0, 4, |
|---|
| 1163 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1164 | | - GATE(CLK_MCUISP, "mcuisp", "aclk200", E4X12_GATE_ISP0, 5, |
|---|
| 1165 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1166 | | - GATE(CLK_GICISP, "gicisp", "aclk200", E4X12_GATE_ISP0, 7, |
|---|
| 1167 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1168 | | - GATE(CLK_SMMU_ISP, "smmu_isp", "aclk200", E4X12_GATE_ISP0, 8, |
|---|
| 1169 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1170 | | - GATE(CLK_SMMU_DRC, "smmu_drc", "aclk200", E4X12_GATE_ISP0, 9, |
|---|
| 1171 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1172 | | - GATE(CLK_SMMU_FD, "smmu_fd", "aclk200", E4X12_GATE_ISP0, 10, |
|---|
| 1173 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1174 | | - GATE(CLK_SMMU_LITE0, "smmu_lite0", "aclk200", E4X12_GATE_ISP0, 11, |
|---|
| 1175 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1176 | | - GATE(CLK_SMMU_LITE1, "smmu_lite1", "aclk200", E4X12_GATE_ISP0, 12, |
|---|
| 1177 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1178 | | - GATE(CLK_PPMUISPMX, "ppmuispmx", "aclk200", E4X12_GATE_ISP0, 20, |
|---|
| 1179 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1180 | | - GATE(CLK_PPMUISPX, "ppmuispx", "aclk200", E4X12_GATE_ISP0, 21, |
|---|
| 1181 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1182 | | - GATE(CLK_MCUCTL_ISP, "mcuctl_isp", "aclk200", E4X12_GATE_ISP0, 23, |
|---|
| 1183 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1184 | | - GATE(CLK_MPWM_ISP, "mpwm_isp", "aclk200", E4X12_GATE_ISP0, 24, |
|---|
| 1185 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1186 | | - GATE(CLK_I2C0_ISP, "i2c0_isp", "aclk200", E4X12_GATE_ISP0, 25, |
|---|
| 1187 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1188 | | - GATE(CLK_I2C1_ISP, "i2c1_isp", "aclk200", E4X12_GATE_ISP0, 26, |
|---|
| 1189 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1190 | | - GATE(CLK_MTCADC_ISP, "mtcadc_isp", "aclk200", E4X12_GATE_ISP0, 27, |
|---|
| 1191 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1192 | | - GATE(CLK_PWM_ISP, "pwm_isp", "aclk200", E4X12_GATE_ISP0, 28, |
|---|
| 1193 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1194 | | - GATE(CLK_WDT_ISP, "wdt_isp", "aclk200", E4X12_GATE_ISP0, 30, |
|---|
| 1195 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1196 | | - GATE(CLK_UART_ISP, "uart_isp", "aclk200", E4X12_GATE_ISP0, 31, |
|---|
| 1197 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1198 | | - GATE(CLK_ASYNCAXIM, "asyncaxim", "aclk200", E4X12_GATE_ISP1, 0, |
|---|
| 1199 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1200 | | - GATE(CLK_SMMU_ISPCX, "smmu_ispcx", "aclk200", E4X12_GATE_ISP1, 4, |
|---|
| 1201 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1202 | | - GATE(CLK_SPI0_ISP, "spi0_isp", "aclk200", E4X12_GATE_ISP1, 12, |
|---|
| 1203 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1204 | | - GATE(CLK_SPI1_ISP, "spi1_isp", "aclk200", E4X12_GATE_ISP1, 13, |
|---|
| 1205 | | - CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
|---|
| 1206 | 1007 | }; |
|---|
| 1207 | 1008 | |
|---|
| 1208 | 1009 | /* |
|---|
| .. | .. |
|---|
| 1432 | 1233 | enum exynos4_soc soc) |
|---|
| 1433 | 1234 | { |
|---|
| 1434 | 1235 | struct samsung_clk_provider *ctx; |
|---|
| 1236 | + struct clk_hw **hws; |
|---|
| 1237 | + |
|---|
| 1435 | 1238 | exynos4_soc = soc; |
|---|
| 1436 | 1239 | |
|---|
| 1437 | 1240 | reg_base = of_iomap(np, 0); |
|---|
| .. | .. |
|---|
| 1439 | 1242 | panic("%s: failed to map registers\n", __func__); |
|---|
| 1440 | 1243 | |
|---|
| 1441 | 1244 | ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS); |
|---|
| 1245 | + hws = ctx->clk_data.hws; |
|---|
| 1442 | 1246 | |
|---|
| 1443 | 1247 | samsung_clk_of_register_fixed_ext(ctx, exynos4_fixed_rate_ext_clks, |
|---|
| 1444 | 1248 | ARRAY_SIZE(exynos4_fixed_rate_ext_clks), |
|---|
| .. | .. |
|---|
| 1501 | 1305 | exynos4210_fixed_factor_clks, |
|---|
| 1502 | 1306 | ARRAY_SIZE(exynos4210_fixed_factor_clks)); |
|---|
| 1503 | 1307 | exynos_register_cpu_clock(ctx, CLK_ARM_CLK, "armclk", |
|---|
| 1504 | | - mout_core_p4210[0], mout_core_p4210[1], 0x14200, |
|---|
| 1308 | + hws[CLK_MOUT_APLL], hws[CLK_SCLK_MPLL], 0x14200, |
|---|
| 1505 | 1309 | e4210_armclk_d, ARRAY_SIZE(e4210_armclk_d), |
|---|
| 1506 | 1310 | CLK_CPU_NEEDS_DEBUG_ALT_DIV | CLK_CPU_HAS_DIV1); |
|---|
| 1507 | 1311 | } else { |
|---|
| 1508 | | - struct resource res; |
|---|
| 1509 | | - |
|---|
| 1510 | 1312 | samsung_clk_register_mux(ctx, exynos4x12_mux_clks, |
|---|
| 1511 | 1313 | ARRAY_SIZE(exynos4x12_mux_clks)); |
|---|
| 1512 | 1314 | samsung_clk_register_div(ctx, exynos4x12_div_clks, |
|---|
| .. | .. |
|---|
| 1517 | 1319 | exynos4x12_fixed_factor_clks, |
|---|
| 1518 | 1320 | ARRAY_SIZE(exynos4x12_fixed_factor_clks)); |
|---|
| 1519 | 1321 | |
|---|
| 1520 | | - of_address_to_resource(np, 0, &res); |
|---|
| 1521 | | - if (resource_size(&res) > 0x18000) { |
|---|
| 1522 | | - samsung_clk_register_div(ctx, exynos4x12_isp_div_clks, |
|---|
| 1523 | | - ARRAY_SIZE(exynos4x12_isp_div_clks)); |
|---|
| 1524 | | - samsung_clk_register_gate(ctx, exynos4x12_isp_gate_clks, |
|---|
| 1525 | | - ARRAY_SIZE(exynos4x12_isp_gate_clks)); |
|---|
| 1526 | | - } |
|---|
| 1527 | | - |
|---|
| 1528 | 1322 | exynos_register_cpu_clock(ctx, CLK_ARM_CLK, "armclk", |
|---|
| 1529 | | - mout_core_p4x12[0], mout_core_p4x12[1], 0x14200, |
|---|
| 1323 | + hws[CLK_MOUT_APLL], hws[CLK_MOUT_MPLL_USER_C], 0x14200, |
|---|
| 1530 | 1324 | e4412_armclk_d, ARRAY_SIZE(e4412_armclk_d), |
|---|
| 1531 | 1325 | CLK_CPU_NEEDS_DEBUG_ALT_DIV | CLK_CPU_HAS_DIV1); |
|---|
| 1532 | 1326 | } |
|---|
| 1533 | 1327 | |
|---|
| 1534 | 1328 | if (soc == EXYNOS4X12) |
|---|
| 1535 | 1329 | exynos4x12_core_down_clock(); |
|---|
| 1536 | | - exynos4_clk_sleep_init(); |
|---|
| 1330 | + |
|---|
| 1331 | + samsung_clk_extended_sleep_init(reg_base, |
|---|
| 1332 | + exynos4_clk_regs, ARRAY_SIZE(exynos4_clk_regs), |
|---|
| 1333 | + src_mask_suspend, ARRAY_SIZE(src_mask_suspend)); |
|---|
| 1334 | + if (exynos4_soc == EXYNOS4210) |
|---|
| 1335 | + samsung_clk_extended_sleep_init(reg_base, |
|---|
| 1336 | + exynos4210_clk_save, ARRAY_SIZE(exynos4210_clk_save), |
|---|
| 1337 | + src_mask_suspend_e4210, ARRAY_SIZE(src_mask_suspend_e4210)); |
|---|
| 1338 | + else |
|---|
| 1339 | + samsung_clk_sleep_init(reg_base, exynos4x12_clk_save, |
|---|
| 1340 | + ARRAY_SIZE(exynos4x12_clk_save)); |
|---|
| 1537 | 1341 | |
|---|
| 1538 | 1342 | samsung_clk_of_add_provider(np, ctx); |
|---|
| 1539 | 1343 | |
|---|