Merge tag 'samsung-fixes-3' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung into fixes

Merge "Samsung fixes-3 for 3.16" from Kukjin Kim:

Samsung fixes-3 for v3.16
- update the parent for Auudss clock because kernel will be hang
during late boot if the parent clock is disabled in bootloader.
- enable clk handing in power domain because while power domain
on/off, its regarding clock source will be reset and it causes
a problem so need to handle it.
- add mux clocks to be used by power domain for exynos5420-mfc
during power domain on/off and property in device tree also.
- register cpuidle only for exynos4210 and exynos5250 because a
system failure will be happened on other exynos SoCs.

* tag 'samsung-fixes-3' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung:
ARM: EXYNOS: Register cpuidle device only on exynos4210 and 5250
ARM: dts: Add clock property for mfc_pd in exynos5420
clk: exynos5420: Add IDs for clocks used in PD mfc
ARM: EXYNOS: Add support for clock handling in power domain
ARM: dts: Update the parent for Audss clocks in Exynos5420

Signed-off-by: Olof Johansson <olof@lixom.net>

Changed files
+92 -8
Documentation
devicetree
bindings
arm
arch
arm
boot
mach-exynos
drivers
clk
include
dt-bindings
clock
+20
Documentation/devicetree/bindings/arm/exynos/power_domain.txt
··· 9 9 - reg: physical base address of the controller and length of memory mapped 10 10 region. 11 11 12 + Optional Properties: 13 + - clocks: List of clock handles. The parent clocks of the input clocks to the 14 + devices in this power domain are set to oscclk before power gating 15 + and restored back after powering on a domain. This is required for 16 + all domains which are powered on and off and not required for unused 17 + domains. 18 + - clock-names: The following clocks can be specified: 19 + - oscclk: Oscillator clock. 20 + - pclkN, clkN: Pairs of parent of input clock and input clock to the 21 + devices in this power domain. Maximum of 4 pairs (N = 0 to 3) 22 + are supported currently. 23 + 12 24 Node of a device using power domains must have a samsung,power-domain property 13 25 defined with a phandle to respective power domain. 14 26 ··· 29 17 lcd0: power-domain-lcd0 { 30 18 compatible = "samsung,exynos4210-pd"; 31 19 reg = <0x10023C00 0x10>; 20 + }; 21 + 22 + mfc_pd: power-domain@10044060 { 23 + compatible = "samsung,exynos4210-pd"; 24 + reg = <0x10044060 0x20>; 25 + clocks = <&clock CLK_FIN_PLL>, <&clock CLK_MOUT_SW_ACLK333>, 26 + <&clock CLK_MOUT_USER_ACLK333>; 27 + clock-names = "oscclk", "pclk0", "clk0"; 32 28 }; 33 29 34 30 Example of the node using power domain:
+4 -1
arch/arm/boot/dts/exynos5420.dtsi
··· 167 167 compatible = "samsung,exynos5420-audss-clock"; 168 168 reg = <0x03810000 0x0C>; 169 169 #clock-cells = <1>; 170 - clocks = <&clock CLK_FIN_PLL>, <&clock CLK_FOUT_EPLL>, 170 + clocks = <&clock CLK_FIN_PLL>, <&clock CLK_MAU_EPLL>, 171 171 <&clock CLK_SCLK_MAUDIO0>, <&clock CLK_SCLK_MAUPCM0>; 172 172 clock-names = "pll_ref", "pll_in", "sclk_audio", "sclk_pcm_in"; 173 173 }; ··· 260 260 mfc_pd: power-domain@10044060 { 261 261 compatible = "samsung,exynos4210-pd"; 262 262 reg = <0x10044060 0x20>; 263 + clocks = <&clock CLK_FIN_PLL>, <&clock CLK_MOUT_SW_ACLK333>, 264 + <&clock CLK_MOUT_USER_ACLK333>; 265 + clock-names = "oscclk", "pclk0", "clk0"; 263 266 }; 264 267 265 268 disp_pd: power-domain@100440C0 {
+2 -4
arch/arm/mach-exynos/exynos.c
··· 173 173 174 174 void __init exynos_cpuidle_init(void) 175 175 { 176 - if (soc_is_exynos5440()) 177 - return; 178 - 179 - platform_device_register(&exynos_cpuidle); 176 + if (soc_is_exynos4210() || soc_is_exynos5250()) 177 + platform_device_register(&exynos_cpuidle); 180 178 } 181 179 182 180 void __init exynos_cpufreq_init(void)
+60 -1
arch/arm/mach-exynos/pm_domains.c
··· 17 17 #include <linux/err.h> 18 18 #include <linux/slab.h> 19 19 #include <linux/pm_domain.h> 20 + #include <linux/clk.h> 20 21 #include <linux/delay.h> 21 22 #include <linux/of_address.h> 22 23 #include <linux/of_platform.h> 23 24 #include <linux/sched.h> 24 25 25 26 #include "regs-pmu.h" 27 + 28 + #define MAX_CLK_PER_DOMAIN 4 26 29 27 30 /* 28 31 * Exynos specific wrapper around the generic power domain ··· 35 32 char const *name; 36 33 bool is_off; 37 34 struct generic_pm_domain pd; 35 + struct clk *oscclk; 36 + struct clk *clk[MAX_CLK_PER_DOMAIN]; 37 + struct clk *pclk[MAX_CLK_PER_DOMAIN]; 38 38 }; 39 39 40 40 static int exynos_pd_power(struct generic_pm_domain *domain, bool power_on) ··· 49 43 50 44 pd = container_of(domain, struct exynos_pm_domain, pd); 51 45 base = pd->base; 46 + 47 + /* Set oscclk before powering off a domain*/ 48 + if (!power_on) { 49 + int i; 50 + 51 + for (i = 0; i < MAX_CLK_PER_DOMAIN; i++) { 52 + if (IS_ERR(pd->clk[i])) 53 + break; 54 + if (clk_set_parent(pd->clk[i], pd->oscclk)) 55 + pr_err("%s: error setting oscclk as parent to clock %d\n", 56 + pd->name, i); 57 + } 58 + } 52 59 53 60 pwr = power_on ? S5P_INT_LOCAL_PWR_EN : 0; 54 61 __raw_writel(pwr, base); ··· 79 60 cpu_relax(); 80 61 usleep_range(80, 100); 81 62 } 63 + 64 + /* Restore clocks after powering on a domain*/ 65 + if (power_on) { 66 + int i; 67 + 68 + for (i = 0; i < MAX_CLK_PER_DOMAIN; i++) { 69 + if (IS_ERR(pd->clk[i])) 70 + break; 71 + if (clk_set_parent(pd->clk[i], pd->pclk[i])) 72 + pr_err("%s: error setting parent to clock%d\n", 73 + pd->name, i); 74 + } 75 + } 76 + 82 77 return 0; 83 78 } 84 79 ··· 185 152 186 153 for_each_compatible_node(np, NULL, "samsung,exynos4210-pd") { 187 154 struct exynos_pm_domain *pd; 188 - int on; 155 + int on, i; 156 + struct device *dev; 189 157 190 158 pdev = of_find_device_by_node(np); 159 + dev = &pdev->dev; 191 160 192 161 pd = kzalloc(sizeof(*pd), GFP_KERNEL); 193 162 if (!pd) { ··· 205 170 pd->pd.power_on = exynos_pd_power_on; 206 171 pd->pd.of_node = np; 207 172 173 + pd->oscclk = clk_get(dev, "oscclk"); 174 + if (IS_ERR(pd->oscclk)) 175 + goto no_clk; 176 + 177 + for (i = 0; i < MAX_CLK_PER_DOMAIN; i++) { 178 + char clk_name[8]; 179 + 180 + snprintf(clk_name, sizeof(clk_name), "clk%d", i); 181 + pd->clk[i] = clk_get(dev, clk_name); 182 + if (IS_ERR(pd->clk[i])) 183 + break; 184 + snprintf(clk_name, sizeof(clk_name), "pclk%d", i); 185 + pd->pclk[i] = clk_get(dev, clk_name); 186 + if (IS_ERR(pd->pclk[i])) { 187 + clk_put(pd->clk[i]); 188 + pd->clk[i] = ERR_PTR(-EINVAL); 189 + break; 190 + } 191 + } 192 + 193 + if (IS_ERR(pd->clk[0])) 194 + clk_put(pd->oscclk); 195 + 196 + no_clk: 208 197 platform_set_drvdata(pdev, pd); 209 198 210 199 on = __raw_readl(pd->base + 0x4) & S5P_INT_LOCAL_PWR_EN;
+4 -2
drivers/clk/samsung/clk-exynos5420.c
··· 631 631 SRC_TOP4, 16, 1), 632 632 MUX(0, "mout_user_aclk266", mout_user_aclk266_p, SRC_TOP4, 20, 1), 633 633 MUX(0, "mout_user_aclk166", mout_user_aclk166_p, SRC_TOP4, 24, 1), 634 - MUX(0, "mout_user_aclk333", mout_user_aclk333_p, SRC_TOP4, 28, 1), 634 + MUX(CLK_MOUT_USER_ACLK333, "mout_user_aclk333", mout_user_aclk333_p, 635 + SRC_TOP4, 28, 1), 635 636 636 637 MUX(0, "mout_user_aclk400_disp1", mout_user_aclk400_disp1_p, 637 638 SRC_TOP5, 0, 1), ··· 685 684 SRC_TOP11, 12, 1), 686 685 MUX(0, "mout_sw_aclk266", mout_sw_aclk266_p, SRC_TOP11, 20, 1), 687 686 MUX(0, "mout_sw_aclk166", mout_sw_aclk166_p, SRC_TOP11, 24, 1), 688 - MUX(0, "mout_sw_aclk333", mout_sw_aclk333_p, SRC_TOP11, 28, 1), 687 + MUX(CLK_MOUT_SW_ACLK333, "mout_sw_aclk333", mout_sw_aclk333_p, 688 + SRC_TOP11, 28, 1), 689 689 690 690 MUX(0, "mout_sw_aclk400_disp1", mout_sw_aclk400_disp1_p, 691 691 SRC_TOP12, 4, 1),
+2
include/dt-bindings/clock/exynos5420.h
··· 203 203 #define CLK_MOUT_G3D 641 204 204 #define CLK_MOUT_VPLL 642 205 205 #define CLK_MOUT_MAUDIO0 643 206 + #define CLK_MOUT_USER_ACLK333 644 207 + #define CLK_MOUT_SW_ACLK333 645 206 208 207 209 /* divider clocks */ 208 210 #define CLK_DOUT_PIXEL 768