Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'exynos-cpuidle' of http://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung into next/drivers

Merge "Samsung exynos-cpuidle updates for v3.16" from Kukjin Kim:

- From Daniel Lezcano:
This patchset relies on the cpm_pm notifier to initiate the
powerdown sequence operations from pm.c instead cpuidle.c.
Thus the cpuidle driver is no longer dependent from arch
specific code as everything is called from the pm.c file.

* tag 'exynos-cpuidle' of http://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung: (94 commits)
ARM: EXYNOS: Fix kernel panic when unplugging CPU1 on exynos
ARM: EXYNOS: Move the driver to drivers/cpuidle directory
ARM: EXYNOS: Cleanup all unneeded headers from cpuidle.c
ARM: EXYNOS: Pass the AFTR callback to the platform_data
ARM: EXYNOS: Move S5P_CHECK_SLEEP into pm.c
ARM: EXYNOS: Move the power sequence call in the cpu_pm notifier
ARM: EXYNOS: Move the AFTR state function into pm.c
ARM: EXYNOS: Encapsulate the AFTR code into a function
ARM: EXYNOS: Disable cpuidle for exynos5440
ARM: EXYNOS: Encapsulate boot vector code into a function for cpuidle
ARM: EXYNOS: Pass wakeup mask parameter to function for cpuidle
ARM: EXYNOS: Remove ifdef for scu_enable in pm
ARM: EXYNOS: Move scu_enable in the cpu_pm notifier
ARM: EXYNOS: Use the cpu_pm notifier for pm
ARM: EXYNOS: Fix S5P_WAKEUP_STAT call for cpuidle
ARM: EXYNOS: Move some code inside the idle_finisher for cpuidle
ARM: EXYNOS: Encapsulate register access inside a function for pm
ARM: EXYNOS: Change function name prefix for cpuidle
ARM: EXYNOS: Use cpuidle_register
ARM: EXYNOS: Prevent forward declaration for cpuidle
...

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

+9306 -4113
+38
Documentation/devicetree/bindings/arm/exynos/smp-sysram.txt
··· 1 + Samsung Exynos SYSRAM for SMP bringup: 2 + ------------------------------------ 3 + 4 + Samsung SMP-capable Exynos SoCs use part of the SYSRAM for the bringup 5 + of the secondary cores. Once the core gets powered up it executes the 6 + code that is residing at some specific location of the SYSRAM. 7 + 8 + Therefore reserved section sub-nodes have to be added to the mmio-sram 9 + declaration. These nodes are of two types depending upon secure or 10 + non-secure execution environment. 11 + 12 + Required sub-node properties: 13 + - compatible : depending upon boot mode, should be 14 + "samsung,exynos4210-sysram" : for Secure SYSRAM 15 + "samsung,exynos4210-sysram-ns" : for Non-secure SYSRAM 16 + 17 + The rest of the properties should follow the generic mmio-sram discription 18 + found in ../../misc/sysram.txt 19 + 20 + Example: 21 + 22 + sysram@02020000 { 23 + compatible = "mmio-sram"; 24 + reg = <0x02020000 0x54000>; 25 + #address-cells = <1>; 26 + #size-cells = <1>; 27 + ranges = <0 0x02020000 0x54000>; 28 + 29 + smp-sysram@0 { 30 + compatible = "samsung,exynos4210-sysram"; 31 + reg = <0x0 0x1000>; 32 + }; 33 + 34 + smp-sysram@53000 { 35 + compatible = "samsung,exynos4210-sysram-ns"; 36 + reg = <0x53000 0x1000>; 37 + }; 38 + };
+41
Documentation/devicetree/bindings/clock/exynos3250-clock.txt
··· 1 + * Samsung Exynos3250 Clock Controller 2 + 3 + The Exynos3250 clock controller generates and supplies clock to various 4 + controllers within the Exynos3250 SoC. 5 + 6 + Required Properties: 7 + 8 + - compatible: should be one of the following. 9 + - "samsung,exynos3250-cmu" - controller compatible with Exynos3250 SoC. 10 + 11 + - reg: physical base address of the controller and length of memory mapped 12 + region. 13 + 14 + - #clock-cells: should be 1. 15 + 16 + Each clock is assigned an identifier and client nodes can use this identifier 17 + to specify the clock which they consume. 18 + 19 + All available clocks are defined as preprocessor macros in 20 + dt-bindings/clock/exynos3250.h header and can be used in device 21 + tree sources. 22 + 23 + Example 1: An example of a clock controller node is listed below. 24 + 25 + cmu: clock-controller@10030000 { 26 + compatible = "samsung,exynos3250-cmu"; 27 + reg = <0x10030000 0x20000>; 28 + #clock-cells = <1>; 29 + }; 30 + 31 + Example 2: UART controller node that consumes the clock generated by the clock 32 + controller. Refer to the standard clock bindings for information 33 + about 'clocks' and 'clock-names' property. 34 + 35 + serial@13800000 { 36 + compatible = "samsung,exynos4210-uart"; 37 + reg = <0x13800000 0x100>; 38 + interrupts = <0 109 0>; 39 + clocks = <&cmu CLK_UART0>, <&cmu CLK_SCLK_UART0>; 40 + clock-names = "uart", "clk_uart_baud0"; 41 + };
+190
Documentation/devicetree/bindings/clock/exynos5260-clock.txt
··· 1 + * Samsung Exynos5260 Clock Controller 2 + 3 + Exynos5260 has 13 clock controllers which are instantiated 4 + independently from the device-tree. These clock controllers 5 + generate and supply clocks to various hardware blocks within 6 + the SoC. 7 + 8 + Each clock is assigned an identifier and client nodes can use 9 + this identifier to specify the clock which they consume. All 10 + available clocks are defined as preprocessor macros in 11 + dt-bindings/clock/exynos5260-clk.h header and can be used in 12 + device tree sources. 13 + 14 + External clocks: 15 + 16 + There are several clocks that are generated outside the SoC. It 17 + is expected that they are defined using standard clock bindings 18 + with following clock-output-names: 19 + 20 + - "fin_pll" - PLL input clock from XXTI 21 + - "xrtcxti" - input clock from XRTCXTI 22 + - "ioclk_pcm_extclk" - pcm external operation clock 23 + - "ioclk_spdif_extclk" - spdif external operation clock 24 + - "ioclk_i2s_cdclk" - i2s0 codec clock 25 + 26 + Phy clocks: 27 + 28 + There are several clocks which are generated by specific PHYs. 29 + These clocks are fed into the clock controller and then routed to 30 + the hardware blocks. These clocks are defined as fixed clocks in the 31 + driver with following names: 32 + 33 + - "phyclk_dptx_phy_ch3_txd_clk" - dp phy clock for channel 3 34 + - "phyclk_dptx_phy_ch2_txd_clk" - dp phy clock for channel 2 35 + - "phyclk_dptx_phy_ch1_txd_clk" - dp phy clock for channel 1 36 + - "phyclk_dptx_phy_ch0_txd_clk" - dp phy clock for channel 0 37 + - "phyclk_hdmi_phy_tmds_clko" - hdmi phy tmds clock 38 + - "phyclk_hdmi_phy_pixel_clko" - hdmi phy pixel clock 39 + - "phyclk_hdmi_link_o_tmds_clkhi" - hdmi phy for hdmi link 40 + - "phyclk_dptx_phy_o_ref_clk_24m" - dp phy reference clock 41 + - "phyclk_dptx_phy_clk_div2" 42 + - "phyclk_mipi_dphy_4l_m_rxclkesc0" 43 + - "phyclk_usbhost20_phy_phyclock" - usb 2.0 phy clock 44 + - "phyclk_usbhost20_phy_freeclk" 45 + - "phyclk_usbhost20_phy_clk48mohci" 46 + - "phyclk_usbdrd30_udrd30_pipe_pclk" 47 + - "phyclk_usbdrd30_udrd30_phyclock" - usb 3.0 phy clock 48 + 49 + Required Properties for Clock Controller: 50 + 51 + - compatible: should be one of the following. 52 + 1) "samsung,exynos5260-clock-top" 53 + 2) "samsung,exynos5260-clock-peri" 54 + 3) "samsung,exynos5260-clock-egl" 55 + 4) "samsung,exynos5260-clock-kfc" 56 + 5) "samsung,exynos5260-clock-g2d" 57 + 6) "samsung,exynos5260-clock-mif" 58 + 7) "samsung,exynos5260-clock-mfc" 59 + 8) "samsung,exynos5260-clock-g3d" 60 + 9) "samsung,exynos5260-clock-fsys" 61 + 10) "samsung,exynos5260-clock-aud" 62 + 11) "samsung,exynos5260-clock-isp" 63 + 12) "samsung,exynos5260-clock-gscl" 64 + 13) "samsung,exynos5260-clock-disp" 65 + 66 + - reg: physical base address of the controller and the length of 67 + memory mapped region. 68 + 69 + - #clock-cells: should be 1. 70 + 71 + - clocks: list of clock identifiers which are fed as the input to 72 + the given clock controller. Please refer the next section to find 73 + the input clocks for a given controller. 74 + 75 + - clock-names: list of names of clocks which are fed as the input 76 + to the given clock controller. 77 + 78 + Input clocks for top clock controller: 79 + - fin_pll 80 + - dout_mem_pll 81 + - dout_bus_pll 82 + - dout_media_pll 83 + 84 + Input clocks for peri clock controller: 85 + - fin_pll 86 + - ioclk_pcm_extclk 87 + - ioclk_i2s_cdclk 88 + - ioclk_spdif_extclk 89 + - phyclk_hdmi_phy_ref_cko 90 + - dout_aclk_peri_66 91 + - dout_sclk_peri_uart0 92 + - dout_sclk_peri_uart1 93 + - dout_sclk_peri_uart2 94 + - dout_sclk_peri_spi0_b 95 + - dout_sclk_peri_spi1_b 96 + - dout_sclk_peri_spi2_b 97 + - dout_aclk_peri_aud 98 + - dout_sclk_peri_spi0_b 99 + 100 + Input clocks for egl clock controller: 101 + - fin_pll 102 + - dout_bus_pll 103 + 104 + Input clocks for kfc clock controller: 105 + - fin_pll 106 + - dout_media_pll 107 + 108 + Input clocks for g2d clock controller: 109 + - fin_pll 110 + - dout_aclk_g2d_333 111 + 112 + Input clocks for mif clock controller: 113 + - fin_pll 114 + 115 + Input clocks for mfc clock controller: 116 + - fin_pll 117 + - dout_aclk_mfc_333 118 + 119 + Input clocks for g3d clock controller: 120 + - fin_pll 121 + 122 + Input clocks for fsys clock controller: 123 + - fin_pll 124 + - phyclk_usbhost20_phy_phyclock 125 + - phyclk_usbhost20_phy_freeclk 126 + - phyclk_usbhost20_phy_clk48mohci 127 + - phyclk_usbdrd30_udrd30_pipe_pclk 128 + - phyclk_usbdrd30_udrd30_phyclock 129 + - dout_aclk_fsys_200 130 + 131 + Input clocks for aud clock controller: 132 + - fin_pll 133 + - fout_aud_pll 134 + - ioclk_i2s_cdclk 135 + - ioclk_pcm_extclk 136 + 137 + Input clocks for isp clock controller: 138 + - fin_pll 139 + - dout_aclk_isp1_266 140 + - dout_aclk_isp1_400 141 + - mout_aclk_isp1_266 142 + 143 + Input clocks for gscl clock controller: 144 + - fin_pll 145 + - dout_aclk_gscl_400 146 + - dout_aclk_gscl_333 147 + 148 + Input clocks for disp clock controller: 149 + - fin_pll 150 + - phyclk_dptx_phy_ch3_txd_clk 151 + - phyclk_dptx_phy_ch2_txd_clk 152 + - phyclk_dptx_phy_ch1_txd_clk 153 + - phyclk_dptx_phy_ch0_txd_clk 154 + - phyclk_hdmi_phy_tmds_clko 155 + - phyclk_hdmi_phy_ref_clko 156 + - phyclk_hdmi_phy_pixel_clko 157 + - phyclk_hdmi_link_o_tmds_clkhi 158 + - phyclk_mipi_dphy_4l_m_txbyte_clkhs 159 + - phyclk_dptx_phy_o_ref_clk_24m 160 + - phyclk_dptx_phy_clk_div2 161 + - phyclk_mipi_dphy_4l_m_rxclkesc0 162 + - phyclk_hdmi_phy_ref_cko 163 + - ioclk_spdif_extclk 164 + - dout_aclk_peri_aud 165 + - dout_aclk_disp_222 166 + - dout_sclk_disp_pixel 167 + - dout_aclk_disp_333 168 + 169 + Example 1: An example of a clock controller node is listed below. 170 + 171 + clock_mfc: clock-controller@11090000 { 172 + compatible = "samsung,exynos5260-clock-mfc"; 173 + clock = <&fin_pll>, <&clock_top TOP_DOUT_ACLK_MFC_333>; 174 + clock-names = "fin_pll", "dout_aclk_mfc_333"; 175 + reg = <0x11090000 0x10000>; 176 + #clock-cells = <1>; 177 + }; 178 + 179 + Example 2: UART controller node that consumes the clock generated by the 180 + peri clock controller. Refer to the standard clock bindings for 181 + information about 'clocks' and 'clock-names' property. 182 + 183 + serial@12C00000 { 184 + compatible = "samsung,exynos4210-uart"; 185 + reg = <0x12C00000 0x100>; 186 + interrupts = <0 146 0>; 187 + clocks = <&clock_peri PERI_PCLK_UART0>, <&clock_peri PERI_SCLK_UART0>; 188 + clock-names = "uart", "clk_uart_baud0"; 189 + }; 190 +
+2 -1
Documentation/devicetree/bindings/clock/exynos5420-clock.txt
··· 1 1 * Samsung Exynos5420 Clock Controller 2 2 3 3 The Exynos5420 clock controller generates and supplies clock to various 4 - controllers within the Exynos5420 SoC. 4 + controllers within the Exynos5420 SoC and for the Exynos5800 SoC. 5 5 6 6 Required Properties: 7 7 8 8 - compatible: should be one of the following. 9 9 - "samsung,exynos5420-clock" - controller compatible with Exynos5420 SoC. 10 + - "samsung,exynos5800-clock" - controller compatible with Exynos5800 SoC. 10 11 11 12 - reg: physical base address of the controller and length of memory mapped 12 13 region.
+50
Documentation/devicetree/bindings/clock/samsung,s3c2410-clock.txt
··· 1 + * Samsung S3C2410 Clock Controller 2 + 3 + The S3C2410 clock controller generates and supplies clock to various controllers 4 + within the SoC. The clock binding described here is applicable to the s3c2410, 5 + s3c2440 and s3c2442 SoCs in the s3c24x family. 6 + 7 + Required Properties: 8 + 9 + - compatible: should be one of the following. 10 + - "samsung,s3c2410-clock" - controller compatible with S3C2410 SoC. 11 + - "samsung,s3c2440-clock" - controller compatible with S3C2440 SoC. 12 + - "samsung,s3c2442-clock" - controller compatible with S3C2442 SoC. 13 + - reg: physical base address of the controller and length of memory mapped 14 + region. 15 + - #clock-cells: should be 1. 16 + 17 + Each clock is assigned an identifier and client nodes can use this identifier 18 + to specify the clock which they consume. Some of the clocks are available only 19 + on a particular SoC. 20 + 21 + All available clocks are defined as preprocessor macros in 22 + dt-bindings/clock/s3c2410.h header and can be used in device 23 + tree sources. 24 + 25 + External clocks: 26 + 27 + The xti clock used as input for the plls is generated outside the SoC. It is 28 + expected that is are defined using standard clock bindings with a 29 + clock-output-names value of "xti". 30 + 31 + Example: Clock controller node: 32 + 33 + clocks: clock-controller@4c000000 { 34 + compatible = "samsung,s3c2410-clock"; 35 + reg = <0x4c000000 0x20>; 36 + #clock-cells = <1>; 37 + }; 38 + 39 + Example: UART controller node that consumes the clock generated by the clock 40 + controller (refer to the standard clock bindings for information about 41 + "clocks" and "clock-names" properties): 42 + 43 + serial@50004000 { 44 + compatible = "samsung,s3c2440-uart"; 45 + reg = <0x50004000 0x4000>; 46 + interrupts = <1 23 3 4>, <1 23 4 4>; 47 + clock-names = "uart", "clk_uart_baud2"; 48 + clocks = <&clocks PCLK_UART0>, <&clocks PCLK_UART0>; 49 + status = "disabled"; 50 + };
+50
Documentation/devicetree/bindings/clock/samsung,s3c2412-clock.txt
··· 1 + * Samsung S3C2412 Clock Controller 2 + 3 + The S3C2412 clock controller generates and supplies clock to various controllers 4 + within the SoC. The clock binding described here is applicable to the s3c2412 5 + and s3c2413 SoCs in the s3c24x family. 6 + 7 + Required Properties: 8 + 9 + - compatible: should be "samsung,s3c2412-clock" 10 + - reg: physical base address of the controller and length of memory mapped 11 + region. 12 + - #clock-cells: should be 1. 13 + 14 + Each clock is assigned an identifier and client nodes can use this identifier 15 + to specify the clock which they consume. Some of the clocks are available only 16 + on a particular SoC. 17 + 18 + All available clocks are defined as preprocessor macros in 19 + dt-bindings/clock/s3c2412.h header and can be used in device 20 + tree sources. 21 + 22 + External clocks: 23 + 24 + There are several clocks that are generated outside the SoC. It is expected 25 + that they are defined using standard clock bindings with following 26 + clock-output-names: 27 + - "xti" - crystal input - required, 28 + - "ext" - external clock source - optional, 29 + 30 + Example: Clock controller node: 31 + 32 + clocks: clock-controller@4c000000 { 33 + compatible = "samsung,s3c2412-clock"; 34 + reg = <0x4c000000 0x20>; 35 + #clock-cells = <1>; 36 + }; 37 + 38 + Example: UART controller node that consumes the clock generated by the clock 39 + controller (refer to the standard clock bindings for information about 40 + "clocks" and "clock-names" properties): 41 + 42 + serial@50004000 { 43 + compatible = "samsung,s3c2412-uart"; 44 + reg = <0x50004000 0x4000>; 45 + interrupts = <1 23 3 4>, <1 23 4 4>; 46 + clock-names = "uart", "clk_uart_baud2", "clk_uart_baud3"; 47 + clocks = <&clocks PCLK_UART0>, <&clocks PCLK_UART0>, 48 + <&clocks SCLK_UART>; 49 + status = "disabled"; 50 + };
+56
Documentation/devicetree/bindings/clock/samsung,s3c2443-clock.txt
··· 1 + * Samsung S3C2443 Clock Controller 2 + 3 + The S3C2443 clock controller generates and supplies clock to various controllers 4 + within the SoC. The clock binding described here is applicable to all SoCs in 5 + the s3c24x family starting with the s3c2443. 6 + 7 + Required Properties: 8 + 9 + - compatible: should be one of the following. 10 + - "samsung,s3c2416-clock" - controller compatible with S3C2416 SoC. 11 + - "samsung,s3c2443-clock" - controller compatible with S3C2443 SoC. 12 + - "samsung,s3c2450-clock" - controller compatible with S3C2450 SoC. 13 + - reg: physical base address of the controller and length of memory mapped 14 + region. 15 + - #clock-cells: should be 1. 16 + 17 + Each clock is assigned an identifier and client nodes can use this identifier 18 + to specify the clock which they consume. Some of the clocks are available only 19 + on a particular SoC. 20 + 21 + All available clocks are defined as preprocessor macros in 22 + dt-bindings/clock/s3c2443.h header and can be used in device 23 + tree sources. 24 + 25 + External clocks: 26 + 27 + There are several clocks that are generated outside the SoC. It is expected 28 + that they are defined using standard clock bindings with following 29 + clock-output-names: 30 + - "xti" - crystal input - required, 31 + - "ext" - external clock source - optional, 32 + - "ext_i2s" - external I2S clock - optional, 33 + - "ext_uart" - external uart clock - optional, 34 + 35 + Example: Clock controller node: 36 + 37 + clocks: clock-controller@4c000000 { 38 + compatible = "samsung,s3c2416-clock"; 39 + reg = <0x4c000000 0x40>; 40 + #clock-cells = <1>; 41 + }; 42 + 43 + Example: UART controller node that consumes the clock generated by the clock 44 + controller (refer to the standard clock bindings for information about 45 + "clocks" and "clock-names" properties): 46 + 47 + serial@50004000 { 48 + compatible = "samsung,s3c2440-uart"; 49 + reg = <0x50004000 0x4000>; 50 + interrupts = <1 23 3 4>, <1 23 4 4>; 51 + clock-names = "uart", "clk_uart_baud2", 52 + "clk_uart_baud3"; 53 + clocks = <&clocks PCLK_UART0>, <&clocks PCLK_UART0>, 54 + <&clocks SCLK_UART>; 55 + status = "disabled"; 56 + };
+3 -2
arch/arm/Kconfig
··· 755 755 select ATAGS 756 756 select CLKDEV_LOOKUP 757 757 select CLKSRC_SAMSUNG_PWM 758 - select COMMON_CLK 758 + select COMMON_CLK_SAMSUNG 759 759 select CPU_V6K 760 760 select GENERIC_CLOCKEVENTS 761 761 select GPIO_SAMSUNG ··· 836 836 select ARCH_REQUIRE_GPIOLIB 837 837 select ARCH_SPARSEMEM_ENABLE 838 838 select ARM_GIC 839 - select COMMON_CLK 839 + select COMMON_CLK_SAMSUNG 840 840 select CPU_V7 841 841 select GENERIC_CLOCKEVENTS 842 842 select HAVE_S3C2410_I2C if I2C ··· 844 844 select HAVE_S3C_RTC if RTC_CLASS 845 845 select NEED_MACH_MEMORY_H 846 846 select SPARSE_IRQ 847 + select SRAM 847 848 select USE_OF 848 849 help 849 850 Support for SAMSUNG's EXYNOS SoCs (EXYNOS4/5)
+1
arch/arm/boot/dts/Makefile
··· 73 73 exynos5250-smdk5250.dtb \ 74 74 exynos5250-snow.dtb \ 75 75 exynos5420-arndale-octa.dtb \ 76 + exynos5420-peach-pit.dtb \ 76 77 exynos5420-smdk5420.dtb \ 77 78 exynos5440-sd5v1.dtb \ 78 79 exynos5440-ssdk5440.dtb
+14 -4
arch/arm/boot/dts/exynos4.dtsi
··· 129 129 status = "disabled"; 130 130 #address-cells = <1>; 131 131 #size-cells = <1>; 132 + #clock-cells = <1>; 133 + clock-output-names = "cam_a_clkout", "cam_b_clkout"; 132 134 ranges; 133 - 134 - clock_cam: clock-controller { 135 - #clock-cells = <1>; 136 - }; 137 135 138 136 fimc_0: fimc@11800000 { 139 137 compatible = "samsung,exynos4210-fimc"; ··· 369 371 interrupts = <0 60 0>; 370 372 clocks = <&clock CLK_I2C2>; 371 373 clock-names = "i2c"; 374 + pinctrl-names = "default"; 375 + pinctrl-0 = <&i2c2_bus>; 372 376 status = "disabled"; 373 377 }; 374 378 ··· 382 382 interrupts = <0 61 0>; 383 383 clocks = <&clock CLK_I2C3>; 384 384 clock-names = "i2c"; 385 + pinctrl-names = "default"; 386 + pinctrl-0 = <&i2c3_bus>; 385 387 status = "disabled"; 386 388 }; 387 389 ··· 395 393 interrupts = <0 62 0>; 396 394 clocks = <&clock CLK_I2C4>; 397 395 clock-names = "i2c"; 396 + pinctrl-names = "default"; 397 + pinctrl-0 = <&i2c4_bus>; 398 398 status = "disabled"; 399 399 }; 400 400 ··· 408 404 interrupts = <0 63 0>; 409 405 clocks = <&clock CLK_I2C5>; 410 406 clock-names = "i2c"; 407 + pinctrl-names = "default"; 408 + pinctrl-0 = <&i2c5_bus>; 411 409 status = "disabled"; 412 410 }; 413 411 ··· 421 415 interrupts = <0 64 0>; 422 416 clocks = <&clock CLK_I2C6>; 423 417 clock-names = "i2c"; 418 + pinctrl-names = "default"; 419 + pinctrl-0 = <&i2c6_bus>; 424 420 status = "disabled"; 425 421 }; 426 422 ··· 434 426 interrupts = <0 65 0>; 435 427 clocks = <&clock CLK_I2C7>; 436 428 clock-names = "i2c"; 429 + pinctrl-names = "default"; 430 + pinctrl-0 = <&i2c7_bus>; 437 431 status = "disabled"; 438 432 }; 439 433
+15
arch/arm/boot/dts/exynos4210-universal_c210.dts
··· 28 28 bootargs = "console=ttySAC2,115200N8 root=/dev/mmcblk0p5 rw rootwait earlyprintk panic=5 maxcpus=1"; 29 29 }; 30 30 31 + sysram@02020000 { 32 + smp-sysram@0 { 33 + status = "disabled"; 34 + }; 35 + 36 + smp-sysram@5000 { 37 + compatible = "samsung,exynos4210-sysram"; 38 + reg = <0x5000 0x1000>; 39 + }; 40 + 41 + smp-sysram@1f000 { 42 + status = "disabled"; 43 + }; 44 + }; 45 + 31 46 mct@10050000 { 32 47 compatible = "none"; 33 48 };
+18
arch/arm/boot/dts/exynos4210.dtsi
··· 31 31 pinctrl2 = &pinctrl_2; 32 32 }; 33 33 34 + sysram@02020000 { 35 + compatible = "mmio-sram"; 36 + reg = <0x02020000 0x20000>; 37 + #address-cells = <1>; 38 + #size-cells = <1>; 39 + ranges = <0 0x02020000 0x20000>; 40 + 41 + smp-sysram@0 { 42 + compatible = "samsung,exynos4210-sysram"; 43 + reg = <0x0 0x1000>; 44 + }; 45 + 46 + smp-sysram@1f000 { 47 + compatible = "samsung,exynos4210-sysram-ns"; 48 + reg = <0x1f000 0x1000>; 49 + }; 50 + }; 51 + 34 52 pd_lcd1: lcd1-power-domain@10023CA0 { 35 53 compatible = "samsung,exynos4210-pd"; 36 54 reg = <0x10023CA0 0x20>;
+73 -6
arch/arm/boot/dts/exynos4412-trats2.dts
··· 20 20 compatible = "samsung,trats2", "samsung,exynos4412", "samsung,exynos4"; 21 21 22 22 aliases { 23 - i2c8 = &i2c_ak8975; 23 + i2c9 = &i2c_ak8975; 24 24 }; 25 25 26 26 memory { ··· 80 80 enable-active-high; 81 81 }; 82 82 83 - /* More to come */ 83 + cam_af_reg: voltage-regulator-3 { 84 + compatible = "regulator-fixed"; 85 + regulator-name = "CAM_AF"; 86 + regulator-min-microvolt = <2800000>; 87 + regulator-max-microvolt = <2800000>; 88 + gpio = <&gpm0 4 0>; 89 + enable-active-high; 90 + }; 91 + 92 + cam_isp_core_reg: voltage-regulator-4 { 93 + compatible = "regulator-fixed"; 94 + regulator-name = "CAM_ISP_CORE_1.2V_EN"; 95 + regulator-min-microvolt = <1200000>; 96 + regulator-max-microvolt = <1200000>; 97 + gpio = <&gpm0 3 0>; 98 + enable-active-high; 99 + regulator-always-on; 100 + }; 84 101 }; 85 102 86 103 gpio-keys { ··· 154 137 y-size = <1280>; 155 138 avdd-supply = <&ldo23_reg>; 156 139 vdd-supply = <&ldo24_reg>; 140 + }; 141 + }; 142 + 143 + i2c_0: i2c@13860000 { 144 + samsung,i2c-sda-delay = <100>; 145 + samsung,i2c-slave-addr = <0x10>; 146 + samsung,i2c-max-bus-freq = <400000>; 147 + pinctrl-0 = <&i2c0_bus>; 148 + pinctrl-names = "default"; 149 + status = "okay"; 150 + 151 + s5c73m3@3c { 152 + compatible = "samsung,s5c73m3"; 153 + reg = <0x3c>; 154 + standby-gpios = <&gpm0 1 1>; /* ISP_STANDBY */ 155 + xshutdown-gpios = <&gpf1 3 1>; /* ISP_RESET */ 156 + vdd-int-supply = <&buck9_reg>; 157 + vddio-cis-supply = <&ldo9_reg>; 158 + vdda-supply = <&ldo17_reg>; 159 + vddio-host-supply = <&ldo18_reg>; 160 + vdd-af-supply = <&cam_af_reg>; 161 + vdd-reg-supply = <&cam_io_reg>; 162 + clock-frequency = <24000000>; 163 + /* CAM_A_CLKOUT */ 164 + clocks = <&camera 0>; 165 + clock-names = "cis_extclk"; 166 + port { 167 + s5c73m3_ep: endpoint { 168 + remote-endpoint = <&csis0_ep>; 169 + data-lanes = <1 2 3 4>; 170 + }; 171 + }; 157 172 }; 158 173 }; 159 174 ··· 635 586 status = "okay"; 636 587 }; 637 588 638 - camera { 639 - pinctrl-0 = <&cam_port_b_clk_active>; 589 + camera: camera { 590 + pinctrl-0 = <&cam_port_a_clk_active &cam_port_b_clk_active>; 640 591 pinctrl-names = "default"; 641 592 status = "okay"; 642 593 ··· 654 605 655 606 fimc_3: fimc@11830000 { 656 607 status = "okay"; 608 + }; 609 + 610 + csis_0: csis@11880000 { 611 + status = "okay"; 612 + vddcore-supply = <&ldo8_reg>; 613 + vddio-supply = <&ldo10_reg>; 614 + clock-frequency = <176000000>; 615 + 616 + /* Camera C (3) MIPI CSI-2 (CSIS0) */ 617 + port@3 { 618 + reg = <3>; 619 + csis0_ep: endpoint { 620 + remote-endpoint = <&s5c73m3_ep>; 621 + data-lanes = <1 2 3 4>; 622 + samsung,csis-hs-settle = <12>; 623 + }; 624 + }; 657 625 }; 658 626 659 627 csis_1: csis@11890000 { ··· 713 647 reg = <0x10>; 714 648 svdda-supply = <&cam_io_reg>; 715 649 svddio-supply = <&ldo19_reg>; 650 + afvdd-supply = <&ldo19_reg>; 716 651 clock-frequency = <24000000>; 717 652 /* CAM_B_CLKOUT */ 718 - clocks = <&clock_cam 1>; 719 - clock-names = "mclk"; 653 + clocks = <&camera 1>; 654 + clock-names = "extclk"; 720 655 samsung,camclk-out = <1>; 721 656 gpios = <&gpm1 6 0>; 722 657
+18
arch/arm/boot/dts/exynos4x12.dtsi
··· 37 37 interrupts = <2 2>, <3 2>, <18 2>, <19 2>; 38 38 }; 39 39 40 + sysram@02020000 { 41 + compatible = "mmio-sram"; 42 + reg = <0x02020000 0x40000>; 43 + #address-cells = <1>; 44 + #size-cells = <1>; 45 + ranges = <0 0x02020000 0x40000>; 46 + 47 + smp-sysram@0 { 48 + compatible = "samsung,exynos4210-sysram"; 49 + reg = <0x0 0x1000>; 50 + }; 51 + 52 + smp-sysram@2f000 { 53 + compatible = "samsung,exynos4210-sysram-ns"; 54 + reg = <0x2f000 0x1000>; 55 + }; 56 + }; 57 + 40 58 pd_isp: isp-power-domain@10023CA0 { 41 59 compatible = "samsung,exynos4210-pd"; 42 60 reg = <0x10023CA0 0x20>;
+18
arch/arm/boot/dts/exynos5250.dtsi
··· 72 72 }; 73 73 }; 74 74 75 + sysram@02020000 { 76 + compatible = "mmio-sram"; 77 + reg = <0x02020000 0x30000>; 78 + #address-cells = <1>; 79 + #size-cells = <1>; 80 + ranges = <0 0x02020000 0x30000>; 81 + 82 + smp-sysram@0 { 83 + compatible = "samsung,exynos4210-sysram"; 84 + reg = <0x0 0x1000>; 85 + }; 86 + 87 + smp-sysram@2f000 { 88 + compatible = "samsung,exynos4210-sysram-ns"; 89 + reg = <0x2f000 0x1000>; 90 + }; 91 + }; 92 + 75 93 pd_gsc: gsc-power-domain@10044000 { 76 94 compatible = "samsung,exynos4210-pd"; 77 95 reg = <0x10044000 0x20>;
+147
arch/arm/boot/dts/exynos5420-peach-pit.dts
··· 1 + /* 2 + * Google Peach Pit Rev 6+ board device tree source 3 + * 4 + * Copyright (c) 2014 Google, Inc 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 + /dts-v1/; 12 + #include <dt-bindings/input/input.h> 13 + #include <dt-bindings/gpio/gpio.h> 14 + #include "exynos5420.dtsi" 15 + 16 + / { 17 + model = "Google Peach Pit Rev 6+"; 18 + 19 + compatible = "google,pit-rev16", 20 + "google,pit-rev15", "google,pit-rev14", 21 + "google,pit-rev13", "google,pit-rev12", 22 + "google,pit-rev11", "google,pit-rev10", 23 + "google,pit-rev9", "google,pit-rev8", 24 + "google,pit-rev7", "google,pit-rev6", 25 + "google,pit", "google,peach","samsung,exynos5420", 26 + "samsung,exynos5"; 27 + 28 + memory { 29 + reg = <0x20000000 0x80000000>; 30 + }; 31 + 32 + fixed-rate-clocks { 33 + oscclk { 34 + compatible = "samsung,exynos5420-oscclk"; 35 + clock-frequency = <24000000>; 36 + }; 37 + }; 38 + 39 + gpio-keys { 40 + compatible = "gpio-keys"; 41 + 42 + pinctrl-names = "default"; 43 + pinctrl-0 = <&power_key_irq>; 44 + 45 + power { 46 + label = "Power"; 47 + gpios = <&gpx1 2 GPIO_ACTIVE_LOW>; 48 + linux,code = <KEY_POWER>; 49 + gpio-key,wakeup; 50 + }; 51 + }; 52 + 53 + backlight { 54 + compatible = "pwm-backlight"; 55 + pwms = <&pwm 0 1000000 0>; 56 + brightness-levels = <0 100 500 1000 1500 2000 2500 2800>; 57 + default-brightness-level = <7>; 58 + pinctrl-0 = <&pwm0_out>; 59 + pinctrl-names = "default"; 60 + }; 61 + }; 62 + 63 + &pinctrl_0 { 64 + tpm_irq: tpm-irq { 65 + samsung,pins = "gpx1-0"; 66 + samsung,pin-function = <0>; 67 + samsung,pin-pud = <0>; 68 + samsung,pin-drv = <0>; 69 + }; 70 + 71 + power_key_irq: power-key-irq { 72 + samsung,pins = "gpx1-2"; 73 + samsung,pin-function = <0>; 74 + samsung,pin-pud = <0>; 75 + samsung,pin-drv = <0>; 76 + }; 77 + }; 78 + 79 + &rtc { 80 + status = "okay"; 81 + }; 82 + 83 + &uart_3 { 84 + status = "okay"; 85 + }; 86 + 87 + &mmc_0 { 88 + status = "okay"; 89 + num-slots = <1>; 90 + broken-cd; 91 + caps2-mmc-hs200-1_8v; 92 + supports-highspeed; 93 + non-removable; 94 + card-detect-delay = <200>; 95 + clock-frequency = <400000000>; 96 + samsung,dw-mshc-ciu-div = <3>; 97 + samsung,dw-mshc-sdr-timing = <0 4>; 98 + samsung,dw-mshc-ddr-timing = <0 2>; 99 + pinctrl-names = "default"; 100 + pinctrl-0 = <&sd0_clk &sd0_cmd &sd0_bus4 &sd0_bus8>; 101 + 102 + slot@0 { 103 + reg = <0>; 104 + bus-width = <8>; 105 + }; 106 + }; 107 + 108 + &mmc_2 { 109 + status = "okay"; 110 + num-slots = <1>; 111 + supports-highspeed; 112 + card-detect-delay = <200>; 113 + clock-frequency = <400000000>; 114 + samsung,dw-mshc-ciu-div = <3>; 115 + samsung,dw-mshc-sdr-timing = <2 3>; 116 + samsung,dw-mshc-ddr-timing = <1 2>; 117 + pinctrl-names = "default"; 118 + pinctrl-0 = <&sd2_clk &sd2_cmd &sd2_cd &sd2_bus4>; 119 + 120 + slot@0 { 121 + reg = <0>; 122 + bus-width = <4>; 123 + }; 124 + }; 125 + 126 + &hsi2c_9 { 127 + status = "okay"; 128 + clock-frequency = <400000>; 129 + 130 + tpm@20 { 131 + compatible = "infineon,slb9645tt"; 132 + reg = <0x20>; 133 + 134 + /* Unused irq; but still need to configure the pins */ 135 + pinctrl-names = "default"; 136 + pinctrl-0 = <&tpm_irq>; 137 + }; 138 + }; 139 + 140 + /* 141 + * Use longest HW watchdog in SoC (32 seconds) since the hardware 142 + * watchdog provides no debugging information (compared to soft/hard 143 + * lockup detectors) and so should be last resort. 144 + */ 145 + &watchdog { 146 + timeout-sec = <32>; 147 + };
+28
arch/arm/boot/dts/exynos5420-pinctrl.dtsi
··· 624 624 samsung,pin-drv = <0>; 625 625 }; 626 626 627 + pwm0_out: pwm0-out { 628 + samsung,pins = "gpb2-0"; 629 + samsung,pin-function = <2>; 630 + samsung,pin-pud = <0>; 631 + samsung,pin-drv = <0>; 632 + }; 633 + 634 + pwm1_out: pwm1-out { 635 + samsung,pins = "gpb2-1"; 636 + samsung,pin-function = <2>; 637 + samsung,pin-pud = <0>; 638 + samsung,pin-drv = <0>; 639 + }; 640 + 641 + pwm2_out: pwm2-out { 642 + samsung,pins = "gpb2-2"; 643 + samsung,pin-function = <2>; 644 + samsung,pin-pud = <0>; 645 + samsung,pin-drv = <0>; 646 + }; 647 + 648 + pwm3_out: pwm3-out { 649 + samsung,pins = "gpb2-3"; 650 + samsung,pin-function = <2>; 651 + samsung,pin-pud = <0>; 652 + samsung,pin-drv = <0>; 653 + }; 654 + 627 655 i2c7_hs_bus: i2c7-hs-bus { 628 656 samsung,pins = "gpb2-2", "gpb2-3"; 629 657 samsung,pin-function = <3>;
+65 -20
arch/arm/boot/dts/exynos5420.dtsi
··· 58 58 compatible = "arm,cortex-a15"; 59 59 reg = <0x0>; 60 60 clock-frequency = <1800000000>; 61 + cci-control-port = <&cci_control1>; 61 62 }; 62 63 63 64 cpu1: cpu@1 { ··· 66 65 compatible = "arm,cortex-a15"; 67 66 reg = <0x1>; 68 67 clock-frequency = <1800000000>; 68 + cci-control-port = <&cci_control1>; 69 69 }; 70 70 71 71 cpu2: cpu@2 { ··· 74 72 compatible = "arm,cortex-a15"; 75 73 reg = <0x2>; 76 74 clock-frequency = <1800000000>; 75 + cci-control-port = <&cci_control1>; 77 76 }; 78 77 79 78 cpu3: cpu@3 { ··· 82 79 compatible = "arm,cortex-a15"; 83 80 reg = <0x3>; 84 81 clock-frequency = <1800000000>; 82 + cci-control-port = <&cci_control1>; 85 83 }; 86 84 87 85 cpu4: cpu@100 { ··· 90 86 compatible = "arm,cortex-a7"; 91 87 reg = <0x100>; 92 88 clock-frequency = <1000000000>; 89 + cci-control-port = <&cci_control0>; 93 90 }; 94 91 95 92 cpu5: cpu@101 { ··· 98 93 compatible = "arm,cortex-a7"; 99 94 reg = <0x101>; 100 95 clock-frequency = <1000000000>; 96 + cci-control-port = <&cci_control0>; 101 97 }; 102 98 103 99 cpu6: cpu@102 { ··· 106 100 compatible = "arm,cortex-a7"; 107 101 reg = <0x102>; 108 102 clock-frequency = <1000000000>; 103 + cci-control-port = <&cci_control0>; 109 104 }; 110 105 111 106 cpu7: cpu@103 { ··· 114 107 compatible = "arm,cortex-a7"; 115 108 reg = <0x103>; 116 109 clock-frequency = <1000000000>; 110 + cci-control-port = <&cci_control0>; 111 + }; 112 + }; 113 + 114 + cci@10d20000 { 115 + compatible = "arm,cci-400"; 116 + #address-cells = <1>; 117 + #size-cells = <1>; 118 + reg = <0x10d20000 0x1000>; 119 + ranges = <0x0 0x10d20000 0x6000>; 120 + 121 + cci_control0: slave-if@4000 { 122 + compatible = "arm,cci-400-ctrl-if"; 123 + interface-type = "ace"; 124 + reg = <0x4000 0x1000>; 125 + }; 126 + cci_control1: slave-if@5000 { 127 + compatible = "arm,cci-400-ctrl-if"; 128 + interface-type = "ace"; 129 + reg = <0x5000 0x1000>; 130 + }; 131 + }; 132 + 133 + sysram@02020000 { 134 + compatible = "mmio-sram"; 135 + reg = <0x02020000 0x54000>; 136 + #address-cells = <1>; 137 + #size-cells = <1>; 138 + ranges = <0 0x02020000 0x54000>; 139 + 140 + smp-sysram@0 { 141 + compatible = "samsung,exynos4210-sysram"; 142 + reg = <0x0 0x1000>; 143 + }; 144 + 145 + smp-sysram@53000 { 146 + compatible = "samsung,exynos4210-sysram-ns"; 147 + reg = <0x53000 0x1000>; 117 148 }; 118 149 }; 119 150 ··· 170 125 clock-names = "pll_ref", "pll_in", "sclk_audio", "sclk_pcm_in"; 171 126 }; 172 127 173 - codec@11000000 { 128 + mfc: codec@11000000 { 174 129 compatible = "samsung,mfc-v7"; 175 130 reg = <0x11000000 0x10000>; 176 131 interrupts = <0 96 0>; ··· 214 169 status = "disabled"; 215 170 }; 216 171 217 - mct@101C0000 { 172 + mct: mct@101C0000 { 218 173 compatible = "samsung,exynos4210-mct"; 219 174 reg = <0x101C0000 0x800>; 220 175 interrupt-controller; ··· 315 270 interrupts = <0 47 0>; 316 271 }; 317 272 318 - rtc@101E0000 { 273 + rtc: rtc@101E0000 { 319 274 clocks = <&clock CLK_RTC>; 320 275 clock-names = "rtc"; 321 276 status = "disabled"; ··· 475 430 status = "disabled"; 476 431 }; 477 432 478 - serial@12C00000 { 433 + uart_0: serial@12C00000 { 479 434 clocks = <&clock CLK_UART0>, <&clock CLK_SCLK_UART0>; 480 435 clock-names = "uart", "clk_uart_baud0"; 481 436 }; 482 437 483 - serial@12C10000 { 438 + uart_1: serial@12C10000 { 484 439 clocks = <&clock CLK_UART1>, <&clock CLK_SCLK_UART1>; 485 440 clock-names = "uart", "clk_uart_baud0"; 486 441 }; 487 442 488 - serial@12C20000 { 443 + uart_2: serial@12C20000 { 489 444 clocks = <&clock CLK_UART2>, <&clock CLK_SCLK_UART2>; 490 445 clock-names = "uart", "clk_uart_baud0"; 491 446 }; 492 447 493 - serial@12C30000 { 448 + uart_3: serial@12C30000 { 494 449 clocks = <&clock CLK_UART3>, <&clock CLK_SCLK_UART3>; 495 450 clock-names = "uart", "clk_uart_baud0"; 496 451 }; ··· 510 465 #phy-cells = <0>; 511 466 }; 512 467 513 - dp-controller@145B0000 { 468 + dp: dp-controller@145B0000 { 514 469 clocks = <&clock CLK_DP1>; 515 470 clock-names = "dp"; 516 471 phys = <&dp_phy>; 517 472 phy-names = "dp"; 518 473 }; 519 474 520 - fimd@14400000 { 475 + fimd: fimd@14400000 { 521 476 samsung,power-domain = <&disp_pd>; 522 477 clocks = <&clock CLK_SCLK_FIMD1>, <&clock CLK_FIMD1>; 523 478 clock-names = "sclk_fimd", "fimd"; ··· 594 549 #size-cells = <0>; 595 550 pinctrl-names = "default"; 596 551 pinctrl-0 = <&i2c4_hs_bus>; 597 - clocks = <&clock CLK_I2C4>; 552 + clocks = <&clock CLK_USI0>; 598 553 clock-names = "hsi2c"; 599 554 status = "disabled"; 600 555 }; ··· 607 562 #size-cells = <0>; 608 563 pinctrl-names = "default"; 609 564 pinctrl-0 = <&i2c5_hs_bus>; 610 - clocks = <&clock CLK_I2C5>; 565 + clocks = <&clock CLK_USI1>; 611 566 clock-names = "hsi2c"; 612 567 status = "disabled"; 613 568 }; ··· 620 575 #size-cells = <0>; 621 576 pinctrl-names = "default"; 622 577 pinctrl-0 = <&i2c6_hs_bus>; 623 - clocks = <&clock CLK_I2C6>; 578 + clocks = <&clock CLK_USI2>; 624 579 clock-names = "hsi2c"; 625 580 status = "disabled"; 626 581 }; ··· 633 588 #size-cells = <0>; 634 589 pinctrl-names = "default"; 635 590 pinctrl-0 = <&i2c7_hs_bus>; 636 - clocks = <&clock CLK_I2C7>; 591 + clocks = <&clock CLK_USI3>; 637 592 clock-names = "hsi2c"; 638 593 status = "disabled"; 639 594 }; ··· 646 601 #size-cells = <0>; 647 602 pinctrl-names = "default"; 648 603 pinctrl-0 = <&i2c8_hs_bus>; 649 - clocks = <&clock CLK_I2C8>; 604 + clocks = <&clock CLK_USI4>; 650 605 clock-names = "hsi2c"; 651 606 status = "disabled"; 652 607 }; ··· 659 614 #size-cells = <0>; 660 615 pinctrl-names = "default"; 661 616 pinctrl-0 = <&i2c9_hs_bus>; 662 - clocks = <&clock CLK_I2C9>; 617 + clocks = <&clock CLK_USI5>; 663 618 clock-names = "hsi2c"; 664 619 status = "disabled"; 665 620 }; ··· 672 627 #size-cells = <0>; 673 628 pinctrl-names = "default"; 674 629 pinctrl-0 = <&i2c10_hs_bus>; 675 - clocks = <&clock CLK_I2C10>; 630 + clocks = <&clock CLK_USI6>; 676 631 clock-names = "hsi2c"; 677 632 status = "disabled"; 678 633 }; 679 634 680 - hdmi@14530000 { 635 + hdmi: hdmi@14530000 { 681 636 compatible = "samsung,exynos4212-hdmi"; 682 637 reg = <0x14530000 0x70000>; 683 638 interrupts = <0 95 0>; ··· 689 644 status = "disabled"; 690 645 }; 691 646 692 - mixer@14450000 { 647 + mixer: mixer@14450000 { 693 648 compatible = "samsung,exynos5420-mixer"; 694 649 reg = <0x14450000 0x10000>; 695 650 interrupts = <0 94 0>; ··· 760 715 clock-names = "tmu_apbif", "tmu_triminfo_apbif"; 761 716 }; 762 717 763 - watchdog@101D0000 { 718 + watchdog: watchdog@101D0000 { 764 719 compatible = "samsung,exynos5420-wdt"; 765 720 reg = <0x101D0000 0x100>; 766 721 interrupts = <0 42 0>; ··· 769 724 samsung,syscon-phandle = <&pmu_system_controller>; 770 725 }; 771 726 772 - sss@10830000 { 727 + sss: sss@10830000 { 773 728 compatible = "samsung,exynos4210-secss"; 774 729 reg = <0x10830000 0x10000>; 775 730 interrupts = <0 112 0>;
+13
arch/arm/boot/dts/s3c2416-smdk2416.dts
··· 19 19 reg = <0x30000000 0x4000000>; 20 20 }; 21 21 22 + clocks { 23 + compatible = "simple-bus"; 24 + #address-cells = <1>; 25 + #size-cells = <1>; 26 + 27 + xti: xti { 28 + compatible = "fixed-clock"; 29 + clock-frequency = <12000000>; 30 + clock-output-names = "xti"; 31 + #clock-cells = <0>; 32 + }; 33 + }; 34 + 22 35 serial@50000000 { 23 36 status = "okay"; 24 37 pinctrl-names = "default";
+42
arch/arm/boot/dts/s3c2416.dtsi
··· 8 8 * published by the Free Software Foundation. 9 9 */ 10 10 11 + #include <dt-bindings/clock/s3c2443.h> 11 12 #include "s3c24xx.dtsi" 12 13 #include "s3c2416-pinctrl.dtsi" 13 14 ··· 29 28 compatible = "samsung,s3c2416-irq"; 30 29 }; 31 30 31 + clocks: clock-controller@0x4c000000 { 32 + compatible = "samsung,s3c2416-clock"; 33 + reg = <0x4c000000 0x40>; 34 + #clock-cells = <1>; 35 + }; 36 + 32 37 pinctrl@56000000 { 33 38 compatible = "samsung,s3c2416-pinctrl"; 34 39 }; 35 40 41 + timer@51000000 { 42 + clocks = <&clocks PCLK_PWM>; 43 + clock-names = "timers"; 44 + }; 45 + 36 46 serial@50000000 { 37 47 compatible = "samsung,s3c2440-uart"; 48 + clock-names = "uart", "clk_uart_baud2", 49 + "clk_uart_baud3"; 50 + clocks = <&clocks PCLK_UART0>, <&clocks PCLK_UART0>, 51 + <&clocks SCLK_UART>; 38 52 }; 39 53 40 54 serial@50004000 { 41 55 compatible = "samsung,s3c2440-uart"; 56 + clock-names = "uart", "clk_uart_baud2", 57 + "clk_uart_baud3"; 58 + clocks = <&clocks PCLK_UART1>, <&clocks PCLK_UART1>, 59 + <&clocks SCLK_UART>; 42 60 }; 43 61 44 62 serial@50008000 { 45 63 compatible = "samsung,s3c2440-uart"; 64 + clock-names = "uart", "clk_uart_baud2", 65 + "clk_uart_baud3"; 66 + clocks = <&clocks PCLK_UART2>, <&clocks PCLK_UART2>, 67 + <&clocks SCLK_UART>; 46 68 }; 47 69 48 70 serial@5000C000 { 49 71 compatible = "samsung,s3c2440-uart"; 50 72 reg = <0x5000C000 0x4000>; 51 73 interrupts = <1 18 24 4>, <1 18 25 4>; 74 + clock-names = "uart", "clk_uart_baud2", 75 + "clk_uart_baud3"; 76 + clocks = <&clocks PCLK_UART3>, <&clocks PCLK_UART3>, 77 + <&clocks SCLK_UART>; 52 78 status = "disabled"; 53 79 }; 54 80 ··· 83 55 compatible = "samsung,s3c6410-sdhci"; 84 56 reg = <0x4AC00000 0x100>; 85 57 interrupts = <0 0 21 3>; 58 + clock-names = "hsmmc", "mmc_busclk.0", 59 + "mmc_busclk.2"; 60 + clocks = <&clocks HCLK_HSMMC0>, <&clocks HCLK_HSMMC0>, 61 + <&clocks MUX_HSMMC0>; 86 62 status = "disabled"; 87 63 }; 88 64 ··· 94 62 compatible = "samsung,s3c6410-sdhci"; 95 63 reg = <0x4A800000 0x100>; 96 64 interrupts = <0 0 20 3>; 65 + clock-names = "hsmmc", "mmc_busclk.0", 66 + "mmc_busclk.2"; 67 + clocks = <&clocks HCLK_HSMMC1>, <&clocks HCLK_HSMMC1>, 68 + <&clocks MUX_HSMMC1>; 97 69 status = "disabled"; 98 70 }; 99 71 100 72 watchdog@53000000 { 101 73 interrupts = <1 9 27 3>; 74 + clocks = <&clocks PCLK_WDT>; 75 + clock-names = "watchdog"; 102 76 }; 103 77 104 78 rtc@57000000 { 105 79 compatible = "samsung,s3c2416-rtc"; 80 + clocks = <&clocks PCLK_RTC>; 81 + clock-names = "rtc"; 106 82 }; 107 83 108 84 i2c@54000000 { 109 85 compatible = "samsung,s3c2440-i2c"; 86 + clocks = <&clocks PCLK_I2C0>; 87 + clock-names = "i2c"; 110 88 }; 111 89 };
+8
arch/arm/mach-exynos/Kconfig
··· 110 110 111 111 endmenu 112 112 113 + config EXYNOS5420_MCPM 114 + bool "Exynos5420 Multi-Cluster PM support" 115 + depends on MCPM && SOC_EXYNOS5420 116 + select ARM_CCI 117 + help 118 + This is needed to provide CPU and cluster power management 119 + on Exynos5420 implementing big.LITTLE. 120 + 113 121 endif
+2 -1
arch/arm/mach-exynos/Makefile
··· 16 16 17 17 obj-$(CONFIG_PM_SLEEP) += pm.o sleep.o 18 18 obj-$(CONFIG_PM_GENERIC_DOMAINS) += pm_domains.o 19 - obj-$(CONFIG_CPU_IDLE) += cpuidle.o 20 19 21 20 obj-$(CONFIG_ARCH_EXYNOS) += pmu.o 22 21 ··· 28 29 29 30 plus_sec := $(call as-instr,.arch_extension sec,+sec) 30 31 AFLAGS_exynos-smc.o :=-Wa,-march=armv7-a$(plus_sec) 32 + 33 + obj-$(CONFIG_EXYNOS5420_MCPM) += mcpm-exynos.o
+9
arch/arm/mach-exynos/common.h
··· 18 18 void mct_init(void __iomem *base, int irq_g0, int irq_l0, int irq_l1); 19 19 20 20 struct map_desc; 21 + extern void __iomem *sysram_ns_base_addr; 22 + extern void __iomem *sysram_base_addr; 21 23 void exynos_init_io(void); 22 24 void exynos_restart(enum reboot_mode mode, const char *cmd); 23 25 void exynos_cpuidle_init(void); ··· 64 62 }; 65 63 66 64 extern void exynos_sys_powerdown_conf(enum sys_powerdown mode); 65 + extern void exynos_cpu_power_down(int cpu); 66 + extern void exynos_cpu_power_up(int cpu); 67 + extern int exynos_cpu_power_state(int cpu); 68 + extern void exynos_cluster_power_down(int cluster); 69 + extern void exynos_cluster_power_up(int cluster); 70 + extern int exynos_cluster_power_state(int cluster); 71 + extern void exynos_enter_aftr(void); 67 72 68 73 #endif /* __ARCH_ARM_MACH_EXYNOS_COMMON_H */
-256
arch/arm/mach-exynos/cpuidle.c
··· 1 - /* linux/arch/arm/mach-exynos4/cpuidle.c 2 - * 3 - * Copyright (c) 2011 Samsung Electronics Co., Ltd. 4 - * http://www.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 - */ 10 - 11 - #include <linux/kernel.h> 12 - #include <linux/init.h> 13 - #include <linux/cpuidle.h> 14 - #include <linux/cpu_pm.h> 15 - #include <linux/io.h> 16 - #include <linux/export.h> 17 - #include <linux/module.h> 18 - #include <linux/time.h> 19 - #include <linux/platform_device.h> 20 - 21 - #include <asm/proc-fns.h> 22 - #include <asm/smp_scu.h> 23 - #include <asm/suspend.h> 24 - #include <asm/unified.h> 25 - #include <asm/cpuidle.h> 26 - 27 - #include <plat/cpu.h> 28 - #include <plat/pm.h> 29 - 30 - #include <mach/map.h> 31 - 32 - #include "common.h" 33 - #include "regs-pmu.h" 34 - 35 - #define REG_DIRECTGO_ADDR (samsung_rev() == EXYNOS4210_REV_1_1 ? \ 36 - S5P_INFORM7 : (samsung_rev() == EXYNOS4210_REV_1_0 ? \ 37 - (S5P_VA_SYSRAM + 0x24) : S5P_INFORM0)) 38 - #define REG_DIRECTGO_FLAG (samsung_rev() == EXYNOS4210_REV_1_1 ? \ 39 - S5P_INFORM6 : (samsung_rev() == EXYNOS4210_REV_1_0 ? \ 40 - (S5P_VA_SYSRAM + 0x20) : S5P_INFORM1)) 41 - 42 - #define S5P_CHECK_AFTR 0xFCBA0D10 43 - 44 - #define EXYNOS5_PWR_CTRL1 (S5P_VA_CMU + 0x01020) 45 - #define EXYNOS5_PWR_CTRL2 (S5P_VA_CMU + 0x01024) 46 - 47 - #define PWR_CTRL1_CORE2_DOWN_RATIO (7 << 28) 48 - #define PWR_CTRL1_CORE1_DOWN_RATIO (7 << 16) 49 - #define PWR_CTRL1_DIV2_DOWN_EN (1 << 9) 50 - #define PWR_CTRL1_DIV1_DOWN_EN (1 << 8) 51 - #define PWR_CTRL1_USE_CORE1_WFE (1 << 5) 52 - #define PWR_CTRL1_USE_CORE0_WFE (1 << 4) 53 - #define PWR_CTRL1_USE_CORE1_WFI (1 << 1) 54 - #define PWR_CTRL1_USE_CORE0_WFI (1 << 0) 55 - 56 - #define PWR_CTRL2_DIV2_UP_EN (1 << 25) 57 - #define PWR_CTRL2_DIV1_UP_EN (1 << 24) 58 - #define PWR_CTRL2_DUR_STANDBY2_VAL (1 << 16) 59 - #define PWR_CTRL2_DUR_STANDBY1_VAL (1 << 8) 60 - #define PWR_CTRL2_CORE2_UP_RATIO (1 << 4) 61 - #define PWR_CTRL2_CORE1_UP_RATIO (1 << 0) 62 - 63 - static int exynos4_enter_lowpower(struct cpuidle_device *dev, 64 - struct cpuidle_driver *drv, 65 - int index); 66 - 67 - static DEFINE_PER_CPU(struct cpuidle_device, exynos4_cpuidle_device); 68 - 69 - static struct cpuidle_driver exynos4_idle_driver = { 70 - .name = "exynos4_idle", 71 - .owner = THIS_MODULE, 72 - .states = { 73 - [0] = ARM_CPUIDLE_WFI_STATE, 74 - [1] = { 75 - .enter = exynos4_enter_lowpower, 76 - .exit_latency = 300, 77 - .target_residency = 100000, 78 - .flags = CPUIDLE_FLAG_TIME_VALID, 79 - .name = "C1", 80 - .desc = "ARM power down", 81 - }, 82 - }, 83 - .state_count = 2, 84 - .safe_state_index = 0, 85 - }; 86 - 87 - /* Ext-GIC nIRQ/nFIQ is the only wakeup source in AFTR */ 88 - static void exynos4_set_wakeupmask(void) 89 - { 90 - __raw_writel(0x0000ff3e, S5P_WAKEUP_MASK); 91 - } 92 - 93 - static unsigned int g_pwr_ctrl, g_diag_reg; 94 - 95 - static void save_cpu_arch_register(void) 96 - { 97 - /*read power control register*/ 98 - asm("mrc p15, 0, %0, c15, c0, 0" : "=r"(g_pwr_ctrl) : : "cc"); 99 - /*read diagnostic register*/ 100 - asm("mrc p15, 0, %0, c15, c0, 1" : "=r"(g_diag_reg) : : "cc"); 101 - return; 102 - } 103 - 104 - static void restore_cpu_arch_register(void) 105 - { 106 - /*write power control register*/ 107 - asm("mcr p15, 0, %0, c15, c0, 0" : : "r"(g_pwr_ctrl) : "cc"); 108 - /*write diagnostic register*/ 109 - asm("mcr p15, 0, %0, c15, c0, 1" : : "r"(g_diag_reg) : "cc"); 110 - return; 111 - } 112 - 113 - static int idle_finisher(unsigned long flags) 114 - { 115 - cpu_do_idle(); 116 - return 1; 117 - } 118 - 119 - static int exynos4_enter_core0_aftr(struct cpuidle_device *dev, 120 - struct cpuidle_driver *drv, 121 - int index) 122 - { 123 - unsigned long tmp; 124 - 125 - exynos4_set_wakeupmask(); 126 - 127 - /* Set value of power down register for aftr mode */ 128 - exynos_sys_powerdown_conf(SYS_AFTR); 129 - 130 - __raw_writel(virt_to_phys(exynos_cpu_resume), REG_DIRECTGO_ADDR); 131 - __raw_writel(S5P_CHECK_AFTR, REG_DIRECTGO_FLAG); 132 - 133 - save_cpu_arch_register(); 134 - 135 - /* Setting Central Sequence Register for power down mode */ 136 - tmp = __raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION); 137 - tmp &= ~S5P_CENTRAL_LOWPWR_CFG; 138 - __raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION); 139 - 140 - cpu_pm_enter(); 141 - cpu_suspend(0, idle_finisher); 142 - 143 - #ifdef CONFIG_SMP 144 - if (!soc_is_exynos5250()) 145 - scu_enable(S5P_VA_SCU); 146 - #endif 147 - cpu_pm_exit(); 148 - 149 - restore_cpu_arch_register(); 150 - 151 - /* 152 - * If PMU failed while entering sleep mode, WFI will be 153 - * ignored by PMU and then exiting cpu_do_idle(). 154 - * S5P_CENTRAL_LOWPWR_CFG bit will not be set automatically 155 - * in this situation. 156 - */ 157 - tmp = __raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION); 158 - if (!(tmp & S5P_CENTRAL_LOWPWR_CFG)) { 159 - tmp |= S5P_CENTRAL_LOWPWR_CFG; 160 - __raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION); 161 - } 162 - 163 - /* Clear wakeup state register */ 164 - __raw_writel(0x0, S5P_WAKEUP_STAT); 165 - 166 - return index; 167 - } 168 - 169 - static int exynos4_enter_lowpower(struct cpuidle_device *dev, 170 - struct cpuidle_driver *drv, 171 - int index) 172 - { 173 - int new_index = index; 174 - 175 - /* AFTR can only be entered when cores other than CPU0 are offline */ 176 - if (num_online_cpus() > 1 || dev->cpu != 0) 177 - new_index = drv->safe_state_index; 178 - 179 - if (new_index == 0) 180 - return arm_cpuidle_simple_enter(dev, drv, new_index); 181 - else 182 - return exynos4_enter_core0_aftr(dev, drv, new_index); 183 - } 184 - 185 - static void __init exynos5_core_down_clk(void) 186 - { 187 - unsigned int tmp; 188 - 189 - /* 190 - * Enable arm clock down (in idle) and set arm divider 191 - * ratios in WFI/WFE state. 192 - */ 193 - tmp = PWR_CTRL1_CORE2_DOWN_RATIO | \ 194 - PWR_CTRL1_CORE1_DOWN_RATIO | \ 195 - PWR_CTRL1_DIV2_DOWN_EN | \ 196 - PWR_CTRL1_DIV1_DOWN_EN | \ 197 - PWR_CTRL1_USE_CORE1_WFE | \ 198 - PWR_CTRL1_USE_CORE0_WFE | \ 199 - PWR_CTRL1_USE_CORE1_WFI | \ 200 - PWR_CTRL1_USE_CORE0_WFI; 201 - __raw_writel(tmp, EXYNOS5_PWR_CTRL1); 202 - 203 - /* 204 - * Enable arm clock up (on exiting idle). Set arm divider 205 - * ratios when not in idle along with the standby duration 206 - * ratios. 207 - */ 208 - tmp = PWR_CTRL2_DIV2_UP_EN | \ 209 - PWR_CTRL2_DIV1_UP_EN | \ 210 - PWR_CTRL2_DUR_STANDBY2_VAL | \ 211 - PWR_CTRL2_DUR_STANDBY1_VAL | \ 212 - PWR_CTRL2_CORE2_UP_RATIO | \ 213 - PWR_CTRL2_CORE1_UP_RATIO; 214 - __raw_writel(tmp, EXYNOS5_PWR_CTRL2); 215 - } 216 - 217 - static int exynos_cpuidle_probe(struct platform_device *pdev) 218 - { 219 - int cpu_id, ret; 220 - struct cpuidle_device *device; 221 - 222 - if (soc_is_exynos5250()) 223 - exynos5_core_down_clk(); 224 - 225 - if (soc_is_exynos5440()) 226 - exynos4_idle_driver.state_count = 1; 227 - 228 - ret = cpuidle_register_driver(&exynos4_idle_driver); 229 - if (ret) { 230 - dev_err(&pdev->dev, "failed to register cpuidle driver\n"); 231 - return ret; 232 - } 233 - 234 - for_each_online_cpu(cpu_id) { 235 - device = &per_cpu(exynos4_cpuidle_device, cpu_id); 236 - device->cpu = cpu_id; 237 - 238 - ret = cpuidle_register_device(device); 239 - if (ret) { 240 - dev_err(&pdev->dev, "failed to register cpuidle device\n"); 241 - return ret; 242 - } 243 - } 244 - 245 - return 0; 246 - } 247 - 248 - static struct platform_driver exynos_cpuidle_driver = { 249 - .probe = exynos_cpuidle_probe, 250 - .driver = { 251 - .name = "exynos_cpuidle", 252 - .owner = THIS_MODULE, 253 - }, 254 - }; 255 - 256 - module_platform_driver(exynos_cpuidle_driver);
+6 -66
arch/arm/mach-exynos/exynos.c
··· 114 114 }, 115 115 }; 116 116 117 - static struct map_desc exynos4_iodesc0[] __initdata = { 118 - { 119 - .virtual = (unsigned long)S5P_VA_SYSRAM, 120 - .pfn = __phys_to_pfn(EXYNOS4_PA_SYSRAM0), 121 - .length = SZ_4K, 122 - .type = MT_DEVICE, 123 - }, 124 - }; 125 - 126 - static struct map_desc exynos4_iodesc1[] __initdata = { 127 - { 128 - .virtual = (unsigned long)S5P_VA_SYSRAM, 129 - .pfn = __phys_to_pfn(EXYNOS4_PA_SYSRAM1), 130 - .length = SZ_4K, 131 - .type = MT_DEVICE, 132 - }, 133 - }; 134 - 135 - static struct map_desc exynos4210_iodesc[] __initdata = { 136 - { 137 - .virtual = (unsigned long)S5P_VA_SYSRAM_NS, 138 - .pfn = __phys_to_pfn(EXYNOS4210_PA_SYSRAM_NS), 139 - .length = SZ_4K, 140 - .type = MT_DEVICE, 141 - }, 142 - }; 143 - 144 - static struct map_desc exynos4x12_iodesc[] __initdata = { 145 - { 146 - .virtual = (unsigned long)S5P_VA_SYSRAM_NS, 147 - .pfn = __phys_to_pfn(EXYNOS4x12_PA_SYSRAM_NS), 148 - .length = SZ_4K, 149 - .type = MT_DEVICE, 150 - }, 151 - }; 152 - 153 - static struct map_desc exynos5250_iodesc[] __initdata = { 154 - { 155 - .virtual = (unsigned long)S5P_VA_SYSRAM_NS, 156 - .pfn = __phys_to_pfn(EXYNOS5250_PA_SYSRAM_NS), 157 - .length = SZ_4K, 158 - .type = MT_DEVICE, 159 - }, 160 - }; 161 - 162 117 static struct map_desc exynos5_iodesc[] __initdata = { 163 118 { 164 119 .virtual = (unsigned long)S3C_VA_SYS, ··· 133 178 }, { 134 179 .virtual = (unsigned long)S5P_VA_SROMC, 135 180 .pfn = __phys_to_pfn(EXYNOS5_PA_SROMC), 136 - .length = SZ_4K, 137 - .type = MT_DEVICE, 138 - }, { 139 - .virtual = (unsigned long)S5P_VA_SYSRAM, 140 - .pfn = __phys_to_pfn(EXYNOS5_PA_SYSRAM), 141 181 .length = SZ_4K, 142 182 .type = MT_DEVICE, 143 183 }, { ··· 171 221 } 172 222 173 223 static struct platform_device exynos_cpuidle = { 174 - .name = "exynos_cpuidle", 175 - .id = -1, 224 + .name = "exynos_cpuidle", 225 + .dev.platform_data = exynos_enter_aftr, 226 + .id = -1, 176 227 }; 177 228 178 229 void __init exynos_cpuidle_init(void) 179 230 { 231 + if (soc_is_exynos5440()) 232 + return; 233 + 180 234 platform_device_register(&exynos_cpuidle); 181 235 } 182 236 ··· 234 280 235 281 if (soc_is_exynos5()) 236 282 iotable_init(exynos5_iodesc, ARRAY_SIZE(exynos5_iodesc)); 237 - 238 - if (soc_is_exynos4210()) { 239 - if (samsung_rev() == EXYNOS4210_REV_0) 240 - iotable_init(exynos4_iodesc0, 241 - ARRAY_SIZE(exynos4_iodesc0)); 242 - else 243 - iotable_init(exynos4_iodesc1, 244 - ARRAY_SIZE(exynos4_iodesc1)); 245 - iotable_init(exynos4210_iodesc, ARRAY_SIZE(exynos4210_iodesc)); 246 - } 247 - if (soc_is_exynos4212() || soc_is_exynos4412()) 248 - iotable_init(exynos4x12_iodesc, ARRAY_SIZE(exynos4x12_iodesc)); 249 - if (soc_is_exynos5250()) 250 - iotable_init(exynos5250_iodesc, ARRAY_SIZE(exynos5250_iodesc)); 251 283 } 252 284 253 285 void __init exynos_init_io(void)
+7 -1
arch/arm/mach-exynos/firmware.c
··· 18 18 19 19 #include <mach/map.h> 20 20 21 + #include "common.h" 21 22 #include "smc.h" 22 23 23 24 static int exynos_do_idle(void) ··· 35 34 36 35 static int exynos_set_cpu_boot_addr(int cpu, unsigned long boot_addr) 37 36 { 38 - void __iomem *boot_reg = S5P_VA_SYSRAM_NS + 0x1c + 4*cpu; 37 + void __iomem *boot_reg; 38 + 39 + if (!sysram_ns_base_addr) 40 + return -ENODEV; 41 + 42 + boot_reg = sysram_ns_base_addr + 0x1c + 4*cpu; 39 43 40 44 __raw_writel(boot_addr, boot_reg); 41 45 return 0;
+1 -1
arch/arm/mach-exynos/hotplug.c
··· 96 96 97 97 /* make cpu1 to be turned off at next WFI command */ 98 98 if (cpu == 1) 99 - __raw_writel(0, S5P_ARM_CORE1_CONFIGURATION); 99 + exynos_cpu_power_down(cpu); 100 100 101 101 /* 102 102 * here's the WFI
-7
arch/arm/mach-exynos/include/mach/map.h
··· 23 23 24 24 #include <plat/map-s5p.h> 25 25 26 - #define EXYNOS4_PA_SYSRAM0 0x02025000 27 - #define EXYNOS4_PA_SYSRAM1 0x02020000 28 - #define EXYNOS5_PA_SYSRAM 0x02020000 29 - #define EXYNOS4210_PA_SYSRAM_NS 0x0203F000 30 - #define EXYNOS4x12_PA_SYSRAM_NS 0x0204F000 31 - #define EXYNOS5250_PA_SYSRAM_NS 0x0204F000 32 - 33 26 #define EXYNOS_PA_CHIPID 0x10000000 34 27 35 28 #define EXYNOS4_PA_SYSCON 0x10010000
+351
arch/arm/mach-exynos/mcpm-exynos.c
··· 1 + /* 2 + * Copyright (c) 2014 Samsung Electronics Co., Ltd. 3 + * http://www.samsung.com 4 + * 5 + * arch/arm/mach-exynos/mcpm-exynos.c 6 + * 7 + * Based on arch/arm/mach-vexpress/dcscb.c 8 + * 9 + * This program is free software; you can redistribute it and/or modify 10 + * it under the terms of the GNU General Public License version 2 as 11 + * published by the Free Software Foundation. 12 + */ 13 + 14 + #include <linux/arm-cci.h> 15 + #include <linux/delay.h> 16 + #include <linux/io.h> 17 + #include <linux/of_address.h> 18 + 19 + #include <asm/cputype.h> 20 + #include <asm/cp15.h> 21 + #include <asm/mcpm.h> 22 + 23 + #include "regs-pmu.h" 24 + #include "common.h" 25 + 26 + #define EXYNOS5420_CPUS_PER_CLUSTER 4 27 + #define EXYNOS5420_NR_CLUSTERS 2 28 + #define MCPM_BOOT_ADDR_OFFSET 0x1c 29 + 30 + /* 31 + * The common v7_exit_coherency_flush API could not be used because of the 32 + * Erratum 799270 workaround. This macro is the same as the common one (in 33 + * arch/arm/include/asm/cacheflush.h) except for the erratum handling. 34 + */ 35 + #define exynos_v7_exit_coherency_flush(level) \ 36 + asm volatile( \ 37 + "stmfd sp!, {fp, ip}\n\t"\ 38 + "mrc p15, 0, r0, c1, c0, 0 @ get SCTLR\n\t" \ 39 + "bic r0, r0, #"__stringify(CR_C)"\n\t" \ 40 + "mcr p15, 0, r0, c1, c0, 0 @ set SCTLR\n\t" \ 41 + "isb\n\t"\ 42 + "bl v7_flush_dcache_"__stringify(level)"\n\t" \ 43 + "clrex\n\t"\ 44 + "mrc p15, 0, r0, c1, c0, 1 @ get ACTLR\n\t" \ 45 + "bic r0, r0, #(1 << 6) @ disable local coherency\n\t" \ 46 + /* Dummy Load of a device register to avoid Erratum 799270 */ \ 47 + "ldr r4, [%0]\n\t" \ 48 + "and r4, r4, #0\n\t" \ 49 + "orr r0, r0, r4\n\t" \ 50 + "mcr p15, 0, r0, c1, c0, 1 @ set ACTLR\n\t" \ 51 + "isb\n\t" \ 52 + "dsb\n\t" \ 53 + "ldmfd sp!, {fp, ip}" \ 54 + : \ 55 + : "Ir" (S5P_INFORM0) \ 56 + : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \ 57 + "r9", "r10", "lr", "memory") 58 + 59 + /* 60 + * We can't use regular spinlocks. In the switcher case, it is possible 61 + * for an outbound CPU to call power_down() after its inbound counterpart 62 + * is already live using the same logical CPU number which trips lockdep 63 + * debugging. 64 + */ 65 + static arch_spinlock_t exynos_mcpm_lock = __ARCH_SPIN_LOCK_UNLOCKED; 66 + static int 67 + cpu_use_count[EXYNOS5420_CPUS_PER_CLUSTER][EXYNOS5420_NR_CLUSTERS]; 68 + 69 + #define exynos_cluster_usecnt(cluster) \ 70 + (cpu_use_count[0][cluster] + \ 71 + cpu_use_count[1][cluster] + \ 72 + cpu_use_count[2][cluster] + \ 73 + cpu_use_count[3][cluster]) 74 + 75 + #define exynos_cluster_unused(cluster) !exynos_cluster_usecnt(cluster) 76 + 77 + static int exynos_cluster_power_control(unsigned int cluster, int enable) 78 + { 79 + unsigned int tries = 100; 80 + unsigned int val; 81 + 82 + if (enable) { 83 + exynos_cluster_power_up(cluster); 84 + val = S5P_CORE_LOCAL_PWR_EN; 85 + } else { 86 + exynos_cluster_power_down(cluster); 87 + val = 0; 88 + } 89 + 90 + /* Wait until cluster power control is applied */ 91 + while (tries--) { 92 + if (exynos_cluster_power_state(cluster) == val) 93 + return 0; 94 + 95 + cpu_relax(); 96 + } 97 + pr_debug("timed out waiting for cluster %u to power %s\n", cluster, 98 + enable ? "on" : "off"); 99 + 100 + return -ETIMEDOUT; 101 + } 102 + 103 + static int exynos_power_up(unsigned int cpu, unsigned int cluster) 104 + { 105 + unsigned int cpunr = cpu + (cluster * EXYNOS5420_CPUS_PER_CLUSTER); 106 + int err = 0; 107 + 108 + pr_debug("%s: cpu %u cluster %u\n", __func__, cpu, cluster); 109 + if (cpu >= EXYNOS5420_CPUS_PER_CLUSTER || 110 + cluster >= EXYNOS5420_NR_CLUSTERS) 111 + return -EINVAL; 112 + 113 + /* 114 + * Since this is called with IRQs enabled, and no arch_spin_lock_irq 115 + * variant exists, we need to disable IRQs manually here. 116 + */ 117 + local_irq_disable(); 118 + arch_spin_lock(&exynos_mcpm_lock); 119 + 120 + cpu_use_count[cpu][cluster]++; 121 + if (cpu_use_count[cpu][cluster] == 1) { 122 + bool was_cluster_down = 123 + (exynos_cluster_usecnt(cluster) == 1); 124 + 125 + /* 126 + * Turn on the cluster (L2/COMMON) and then power on the 127 + * cores. 128 + */ 129 + if (was_cluster_down) 130 + err = exynos_cluster_power_control(cluster, 1); 131 + 132 + if (!err) 133 + exynos_cpu_power_up(cpunr); 134 + else 135 + exynos_cluster_power_control(cluster, 0); 136 + } else if (cpu_use_count[cpu][cluster] != 2) { 137 + /* 138 + * The only possible values are: 139 + * 0 = CPU down 140 + * 1 = CPU (still) up 141 + * 2 = CPU requested to be up before it had a chance 142 + * to actually make itself down. 143 + * Any other value is a bug. 144 + */ 145 + BUG(); 146 + } 147 + 148 + arch_spin_unlock(&exynos_mcpm_lock); 149 + local_irq_enable(); 150 + 151 + return err; 152 + } 153 + 154 + /* 155 + * NOTE: This function requires the stack data to be visible through power down 156 + * and can only be executed on processors like A15 and A7 that hit the cache 157 + * with the C bit clear in the SCTLR register. 158 + */ 159 + static void exynos_power_down(void) 160 + { 161 + unsigned int mpidr, cpu, cluster; 162 + bool last_man = false, skip_wfi = false; 163 + unsigned int cpunr; 164 + 165 + mpidr = read_cpuid_mpidr(); 166 + cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0); 167 + cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1); 168 + cpunr = cpu + (cluster * EXYNOS5420_CPUS_PER_CLUSTER); 169 + 170 + pr_debug("%s: cpu %u cluster %u\n", __func__, cpu, cluster); 171 + BUG_ON(cpu >= EXYNOS5420_CPUS_PER_CLUSTER || 172 + cluster >= EXYNOS5420_NR_CLUSTERS); 173 + 174 + __mcpm_cpu_going_down(cpu, cluster); 175 + 176 + arch_spin_lock(&exynos_mcpm_lock); 177 + BUG_ON(__mcpm_cluster_state(cluster) != CLUSTER_UP); 178 + cpu_use_count[cpu][cluster]--; 179 + if (cpu_use_count[cpu][cluster] == 0) { 180 + exynos_cpu_power_down(cpunr); 181 + 182 + if (exynos_cluster_unused(cluster)) 183 + /* TODO: Turn off the cluster here to save power. */ 184 + last_man = true; 185 + } else if (cpu_use_count[cpu][cluster] == 1) { 186 + /* 187 + * A power_up request went ahead of us. 188 + * Even if we do not want to shut this CPU down, 189 + * the caller expects a certain state as if the WFI 190 + * was aborted. So let's continue with cache cleaning. 191 + */ 192 + skip_wfi = true; 193 + } else { 194 + BUG(); 195 + } 196 + 197 + if (last_man && __mcpm_outbound_enter_critical(cpu, cluster)) { 198 + arch_spin_unlock(&exynos_mcpm_lock); 199 + 200 + if (read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A15) { 201 + /* 202 + * On the Cortex-A15 we need to disable 203 + * L2 prefetching before flushing the cache. 204 + */ 205 + asm volatile( 206 + "mcr p15, 1, %0, c15, c0, 3\n\t" 207 + "isb\n\t" 208 + "dsb" 209 + : : "r" (0x400)); 210 + } 211 + 212 + /* Flush all cache levels for this cluster. */ 213 + exynos_v7_exit_coherency_flush(all); 214 + 215 + /* 216 + * Disable cluster-level coherency by masking 217 + * incoming snoops and DVM messages: 218 + */ 219 + cci_disable_port_by_cpu(mpidr); 220 + 221 + __mcpm_outbound_leave_critical(cluster, CLUSTER_DOWN); 222 + } else { 223 + arch_spin_unlock(&exynos_mcpm_lock); 224 + 225 + /* Disable and flush the local CPU cache. */ 226 + exynos_v7_exit_coherency_flush(louis); 227 + } 228 + 229 + __mcpm_cpu_down(cpu, cluster); 230 + 231 + /* Now we are prepared for power-down, do it: */ 232 + if (!skip_wfi) 233 + wfi(); 234 + 235 + /* Not dead at this point? Let our caller cope. */ 236 + } 237 + 238 + static int exynos_power_down_finish(unsigned int cpu, unsigned int cluster) 239 + { 240 + unsigned int tries = 100; 241 + unsigned int cpunr = cpu + (cluster * EXYNOS5420_CPUS_PER_CLUSTER); 242 + 243 + pr_debug("%s: cpu %u cluster %u\n", __func__, cpu, cluster); 244 + BUG_ON(cpu >= EXYNOS5420_CPUS_PER_CLUSTER || 245 + cluster >= EXYNOS5420_NR_CLUSTERS); 246 + 247 + /* Wait for the core state to be OFF */ 248 + while (tries--) { 249 + if (ACCESS_ONCE(cpu_use_count[cpu][cluster]) == 0) { 250 + if ((exynos_cpu_power_state(cpunr) == 0)) 251 + return 0; /* success: the CPU is halted */ 252 + } 253 + 254 + /* Otherwise, wait and retry: */ 255 + msleep(1); 256 + } 257 + 258 + return -ETIMEDOUT; /* timeout */ 259 + } 260 + 261 + static const struct mcpm_platform_ops exynos_power_ops = { 262 + .power_up = exynos_power_up, 263 + .power_down = exynos_power_down, 264 + .power_down_finish = exynos_power_down_finish, 265 + }; 266 + 267 + static void __init exynos_mcpm_usage_count_init(void) 268 + { 269 + unsigned int mpidr, cpu, cluster; 270 + 271 + mpidr = read_cpuid_mpidr(); 272 + cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0); 273 + cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1); 274 + 275 + pr_debug("%s: cpu %u cluster %u\n", __func__, cpu, cluster); 276 + BUG_ON(cpu >= EXYNOS5420_CPUS_PER_CLUSTER || 277 + cluster >= EXYNOS5420_NR_CLUSTERS); 278 + 279 + cpu_use_count[cpu][cluster] = 1; 280 + } 281 + 282 + /* 283 + * Enable cluster-level coherency, in preparation for turning on the MMU. 284 + */ 285 + static void __naked exynos_pm_power_up_setup(unsigned int affinity_level) 286 + { 287 + asm volatile ("\n" 288 + "cmp r0, #1\n" 289 + "bxne lr\n" 290 + "b cci_enable_port_for_self"); 291 + } 292 + 293 + static int __init exynos_mcpm_init(void) 294 + { 295 + struct device_node *node; 296 + void __iomem *ns_sram_base_addr; 297 + int ret; 298 + 299 + node = of_find_compatible_node(NULL, NULL, "samsung,exynos5420"); 300 + if (!node) 301 + return -ENODEV; 302 + of_node_put(node); 303 + 304 + if (!cci_probed()) 305 + return -ENODEV; 306 + 307 + node = of_find_compatible_node(NULL, NULL, 308 + "samsung,exynos4210-sysram-ns"); 309 + if (!node) 310 + return -ENODEV; 311 + 312 + ns_sram_base_addr = of_iomap(node, 0); 313 + of_node_put(node); 314 + if (!ns_sram_base_addr) { 315 + pr_err("failed to map non-secure iRAM base address\n"); 316 + return -ENOMEM; 317 + } 318 + 319 + /* 320 + * To increase the stability of KFC reset we need to program 321 + * the PMU SPARE3 register 322 + */ 323 + __raw_writel(EXYNOS5420_SWRESET_KFC_SEL, S5P_PMU_SPARE3); 324 + 325 + exynos_mcpm_usage_count_init(); 326 + 327 + ret = mcpm_platform_register(&exynos_power_ops); 328 + if (!ret) 329 + ret = mcpm_sync_init(exynos_pm_power_up_setup); 330 + if (ret) { 331 + iounmap(ns_sram_base_addr); 332 + return ret; 333 + } 334 + 335 + mcpm_smp_set_ops(); 336 + 337 + pr_info("Exynos MCPM support installed\n"); 338 + 339 + /* 340 + * Future entries into the kernel can now go 341 + * through the cluster entry vectors. 342 + */ 343 + __raw_writel(virt_to_phys(mcpm_entry_point), 344 + ns_sram_base_addr + MCPM_BOOT_ADDR_OFFSET); 345 + 346 + iounmap(ns_sram_base_addr); 347 + 348 + return ret; 349 + } 350 + 351 + early_initcall(exynos_mcpm_init);
+55 -10
arch/arm/mach-exynos/platsmp.c
··· 20 20 #include <linux/jiffies.h> 21 21 #include <linux/smp.h> 22 22 #include <linux/io.h> 23 + #include <linux/of_address.h> 23 24 24 25 #include <asm/cacheflush.h> 25 26 #include <asm/smp_plat.h> ··· 34 33 35 34 extern void exynos4_secondary_startup(void); 36 35 36 + void __iomem *sysram_base_addr; 37 + void __iomem *sysram_ns_base_addr; 38 + 39 + static void __init exynos_smp_prepare_sysram(void) 40 + { 41 + struct device_node *node; 42 + 43 + for_each_compatible_node(node, NULL, "samsung,exynos4210-sysram") { 44 + if (!of_device_is_available(node)) 45 + continue; 46 + sysram_base_addr = of_iomap(node, 0); 47 + break; 48 + } 49 + 50 + for_each_compatible_node(node, NULL, "samsung,exynos4210-sysram-ns") { 51 + if (!of_device_is_available(node)) 52 + continue; 53 + sysram_ns_base_addr = of_iomap(node, 0); 54 + break; 55 + } 56 + } 57 + 37 58 static inline void __iomem *cpu_boot_reg_base(void) 38 59 { 39 60 if (soc_is_exynos4210() && samsung_rev() == EXYNOS4210_REV_1_1) 40 61 return S5P_INFORM5; 41 - return S5P_VA_SYSRAM; 62 + return sysram_base_addr; 42 63 } 43 64 44 65 static inline void __iomem *cpu_boot_reg(int cpu) ··· 68 45 void __iomem *boot_reg; 69 46 70 47 boot_reg = cpu_boot_reg_base(); 48 + if (!boot_reg) 49 + return ERR_PTR(-ENODEV); 71 50 if (soc_is_exynos4412()) 72 51 boot_reg += 4*cpu; 73 52 else if (soc_is_exynos5420()) ··· 115 90 { 116 91 unsigned long timeout; 117 92 unsigned long phys_cpu = cpu_logical_map(cpu); 93 + int ret = -ENOSYS; 118 94 119 95 /* 120 96 * Set synchronisation state between this boot processor ··· 133 107 */ 134 108 write_pen_release(phys_cpu); 135 109 136 - if (!(__raw_readl(S5P_ARM_CORE1_STATUS) & S5P_CORE_LOCAL_PWR_EN)) { 137 - __raw_writel(S5P_CORE_LOCAL_PWR_EN, 138 - S5P_ARM_CORE1_CONFIGURATION); 139 - 110 + if (!exynos_cpu_power_state(cpu)) { 111 + exynos_cpu_power_up(cpu); 140 112 timeout = 10; 141 113 142 114 /* wait max 10 ms until cpu1 is on */ 143 - while ((__raw_readl(S5P_ARM_CORE1_STATUS) 144 - & S5P_CORE_LOCAL_PWR_EN) != S5P_CORE_LOCAL_PWR_EN) { 115 + while (exynos_cpu_power_state(cpu) != S5P_CORE_LOCAL_PWR_EN) { 145 116 if (timeout-- == 0) 146 117 break; 147 118 ··· 169 146 * Try to set boot address using firmware first 170 147 * and fall back to boot register if it fails. 171 148 */ 172 - if (call_firmware_op(set_cpu_boot_addr, phys_cpu, boot_addr)) 149 + ret = call_firmware_op(set_cpu_boot_addr, phys_cpu, boot_addr); 150 + if (ret && ret != -ENOSYS) 151 + goto fail; 152 + if (ret == -ENOSYS) { 153 + void __iomem *boot_reg = cpu_boot_reg(phys_cpu); 154 + 155 + if (IS_ERR(boot_reg)) { 156 + ret = PTR_ERR(boot_reg); 157 + goto fail; 158 + } 173 159 __raw_writel(boot_addr, cpu_boot_reg(phys_cpu)); 160 + } 174 161 175 162 call_firmware_op(cpu_boot, phys_cpu); 176 163 ··· 196 163 * now the secondary core is starting up let it run its 197 164 * calibrations, then wait for it to finish 198 165 */ 166 + fail: 199 167 spin_unlock(&boot_lock); 200 168 201 - return pen_release != -1 ? -ENOSYS : 0; 169 + return pen_release != -1 ? ret : 0; 202 170 } 203 171 204 172 /* ··· 239 205 if (read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A9) 240 206 scu_enable(scu_base_addr()); 241 207 208 + exynos_smp_prepare_sysram(); 209 + 242 210 /* 243 211 * Write the address of secondary startup into the 244 212 * system-wide flags register. The boot monitor waits ··· 253 217 for (i = 1; i < max_cpus; ++i) { 254 218 unsigned long phys_cpu; 255 219 unsigned long boot_addr; 220 + int ret; 256 221 257 222 phys_cpu = cpu_logical_map(i); 258 223 boot_addr = virt_to_phys(exynos4_secondary_startup); 259 224 260 - if (call_firmware_op(set_cpu_boot_addr, phys_cpu, boot_addr)) 225 + ret = call_firmware_op(set_cpu_boot_addr, phys_cpu, boot_addr); 226 + if (ret && ret != -ENOSYS) 227 + break; 228 + if (ret == -ENOSYS) { 229 + void __iomem *boot_reg = cpu_boot_reg(phys_cpu); 230 + 231 + if (IS_ERR(boot_reg)) 232 + break; 261 233 __raw_writel(boot_addr, cpu_boot_reg(phys_cpu)); 234 + } 262 235 } 263 236 } 264 237
+188 -28
arch/arm/mach-exynos/pm.c
··· 16 16 #include <linux/init.h> 17 17 #include <linux/suspend.h> 18 18 #include <linux/syscore_ops.h> 19 + #include <linux/cpu_pm.h> 19 20 #include <linux/io.h> 20 21 #include <linux/irqchip/arm-gic.h> 21 22 #include <linux/err.h> ··· 101 100 return -ENOENT; 102 101 } 103 102 103 + /** 104 + * exynos_core_power_down : power down the specified cpu 105 + * @cpu : the cpu to power down 106 + * 107 + * Power down the specified cpu. The sequence must be finished by a 108 + * call to cpu_do_idle() 109 + * 110 + */ 111 + void exynos_cpu_power_down(int cpu) 112 + { 113 + __raw_writel(0, EXYNOS_ARM_CORE_CONFIGURATION(cpu)); 114 + } 115 + 116 + /** 117 + * exynos_cpu_power_up : power up the specified cpu 118 + * @cpu : the cpu to power up 119 + * 120 + * Power up the specified cpu 121 + */ 122 + void exynos_cpu_power_up(int cpu) 123 + { 124 + __raw_writel(S5P_CORE_LOCAL_PWR_EN, 125 + EXYNOS_ARM_CORE_CONFIGURATION(cpu)); 126 + } 127 + 128 + /** 129 + * exynos_cpu_power_state : returns the power state of the cpu 130 + * @cpu : the cpu to retrieve the power state from 131 + * 132 + */ 133 + int exynos_cpu_power_state(int cpu) 134 + { 135 + return (__raw_readl(EXYNOS_ARM_CORE_STATUS(cpu)) & 136 + S5P_CORE_LOCAL_PWR_EN); 137 + } 138 + 139 + /** 140 + * exynos_cluster_power_down : power down the specified cluster 141 + * @cluster : the cluster to power down 142 + */ 143 + void exynos_cluster_power_down(int cluster) 144 + { 145 + __raw_writel(0, EXYNOS_COMMON_CONFIGURATION(cluster)); 146 + } 147 + 148 + /** 149 + * exynos_cluster_power_up : power up the specified cluster 150 + * @cluster : the cluster to power up 151 + */ 152 + void exynos_cluster_power_up(int cluster) 153 + { 154 + __raw_writel(S5P_CORE_LOCAL_PWR_EN, 155 + EXYNOS_COMMON_CONFIGURATION(cluster)); 156 + } 157 + 158 + /** 159 + * exynos_cluster_power_state : returns the power state of the cluster 160 + * @cluster : the cluster to retrieve the power state from 161 + * 162 + */ 163 + int exynos_cluster_power_state(int cluster) 164 + { 165 + return (__raw_readl(EXYNOS_COMMON_STATUS(cluster)) & 166 + S5P_CORE_LOCAL_PWR_EN); 167 + } 168 + 169 + #define EXYNOS_BOOT_VECTOR_ADDR (samsung_rev() == EXYNOS4210_REV_1_1 ? \ 170 + S5P_INFORM7 : (samsung_rev() == EXYNOS4210_REV_1_0 ? \ 171 + (sysram_base_addr + 0x24) : S5P_INFORM0)) 172 + #define EXYNOS_BOOT_VECTOR_FLAG (samsung_rev() == EXYNOS4210_REV_1_1 ? \ 173 + S5P_INFORM6 : (samsung_rev() == EXYNOS4210_REV_1_0 ? \ 174 + (sysram_base_addr + 0x20) : S5P_INFORM1)) 175 + 176 + #define S5P_CHECK_AFTR 0xFCBA0D10 177 + #define S5P_CHECK_SLEEP 0x00000BAD 178 + 179 + /* Ext-GIC nIRQ/nFIQ is the only wakeup source in AFTR */ 180 + static void exynos_set_wakeupmask(long mask) 181 + { 182 + __raw_writel(mask, S5P_WAKEUP_MASK); 183 + } 184 + 185 + static void exynos_cpu_set_boot_vector(long flags) 186 + { 187 + __raw_writel(virt_to_phys(exynos_cpu_resume), EXYNOS_BOOT_VECTOR_ADDR); 188 + __raw_writel(flags, EXYNOS_BOOT_VECTOR_FLAG); 189 + } 190 + 191 + void exynos_enter_aftr(void) 192 + { 193 + exynos_set_wakeupmask(0x0000ff3e); 194 + exynos_cpu_set_boot_vector(S5P_CHECK_AFTR); 195 + /* Set value of power down register for aftr mode */ 196 + exynos_sys_powerdown_conf(SYS_AFTR); 197 + } 198 + 104 199 /* For Cortex-A9 Diagnostic and Power control register */ 105 200 static unsigned int save_arm_register[2]; 201 + 202 + static void exynos_cpu_save_register(void) 203 + { 204 + unsigned long tmp; 205 + 206 + /* Save Power control register */ 207 + asm ("mrc p15, 0, %0, c15, c0, 0" 208 + : "=r" (tmp) : : "cc"); 209 + 210 + save_arm_register[0] = tmp; 211 + 212 + /* Save Diagnostic register */ 213 + asm ("mrc p15, 0, %0, c15, c0, 1" 214 + : "=r" (tmp) : : "cc"); 215 + 216 + save_arm_register[1] = tmp; 217 + } 218 + 219 + static void exynos_cpu_restore_register(void) 220 + { 221 + unsigned long tmp; 222 + 223 + /* Restore Power control register */ 224 + tmp = save_arm_register[0]; 225 + 226 + asm volatile ("mcr p15, 0, %0, c15, c0, 0" 227 + : : "r" (tmp) 228 + : "cc"); 229 + 230 + /* Restore Diagnostic register */ 231 + tmp = save_arm_register[1]; 232 + 233 + asm volatile ("mcr p15, 0, %0, c15, c0, 1" 234 + : : "r" (tmp) 235 + : "cc"); 236 + } 106 237 107 238 static int exynos_cpu_suspend(unsigned long arg) 108 239 { ··· 280 147 __raw_writel(virt_to_phys(exynos_cpu_resume), S5P_INFORM0); 281 148 } 282 149 283 - static int exynos_pm_suspend(void) 150 + static void exynos_pm_central_suspend(void) 284 151 { 285 152 unsigned long tmp; 286 153 287 154 /* Setting Central Sequence Register for power down mode */ 288 - 289 155 tmp = __raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION); 290 156 tmp &= ~S5P_CENTRAL_LOWPWR_CFG; 291 157 __raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION); 158 + } 159 + 160 + static int exynos_pm_suspend(void) 161 + { 162 + unsigned long tmp; 163 + 164 + exynos_pm_central_suspend(); 292 165 293 166 /* Setting SEQ_OPTION register */ 294 167 295 168 tmp = (S5P_USE_STANDBY_WFI0 | S5P_USE_STANDBY_WFE0); 296 169 __raw_writel(tmp, S5P_CENTRAL_SEQ_OPTION); 297 170 298 - if (!soc_is_exynos5250()) { 299 - /* Save Power control register */ 300 - asm ("mrc p15, 0, %0, c15, c0, 0" 301 - : "=r" (tmp) : : "cc"); 302 - save_arm_register[0] = tmp; 303 - 304 - /* Save Diagnostic register */ 305 - asm ("mrc p15, 0, %0, c15, c0, 1" 306 - : "=r" (tmp) : : "cc"); 307 - save_arm_register[1] = tmp; 308 - } 171 + if (!soc_is_exynos5250()) 172 + exynos_cpu_save_register(); 309 173 310 174 return 0; 311 175 } 312 176 313 - static void exynos_pm_resume(void) 177 + static int exynos_pm_central_resume(void) 314 178 { 315 179 unsigned long tmp; 316 180 ··· 324 194 /* clear the wakeup state register */ 325 195 __raw_writel(0x0, S5P_WAKEUP_STAT); 326 196 /* No need to perform below restore code */ 327 - goto early_wakeup; 197 + return -1; 328 198 } 329 - if (!soc_is_exynos5250()) { 330 - /* Restore Power control register */ 331 - tmp = save_arm_register[0]; 332 - asm volatile ("mcr p15, 0, %0, c15, c0, 0" 333 - : : "r" (tmp) 334 - : "cc"); 335 199 336 - /* Restore Diagnostic register */ 337 - tmp = save_arm_register[1]; 338 - asm volatile ("mcr p15, 0, %0, c15, c0, 1" 339 - : : "r" (tmp) 340 - : "cc"); 341 - } 200 + return 0; 201 + } 202 + 203 + static void exynos_pm_resume(void) 204 + { 205 + if (exynos_pm_central_resume()) 206 + goto early_wakeup; 207 + 208 + if (!soc_is_exynos5250()) 209 + exynos_cpu_restore_register(); 342 210 343 211 /* For release retention */ 344 212 ··· 354 226 355 227 s3c_pm_do_restore_core(exynos_core_save, ARRAY_SIZE(exynos_core_save)); 356 228 357 - if (IS_ENABLED(CONFIG_SMP) && !soc_is_exynos5250()) 229 + if (!soc_is_exynos5250()) 358 230 scu_enable(S5P_VA_SCU); 359 231 360 232 early_wakeup: ··· 432 304 .valid = suspend_valid_only_mem, 433 305 }; 434 306 307 + static int exynos_cpu_pm_notifier(struct notifier_block *self, 308 + unsigned long cmd, void *v) 309 + { 310 + int cpu = smp_processor_id(); 311 + 312 + switch (cmd) { 313 + case CPU_PM_ENTER: 314 + if (cpu == 0) { 315 + exynos_pm_central_suspend(); 316 + exynos_cpu_save_register(); 317 + } 318 + break; 319 + 320 + case CPU_PM_EXIT: 321 + if (cpu == 0) { 322 + if (!soc_is_exynos5250()) 323 + scu_enable(S5P_VA_SCU); 324 + exynos_cpu_restore_register(); 325 + exynos_pm_central_resume(); 326 + } 327 + break; 328 + } 329 + 330 + return NOTIFY_OK; 331 + } 332 + 333 + static struct notifier_block exynos_cpu_pm_notifier_block = { 334 + .notifier_call = exynos_cpu_pm_notifier, 335 + }; 336 + 435 337 void __init exynos_pm_init(void) 436 338 { 437 339 u32 tmp; 340 + 341 + cpu_pm_register_notifier(&exynos_cpu_pm_notifier_block); 438 342 439 343 /* Platform-specific GIC callback */ 440 344 gic_arch_extn.irq_set_wake = exynos_irq_set_wake;
+14 -4
arch/arm/mach-exynos/regs-pmu.h
··· 38 38 #define S5P_INFORM5 S5P_PMUREG(0x0814) 39 39 #define S5P_INFORM6 S5P_PMUREG(0x0818) 40 40 #define S5P_INFORM7 S5P_PMUREG(0x081C) 41 + #define S5P_PMU_SPARE3 S5P_PMUREG(0x090C) 41 42 42 43 #define S5P_ARM_CORE0_LOWPWR S5P_PMUREG(0x1000) 43 44 #define S5P_DIS_IRQ_CORE0 S5P_PMUREG(0x1004) ··· 106 105 #define S5P_GPS_LOWPWR S5P_PMUREG(0x139C) 107 106 #define S5P_GPS_ALIVE_LOWPWR S5P_PMUREG(0x13A0) 108 107 109 - #define S5P_ARM_CORE1_CONFIGURATION S5P_PMUREG(0x2080) 110 - #define S5P_ARM_CORE1_STATUS S5P_PMUREG(0x2084) 108 + #define EXYNOS_ARM_CORE0_CONFIGURATION S5P_PMUREG(0x2000) 109 + #define EXYNOS_ARM_CORE_CONFIGURATION(_nr) \ 110 + (EXYNOS_ARM_CORE0_CONFIGURATION + (0x80 * (_nr))) 111 + #define EXYNOS_ARM_CORE_STATUS(_nr) \ 112 + (EXYNOS_ARM_CORE_CONFIGURATION(_nr) + 0x4) 113 + 114 + #define EXYNOS_ARM_COMMON_CONFIGURATION S5P_PMUREG(0x2500) 115 + #define EXYNOS_COMMON_CONFIGURATION(_nr) \ 116 + (EXYNOS_ARM_COMMON_CONFIGURATION + (0x80 * (_nr))) 117 + #define EXYNOS_COMMON_STATUS(_nr) \ 118 + (EXYNOS_COMMON_CONFIGURATION(_nr) + 0x4) 111 119 112 120 #define S5P_PAD_RET_MAUDIO_OPTION S5P_PMUREG(0x3028) 113 121 #define S5P_PAD_RET_GPIO_OPTION S5P_PMUREG(0x3108) ··· 128 118 129 119 #define S5P_CORE_LOCAL_PWR_EN 0x3 130 120 #define S5P_INT_LOCAL_PWR_EN 0x7 131 - 132 - #define S5P_CHECK_SLEEP 0x00000BAD 133 121 134 122 /* Only for EXYNOS4210 */ 135 123 #define S5P_CMU_CLKSTOP_LCD1_LOWPWR S5P_PMUREG(0x1154) ··· 320 312 #define EXYNOS5_OPTION_USE_STANDBYWFI (1 << 16) 321 313 322 314 #define EXYNOS5_OPTION_USE_RETENTION (1 << 4) 315 + 316 + #define EXYNOS5420_SWRESET_KFC_SEL 0x3 323 317 324 318 #endif /* __ASM_ARCH_REGS_PMU_H */
+13 -29
arch/arm/mach-s3c24xx/Kconfig
··· 18 18 help 19 19 Base platform code for any Samsung S3C24XX device 20 20 21 + 22 + 21 23 menu "SAMSUNG S3C24XX SoCs Support" 22 24 23 25 comment "S3C24XX SoCs" ··· 29 27 default y 30 28 select CPU_ARM920T 31 29 select CPU_LLSERIAL_S3C2410 32 - select S3C2410_CLOCK 30 + select S3C2410_COMMON_CLK 33 31 select S3C2410_DMA if S3C24XX_DMA 34 32 select ARM_S3C2410_CPUFREQ if ARM_S3C24XX_CPUFREQ 35 33 select S3C2410_PM if PM ··· 42 40 bool "SAMSUNG S3C2412" 43 41 select CPU_ARM926T 44 42 select CPU_LLSERIAL_S3C2440 43 + select S3C2412_COMMON_CLK 45 44 select S3C2412_DMA if S3C24XX_DMA 46 45 select S3C2412_PM if PM 47 46 help ··· 53 50 select CPU_ARM926T 54 51 select CPU_LLSERIAL_S3C2440 55 52 select S3C2416_PM if PM 56 - select S3C2443_COMMON 53 + select S3C2443_COMMON_CLK 57 54 select S3C2443_DMA if S3C24XX_DMA 58 - select SAMSUNG_CLKSRC 59 55 help 60 56 Support for the S3C2416 SoC from the S3C24XX line 61 57 ··· 62 60 bool "SAMSUNG S3C2440" 63 61 select CPU_ARM920T 64 62 select CPU_LLSERIAL_S3C2440 65 - select S3C2410_CLOCK 63 + select S3C2410_COMMON_CLK 66 64 select S3C2410_PM if PM 67 65 select S3C2440_DMA if S3C24XX_DMA 68 66 help ··· 72 70 bool "SAMSUNG S3C2442" 73 71 select CPU_ARM920T 74 72 select CPU_LLSERIAL_S3C2440 75 - select S3C2410_CLOCK 73 + select S3C2410_COMMON_CLK 76 74 select S3C2410_DMA if S3C24XX_DMA 77 75 select S3C2410_PM if PM 78 76 help ··· 87 85 bool "SAMSUNG S3C2443" 88 86 select CPU_ARM920T 89 87 select CPU_LLSERIAL_S3C2440 90 - select S3C2443_COMMON 88 + select S3C2443_COMMON_CLK 91 89 select S3C2443_DMA if S3C24XX_DMA 92 - select SAMSUNG_CLKSRC 93 90 help 94 91 Support for the S3C2443 SoC from the S3C24XX line 95 92 96 93 # common code 97 - 98 - config S3C2410_CLOCK 99 - bool 100 - help 101 - Clock code for the S3C2410, and similar processors which 102 - is currently includes the S3C2410, S3C2440, S3C2442. 103 - 104 - config S3C24XX_DCLK 105 - bool 106 - help 107 - Clock code for supporting DCLK/CLKOUT on S3C24XX architectures 108 94 109 95 config S3C24XX_SMDK 110 96 bool ··· 248 258 bool "Simtec Electronics BAST (EB2410ITX)" 249 259 select ISA 250 260 select MACH_BAST_IDE 261 + select S3C2410_COMMON_DCLK 251 262 select S3C2410_IOTIMING if ARM_S3C2410_CPUFREQ 252 - select S3C24XX_DCLK 253 263 select S3C24XX_SIMTEC_NOR 254 264 select S3C24XX_SIMTEC_PM if PM 255 265 select S3C24XX_SIMTEC_USB ··· 330 340 config MACH_VR1000 331 341 bool "Thorcom VR1000" 332 342 select MACH_BAST_IDE 333 - select S3C24XX_DCLK 343 + select S3C2410_COMMON_DCLK 334 344 select S3C24XX_SIMTEC_NOR 335 345 select S3C24XX_SIMTEC_PM if PM 336 346 select S3C24XX_SIMTEC_USB ··· 509 519 config MACH_ANUBIS 510 520 bool "Simtec Electronics ANUBIS" 511 521 select HAVE_PATA_PLATFORM 522 + select S3C2410_COMMON_DCLK 512 523 select S3C2440_XTAL_12000000 513 - select S3C24XX_DCLK 514 524 select S3C24XX_SIMTEC_PM if PM 515 525 select S3C_DEV_USB_HOST 516 526 help ··· 548 558 549 559 config MACH_OSIRIS 550 560 bool "Simtec IM2440D20 (OSIRIS) module" 561 + select S3C2410_COMMON_DCLK 551 562 select S3C2410_IOTIMING if ARM_S3C2440_CPUFREQ 552 563 select S3C2440_XTAL_12000000 553 - select S3C24XX_DCLK 554 564 select S3C24XX_SIMTEC_PM if PM 555 565 select S3C_DEV_NAND 556 566 select S3C_DEV_USB_HOST ··· 619 629 bool "HP iPAQ rx1950" 620 630 select I2C 621 631 select PM_H1940 if PM 632 + select S3C2410_COMMON_DCLK 622 633 select S3C2410_IOTIMING if ARM_S3C2440_CPUFREQ 623 634 select S3C2440_XTAL_16934400 624 - select S3C24XX_DCLK 625 635 select S3C24XX_PWM 626 636 select S3C_DEV_NAND 627 637 help ··· 630 640 endif # CPU_S3C2442 631 641 632 642 if CPU_S3C2443 || CPU_S3C2416 633 - 634 - config S3C2443_COMMON 635 - bool 636 - help 637 - Common code for the S3C2443 and similar processors, which includes 638 - the S3C2416 and S3C2450. 639 643 640 644 config S3C2443_DMA 641 645 bool
+5 -8
arch/arm/mach-s3c24xx/Makefile
··· 21 21 obj-$(CONFIG_S3C2410_PLL) += pll-s3c2410.o 22 22 obj-$(CONFIG_S3C2410_PM) += pm-s3c2410.o sleep-s3c2410.o 23 23 24 - obj-$(CONFIG_CPU_S3C2412) += s3c2412.o clock-s3c2412.o 24 + obj-$(CONFIG_CPU_S3C2412) += s3c2412.o 25 25 obj-$(CONFIG_S3C2412_DMA) += dma-s3c2412.o 26 26 obj-$(CONFIG_S3C2412_PM) += pm-s3c2412.o 27 27 obj-$(CONFIG_S3C2412_PM_SLEEP) += sleep-s3c2412.o 28 28 29 - obj-$(CONFIG_CPU_S3C2416) += s3c2416.o clock-s3c2416.o 29 + obj-$(CONFIG_CPU_S3C2416) += s3c2416.o 30 30 obj-$(CONFIG_S3C2416_PM) += pm-s3c2416.o 31 31 32 - obj-$(CONFIG_CPU_S3C2440) += s3c2440.o clock-s3c2440.o 32 + obj-$(CONFIG_CPU_S3C2440) += s3c2440.o 33 33 obj-$(CONFIG_CPU_S3C2442) += s3c2442.o 34 - obj-$(CONFIG_CPU_S3C244X) += s3c244x.o clock-s3c244x.o 34 + obj-$(CONFIG_CPU_S3C244X) += s3c244x.o 35 35 obj-$(CONFIG_S3C2440_DMA) += dma-s3c2440.o 36 36 obj-$(CONFIG_S3C2440_PLL_12000000) += pll-s3c2440-12000000.o 37 37 obj-$(CONFIG_S3C2440_PLL_16934400) += pll-s3c2440-16934400.o 38 38 39 - obj-$(CONFIG_CPU_S3C2443) += s3c2443.o clock-s3c2443.o 39 + obj-$(CONFIG_CPU_S3C2443) += s3c2443.o 40 40 41 41 # PM 42 42 ··· 44 44 45 45 # common code 46 46 47 - obj-$(CONFIG_S3C24XX_DCLK) += clock-dclk.o 48 47 obj-$(CONFIG_S3C24XX_DMA) += dma.o 49 48 50 - obj-$(CONFIG_S3C2410_CLOCK) += clock-s3c2410.o 51 49 obj-$(CONFIG_S3C2410_CPUFREQ_UTILS) += cpufreq-utils.o 52 50 53 51 obj-$(CONFIG_S3C2410_IOTIMING) += iotiming-s3c2410.o 54 52 obj-$(CONFIG_S3C2412_IOTIMING) += iotiming-s3c2412.o 55 53 56 - obj-$(CONFIG_S3C2443_COMMON) += common-s3c2443.o 57 54 obj-$(CONFIG_S3C2443_DMA) += dma-s3c2443.o 58 55 59 56 #
-195
arch/arm/mach-s3c24xx/clock-dclk.c
··· 1 - /* 2 - * Copyright (c) 2004-2008 Simtec Electronics 3 - * Ben Dooks <ben@simtec.co.uk> 4 - * http://armlinux.simtec.co.uk/ 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 - * S3C24XX - definitions for DCLK and CLKOUT registers 11 - */ 12 - 13 - #include <linux/kernel.h> 14 - #include <linux/errno.h> 15 - #include <linux/clk.h> 16 - #include <linux/io.h> 17 - 18 - #include <mach/regs-clock.h> 19 - #include <mach/regs-gpio.h> 20 - 21 - #include <plat/clock.h> 22 - #include <plat/cpu.h> 23 - 24 - /* clocks that could be registered by external code */ 25 - 26 - static int s3c24xx_dclk_enable(struct clk *clk, int enable) 27 - { 28 - unsigned long dclkcon = __raw_readl(S3C24XX_DCLKCON); 29 - 30 - if (enable) 31 - dclkcon |= clk->ctrlbit; 32 - else 33 - dclkcon &= ~clk->ctrlbit; 34 - 35 - __raw_writel(dclkcon, S3C24XX_DCLKCON); 36 - 37 - return 0; 38 - } 39 - 40 - static int s3c24xx_dclk_setparent(struct clk *clk, struct clk *parent) 41 - { 42 - unsigned long dclkcon; 43 - unsigned int uclk; 44 - 45 - if (parent == &clk_upll) 46 - uclk = 1; 47 - else if (parent == &clk_p) 48 - uclk = 0; 49 - else 50 - return -EINVAL; 51 - 52 - clk->parent = parent; 53 - 54 - dclkcon = __raw_readl(S3C24XX_DCLKCON); 55 - 56 - if (clk->ctrlbit == S3C2410_DCLKCON_DCLK0EN) { 57 - if (uclk) 58 - dclkcon |= S3C2410_DCLKCON_DCLK0_UCLK; 59 - else 60 - dclkcon &= ~S3C2410_DCLKCON_DCLK0_UCLK; 61 - } else { 62 - if (uclk) 63 - dclkcon |= S3C2410_DCLKCON_DCLK1_UCLK; 64 - else 65 - dclkcon &= ~S3C2410_DCLKCON_DCLK1_UCLK; 66 - } 67 - 68 - __raw_writel(dclkcon, S3C24XX_DCLKCON); 69 - 70 - return 0; 71 - } 72 - static unsigned long s3c24xx_calc_div(struct clk *clk, unsigned long rate) 73 - { 74 - unsigned long div; 75 - 76 - if ((rate == 0) || !clk->parent) 77 - return 0; 78 - 79 - div = clk_get_rate(clk->parent) / rate; 80 - if (div < 2) 81 - div = 2; 82 - else if (div > 16) 83 - div = 16; 84 - 85 - return div; 86 - } 87 - 88 - static unsigned long s3c24xx_round_dclk_rate(struct clk *clk, 89 - unsigned long rate) 90 - { 91 - unsigned long div = s3c24xx_calc_div(clk, rate); 92 - 93 - if (div == 0) 94 - return 0; 95 - 96 - return clk_get_rate(clk->parent) / div; 97 - } 98 - 99 - static int s3c24xx_set_dclk_rate(struct clk *clk, unsigned long rate) 100 - { 101 - unsigned long mask, data, div = s3c24xx_calc_div(clk, rate); 102 - 103 - if (div == 0) 104 - return -EINVAL; 105 - 106 - if (clk == &s3c24xx_dclk0) { 107 - mask = S3C2410_DCLKCON_DCLK0_DIV_MASK | 108 - S3C2410_DCLKCON_DCLK0_CMP_MASK; 109 - data = S3C2410_DCLKCON_DCLK0_DIV(div) | 110 - S3C2410_DCLKCON_DCLK0_CMP((div + 1) / 2); 111 - } else if (clk == &s3c24xx_dclk1) { 112 - mask = S3C2410_DCLKCON_DCLK1_DIV_MASK | 113 - S3C2410_DCLKCON_DCLK1_CMP_MASK; 114 - data = S3C2410_DCLKCON_DCLK1_DIV(div) | 115 - S3C2410_DCLKCON_DCLK1_CMP((div + 1) / 2); 116 - } else 117 - return -EINVAL; 118 - 119 - clk->rate = clk_get_rate(clk->parent) / div; 120 - __raw_writel(((__raw_readl(S3C24XX_DCLKCON) & ~mask) | data), 121 - S3C24XX_DCLKCON); 122 - return clk->rate; 123 - } 124 - static int s3c24xx_clkout_setparent(struct clk *clk, struct clk *parent) 125 - { 126 - unsigned long mask; 127 - unsigned long source; 128 - 129 - /* calculate the MISCCR setting for the clock */ 130 - 131 - if (parent == &clk_mpll) 132 - source = S3C2410_MISCCR_CLK0_MPLL; 133 - else if (parent == &clk_upll) 134 - source = S3C2410_MISCCR_CLK0_UPLL; 135 - else if (parent == &clk_f) 136 - source = S3C2410_MISCCR_CLK0_FCLK; 137 - else if (parent == &clk_h) 138 - source = S3C2410_MISCCR_CLK0_HCLK; 139 - else if (parent == &clk_p) 140 - source = S3C2410_MISCCR_CLK0_PCLK; 141 - else if (clk == &s3c24xx_clkout0 && parent == &s3c24xx_dclk0) 142 - source = S3C2410_MISCCR_CLK0_DCLK0; 143 - else if (clk == &s3c24xx_clkout1 && parent == &s3c24xx_dclk1) 144 - source = S3C2410_MISCCR_CLK0_DCLK0; 145 - else 146 - return -EINVAL; 147 - 148 - clk->parent = parent; 149 - 150 - if (clk == &s3c24xx_clkout0) 151 - mask = S3C2410_MISCCR_CLK0_MASK; 152 - else { 153 - source <<= 4; 154 - mask = S3C2410_MISCCR_CLK1_MASK; 155 - } 156 - 157 - s3c2410_modify_misccr(mask, source); 158 - return 0; 159 - } 160 - 161 - /* external clock definitions */ 162 - 163 - static struct clk_ops dclk_ops = { 164 - .set_parent = s3c24xx_dclk_setparent, 165 - .set_rate = s3c24xx_set_dclk_rate, 166 - .round_rate = s3c24xx_round_dclk_rate, 167 - }; 168 - 169 - struct clk s3c24xx_dclk0 = { 170 - .name = "dclk0", 171 - .ctrlbit = S3C2410_DCLKCON_DCLK0EN, 172 - .enable = s3c24xx_dclk_enable, 173 - .ops = &dclk_ops, 174 - }; 175 - 176 - struct clk s3c24xx_dclk1 = { 177 - .name = "dclk1", 178 - .ctrlbit = S3C2410_DCLKCON_DCLK1EN, 179 - .enable = s3c24xx_dclk_enable, 180 - .ops = &dclk_ops, 181 - }; 182 - 183 - static struct clk_ops clkout_ops = { 184 - .set_parent = s3c24xx_clkout_setparent, 185 - }; 186 - 187 - struct clk s3c24xx_clkout0 = { 188 - .name = "clkout0", 189 - .ops = &clkout_ops, 190 - }; 191 - 192 - struct clk s3c24xx_clkout1 = { 193 - .name = "clkout1", 194 - .ops = &clkout_ops, 195 - };
-284
arch/arm/mach-s3c24xx/clock-s3c2410.c
··· 1 - /* 2 - * Copyright (c) 2006 Simtec Electronics 3 - * Ben Dooks <ben@simtec.co.uk> 4 - * 5 - * S3C2410,S3C2440,S3C2442 Clock control support 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 as published by 9 - * the Free Software Foundation; either version 2 of the License, or 10 - * (at your option) any later version. 11 - * 12 - * This program is distributed in the hope that it will be useful, 13 - * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 - * GNU General Public License for more details. 16 - * 17 - * You should have received a copy of the GNU General Public License 18 - * along with this program; if not, write to the Free Software 19 - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 - */ 21 - 22 - #include <linux/init.h> 23 - #include <linux/module.h> 24 - #include <linux/kernel.h> 25 - #include <linux/list.h> 26 - #include <linux/errno.h> 27 - #include <linux/err.h> 28 - #include <linux/device.h> 29 - #include <linux/clk.h> 30 - #include <linux/mutex.h> 31 - #include <linux/delay.h> 32 - #include <linux/serial_core.h> 33 - #include <linux/serial_s3c.h> 34 - #include <linux/io.h> 35 - 36 - #include <asm/mach/map.h> 37 - 38 - #include <mach/hardware.h> 39 - #include <mach/regs-clock.h> 40 - #include <mach/regs-gpio.h> 41 - 42 - #include <plat/clock.h> 43 - #include <plat/cpu.h> 44 - 45 - int s3c2410_clkcon_enable(struct clk *clk, int enable) 46 - { 47 - unsigned int clocks = clk->ctrlbit; 48 - unsigned long clkcon; 49 - 50 - clkcon = __raw_readl(S3C2410_CLKCON); 51 - 52 - if (enable) 53 - clkcon |= clocks; 54 - else 55 - clkcon &= ~clocks; 56 - 57 - /* ensure none of the special function bits set */ 58 - clkcon &= ~(S3C2410_CLKCON_IDLE|S3C2410_CLKCON_POWER); 59 - 60 - __raw_writel(clkcon, S3C2410_CLKCON); 61 - 62 - return 0; 63 - } 64 - 65 - static int s3c2410_upll_enable(struct clk *clk, int enable) 66 - { 67 - unsigned long clkslow = __raw_readl(S3C2410_CLKSLOW); 68 - unsigned long orig = clkslow; 69 - 70 - if (enable) 71 - clkslow &= ~S3C2410_CLKSLOW_UCLK_OFF; 72 - else 73 - clkslow |= S3C2410_CLKSLOW_UCLK_OFF; 74 - 75 - __raw_writel(clkslow, S3C2410_CLKSLOW); 76 - 77 - /* if we started the UPLL, then allow to settle */ 78 - 79 - if (enable && (orig & S3C2410_CLKSLOW_UCLK_OFF)) 80 - udelay(200); 81 - 82 - return 0; 83 - } 84 - 85 - /* standard clock definitions */ 86 - 87 - static struct clk init_clocks_off[] = { 88 - { 89 - .name = "nand", 90 - .parent = &clk_h, 91 - .enable = s3c2410_clkcon_enable, 92 - .ctrlbit = S3C2410_CLKCON_NAND, 93 - }, { 94 - .name = "sdi", 95 - .parent = &clk_p, 96 - .enable = s3c2410_clkcon_enable, 97 - .ctrlbit = S3C2410_CLKCON_SDI, 98 - }, { 99 - .name = "adc", 100 - .parent = &clk_p, 101 - .enable = s3c2410_clkcon_enable, 102 - .ctrlbit = S3C2410_CLKCON_ADC, 103 - }, { 104 - .name = "i2c", 105 - .parent = &clk_p, 106 - .enable = s3c2410_clkcon_enable, 107 - .ctrlbit = S3C2410_CLKCON_IIC, 108 - }, { 109 - .name = "iis", 110 - .parent = &clk_p, 111 - .enable = s3c2410_clkcon_enable, 112 - .ctrlbit = S3C2410_CLKCON_IIS, 113 - }, { 114 - .name = "spi", 115 - .parent = &clk_p, 116 - .enable = s3c2410_clkcon_enable, 117 - .ctrlbit = S3C2410_CLKCON_SPI, 118 - } 119 - }; 120 - 121 - static struct clk clk_lcd = { 122 - .name = "lcd", 123 - .parent = &clk_h, 124 - .enable = s3c2410_clkcon_enable, 125 - .ctrlbit = S3C2410_CLKCON_LCDC, 126 - }; 127 - 128 - static struct clk clk_gpio = { 129 - .name = "gpio", 130 - .parent = &clk_p, 131 - .enable = s3c2410_clkcon_enable, 132 - .ctrlbit = S3C2410_CLKCON_GPIO, 133 - }; 134 - 135 - static struct clk clk_usb_host = { 136 - .name = "usb-host", 137 - .parent = &clk_h, 138 - .enable = s3c2410_clkcon_enable, 139 - .ctrlbit = S3C2410_CLKCON_USBH, 140 - }; 141 - 142 - static struct clk clk_usb_device = { 143 - .name = "usb-device", 144 - .parent = &clk_h, 145 - .enable = s3c2410_clkcon_enable, 146 - .ctrlbit = S3C2410_CLKCON_USBD, 147 - }; 148 - 149 - static struct clk clk_timers = { 150 - .name = "timers", 151 - .parent = &clk_p, 152 - .enable = s3c2410_clkcon_enable, 153 - .ctrlbit = S3C2410_CLKCON_PWMT, 154 - }; 155 - 156 - struct clk s3c24xx_clk_uart0 = { 157 - .name = "uart", 158 - .devname = "s3c2410-uart.0", 159 - .parent = &clk_p, 160 - .enable = s3c2410_clkcon_enable, 161 - .ctrlbit = S3C2410_CLKCON_UART0, 162 - }; 163 - 164 - struct clk s3c24xx_clk_uart1 = { 165 - .name = "uart", 166 - .devname = "s3c2410-uart.1", 167 - .parent = &clk_p, 168 - .enable = s3c2410_clkcon_enable, 169 - .ctrlbit = S3C2410_CLKCON_UART1, 170 - }; 171 - 172 - struct clk s3c24xx_clk_uart2 = { 173 - .name = "uart", 174 - .devname = "s3c2410-uart.2", 175 - .parent = &clk_p, 176 - .enable = s3c2410_clkcon_enable, 177 - .ctrlbit = S3C2410_CLKCON_UART2, 178 - }; 179 - 180 - static struct clk clk_rtc = { 181 - .name = "rtc", 182 - .parent = &clk_p, 183 - .enable = s3c2410_clkcon_enable, 184 - .ctrlbit = S3C2410_CLKCON_RTC, 185 - }; 186 - 187 - static struct clk clk_watchdog = { 188 - .name = "watchdog", 189 - .parent = &clk_p, 190 - .ctrlbit = 0, 191 - }; 192 - 193 - static struct clk clk_usb_bus_host = { 194 - .name = "usb-bus-host", 195 - .parent = &clk_usb_bus, 196 - }; 197 - 198 - static struct clk clk_usb_bus_gadget = { 199 - .name = "usb-bus-gadget", 200 - .parent = &clk_usb_bus, 201 - }; 202 - 203 - static struct clk *init_clocks[] = { 204 - &clk_lcd, 205 - &clk_gpio, 206 - &clk_usb_host, 207 - &clk_usb_device, 208 - &clk_timers, 209 - &s3c24xx_clk_uart0, 210 - &s3c24xx_clk_uart1, 211 - &s3c24xx_clk_uart2, 212 - &clk_rtc, 213 - &clk_watchdog, 214 - &clk_usb_bus_host, 215 - &clk_usb_bus_gadget, 216 - }; 217 - 218 - /* s3c2410_baseclk_add() 219 - * 220 - * Add all the clocks used by the s3c2410 or compatible CPUs 221 - * such as the S3C2440 and S3C2442. 222 - * 223 - * We cannot use a system device as we are needed before any 224 - * of the init-calls that initialise the devices are actually 225 - * done. 226 - */ 227 - 228 - int __init s3c2410_baseclk_add(void) 229 - { 230 - unsigned long clkslow = __raw_readl(S3C2410_CLKSLOW); 231 - unsigned long clkcon = __raw_readl(S3C2410_CLKCON); 232 - struct clk *xtal; 233 - int ret; 234 - int ptr; 235 - 236 - clk_upll.enable = s3c2410_upll_enable; 237 - 238 - if (s3c24xx_register_clock(&clk_usb_bus) < 0) 239 - printk(KERN_ERR "failed to register usb bus clock\n"); 240 - 241 - /* register clocks from clock array */ 242 - 243 - for (ptr = 0; ptr < ARRAY_SIZE(init_clocks); ptr++) { 244 - struct clk *clkp = init_clocks[ptr]; 245 - 246 - /* ensure that we note the clock state */ 247 - 248 - clkp->usage = clkcon & clkp->ctrlbit ? 1 : 0; 249 - 250 - ret = s3c24xx_register_clock(clkp); 251 - if (ret < 0) { 252 - printk(KERN_ERR "Failed to register clock %s (%d)\n", 253 - clkp->name, ret); 254 - } 255 - } 256 - 257 - /* We must be careful disabling the clocks we are not intending to 258 - * be using at boot time, as subsystems such as the LCD which do 259 - * their own DMA requests to the bus can cause the system to lockup 260 - * if they where in the middle of requesting bus access. 261 - * 262 - * Disabling the LCD clock if the LCD is active is very dangerous, 263 - * and therefore the bootloader should be careful to not enable 264 - * the LCD clock if it is not needed. 265 - */ 266 - 267 - /* install (and disable) the clocks we do not need immediately */ 268 - 269 - s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 270 - s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 271 - 272 - /* show the clock-slow value */ 273 - 274 - xtal = clk_get(NULL, "xtal"); 275 - 276 - printk("CLOCK: Slow mode (%ld.%ld MHz), %s, MPLL %s, UPLL %s\n", 277 - print_mhz(clk_get_rate(xtal) / 278 - ( 2 * S3C2410_CLKSLOW_GET_SLOWVAL(clkslow))), 279 - (clkslow & S3C2410_CLKSLOW_SLOW) ? "slow" : "fast", 280 - (clkslow & S3C2410_CLKSLOW_MPLL_OFF) ? "off" : "on", 281 - (clkslow & S3C2410_CLKSLOW_UCLK_OFF) ? "off" : "on"); 282 - 283 - return 0; 284 - }
-760
arch/arm/mach-s3c24xx/clock-s3c2412.c
··· 1 - /* linux/arch/arm/mach-s3c2412/clock.c 2 - * 3 - * Copyright (c) 2006 Simtec Electronics 4 - * Ben Dooks <ben@simtec.co.uk> 5 - * 6 - * S3C2412,S3C2413 Clock control support 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 - * You should have received a copy of the GNU General Public License 19 - * along with this program; if not, write to the Free Software 20 - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21 - */ 22 - 23 - #include <linux/init.h> 24 - #include <linux/module.h> 25 - #include <linux/kernel.h> 26 - #include <linux/list.h> 27 - #include <linux/errno.h> 28 - #include <linux/err.h> 29 - #include <linux/device.h> 30 - #include <linux/clk.h> 31 - #include <linux/mutex.h> 32 - #include <linux/delay.h> 33 - #include <linux/serial_core.h> 34 - #include <linux/serial_s3c.h> 35 - #include <linux/io.h> 36 - 37 - #include <asm/mach/map.h> 38 - 39 - #include <mach/hardware.h> 40 - #include <mach/regs-clock.h> 41 - #include <mach/regs-gpio.h> 42 - 43 - #include <plat/clock.h> 44 - #include <plat/cpu.h> 45 - 46 - /* We currently have to assume that the system is running 47 - * from the XTPll input, and that all ***REFCLKs are being 48 - * fed from it, as we cannot read the state of OM[4] from 49 - * software. 50 - * 51 - * It would be possible for each board initialisation to 52 - * set the correct muxing at initialisation 53 - */ 54 - 55 - static int s3c2412_clkcon_enable(struct clk *clk, int enable) 56 - { 57 - unsigned int clocks = clk->ctrlbit; 58 - unsigned long clkcon; 59 - 60 - clkcon = __raw_readl(S3C2410_CLKCON); 61 - 62 - if (enable) 63 - clkcon |= clocks; 64 - else 65 - clkcon &= ~clocks; 66 - 67 - __raw_writel(clkcon, S3C2410_CLKCON); 68 - 69 - return 0; 70 - } 71 - 72 - static int s3c2412_upll_enable(struct clk *clk, int enable) 73 - { 74 - unsigned long upllcon = __raw_readl(S3C2410_UPLLCON); 75 - unsigned long orig = upllcon; 76 - 77 - if (!enable) 78 - upllcon |= S3C2412_PLLCON_OFF; 79 - else 80 - upllcon &= ~S3C2412_PLLCON_OFF; 81 - 82 - __raw_writel(upllcon, S3C2410_UPLLCON); 83 - 84 - /* allow ~150uS for the PLL to settle and lock */ 85 - 86 - if (enable && (orig & S3C2412_PLLCON_OFF)) 87 - udelay(150); 88 - 89 - return 0; 90 - } 91 - 92 - /* clock selections */ 93 - 94 - static struct clk clk_erefclk = { 95 - .name = "erefclk", 96 - }; 97 - 98 - static struct clk clk_urefclk = { 99 - .name = "urefclk", 100 - }; 101 - 102 - static int s3c2412_setparent_usysclk(struct clk *clk, struct clk *parent) 103 - { 104 - unsigned long clksrc = __raw_readl(S3C2412_CLKSRC); 105 - 106 - if (parent == &clk_urefclk) 107 - clksrc &= ~S3C2412_CLKSRC_USYSCLK_UPLL; 108 - else if (parent == &clk_upll) 109 - clksrc |= S3C2412_CLKSRC_USYSCLK_UPLL; 110 - else 111 - return -EINVAL; 112 - 113 - clk->parent = parent; 114 - 115 - __raw_writel(clksrc, S3C2412_CLKSRC); 116 - return 0; 117 - } 118 - 119 - static struct clk clk_usysclk = { 120 - .name = "usysclk", 121 - .parent = &clk_xtal, 122 - .ops = &(struct clk_ops) { 123 - .set_parent = s3c2412_setparent_usysclk, 124 - }, 125 - }; 126 - 127 - static struct clk clk_mrefclk = { 128 - .name = "mrefclk", 129 - .parent = &clk_xtal, 130 - }; 131 - 132 - static struct clk clk_mdivclk = { 133 - .name = "mdivclk", 134 - .parent = &clk_xtal, 135 - }; 136 - 137 - static int s3c2412_setparent_usbsrc(struct clk *clk, struct clk *parent) 138 - { 139 - unsigned long clksrc = __raw_readl(S3C2412_CLKSRC); 140 - 141 - if (parent == &clk_usysclk) 142 - clksrc &= ~S3C2412_CLKSRC_USBCLK_HCLK; 143 - else if (parent == &clk_h) 144 - clksrc |= S3C2412_CLKSRC_USBCLK_HCLK; 145 - else 146 - return -EINVAL; 147 - 148 - clk->parent = parent; 149 - 150 - __raw_writel(clksrc, S3C2412_CLKSRC); 151 - return 0; 152 - } 153 - 154 - static unsigned long s3c2412_roundrate_usbsrc(struct clk *clk, 155 - unsigned long rate) 156 - { 157 - unsigned long parent_rate = clk_get_rate(clk->parent); 158 - int div; 159 - 160 - if (rate > parent_rate) 161 - return parent_rate; 162 - 163 - div = parent_rate / rate; 164 - if (div > 2) 165 - div = 2; 166 - 167 - return parent_rate / div; 168 - } 169 - 170 - static unsigned long s3c2412_getrate_usbsrc(struct clk *clk) 171 - { 172 - unsigned long parent_rate = clk_get_rate(clk->parent); 173 - unsigned long div = __raw_readl(S3C2410_CLKDIVN); 174 - 175 - return parent_rate / ((div & S3C2412_CLKDIVN_USB48DIV) ? 2 : 1); 176 - } 177 - 178 - static int s3c2412_setrate_usbsrc(struct clk *clk, unsigned long rate) 179 - { 180 - unsigned long parent_rate = clk_get_rate(clk->parent); 181 - unsigned long clkdivn = __raw_readl(S3C2410_CLKDIVN); 182 - 183 - rate = s3c2412_roundrate_usbsrc(clk, rate); 184 - 185 - if ((parent_rate / rate) == 2) 186 - clkdivn |= S3C2412_CLKDIVN_USB48DIV; 187 - else 188 - clkdivn &= ~S3C2412_CLKDIVN_USB48DIV; 189 - 190 - __raw_writel(clkdivn, S3C2410_CLKDIVN); 191 - return 0; 192 - } 193 - 194 - static struct clk clk_usbsrc = { 195 - .name = "usbsrc", 196 - .ops = &(struct clk_ops) { 197 - .get_rate = s3c2412_getrate_usbsrc, 198 - .set_rate = s3c2412_setrate_usbsrc, 199 - .round_rate = s3c2412_roundrate_usbsrc, 200 - .set_parent = s3c2412_setparent_usbsrc, 201 - }, 202 - }; 203 - 204 - static int s3c2412_setparent_msysclk(struct clk *clk, struct clk *parent) 205 - { 206 - unsigned long clksrc = __raw_readl(S3C2412_CLKSRC); 207 - 208 - if (parent == &clk_mdivclk) 209 - clksrc &= ~S3C2412_CLKSRC_MSYSCLK_MPLL; 210 - else if (parent == &clk_mpll) 211 - clksrc |= S3C2412_CLKSRC_MSYSCLK_MPLL; 212 - else 213 - return -EINVAL; 214 - 215 - clk->parent = parent; 216 - 217 - __raw_writel(clksrc, S3C2412_CLKSRC); 218 - return 0; 219 - } 220 - 221 - static struct clk clk_msysclk = { 222 - .name = "msysclk", 223 - .ops = &(struct clk_ops) { 224 - .set_parent = s3c2412_setparent_msysclk, 225 - }, 226 - }; 227 - 228 - static int s3c2412_setparent_armclk(struct clk *clk, struct clk *parent) 229 - { 230 - unsigned long flags; 231 - unsigned long clkdiv; 232 - unsigned long dvs; 233 - 234 - /* Note, we current equate fclk andf msysclk for S3C2412 */ 235 - 236 - if (parent == &clk_msysclk || parent == &clk_f) 237 - dvs = 0; 238 - else if (parent == &clk_h) 239 - dvs = S3C2412_CLKDIVN_DVSEN; 240 - else 241 - return -EINVAL; 242 - 243 - clk->parent = parent; 244 - 245 - /* update this under irq lockdown, clkdivn is not protected 246 - * by the clock system. */ 247 - 248 - local_irq_save(flags); 249 - 250 - clkdiv = __raw_readl(S3C2410_CLKDIVN); 251 - clkdiv &= ~S3C2412_CLKDIVN_DVSEN; 252 - clkdiv |= dvs; 253 - __raw_writel(clkdiv, S3C2410_CLKDIVN); 254 - 255 - local_irq_restore(flags); 256 - 257 - return 0; 258 - } 259 - 260 - static struct clk clk_armclk = { 261 - .name = "armclk", 262 - .parent = &clk_msysclk, 263 - .ops = &(struct clk_ops) { 264 - .set_parent = s3c2412_setparent_armclk, 265 - }, 266 - }; 267 - 268 - /* these next clocks have an divider immediately after them, 269 - * so we can register them with their divider and leave out the 270 - * intermediate clock stage 271 - */ 272 - static unsigned long s3c2412_roundrate_clksrc(struct clk *clk, 273 - unsigned long rate) 274 - { 275 - unsigned long parent_rate = clk_get_rate(clk->parent); 276 - int div; 277 - 278 - if (rate > parent_rate) 279 - return parent_rate; 280 - 281 - /* note, we remove the +/- 1 calculations as they cancel out */ 282 - 283 - div = (rate / parent_rate); 284 - 285 - if (div < 1) 286 - div = 1; 287 - else if (div > 16) 288 - div = 16; 289 - 290 - return parent_rate / div; 291 - } 292 - 293 - static int s3c2412_setparent_uart(struct clk *clk, struct clk *parent) 294 - { 295 - unsigned long clksrc = __raw_readl(S3C2412_CLKSRC); 296 - 297 - if (parent == &clk_erefclk) 298 - clksrc &= ~S3C2412_CLKSRC_UARTCLK_MPLL; 299 - else if (parent == &clk_mpll) 300 - clksrc |= S3C2412_CLKSRC_UARTCLK_MPLL; 301 - else 302 - return -EINVAL; 303 - 304 - clk->parent = parent; 305 - 306 - __raw_writel(clksrc, S3C2412_CLKSRC); 307 - return 0; 308 - } 309 - 310 - static unsigned long s3c2412_getrate_uart(struct clk *clk) 311 - { 312 - unsigned long parent_rate = clk_get_rate(clk->parent); 313 - unsigned long div = __raw_readl(S3C2410_CLKDIVN); 314 - 315 - div &= S3C2412_CLKDIVN_UARTDIV_MASK; 316 - div >>= S3C2412_CLKDIVN_UARTDIV_SHIFT; 317 - 318 - return parent_rate / (div + 1); 319 - } 320 - 321 - static int s3c2412_setrate_uart(struct clk *clk, unsigned long rate) 322 - { 323 - unsigned long parent_rate = clk_get_rate(clk->parent); 324 - unsigned long clkdivn = __raw_readl(S3C2410_CLKDIVN); 325 - 326 - rate = s3c2412_roundrate_clksrc(clk, rate); 327 - 328 - clkdivn &= ~S3C2412_CLKDIVN_UARTDIV_MASK; 329 - clkdivn |= ((parent_rate / rate) - 1) << S3C2412_CLKDIVN_UARTDIV_SHIFT; 330 - 331 - __raw_writel(clkdivn, S3C2410_CLKDIVN); 332 - return 0; 333 - } 334 - 335 - static struct clk clk_uart = { 336 - .name = "uartclk", 337 - .ops = &(struct clk_ops) { 338 - .get_rate = s3c2412_getrate_uart, 339 - .set_rate = s3c2412_setrate_uart, 340 - .set_parent = s3c2412_setparent_uart, 341 - .round_rate = s3c2412_roundrate_clksrc, 342 - }, 343 - }; 344 - 345 - static int s3c2412_setparent_i2s(struct clk *clk, struct clk *parent) 346 - { 347 - unsigned long clksrc = __raw_readl(S3C2412_CLKSRC); 348 - 349 - if (parent == &clk_erefclk) 350 - clksrc &= ~S3C2412_CLKSRC_I2SCLK_MPLL; 351 - else if (parent == &clk_mpll) 352 - clksrc |= S3C2412_CLKSRC_I2SCLK_MPLL; 353 - else 354 - return -EINVAL; 355 - 356 - clk->parent = parent; 357 - 358 - __raw_writel(clksrc, S3C2412_CLKSRC); 359 - return 0; 360 - } 361 - 362 - static unsigned long s3c2412_getrate_i2s(struct clk *clk) 363 - { 364 - unsigned long parent_rate = clk_get_rate(clk->parent); 365 - unsigned long div = __raw_readl(S3C2410_CLKDIVN); 366 - 367 - div &= S3C2412_CLKDIVN_I2SDIV_MASK; 368 - div >>= S3C2412_CLKDIVN_I2SDIV_SHIFT; 369 - 370 - return parent_rate / (div + 1); 371 - } 372 - 373 - static int s3c2412_setrate_i2s(struct clk *clk, unsigned long rate) 374 - { 375 - unsigned long parent_rate = clk_get_rate(clk->parent); 376 - unsigned long clkdivn = __raw_readl(S3C2410_CLKDIVN); 377 - 378 - rate = s3c2412_roundrate_clksrc(clk, rate); 379 - 380 - clkdivn &= ~S3C2412_CLKDIVN_I2SDIV_MASK; 381 - clkdivn |= ((parent_rate / rate) - 1) << S3C2412_CLKDIVN_I2SDIV_SHIFT; 382 - 383 - __raw_writel(clkdivn, S3C2410_CLKDIVN); 384 - return 0; 385 - } 386 - 387 - static struct clk clk_i2s = { 388 - .name = "i2sclk", 389 - .ops = &(struct clk_ops) { 390 - .get_rate = s3c2412_getrate_i2s, 391 - .set_rate = s3c2412_setrate_i2s, 392 - .set_parent = s3c2412_setparent_i2s, 393 - .round_rate = s3c2412_roundrate_clksrc, 394 - }, 395 - }; 396 - 397 - static int s3c2412_setparent_cam(struct clk *clk, struct clk *parent) 398 - { 399 - unsigned long clksrc = __raw_readl(S3C2412_CLKSRC); 400 - 401 - if (parent == &clk_usysclk) 402 - clksrc &= ~S3C2412_CLKSRC_CAMCLK_HCLK; 403 - else if (parent == &clk_h) 404 - clksrc |= S3C2412_CLKSRC_CAMCLK_HCLK; 405 - else 406 - return -EINVAL; 407 - 408 - clk->parent = parent; 409 - 410 - __raw_writel(clksrc, S3C2412_CLKSRC); 411 - return 0; 412 - } 413 - static unsigned long s3c2412_getrate_cam(struct clk *clk) 414 - { 415 - unsigned long parent_rate = clk_get_rate(clk->parent); 416 - unsigned long div = __raw_readl(S3C2410_CLKDIVN); 417 - 418 - div &= S3C2412_CLKDIVN_CAMDIV_MASK; 419 - div >>= S3C2412_CLKDIVN_CAMDIV_SHIFT; 420 - 421 - return parent_rate / (div + 1); 422 - } 423 - 424 - static int s3c2412_setrate_cam(struct clk *clk, unsigned long rate) 425 - { 426 - unsigned long parent_rate = clk_get_rate(clk->parent); 427 - unsigned long clkdivn = __raw_readl(S3C2410_CLKDIVN); 428 - 429 - rate = s3c2412_roundrate_clksrc(clk, rate); 430 - 431 - clkdivn &= ~S3C2412_CLKDIVN_CAMDIV_MASK; 432 - clkdivn |= ((parent_rate / rate) - 1) << S3C2412_CLKDIVN_CAMDIV_SHIFT; 433 - 434 - __raw_writel(clkdivn, S3C2410_CLKDIVN); 435 - return 0; 436 - } 437 - 438 - static struct clk clk_cam = { 439 - .name = "camif-upll", /* same as 2440 name */ 440 - .ops = &(struct clk_ops) { 441 - .get_rate = s3c2412_getrate_cam, 442 - .set_rate = s3c2412_setrate_cam, 443 - .set_parent = s3c2412_setparent_cam, 444 - .round_rate = s3c2412_roundrate_clksrc, 445 - }, 446 - }; 447 - 448 - /* standard clock definitions */ 449 - 450 - static struct clk init_clocks_disable[] = { 451 - { 452 - .name = "nand", 453 - .parent = &clk_h, 454 - .enable = s3c2412_clkcon_enable, 455 - .ctrlbit = S3C2412_CLKCON_NAND, 456 - }, { 457 - .name = "sdi", 458 - .parent = &clk_p, 459 - .enable = s3c2412_clkcon_enable, 460 - .ctrlbit = S3C2412_CLKCON_SDI, 461 - }, { 462 - .name = "adc", 463 - .parent = &clk_p, 464 - .enable = s3c2412_clkcon_enable, 465 - .ctrlbit = S3C2412_CLKCON_ADC, 466 - }, { 467 - .name = "i2c", 468 - .parent = &clk_p, 469 - .enable = s3c2412_clkcon_enable, 470 - .ctrlbit = S3C2412_CLKCON_IIC, 471 - }, { 472 - .name = "iis", 473 - .parent = &clk_p, 474 - .enable = s3c2412_clkcon_enable, 475 - .ctrlbit = S3C2412_CLKCON_IIS, 476 - }, { 477 - .name = "spi", 478 - .parent = &clk_p, 479 - .enable = s3c2412_clkcon_enable, 480 - .ctrlbit = S3C2412_CLKCON_SPI, 481 - } 482 - }; 483 - 484 - static struct clk init_clocks[] = { 485 - { 486 - .name = "dma.0", 487 - .parent = &clk_h, 488 - .enable = s3c2412_clkcon_enable, 489 - .ctrlbit = S3C2412_CLKCON_DMA0, 490 - }, { 491 - .name = "dma.1", 492 - .parent = &clk_h, 493 - .enable = s3c2412_clkcon_enable, 494 - .ctrlbit = S3C2412_CLKCON_DMA1, 495 - }, { 496 - .name = "dma.2", 497 - .parent = &clk_h, 498 - .enable = s3c2412_clkcon_enable, 499 - .ctrlbit = S3C2412_CLKCON_DMA2, 500 - }, { 501 - .name = "dma.3", 502 - .parent = &clk_h, 503 - .enable = s3c2412_clkcon_enable, 504 - .ctrlbit = S3C2412_CLKCON_DMA3, 505 - }, { 506 - .name = "lcd", 507 - .parent = &clk_h, 508 - .enable = s3c2412_clkcon_enable, 509 - .ctrlbit = S3C2412_CLKCON_LCDC, 510 - }, { 511 - .name = "gpio", 512 - .parent = &clk_p, 513 - .enable = s3c2412_clkcon_enable, 514 - .ctrlbit = S3C2412_CLKCON_GPIO, 515 - }, { 516 - .name = "usb-host", 517 - .parent = &clk_h, 518 - .enable = s3c2412_clkcon_enable, 519 - .ctrlbit = S3C2412_CLKCON_USBH, 520 - }, { 521 - .name = "usb-device", 522 - .parent = &clk_h, 523 - .enable = s3c2412_clkcon_enable, 524 - .ctrlbit = S3C2412_CLKCON_USBD, 525 - }, { 526 - .name = "timers", 527 - .parent = &clk_p, 528 - .enable = s3c2412_clkcon_enable, 529 - .ctrlbit = S3C2412_CLKCON_PWMT, 530 - }, { 531 - .name = "uart", 532 - .devname = "s3c2412-uart.0", 533 - .parent = &clk_p, 534 - .enable = s3c2412_clkcon_enable, 535 - .ctrlbit = S3C2412_CLKCON_UART0, 536 - }, { 537 - .name = "uart", 538 - .devname = "s3c2412-uart.1", 539 - .parent = &clk_p, 540 - .enable = s3c2412_clkcon_enable, 541 - .ctrlbit = S3C2412_CLKCON_UART1, 542 - }, { 543 - .name = "uart", 544 - .devname = "s3c2412-uart.2", 545 - .parent = &clk_p, 546 - .enable = s3c2412_clkcon_enable, 547 - .ctrlbit = S3C2412_CLKCON_UART2, 548 - }, { 549 - .name = "rtc", 550 - .parent = &clk_p, 551 - .enable = s3c2412_clkcon_enable, 552 - .ctrlbit = S3C2412_CLKCON_RTC, 553 - }, { 554 - .name = "watchdog", 555 - .parent = &clk_p, 556 - .ctrlbit = 0, 557 - }, { 558 - .name = "usb-bus-gadget", 559 - .parent = &clk_usb_bus, 560 - .enable = s3c2412_clkcon_enable, 561 - .ctrlbit = S3C2412_CLKCON_USB_DEV48, 562 - }, { 563 - .name = "usb-bus-host", 564 - .parent = &clk_usb_bus, 565 - .enable = s3c2412_clkcon_enable, 566 - .ctrlbit = S3C2412_CLKCON_USB_HOST48, 567 - } 568 - }; 569 - 570 - /* clocks to add where we need to check their parentage */ 571 - 572 - struct clk_init { 573 - struct clk *clk; 574 - unsigned int bit; 575 - struct clk *src_0; 576 - struct clk *src_1; 577 - }; 578 - 579 - static struct clk_init clks_src[] __initdata = { 580 - { 581 - .clk = &clk_usysclk, 582 - .bit = S3C2412_CLKSRC_USBCLK_HCLK, 583 - .src_0 = &clk_urefclk, 584 - .src_1 = &clk_upll, 585 - }, { 586 - .clk = &clk_i2s, 587 - .bit = S3C2412_CLKSRC_I2SCLK_MPLL, 588 - .src_0 = &clk_erefclk, 589 - .src_1 = &clk_mpll, 590 - }, { 591 - .clk = &clk_cam, 592 - .bit = S3C2412_CLKSRC_CAMCLK_HCLK, 593 - .src_0 = &clk_usysclk, 594 - .src_1 = &clk_h, 595 - }, { 596 - .clk = &clk_msysclk, 597 - .bit = S3C2412_CLKSRC_MSYSCLK_MPLL, 598 - .src_0 = &clk_mdivclk, 599 - .src_1 = &clk_mpll, 600 - }, { 601 - .clk = &clk_uart, 602 - .bit = S3C2412_CLKSRC_UARTCLK_MPLL, 603 - .src_0 = &clk_erefclk, 604 - .src_1 = &clk_mpll, 605 - }, { 606 - .clk = &clk_usbsrc, 607 - .bit = S3C2412_CLKSRC_USBCLK_HCLK, 608 - .src_0 = &clk_usysclk, 609 - .src_1 = &clk_h, 610 - /* here we assume OM[4] select xtal */ 611 - }, { 612 - .clk = &clk_erefclk, 613 - .bit = S3C2412_CLKSRC_EREFCLK_EXTCLK, 614 - .src_0 = &clk_xtal, 615 - .src_1 = &clk_ext, 616 - }, { 617 - .clk = &clk_urefclk, 618 - .bit = S3C2412_CLKSRC_UREFCLK_EXTCLK, 619 - .src_0 = &clk_xtal, 620 - .src_1 = &clk_ext, 621 - }, 622 - }; 623 - 624 - /* s3c2412_clk_initparents 625 - * 626 - * Initialise the parents for the clocks that we get at start-time 627 - */ 628 - 629 - static void __init s3c2412_clk_initparents(void) 630 - { 631 - unsigned long clksrc = __raw_readl(S3C2412_CLKSRC); 632 - struct clk_init *cip = clks_src; 633 - struct clk *src; 634 - int ptr; 635 - int ret; 636 - 637 - for (ptr = 0; ptr < ARRAY_SIZE(clks_src); ptr++, cip++) { 638 - ret = s3c24xx_register_clock(cip->clk); 639 - if (ret < 0) { 640 - printk(KERN_ERR "Failed to register clock %s (%d)\n", 641 - cip->clk->name, ret); 642 - } 643 - 644 - src = (clksrc & cip->bit) ? cip->src_1 : cip->src_0; 645 - 646 - printk(KERN_INFO "%s: parent %s\n", cip->clk->name, src->name); 647 - clk_set_parent(cip->clk, src); 648 - } 649 - } 650 - 651 - /* clocks to add straight away */ 652 - 653 - static struct clk *clks[] __initdata = { 654 - &clk_ext, 655 - &clk_usb_bus, 656 - &clk_mrefclk, 657 - &clk_armclk, 658 - }; 659 - 660 - static struct clk_lookup s3c2412_clk_lookup[] = { 661 - CLKDEV_INIT(NULL, "clk_uart_baud1", &s3c24xx_uclk), 662 - CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_p), 663 - CLKDEV_INIT(NULL, "clk_uart_baud3", &clk_usysclk), 664 - }; 665 - 666 - int __init s3c2412_baseclk_add(void) 667 - { 668 - unsigned long clkcon = __raw_readl(S3C2410_CLKCON); 669 - unsigned int dvs; 670 - struct clk *clkp; 671 - int ret; 672 - int ptr; 673 - 674 - clk_upll.enable = s3c2412_upll_enable; 675 - clk_usb_bus.parent = &clk_usbsrc; 676 - clk_usb_bus.rate = 0x0; 677 - 678 - clk_f.parent = &clk_msysclk; 679 - 680 - s3c2412_clk_initparents(); 681 - 682 - for (ptr = 0; ptr < ARRAY_SIZE(clks); ptr++) { 683 - clkp = clks[ptr]; 684 - 685 - ret = s3c24xx_register_clock(clkp); 686 - if (ret < 0) { 687 - printk(KERN_ERR "Failed to register clock %s (%d)\n", 688 - clkp->name, ret); 689 - } 690 - } 691 - 692 - /* set the dvs state according to what we got at boot time */ 693 - 694 - dvs = __raw_readl(S3C2410_CLKDIVN) & S3C2412_CLKDIVN_DVSEN; 695 - 696 - if (dvs) 697 - clk_armclk.parent = &clk_h; 698 - 699 - printk(KERN_INFO "S3C2412: DVS is %s\n", dvs ? "on" : "off"); 700 - 701 - /* ensure usb bus clock is within correct rate of 48MHz */ 702 - 703 - if (clk_get_rate(&clk_usb_bus) != (48 * 1000 * 1000)) { 704 - printk(KERN_INFO "Warning: USB bus clock not at 48MHz\n"); 705 - 706 - /* for the moment, let's use the UPLL, and see if we can 707 - * get 48MHz */ 708 - 709 - clk_set_parent(&clk_usysclk, &clk_upll); 710 - clk_set_parent(&clk_usbsrc, &clk_usysclk); 711 - clk_set_rate(&clk_usbsrc, 48*1000*1000); 712 - } 713 - 714 - printk("S3C2412: upll %s, %ld.%03ld MHz, usb-bus %ld.%03ld MHz\n", 715 - (__raw_readl(S3C2410_UPLLCON) & S3C2412_PLLCON_OFF) ? "off":"on", 716 - print_mhz(clk_get_rate(&clk_upll)), 717 - print_mhz(clk_get_rate(&clk_usb_bus))); 718 - 719 - /* register clocks from clock array */ 720 - 721 - clkp = init_clocks; 722 - for (ptr = 0; ptr < ARRAY_SIZE(init_clocks); ptr++, clkp++) { 723 - /* ensure that we note the clock state */ 724 - 725 - clkp->usage = clkcon & clkp->ctrlbit ? 1 : 0; 726 - 727 - ret = s3c24xx_register_clock(clkp); 728 - if (ret < 0) { 729 - printk(KERN_ERR "Failed to register clock %s (%d)\n", 730 - clkp->name, ret); 731 - } 732 - } 733 - 734 - /* We must be careful disabling the clocks we are not intending to 735 - * be using at boot time, as subsystems such as the LCD which do 736 - * their own DMA requests to the bus can cause the system to lockup 737 - * if they where in the middle of requesting bus access. 738 - * 739 - * Disabling the LCD clock if the LCD is active is very dangerous, 740 - * and therefore the bootloader should be careful to not enable 741 - * the LCD clock if it is not needed. 742 - */ 743 - 744 - /* install (and disable) the clocks we do not need immediately */ 745 - 746 - clkp = init_clocks_disable; 747 - for (ptr = 0; ptr < ARRAY_SIZE(init_clocks_disable); ptr++, clkp++) { 748 - 749 - ret = s3c24xx_register_clock(clkp); 750 - if (ret < 0) { 751 - printk(KERN_ERR "Failed to register clock %s (%d)\n", 752 - clkp->name, ret); 753 - } 754 - 755 - s3c2412_clkcon_enable(clkp, 0); 756 - } 757 - 758 - clkdev_add_table(s3c2412_clk_lookup, ARRAY_SIZE(s3c2412_clk_lookup)); 759 - return 0; 760 - }
-171
arch/arm/mach-s3c24xx/clock-s3c2416.c
··· 1 - /* linux/arch/arm/mach-s3c2416/clock.c 2 - * 3 - * Copyright (c) 2010 Simtec Electronics 4 - * Copyright (c) 2010 Ben Dooks <ben-linux@fluff.org> 5 - * 6 - * S3C2416 Clock control support 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 - 14 - #include <linux/init.h> 15 - #include <linux/clk.h> 16 - 17 - #include <plat/clock.h> 18 - #include <plat/clock-clksrc.h> 19 - #include <plat/cpu.h> 20 - 21 - #include <plat/cpu-freq.h> 22 - #include <plat/pll.h> 23 - 24 - #include <asm/mach/map.h> 25 - 26 - #include <mach/regs-clock.h> 27 - #include <mach/regs-s3c2443-clock.h> 28 - 29 - /* armdiv 30 - * 31 - * this clock is sourced from msysclk and can have a number of 32 - * divider values applied to it to then be fed into armclk. 33 - * The real clock definition is done in s3c2443-clock.c, 34 - * only the armdiv divisor table must be defined here. 35 - */ 36 - 37 - static unsigned int armdiv[8] = { 38 - [0] = 1, 39 - [1] = 2, 40 - [2] = 3, 41 - [3] = 4, 42 - [5] = 6, 43 - [7] = 8, 44 - }; 45 - 46 - static struct clksrc_clk hsspi_eplldiv = { 47 - .clk = { 48 - .name = "hsspi-eplldiv", 49 - .parent = &clk_esysclk.clk, 50 - .ctrlbit = (1 << 14), 51 - .enable = s3c2443_clkcon_enable_s, 52 - }, 53 - .reg_div = { .reg = S3C2443_CLKDIV1, .size = 2, .shift = 24 }, 54 - }; 55 - 56 - static struct clk *hsspi_sources[] = { 57 - [0] = &hsspi_eplldiv.clk, 58 - [1] = NULL, /* to fix */ 59 - }; 60 - 61 - static struct clksrc_clk hsspi_mux = { 62 - .clk = { 63 - .name = "hsspi-if", 64 - }, 65 - .sources = &(struct clksrc_sources) { 66 - .sources = hsspi_sources, 67 - .nr_sources = ARRAY_SIZE(hsspi_sources), 68 - }, 69 - .reg_src = { .reg = S3C2443_CLKSRC, .size = 1, .shift = 18 }, 70 - }; 71 - 72 - static struct clksrc_clk hsmmc_div[] = { 73 - [0] = { 74 - .clk = { 75 - .name = "hsmmc-div", 76 - .devname = "s3c-sdhci.0", 77 - .parent = &clk_esysclk.clk, 78 - }, 79 - .reg_div = { .reg = S3C2416_CLKDIV2, .size = 2, .shift = 6 }, 80 - }, 81 - [1] = { 82 - .clk = { 83 - .name = "hsmmc-div", 84 - .devname = "s3c-sdhci.1", 85 - .parent = &clk_esysclk.clk, 86 - }, 87 - .reg_div = { .reg = S3C2443_CLKDIV1, .size = 2, .shift = 6 }, 88 - }, 89 - }; 90 - 91 - static struct clksrc_clk hsmmc_mux0 = { 92 - .clk = { 93 - .name = "hsmmc-if", 94 - .devname = "s3c-sdhci.0", 95 - .ctrlbit = (1 << 6), 96 - .enable = s3c2443_clkcon_enable_s, 97 - }, 98 - .sources = &(struct clksrc_sources) { 99 - .nr_sources = 2, 100 - .sources = (struct clk * []) { 101 - [0] = &hsmmc_div[0].clk, 102 - [1] = NULL, /* to fix */ 103 - }, 104 - }, 105 - .reg_src = { .reg = S3C2443_CLKSRC, .size = 1, .shift = 16 }, 106 - }; 107 - 108 - static struct clksrc_clk hsmmc_mux1 = { 109 - .clk = { 110 - .name = "hsmmc-if", 111 - .devname = "s3c-sdhci.1", 112 - .ctrlbit = (1 << 12), 113 - .enable = s3c2443_clkcon_enable_s, 114 - }, 115 - .sources = &(struct clksrc_sources) { 116 - .nr_sources = 2, 117 - .sources = (struct clk * []) { 118 - [0] = &hsmmc_div[1].clk, 119 - [1] = NULL, /* to fix */ 120 - }, 121 - }, 122 - .reg_src = { .reg = S3C2443_CLKSRC, .size = 1, .shift = 17 }, 123 - }; 124 - 125 - static struct clk hsmmc0_clk = { 126 - .name = "hsmmc", 127 - .devname = "s3c-sdhci.0", 128 - .parent = &clk_h, 129 - .enable = s3c2443_clkcon_enable_h, 130 - .ctrlbit = S3C2416_HCLKCON_HSMMC0, 131 - }; 132 - 133 - static struct clksrc_clk *clksrcs[] __initdata = { 134 - &hsspi_eplldiv, 135 - &hsspi_mux, 136 - &hsmmc_div[0], 137 - &hsmmc_div[1], 138 - &hsmmc_mux0, 139 - &hsmmc_mux1, 140 - }; 141 - 142 - static struct clk_lookup s3c2416_clk_lookup[] = { 143 - CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.0", &hsmmc0_clk), 144 - CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.2", &hsmmc_mux0.clk), 145 - CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &hsmmc_mux1.clk), 146 - /* s3c2443-spi.0 is used on s3c2416 and s3c2450 as well */ 147 - CLKDEV_INIT("s3c2443-spi.0", "spi_busclk2", &hsspi_mux.clk), 148 - }; 149 - 150 - void __init s3c2416_init_clocks(int xtal) 151 - { 152 - u32 epllcon = __raw_readl(S3C2443_EPLLCON); 153 - u32 epllcon1 = __raw_readl(S3C2443_EPLLCON+4); 154 - int ptr; 155 - 156 - /* s3c2416 EPLL compatible with s3c64xx */ 157 - clk_epll.rate = s3c_get_pll6553x(xtal, epllcon, epllcon1); 158 - 159 - clk_epll.parent = &clk_epllref.clk; 160 - 161 - s3c2443_common_init_clocks(xtal, s3c2416_get_pll, 162 - armdiv, ARRAY_SIZE(armdiv), 163 - S3C2416_CLKDIV0_ARMDIV_MASK); 164 - 165 - for (ptr = 0; ptr < ARRAY_SIZE(clksrcs); ptr++) 166 - s3c_register_clksrc(clksrcs[ptr], 1); 167 - 168 - s3c24xx_register_clock(&hsmmc0_clk); 169 - clkdev_add_table(s3c2416_clk_lookup, ARRAY_SIZE(s3c2416_clk_lookup)); 170 - 171 - }
-217
arch/arm/mach-s3c24xx/clock-s3c2440.c
··· 1 - /* linux/arch/arm/mach-s3c2440/clock.c 2 - * 3 - * Copyright (c) 2004-2005 Simtec Electronics 4 - * http://armlinux.simtec.co.uk/ 5 - * Ben Dooks <ben@simtec.co.uk> 6 - * 7 - * S3C2440 Clock support 8 - * 9 - * This program is free software; you can redistribute it and/or modify 10 - * it under the terms of the GNU General Public License as published by 11 - * the Free Software Foundation; either version 2 of the License, or 12 - * (at your option) any later version. 13 - * 14 - * This program is distributed in the hope that it will be useful, 15 - * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 - * GNU General Public License for more details. 18 - * 19 - * You should have received a copy of the GNU General Public License 20 - * along with this program; if not, write to the Free Software 21 - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22 - */ 23 - 24 - #include <linux/init.h> 25 - #include <linux/module.h> 26 - #include <linux/kernel.h> 27 - #include <linux/list.h> 28 - #include <linux/errno.h> 29 - #include <linux/err.h> 30 - #include <linux/device.h> 31 - #include <linux/interrupt.h> 32 - #include <linux/ioport.h> 33 - #include <linux/mutex.h> 34 - #include <linux/clk.h> 35 - #include <linux/io.h> 36 - #include <linux/serial_core.h> 37 - #include <linux/serial_s3c.h> 38 - 39 - #include <mach/hardware.h> 40 - #include <linux/atomic.h> 41 - #include <asm/irq.h> 42 - 43 - #include <mach/regs-clock.h> 44 - 45 - #include <plat/clock.h> 46 - #include <plat/cpu.h> 47 - 48 - /* S3C2440 extended clock support */ 49 - 50 - static unsigned long s3c2440_camif_upll_round(struct clk *clk, 51 - unsigned long rate) 52 - { 53 - unsigned long parent_rate = clk_get_rate(clk->parent); 54 - int div; 55 - 56 - if (rate > parent_rate) 57 - return parent_rate; 58 - 59 - /* note, we remove the +/- 1 calculations for the divisor */ 60 - 61 - div = (parent_rate / rate) / 2; 62 - 63 - if (div < 1) 64 - div = 1; 65 - else if (div > 16) 66 - div = 16; 67 - 68 - return parent_rate / (div * 2); 69 - } 70 - 71 - static int s3c2440_camif_upll_setrate(struct clk *clk, unsigned long rate) 72 - { 73 - unsigned long parent_rate = clk_get_rate(clk->parent); 74 - unsigned long camdivn = __raw_readl(S3C2440_CAMDIVN); 75 - 76 - rate = s3c2440_camif_upll_round(clk, rate); 77 - 78 - camdivn &= ~(S3C2440_CAMDIVN_CAMCLK_SEL | S3C2440_CAMDIVN_CAMCLK_MASK); 79 - 80 - if (rate != parent_rate) { 81 - camdivn |= S3C2440_CAMDIVN_CAMCLK_SEL; 82 - camdivn |= (((parent_rate / rate) / 2) - 1); 83 - } 84 - 85 - __raw_writel(camdivn, S3C2440_CAMDIVN); 86 - 87 - return 0; 88 - } 89 - 90 - static unsigned long s3c2440_camif_upll_getrate(struct clk *clk) 91 - { 92 - unsigned long parent_rate = clk_get_rate(clk->parent); 93 - unsigned long camdivn = __raw_readl(S3C2440_CAMDIVN); 94 - 95 - if (!(camdivn & S3C2440_CAMDIVN_CAMCLK_SEL)) 96 - return parent_rate; 97 - 98 - camdivn &= S3C2440_CAMDIVN_CAMCLK_MASK; 99 - 100 - return parent_rate / (camdivn + 1) / 2; 101 - } 102 - 103 - /* Extra S3C2440 clocks */ 104 - 105 - static struct clk s3c2440_clk_cam = { 106 - .name = "camif", 107 - .enable = s3c2410_clkcon_enable, 108 - .ctrlbit = S3C2440_CLKCON_CAMERA, 109 - }; 110 - 111 - static struct clk s3c2440_clk_cam_upll = { 112 - .name = "camif-upll", 113 - .ops = &(struct clk_ops) { 114 - .set_rate = s3c2440_camif_upll_setrate, 115 - .get_rate = s3c2440_camif_upll_getrate, 116 - .round_rate = s3c2440_camif_upll_round, 117 - }, 118 - }; 119 - 120 - static struct clk s3c2440_clk_ac97 = { 121 - .name = "ac97", 122 - .enable = s3c2410_clkcon_enable, 123 - .ctrlbit = S3C2440_CLKCON_AC97, 124 - }; 125 - 126 - #define S3C24XX_VA_UART0 (S3C_VA_UART) 127 - #define S3C24XX_VA_UART1 (S3C_VA_UART + 0x4000 ) 128 - #define S3C24XX_VA_UART2 (S3C_VA_UART + 0x8000 ) 129 - #define S3C24XX_VA_UART3 (S3C_VA_UART + 0xC000 ) 130 - 131 - static unsigned long s3c2440_fclk_n_getrate(struct clk *clk) 132 - { 133 - unsigned long ucon0, ucon1, ucon2, divisor; 134 - 135 - /* the fun of calculating the uart divisors on the s3c2440 */ 136 - ucon0 = __raw_readl(S3C24XX_VA_UART0 + S3C2410_UCON); 137 - ucon1 = __raw_readl(S3C24XX_VA_UART1 + S3C2410_UCON); 138 - ucon2 = __raw_readl(S3C24XX_VA_UART2 + S3C2410_UCON); 139 - 140 - ucon0 &= S3C2440_UCON0_DIVMASK; 141 - ucon1 &= S3C2440_UCON1_DIVMASK; 142 - ucon2 &= S3C2440_UCON2_DIVMASK; 143 - 144 - if (ucon0 != 0) 145 - divisor = (ucon0 >> S3C2440_UCON_DIVSHIFT) + 6; 146 - else if (ucon1 != 0) 147 - divisor = (ucon1 >> S3C2440_UCON_DIVSHIFT) + 21; 148 - else if (ucon2 != 0) 149 - divisor = (ucon2 >> S3C2440_UCON_DIVSHIFT) + 36; 150 - else 151 - /* manual calims 44, seems to be 9 */ 152 - divisor = 9; 153 - 154 - return clk_get_rate(clk->parent) / divisor; 155 - } 156 - 157 - static struct clk s3c2440_clk_fclk_n = { 158 - .name = "fclk_n", 159 - .parent = &clk_f, 160 - .ops = &(struct clk_ops) { 161 - .get_rate = s3c2440_fclk_n_getrate, 162 - }, 163 - }; 164 - 165 - static struct clk_lookup s3c2440_clk_lookup[] = { 166 - CLKDEV_INIT(NULL, "clk_uart_baud1", &s3c24xx_uclk), 167 - CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_p), 168 - CLKDEV_INIT(NULL, "clk_uart_baud3", &s3c2440_clk_fclk_n), 169 - CLKDEV_INIT("s3c2440-uart.0", "uart", &s3c24xx_clk_uart0), 170 - CLKDEV_INIT("s3c2440-uart.1", "uart", &s3c24xx_clk_uart1), 171 - CLKDEV_INIT("s3c2440-uart.2", "uart", &s3c24xx_clk_uart2), 172 - CLKDEV_INIT("s3c2440-camif", "camera", &s3c2440_clk_cam_upll), 173 - }; 174 - 175 - static int __init_refok s3c2440_clk_add(struct device *dev, struct subsys_interface *sif) 176 - { 177 - struct clk *clock_upll; 178 - struct clk *clock_h; 179 - struct clk *clock_p; 180 - 181 - clock_p = clk_get(NULL, "pclk"); 182 - clock_h = clk_get(NULL, "hclk"); 183 - clock_upll = clk_get(NULL, "upll"); 184 - 185 - if (IS_ERR(clock_p) || IS_ERR(clock_h) || IS_ERR(clock_upll)) { 186 - printk(KERN_ERR "S3C2440: Failed to get parent clocks\n"); 187 - return -EINVAL; 188 - } 189 - 190 - s3c2440_clk_cam.parent = clock_h; 191 - s3c2440_clk_ac97.parent = clock_p; 192 - s3c2440_clk_cam_upll.parent = clock_upll; 193 - s3c24xx_register_clock(&s3c2440_clk_fclk_n); 194 - 195 - s3c24xx_register_clock(&s3c2440_clk_ac97); 196 - s3c24xx_register_clock(&s3c2440_clk_cam); 197 - s3c24xx_register_clock(&s3c2440_clk_cam_upll); 198 - clkdev_add_table(s3c2440_clk_lookup, ARRAY_SIZE(s3c2440_clk_lookup)); 199 - 200 - clk_disable(&s3c2440_clk_ac97); 201 - clk_disable(&s3c2440_clk_cam); 202 - 203 - return 0; 204 - } 205 - 206 - static struct subsys_interface s3c2440_clk_interface = { 207 - .name = "s3c2440_clk", 208 - .subsys = &s3c2440_subsys, 209 - .add_dev = s3c2440_clk_add, 210 - }; 211 - 212 - static __init int s3c24xx_clk_init(void) 213 - { 214 - return subsys_interface_register(&s3c2440_clk_interface); 215 - } 216 - 217 - arch_initcall(s3c24xx_clk_init);
-212
arch/arm/mach-s3c24xx/clock-s3c2443.c
··· 1 - /* linux/arch/arm/mach-s3c2443/clock.c 2 - * 3 - * Copyright (c) 2007, 2010 Simtec Electronics 4 - * Ben Dooks <ben@simtec.co.uk> 5 - * 6 - * S3C2443 Clock control support 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 - * You should have received a copy of the GNU General Public License 19 - * along with this program; if not, write to the Free Software 20 - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21 - */ 22 - 23 - #include <linux/init.h> 24 - 25 - #include <linux/module.h> 26 - #include <linux/kernel.h> 27 - #include <linux/list.h> 28 - #include <linux/errno.h> 29 - #include <linux/err.h> 30 - #include <linux/device.h> 31 - #include <linux/clk.h> 32 - #include <linux/mutex.h> 33 - #include <linux/serial_core.h> 34 - #include <linux/io.h> 35 - 36 - #include <asm/mach/map.h> 37 - 38 - #include <mach/hardware.h> 39 - 40 - #include <mach/regs-s3c2443-clock.h> 41 - 42 - #include <plat/cpu-freq.h> 43 - 44 - #include <plat/clock.h> 45 - #include <plat/clock-clksrc.h> 46 - #include <plat/cpu.h> 47 - 48 - /* We currently have to assume that the system is running 49 - * from the XTPll input, and that all ***REFCLKs are being 50 - * fed from it, as we cannot read the state of OM[4] from 51 - * software. 52 - * 53 - * It would be possible for each board initialisation to 54 - * set the correct muxing at initialisation 55 - */ 56 - 57 - /* clock selections */ 58 - 59 - /* armdiv 60 - * 61 - * this clock is sourced from msysclk and can have a number of 62 - * divider values applied to it to then be fed into armclk. 63 - * The real clock definition is done in s3c2443-clock.c, 64 - * only the armdiv divisor table must be defined here. 65 - */ 66 - 67 - static unsigned int armdiv[16] = { 68 - [S3C2443_CLKDIV0_ARMDIV_1 >> S3C2443_CLKDIV0_ARMDIV_SHIFT] = 1, 69 - [S3C2443_CLKDIV0_ARMDIV_2 >> S3C2443_CLKDIV0_ARMDIV_SHIFT] = 2, 70 - [S3C2443_CLKDIV0_ARMDIV_3 >> S3C2443_CLKDIV0_ARMDIV_SHIFT] = 3, 71 - [S3C2443_CLKDIV0_ARMDIV_4 >> S3C2443_CLKDIV0_ARMDIV_SHIFT] = 4, 72 - [S3C2443_CLKDIV0_ARMDIV_6 >> S3C2443_CLKDIV0_ARMDIV_SHIFT] = 6, 73 - [S3C2443_CLKDIV0_ARMDIV_8 >> S3C2443_CLKDIV0_ARMDIV_SHIFT] = 8, 74 - [S3C2443_CLKDIV0_ARMDIV_12 >> S3C2443_CLKDIV0_ARMDIV_SHIFT] = 12, 75 - [S3C2443_CLKDIV0_ARMDIV_16 >> S3C2443_CLKDIV0_ARMDIV_SHIFT] = 16, 76 - }; 77 - 78 - /* hsspi 79 - * 80 - * high-speed spi clock, sourced from esysclk 81 - */ 82 - 83 - static struct clksrc_clk clk_hsspi = { 84 - .clk = { 85 - .name = "hsspi-if", 86 - .parent = &clk_esysclk.clk, 87 - .ctrlbit = S3C2443_SCLKCON_HSSPICLK, 88 - .enable = s3c2443_clkcon_enable_s, 89 - }, 90 - .reg_div = { .reg = S3C2443_CLKDIV1, .size = 2, .shift = 4 }, 91 - }; 92 - 93 - 94 - /* clk_hsmcc_div 95 - * 96 - * this clock is sourced from epll, and is fed through a divider, 97 - * to a mux controlled by sclkcon where either it or a extclk can 98 - * be fed to the hsmmc block 99 - */ 100 - 101 - static struct clksrc_clk clk_hsmmc_div = { 102 - .clk = { 103 - .name = "hsmmc-div", 104 - .devname = "s3c-sdhci.1", 105 - .parent = &clk_esysclk.clk, 106 - }, 107 - .reg_div = { .reg = S3C2443_CLKDIV1, .size = 2, .shift = 6 }, 108 - }; 109 - 110 - static int s3c2443_setparent_hsmmc(struct clk *clk, struct clk *parent) 111 - { 112 - unsigned long clksrc = __raw_readl(S3C2443_SCLKCON); 113 - 114 - clksrc &= ~(S3C2443_SCLKCON_HSMMCCLK_EXT | 115 - S3C2443_SCLKCON_HSMMCCLK_EPLL); 116 - 117 - if (parent == &clk_epll) 118 - clksrc |= S3C2443_SCLKCON_HSMMCCLK_EPLL; 119 - else if (parent == &clk_ext) 120 - clksrc |= S3C2443_SCLKCON_HSMMCCLK_EXT; 121 - else 122 - return -EINVAL; 123 - 124 - if (clk->usage > 0) { 125 - __raw_writel(clksrc, S3C2443_SCLKCON); 126 - } 127 - 128 - clk->parent = parent; 129 - return 0; 130 - } 131 - 132 - static int s3c2443_enable_hsmmc(struct clk *clk, int enable) 133 - { 134 - return s3c2443_setparent_hsmmc(clk, clk->parent); 135 - } 136 - 137 - static struct clk clk_hsmmc = { 138 - .name = "hsmmc-if", 139 - .devname = "s3c-sdhci.1", 140 - .parent = &clk_hsmmc_div.clk, 141 - .enable = s3c2443_enable_hsmmc, 142 - .ops = &(struct clk_ops) { 143 - .set_parent = s3c2443_setparent_hsmmc, 144 - }, 145 - }; 146 - 147 - /* standard clock definitions */ 148 - 149 - static struct clk init_clocks_off[] = { 150 - { 151 - .name = "sdi", 152 - .parent = &clk_p, 153 - .enable = s3c2443_clkcon_enable_p, 154 - .ctrlbit = S3C2443_PCLKCON_SDI, 155 - }, { 156 - .name = "spi", 157 - .devname = "s3c2410-spi.0", 158 - .parent = &clk_p, 159 - .enable = s3c2443_clkcon_enable_p, 160 - .ctrlbit = S3C2443_PCLKCON_SPI1, 161 - } 162 - }; 163 - 164 - /* clocks to add straight away */ 165 - 166 - static struct clksrc_clk *clksrcs[] __initdata = { 167 - &clk_hsspi, 168 - &clk_hsmmc_div, 169 - }; 170 - 171 - static struct clk *clks[] __initdata = { 172 - &clk_hsmmc, 173 - }; 174 - 175 - static struct clk_lookup s3c2443_clk_lookup[] = { 176 - CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &clk_hsmmc), 177 - CLKDEV_INIT("s3c2443-spi.0", "spi_busclk2", &clk_hsspi.clk), 178 - }; 179 - 180 - void __init s3c2443_init_clocks(int xtal) 181 - { 182 - unsigned long epllcon = __raw_readl(S3C2443_EPLLCON); 183 - int ptr; 184 - 185 - clk_epll.rate = s3c2443_get_epll(epllcon, xtal); 186 - clk_epll.parent = &clk_epllref.clk; 187 - 188 - s3c2443_common_init_clocks(xtal, s3c2443_get_mpll, 189 - armdiv, ARRAY_SIZE(armdiv), 190 - S3C2443_CLKDIV0_ARMDIV_MASK); 191 - 192 - s3c24xx_register_clocks(clks, ARRAY_SIZE(clks)); 193 - 194 - for (ptr = 0; ptr < ARRAY_SIZE(clksrcs); ptr++) 195 - s3c_register_clksrc(clksrcs[ptr], 1); 196 - 197 - /* We must be careful disabling the clocks we are not intending to 198 - * be using at boot time, as subsystems such as the LCD which do 199 - * their own DMA requests to the bus can cause the system to lockup 200 - * if they where in the middle of requesting bus access. 201 - * 202 - * Disabling the LCD clock if the LCD is active is very dangerous, 203 - * and therefore the bootloader should be careful to not enable 204 - * the LCD clock if it is not needed. 205 - */ 206 - 207 - /* install (and disable) the clocks we do not need immediately */ 208 - 209 - s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 210 - s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 211 - clkdev_add_table(s3c2443_clk_lookup, ARRAY_SIZE(s3c2443_clk_lookup)); 212 - }
-141
arch/arm/mach-s3c24xx/clock-s3c244x.c
··· 1 - /* linux/arch/arm/plat-s3c24xx/s3c24xx-clock.c 2 - * 3 - * Copyright (c) 2004-2008 Simtec Electronics 4 - * http://armlinux.simtec.co.uk/ 5 - * Ben Dooks <ben@simtec.co.uk> 6 - * 7 - * S3C2440/S3C2442 Common clock support 8 - * 9 - * This program is free software; you can redistribute it and/or modify 10 - * it under the terms of the GNU General Public License as published by 11 - * the Free Software Foundation; either version 2 of the License, or 12 - * (at your option) any later version. 13 - * 14 - * This program is distributed in the hope that it will be useful, 15 - * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 - * GNU General Public License for more details. 18 - * 19 - * You should have received a copy of the GNU General Public License 20 - * along with this program; if not, write to the Free Software 21 - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22 - */ 23 - 24 - #include <linux/init.h> 25 - #include <linux/module.h> 26 - #include <linux/kernel.h> 27 - #include <linux/list.h> 28 - #include <linux/errno.h> 29 - #include <linux/err.h> 30 - #include <linux/device.h> 31 - #include <linux/interrupt.h> 32 - #include <linux/ioport.h> 33 - #include <linux/clk.h> 34 - #include <linux/io.h> 35 - 36 - #include <mach/hardware.h> 37 - #include <linux/atomic.h> 38 - #include <asm/irq.h> 39 - 40 - #include <mach/regs-clock.h> 41 - 42 - #include <plat/clock.h> 43 - #include <plat/cpu.h> 44 - 45 - static int s3c2440_setparent_armclk(struct clk *clk, struct clk *parent) 46 - { 47 - unsigned long camdivn; 48 - unsigned long dvs; 49 - 50 - if (parent == &clk_f) 51 - dvs = 0; 52 - else if (parent == &clk_h) 53 - dvs = S3C2440_CAMDIVN_DVSEN; 54 - else 55 - return -EINVAL; 56 - 57 - clk->parent = parent; 58 - 59 - camdivn = __raw_readl(S3C2440_CAMDIVN); 60 - camdivn &= ~S3C2440_CAMDIVN_DVSEN; 61 - camdivn |= dvs; 62 - __raw_writel(camdivn, S3C2440_CAMDIVN); 63 - 64 - return 0; 65 - } 66 - 67 - static struct clk clk_arm = { 68 - .name = "armclk", 69 - .id = -1, 70 - .ops = &(struct clk_ops) { 71 - .set_parent = s3c2440_setparent_armclk, 72 - }, 73 - }; 74 - 75 - static int s3c244x_clk_add(struct device *dev, struct subsys_interface *sif) 76 - { 77 - unsigned long camdivn = __raw_readl(S3C2440_CAMDIVN); 78 - unsigned long clkdivn; 79 - struct clk *clock_upll; 80 - int ret; 81 - 82 - printk("S3C244X: Clock Support, DVS %s\n", 83 - (camdivn & S3C2440_CAMDIVN_DVSEN) ? "on" : "off"); 84 - 85 - clk_arm.parent = (camdivn & S3C2440_CAMDIVN_DVSEN) ? &clk_h : &clk_f; 86 - 87 - ret = s3c24xx_register_clock(&clk_arm); 88 - if (ret < 0) { 89 - printk(KERN_ERR "S3C24XX: Failed to add armclk (%d)\n", ret); 90 - return ret; 91 - } 92 - 93 - clock_upll = clk_get(NULL, "upll"); 94 - if (IS_ERR(clock_upll)) { 95 - printk(KERN_ERR "S3C244X: Failed to get upll clock\n"); 96 - return -ENOENT; 97 - } 98 - 99 - /* check rate of UPLL, and if it is near 96MHz, then change 100 - * to using half the UPLL rate for the system */ 101 - 102 - if (clk_get_rate(clock_upll) > (94 * MHZ)) { 103 - clk_usb_bus.rate = clk_get_rate(clock_upll) / 2; 104 - 105 - spin_lock(&clocks_lock); 106 - 107 - clkdivn = __raw_readl(S3C2410_CLKDIVN); 108 - clkdivn |= S3C2440_CLKDIVN_UCLK; 109 - __raw_writel(clkdivn, S3C2410_CLKDIVN); 110 - 111 - spin_unlock(&clocks_lock); 112 - } 113 - 114 - return 0; 115 - } 116 - 117 - static struct subsys_interface s3c2440_clk_interface = { 118 - .name = "s3c2440_clk", 119 - .subsys = &s3c2440_subsys, 120 - .add_dev = s3c244x_clk_add, 121 - }; 122 - 123 - static int s3c2440_clk_init(void) 124 - { 125 - return subsys_interface_register(&s3c2440_clk_interface); 126 - } 127 - 128 - arch_initcall(s3c2440_clk_init); 129 - 130 - static struct subsys_interface s3c2442_clk_interface = { 131 - .name = "s3c2442_clk", 132 - .subsys = &s3c2442_subsys, 133 - .add_dev = s3c244x_clk_add, 134 - }; 135 - 136 - static int s3c2442_clk_init(void) 137 - { 138 - return subsys_interface_register(&s3c2442_clk_interface); 139 - } 140 - 141 - arch_initcall(s3c2442_clk_init);
-675
arch/arm/mach-s3c24xx/common-s3c2443.c
··· 1 - /* 2 - * Common code for SoCs starting with the S3C2443 3 - * 4 - * Copyright (c) 2007, 2010 Simtec Electronics 5 - * Ben Dooks <ben@simtec.co.uk> 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 as published by 9 - * the Free Software Foundation; either version 2 of the License, or 10 - * (at your option) any later version. 11 - * 12 - * This program is distributed in the hope that it will be useful, 13 - * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 - * GNU General Public License for more details. 16 - */ 17 - 18 - #include <linux/init.h> 19 - #include <linux/clk.h> 20 - #include <linux/io.h> 21 - 22 - #include <mach/regs-s3c2443-clock.h> 23 - 24 - #include <plat/clock.h> 25 - #include <plat/clock-clksrc.h> 26 - #include <plat/cpu.h> 27 - 28 - #include <plat/cpu-freq.h> 29 - 30 - 31 - static int s3c2443_gate(void __iomem *reg, struct clk *clk, int enable) 32 - { 33 - u32 ctrlbit = clk->ctrlbit; 34 - u32 con = __raw_readl(reg); 35 - 36 - if (enable) 37 - con |= ctrlbit; 38 - else 39 - con &= ~ctrlbit; 40 - 41 - __raw_writel(con, reg); 42 - return 0; 43 - } 44 - 45 - int s3c2443_clkcon_enable_h(struct clk *clk, int enable) 46 - { 47 - return s3c2443_gate(S3C2443_HCLKCON, clk, enable); 48 - } 49 - 50 - int s3c2443_clkcon_enable_p(struct clk *clk, int enable) 51 - { 52 - return s3c2443_gate(S3C2443_PCLKCON, clk, enable); 53 - } 54 - 55 - int s3c2443_clkcon_enable_s(struct clk *clk, int enable) 56 - { 57 - return s3c2443_gate(S3C2443_SCLKCON, clk, enable); 58 - } 59 - 60 - /* mpllref is a direct descendant of clk_xtal by default, but it is not 61 - * elided as the EPLL can be either sourced by the XTAL or EXTCLK and as 62 - * such directly equating the two source clocks is impossible. 63 - */ 64 - static struct clk clk_mpllref = { 65 - .name = "mpllref", 66 - .parent = &clk_xtal, 67 - }; 68 - 69 - static struct clk *clk_epllref_sources[] = { 70 - [0] = &clk_mpllref, 71 - [1] = &clk_mpllref, 72 - [2] = &clk_xtal, 73 - [3] = &clk_ext, 74 - }; 75 - 76 - struct clksrc_clk clk_epllref = { 77 - .clk = { 78 - .name = "epllref", 79 - }, 80 - .sources = &(struct clksrc_sources) { 81 - .sources = clk_epllref_sources, 82 - .nr_sources = ARRAY_SIZE(clk_epllref_sources), 83 - }, 84 - .reg_src = { .reg = S3C2443_CLKSRC, .size = 2, .shift = 7 }, 85 - }; 86 - 87 - /* esysclk 88 - * 89 - * this is sourced from either the EPLL or the EPLLref clock 90 - */ 91 - 92 - static struct clk *clk_sysclk_sources[] = { 93 - [0] = &clk_epllref.clk, 94 - [1] = &clk_epll, 95 - }; 96 - 97 - struct clksrc_clk clk_esysclk = { 98 - .clk = { 99 - .name = "esysclk", 100 - .parent = &clk_epll, 101 - }, 102 - .sources = &(struct clksrc_sources) { 103 - .sources = clk_sysclk_sources, 104 - .nr_sources = ARRAY_SIZE(clk_sysclk_sources), 105 - }, 106 - .reg_src = { .reg = S3C2443_CLKSRC, .size = 1, .shift = 6 }, 107 - }; 108 - 109 - static unsigned long s3c2443_getrate_mdivclk(struct clk *clk) 110 - { 111 - unsigned long parent_rate = clk_get_rate(clk->parent); 112 - unsigned long div = __raw_readl(S3C2443_CLKDIV0); 113 - 114 - div &= S3C2443_CLKDIV0_EXTDIV_MASK; 115 - div >>= (S3C2443_CLKDIV0_EXTDIV_SHIFT-1); /* x2 */ 116 - 117 - return parent_rate / (div + 1); 118 - } 119 - 120 - static struct clk clk_mdivclk = { 121 - .name = "mdivclk", 122 - .parent = &clk_mpllref, 123 - .ops = &(struct clk_ops) { 124 - .get_rate = s3c2443_getrate_mdivclk, 125 - }, 126 - }; 127 - 128 - static struct clk *clk_msysclk_sources[] = { 129 - [0] = &clk_mpllref, 130 - [1] = &clk_mpll, 131 - [2] = &clk_mdivclk, 132 - [3] = &clk_mpllref, 133 - }; 134 - 135 - static struct clksrc_clk clk_msysclk = { 136 - .clk = { 137 - .name = "msysclk", 138 - .parent = &clk_xtal, 139 - }, 140 - .sources = &(struct clksrc_sources) { 141 - .sources = clk_msysclk_sources, 142 - .nr_sources = ARRAY_SIZE(clk_msysclk_sources), 143 - }, 144 - .reg_src = { .reg = S3C2443_CLKSRC, .size = 2, .shift = 3 }, 145 - }; 146 - 147 - /* prediv 148 - * 149 - * this divides the msysclk down to pass to h/p/etc. 150 - */ 151 - 152 - static unsigned long s3c2443_prediv_getrate(struct clk *clk) 153 - { 154 - unsigned long rate = clk_get_rate(clk->parent); 155 - unsigned long clkdiv0 = __raw_readl(S3C2443_CLKDIV0); 156 - 157 - clkdiv0 &= S3C2443_CLKDIV0_PREDIV_MASK; 158 - clkdiv0 >>= S3C2443_CLKDIV0_PREDIV_SHIFT; 159 - 160 - return rate / (clkdiv0 + 1); 161 - } 162 - 163 - static struct clk clk_prediv = { 164 - .name = "prediv", 165 - .parent = &clk_msysclk.clk, 166 - .ops = &(struct clk_ops) { 167 - .get_rate = s3c2443_prediv_getrate, 168 - }, 169 - }; 170 - 171 - /* hclk divider 172 - * 173 - * divides the prediv and provides the hclk. 174 - */ 175 - 176 - static unsigned long s3c2443_hclkdiv_getrate(struct clk *clk) 177 - { 178 - unsigned long rate = clk_get_rate(clk->parent); 179 - unsigned long clkdiv0 = __raw_readl(S3C2443_CLKDIV0); 180 - 181 - clkdiv0 &= S3C2443_CLKDIV0_HCLKDIV_MASK; 182 - 183 - return rate / (clkdiv0 + 1); 184 - } 185 - 186 - static struct clk_ops clk_h_ops = { 187 - .get_rate = s3c2443_hclkdiv_getrate, 188 - }; 189 - 190 - /* pclk divider 191 - * 192 - * divides the hclk and provides the pclk. 193 - */ 194 - 195 - static unsigned long s3c2443_pclkdiv_getrate(struct clk *clk) 196 - { 197 - unsigned long rate = clk_get_rate(clk->parent); 198 - unsigned long clkdiv0 = __raw_readl(S3C2443_CLKDIV0); 199 - 200 - clkdiv0 = ((clkdiv0 & S3C2443_CLKDIV0_HALF_PCLK) ? 1 : 0); 201 - 202 - return rate / (clkdiv0 + 1); 203 - } 204 - 205 - static struct clk_ops clk_p_ops = { 206 - .get_rate = s3c2443_pclkdiv_getrate, 207 - }; 208 - 209 - /* armdiv 210 - * 211 - * this clock is sourced from msysclk and can have a number of 212 - * divider values applied to it to then be fed into armclk. 213 - */ 214 - 215 - static unsigned int *armdiv; 216 - static int nr_armdiv; 217 - static int armdivmask; 218 - 219 - static unsigned long s3c2443_armclk_roundrate(struct clk *clk, 220 - unsigned long rate) 221 - { 222 - unsigned long parent = clk_get_rate(clk->parent); 223 - unsigned long calc; 224 - unsigned best = 256; /* bigger than any value */ 225 - unsigned div; 226 - int ptr; 227 - 228 - if (!nr_armdiv) 229 - return -EINVAL; 230 - 231 - for (ptr = 0; ptr < nr_armdiv; ptr++) { 232 - div = armdiv[ptr]; 233 - if (div) { 234 - /* cpufreq provides 266mhz as 266666000 not 266666666 */ 235 - calc = (parent / div / 1000) * 1000; 236 - if (calc <= rate && div < best) 237 - best = div; 238 - } 239 - } 240 - 241 - return parent / best; 242 - } 243 - 244 - static unsigned long s3c2443_armclk_getrate(struct clk *clk) 245 - { 246 - unsigned long rate = clk_get_rate(clk->parent); 247 - unsigned long clkcon0; 248 - int val; 249 - 250 - if (!nr_armdiv || !armdivmask) 251 - return -EINVAL; 252 - 253 - clkcon0 = __raw_readl(S3C2443_CLKDIV0); 254 - clkcon0 &= armdivmask; 255 - val = clkcon0 >> S3C2443_CLKDIV0_ARMDIV_SHIFT; 256 - 257 - return rate / armdiv[val]; 258 - } 259 - 260 - static int s3c2443_armclk_setrate(struct clk *clk, unsigned long rate) 261 - { 262 - unsigned long parent = clk_get_rate(clk->parent); 263 - unsigned long calc; 264 - unsigned div; 265 - unsigned best = 256; /* bigger than any value */ 266 - int ptr; 267 - int val = -1; 268 - 269 - if (!nr_armdiv || !armdivmask) 270 - return -EINVAL; 271 - 272 - for (ptr = 0; ptr < nr_armdiv; ptr++) { 273 - div = armdiv[ptr]; 274 - if (div) { 275 - /* cpufreq provides 266mhz as 266666000 not 266666666 */ 276 - calc = (parent / div / 1000) * 1000; 277 - if (calc <= rate && div < best) { 278 - best = div; 279 - val = ptr; 280 - } 281 - } 282 - } 283 - 284 - if (val >= 0) { 285 - unsigned long clkcon0; 286 - 287 - clkcon0 = __raw_readl(S3C2443_CLKDIV0); 288 - clkcon0 &= ~armdivmask; 289 - clkcon0 |= val << S3C2443_CLKDIV0_ARMDIV_SHIFT; 290 - __raw_writel(clkcon0, S3C2443_CLKDIV0); 291 - } 292 - 293 - return (val == -1) ? -EINVAL : 0; 294 - } 295 - 296 - static struct clk clk_armdiv = { 297 - .name = "armdiv", 298 - .parent = &clk_msysclk.clk, 299 - .ops = &(struct clk_ops) { 300 - .round_rate = s3c2443_armclk_roundrate, 301 - .get_rate = s3c2443_armclk_getrate, 302 - .set_rate = s3c2443_armclk_setrate, 303 - }, 304 - }; 305 - 306 - /* armclk 307 - * 308 - * this is the clock fed into the ARM core itself, from armdiv or from hclk. 309 - */ 310 - 311 - static struct clk *clk_arm_sources[] = { 312 - [0] = &clk_armdiv, 313 - [1] = &clk_h, 314 - }; 315 - 316 - static struct clksrc_clk clk_arm = { 317 - .clk = { 318 - .name = "armclk", 319 - }, 320 - .sources = &(struct clksrc_sources) { 321 - .sources = clk_arm_sources, 322 - .nr_sources = ARRAY_SIZE(clk_arm_sources), 323 - }, 324 - .reg_src = { .reg = S3C2443_CLKDIV0, .size = 1, .shift = 13 }, 325 - }; 326 - 327 - /* usbhost 328 - * 329 - * usb host bus-clock, usually 48MHz to provide USB bus clock timing 330 - */ 331 - 332 - static struct clksrc_clk clk_usb_bus_host = { 333 - .clk = { 334 - .name = "usb-bus-host-parent", 335 - .parent = &clk_esysclk.clk, 336 - .ctrlbit = S3C2443_SCLKCON_USBHOST, 337 - .enable = s3c2443_clkcon_enable_s, 338 - }, 339 - .reg_div = { .reg = S3C2443_CLKDIV1, .size = 2, .shift = 4 }, 340 - }; 341 - 342 - /* common clksrc clocks */ 343 - 344 - static struct clksrc_clk clksrc_clks[] = { 345 - { 346 - /* camera interface bus-clock, divided down from esysclk */ 347 - .clk = { 348 - .name = "camif-upll", /* same as 2440 name */ 349 - .parent = &clk_esysclk.clk, 350 - .ctrlbit = S3C2443_SCLKCON_CAMCLK, 351 - .enable = s3c2443_clkcon_enable_s, 352 - }, 353 - .reg_div = { .reg = S3C2443_CLKDIV1, .size = 4, .shift = 26 }, 354 - }, { 355 - .clk = { 356 - .name = "display-if", 357 - .parent = &clk_esysclk.clk, 358 - .ctrlbit = S3C2443_SCLKCON_DISPCLK, 359 - .enable = s3c2443_clkcon_enable_s, 360 - }, 361 - .reg_div = { .reg = S3C2443_CLKDIV1, .size = 8, .shift = 16 }, 362 - }, 363 - }; 364 - 365 - static struct clksrc_clk clk_esys_uart = { 366 - /* ART baud-rate clock sourced from esysclk via a divisor */ 367 - .clk = { 368 - .name = "uartclk", 369 - .parent = &clk_esysclk.clk, 370 - }, 371 - .reg_div = { .reg = S3C2443_CLKDIV1, .size = 4, .shift = 8 }, 372 - }; 373 - 374 - static struct clk clk_i2s_ext = { 375 - .name = "i2s-ext", 376 - }; 377 - 378 - /* i2s_eplldiv 379 - * 380 - * This clock is the output from the I2S divisor of ESYSCLK, and is separate 381 - * from the mux that comes after it (cannot merge into one single clock) 382 - */ 383 - 384 - static struct clksrc_clk clk_i2s_eplldiv = { 385 - .clk = { 386 - .name = "i2s-eplldiv", 387 - .parent = &clk_esysclk.clk, 388 - }, 389 - .reg_div = { .reg = S3C2443_CLKDIV1, .size = 4, .shift = 12, }, 390 - }; 391 - 392 - /* i2s-ref 393 - * 394 - * i2s bus reference clock, selectable from external, esysclk or epllref 395 - * 396 - * Note, this used to be two clocks, but was compressed into one. 397 - */ 398 - 399 - static struct clk *clk_i2s_srclist[] = { 400 - [0] = &clk_i2s_eplldiv.clk, 401 - [1] = &clk_i2s_ext, 402 - [2] = &clk_epllref.clk, 403 - [3] = &clk_epllref.clk, 404 - }; 405 - 406 - static struct clksrc_clk clk_i2s = { 407 - .clk = { 408 - .name = "i2s-if", 409 - .ctrlbit = S3C2443_SCLKCON_I2SCLK, 410 - .enable = s3c2443_clkcon_enable_s, 411 - 412 - }, 413 - .sources = &(struct clksrc_sources) { 414 - .sources = clk_i2s_srclist, 415 - .nr_sources = ARRAY_SIZE(clk_i2s_srclist), 416 - }, 417 - .reg_src = { .reg = S3C2443_CLKSRC, .size = 2, .shift = 14 }, 418 - }; 419 - 420 - static struct clk init_clocks_off[] = { 421 - { 422 - .name = "iis", 423 - .parent = &clk_p, 424 - .enable = s3c2443_clkcon_enable_p, 425 - .ctrlbit = S3C2443_PCLKCON_IIS, 426 - }, { 427 - .name = "adc", 428 - .parent = &clk_p, 429 - .enable = s3c2443_clkcon_enable_p, 430 - .ctrlbit = S3C2443_PCLKCON_ADC, 431 - }, { 432 - .name = "i2c", 433 - .parent = &clk_p, 434 - .enable = s3c2443_clkcon_enable_p, 435 - .ctrlbit = S3C2443_PCLKCON_IIC, 436 - } 437 - }; 438 - 439 - static struct clk init_clocks[] = { 440 - { 441 - .name = "dma.0", 442 - .parent = &clk_h, 443 - .enable = s3c2443_clkcon_enable_h, 444 - .ctrlbit = S3C2443_HCLKCON_DMA0, 445 - }, { 446 - .name = "dma.1", 447 - .parent = &clk_h, 448 - .enable = s3c2443_clkcon_enable_h, 449 - .ctrlbit = S3C2443_HCLKCON_DMA1, 450 - }, { 451 - .name = "dma.2", 452 - .parent = &clk_h, 453 - .enable = s3c2443_clkcon_enable_h, 454 - .ctrlbit = S3C2443_HCLKCON_DMA2, 455 - }, { 456 - .name = "dma.3", 457 - .parent = &clk_h, 458 - .enable = s3c2443_clkcon_enable_h, 459 - .ctrlbit = S3C2443_HCLKCON_DMA3, 460 - }, { 461 - .name = "dma.4", 462 - .parent = &clk_h, 463 - .enable = s3c2443_clkcon_enable_h, 464 - .ctrlbit = S3C2443_HCLKCON_DMA4, 465 - }, { 466 - .name = "dma.5", 467 - .parent = &clk_h, 468 - .enable = s3c2443_clkcon_enable_h, 469 - .ctrlbit = S3C2443_HCLKCON_DMA5, 470 - }, { 471 - .name = "gpio", 472 - .parent = &clk_p, 473 - .enable = s3c2443_clkcon_enable_p, 474 - .ctrlbit = S3C2443_PCLKCON_GPIO, 475 - }, { 476 - .name = "usb-host", 477 - .parent = &clk_h, 478 - .enable = s3c2443_clkcon_enable_h, 479 - .ctrlbit = S3C2443_HCLKCON_USBH, 480 - }, { 481 - .name = "usb-device", 482 - .parent = &clk_h, 483 - .enable = s3c2443_clkcon_enable_h, 484 - .ctrlbit = S3C2443_HCLKCON_USBD, 485 - }, { 486 - .name = "lcd", 487 - .parent = &clk_h, 488 - .enable = s3c2443_clkcon_enable_h, 489 - .ctrlbit = S3C2443_HCLKCON_LCDC, 490 - 491 - }, { 492 - .name = "timers", 493 - .parent = &clk_p, 494 - .enable = s3c2443_clkcon_enable_p, 495 - .ctrlbit = S3C2443_PCLKCON_PWMT, 496 - }, { 497 - .name = "cfc", 498 - .parent = &clk_h, 499 - .enable = s3c2443_clkcon_enable_h, 500 - .ctrlbit = S3C2443_HCLKCON_CFC, 501 - }, { 502 - .name = "ssmc", 503 - .parent = &clk_h, 504 - .enable = s3c2443_clkcon_enable_h, 505 - .ctrlbit = S3C2443_HCLKCON_SSMC, 506 - }, { 507 - .name = "uart", 508 - .devname = "s3c2440-uart.0", 509 - .parent = &clk_p, 510 - .enable = s3c2443_clkcon_enable_p, 511 - .ctrlbit = S3C2443_PCLKCON_UART0, 512 - }, { 513 - .name = "uart", 514 - .devname = "s3c2440-uart.1", 515 - .parent = &clk_p, 516 - .enable = s3c2443_clkcon_enable_p, 517 - .ctrlbit = S3C2443_PCLKCON_UART1, 518 - }, { 519 - .name = "uart", 520 - .devname = "s3c2440-uart.2", 521 - .parent = &clk_p, 522 - .enable = s3c2443_clkcon_enable_p, 523 - .ctrlbit = S3C2443_PCLKCON_UART2, 524 - }, { 525 - .name = "uart", 526 - .devname = "s3c2440-uart.3", 527 - .parent = &clk_p, 528 - .enable = s3c2443_clkcon_enable_p, 529 - .ctrlbit = S3C2443_PCLKCON_UART3, 530 - }, { 531 - .name = "rtc", 532 - .parent = &clk_p, 533 - .enable = s3c2443_clkcon_enable_p, 534 - .ctrlbit = S3C2443_PCLKCON_RTC, 535 - }, { 536 - .name = "watchdog", 537 - .parent = &clk_p, 538 - .ctrlbit = S3C2443_PCLKCON_WDT, 539 - }, { 540 - .name = "ac97", 541 - .parent = &clk_p, 542 - .ctrlbit = S3C2443_PCLKCON_AC97, 543 - }, { 544 - .name = "nand", 545 - .parent = &clk_h, 546 - }, { 547 - .name = "usb-bus-host", 548 - .parent = &clk_usb_bus_host.clk, 549 - } 550 - }; 551 - 552 - static struct clk hsmmc1_clk = { 553 - .name = "hsmmc", 554 - .devname = "s3c-sdhci.1", 555 - .parent = &clk_h, 556 - .enable = s3c2443_clkcon_enable_h, 557 - .ctrlbit = S3C2443_HCLKCON_HSMMC, 558 - }; 559 - 560 - static struct clk hsspi_clk = { 561 - .name = "spi", 562 - .devname = "s3c2443-spi.0", 563 - .parent = &clk_p, 564 - .enable = s3c2443_clkcon_enable_p, 565 - .ctrlbit = S3C2443_PCLKCON_HSSPI, 566 - }; 567 - 568 - /* EPLLCON compatible enough to get on/off information */ 569 - 570 - void __init_or_cpufreq s3c2443_common_setup_clocks(pll_fn get_mpll) 571 - { 572 - unsigned long epllcon = __raw_readl(S3C2443_EPLLCON); 573 - unsigned long mpllcon = __raw_readl(S3C2443_MPLLCON); 574 - struct clk *xtal_clk; 575 - unsigned long xtal; 576 - unsigned long pll; 577 - int ptr; 578 - 579 - xtal_clk = clk_get(NULL, "xtal"); 580 - xtal = clk_get_rate(xtal_clk); 581 - clk_put(xtal_clk); 582 - 583 - pll = get_mpll(mpllcon, xtal); 584 - clk_msysclk.clk.rate = pll; 585 - clk_mpll.rate = pll; 586 - 587 - printk("CPU: MPLL %s %ld.%03ld MHz, cpu %ld.%03ld MHz, mem %ld.%03ld MHz, pclk %ld.%03ld MHz\n", 588 - (mpllcon & S3C2443_PLLCON_OFF) ? "off" : "on", 589 - print_mhz(pll), print_mhz(clk_get_rate(&clk_armdiv)), 590 - print_mhz(clk_get_rate(&clk_h)), 591 - print_mhz(clk_get_rate(&clk_p))); 592 - 593 - for (ptr = 0; ptr < ARRAY_SIZE(clksrc_clks); ptr++) 594 - s3c_set_clksrc(&clksrc_clks[ptr], true); 595 - 596 - /* ensure usb bus clock is within correct rate of 48MHz */ 597 - 598 - if (clk_get_rate(&clk_usb_bus_host.clk) != (48 * 1000 * 1000)) { 599 - printk(KERN_INFO "Warning: USB host bus not at 48MHz\n"); 600 - clk_set_rate(&clk_usb_bus_host.clk, 48*1000*1000); 601 - } 602 - 603 - printk("CPU: EPLL %s %ld.%03ld MHz, usb-bus %ld.%03ld MHz\n", 604 - (epllcon & S3C2443_PLLCON_OFF) ? "off" : "on", 605 - print_mhz(clk_get_rate(&clk_epll)), 606 - print_mhz(clk_get_rate(&clk_usb_bus))); 607 - } 608 - 609 - static struct clk *clks[] __initdata = { 610 - &clk_prediv, 611 - &clk_mpllref, 612 - &clk_mdivclk, 613 - &clk_ext, 614 - &clk_epll, 615 - &clk_usb_bus, 616 - &clk_armdiv, 617 - &hsmmc1_clk, 618 - &hsspi_clk, 619 - }; 620 - 621 - static struct clksrc_clk *clksrcs[] __initdata = { 622 - &clk_i2s_eplldiv, 623 - &clk_i2s, 624 - &clk_usb_bus_host, 625 - &clk_epllref, 626 - &clk_esysclk, 627 - &clk_msysclk, 628 - &clk_arm, 629 - }; 630 - 631 - static struct clk_lookup s3c2443_clk_lookup[] = { 632 - CLKDEV_INIT(NULL, "clk_uart_baud1", &s3c24xx_uclk), 633 - CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_p), 634 - CLKDEV_INIT(NULL, "clk_uart_baud3", &clk_esys_uart.clk), 635 - CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.0", &hsmmc1_clk), 636 - CLKDEV_INIT("s3c2443-spi.0", "spi_busclk0", &hsspi_clk), 637 - }; 638 - 639 - void __init s3c2443_common_init_clocks(int xtal, pll_fn get_mpll, 640 - unsigned int *divs, int nr_divs, 641 - int divmask) 642 - { 643 - int ptr; 644 - 645 - armdiv = divs; 646 - nr_armdiv = nr_divs; 647 - armdivmask = divmask; 648 - 649 - /* s3c2443 parents h clock from prediv */ 650 - clk_h.parent = &clk_prediv; 651 - clk_h.ops = &clk_h_ops; 652 - 653 - /* and p clock from h clock */ 654 - clk_p.parent = &clk_h; 655 - clk_p.ops = &clk_p_ops; 656 - 657 - clk_usb_bus.parent = &clk_usb_bus_host.clk; 658 - clk_epll.parent = &clk_epllref.clk; 659 - 660 - s3c24xx_register_baseclocks(xtal); 661 - s3c24xx_register_clocks(clks, ARRAY_SIZE(clks)); 662 - 663 - for (ptr = 0; ptr < ARRAY_SIZE(clksrcs); ptr++) 664 - s3c_register_clksrc(clksrcs[ptr], 1); 665 - 666 - s3c_register_clksrc(clksrc_clks, ARRAY_SIZE(clksrc_clks)); 667 - s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks)); 668 - 669 - /* See s3c2443/etc notes on disabling clocks at init time */ 670 - s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 671 - s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 672 - clkdev_add_table(s3c2443_clk_lookup, ARRAY_SIZE(s3c2443_clk_lookup)); 673 - 674 - s3c2443_common_setup_clocks(get_mpll); 675 - }
+60 -25
arch/arm/mach-s3c24xx/common.c
··· 53 53 #include <plat/cpu-freq.h> 54 54 #include <plat/pll.h> 55 55 #include <plat/pwm-core.h> 56 + #include <plat/watchdog-reset.h> 56 57 57 58 #include "common.h" 58 59 ··· 74 73 .idcode = 0x32410000, 75 74 .idmask = 0xffffffff, 76 75 .map_io = s3c2410_map_io, 77 - .init_clocks = s3c2410_init_clocks, 78 76 .init_uarts = s3c2410_init_uarts, 79 77 .init = s3c2410_init, 80 78 .name = name_s3c2410 ··· 82 82 .idcode = 0x32410002, 83 83 .idmask = 0xffffffff, 84 84 .map_io = s3c2410_map_io, 85 - .init_clocks = s3c2410_init_clocks, 86 85 .init_uarts = s3c2410_init_uarts, 87 86 .init = s3c2410a_init, 88 87 .name = name_s3c2410a ··· 90 91 .idcode = 0x32440000, 91 92 .idmask = 0xffffffff, 92 93 .map_io = s3c2440_map_io, 93 - .init_clocks = s3c244x_init_clocks, 94 94 .init_uarts = s3c244x_init_uarts, 95 95 .init = s3c2440_init, 96 96 .name = name_s3c2440 ··· 98 100 .idcode = 0x32440001, 99 101 .idmask = 0xffffffff, 100 102 .map_io = s3c2440_map_io, 101 - .init_clocks = s3c244x_init_clocks, 102 103 .init_uarts = s3c244x_init_uarts, 103 104 .init = s3c2440_init, 104 105 .name = name_s3c2440a ··· 106 109 .idcode = 0x32440aaa, 107 110 .idmask = 0xffffffff, 108 111 .map_io = s3c2442_map_io, 109 - .init_clocks = s3c244x_init_clocks, 110 112 .init_uarts = s3c244x_init_uarts, 111 113 .init = s3c2442_init, 112 114 .name = name_s3c2442 ··· 114 118 .idcode = 0x32440aab, 115 119 .idmask = 0xffffffff, 116 120 .map_io = s3c2442_map_io, 117 - .init_clocks = s3c244x_init_clocks, 118 121 .init_uarts = s3c244x_init_uarts, 119 122 .init = s3c2442_init, 120 123 .name = name_s3c2442b ··· 122 127 .idcode = 0x32412001, 123 128 .idmask = 0xffffffff, 124 129 .map_io = s3c2412_map_io, 125 - .init_clocks = s3c2412_init_clocks, 126 130 .init_uarts = s3c2412_init_uarts, 127 131 .init = s3c2412_init, 128 132 .name = name_s3c2412, ··· 130 136 .idcode = 0x32412003, 131 137 .idmask = 0xffffffff, 132 138 .map_io = s3c2412_map_io, 133 - .init_clocks = s3c2412_init_clocks, 134 139 .init_uarts = s3c2412_init_uarts, 135 140 .init = s3c2412_init, 136 141 .name = name_s3c2412, ··· 138 145 .idcode = 0x32450003, 139 146 .idmask = 0xffffffff, 140 147 .map_io = s3c2416_map_io, 141 - .init_clocks = s3c2416_init_clocks, 142 148 .init_uarts = s3c2416_init_uarts, 143 149 .init = s3c2416_init, 144 150 .name = name_s3c2416, ··· 146 154 .idcode = 0x32443001, 147 155 .idmask = 0xffffffff, 148 156 .map_io = s3c2443_map_io, 149 - .init_clocks = s3c2443_init_clocks, 150 157 .init_uarts = s3c2443_init_uarts, 151 158 .init = s3c2443_init, 152 159 .name = name_s3c2443, ··· 306 315 .nr_resources = ARRAY_SIZE(s3c2410_uart3_resource), 307 316 }, 308 317 }; 309 - 310 - /* initialise all the clocks */ 311 - 312 - void __init_or_cpufreq s3c24xx_setup_clocks(unsigned long fclk, 313 - unsigned long hclk, 314 - unsigned long pclk) 315 - { 316 - clk_upll.rate = s3c24xx_get_pll(__raw_readl(S3C2410_UPLLCON), 317 - clk_xtal.rate); 318 - 319 - clk_mpll.rate = fclk; 320 - clk_h.rate = hclk; 321 - clk_p.rate = pclk; 322 - clk_f.rate = fclk; 323 - } 324 318 325 319 #if defined(CONFIG_CPU_S3C2410) || defined(CONFIG_CPU_S3C2412) || \ 326 320 defined(CONFIG_CPU_S3C2440) || defined(CONFIG_CPU_S3C2442) ··· 508 532 .dev = { 509 533 .platform_data = &s3c2443_dma_platdata, 510 534 }, 535 + }; 536 + #endif 537 + 538 + #if defined(CONFIG_COMMON_CLK) && defined(CONFIG_CPU_S3C2410) 539 + void __init s3c2410_init_clocks(int xtal) 540 + { 541 + s3c2410_common_clk_init(NULL, xtal, 0, S3C24XX_VA_CLKPWR); 542 + samsung_wdt_reset_init(S3C24XX_VA_WATCHDOG); 543 + } 544 + #endif 545 + 546 + #ifdef CONFIG_CPU_S3C2412 547 + void __init s3c2412_init_clocks(int xtal) 548 + { 549 + s3c2412_common_clk_init(NULL, xtal, 0, S3C24XX_VA_CLKPWR); 550 + } 551 + #endif 552 + 553 + #ifdef CONFIG_CPU_S3C2416 554 + void __init s3c2416_init_clocks(int xtal) 555 + { 556 + s3c2443_common_clk_init(NULL, xtal, 0, S3C24XX_VA_CLKPWR); 557 + } 558 + #endif 559 + 560 + #if defined(CONFIG_COMMON_CLK) && defined(CONFIG_CPU_S3C2440) 561 + void __init s3c2440_init_clocks(int xtal) 562 + { 563 + s3c2410_common_clk_init(NULL, xtal, 1, S3C24XX_VA_CLKPWR); 564 + samsung_wdt_reset_init(S3C24XX_VA_WATCHDOG); 565 + } 566 + #endif 567 + 568 + #if defined(CONFIG_COMMON_CLK) && defined(CONFIG_CPU_S3C2442) 569 + void __init s3c2442_init_clocks(int xtal) 570 + { 571 + s3c2410_common_clk_init(NULL, xtal, 2, S3C24XX_VA_CLKPWR); 572 + samsung_wdt_reset_init(S3C24XX_VA_WATCHDOG); 573 + } 574 + #endif 575 + 576 + #ifdef CONFIG_CPU_S3C2443 577 + void __init s3c2443_init_clocks(int xtal) 578 + { 579 + s3c2443_common_clk_init(NULL, xtal, 1, S3C24XX_VA_CLKPWR); 580 + } 581 + #endif 582 + 583 + #if defined(CONFIG_CPU_S3C2410) || defined(CONFIG_CPU_S3C2440) || \ 584 + defined(CONFIG_CPU_S3C2442) 585 + static struct resource s3c2410_dclk_resource[] = { 586 + [0] = DEFINE_RES_MEM(0x56000084, 0x4), 587 + }; 588 + 589 + struct platform_device s3c2410_device_dclk = { 590 + .name = "s3c2410-dclk", 591 + .id = 0, 592 + .num_resources = ARRAY_SIZE(s3c2410_dclk_resource), 593 + .resource = s3c2410_dclk_resource, 511 594 }; 512 595 #endif
+19 -2
arch/arm/mach-s3c24xx/common.h
··· 67 67 #if defined(CONFIG_CPU_S3C2440) || defined(CONFIG_CPU_S3C2442) 68 68 extern void s3c244x_map_io(void); 69 69 extern void s3c244x_init_uarts(struct s3c2410_uartcfg *cfg, int no); 70 - extern void s3c244x_init_clocks(int xtal); 71 70 extern void s3c244x_restart(enum reboot_mode mode, const char *cmd); 72 71 #else 73 - #define s3c244x_init_clocks NULL 74 72 #define s3c244x_init_uarts NULL 75 73 #endif 76 74 77 75 #ifdef CONFIG_CPU_S3C2440 78 76 extern int s3c2440_init(void); 79 77 extern void s3c2440_map_io(void); 78 + extern void s3c2440_init_clocks(int xtal); 80 79 extern void s3c2440_init_irq(void); 81 80 #else 82 81 #define s3c2440_init NULL ··· 85 86 #ifdef CONFIG_CPU_S3C2442 86 87 extern int s3c2442_init(void); 87 88 extern void s3c2442_map_io(void); 89 + extern void s3c2442_init_clocks(int xtal); 88 90 extern void s3c2442_init_irq(void); 89 91 #else 90 92 #define s3c2442_init NULL ··· 113 113 extern struct platform_device s3c2412_device_dma; 114 114 extern struct platform_device s3c2440_device_dma; 115 115 extern struct platform_device s3c2443_device_dma; 116 + 117 + extern struct platform_device s3c2410_device_dclk; 118 + 119 + #ifdef CONFIG_S3C2410_COMMON_CLK 120 + void __init s3c2410_common_clk_init(struct device_node *np, unsigned long xti_f, 121 + int current_soc, 122 + void __iomem *reg_base); 123 + #endif 124 + #ifdef CONFIG_S3C2412_COMMON_CLK 125 + void __init s3c2412_common_clk_init(struct device_node *np, unsigned long xti_f, 126 + unsigned long ext_f, void __iomem *reg_base); 127 + #endif 128 + #ifdef CONFIG_S3C2443_COMMON_CLK 129 + void __init s3c2443_common_clk_init(struct device_node *np, unsigned long xti_f, 130 + int current_soc, 131 + void __iomem *reg_base); 132 + #endif 116 133 117 134 #endif /* __ARCH_ARM_MACH_S3C24XX_COMMON_H */
+3 -1
arch/arm/mach-s3c24xx/cpufreq-utils.c
··· 14 14 #include <linux/errno.h> 15 15 #include <linux/cpufreq.h> 16 16 #include <linux/io.h> 17 + #include <linux/clk.h> 17 18 18 19 #include <mach/map.h> 19 20 #include <mach/regs-clock.h> ··· 61 60 */ 62 61 void s3c2410_set_fvco(struct s3c_cpufreq_config *cfg) 63 62 { 64 - __raw_writel(cfg->pll.driver_data, S3C2410_MPLLCON); 63 + if (!IS_ERR(cfg->mpll)) 64 + clk_set_rate(cfg->mpll, cfg->pll.frequency); 65 65 }
-18
arch/arm/mach-s3c24xx/include/mach/regs-clock.h
··· 42 42 #define S3C2410_CLKCON_IIS (1<<17) 43 43 #define S3C2410_CLKCON_SPI (1<<18) 44 44 45 - /* DCLKCON register addresses in gpio.h */ 46 - 47 - #define S3C2410_DCLKCON_DCLK0EN (1<<0) 48 - #define S3C2410_DCLKCON_DCLK0_PCLK (0<<1) 49 - #define S3C2410_DCLKCON_DCLK0_UCLK (1<<1) 50 - #define S3C2410_DCLKCON_DCLK0_DIV(x) (((x) - 1 )<<4) 51 - #define S3C2410_DCLKCON_DCLK0_CMP(x) (((x) - 1 )<<8) 52 - #define S3C2410_DCLKCON_DCLK0_DIV_MASK ((0xf)<<4) 53 - #define S3C2410_DCLKCON_DCLK0_CMP_MASK ((0xf)<<8) 54 - 55 - #define S3C2410_DCLKCON_DCLK1EN (1<<16) 56 - #define S3C2410_DCLKCON_DCLK1_PCLK (0<<17) 57 - #define S3C2410_DCLKCON_DCLK1_UCLK (1<<17) 58 - #define S3C2410_DCLKCON_DCLK1_DIV(x) (((x) - 1) <<20) 59 - #define S3C2410_DCLKCON_DCLK1_CMP(x) (((x) - 1) <<24) 60 - #define S3C2410_DCLKCON_DCLK1_DIV_MASK ((0xf) <<20) 61 - #define S3C2410_DCLKCON_DCLK1_CMP_MASK ((0xf) <<24) 62 - 63 45 #define S3C2410_CLKDIVN_PDIVN (1<<0) 64 46 #define S3C2410_CLKDIVN_HDIVN (1<<1) 65 47
-3
arch/arm/mach-s3c24xx/include/mach/regs-gpio.h
··· 457 457 458 458 /* miscellaneous control */ 459 459 #define S3C2410_MISCCR S3C2410_GPIOREG(0x80) 460 - #define S3C2410_DCLKCON S3C2410_GPIOREG(0x84) 461 - 462 - #define S3C24XX_DCLKCON S3C24XX_GPIOREG2(0x84) 463 460 464 461 /* see clock.h for dclk definitions */ 465 462
+7 -2
arch/arm/mach-s3c24xx/mach-amlm5900.c
··· 161 161 static void __init amlm5900_map_io(void) 162 162 { 163 163 s3c24xx_init_io(amlm5900_iodesc, ARRAY_SIZE(amlm5900_iodesc)); 164 - s3c24xx_init_clocks(0); 165 164 s3c24xx_init_uarts(amlm5900_uartcfgs, ARRAY_SIZE(amlm5900_uartcfgs)); 166 165 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 166 + } 167 + 168 + static void __init amlm5900_init_time(void) 169 + { 170 + s3c2410_init_clocks(12000000); 171 + samsung_timer_init(); 167 172 } 168 173 169 174 #ifdef CONFIG_FB_S3C2410 ··· 246 241 .map_io = amlm5900_map_io, 247 242 .init_irq = s3c2410_init_irq, 248 243 .init_machine = amlm5900_init, 249 - .init_time = samsung_timer_init, 244 + .init_time = amlm5900_init_time, 250 245 .restart = s3c2410_restart, 251 246 MACHINE_END
+8 -26
arch/arm/mach-s3c24xx/mach-anubis.c
··· 46 46 47 47 #include <net/ax88796.h> 48 48 49 - #include <plat/clock.h> 50 49 #include <plat/devs.h> 51 50 #include <plat/cpu.h> 52 51 #include <linux/platform_data/asoc-s3c24xx_simtec.h> ··· 351 352 /* Standard Anubis devices */ 352 353 353 354 static struct platform_device *anubis_devices[] __initdata = { 355 + &s3c2410_device_dclk, 354 356 &s3c_device_ohci, 355 357 &s3c_device_wdt, 356 358 &s3c_device_adc, ··· 362 362 &anubis_device_ide1, 363 363 &anubis_device_asix, 364 364 &anubis_device_sm501, 365 - }; 366 - 367 - static struct clk *anubis_clocks[] __initdata = { 368 - &s3c24xx_dclk0, 369 - &s3c24xx_dclk1, 370 - &s3c24xx_clkout0, 371 - &s3c24xx_clkout1, 372 - &s3c24xx_uclk, 373 365 }; 374 366 375 367 /* I2C devices. */ ··· 386 394 387 395 static void __init anubis_map_io(void) 388 396 { 389 - /* initialise the clocks */ 390 - 391 - s3c24xx_dclk0.parent = &clk_upll; 392 - s3c24xx_dclk0.rate = 12*1000*1000; 393 - 394 - s3c24xx_dclk1.parent = &clk_upll; 395 - s3c24xx_dclk1.rate = 24*1000*1000; 396 - 397 - s3c24xx_clkout0.parent = &s3c24xx_dclk0; 398 - s3c24xx_clkout1.parent = &s3c24xx_dclk1; 399 - 400 - s3c24xx_uclk.parent = &s3c24xx_clkout1; 401 - 402 - s3c24xx_register_clocks(anubis_clocks, ARRAY_SIZE(anubis_clocks)); 403 - 404 397 s3c24xx_init_io(anubis_iodesc, ARRAY_SIZE(anubis_iodesc)); 405 - s3c24xx_init_clocks(0); 406 398 s3c24xx_init_uarts(anubis_uartcfgs, ARRAY_SIZE(anubis_uartcfgs)); 407 399 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 408 400 ··· 402 426 gpio_request_one(S3C2410_GPA(0), GPIOF_OUT_INIT_HIGH, NULL); 403 427 gpio_free(S3C2410_GPA(0)); 404 428 } 429 + } 430 + 431 + static void __init anubis_init_time(void) 432 + { 433 + s3c2440_init_clocks(12000000); 434 + samsung_timer_init(); 405 435 } 406 436 407 437 static void __init anubis_init(void) ··· 429 447 .map_io = anubis_map_io, 430 448 .init_machine = anubis_init, 431 449 .init_irq = s3c2440_init_irq, 432 - .init_time = samsung_timer_init, 450 + .init_time = anubis_init_time, 433 451 .restart = s3c244x_restart, 434 452 MACHINE_END
+7 -3
arch/arm/mach-s3c24xx/mach-at2440evb.c
··· 45 45 #include <linux/mtd/nand_ecc.h> 46 46 #include <linux/mtd/partitions.h> 47 47 48 - #include <plat/clock.h> 49 48 #include <plat/devs.h> 50 49 #include <plat/cpu.h> 51 50 #include <linux/platform_data/mmc-s3cmci.h> ··· 191 192 static void __init at2440evb_map_io(void) 192 193 { 193 194 s3c24xx_init_io(at2440evb_iodesc, ARRAY_SIZE(at2440evb_iodesc)); 194 - s3c24xx_init_clocks(16934400); 195 195 s3c24xx_init_uarts(at2440evb_uartcfgs, ARRAY_SIZE(at2440evb_uartcfgs)); 196 196 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 197 + } 198 + 199 + static void __init at2440evb_init_time(void) 200 + { 201 + s3c2440_init_clocks(16934400); 202 + samsung_timer_init(); 197 203 } 198 204 199 205 static void __init at2440evb_init(void) ··· 217 213 .map_io = at2440evb_map_io, 218 214 .init_machine = at2440evb_init, 219 215 .init_irq = s3c2440_init_irq, 220 - .init_time = samsung_timer_init, 216 + .init_time = at2440evb_init_time, 221 217 .restart = s3c244x_restart, 222 218 MACHINE_END
+8 -26
arch/arm/mach-s3c24xx/mach-bast.c
··· 51 51 #include <mach/regs-lcd.h> 52 52 #include <mach/gpio-samsung.h> 53 53 54 - #include <plat/clock.h> 55 54 #include <plat/cpu.h> 56 55 #include <plat/cpu-freq.h> 57 56 #include <plat/devs.h> ··· 522 523 // cat /sys/devices/platform/s3c24xx-adc/s3c-hwmon/in_0 523 524 524 525 static struct platform_device *bast_devices[] __initdata = { 526 + &s3c2410_device_dclk, 525 527 &s3c_device_ohci, 526 528 &s3c_device_lcd, 527 529 &s3c_device_wdt, ··· 535 535 &bast_device_asix, 536 536 &bast_device_axpp, 537 537 &bast_sio, 538 - }; 539 - 540 - static struct clk *bast_clocks[] __initdata = { 541 - &s3c24xx_dclk0, 542 - &s3c24xx_dclk1, 543 - &s3c24xx_clkout0, 544 - &s3c24xx_clkout1, 545 - &s3c24xx_uclk, 546 538 }; 547 539 548 540 static struct s3c_cpufreq_board __initdata bast_cpufreq = { ··· 550 558 551 559 static void __init bast_map_io(void) 552 560 { 553 - /* initialise the clocks */ 554 - 555 - s3c24xx_dclk0.parent = &clk_upll; 556 - s3c24xx_dclk0.rate = 12*1000*1000; 557 - 558 - s3c24xx_dclk1.parent = &clk_upll; 559 - s3c24xx_dclk1.rate = 24*1000*1000; 560 - 561 - s3c24xx_clkout0.parent = &s3c24xx_dclk0; 562 - s3c24xx_clkout1.parent = &s3c24xx_dclk1; 563 - 564 - s3c24xx_uclk.parent = &s3c24xx_clkout1; 565 - 566 - s3c24xx_register_clocks(bast_clocks, ARRAY_SIZE(bast_clocks)); 567 - 568 561 s3c_hwmon_set_platdata(&bast_hwmon_info); 569 562 570 563 s3c24xx_init_io(bast_iodesc, ARRAY_SIZE(bast_iodesc)); 571 - s3c24xx_init_clocks(0); 572 564 s3c24xx_init_uarts(bast_uartcfgs, ARRAY_SIZE(bast_uartcfgs)); 573 565 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 566 + } 567 + 568 + static void __init bast_init_time(void) 569 + { 570 + s3c2410_init_clocks(12000000); 571 + samsung_timer_init(); 574 572 } 575 573 576 574 static void __init bast_init(void) ··· 590 608 .map_io = bast_map_io, 591 609 .init_irq = s3c2410_init_irq, 592 610 .init_machine = bast_init, 593 - .init_time = samsung_timer_init, 611 + .init_time = bast_init_time, 594 612 .restart = s3c2410_restart, 595 613 MACHINE_END
+6 -2
arch/arm/mach-s3c24xx/mach-gta02.c
··· 501 501 static void __init gta02_map_io(void) 502 502 { 503 503 s3c24xx_init_io(gta02_iodesc, ARRAY_SIZE(gta02_iodesc)); 504 - s3c24xx_init_clocks(12000000); 505 504 s3c24xx_init_uarts(gta02_uartcfgs, ARRAY_SIZE(gta02_uartcfgs)); 506 505 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 507 506 } ··· 584 585 regulator_has_full_constraints(); 585 586 } 586 587 588 + static void __init gta02_init_time(void) 589 + { 590 + s3c2442_init_clocks(12000000); 591 + samsung_timer_init(); 592 + } 587 593 588 594 MACHINE_START(NEO1973_GTA02, "GTA02") 589 595 /* Maintainer: Nelson Castillo <arhuaco@freaks-unidos.net> */ ··· 596 592 .map_io = gta02_map_io, 597 593 .init_irq = s3c2442_init_irq, 598 594 .init_machine = gta02_machine_init, 599 - .init_time = samsung_timer_init, 595 + .init_time = gta02_init_time, 600 596 .restart = s3c244x_restart, 601 597 MACHINE_END
+7 -3
arch/arm/mach-s3c24xx/mach-h1940.c
··· 57 57 #include <mach/regs-lcd.h> 58 58 #include <mach/gpio-samsung.h> 59 59 60 - #include <plat/clock.h> 61 60 #include <plat/cpu.h> 62 61 #include <plat/devs.h> 63 62 #include <plat/gpio-cfg.h> ··· 645 646 static void __init h1940_map_io(void) 646 647 { 647 648 s3c24xx_init_io(h1940_iodesc, ARRAY_SIZE(h1940_iodesc)); 648 - s3c24xx_init_clocks(0); 649 649 s3c24xx_init_uarts(h1940_uartcfgs, ARRAY_SIZE(h1940_uartcfgs)); 650 650 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 651 651 ··· 658 660 /* Add latch gpio chip, set latch initial value */ 659 661 h1940_latch_control(0, 0); 660 662 WARN_ON(gpiochip_add(&h1940_latch_gpiochip)); 663 + } 664 + 665 + static void __init h1940_init_time(void) 666 + { 667 + s3c2410_init_clocks(12000000); 668 + samsung_timer_init(); 661 669 } 662 670 663 671 /* H1940 and RX3715 need to reserve this for suspend */ ··· 743 739 .reserve = h1940_reserve, 744 740 .init_irq = s3c2410_init_irq, 745 741 .init_machine = h1940_init, 746 - .init_time = samsung_timer_init, 742 + .init_time = h1940_init_time, 747 743 .restart = s3c2410_restart, 748 744 MACHINE_END
+7 -2
arch/arm/mach-s3c24xx/mach-jive.c
··· 507 507 static void __init jive_map_io(void) 508 508 { 509 509 s3c24xx_init_io(jive_iodesc, ARRAY_SIZE(jive_iodesc)); 510 - s3c24xx_init_clocks(12000000); 511 510 s3c24xx_init_uarts(jive_uartcfgs, ARRAY_SIZE(jive_uartcfgs)); 512 511 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 512 + } 513 + 514 + static void __init jive_init_time(void) 515 + { 516 + s3c2412_init_clocks(12000000); 517 + samsung_timer_init(); 513 518 } 514 519 515 520 static void jive_power_off(void) ··· 670 665 .init_irq = s3c2412_init_irq, 671 666 .map_io = jive_map_io, 672 667 .init_machine = jive_machine_init, 673 - .init_time = samsung_timer_init, 668 + .init_time = jive_init_time, 674 669 .restart = s3c2412_restart, 675 670 MACHINE_END
+7 -3
arch/arm/mach-s3c24xx/mach-mini2440.c
··· 54 54 #include <linux/mtd/partitions.h> 55 55 56 56 #include <plat/gpio-cfg.h> 57 - #include <plat/clock.h> 58 57 #include <plat/devs.h> 59 58 #include <plat/cpu.h> 60 59 #include <plat/samsung-time.h> ··· 524 525 static void __init mini2440_map_io(void) 525 526 { 526 527 s3c24xx_init_io(mini2440_iodesc, ARRAY_SIZE(mini2440_iodesc)); 527 - s3c24xx_init_clocks(12000000); 528 528 s3c24xx_init_uarts(mini2440_uartcfgs, ARRAY_SIZE(mini2440_uartcfgs)); 529 529 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 530 + } 531 + 532 + static void __init mini2440_init_time(void) 533 + { 534 + s3c2440_init_clocks(12000000); 535 + samsung_timer_init(); 530 536 } 531 537 532 538 /* ··· 694 690 .map_io = mini2440_map_io, 695 691 .init_machine = mini2440_init, 696 692 .init_irq = s3c2440_init_irq, 697 - .init_time = samsung_timer_init, 693 + .init_time = mini2440_init_time, 698 694 .restart = s3c244x_restart, 699 695 MACHINE_END
+8 -4
arch/arm/mach-s3c24xx/mach-n30.c
··· 45 45 46 46 #include <linux/platform_data/i2c-s3c2410.h> 47 47 48 - #include <plat/clock.h> 49 48 #include <plat/cpu.h> 50 49 #include <plat/devs.h> 51 50 #include <linux/platform_data/mmc-s3cmci.h> ··· 534 535 { 535 536 s3c24xx_init_io(n30_iodesc, ARRAY_SIZE(n30_iodesc)); 536 537 n30_hwinit(); 537 - s3c24xx_init_clocks(0); 538 538 s3c24xx_init_uarts(n30_uartcfgs, ARRAY_SIZE(n30_uartcfgs)); 539 539 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 540 + } 541 + 542 + static void __init n30_init_time(void) 543 + { 544 + s3c2410_init_clocks(12000000); 545 + samsung_timer_init(); 540 546 } 541 547 542 548 /* GPB3 is the line that controls the pull-up for the USB D+ line */ ··· 595 591 Ben Dooks <ben-linux@fluff.org> 596 592 */ 597 593 .atag_offset = 0x100, 598 - .init_time = samsung_timer_init, 594 + .init_time = n30_init_time, 599 595 .init_machine = n30_init, 600 596 .init_irq = s3c2410_init_irq, 601 597 .map_io = n30_map_io, ··· 606 602 /* Maintainer: Christer Weinigel <christer@weinigel.se> 607 603 */ 608 604 .atag_offset = 0x100, 609 - .init_time = samsung_timer_init, 605 + .init_time = n30_init_time, 610 606 .init_machine = n30_init, 611 607 .init_irq = s3c2410_init_irq, 612 608 .map_io = n30_map_io,
+7 -3
arch/arm/mach-s3c24xx/mach-nexcoder.c
··· 42 42 #include <linux/platform_data/i2c-s3c2410.h> 43 43 44 44 #include <plat/gpio-cfg.h> 45 - #include <plat/clock.h> 46 45 #include <plat/devs.h> 47 46 #include <plat/cpu.h> 48 47 #include <plat/samsung-time.h> ··· 134 135 static void __init nexcoder_map_io(void) 135 136 { 136 137 s3c24xx_init_io(nexcoder_iodesc, ARRAY_SIZE(nexcoder_iodesc)); 137 - s3c24xx_init_clocks(0); 138 138 s3c24xx_init_uarts(nexcoder_uartcfgs, ARRAY_SIZE(nexcoder_uartcfgs)); 139 139 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 140 140 141 141 nexcoder_sensorboard_init(); 142 + } 143 + 144 + static void __init nexcoder_init_time(void) 145 + { 146 + s3c2440_init_clocks(12000000); 147 + samsung_timer_init(); 142 148 } 143 149 144 150 static void __init nexcoder_init(void) ··· 158 154 .map_io = nexcoder_map_io, 159 155 .init_machine = nexcoder_init, 160 156 .init_irq = s3c2440_init_irq, 161 - .init_time = samsung_timer_init, 157 + .init_time = nexcoder_init_time, 162 158 .restart = s3c244x_restart, 163 159 MACHINE_END
+8 -26
arch/arm/mach-s3c24xx/mach-osiris.c
··· 40 40 #include <linux/mtd/nand_ecc.h> 41 41 #include <linux/mtd/partitions.h> 42 42 43 - #include <plat/clock.h> 44 43 #include <plat/cpu.h> 45 44 #include <plat/cpu-freq.h> 46 45 #include <plat/devs.h> ··· 343 344 /* Standard Osiris devices */ 344 345 345 346 static struct platform_device *osiris_devices[] __initdata = { 347 + &s3c2410_device_dclk, 346 348 &s3c_device_i2c0, 347 349 &s3c_device_wdt, 348 350 &s3c_device_nand, 349 351 &osiris_pcmcia, 350 - }; 351 - 352 - static struct clk *osiris_clocks[] __initdata = { 353 - &s3c24xx_dclk0, 354 - &s3c24xx_dclk1, 355 - &s3c24xx_clkout0, 356 - &s3c24xx_clkout1, 357 - &s3c24xx_uclk, 358 352 }; 359 353 360 354 static struct s3c_cpufreq_board __initdata osiris_cpufreq = { ··· 360 368 { 361 369 unsigned long flags; 362 370 363 - /* initialise the clocks */ 364 - 365 - s3c24xx_dclk0.parent = &clk_upll; 366 - s3c24xx_dclk0.rate = 12*1000*1000; 367 - 368 - s3c24xx_dclk1.parent = &clk_upll; 369 - s3c24xx_dclk1.rate = 24*1000*1000; 370 - 371 - s3c24xx_clkout0.parent = &s3c24xx_dclk0; 372 - s3c24xx_clkout1.parent = &s3c24xx_dclk1; 373 - 374 - s3c24xx_uclk.parent = &s3c24xx_clkout1; 375 - 376 - s3c24xx_register_clocks(osiris_clocks, ARRAY_SIZE(osiris_clocks)); 377 - 378 371 s3c24xx_init_io(osiris_iodesc, ARRAY_SIZE(osiris_iodesc)); 379 - s3c24xx_init_clocks(0); 380 372 s3c24xx_init_uarts(osiris_uartcfgs, ARRAY_SIZE(osiris_uartcfgs)); 381 373 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 382 374 ··· 384 408 local_irq_restore(flags); 385 409 } 386 410 411 + static void __init osiris_init_time(void) 412 + { 413 + s3c2440_init_clocks(12000000); 414 + samsung_timer_init(); 415 + } 416 + 387 417 static void __init osiris_init(void) 388 418 { 389 419 register_syscore_ops(&osiris_pm_syscore_ops); ··· 411 429 .map_io = osiris_map_io, 412 430 .init_irq = s3c2440_init_irq, 413 431 .init_machine = osiris_init, 414 - .init_time = samsung_timer_init, 432 + .init_time = osiris_init_time, 415 433 .restart = s3c244x_restart, 416 434 MACHINE_END
+7 -3
arch/arm/mach-s3c24xx/mach-otom.c
··· 30 30 #include <mach/hardware.h> 31 31 #include <mach/regs-gpio.h> 32 32 33 - #include <plat/clock.h> 34 33 #include <plat/cpu.h> 35 34 #include <plat/devs.h> 36 35 #include <plat/samsung-time.h> ··· 99 100 static void __init otom11_map_io(void) 100 101 { 101 102 s3c24xx_init_io(otom11_iodesc, ARRAY_SIZE(otom11_iodesc)); 102 - s3c24xx_init_clocks(0); 103 103 s3c24xx_init_uarts(otom11_uartcfgs, ARRAY_SIZE(otom11_uartcfgs)); 104 104 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 105 + } 106 + 107 + static void __init otom11_init_time(void) 108 + { 109 + s3c2410_init_clocks(12000000); 110 + samsung_timer_init(); 105 111 } 106 112 107 113 static void __init otom11_init(void) ··· 121 117 .map_io = otom11_map_io, 122 118 .init_machine = otom11_init, 123 119 .init_irq = s3c2410_init_irq, 124 - .init_time = samsung_timer_init, 120 + .init_time = otom11_init_time, 125 121 .restart = s3c2410_restart, 126 122 MACHINE_END
+7 -2
arch/arm/mach-s3c24xx/mach-qt2410.c
··· 304 304 static void __init qt2410_map_io(void) 305 305 { 306 306 s3c24xx_init_io(qt2410_iodesc, ARRAY_SIZE(qt2410_iodesc)); 307 - s3c24xx_init_clocks(12*1000*1000); 308 307 s3c24xx_init_uarts(smdk2410_uartcfgs, ARRAY_SIZE(smdk2410_uartcfgs)); 309 308 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 309 + } 310 + 311 + static void __init qt2410_init_time(void) 312 + { 313 + s3c2410_init_clocks(12000000); 314 + samsung_timer_init(); 310 315 } 311 316 312 317 static void __init qt2410_machine_init(void) ··· 351 346 .map_io = qt2410_map_io, 352 347 .init_irq = s3c2410_init_irq, 353 348 .init_machine = qt2410_machine_init, 354 - .init_time = samsung_timer_init, 349 + .init_time = qt2410_init_time, 355 350 .restart = s3c2410_restart, 356 351 MACHINE_END
+8 -13
arch/arm/mach-s3c24xx/mach-rx1950.c
··· 54 54 #include <mach/regs-lcd.h> 55 55 #include <mach/gpio-samsung.h> 56 56 57 - #include <plat/clock.h> 58 57 #include <plat/cpu.h> 59 58 #include <plat/devs.h> 60 59 #include <plat/pm.h> ··· 709 710 }; 710 711 711 712 static struct platform_device *rx1950_devices[] __initdata = { 713 + &s3c2410_device_dclk, 712 714 &s3c_device_lcd, 713 715 &s3c_device_wdt, 714 716 &s3c_device_i2c0, ··· 728 728 &rx1950_leds, 729 729 }; 730 730 731 - static struct clk *rx1950_clocks[] __initdata = { 732 - &s3c24xx_clkout0, 733 - &s3c24xx_clkout1, 734 - }; 735 - 736 731 static void __init rx1950_map_io(void) 737 732 { 738 - s3c24xx_clkout0.parent = &clk_h; 739 - s3c24xx_clkout1.parent = &clk_f; 740 - 741 - s3c24xx_register_clocks(rx1950_clocks, ARRAY_SIZE(rx1950_clocks)); 742 - 743 733 s3c24xx_init_io(rx1950_iodesc, ARRAY_SIZE(rx1950_iodesc)); 744 - s3c24xx_init_clocks(16934000); 745 734 s3c24xx_init_uarts(rx1950_uartcfgs, ARRAY_SIZE(rx1950_uartcfgs)); 746 735 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 747 736 ··· 741 752 #endif 742 753 743 754 s3c_pm_init(); 755 + } 756 + 757 + static void __init rx1950_init_time(void) 758 + { 759 + s3c2442_init_clocks(16934000); 760 + samsung_timer_init(); 744 761 } 745 762 746 763 static void __init rx1950_init_machine(void) ··· 811 816 .reserve = rx1950_reserve, 812 817 .init_irq = s3c2442_init_irq, 813 818 .init_machine = rx1950_init_machine, 814 - .init_time = samsung_timer_init, 819 + .init_time = rx1950_init_time, 815 820 .restart = s3c244x_restart, 816 821 MACHINE_END
+7 -3
arch/arm/mach-s3c24xx/mach-rx3715.c
··· 46 46 #include <mach/regs-lcd.h> 47 47 #include <mach/gpio-samsung.h> 48 48 49 - #include <plat/clock.h> 50 49 #include <plat/cpu.h> 51 50 #include <plat/devs.h> 52 51 #include <plat/pm.h> ··· 178 179 static void __init rx3715_map_io(void) 179 180 { 180 181 s3c24xx_init_io(rx3715_iodesc, ARRAY_SIZE(rx3715_iodesc)); 181 - s3c24xx_init_clocks(16934000); 182 182 s3c24xx_init_uarts(rx3715_uartcfgs, ARRAY_SIZE(rx3715_uartcfgs)); 183 183 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 184 + } 185 + 186 + static void __init rx3715_init_time(void) 187 + { 188 + s3c2440_init_clocks(16934000); 189 + samsung_timer_init(); 184 190 } 185 191 186 192 /* H1940 and RX3715 need to reserve this for suspend */ ··· 214 210 .reserve = rx3715_reserve, 215 211 .init_irq = s3c2440_init_irq, 216 212 .init_machine = rx3715_init_machine, 217 - .init_time = samsung_timer_init, 213 + .init_time = rx3715_init_time, 218 214 .restart = s3c244x_restart, 219 215 MACHINE_END
+1 -37
arch/arm/mach-s3c24xx/mach-s3c2416-dt.c
··· 18 18 #include <linux/clocksource.h> 19 19 #include <linux/irqchip.h> 20 20 #include <linux/of_platform.h> 21 - #include <linux/serial_core.h> 22 21 #include <linux/serial_s3c.h> 23 22 24 23 #include <asm/mach/arch.h> ··· 28 29 29 30 #include "common.h" 30 31 31 - /* 32 - * The following lookup table is used to override device names when devices 33 - * are registered from device tree. This is temporarily added to enable 34 - * device tree support addition for the S3C2416 architecture. 35 - * 36 - * For drivers that require platform data to be provided from the machine 37 - * file, a platform data pointer can also be supplied along with the 38 - * devices names. Usually, the platform data elements that cannot be parsed 39 - * from the device tree by the drivers (example: function pointers) are 40 - * supplied. But it should be noted that this is a temporary mechanism and 41 - * at some point, the drivers should be capable of parsing all the platform 42 - * data from the device tree. 43 - */ 44 - static const struct of_dev_auxdata s3c2416_auxdata_lookup[] __initconst = { 45 - OF_DEV_AUXDATA("samsung,s3c2440-uart", S3C24XX_PA_UART, 46 - "s3c2440-uart.0", NULL), 47 - OF_DEV_AUXDATA("samsung,s3c2440-uart", S3C24XX_PA_UART + 0x4000, 48 - "s3c2440-uart.1", NULL), 49 - OF_DEV_AUXDATA("samsung,s3c2440-uart", S3C24XX_PA_UART + 0x8000, 50 - "s3c2440-uart.2", NULL), 51 - OF_DEV_AUXDATA("samsung,s3c2440-uart", S3C24XX_PA_UART + 0xC000, 52 - "s3c2440-uart.3", NULL), 53 - OF_DEV_AUXDATA("samsung,s3c6410-sdhci", S3C_PA_HSMMC0, 54 - "s3c-sdhci.0", NULL), 55 - OF_DEV_AUXDATA("samsung,s3c6410-sdhci", S3C_PA_HSMMC1, 56 - "s3c-sdhci.1", NULL), 57 - OF_DEV_AUXDATA("samsung,s3c2440-i2c", S3C_PA_IIC, 58 - "s3c2440-i2c.0", NULL), 59 - {}, 60 - }; 61 - 62 32 static void __init s3c2416_dt_map_io(void) 63 33 { 64 34 s3c24xx_init_io(NULL, 0); 65 - s3c24xx_init_clocks(12000000); 66 35 } 67 36 68 37 static void __init s3c2416_dt_machine_init(void) 69 38 { 70 - of_platform_populate(NULL, of_default_bus_match_table, 71 - s3c2416_auxdata_lookup, NULL); 72 - 39 + of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); 73 40 s3c_pm_init(); 74 41 } 75 42 ··· 51 86 .map_io = s3c2416_dt_map_io, 52 87 .init_irq = irqchip_init, 53 88 .init_machine = s3c2416_dt_machine_init, 54 - .init_time = clocksource_of_init, 55 89 .restart = s3c2416_restart, 56 90 MACHINE_END
+7 -2
arch/arm/mach-s3c24xx/mach-smdk2410.c
··· 99 99 static void __init smdk2410_map_io(void) 100 100 { 101 101 s3c24xx_init_io(smdk2410_iodesc, ARRAY_SIZE(smdk2410_iodesc)); 102 - s3c24xx_init_clocks(0); 103 102 s3c24xx_init_uarts(smdk2410_uartcfgs, ARRAY_SIZE(smdk2410_uartcfgs)); 104 103 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 104 + } 105 + 106 + static void __init smdk2410_init_time(void) 107 + { 108 + s3c2410_init_clocks(12000000); 109 + samsung_timer_init(); 105 110 } 106 111 107 112 static void __init smdk2410_init(void) ··· 123 118 .map_io = smdk2410_map_io, 124 119 .init_irq = s3c2410_init_irq, 125 120 .init_machine = smdk2410_init, 126 - .init_time = samsung_timer_init, 121 + .init_time = smdk2410_init_time, 127 122 .restart = s3c2410_restart, 128 123 MACHINE_END
+7 -2
arch/arm/mach-s3c24xx/mach-smdk2413.c
··· 106 106 static void __init smdk2413_map_io(void) 107 107 { 108 108 s3c24xx_init_io(smdk2413_iodesc, ARRAY_SIZE(smdk2413_iodesc)); 109 - s3c24xx_init_clocks(12000000); 110 109 s3c24xx_init_uarts(smdk2413_uartcfgs, ARRAY_SIZE(smdk2413_uartcfgs)); 111 110 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 111 + } 112 + 113 + static void __init smdk2413_init_time(void) 114 + { 115 + s3c2412_init_clocks(12000000); 116 + samsung_timer_init(); 112 117 } 113 118 114 119 static void __init smdk2413_machine_init(void) ··· 164 159 .init_irq = s3c2412_init_irq, 165 160 .map_io = smdk2413_map_io, 166 161 .init_machine = smdk2413_machine_init, 167 - .init_time = samsung_timer_init, 162 + .init_time = smdk2413_init_time, 168 163 .restart = s3c2412_restart, 169 164 MACHINE_END
+7 -2
arch/arm/mach-s3c24xx/mach-smdk2416.c
··· 219 219 &s3c2443_device_dma, 220 220 }; 221 221 222 + static void __init smdk2416_init_time(void) 223 + { 224 + s3c2416_init_clocks(12000000); 225 + samsung_timer_init(); 226 + } 227 + 222 228 static void __init smdk2416_map_io(void) 223 229 { 224 230 s3c24xx_init_io(smdk2416_iodesc, ARRAY_SIZE(smdk2416_iodesc)); 225 - s3c24xx_init_clocks(12000000); 226 231 s3c24xx_init_uarts(smdk2416_uartcfgs, ARRAY_SIZE(smdk2416_uartcfgs)); 227 232 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 228 233 } ··· 262 257 .init_irq = s3c2416_init_irq, 263 258 .map_io = smdk2416_map_io, 264 259 .init_machine = smdk2416_machine_init, 265 - .init_time = samsung_timer_init, 260 + .init_time = smdk2416_init_time, 266 261 .restart = s3c2416_restart, 267 262 MACHINE_END
+7 -3
arch/arm/mach-s3c24xx/mach-smdk2440.c
··· 38 38 #include <mach/fb.h> 39 39 #include <linux/platform_data/i2c-s3c2410.h> 40 40 41 - #include <plat/clock.h> 42 41 #include <plat/devs.h> 43 42 #include <plat/cpu.h> 44 43 #include <plat/samsung-time.h> ··· 158 159 static void __init smdk2440_map_io(void) 159 160 { 160 161 s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc)); 161 - s3c24xx_init_clocks(16934400); 162 162 s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs)); 163 163 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 164 + } 165 + 166 + static void __init smdk2440_init_time(void) 167 + { 168 + s3c2440_init_clocks(16934400); 169 + samsung_timer_init(); 164 170 } 165 171 166 172 static void __init smdk2440_machine_init(void) ··· 184 180 .init_irq = s3c2440_init_irq, 185 181 .map_io = smdk2440_map_io, 186 182 .init_machine = smdk2440_machine_init, 187 - .init_time = samsung_timer_init, 183 + .init_time = smdk2440_init_time, 188 184 .restart = s3c244x_restart, 189 185 MACHINE_END
+7 -2
arch/arm/mach-s3c24xx/mach-smdk2443.c
··· 121 121 static void __init smdk2443_map_io(void) 122 122 { 123 123 s3c24xx_init_io(smdk2443_iodesc, ARRAY_SIZE(smdk2443_iodesc)); 124 - s3c24xx_init_clocks(12000000); 125 124 s3c24xx_init_uarts(smdk2443_uartcfgs, ARRAY_SIZE(smdk2443_uartcfgs)); 126 125 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 126 + } 127 + 128 + static void __init smdk2443_init_time(void) 129 + { 130 + s3c2443_init_clocks(12000000); 131 + samsung_timer_init(); 127 132 } 128 133 129 134 static void __init smdk2443_machine_init(void) ··· 150 145 .init_irq = s3c2443_init_irq, 151 146 .map_io = smdk2443_map_io, 152 147 .init_machine = smdk2443_machine_init, 153 - .init_time = samsung_timer_init, 148 + .init_time = smdk2443_init_time, 154 149 .restart = s3c2443_restart, 155 150 MACHINE_END
+7 -2
arch/arm/mach-s3c24xx/mach-tct_hammer.c
··· 135 135 static void __init tct_hammer_map_io(void) 136 136 { 137 137 s3c24xx_init_io(tct_hammer_iodesc, ARRAY_SIZE(tct_hammer_iodesc)); 138 - s3c24xx_init_clocks(0); 139 138 s3c24xx_init_uarts(tct_hammer_uartcfgs, ARRAY_SIZE(tct_hammer_uartcfgs)); 140 139 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 140 + } 141 + 142 + static void __init tct_hammer_init_time(void) 143 + { 144 + s3c2410_init_clocks(12000000); 145 + samsung_timer_init(); 141 146 } 142 147 143 148 static void __init tct_hammer_init(void) ··· 156 151 .map_io = tct_hammer_map_io, 157 152 .init_irq = s3c2410_init_irq, 158 153 .init_machine = tct_hammer_init, 159 - .init_time = samsung_timer_init, 154 + .init_time = tct_hammer_init_time, 160 155 .restart = s3c2410_restart, 161 156 MACHINE_END
+8 -26
arch/arm/mach-s3c24xx/mach-vr1000.c
··· 43 43 #include <mach/regs-gpio.h> 44 44 #include <mach/gpio-samsung.h> 45 45 46 - #include <plat/clock.h> 47 46 #include <plat/cpu.h> 48 47 #include <plat/devs.h> 49 48 #include <plat/samsung-time.h> ··· 285 286 /* devices for this board */ 286 287 287 288 static struct platform_device *vr1000_devices[] __initdata = { 289 + &s3c2410_device_dclk, 288 290 &s3c_device_ohci, 289 291 &s3c_device_lcd, 290 292 &s3c_device_wdt, ··· 299 299 &vr1000_led3, 300 300 }; 301 301 302 - static struct clk *vr1000_clocks[] __initdata = { 303 - &s3c24xx_dclk0, 304 - &s3c24xx_dclk1, 305 - &s3c24xx_clkout0, 306 - &s3c24xx_clkout1, 307 - &s3c24xx_uclk, 308 - }; 309 - 310 302 static void vr1000_power_off(void) 311 303 { 312 304 gpio_direction_output(S3C2410_GPB(9), 1); ··· 306 314 307 315 static void __init vr1000_map_io(void) 308 316 { 309 - /* initialise clock sources */ 310 - 311 - s3c24xx_dclk0.parent = &clk_upll; 312 - s3c24xx_dclk0.rate = 12*1000*1000; 313 - 314 - s3c24xx_dclk1.parent = NULL; 315 - s3c24xx_dclk1.rate = 3692307; 316 - 317 - s3c24xx_clkout0.parent = &s3c24xx_dclk0; 318 - s3c24xx_clkout1.parent = &s3c24xx_dclk1; 319 - 320 - s3c24xx_uclk.parent = &s3c24xx_clkout1; 321 - 322 - s3c24xx_register_clocks(vr1000_clocks, ARRAY_SIZE(vr1000_clocks)); 323 - 324 317 pm_power_off = vr1000_power_off; 325 318 326 319 s3c24xx_init_io(vr1000_iodesc, ARRAY_SIZE(vr1000_iodesc)); 327 - s3c24xx_init_clocks(0); 328 320 s3c24xx_init_uarts(vr1000_uartcfgs, ARRAY_SIZE(vr1000_uartcfgs)); 329 321 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 322 + } 323 + 324 + static void __init vr1000_init_time(void) 325 + { 326 + s3c2410_init_clocks(12000000); 327 + samsung_timer_init(); 330 328 } 331 329 332 330 static void __init vr1000_init(void) ··· 339 357 .map_io = vr1000_map_io, 340 358 .init_machine = vr1000_init, 341 359 .init_irq = s3c2410_init_irq, 342 - .init_time = samsung_timer_init, 360 + .init_time = vr1000_init_time, 343 361 .restart = s3c2410_restart, 344 362 MACHINE_END
+7 -2
arch/arm/mach-s3c24xx/mach-vstms.c
··· 142 142 static void __init vstms_map_io(void) 143 143 { 144 144 s3c24xx_init_io(vstms_iodesc, ARRAY_SIZE(vstms_iodesc)); 145 - s3c24xx_init_clocks(12000000); 146 145 s3c24xx_init_uarts(vstms_uartcfgs, ARRAY_SIZE(vstms_uartcfgs)); 147 146 samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4); 147 + } 148 + 149 + static void __init vstms_init_time(void) 150 + { 151 + s3c2412_init_clocks(12000000); 152 + samsung_timer_init(); 148 153 } 149 154 150 155 static void __init vstms_init(void) ··· 167 162 .init_irq = s3c2412_init_irq, 168 163 .init_machine = vstms_init, 169 164 .map_io = vstms_map_io, 170 - .init_time = samsung_timer_init, 165 + .init_time = vstms_init_time, 171 166 .restart = s3c2412_restart, 172 167 MACHINE_END
-17
arch/arm/mach-s3c24xx/pm.c
··· 51 51 #define PFX "s3c24xx-pm: " 52 52 53 53 static struct sleep_save core_save[] = { 54 - SAVE_ITEM(S3C2410_LOCKTIME), 55 - SAVE_ITEM(S3C2410_CLKCON), 56 - 57 54 /* we restore the timings here, with the proviso that the board 58 55 * brings the system up in an slower, or equal frequency setting 59 56 * to the original system. ··· 66 69 SAVE_ITEM(S3C2410_BANKCON3), 67 70 SAVE_ITEM(S3C2410_BANKCON4), 68 71 SAVE_ITEM(S3C2410_BANKCON5), 69 - 70 - #ifndef CONFIG_CPU_FREQ 71 - SAVE_ITEM(S3C2410_CLKDIVN), 72 - SAVE_ITEM(S3C2410_MPLLCON), 73 - SAVE_ITEM(S3C2410_REFRESH), 74 - #endif 75 - SAVE_ITEM(S3C2410_UPLLCON), 76 - SAVE_ITEM(S3C2410_CLKSLOW), 77 - }; 78 - 79 - static struct sleep_save misc_save[] = { 80 - SAVE_ITEM(S3C2410_DCLKCON), 81 72 }; 82 73 83 74 /* s3c_pm_check_resume_pin ··· 125 140 void s3c_pm_restore_core(void) 126 141 { 127 142 s3c_pm_do_restore_core(core_save, ARRAY_SIZE(core_save)); 128 - s3c_pm_do_restore(misc_save, ARRAY_SIZE(misc_save)); 129 143 } 130 144 131 145 void s3c_pm_save_core(void) 132 146 { 133 - s3c_pm_do_save(misc_save, ARRAY_SIZE(misc_save)); 134 147 s3c_pm_do_save(core_save, ARRAY_SIZE(core_save)); 135 148 } 136 149
-56
arch/arm/mach-s3c24xx/s3c2410.c
··· 85 85 86 86 void __init_or_cpufreq s3c2410_setup_clocks(void) 87 87 { 88 - struct clk *xtal_clk; 89 - unsigned long tmp; 90 - unsigned long xtal; 91 - unsigned long fclk; 92 - unsigned long hclk; 93 - unsigned long pclk; 94 - 95 - xtal_clk = clk_get(NULL, "xtal"); 96 - xtal = clk_get_rate(xtal_clk); 97 - clk_put(xtal_clk); 98 - 99 - /* now we've got our machine bits initialised, work out what 100 - * clocks we've got */ 101 - 102 - fclk = s3c24xx_get_pll(__raw_readl(S3C2410_MPLLCON), xtal); 103 - 104 - tmp = __raw_readl(S3C2410_CLKDIVN); 105 - 106 - /* work out clock scalings */ 107 - 108 - hclk = fclk / ((tmp & S3C2410_CLKDIVN_HDIVN) ? 2 : 1); 109 - pclk = hclk / ((tmp & S3C2410_CLKDIVN_PDIVN) ? 2 : 1); 110 - 111 - /* print brieft summary of clocks, etc */ 112 - 113 - printk("S3C2410: core %ld.%03ld MHz, memory %ld.%03ld MHz, peripheral %ld.%03ld MHz\n", 114 - print_mhz(fclk), print_mhz(hclk), print_mhz(pclk)); 115 - 116 - /* initialise the clocks here, to allow other things like the 117 - * console to use them 118 - */ 119 - 120 - s3c24xx_setup_clocks(fclk, hclk, pclk); 121 - } 122 - 123 - /* fake ARMCLK for use with cpufreq, etc. */ 124 - 125 - static struct clk s3c2410_armclk = { 126 - .name = "armclk", 127 - .parent = &clk_f, 128 - .id = -1, 129 - }; 130 - 131 - static struct clk_lookup s3c2410_clk_lookup[] = { 132 - CLKDEV_INIT(NULL, "clk_uart_baud0", &clk_p), 133 - CLKDEV_INIT(NULL, "clk_uart_baud1", &s3c24xx_uclk), 134 - }; 135 - 136 - void __init s3c2410_init_clocks(int xtal) 137 - { 138 - s3c24xx_register_baseclocks(xtal); 139 - s3c2410_setup_clocks(); 140 - s3c2410_baseclk_add(); 141 - s3c24xx_register_clock(&s3c2410_armclk); 142 - clkdev_add_table(s3c2410_clk_lookup, ARRAY_SIZE(s3c2410_clk_lookup)); 143 - samsung_wdt_reset_init(S3C24XX_VA_WATCHDOG); 144 88 } 145 89 146 90 struct bus_type s3c2410_subsys = {
-43
arch/arm/mach-s3c24xx/s3c2412.c
··· 173 173 174 174 void __init_or_cpufreq s3c2412_setup_clocks(void) 175 175 { 176 - struct clk *xtal_clk; 177 - unsigned long tmp; 178 - unsigned long xtal; 179 - unsigned long fclk; 180 - unsigned long hclk; 181 - unsigned long pclk; 182 - 183 - xtal_clk = clk_get(NULL, "xtal"); 184 - xtal = clk_get_rate(xtal_clk); 185 - clk_put(xtal_clk); 186 - 187 - /* now we've got our machine bits initialised, work out what 188 - * clocks we've got */ 189 - 190 - fclk = s3c24xx_get_pll(__raw_readl(S3C2410_MPLLCON), xtal * 2); 191 - 192 - clk_mpll.rate = fclk; 193 - 194 - tmp = __raw_readl(S3C2410_CLKDIVN); 195 - 196 - /* work out clock scalings */ 197 - 198 - hclk = fclk / ((tmp & S3C2412_CLKDIVN_HDIVN_MASK) + 1); 199 - hclk /= ((tmp & S3C2412_CLKDIVN_ARMDIVN) ? 2 : 1); 200 - pclk = hclk / ((tmp & S3C2412_CLKDIVN_PDIVN) ? 2 : 1); 201 - 202 - /* print brieft summary of clocks, etc */ 203 - 204 - printk("S3C2412: core %ld.%03ld MHz, memory %ld.%03ld MHz, peripheral %ld.%03ld MHz\n", 205 - print_mhz(fclk), print_mhz(hclk), print_mhz(pclk)); 206 - 207 - s3c24xx_setup_clocks(fclk, hclk, pclk); 208 - } 209 - 210 - void __init s3c2412_init_clocks(int xtal) 211 - { 212 - /* initialise the clocks here, to allow other things like the 213 - * console to use them 214 - */ 215 - 216 - s3c24xx_register_baseclocks(xtal); 217 - s3c2412_setup_clocks(); 218 - s3c2412_baseclk_add(); 219 176 } 220 177 221 178 /* need to register the subsystem before we actually register the device, and
-111
arch/arm/mach-s3c24xx/s3c2442.c
··· 53 53 54 54 #include "common.h" 55 55 56 - /* S3C2442 extended clock support */ 57 - 58 - static unsigned long s3c2442_camif_upll_round(struct clk *clk, 59 - unsigned long rate) 60 - { 61 - unsigned long parent_rate = clk_get_rate(clk->parent); 62 - int div; 63 - 64 - if (rate > parent_rate) 65 - return parent_rate; 66 - 67 - div = parent_rate / rate; 68 - 69 - if (div == 3) 70 - return parent_rate / 3; 71 - 72 - /* note, we remove the +/- 1 calculations for the divisor */ 73 - 74 - div /= 2; 75 - 76 - if (div < 1) 77 - div = 1; 78 - else if (div > 16) 79 - div = 16; 80 - 81 - return parent_rate / (div * 2); 82 - } 83 - 84 - static int s3c2442_camif_upll_setrate(struct clk *clk, unsigned long rate) 85 - { 86 - unsigned long parent_rate = clk_get_rate(clk->parent); 87 - unsigned long camdivn = __raw_readl(S3C2440_CAMDIVN); 88 - 89 - rate = s3c2442_camif_upll_round(clk, rate); 90 - 91 - camdivn &= ~S3C2442_CAMDIVN_CAMCLK_DIV3; 92 - 93 - if (rate == parent_rate) { 94 - camdivn &= ~S3C2440_CAMDIVN_CAMCLK_SEL; 95 - } else if ((parent_rate / rate) == 3) { 96 - camdivn |= S3C2440_CAMDIVN_CAMCLK_SEL; 97 - camdivn |= S3C2442_CAMDIVN_CAMCLK_DIV3; 98 - } else { 99 - camdivn &= ~S3C2440_CAMDIVN_CAMCLK_MASK; 100 - camdivn |= S3C2440_CAMDIVN_CAMCLK_SEL; 101 - camdivn |= (((parent_rate / rate) / 2) - 1); 102 - } 103 - 104 - __raw_writel(camdivn, S3C2440_CAMDIVN); 105 - 106 - return 0; 107 - } 108 - 109 - /* Extra S3C2442 clocks */ 110 - 111 - static struct clk s3c2442_clk_cam = { 112 - .name = "camif", 113 - .id = -1, 114 - .enable = s3c2410_clkcon_enable, 115 - .ctrlbit = S3C2440_CLKCON_CAMERA, 116 - }; 117 - 118 - static struct clk s3c2442_clk_cam_upll = { 119 - .name = "camif-upll", 120 - .id = -1, 121 - .ops = &(struct clk_ops) { 122 - .set_rate = s3c2442_camif_upll_setrate, 123 - .round_rate = s3c2442_camif_upll_round, 124 - }, 125 - }; 126 - 127 - static int s3c2442_clk_add(struct device *dev, struct subsys_interface *sif) 128 - { 129 - struct clk *clock_upll; 130 - struct clk *clock_h; 131 - struct clk *clock_p; 132 - 133 - clock_p = clk_get(NULL, "pclk"); 134 - clock_h = clk_get(NULL, "hclk"); 135 - clock_upll = clk_get(NULL, "upll"); 136 - 137 - if (IS_ERR(clock_p) || IS_ERR(clock_h) || IS_ERR(clock_upll)) { 138 - printk(KERN_ERR "S3C2442: Failed to get parent clocks\n"); 139 - return -EINVAL; 140 - } 141 - 142 - s3c2442_clk_cam.parent = clock_h; 143 - s3c2442_clk_cam_upll.parent = clock_upll; 144 - 145 - s3c24xx_register_clock(&s3c2442_clk_cam); 146 - s3c24xx_register_clock(&s3c2442_clk_cam_upll); 147 - 148 - clk_disable(&s3c2442_clk_cam); 149 - 150 - return 0; 151 - } 152 - 153 - static struct subsys_interface s3c2442_clk_interface = { 154 - .name = "s3c2442_clk", 155 - .subsys = &s3c2442_subsys, 156 - .add_dev = s3c2442_clk_add, 157 - }; 158 - 159 - static __init int s3c2442_clk_init(void) 160 - { 161 - return subsys_interface_register(&s3c2442_clk_interface); 162 - } 163 - 164 - arch_initcall(s3c2442_clk_init); 165 - 166 - 167 56 static struct device s3c2442_dev = { 168 57 .bus = &s3c2442_subsys, 169 58 };
+2 -57
arch/arm/mach-s3c24xx/s3c244x.c
··· 46 46 #include <plat/nand-core.h> 47 47 #include <plat/watchdog-reset.h> 48 48 49 + #include "common.h" 49 50 #include "regs-dsc.h" 50 51 51 52 static struct map_desc s3c244x_iodesc[] __initdata = { ··· 75 74 s3c_nand_setname("s3c2440-nand"); 76 75 s3c_device_ts.name = "s3c2440-ts"; 77 76 s3c_device_usbgadget.name = "s3c2440-usbgadget"; 77 + s3c2410_device_dclk.name = "s3c2440-dclk"; 78 78 } 79 79 80 80 void __init_or_cpufreq s3c244x_setup_clocks(void) 81 81 { 82 - struct clk *xtal_clk; 83 - unsigned long clkdiv; 84 - unsigned long camdiv; 85 - unsigned long xtal; 86 - unsigned long hclk, fclk, pclk; 87 - int hdiv = 1; 88 - 89 - xtal_clk = clk_get(NULL, "xtal"); 90 - xtal = clk_get_rate(xtal_clk); 91 - clk_put(xtal_clk); 92 - 93 - fclk = s3c24xx_get_pll(__raw_readl(S3C2410_MPLLCON), xtal) * 2; 94 - 95 - clkdiv = __raw_readl(S3C2410_CLKDIVN); 96 - camdiv = __raw_readl(S3C2440_CAMDIVN); 97 - 98 - /* work out clock scalings */ 99 - 100 - switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) { 101 - case S3C2440_CLKDIVN_HDIVN_1: 102 - hdiv = 1; 103 - break; 104 - 105 - case S3C2440_CLKDIVN_HDIVN_2: 106 - hdiv = 2; 107 - break; 108 - 109 - case S3C2440_CLKDIVN_HDIVN_4_8: 110 - hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4; 111 - break; 112 - 113 - case S3C2440_CLKDIVN_HDIVN_3_6: 114 - hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3; 115 - break; 116 - } 117 - 118 - hclk = fclk / hdiv; 119 - pclk = hclk / ((clkdiv & S3C2440_CLKDIVN_PDIVN) ? 2 : 1); 120 - 121 - /* print brief summary of clocks, etc */ 122 - 123 - printk("S3C244X: core %ld.%03ld MHz, memory %ld.%03ld MHz, peripheral %ld.%03ld MHz\n", 124 - print_mhz(fclk), print_mhz(hclk), print_mhz(pclk)); 125 - 126 - s3c24xx_setup_clocks(fclk, hclk, pclk); 127 - } 128 - 129 - void __init s3c244x_init_clocks(int xtal) 130 - { 131 - /* initialise the clocks here, to allow other things like the 132 - * console to use them, and to add new ones after the initialisation 133 - */ 134 - 135 - s3c24xx_register_baseclocks(xtal); 136 - s3c244x_setup_clocks(); 137 - s3c2410_baseclk_add(); 138 - samsung_wdt_reset_init(S3C24XX_VA_WATCHDOG); 139 82 } 140 83 141 84 /* Since the S3C2442 and S3C2440 share items, put both subsystems here */
+1
arch/arm/plat-samsung/include/plat/cpu-freq-core.h
··· 119 119 struct s3c_cpufreq_config { 120 120 struct s3c_freq freq; 121 121 struct s3c_freq max; 122 + struct clk *mpll; 122 123 struct cpufreq_frequency_table pll; 123 124 struct s3c_clkdivs divs; 124 125 struct s3c_cpufreq_info *info; /* for core, not drivers */
+2
drivers/clk/Kconfig
··· 115 115 116 116 source "drivers/clk/bcm/Kconfig" 117 117 source "drivers/clk/mvebu/Kconfig" 118 + 119 + source "drivers/clk/samsung/Kconfig"
+1 -1
drivers/clk/Makefile
··· 41 41 obj-$(CONFIG_ARCH_MXS) += mxs/ 42 42 obj-$(CONFIG_COMMON_CLK_QCOM) += qcom/ 43 43 obj-$(CONFIG_ARCH_ROCKCHIP) += rockchip/ 44 - obj-$(CONFIG_PLAT_SAMSUNG) += samsung/ 44 + obj-$(CONFIG_COMMON_CLK_SAMSUNG) += samsung/ 45 45 obj-$(CONFIG_ARCH_SHMOBILE_MULTI) += shmobile/ 46 46 obj-$(CONFIG_ARCH_SIRF) += sirf/ 47 47 obj-$(CONFIG_ARCH_SOCFPGA) += socfpga/
+26
drivers/clk/samsung/Kconfig
··· 1 + config COMMON_CLK_SAMSUNG 2 + bool 3 + select COMMON_CLK 4 + 5 + config S3C2410_COMMON_CLK 6 + bool 7 + select COMMON_CLK_SAMSUNG 8 + help 9 + Build the s3c2410 clock driver based on the common clock framework. 10 + 11 + config S3C2410_COMMON_DCLK 12 + bool 13 + select COMMON_CLK_SAMSUNG 14 + select REGMAP_MMIO 15 + help 16 + Temporary symbol to build the dclk driver based on the common clock 17 + framework. 18 + 19 + config S3C2412_COMMON_CLK 20 + bool 21 + select COMMON_CLK_SAMSUNG 22 + 23 + config S3C2443_COMMON_CLK 24 + bool 25 + select COMMON_CLK_SAMSUNG 26 +
+6
drivers/clk/samsung/Makefile
··· 3 3 # 4 4 5 5 obj-$(CONFIG_COMMON_CLK) += clk.o clk-pll.o 6 + obj-$(CONFIG_SOC_EXYNOS3250) += clk-exynos3250.o 6 7 obj-$(CONFIG_ARCH_EXYNOS4) += clk-exynos4.o 7 8 obj-$(CONFIG_SOC_EXYNOS5250) += clk-exynos5250.o 9 + obj-$(CONFIG_SOC_EXYNOS5260) += clk-exynos5260.o 8 10 obj-$(CONFIG_SOC_EXYNOS5420) += clk-exynos5420.o 9 11 obj-$(CONFIG_SOC_EXYNOS5440) += clk-exynos5440.o 10 12 obj-$(CONFIG_ARCH_EXYNOS) += clk-exynos-audss.o 13 + obj-$(CONFIG_S3C2410_COMMON_CLK)+= clk-s3c2410.o 14 + obj-$(CONFIG_S3C2410_COMMON_DCLK)+= clk-s3c2410-dclk.o 15 + obj-$(CONFIG_S3C2412_COMMON_CLK)+= clk-s3c2412.o 16 + obj-$(CONFIG_S3C2443_COMMON_CLK)+= clk-s3c2443.o 11 17 obj-$(CONFIG_ARCH_S3C64XX) += clk-s3c64xx.o
+780
drivers/clk/samsung/clk-exynos3250.c
··· 1 + /* 2 + * Copyright (c) 2014 Samsung Electronics Co., Ltd. 3 + * 4 + * This program is free software; you can redistribute it and/or modify 5 + * it under the terms of the GNU General Public License version 2 as 6 + * published by the Free Software Foundation. 7 + * 8 + * Common Clock Framework support for Exynos3250 SoC. 9 + */ 10 + 11 + #include <linux/clk.h> 12 + #include <linux/clkdev.h> 13 + #include <linux/clk-provider.h> 14 + #include <linux/of.h> 15 + #include <linux/of_address.h> 16 + #include <linux/platform_device.h> 17 + #include <linux/syscore_ops.h> 18 + 19 + #include <dt-bindings/clock/exynos3250.h> 20 + 21 + #include "clk.h" 22 + #include "clk-pll.h" 23 + 24 + #define SRC_LEFTBUS 0x4200 25 + #define DIV_LEFTBUS 0x4500 26 + #define GATE_IP_LEFTBUS 0x4800 27 + #define SRC_RIGHTBUS 0x8200 28 + #define DIV_RIGHTBUS 0x8500 29 + #define GATE_IP_RIGHTBUS 0x8800 30 + #define GATE_IP_PERIR 0x8960 31 + #define MPLL_LOCK 0xc010 32 + #define MPLL_CON0 0xc110 33 + #define VPLL_LOCK 0xc020 34 + #define VPLL_CON0 0xc120 35 + #define UPLL_LOCK 0xc030 36 + #define UPLL_CON0 0xc130 37 + #define SRC_TOP0 0xc210 38 + #define SRC_TOP1 0xc214 39 + #define SRC_CAM 0xc220 40 + #define SRC_MFC 0xc228 41 + #define SRC_G3D 0xc22c 42 + #define SRC_LCD 0xc234 43 + #define SRC_ISP 0xc238 44 + #define SRC_FSYS 0xc240 45 + #define SRC_PERIL0 0xc250 46 + #define SRC_PERIL1 0xc254 47 + #define SRC_MASK_TOP 0xc310 48 + #define SRC_MASK_CAM 0xc320 49 + #define SRC_MASK_LCD 0xc334 50 + #define SRC_MASK_ISP 0xc338 51 + #define SRC_MASK_FSYS 0xc340 52 + #define SRC_MASK_PERIL0 0xc350 53 + #define SRC_MASK_PERIL1 0xc354 54 + #define DIV_TOP 0xc510 55 + #define DIV_CAM 0xc520 56 + #define DIV_MFC 0xc528 57 + #define DIV_G3D 0xc52c 58 + #define DIV_LCD 0xc534 59 + #define DIV_ISP 0xc538 60 + #define DIV_FSYS0 0xc540 61 + #define DIV_FSYS1 0xc544 62 + #define DIV_FSYS2 0xc548 63 + #define DIV_PERIL0 0xc550 64 + #define DIV_PERIL1 0xc554 65 + #define DIV_PERIL3 0xc55c 66 + #define DIV_PERIL4 0xc560 67 + #define DIV_PERIL5 0xc564 68 + #define DIV_CAM1 0xc568 69 + #define CLKDIV2_RATIO 0xc580 70 + #define GATE_SCLK_CAM 0xc820 71 + #define GATE_SCLK_MFC 0xc828 72 + #define GATE_SCLK_G3D 0xc82c 73 + #define GATE_SCLK_LCD 0xc834 74 + #define GATE_SCLK_ISP_TOP 0xc838 75 + #define GATE_SCLK_FSYS 0xc840 76 + #define GATE_SCLK_PERIL 0xc850 77 + #define GATE_IP_CAM 0xc920 78 + #define GATE_IP_MFC 0xc928 79 + #define GATE_IP_G3D 0xc92c 80 + #define GATE_IP_LCD 0xc934 81 + #define GATE_IP_ISP 0xc938 82 + #define GATE_IP_FSYS 0xc940 83 + #define GATE_IP_PERIL 0xc950 84 + #define GATE_BLOCK 0xc970 85 + #define APLL_LOCK 0x14000 86 + #define APLL_CON0 0x14100 87 + #define SRC_CPU 0x14200 88 + #define DIV_CPU0 0x14500 89 + #define DIV_CPU1 0x14504 90 + 91 + /* list of PLLs to be registered */ 92 + enum exynos3250_plls { 93 + apll, mpll, vpll, upll, 94 + nr_plls 95 + }; 96 + 97 + static void __iomem *reg_base; 98 + 99 + /* 100 + * Support for CMU save/restore across system suspends 101 + */ 102 + #ifdef CONFIG_PM_SLEEP 103 + static struct samsung_clk_reg_dump *exynos3250_clk_regs; 104 + 105 + static unsigned long exynos3250_cmu_clk_regs[] __initdata = { 106 + SRC_LEFTBUS, 107 + DIV_LEFTBUS, 108 + GATE_IP_LEFTBUS, 109 + SRC_RIGHTBUS, 110 + DIV_RIGHTBUS, 111 + GATE_IP_RIGHTBUS, 112 + GATE_IP_PERIR, 113 + MPLL_LOCK, 114 + MPLL_CON0, 115 + VPLL_LOCK, 116 + VPLL_CON0, 117 + UPLL_LOCK, 118 + UPLL_CON0, 119 + SRC_TOP0, 120 + SRC_TOP1, 121 + SRC_CAM, 122 + SRC_MFC, 123 + SRC_G3D, 124 + SRC_LCD, 125 + SRC_ISP, 126 + SRC_FSYS, 127 + SRC_PERIL0, 128 + SRC_PERIL1, 129 + SRC_MASK_TOP, 130 + SRC_MASK_CAM, 131 + SRC_MASK_LCD, 132 + SRC_MASK_ISP, 133 + SRC_MASK_FSYS, 134 + SRC_MASK_PERIL0, 135 + SRC_MASK_PERIL1, 136 + DIV_TOP, 137 + DIV_CAM, 138 + DIV_MFC, 139 + DIV_G3D, 140 + DIV_LCD, 141 + DIV_ISP, 142 + DIV_FSYS0, 143 + DIV_FSYS1, 144 + DIV_FSYS2, 145 + DIV_PERIL0, 146 + DIV_PERIL1, 147 + DIV_PERIL3, 148 + DIV_PERIL4, 149 + DIV_PERIL5, 150 + DIV_CAM1, 151 + CLKDIV2_RATIO, 152 + GATE_SCLK_CAM, 153 + GATE_SCLK_MFC, 154 + GATE_SCLK_G3D, 155 + GATE_SCLK_LCD, 156 + GATE_SCLK_ISP_TOP, 157 + GATE_SCLK_FSYS, 158 + GATE_SCLK_PERIL, 159 + GATE_IP_CAM, 160 + GATE_IP_MFC, 161 + GATE_IP_G3D, 162 + GATE_IP_LCD, 163 + GATE_IP_ISP, 164 + GATE_IP_FSYS, 165 + GATE_IP_PERIL, 166 + GATE_BLOCK, 167 + APLL_LOCK, 168 + SRC_CPU, 169 + DIV_CPU0, 170 + DIV_CPU1, 171 + }; 172 + 173 + static int exynos3250_clk_suspend(void) 174 + { 175 + samsung_clk_save(reg_base, exynos3250_clk_regs, 176 + ARRAY_SIZE(exynos3250_cmu_clk_regs)); 177 + return 0; 178 + } 179 + 180 + static void exynos3250_clk_resume(void) 181 + { 182 + samsung_clk_restore(reg_base, exynos3250_clk_regs, 183 + ARRAY_SIZE(exynos3250_cmu_clk_regs)); 184 + } 185 + 186 + static struct syscore_ops exynos3250_clk_syscore_ops = { 187 + .suspend = exynos3250_clk_suspend, 188 + .resume = exynos3250_clk_resume, 189 + }; 190 + 191 + static void exynos3250_clk_sleep_init(void) 192 + { 193 + exynos3250_clk_regs = 194 + samsung_clk_alloc_reg_dump(exynos3250_cmu_clk_regs, 195 + ARRAY_SIZE(exynos3250_cmu_clk_regs)); 196 + if (!exynos3250_clk_regs) { 197 + pr_warn("%s: Failed to allocate sleep save data\n", __func__); 198 + goto err; 199 + } 200 + 201 + register_syscore_ops(&exynos3250_clk_syscore_ops); 202 + return; 203 + err: 204 + kfree(exynos3250_clk_regs); 205 + } 206 + #else 207 + static inline void exynos3250_clk_sleep_init(void) { } 208 + #endif 209 + 210 + /* list of all parent clock list */ 211 + PNAME(mout_vpllsrc_p) = { "fin_pll", }; 212 + 213 + PNAME(mout_apll_p) = { "fin_pll", "fout_apll", }; 214 + PNAME(mout_mpll_p) = { "fin_pll", "fout_mpll", }; 215 + PNAME(mout_vpll_p) = { "fin_pll", "fout_vpll", }; 216 + PNAME(mout_upll_p) = { "fin_pll", "fout_upll", }; 217 + 218 + PNAME(mout_mpll_user_p) = { "fin_pll", "div_mpll_pre", }; 219 + PNAME(mout_epll_user_p) = { "fin_pll", "mout_epll", }; 220 + PNAME(mout_core_p) = { "mout_apll", "mout_mpll_user_c", }; 221 + PNAME(mout_hpm_p) = { "mout_apll", "mout_mpll_user_c", }; 222 + 223 + PNAME(mout_ebi_p) = { "div_aclk_200", "div_aclk_160", }; 224 + PNAME(mout_ebi_1_p) = { "mout_ebi", "mout_vpll", }; 225 + 226 + PNAME(mout_gdl_p) = { "mout_mpll_user_l", }; 227 + PNAME(mout_gdr_p) = { "mout_mpll_user_r", }; 228 + 229 + PNAME(mout_aclk_400_mcuisp_sub_p) 230 + = { "fin_pll", "div_aclk_400_mcuisp", }; 231 + PNAME(mout_aclk_266_0_p) = { "div_mpll_pre", "mout_vpll", }; 232 + PNAME(mout_aclk_266_1_p) = { "mout_epll_user", }; 233 + PNAME(mout_aclk_266_p) = { "mout_aclk_266_0", "mout_aclk_266_1", }; 234 + PNAME(mout_aclk_266_sub_p) = { "fin_pll", "div_aclk_266", }; 235 + 236 + PNAME(group_div_mpll_pre_p) = { "div_mpll_pre", }; 237 + PNAME(group_epll_vpll_p) = { "mout_epll_user", "mout_vpll" }; 238 + PNAME(group_sclk_p) = { "xxti", "xusbxti", 239 + "none", "none", 240 + "none", "none", "div_mpll_pre", 241 + "mout_epll_user", "mout_vpll", }; 242 + PNAME(group_sclk_audio_p) = { "audiocdclk", "none", 243 + "none", "none", 244 + "xxti", "xusbxti", 245 + "div_mpll_pre", "mout_epll_user", 246 + "mout_vpll", }; 247 + PNAME(group_sclk_cam_blk_p) = { "xxti", "xusbxti", 248 + "none", "none", "none", 249 + "none", "div_mpll_pre", 250 + "mout_epll_user", "mout_vpll", 251 + "div_cam_blk_320", }; 252 + PNAME(group_sclk_fimd0_p) = { "xxti", "xusbxti", 253 + "m_bitclkhsdiv4_2l", "none", 254 + "none", "none", "div_mpll_pre", 255 + "mout_epll_user", "mout_vpll", 256 + "none", "none", "none", 257 + "div_lcd_blk_145", }; 258 + 259 + PNAME(mout_mfc_p) = { "mout_mfc_0", "mout_mfc_1" }; 260 + PNAME(mout_g3d_p) = { "mout_g3d_0", "mout_g3d_1" }; 261 + 262 + static struct samsung_fixed_factor_clock fixed_factor_clks[] __initdata = { 263 + FFACTOR(0, "sclk_mpll_1600", "mout_mpll", 1, 1, 0), 264 + FFACTOR(0, "sclk_mpll_mif", "mout_mpll", 1, 2, 0), 265 + FFACTOR(0, "sclk_bpll", "fout_bpll", 1, 2, 0), 266 + FFACTOR(0, "div_cam_blk_320", "sclk_mpll_1600", 1, 5, 0), 267 + FFACTOR(0, "div_lcd_blk_145", "sclk_mpll_1600", 1, 11, 0), 268 + 269 + /* HACK: fin_pll hardcoded to xusbxti until detection is implemented. */ 270 + FFACTOR(CLK_FIN_PLL, "fin_pll", "xusbxti", 1, 1, 0), 271 + }; 272 + 273 + static struct samsung_mux_clock mux_clks[] __initdata = { 274 + /* 275 + * NOTE: Following table is sorted by register address in ascending 276 + * order and then bitfield shift in descending order, as it is done 277 + * in the User's Manual. When adding new entries, please make sure 278 + * that the order is preserved, to avoid merge conflicts and make 279 + * further work with defined data easier. 280 + */ 281 + 282 + /* SRC_LEFTBUS */ 283 + MUX(CLK_MOUT_MPLL_USER_L, "mout_mpll_user_l", mout_mpll_user_p, 284 + SRC_LEFTBUS, 4, 1), 285 + MUX(CLK_MOUT_GDL, "mout_gdl", mout_gdl_p, SRC_LEFTBUS, 0, 1), 286 + 287 + /* SRC_RIGHTBUS */ 288 + MUX(CLK_MOUT_MPLL_USER_R, "mout_mpll_user_r", mout_mpll_user_p, 289 + SRC_RIGHTBUS, 4, 1), 290 + MUX(CLK_MOUT_GDR, "mout_gdr", mout_gdr_p, SRC_RIGHTBUS, 0, 1), 291 + 292 + /* SRC_TOP0 */ 293 + MUX(CLK_MOUT_EBI, "mout_ebi", mout_ebi_p, SRC_TOP0, 28, 1), 294 + MUX(CLK_MOUT_ACLK_200, "mout_aclk_200", group_div_mpll_pre_p,SRC_TOP0, 24, 1), 295 + MUX(CLK_MOUT_ACLK_160, "mout_aclk_160", group_div_mpll_pre_p, SRC_TOP0, 20, 1), 296 + MUX(CLK_MOUT_ACLK_100, "mout_aclk_100", group_div_mpll_pre_p, SRC_TOP0, 16, 1), 297 + MUX(CLK_MOUT_ACLK_266_1, "mout_aclk_266_1", mout_aclk_266_1_p, SRC_TOP0, 14, 1), 298 + MUX(CLK_MOUT_ACLK_266_0, "mout_aclk_266_0", mout_aclk_266_0_p, SRC_TOP0, 13, 1), 299 + MUX(CLK_MOUT_ACLK_266, "mout_aclk_266", mout_aclk_266_p, SRC_TOP0, 12, 1), 300 + MUX(CLK_MOUT_VPLL, "mout_vpll", mout_vpll_p, SRC_TOP0, 8, 1), 301 + MUX(CLK_MOUT_EPLL_USER, "mout_epll_user", mout_epll_user_p, SRC_TOP0, 4, 1), 302 + MUX(CLK_MOUT_EBI_1, "mout_ebi_1", mout_ebi_1_p, SRC_TOP0, 0, 1), 303 + 304 + /* SRC_TOP1 */ 305 + MUX(CLK_MOUT_UPLL, "mout_upll", mout_upll_p, SRC_TOP1, 28, 1), 306 + MUX(CLK_MOUT_ACLK_400_MCUISP_SUB, "mout_aclk_400_mcuisp_sub", mout_aclk_400_mcuisp_sub_p, 307 + SRC_TOP1, 24, 1), 308 + MUX(CLK_MOUT_ACLK_266_SUB, "mout_aclk_266_sub", mout_aclk_266_sub_p, SRC_TOP1, 20, 1), 309 + MUX(CLK_MOUT_MPLL, "mout_mpll", mout_mpll_p, SRC_TOP1, 12, 1), 310 + MUX(CLK_MOUT_ACLK_400_MCUISP, "mout_aclk_400_mcuisp", group_div_mpll_pre_p, SRC_TOP1, 8, 1), 311 + MUX(CLK_MOUT_VPLLSRC, "mout_vpllsrc", mout_vpllsrc_p, SRC_TOP1, 0, 1), 312 + 313 + /* SRC_CAM */ 314 + MUX(CLK_MOUT_CAM1, "mout_cam1", group_sclk_p, SRC_CAM, 20, 4), 315 + MUX(CLK_MOUT_CAM_BLK, "mout_cam_blk", group_sclk_cam_blk_p, SRC_CAM, 0, 4), 316 + 317 + /* SRC_MFC */ 318 + MUX(CLK_MOUT_MFC, "mout_mfc", mout_mfc_p, SRC_MFC, 8, 1), 319 + MUX(CLK_MOUT_MFC_1, "mout_mfc_1", group_epll_vpll_p, SRC_MFC, 4, 1), 320 + MUX(CLK_MOUT_MFC_0, "mout_mfc_0", group_div_mpll_pre_p, SRC_MFC, 0, 1), 321 + 322 + /* SRC_G3D */ 323 + MUX(CLK_MOUT_G3D, "mout_g3d", mout_g3d_p, SRC_G3D, 8, 1), 324 + MUX(CLK_MOUT_G3D_1, "mout_g3d_1", group_epll_vpll_p, SRC_G3D, 4, 1), 325 + MUX(CLK_MOUT_G3D_0, "mout_g3d_0", group_div_mpll_pre_p, SRC_G3D, 0, 1), 326 + 327 + /* SRC_LCD */ 328 + MUX(CLK_MOUT_MIPI0, "mout_mipi0", group_sclk_p, SRC_LCD, 12, 4), 329 + MUX(CLK_MOUT_FIMD0, "mout_fimd0", group_sclk_fimd0_p, SRC_LCD, 0, 4), 330 + 331 + /* SRC_ISP */ 332 + MUX(CLK_MOUT_UART_ISP, "mout_uart_isp", group_sclk_p, SRC_ISP, 12, 4), 333 + MUX(CLK_MOUT_SPI1_ISP, "mout_spi1_isp", group_sclk_p, SRC_ISP, 8, 4), 334 + MUX(CLK_MOUT_SPI0_ISP, "mout_spi0_isp", group_sclk_p, SRC_ISP, 4, 4), 335 + 336 + /* SRC_FSYS */ 337 + MUX(CLK_MOUT_TSADC, "mout_tsadc", group_sclk_p, SRC_FSYS, 28, 4), 338 + MUX(CLK_MOUT_MMC1, "mout_mmc1", group_sclk_p, SRC_FSYS, 4, 3), 339 + MUX(CLK_MOUT_MMC0, "mout_mmc0", group_sclk_p, SRC_FSYS, 0, 3), 340 + 341 + /* SRC_PERIL0 */ 342 + MUX(CLK_MOUT_UART1, "mout_uart1", group_sclk_p, SRC_PERIL0, 4, 4), 343 + MUX(CLK_MOUT_UART0, "mout_uart0", group_sclk_p, SRC_PERIL0, 0, 4), 344 + 345 + /* SRC_PERIL1 */ 346 + MUX(CLK_MOUT_SPI1, "mout_spi1", group_sclk_p, SRC_PERIL1, 20, 4), 347 + MUX(CLK_MOUT_SPI0, "mout_spi0", group_sclk_p, SRC_PERIL1, 16, 4), 348 + MUX(CLK_MOUT_AUDIO, "mout_audio", group_sclk_audio_p, SRC_PERIL1, 4, 4), 349 + 350 + /* SRC_CPU */ 351 + MUX(CLK_MOUT_MPLL_USER_C, "mout_mpll_user_c", mout_mpll_user_p, 352 + SRC_CPU, 24, 1), 353 + MUX(CLK_MOUT_HPM, "mout_hpm", mout_hpm_p, SRC_CPU, 20, 1), 354 + MUX(CLK_MOUT_CORE, "mout_core", mout_core_p, SRC_CPU, 16, 1), 355 + MUX(CLK_MOUT_APLL, "mout_apll", mout_apll_p, SRC_CPU, 0, 1), 356 + }; 357 + 358 + static struct samsung_div_clock div_clks[] __initdata = { 359 + /* 360 + * NOTE: Following table is sorted by register address in ascending 361 + * order and then bitfield shift in descending order, as it is done 362 + * in the User's Manual. When adding new entries, please make sure 363 + * that the order is preserved, to avoid merge conflicts and make 364 + * further work with defined data easier. 365 + */ 366 + 367 + /* DIV_LEFTBUS */ 368 + DIV(CLK_DIV_GPL, "div_gpl", "div_gdl", DIV_LEFTBUS, 4, 3), 369 + DIV(CLK_DIV_GDL, "div_gdl", "mout_gdl", DIV_LEFTBUS, 0, 4), 370 + 371 + /* DIV_RIGHTBUS */ 372 + DIV(CLK_DIV_GPR, "div_gpr", "div_gdr", DIV_RIGHTBUS, 4, 3), 373 + DIV(CLK_DIV_GDR, "div_gdr", "mout_gdr", DIV_RIGHTBUS, 0, 4), 374 + 375 + /* DIV_TOP */ 376 + DIV(CLK_DIV_MPLL_PRE, "div_mpll_pre", "sclk_mpll_mif", DIV_TOP, 28, 2), 377 + DIV(CLK_DIV_ACLK_400_MCUISP, "div_aclk_400_mcuisp", 378 + "mout_aclk_400_mcuisp", DIV_TOP, 24, 3), 379 + DIV(CLK_DIV_EBI, "div_ebi", "mout_ebi_1", DIV_TOP, 16, 3), 380 + DIV(CLK_DIV_ACLK_200, "div_aclk_200", "mout_aclk_200", DIV_TOP, 12, 3), 381 + DIV(CLK_DIV_ACLK_160, "div_aclk_160", "mout_aclk_160", DIV_TOP, 8, 3), 382 + DIV(CLK_DIV_ACLK_100, "div_aclk_100", "mout_aclk_100", DIV_TOP, 4, 4), 383 + DIV(CLK_DIV_ACLK_266, "div_aclk_266", "mout_aclk_266", DIV_TOP, 0, 3), 384 + 385 + /* DIV_CAM */ 386 + DIV(CLK_DIV_CAM1, "div_cam1", "mout_cam1", DIV_CAM, 20, 4), 387 + DIV(CLK_DIV_CAM_BLK, "div_cam_blk", "mout_cam_blk", DIV_CAM, 0, 4), 388 + 389 + /* DIV_MFC */ 390 + DIV(CLK_DIV_MFC, "div_mfc", "mout_mfc", DIV_MFC, 0, 4), 391 + 392 + /* DIV_G3D */ 393 + DIV(CLK_DIV_G3D, "div_g3d", "mout_g3d", DIV_G3D, 0, 4), 394 + 395 + /* DIV_LCD */ 396 + DIV_F(CLK_DIV_MIPI0_PRE, "div_mipi0_pre", "div_mipi0", DIV_LCD, 20, 4, 397 + CLK_SET_RATE_PARENT, 0), 398 + DIV(CLK_DIV_MIPI0, "div_mipi0", "mout_mipi0", DIV_LCD, 16, 4), 399 + DIV(CLK_DIV_FIMD0, "div_fimd0", "mout_fimd0", DIV_LCD, 0, 4), 400 + 401 + /* DIV_ISP */ 402 + DIV(CLK_DIV_UART_ISP, "div_uart_isp", "mout_uart_isp", DIV_ISP, 28, 4), 403 + DIV_F(CLK_DIV_SPI1_ISP_PRE, "div_spi1_isp_pre", "div_spi1_isp", 404 + DIV_ISP, 20, 8, CLK_SET_RATE_PARENT, 0), 405 + DIV(CLK_DIV_SPI1_ISP, "div_spi1_isp", "mout_spi1_isp", DIV_ISP, 16, 4), 406 + DIV_F(CLK_DIV_SPI0_ISP_PRE, "div_spi0_isp_pre", "div_spi0_isp", 407 + DIV_ISP, 8, 8, CLK_SET_RATE_PARENT, 0), 408 + DIV(CLK_DIV_SPI0_ISP, "div_spi0_isp", "mout_spi0_isp", DIV_ISP, 0, 4), 409 + 410 + /* DIV_FSYS0 */ 411 + DIV_F(CLK_DIV_TSADC_PRE, "div_tsadc_pre", "div_tsadc", DIV_FSYS0, 8, 8, 412 + CLK_SET_RATE_PARENT, 0), 413 + DIV(CLK_DIV_TSADC, "div_tsadc", "mout_tsadc", DIV_FSYS0, 0, 4), 414 + 415 + /* DIV_FSYS1 */ 416 + DIV_F(CLK_DIV_MMC1_PRE, "div_mmc1_pre", "div_mmc1", DIV_FSYS1, 24, 8, 417 + CLK_SET_RATE_PARENT, 0), 418 + DIV(CLK_DIV_MMC1, "div_mmc1", "mout_mmc1", DIV_FSYS1, 16, 4), 419 + DIV_F(CLK_DIV_MMC0_PRE, "div_mmc0_pre", "div_mmc0", DIV_FSYS1, 8, 8, 420 + CLK_SET_RATE_PARENT, 0), 421 + DIV(CLK_DIV_MMC0, "div_mmc0", "mout_mmc0", DIV_FSYS1, 0, 4), 422 + 423 + /* DIV_PERIL0 */ 424 + DIV(CLK_DIV_UART1, "div_uart1", "mout_uart1", DIV_PERIL0, 4, 4), 425 + DIV(CLK_DIV_UART0, "div_uart0", "mout_uart0", DIV_PERIL0, 0, 4), 426 + 427 + /* DIV_PERIL1 */ 428 + DIV_F(CLK_DIV_SPI1_PRE, "div_spi1_pre", "div_spi1", DIV_PERIL1, 24, 8, 429 + CLK_SET_RATE_PARENT, 0), 430 + DIV(CLK_DIV_SPI1, "div_spi1", "mout_spi1", DIV_PERIL1, 16, 4), 431 + DIV_F(CLK_DIV_SPI0_PRE, "div_spi0_pre", "div_spi0", DIV_PERIL1, 8, 8, 432 + CLK_SET_RATE_PARENT, 0), 433 + DIV(CLK_DIV_SPI0, "div_spi0", "mout_spi0", DIV_PERIL1, 0, 4), 434 + 435 + /* DIV_PERIL4 */ 436 + DIV(CLK_DIV_PCM, "div_pcm", "div_audio", DIV_PERIL4, 20, 8), 437 + DIV(CLK_DIV_AUDIO, "div_audio", "mout_audio", DIV_PERIL4, 16, 4), 438 + 439 + /* DIV_PERIL5 */ 440 + DIV(CLK_DIV_I2S, "div_i2s", "div_audio", DIV_PERIL5, 8, 6), 441 + 442 + /* DIV_CPU0 */ 443 + DIV(CLK_DIV_CORE2, "div_core2", "div_core", DIV_CPU0, 28, 3), 444 + DIV(CLK_DIV_APLL, "div_apll", "mout_apll", DIV_CPU0, 24, 3), 445 + DIV(CLK_DIV_PCLK_DBG, "div_pclk_dbg", "div_core2", DIV_CPU0, 20, 3), 446 + DIV(CLK_DIV_ATB, "div_atb", "div_core2", DIV_CPU0, 16, 3), 447 + DIV(CLK_DIV_COREM, "div_corem", "div_core2", DIV_CPU0, 4, 3), 448 + DIV(CLK_DIV_CORE, "div_core", "mout_core", DIV_CPU0, 0, 3), 449 + 450 + /* DIV_CPU1 */ 451 + DIV(CLK_DIV_HPM, "div_hpm", "div_copy", DIV_CPU1, 4, 3), 452 + DIV(CLK_DIV_COPY, "div_copy", "mout_hpm", DIV_CPU1, 0, 3), 453 + }; 454 + 455 + static struct samsung_gate_clock gate_clks[] __initdata = { 456 + /* 457 + * NOTE: Following table is sorted by register address in ascending 458 + * order and then bitfield shift in descending order, as it is done 459 + * in the User's Manual. When adding new entries, please make sure 460 + * that the order is preserved, to avoid merge conflicts and make 461 + * further work with defined data easier. 462 + */ 463 + 464 + /* GATE_IP_LEFTBUS */ 465 + GATE(CLK_ASYNC_G3D, "async_g3d", "div_aclk_100", GATE_IP_LEFTBUS, 6, 466 + CLK_IGNORE_UNUSED, 0), 467 + GATE(CLK_ASYNC_MFCL, "async_mfcl", "div_aclk_100", GATE_IP_LEFTBUS, 4, 468 + CLK_IGNORE_UNUSED, 0), 469 + GATE(CLK_PPMULEFT, "ppmuleft", "div_aclk_100", GATE_IP_LEFTBUS, 1, 470 + CLK_IGNORE_UNUSED, 0), 471 + GATE(CLK_GPIO_LEFT, "gpio_left", "div_aclk_100", GATE_IP_LEFTBUS, 0, 472 + CLK_IGNORE_UNUSED, 0), 473 + 474 + /* GATE_IP_RIGHTBUS */ 475 + GATE(CLK_ASYNC_ISPMX, "async_ispmx", "div_aclk_100", 476 + GATE_IP_RIGHTBUS, 9, CLK_IGNORE_UNUSED, 0), 477 + GATE(CLK_ASYNC_FSYSD, "async_fsysd", "div_aclk_100", 478 + GATE_IP_RIGHTBUS, 5, CLK_IGNORE_UNUSED, 0), 479 + GATE(CLK_ASYNC_LCD0X, "async_lcd0x", "div_aclk_100", 480 + GATE_IP_RIGHTBUS, 3, CLK_IGNORE_UNUSED, 0), 481 + GATE(CLK_ASYNC_CAMX, "async_camx", "div_aclk_100", GATE_IP_RIGHTBUS, 2, 482 + CLK_IGNORE_UNUSED, 0), 483 + GATE(CLK_PPMURIGHT, "ppmuright", "div_aclk_100", GATE_IP_RIGHTBUS, 1, 484 + CLK_IGNORE_UNUSED, 0), 485 + GATE(CLK_GPIO_RIGHT, "gpio_right", "div_aclk_100", GATE_IP_RIGHTBUS, 0, 486 + CLK_IGNORE_UNUSED, 0), 487 + 488 + /* GATE_IP_PERIR */ 489 + GATE(CLK_MONOCNT, "monocnt", "div_aclk_100", GATE_IP_PERIR, 22, 490 + CLK_IGNORE_UNUSED, 0), 491 + GATE(CLK_TZPC6, "tzpc6", "div_aclk_100", GATE_IP_PERIR, 21, 492 + CLK_IGNORE_UNUSED, 0), 493 + GATE(CLK_PROVISIONKEY1, "provisionkey1", "div_aclk_100", 494 + GATE_IP_PERIR, 20, CLK_IGNORE_UNUSED, 0), 495 + GATE(CLK_PROVISIONKEY0, "provisionkey0", "div_aclk_100", 496 + GATE_IP_PERIR, 19, CLK_IGNORE_UNUSED, 0), 497 + GATE(CLK_CMU_ISPPART, "cmu_isppart", "div_aclk_100", GATE_IP_PERIR, 18, 498 + CLK_IGNORE_UNUSED, 0), 499 + GATE(CLK_TMU_APBIF, "tmu_apbif", "div_aclk_100", 500 + GATE_IP_PERIR, 17, 0, 0), 501 + GATE(CLK_KEYIF, "keyif", "div_aclk_100", GATE_IP_PERIR, 16, 0, 0), 502 + GATE(CLK_RTC, "rtc", "div_aclk_100", GATE_IP_PERIR, 15, 0, 0), 503 + GATE(CLK_WDT, "wdt", "div_aclk_100", GATE_IP_PERIR, 14, 0, 0), 504 + GATE(CLK_MCT, "mct", "div_aclk_100", GATE_IP_PERIR, 13, 0, 0), 505 + GATE(CLK_SECKEY, "seckey", "div_aclk_100", GATE_IP_PERIR, 12, 506 + CLK_IGNORE_UNUSED, 0), 507 + GATE(CLK_TZPC5, "tzpc5", "div_aclk_100", GATE_IP_PERIR, 10, 508 + CLK_IGNORE_UNUSED, 0), 509 + GATE(CLK_TZPC4, "tzpc4", "div_aclk_100", GATE_IP_PERIR, 9, 510 + CLK_IGNORE_UNUSED, 0), 511 + GATE(CLK_TZPC3, "tzpc3", "div_aclk_100", GATE_IP_PERIR, 8, 512 + CLK_IGNORE_UNUSED, 0), 513 + GATE(CLK_TZPC2, "tzpc2", "div_aclk_100", GATE_IP_PERIR, 7, 514 + CLK_IGNORE_UNUSED, 0), 515 + GATE(CLK_TZPC1, "tzpc1", "div_aclk_100", GATE_IP_PERIR, 6, 516 + CLK_IGNORE_UNUSED, 0), 517 + GATE(CLK_TZPC0, "tzpc0", "div_aclk_100", GATE_IP_PERIR, 5, 518 + CLK_IGNORE_UNUSED, 0), 519 + GATE(CLK_CMU_COREPART, "cmu_corepart", "div_aclk_100", GATE_IP_PERIR, 4, 520 + CLK_IGNORE_UNUSED, 0), 521 + GATE(CLK_CMU_TOPPART, "cmu_toppart", "div_aclk_100", GATE_IP_PERIR, 3, 522 + CLK_IGNORE_UNUSED, 0), 523 + GATE(CLK_PMU_APBIF, "pmu_apbif", "div_aclk_100", GATE_IP_PERIR, 2, 524 + CLK_IGNORE_UNUSED, 0), 525 + GATE(CLK_SYSREG, "sysreg", "div_aclk_100", GATE_IP_PERIR, 1, 526 + CLK_IGNORE_UNUSED, 0), 527 + GATE(CLK_CHIP_ID, "chip_id", "div_aclk_100", GATE_IP_PERIR, 0, 528 + CLK_IGNORE_UNUSED, 0), 529 + 530 + /* GATE_SCLK_CAM */ 531 + GATE(CLK_SCLK_JPEG, "sclk_jpeg", "div_cam_blk", 532 + GATE_SCLK_CAM, 8, CLK_SET_RATE_PARENT, 0), 533 + GATE(CLK_SCLK_M2MSCALER, "sclk_m2mscaler", "div_cam_blk", 534 + GATE_SCLK_CAM, 2, CLK_SET_RATE_PARENT, 0), 535 + GATE(CLK_SCLK_GSCALER1, "sclk_gscaler1", "div_cam_blk", 536 + GATE_SCLK_CAM, 1, CLK_SET_RATE_PARENT, 0), 537 + GATE(CLK_SCLK_GSCALER0, "sclk_gscaler0", "div_cam_blk", 538 + GATE_SCLK_CAM, 0, CLK_SET_RATE_PARENT, 0), 539 + 540 + /* GATE_SCLK_MFC */ 541 + GATE(CLK_SCLK_MFC, "sclk_mfc", "div_mfc", 542 + GATE_SCLK_MFC, 0, CLK_SET_RATE_PARENT, 0), 543 + 544 + /* GATE_SCLK_G3D */ 545 + GATE(CLK_SCLK_G3D, "sclk_g3d", "div_g3d", 546 + GATE_SCLK_G3D, 0, CLK_SET_RATE_PARENT, 0), 547 + 548 + /* GATE_SCLK_LCD */ 549 + GATE(CLK_SCLK_MIPIDPHY2L, "sclk_mipidphy2l", "div_mipi0", 550 + GATE_SCLK_LCD, 4, CLK_SET_RATE_PARENT, 0), 551 + GATE(CLK_SCLK_MIPI0, "sclk_mipi0", "div_mipi0_pre", 552 + GATE_SCLK_LCD, 3, CLK_SET_RATE_PARENT, 0), 553 + GATE(CLK_SCLK_FIMD0, "sclk_fimd0", "div_fimd0", 554 + GATE_SCLK_LCD, 0, CLK_SET_RATE_PARENT, 0), 555 + 556 + /* GATE_SCLK_ISP_TOP */ 557 + GATE(CLK_SCLK_CAM1, "sclk_cam1", "div_cam1", 558 + GATE_SCLK_ISP_TOP, 4, CLK_SET_RATE_PARENT, 0), 559 + GATE(CLK_SCLK_UART_ISP, "sclk_uart_isp", "div_uart_isp", 560 + GATE_SCLK_ISP_TOP, 3, CLK_SET_RATE_PARENT, 0), 561 + GATE(CLK_SCLK_SPI1_ISP, "sclk_spi1_isp", "div_spi1_isp", 562 + GATE_SCLK_ISP_TOP, 2, CLK_SET_RATE_PARENT, 0), 563 + GATE(CLK_SCLK_SPI0_ISP, "sclk_spi0_isp", "div_spi0_isp", 564 + GATE_SCLK_ISP_TOP, 1, CLK_SET_RATE_PARENT, 0), 565 + 566 + /* GATE_SCLK_FSYS */ 567 + GATE(CLK_SCLK_UPLL, "sclk_upll", "mout_upll", GATE_SCLK_FSYS, 10, 0, 0), 568 + GATE(CLK_SCLK_TSADC, "sclk_tsadc", "div_tsadc_pre", 569 + GATE_SCLK_FSYS, 9, CLK_SET_RATE_PARENT, 0), 570 + GATE(CLK_SCLK_EBI, "sclk_ebi", "div_ebi", 571 + GATE_SCLK_FSYS, 6, CLK_SET_RATE_PARENT, 0), 572 + GATE(CLK_SCLK_MMC1, "sclk_mmc1", "div_mmc1_pre", 573 + GATE_SCLK_FSYS, 1, CLK_SET_RATE_PARENT, 0), 574 + GATE(CLK_SCLK_MMC0, "sclk_mmc0", "div_mmc0_pre", 575 + GATE_SCLK_FSYS, 0, CLK_SET_RATE_PARENT, 0), 576 + 577 + /* GATE_SCLK_PERIL */ 578 + GATE(CLK_SCLK_I2S, "sclk_i2s", "div_i2s", 579 + GATE_SCLK_PERIL, 18, CLK_SET_RATE_PARENT, 0), 580 + GATE(CLK_SCLK_PCM, "sclk_pcm", "div_pcm", 581 + GATE_SCLK_PERIL, 16, CLK_SET_RATE_PARENT, 0), 582 + GATE(CLK_SCLK_SPI1, "sclk_spi1", "div_spi1_pre", 583 + GATE_SCLK_PERIL, 7, CLK_SET_RATE_PARENT, 0), 584 + GATE(CLK_SCLK_SPI0, "sclk_spi0", "div_spi0_pre", 585 + GATE_SCLK_PERIL, 6, CLK_SET_RATE_PARENT, 0), 586 + GATE(CLK_SCLK_UART1, "sclk_uart1", "div_uart1", 587 + GATE_SCLK_PERIL, 1, CLK_SET_RATE_PARENT, 0), 588 + GATE(CLK_SCLK_UART0, "sclk_uart0", "div_uart0", 589 + GATE_SCLK_PERIL, 0, CLK_SET_RATE_PARENT, 0), 590 + 591 + /* GATE_IP_CAM */ 592 + GATE(CLK_QEJPEG, "qejpeg", "div_cam_blk_320", GATE_IP_CAM, 19, 593 + CLK_IGNORE_UNUSED, 0), 594 + GATE(CLK_PIXELASYNCM1, "pixelasyncm1", "div_cam_blk_320", 595 + GATE_IP_CAM, 18, CLK_IGNORE_UNUSED, 0), 596 + GATE(CLK_PIXELASYNCM0, "pixelasyncm0", "div_cam_blk_320", 597 + GATE_IP_CAM, 17, CLK_IGNORE_UNUSED, 0), 598 + GATE(CLK_PPMUCAMIF, "ppmucamif", "div_cam_blk_320", 599 + GATE_IP_CAM, 16, CLK_IGNORE_UNUSED, 0), 600 + GATE(CLK_QEM2MSCALER, "qem2mscaler", "div_cam_blk_320", 601 + GATE_IP_CAM, 14, CLK_IGNORE_UNUSED, 0), 602 + GATE(CLK_QEGSCALER1, "qegscaler1", "div_cam_blk_320", 603 + GATE_IP_CAM, 13, CLK_IGNORE_UNUSED, 0), 604 + GATE(CLK_QEGSCALER0, "qegscaler0", "div_cam_blk_320", 605 + GATE_IP_CAM, 12, CLK_IGNORE_UNUSED, 0), 606 + GATE(CLK_SMMUJPEG, "smmujpeg", "div_cam_blk_320", 607 + GATE_IP_CAM, 11, 0, 0), 608 + GATE(CLK_SMMUM2M2SCALER, "smmum2m2scaler", "div_cam_blk_320", 609 + GATE_IP_CAM, 9, 0, 0), 610 + GATE(CLK_SMMUGSCALER1, "smmugscaler1", "div_cam_blk_320", 611 + GATE_IP_CAM, 8, 0, 0), 612 + GATE(CLK_SMMUGSCALER0, "smmugscaler0", "div_cam_blk_320", 613 + GATE_IP_CAM, 7, 0, 0), 614 + GATE(CLK_JPEG, "jpeg", "div_cam_blk_320", GATE_IP_CAM, 6, 0, 0), 615 + GATE(CLK_M2MSCALER, "m2mscaler", "div_cam_blk_320", 616 + GATE_IP_CAM, 2, 0, 0), 617 + GATE(CLK_GSCALER1, "gscaler1", "div_cam_blk_320", GATE_IP_CAM, 1, 0, 0), 618 + GATE(CLK_GSCALER0, "gscaler0", "div_cam_blk_320", GATE_IP_CAM, 0, 0, 0), 619 + 620 + /* GATE_IP_MFC */ 621 + GATE(CLK_QEMFC, "qemfc", "div_aclk_200", GATE_IP_MFC, 5, 622 + CLK_IGNORE_UNUSED, 0), 623 + GATE(CLK_PPMUMFC_L, "ppmumfc_l", "div_aclk_200", GATE_IP_MFC, 3, 624 + CLK_IGNORE_UNUSED, 0), 625 + GATE(CLK_SMMUMFC_L, "smmumfc_l", "div_aclk_200", GATE_IP_MFC, 1, 0, 0), 626 + GATE(CLK_MFC, "mfc", "div_aclk_200", GATE_IP_MFC, 0, 0, 0), 627 + 628 + /* GATE_IP_G3D */ 629 + GATE(CLK_SMMUG3D, "smmug3d", "div_aclk_200", GATE_IP_G3D, 3, 0, 0), 630 + GATE(CLK_QEG3D, "qeg3d", "div_aclk_200", GATE_IP_G3D, 2, 631 + CLK_IGNORE_UNUSED, 0), 632 + GATE(CLK_PPMUG3D, "ppmug3d", "div_aclk_200", GATE_IP_G3D, 1, 633 + CLK_IGNORE_UNUSED, 0), 634 + GATE(CLK_G3D, "g3d", "div_aclk_200", GATE_IP_G3D, 0, 0, 0), 635 + 636 + /* GATE_IP_LCD */ 637 + GATE(CLK_QE_CH1_LCD, "qe_ch1_lcd", "div_aclk_160", GATE_IP_LCD, 7, 638 + CLK_IGNORE_UNUSED, 0), 639 + GATE(CLK_QE_CH0_LCD, "qe_ch0_lcd", "div_aclk_160", GATE_IP_LCD, 6, 640 + CLK_IGNORE_UNUSED, 0), 641 + GATE(CLK_PPMULCD0, "ppmulcd0", "div_aclk_160", GATE_IP_LCD, 5, 642 + CLK_IGNORE_UNUSED, 0), 643 + GATE(CLK_SMMUFIMD0, "smmufimd0", "div_aclk_160", GATE_IP_LCD, 4, 0, 0), 644 + GATE(CLK_DSIM0, "dsim0", "div_aclk_160", GATE_IP_LCD, 3, 0, 0), 645 + GATE(CLK_SMIES, "smies", "div_aclk_160", GATE_IP_LCD, 2, 0, 0), 646 + GATE(CLK_FIMD0, "fimd0", "div_aclk_160", GATE_IP_LCD, 0, 0, 0), 647 + 648 + /* GATE_IP_ISP */ 649 + GATE(CLK_CAM1, "cam1", "mout_aclk_266_sub", GATE_IP_ISP, 5, 0, 0), 650 + GATE(CLK_UART_ISP_TOP, "uart_isp_top", "mout_aclk_266_sub", 651 + GATE_IP_ISP, 3, 0, 0), 652 + GATE(CLK_SPI1_ISP_TOP, "spi1_isp_top", "mout_aclk_266_sub", 653 + GATE_IP_ISP, 2, 0, 0), 654 + GATE(CLK_SPI0_ISP_TOP, "spi0_isp_top", "mout_aclk_266_sub", 655 + GATE_IP_ISP, 1, 0, 0), 656 + 657 + /* GATE_IP_FSYS */ 658 + GATE(CLK_TSADC, "tsadc", "div_aclk_200", GATE_IP_FSYS, 20, 0, 0), 659 + GATE(CLK_PPMUFILE, "ppmufile", "div_aclk_200", GATE_IP_FSYS, 17, 660 + CLK_IGNORE_UNUSED, 0), 661 + GATE(CLK_USBOTG, "usbotg", "div_aclk_200", GATE_IP_FSYS, 13, 0, 0), 662 + GATE(CLK_USBHOST, "usbhost", "div_aclk_200", GATE_IP_FSYS, 12, 0, 0), 663 + GATE(CLK_SROMC, "sromc", "div_aclk_200", GATE_IP_FSYS, 11, 0, 0), 664 + GATE(CLK_SDMMC1, "sdmmc1", "div_aclk_200", GATE_IP_FSYS, 6, 0, 0), 665 + GATE(CLK_SDMMC0, "sdmmc0", "div_aclk_200", GATE_IP_FSYS, 5, 0, 0), 666 + GATE(CLK_PDMA1, "pdma1", "div_aclk_200", GATE_IP_FSYS, 1, 0, 0), 667 + GATE(CLK_PDMA0, "pdma0", "div_aclk_200", GATE_IP_FSYS, 0, 0, 0), 668 + 669 + /* GATE_IP_PERIL */ 670 + GATE(CLK_PWM, "pwm", "div_aclk_100", GATE_IP_PERIL, 24, 0, 0), 671 + GATE(CLK_PCM, "pcm", "div_aclk_100", GATE_IP_PERIL, 23, 0, 0), 672 + GATE(CLK_I2S, "i2s", "div_aclk_100", GATE_IP_PERIL, 21, 0, 0), 673 + GATE(CLK_SPI1, "spi1", "div_aclk_100", GATE_IP_PERIL, 17, 0, 0), 674 + GATE(CLK_SPI0, "spi0", "div_aclk_100", GATE_IP_PERIL, 16, 0, 0), 675 + GATE(CLK_I2C7, "i2c7", "div_aclk_100", GATE_IP_PERIL, 13, 0, 0), 676 + GATE(CLK_I2C6, "i2c6", "div_aclk_100", GATE_IP_PERIL, 12, 0, 0), 677 + GATE(CLK_I2C5, "i2c5", "div_aclk_100", GATE_IP_PERIL, 11, 0, 0), 678 + GATE(CLK_I2C4, "i2c4", "div_aclk_100", GATE_IP_PERIL, 10, 0, 0), 679 + GATE(CLK_I2C3, "i2c3", "div_aclk_100", GATE_IP_PERIL, 9, 0, 0), 680 + GATE(CLK_I2C2, "i2c2", "div_aclk_100", GATE_IP_PERIL, 8, 0, 0), 681 + GATE(CLK_I2C1, "i2c1", "div_aclk_100", GATE_IP_PERIL, 7, 0, 0), 682 + GATE(CLK_I2C0, "i2c0", "div_aclk_100", GATE_IP_PERIL, 6, 0, 0), 683 + GATE(CLK_UART1, "uart1", "div_aclk_100", GATE_IP_PERIL, 1, 0, 0), 684 + GATE(CLK_UART0, "uart0", "div_aclk_100", GATE_IP_PERIL, 0, 0, 0), 685 + }; 686 + 687 + /* APLL & MPLL & BPLL & UPLL */ 688 + static struct samsung_pll_rate_table exynos3250_pll_rates[] = { 689 + PLL_35XX_RATE(1200000000, 400, 4, 1), 690 + PLL_35XX_RATE(1100000000, 275, 3, 1), 691 + PLL_35XX_RATE(1066000000, 533, 6, 1), 692 + PLL_35XX_RATE(1000000000, 250, 3, 1), 693 + PLL_35XX_RATE( 960000000, 320, 4, 1), 694 + PLL_35XX_RATE( 900000000, 300, 4, 1), 695 + PLL_35XX_RATE( 850000000, 425, 6, 1), 696 + PLL_35XX_RATE( 800000000, 200, 3, 1), 697 + PLL_35XX_RATE( 700000000, 175, 3, 1), 698 + PLL_35XX_RATE( 667000000, 667, 12, 1), 699 + PLL_35XX_RATE( 600000000, 400, 4, 2), 700 + PLL_35XX_RATE( 533000000, 533, 6, 2), 701 + PLL_35XX_RATE( 520000000, 260, 3, 2), 702 + PLL_35XX_RATE( 500000000, 250, 3, 2), 703 + PLL_35XX_RATE( 400000000, 200, 3, 2), 704 + PLL_35XX_RATE( 200000000, 200, 3, 3), 705 + PLL_35XX_RATE( 100000000, 200, 3, 4), 706 + { /* sentinel */ } 707 + }; 708 + 709 + /* VPLL */ 710 + static struct samsung_pll_rate_table exynos3250_vpll_rates[] = { 711 + PLL_36XX_RATE(600000000, 100, 2, 1, 0), 712 + PLL_36XX_RATE(533000000, 266, 3, 2, 32768), 713 + PLL_36XX_RATE(519230987, 173, 2, 2, 5046), 714 + PLL_36XX_RATE(500000000, 250, 3, 2, 0), 715 + PLL_36XX_RATE(445500000, 148, 2, 2, 32768), 716 + PLL_36XX_RATE(445055007, 148, 2, 2, 23047), 717 + PLL_36XX_RATE(400000000, 200, 3, 2, 0), 718 + PLL_36XX_RATE(371250000, 123, 2, 2, 49152), 719 + PLL_36XX_RATE(370878997, 185, 3, 2, 28803), 720 + PLL_36XX_RATE(340000000, 170, 3, 2, 0), 721 + PLL_36XX_RATE(335000015, 111, 2, 2, 43691), 722 + PLL_36XX_RATE(333000000, 111, 2, 2, 0), 723 + PLL_36XX_RATE(330000000, 110, 2, 2, 0), 724 + PLL_36XX_RATE(320000015, 106, 2, 2, 43691), 725 + PLL_36XX_RATE(300000000, 100, 2, 2, 0), 726 + PLL_36XX_RATE(275000000, 275, 3, 3, 0), 727 + PLL_36XX_RATE(222750000, 148, 2, 3, 32768), 728 + PLL_36XX_RATE(222528007, 148, 2, 3, 23069), 729 + PLL_36XX_RATE(160000000, 160, 3, 3, 0), 730 + PLL_36XX_RATE(148500000, 99, 2, 3, 0), 731 + PLL_36XX_RATE(148352005, 98, 2, 3, 59070), 732 + PLL_36XX_RATE(108000000, 144, 2, 4, 0), 733 + PLL_36XX_RATE( 74250000, 99, 2, 4, 0), 734 + PLL_36XX_RATE( 74176002, 98, 3, 4, 59070), 735 + PLL_36XX_RATE( 54054000, 216, 3, 5, 14156), 736 + PLL_36XX_RATE( 54000000, 144, 2, 5, 0), 737 + { /* sentinel */ } 738 + }; 739 + 740 + static struct samsung_pll_clock exynos3250_plls[nr_plls] __initdata = { 741 + [apll] = PLL(pll_35xx, CLK_FOUT_APLL, "fout_apll", "fin_pll", 742 + APLL_LOCK, APLL_CON0, NULL), 743 + [mpll] = PLL(pll_35xx, CLK_FOUT_MPLL, "fout_mpll", "fin_pll", 744 + MPLL_LOCK, MPLL_CON0, NULL), 745 + [vpll] = PLL(pll_36xx, CLK_FOUT_VPLL, "fout_vpll", "fin_pll", 746 + VPLL_LOCK, VPLL_CON0, NULL), 747 + [upll] = PLL(pll_35xx, CLK_FOUT_UPLL, "fout_upll", "fin_pll", 748 + UPLL_LOCK, UPLL_CON0, NULL), 749 + }; 750 + 751 + static void __init exynos3250_cmu_init(struct device_node *np) 752 + { 753 + struct samsung_clk_provider *ctx; 754 + 755 + reg_base = of_iomap(np, 0); 756 + if (!reg_base) 757 + panic("%s: failed to map registers\n", __func__); 758 + 759 + ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS); 760 + if (!ctx) 761 + panic("%s: unable to allocate context.\n", __func__); 762 + 763 + samsung_clk_register_fixed_factor(ctx, fixed_factor_clks, 764 + ARRAY_SIZE(fixed_factor_clks)); 765 + 766 + exynos3250_plls[apll].rate_table = exynos3250_pll_rates; 767 + exynos3250_plls[mpll].rate_table = exynos3250_pll_rates; 768 + exynos3250_plls[vpll].rate_table = exynos3250_vpll_rates; 769 + exynos3250_plls[upll].rate_table = exynos3250_pll_rates; 770 + 771 + samsung_clk_register_pll(ctx, exynos3250_plls, 772 + ARRAY_SIZE(exynos3250_plls), reg_base); 773 + 774 + samsung_clk_register_mux(ctx, mux_clks, ARRAY_SIZE(mux_clks)); 775 + samsung_clk_register_div(ctx, div_clks, ARRAY_SIZE(div_clks)); 776 + samsung_clk_register_gate(ctx, gate_clks, ARRAY_SIZE(gate_clks)); 777 + 778 + exynos3250_clk_sleep_init(); 779 + } 780 + CLK_OF_DECLARE(exynos3250_cmu, "samsung,exynos3250-cmu", exynos3250_cmu_init);
+27 -24
drivers/clk/samsung/clk-exynos4.c
··· 428 428 /* fixed rate clocks generated inside the soc */ 429 429 static struct samsung_fixed_rate_clock exynos4_fixed_rate_clks[] __initdata = { 430 430 FRATE(0, "sclk_hdmi24m", NULL, CLK_IS_ROOT, 24000000), 431 - FRATE(0, "sclk_hdmiphy", NULL, CLK_IS_ROOT, 27000000), 431 + FRATE(CLK_SCLK_HDMIPHY, "sclk_hdmiphy", NULL, CLK_IS_ROOT, 27000000), 432 432 FRATE(0, "sclk_usbphy0", NULL, CLK_IS_ROOT, 48000000), 433 433 }; 434 434 ··· 903 903 GATE(CLK_AUDSS, "audss", "sclk_epll", E4X12_GATE_IP_MAUDIO, 0, 0, 0), 904 904 GATE(CLK_MDNIE0, "mdnie0", "aclk160", GATE_IP_LCD0, 2, 0, 0), 905 905 GATE(CLK_ROTATOR, "rotator", "aclk200", E4X12_GATE_IP_IMAGE, 1, 0, 0), 906 - GATE(CLK_MDMA2, "mdma2", "aclk200", E4X12_GATE_IP_IMAGE, 2, 0, 0), 906 + GATE(CLK_MDMA, "mdma", "aclk200", E4X12_GATE_IP_IMAGE, 2, 0, 0), 907 907 GATE(CLK_SMMU_MDMA, "smmu_mdma", "aclk200", E4X12_GATE_IP_IMAGE, 5, 0, 908 908 0), 909 909 GATE(CLK_MIPI_HSI, "mipi_hsi", "aclk133", GATE_IP_FSYS, 10, 0, 0), ··· 1043 1043 return xom; 1044 1044 } 1045 1045 1046 - static void __init exynos4_clk_register_finpll(void) 1046 + static void __init exynos4_clk_register_finpll(struct samsung_clk_provider *ctx) 1047 1047 { 1048 1048 struct samsung_fixed_rate_clock fclk; 1049 1049 struct clk *clk; ··· 1066 1066 fclk.parent_name = NULL; 1067 1067 fclk.flags = CLK_IS_ROOT; 1068 1068 fclk.fixed_rate = finpll_f; 1069 - samsung_clk_register_fixed_rate(&fclk, 1); 1069 + samsung_clk_register_fixed_rate(ctx, &fclk, 1); 1070 1070 1071 1071 } 1072 1072 ··· 1176 1176 static void __init exynos4_clk_init(struct device_node *np, 1177 1177 enum exynos4_soc soc) 1178 1178 { 1179 + struct samsung_clk_provider *ctx; 1179 1180 exynos4_soc = soc; 1180 1181 1181 1182 reg_base = of_iomap(np, 0); 1182 1183 if (!reg_base) 1183 1184 panic("%s: failed to map registers\n", __func__); 1184 1185 1185 - samsung_clk_init(np, reg_base, CLK_NR_CLKS); 1186 + ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS); 1187 + if (!ctx) 1188 + panic("%s: unable to allocate context.\n", __func__); 1186 1189 1187 - samsung_clk_of_register_fixed_ext(exynos4_fixed_rate_ext_clks, 1190 + samsung_clk_of_register_fixed_ext(ctx, exynos4_fixed_rate_ext_clks, 1188 1191 ARRAY_SIZE(exynos4_fixed_rate_ext_clks), 1189 1192 ext_clk_match); 1190 1193 1191 - exynos4_clk_register_finpll(); 1194 + exynos4_clk_register_finpll(ctx); 1192 1195 1193 1196 if (exynos4_soc == EXYNOS4210) { 1194 - samsung_clk_register_mux(exynos4210_mux_early, 1197 + samsung_clk_register_mux(ctx, exynos4210_mux_early, 1195 1198 ARRAY_SIZE(exynos4210_mux_early)); 1196 1199 1197 1200 if (_get_rate("fin_pll") == 24000000) { ··· 1208 1205 exynos4210_plls[vpll].rate_table = 1209 1206 exynos4210_vpll_rates; 1210 1207 1211 - samsung_clk_register_pll(exynos4210_plls, 1208 + samsung_clk_register_pll(ctx, exynos4210_plls, 1212 1209 ARRAY_SIZE(exynos4210_plls), reg_base); 1213 1210 } else { 1214 1211 if (_get_rate("fin_pll") == 24000000) { ··· 1220 1217 exynos4x12_vpll_rates; 1221 1218 } 1222 1219 1223 - samsung_clk_register_pll(exynos4x12_plls, 1220 + samsung_clk_register_pll(ctx, exynos4x12_plls, 1224 1221 ARRAY_SIZE(exynos4x12_plls), reg_base); 1225 1222 } 1226 1223 1227 - samsung_clk_register_fixed_rate(exynos4_fixed_rate_clks, 1224 + samsung_clk_register_fixed_rate(ctx, exynos4_fixed_rate_clks, 1228 1225 ARRAY_SIZE(exynos4_fixed_rate_clks)); 1229 - samsung_clk_register_mux(exynos4_mux_clks, 1226 + samsung_clk_register_mux(ctx, exynos4_mux_clks, 1230 1227 ARRAY_SIZE(exynos4_mux_clks)); 1231 - samsung_clk_register_div(exynos4_div_clks, 1228 + samsung_clk_register_div(ctx, exynos4_div_clks, 1232 1229 ARRAY_SIZE(exynos4_div_clks)); 1233 - samsung_clk_register_gate(exynos4_gate_clks, 1230 + samsung_clk_register_gate(ctx, exynos4_gate_clks, 1234 1231 ARRAY_SIZE(exynos4_gate_clks)); 1235 1232 1236 1233 if (exynos4_soc == EXYNOS4210) { 1237 - samsung_clk_register_fixed_rate(exynos4210_fixed_rate_clks, 1234 + samsung_clk_register_fixed_rate(ctx, exynos4210_fixed_rate_clks, 1238 1235 ARRAY_SIZE(exynos4210_fixed_rate_clks)); 1239 - samsung_clk_register_mux(exynos4210_mux_clks, 1236 + samsung_clk_register_mux(ctx, exynos4210_mux_clks, 1240 1237 ARRAY_SIZE(exynos4210_mux_clks)); 1241 - samsung_clk_register_div(exynos4210_div_clks, 1238 + samsung_clk_register_div(ctx, exynos4210_div_clks, 1242 1239 ARRAY_SIZE(exynos4210_div_clks)); 1243 - samsung_clk_register_gate(exynos4210_gate_clks, 1240 + samsung_clk_register_gate(ctx, exynos4210_gate_clks, 1244 1241 ARRAY_SIZE(exynos4210_gate_clks)); 1245 - samsung_clk_register_alias(exynos4210_aliases, 1242 + samsung_clk_register_alias(ctx, exynos4210_aliases, 1246 1243 ARRAY_SIZE(exynos4210_aliases)); 1247 1244 } else { 1248 - samsung_clk_register_mux(exynos4x12_mux_clks, 1245 + samsung_clk_register_mux(ctx, exynos4x12_mux_clks, 1249 1246 ARRAY_SIZE(exynos4x12_mux_clks)); 1250 - samsung_clk_register_div(exynos4x12_div_clks, 1247 + samsung_clk_register_div(ctx, exynos4x12_div_clks, 1251 1248 ARRAY_SIZE(exynos4x12_div_clks)); 1252 - samsung_clk_register_gate(exynos4x12_gate_clks, 1249 + samsung_clk_register_gate(ctx, exynos4x12_gate_clks, 1253 1250 ARRAY_SIZE(exynos4x12_gate_clks)); 1254 - samsung_clk_register_alias(exynos4x12_aliases, 1251 + samsung_clk_register_alias(ctx, exynos4x12_aliases, 1255 1252 ARRAY_SIZE(exynos4x12_aliases)); 1256 1253 } 1257 1254 1258 - samsung_clk_register_alias(exynos4_aliases, 1255 + samsung_clk_register_alias(ctx, exynos4_aliases, 1259 1256 ARRAY_SIZE(exynos4_aliases)); 1260 1257 1261 1258 exynos4_clk_sleep_init();
+72 -11
drivers/clk/samsung/clk-exynos5250.c
··· 24 24 #define APLL_CON0 0x100 25 25 #define SRC_CPU 0x200 26 26 #define DIV_CPU0 0x500 27 + #define PWR_CTRL1 0x1020 28 + #define PWR_CTRL2 0x1024 27 29 #define MPLL_LOCK 0x4000 28 30 #define MPLL_CON0 0x4100 29 31 #define SRC_CORE1 0x4204 ··· 39 37 #define VPLL_CON0 0x10140 40 38 #define GPLL_CON0 0x10150 41 39 #define SRC_TOP0 0x10210 40 + #define SRC_TOP1 0x10214 42 41 #define SRC_TOP2 0x10218 43 42 #define SRC_TOP3 0x1021c 44 43 #define SRC_GSCL 0x10220 ··· 74 71 #define GATE_IP_GSCL 0x10920 75 72 #define GATE_IP_DISP1 0x10928 76 73 #define GATE_IP_MFC 0x1092c 74 + #define GATE_IP_G3D 0x10930 77 75 #define GATE_IP_GEN 0x10934 78 76 #define GATE_IP_FSYS 0x10944 79 77 #define GATE_IP_PERIC 0x10950 ··· 83 79 #define BPLL_CON0 0x20110 84 80 #define SRC_CDREX 0x20200 85 81 #define PLL_DIV2_SEL 0x20a24 82 + 83 + /*Below definitions are used for PWR_CTRL settings*/ 84 + #define PWR_CTRL1_CORE2_DOWN_RATIO (7 << 28) 85 + #define PWR_CTRL1_CORE1_DOWN_RATIO (7 << 16) 86 + #define PWR_CTRL1_DIV2_DOWN_EN (1 << 9) 87 + #define PWR_CTRL1_DIV1_DOWN_EN (1 << 8) 88 + #define PWR_CTRL1_USE_CORE1_WFE (1 << 5) 89 + #define PWR_CTRL1_USE_CORE0_WFE (1 << 4) 90 + #define PWR_CTRL1_USE_CORE1_WFI (1 << 1) 91 + #define PWR_CTRL1_USE_CORE0_WFI (1 << 0) 92 + 93 + #define PWR_CTRL2_DIV2_UP_EN (1 << 25) 94 + #define PWR_CTRL2_DIV1_UP_EN (1 << 24) 95 + #define PWR_CTRL2_DUR_STANDBY2_VAL (1 << 16) 96 + #define PWR_CTRL2_DUR_STANDBY1_VAL (1 << 8) 97 + #define PWR_CTRL2_CORE2_UP_RATIO (1 << 4) 98 + #define PWR_CTRL2_CORE1_UP_RATIO (1 << 0) 86 99 87 100 /* list of PLLs to be registered */ 88 101 enum exynos5250_plls { ··· 119 98 static unsigned long exynos5250_clk_regs[] __initdata = { 120 99 SRC_CPU, 121 100 DIV_CPU0, 101 + PWR_CTRL1, 102 + PWR_CTRL2, 122 103 SRC_CORE1, 123 104 SRC_TOP0, 105 + SRC_TOP1, 124 106 SRC_TOP2, 125 107 SRC_TOP3, 126 108 SRC_GSCL, ··· 157 133 DIV_PERIC5, 158 134 GATE_IP_GSCL, 159 135 GATE_IP_MFC, 136 + GATE_IP_G3D, 160 137 GATE_IP_GEN, 161 138 GATE_IP_FSYS, 162 139 GATE_IP_PERIC, ··· 214 189 PNAME(mout_vpll_p) = { "mout_vpllsrc", "fout_vpll" }; 215 190 PNAME(mout_cpll_p) = { "fin_pll", "fout_cpll" }; 216 191 PNAME(mout_epll_p) = { "fin_pll", "fout_epll" }; 192 + PNAME(mout_gpll_p) = { "fin_pll", "fout_gpll" }; 217 193 PNAME(mout_mpll_user_p) = { "fin_pll", "mout_mpll" }; 218 194 PNAME(mout_bpll_user_p) = { "fin_pll", "mout_bpll" }; 219 195 PNAME(mout_aclk166_p) = { "mout_cpll", "mout_mpll_user" }; 220 196 PNAME(mout_aclk200_p) = { "mout_mpll_user", "mout_bpll_user" }; 197 + PNAME(mout_aclk400_p) = { "mout_aclk400_g3d_mid", "mout_gpll" }; 221 198 PNAME(mout_aclk200_sub_p) = { "fin_pll", "div_aclk200" }; 222 199 PNAME(mout_aclk266_sub_p) = { "fin_pll", "div_aclk266" }; 223 200 PNAME(mout_aclk333_sub_p) = { "fin_pll", "div_aclk333" }; ··· 300 273 MUX(0, "mout_aclk166", mout_aclk166_p, SRC_TOP0, 8, 1), 301 274 MUX(0, "mout_aclk200", mout_aclk200_p, SRC_TOP0, 12, 1), 302 275 MUX(0, "mout_aclk333", mout_aclk166_p, SRC_TOP0, 16, 1), 276 + MUX(0, "mout_aclk400_g3d_mid", mout_aclk200_p, SRC_TOP0, 20, 1), 277 + 278 + MUX(0, "mout_aclk400_g3d", mout_aclk400_p, SRC_TOP1, 28, 1), 303 279 304 280 MUX(0, "mout_cpll", mout_cpll_p, SRC_TOP2, 8, 1), 305 281 MUX(0, "mout_epll", mout_epll_p, SRC_TOP2, 12, 1), 306 282 MUX(0, "mout_vpll", mout_vpll_p, SRC_TOP2, 16, 1), 307 283 MUX(0, "mout_mpll_user", mout_mpll_user_p, SRC_TOP2, 20, 1), 308 284 MUX(0, "mout_bpll_user", mout_bpll_user_p, SRC_TOP2, 24, 1), 285 + MUX(CLK_MOUT_GPLL, "mout_gpll", mout_gpll_p, SRC_TOP2, 28, 1), 309 286 310 287 MUX(0, "mout_aclk200_disp1_sub", mout_aclk200_sub_p, SRC_TOP3, 4, 1), 311 288 MUX(0, "mout_aclk266_gscl_sub", mout_aclk266_sub_p, SRC_TOP3, 8, 1), ··· 382 351 DIV(0, "div_aclk200", "mout_aclk200", DIV_TOP0, 12, 3), 383 352 DIV(0, "div_aclk266", "mout_mpll_user", DIV_TOP0, 16, 3), 384 353 DIV(0, "div_aclk333", "mout_aclk333", DIV_TOP0, 20, 3), 354 + DIV(0, "div_aclk400_g3d", "mout_aclk400_g3d", DIV_TOP0, 355 + 24, 3), 385 356 386 357 DIV(0, "div_aclk66_pre", "mout_mpll_user", DIV_TOP1, 24, 3), 387 358 ··· 461 428 * CMU_ACP 462 429 */ 463 430 GATE(CLK_MDMA0, "mdma0", "div_aclk266", GATE_IP_ACP, 1, 0, 0), 431 + GATE(CLK_SSS, "sss", "div_aclk266", GATE_IP_ACP, 2, 0, 0), 464 432 GATE(CLK_G2D, "g2d", "div_aclk200", GATE_IP_ACP, 3, 0, 0), 465 433 GATE(CLK_SMMU_MDMA0, "smmu_mdma0", "div_aclk266", GATE_IP_ACP, 5, 0, 0), 466 434 ··· 567 533 0), 568 534 GATE(CLK_SMMU_MFCL, "smmu_mfcl", "mout_aclk333_sub", GATE_IP_MFC, 2, 0, 569 535 0), 570 - 536 + GATE(CLK_G3D, "g3d", "div_aclk400_g3d", GATE_IP_G3D, 0, 537 + CLK_SET_RATE_PARENT, 0), 571 538 GATE(CLK_ROTATOR, "rotator", "div_aclk266", GATE_IP_GEN, 1, 0, 0), 572 539 GATE(CLK_JPEG, "jpeg", "div_aclk166", GATE_IP_GEN, 2, 0, 0), 573 540 GATE(CLK_MDMA1, "mdma1", "div_aclk266", GATE_IP_GEN, 4, 0, 0), ··· 721 686 /* register exynox5250 clocks */ 722 687 static void __init exynos5250_clk_init(struct device_node *np) 723 688 { 689 + struct samsung_clk_provider *ctx; 690 + unsigned int tmp; 691 + 724 692 if (np) { 725 693 reg_base = of_iomap(np, 0); 726 694 if (!reg_base) ··· 732 694 panic("%s: unable to determine soc\n", __func__); 733 695 } 734 696 735 - samsung_clk_init(np, reg_base, CLK_NR_CLKS); 736 - samsung_clk_of_register_fixed_ext(exynos5250_fixed_rate_ext_clks, 697 + ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS); 698 + if (!ctx) 699 + panic("%s: unable to allocate context.\n", __func__); 700 + samsung_clk_of_register_fixed_ext(ctx, exynos5250_fixed_rate_ext_clks, 737 701 ARRAY_SIZE(exynos5250_fixed_rate_ext_clks), 738 702 ext_clk_match); 739 - samsung_clk_register_mux(exynos5250_pll_pmux_clks, 703 + samsung_clk_register_mux(ctx, exynos5250_pll_pmux_clks, 740 704 ARRAY_SIZE(exynos5250_pll_pmux_clks)); 741 705 742 706 if (_get_rate("fin_pll") == 24 * MHZ) { ··· 749 709 if (_get_rate("mout_vpllsrc") == 24 * MHZ) 750 710 exynos5250_plls[vpll].rate_table = vpll_24mhz_tbl; 751 711 752 - samsung_clk_register_pll(exynos5250_plls, ARRAY_SIZE(exynos5250_plls), 753 - reg_base); 754 - samsung_clk_register_fixed_rate(exynos5250_fixed_rate_clks, 712 + samsung_clk_register_pll(ctx, exynos5250_plls, 713 + ARRAY_SIZE(exynos5250_plls), 714 + reg_base); 715 + samsung_clk_register_fixed_rate(ctx, exynos5250_fixed_rate_clks, 755 716 ARRAY_SIZE(exynos5250_fixed_rate_clks)); 756 - samsung_clk_register_fixed_factor(exynos5250_fixed_factor_clks, 717 + samsung_clk_register_fixed_factor(ctx, exynos5250_fixed_factor_clks, 757 718 ARRAY_SIZE(exynos5250_fixed_factor_clks)); 758 - samsung_clk_register_mux(exynos5250_mux_clks, 719 + samsung_clk_register_mux(ctx, exynos5250_mux_clks, 759 720 ARRAY_SIZE(exynos5250_mux_clks)); 760 - samsung_clk_register_div(exynos5250_div_clks, 721 + samsung_clk_register_div(ctx, exynos5250_div_clks, 761 722 ARRAY_SIZE(exynos5250_div_clks)); 762 - samsung_clk_register_gate(exynos5250_gate_clks, 723 + samsung_clk_register_gate(ctx, exynos5250_gate_clks, 763 724 ARRAY_SIZE(exynos5250_gate_clks)); 725 + 726 + /* 727 + * Enable arm clock down (in idle) and set arm divider 728 + * ratios in WFI/WFE state. 729 + */ 730 + tmp = (PWR_CTRL1_CORE2_DOWN_RATIO | PWR_CTRL1_CORE1_DOWN_RATIO | 731 + PWR_CTRL1_DIV2_DOWN_EN | PWR_CTRL1_DIV1_DOWN_EN | 732 + PWR_CTRL1_USE_CORE1_WFE | PWR_CTRL1_USE_CORE0_WFE | 733 + PWR_CTRL1_USE_CORE1_WFI | PWR_CTRL1_USE_CORE0_WFI); 734 + __raw_writel(tmp, reg_base + PWR_CTRL1); 735 + 736 + /* 737 + * Enable arm clock up (on exiting idle). Set arm divider 738 + * ratios when not in idle along with the standby duration 739 + * ratios. 740 + */ 741 + tmp = (PWR_CTRL2_DIV2_UP_EN | PWR_CTRL2_DIV1_UP_EN | 742 + PWR_CTRL2_DUR_STANDBY2_VAL | PWR_CTRL2_DUR_STANDBY1_VAL | 743 + PWR_CTRL2_CORE2_UP_RATIO | PWR_CTRL2_CORE1_UP_RATIO); 744 + __raw_writel(tmp, reg_base + PWR_CTRL2); 764 745 765 746 exynos5250_clk_sleep_init(); 766 747
+1980
drivers/clk/samsung/clk-exynos5260.c
··· 1 + /* 2 + * Copyright (c) 2014 Samsung Electronics Co., Ltd. 3 + * Author: Rahul Sharma <rahul.sharma@samsung.com> 4 + * 5 + * This program is free software; you can redistribute it and/or modify 6 + * it under the terms of the GNU General Public License version 2 as 7 + * published by the Free Software Foundation. 8 + * 9 + * Common Clock Framework support for Exynos5260 SoC. 10 + */ 11 + 12 + #include <linux/clk.h> 13 + #include <linux/clkdev.h> 14 + #include <linux/clk-provider.h> 15 + #include <linux/of.h> 16 + #include <linux/of_address.h> 17 + #include <linux/syscore_ops.h> 18 + 19 + #include "clk-exynos5260.h" 20 + #include "clk.h" 21 + #include "clk-pll.h" 22 + 23 + #include <dt-bindings/clock/exynos5260-clk.h> 24 + 25 + static LIST_HEAD(clock_reg_cache_list); 26 + 27 + struct exynos5260_clock_reg_cache { 28 + struct list_head node; 29 + void __iomem *reg_base; 30 + struct samsung_clk_reg_dump *rdump; 31 + unsigned int rd_num; 32 + }; 33 + 34 + struct exynos5260_cmu_info { 35 + /* list of pll clocks and respective count */ 36 + struct samsung_pll_clock *pll_clks; 37 + unsigned int nr_pll_clks; 38 + /* list of mux clocks and respective count */ 39 + struct samsung_mux_clock *mux_clks; 40 + unsigned int nr_mux_clks; 41 + /* list of div clocks and respective count */ 42 + struct samsung_div_clock *div_clks; 43 + unsigned int nr_div_clks; 44 + /* list of gate clocks and respective count */ 45 + struct samsung_gate_clock *gate_clks; 46 + unsigned int nr_gate_clks; 47 + /* list of fixed clocks and respective count */ 48 + struct samsung_fixed_rate_clock *fixed_clks; 49 + unsigned int nr_fixed_clks; 50 + /* total number of clocks with IDs assigned*/ 51 + unsigned int nr_clk_ids; 52 + 53 + /* list and number of clocks registers */ 54 + unsigned long *clk_regs; 55 + unsigned int nr_clk_regs; 56 + }; 57 + 58 + /* 59 + * Applicable for all 2550 Type PLLS for Exynos5260, listed below 60 + * DISP_PLL, EGL_PLL, KFC_PLL, MEM_PLL, BUS_PLL, MEDIA_PLL, G3D_PLL. 61 + */ 62 + static struct samsung_pll_rate_table pll2550_24mhz_tbl[] __initdata = { 63 + PLL_35XX_RATE(1700000000, 425, 6, 0), 64 + PLL_35XX_RATE(1600000000, 200, 3, 0), 65 + PLL_35XX_RATE(1500000000, 250, 4, 0), 66 + PLL_35XX_RATE(1400000000, 175, 3, 0), 67 + PLL_35XX_RATE(1300000000, 325, 6, 0), 68 + PLL_35XX_RATE(1200000000, 400, 4, 1), 69 + PLL_35XX_RATE(1100000000, 275, 3, 1), 70 + PLL_35XX_RATE(1000000000, 250, 3, 1), 71 + PLL_35XX_RATE(933000000, 311, 4, 1), 72 + PLL_35XX_RATE(900000000, 300, 4, 1), 73 + PLL_35XX_RATE(800000000, 200, 3, 1), 74 + PLL_35XX_RATE(733000000, 733, 12, 1), 75 + PLL_35XX_RATE(700000000, 175, 3, 1), 76 + PLL_35XX_RATE(667000000, 667, 12, 1), 77 + PLL_35XX_RATE(633000000, 211, 4, 1), 78 + PLL_35XX_RATE(620000000, 310, 3, 2), 79 + PLL_35XX_RATE(600000000, 400, 4, 2), 80 + PLL_35XX_RATE(543000000, 362, 4, 2), 81 + PLL_35XX_RATE(533000000, 533, 6, 2), 82 + PLL_35XX_RATE(500000000, 250, 3, 2), 83 + PLL_35XX_RATE(450000000, 300, 4, 2), 84 + PLL_35XX_RATE(400000000, 200, 3, 2), 85 + PLL_35XX_RATE(350000000, 175, 3, 2), 86 + PLL_35XX_RATE(300000000, 400, 4, 3), 87 + PLL_35XX_RATE(266000000, 266, 3, 3), 88 + PLL_35XX_RATE(200000000, 200, 3, 3), 89 + PLL_35XX_RATE(160000000, 160, 3, 3), 90 + }; 91 + 92 + /* 93 + * Applicable for 2650 Type PLL for AUD_PLL. 94 + */ 95 + static struct samsung_pll_rate_table pll2650_24mhz_tbl[] __initdata = { 96 + PLL_36XX_RATE(1600000000, 200, 3, 0, 0), 97 + PLL_36XX_RATE(1200000000, 100, 2, 0, 0), 98 + PLL_36XX_RATE(1000000000, 250, 3, 1, 0), 99 + PLL_36XX_RATE(800000000, 200, 3, 1, 0), 100 + PLL_36XX_RATE(600000000, 100, 2, 1, 0), 101 + PLL_36XX_RATE(532000000, 266, 3, 2, 0), 102 + PLL_36XX_RATE(480000000, 160, 2, 2, 0), 103 + PLL_36XX_RATE(432000000, 144, 2, 2, 0), 104 + PLL_36XX_RATE(400000000, 200, 3, 2, 0), 105 + PLL_36XX_RATE(394073130, 459, 7, 2, 49282), 106 + PLL_36XX_RATE(333000000, 111, 2, 2, 0), 107 + PLL_36XX_RATE(300000000, 100, 2, 2, 0), 108 + PLL_36XX_RATE(266000000, 266, 3, 3, 0), 109 + PLL_36XX_RATE(200000000, 200, 3, 3, 0), 110 + PLL_36XX_RATE(166000000, 166, 3, 3, 0), 111 + PLL_36XX_RATE(133000000, 266, 3, 4, 0), 112 + PLL_36XX_RATE(100000000, 200, 3, 4, 0), 113 + PLL_36XX_RATE(66000000, 176, 2, 5, 0), 114 + }; 115 + 116 + #ifdef CONFIG_PM_SLEEP 117 + 118 + static int exynos5260_clk_suspend(void) 119 + { 120 + struct exynos5260_clock_reg_cache *cache; 121 + 122 + list_for_each_entry(cache, &clock_reg_cache_list, node) 123 + samsung_clk_save(cache->reg_base, cache->rdump, 124 + cache->rd_num); 125 + 126 + return 0; 127 + } 128 + 129 + static void exynos5260_clk_resume(void) 130 + { 131 + struct exynos5260_clock_reg_cache *cache; 132 + 133 + list_for_each_entry(cache, &clock_reg_cache_list, node) 134 + samsung_clk_restore(cache->reg_base, cache->rdump, 135 + cache->rd_num); 136 + } 137 + 138 + static struct syscore_ops exynos5260_clk_syscore_ops = { 139 + .suspend = exynos5260_clk_suspend, 140 + .resume = exynos5260_clk_resume, 141 + }; 142 + 143 + static void exynos5260_clk_sleep_init(void __iomem *reg_base, 144 + unsigned long *rdump, 145 + unsigned long nr_rdump) 146 + { 147 + struct exynos5260_clock_reg_cache *reg_cache; 148 + 149 + reg_cache = kzalloc(sizeof(struct exynos5260_clock_reg_cache), 150 + GFP_KERNEL); 151 + if (!reg_cache) 152 + panic("could not allocate register cache.\n"); 153 + 154 + reg_cache->rdump = samsung_clk_alloc_reg_dump(rdump, nr_rdump); 155 + 156 + if (!reg_cache->rdump) 157 + panic("could not allocate register dump storage.\n"); 158 + 159 + if (list_empty(&clock_reg_cache_list)) 160 + register_syscore_ops(&exynos5260_clk_syscore_ops); 161 + 162 + reg_cache->rd_num = nr_rdump; 163 + reg_cache->reg_base = reg_base; 164 + list_add_tail(&reg_cache->node, &clock_reg_cache_list); 165 + } 166 + 167 + #else 168 + static void exynos5260_clk_sleep_init(void __iomem *reg_base, 169 + unsigned long *rdump, 170 + unsigned long nr_rdump){} 171 + #endif 172 + 173 + /* 174 + * Common function which registers plls, muxes, dividers and gates 175 + * for each CMU. It also add CMU register list to register cache. 176 + */ 177 + 178 + void __init exynos5260_cmu_register_one(struct device_node *np, 179 + struct exynos5260_cmu_info *cmu) 180 + { 181 + void __iomem *reg_base; 182 + struct samsung_clk_provider *ctx; 183 + 184 + reg_base = of_iomap(np, 0); 185 + if (!reg_base) 186 + panic("%s: failed to map registers\n", __func__); 187 + 188 + ctx = samsung_clk_init(np, reg_base, cmu->nr_clk_ids); 189 + if (!ctx) 190 + panic("%s: unable to alllocate ctx\n", __func__); 191 + 192 + if (cmu->pll_clks) 193 + samsung_clk_register_pll(ctx, cmu->pll_clks, cmu->nr_pll_clks, 194 + reg_base); 195 + if (cmu->mux_clks) 196 + samsung_clk_register_mux(ctx, cmu->mux_clks, 197 + cmu->nr_mux_clks); 198 + if (cmu->div_clks) 199 + samsung_clk_register_div(ctx, cmu->div_clks, cmu->nr_div_clks); 200 + if (cmu->gate_clks) 201 + samsung_clk_register_gate(ctx, cmu->gate_clks, 202 + cmu->nr_gate_clks); 203 + if (cmu->fixed_clks) 204 + samsung_clk_register_fixed_rate(ctx, cmu->fixed_clks, 205 + cmu->nr_fixed_clks); 206 + if (cmu->clk_regs) 207 + exynos5260_clk_sleep_init(reg_base, cmu->clk_regs, 208 + cmu->nr_clk_regs); 209 + } 210 + 211 + 212 + /* CMU_AUD */ 213 + 214 + static unsigned long aud_clk_regs[] __initdata = { 215 + MUX_SEL_AUD, 216 + DIV_AUD0, 217 + DIV_AUD1, 218 + EN_ACLK_AUD, 219 + EN_PCLK_AUD, 220 + EN_SCLK_AUD, 221 + EN_IP_AUD, 222 + }; 223 + 224 + PNAME(mout_aud_pll_user_p) = {"fin_pll", "fout_aud_pll"}; 225 + PNAME(mout_sclk_aud_i2s_p) = {"mout_aud_pll_user", "ioclk_i2s_cdclk"}; 226 + PNAME(mout_sclk_aud_pcm_p) = {"mout_aud_pll_user", "ioclk_pcm_extclk"}; 227 + 228 + struct samsung_mux_clock aud_mux_clks[] __initdata = { 229 + MUX(AUD_MOUT_AUD_PLL_USER, "mout_aud_pll_user", mout_aud_pll_user_p, 230 + MUX_SEL_AUD, 0, 1), 231 + MUX(AUD_MOUT_SCLK_AUD_I2S, "mout_sclk_aud_i2s", mout_sclk_aud_i2s_p, 232 + MUX_SEL_AUD, 4, 1), 233 + MUX(AUD_MOUT_SCLK_AUD_PCM, "mout_sclk_aud_pcm", mout_sclk_aud_pcm_p, 234 + MUX_SEL_AUD, 8, 1), 235 + }; 236 + 237 + struct samsung_div_clock aud_div_clks[] __initdata = { 238 + DIV(AUD_DOUT_ACLK_AUD_131, "dout_aclk_aud_131", "mout_aud_pll_user", 239 + DIV_AUD0, 0, 4), 240 + 241 + DIV(AUD_DOUT_SCLK_AUD_I2S, "dout_sclk_aud_i2s", "mout_sclk_aud_i2s", 242 + DIV_AUD1, 0, 4), 243 + DIV(AUD_DOUT_SCLK_AUD_PCM, "dout_sclk_aud_pcm", "mout_sclk_aud_pcm", 244 + DIV_AUD1, 4, 8), 245 + DIV(AUD_DOUT_SCLK_AUD_UART, "dout_sclk_aud_uart", "mout_aud_pll_user", 246 + DIV_AUD1, 12, 4), 247 + }; 248 + 249 + struct samsung_gate_clock aud_gate_clks[] __initdata = { 250 + GATE(AUD_SCLK_I2S, "sclk_aud_i2s", "dout_sclk_aud_i2s", 251 + EN_SCLK_AUD, 0, CLK_SET_RATE_PARENT, 0), 252 + GATE(AUD_SCLK_PCM, "sclk_aud_pcm", "dout_sclk_aud_pcm", 253 + EN_SCLK_AUD, 1, CLK_SET_RATE_PARENT, 0), 254 + GATE(AUD_SCLK_AUD_UART, "sclk_aud_uart", "dout_sclk_aud_uart", 255 + EN_SCLK_AUD, 2, CLK_SET_RATE_PARENT, 0), 256 + 257 + GATE(AUD_CLK_SRAMC, "clk_sramc", "dout_aclk_aud_131", EN_IP_AUD, 258 + 0, 0, 0), 259 + GATE(AUD_CLK_DMAC, "clk_dmac", "dout_aclk_aud_131", 260 + EN_IP_AUD, 1, 0, 0), 261 + GATE(AUD_CLK_I2S, "clk_i2s", "dout_aclk_aud_131", EN_IP_AUD, 2, 0, 0), 262 + GATE(AUD_CLK_PCM, "clk_pcm", "dout_aclk_aud_131", EN_IP_AUD, 3, 0, 0), 263 + GATE(AUD_CLK_AUD_UART, "clk_aud_uart", "dout_aclk_aud_131", 264 + EN_IP_AUD, 4, 0, 0), 265 + }; 266 + 267 + static void __init exynos5260_clk_aud_init(struct device_node *np) 268 + { 269 + struct exynos5260_cmu_info cmu = {0}; 270 + 271 + cmu.mux_clks = aud_mux_clks; 272 + cmu.nr_mux_clks = ARRAY_SIZE(aud_mux_clks); 273 + cmu.div_clks = aud_div_clks; 274 + cmu.nr_div_clks = ARRAY_SIZE(aud_div_clks); 275 + cmu.gate_clks = aud_gate_clks; 276 + cmu.nr_gate_clks = ARRAY_SIZE(aud_gate_clks); 277 + cmu.nr_clk_ids = AUD_NR_CLK; 278 + cmu.clk_regs = aud_clk_regs; 279 + cmu.nr_clk_regs = ARRAY_SIZE(aud_clk_regs); 280 + 281 + exynos5260_cmu_register_one(np, &cmu); 282 + } 283 + 284 + CLK_OF_DECLARE(exynos5260_clk_aud, "samsung,exynos5260-clock-aud", 285 + exynos5260_clk_aud_init); 286 + 287 + 288 + /* CMU_DISP */ 289 + 290 + static unsigned long disp_clk_regs[] __initdata = { 291 + MUX_SEL_DISP0, 292 + MUX_SEL_DISP1, 293 + MUX_SEL_DISP2, 294 + MUX_SEL_DISP3, 295 + MUX_SEL_DISP4, 296 + DIV_DISP, 297 + EN_ACLK_DISP, 298 + EN_PCLK_DISP, 299 + EN_SCLK_DISP0, 300 + EN_SCLK_DISP1, 301 + EN_IP_DISP, 302 + EN_IP_DISP_BUS, 303 + }; 304 + 305 + PNAME(mout_phyclk_dptx_phy_ch3_txd_clk_user_p) = {"fin_pll", 306 + "phyclk_dptx_phy_ch3_txd_clk"}; 307 + PNAME(mout_phyclk_dptx_phy_ch2_txd_clk_user_p) = {"fin_pll", 308 + "phyclk_dptx_phy_ch2_txd_clk"}; 309 + PNAME(mout_phyclk_dptx_phy_ch1_txd_clk_user_p) = {"fin_pll", 310 + "phyclk_dptx_phy_ch1_txd_clk"}; 311 + PNAME(mout_phyclk_dptx_phy_ch0_txd_clk_user_p) = {"fin_pll", 312 + "phyclk_dptx_phy_ch0_txd_clk"}; 313 + PNAME(mout_aclk_disp_222_user_p) = {"fin_pll", "dout_aclk_disp_222"}; 314 + PNAME(mout_sclk_disp_pixel_user_p) = {"fin_pll", "dout_sclk_disp_pixel"}; 315 + PNAME(mout_aclk_disp_333_user_p) = {"fin_pll", "dout_aclk_disp_333"}; 316 + PNAME(mout_phyclk_hdmi_phy_tmds_clko_user_p) = {"fin_pll", 317 + "phyclk_hdmi_phy_tmds_clko"}; 318 + PNAME(mout_phyclk_hdmi_phy_ref_clko_user_p) = {"fin_pll", 319 + "phyclk_hdmi_phy_ref_clko"}; 320 + PNAME(mout_phyclk_hdmi_phy_pixel_clko_user_p) = {"fin_pll", 321 + "phyclk_hdmi_phy_pixel_clko"}; 322 + PNAME(mout_phyclk_hdmi_link_o_tmds_clkhi_user_p) = {"fin_pll", 323 + "phyclk_hdmi_link_o_tmds_clkhi"}; 324 + PNAME(mout_phyclk_mipi_dphy_4l_m_txbyte_clkhs_p) = {"fin_pll", 325 + "phyclk_mipi_dphy_4l_m_txbyte_clkhs"}; 326 + PNAME(mout_phyclk_dptx_phy_o_ref_clk_24m_user_p) = {"fin_pll", 327 + "phyclk_dptx_phy_o_ref_clk_24m"}; 328 + PNAME(mout_phyclk_dptx_phy_clk_div2_user_p) = {"fin_pll", 329 + "phyclk_dptx_phy_clk_div2"}; 330 + PNAME(mout_sclk_hdmi_pixel_p) = {"mout_sclk_disp_pixel_user", 331 + "mout_aclk_disp_222_user"}; 332 + PNAME(mout_phyclk_mipi_dphy_4lmrxclk_esc0_user_p) = {"fin_pll", 333 + "phyclk_mipi_dphy_4l_m_rxclkesc0"}; 334 + PNAME(mout_sclk_hdmi_spdif_p) = {"fin_pll", "ioclk_spdif_extclk", 335 + "dout_aclk_peri_aud", "phyclk_hdmi_phy_ref_cko"}; 336 + 337 + struct samsung_mux_clock disp_mux_clks[] __initdata = { 338 + MUX(DISP_MOUT_ACLK_DISP_333_USER, "mout_aclk_disp_333_user", 339 + mout_aclk_disp_333_user_p, 340 + MUX_SEL_DISP0, 0, 1), 341 + MUX(DISP_MOUT_SCLK_DISP_PIXEL_USER, "mout_sclk_disp_pixel_user", 342 + mout_sclk_disp_pixel_user_p, 343 + MUX_SEL_DISP0, 4, 1), 344 + MUX(DISP_MOUT_ACLK_DISP_222_USER, "mout_aclk_disp_222_user", 345 + mout_aclk_disp_222_user_p, 346 + MUX_SEL_DISP0, 8, 1), 347 + MUX(DISP_MOUT_PHYCLK_DPTX_PHY_CH0_TXD_CLK_USER, 348 + "mout_phyclk_dptx_phy_ch0_txd_clk_user", 349 + mout_phyclk_dptx_phy_ch0_txd_clk_user_p, 350 + MUX_SEL_DISP0, 16, 1), 351 + MUX(DISP_MOUT_PHYCLK_DPTX_PHY_CH1_TXD_CLK_USER, 352 + "mout_phyclk_dptx_phy_ch1_txd_clk_user", 353 + mout_phyclk_dptx_phy_ch1_txd_clk_user_p, 354 + MUX_SEL_DISP0, 20, 1), 355 + MUX(DISP_MOUT_PHYCLK_DPTX_PHY_CH2_TXD_CLK_USER, 356 + "mout_phyclk_dptx_phy_ch2_txd_clk_user", 357 + mout_phyclk_dptx_phy_ch2_txd_clk_user_p, 358 + MUX_SEL_DISP0, 24, 1), 359 + MUX(DISP_MOUT_PHYCLK_DPTX_PHY_CH3_TXD_CLK_USER, 360 + "mout_phyclk_dptx_phy_ch3_txd_clk_user", 361 + mout_phyclk_dptx_phy_ch3_txd_clk_user_p, 362 + MUX_SEL_DISP0, 28, 1), 363 + 364 + MUX(DISP_MOUT_PHYCLK_DPTX_PHY_CLK_DIV2_USER, 365 + "mout_phyclk_dptx_phy_clk_div2_user", 366 + mout_phyclk_dptx_phy_clk_div2_user_p, 367 + MUX_SEL_DISP1, 0, 1), 368 + MUX(DISP_MOUT_PHYCLK_DPTX_PHY_O_REF_CLK_24M_USER, 369 + "mout_phyclk_dptx_phy_o_ref_clk_24m_user", 370 + mout_phyclk_dptx_phy_o_ref_clk_24m_user_p, 371 + MUX_SEL_DISP1, 4, 1), 372 + MUX(DISP_MOUT_PHYCLK_MIPI_DPHY_4L_M_TXBYTE_CLKHS, 373 + "mout_phyclk_mipi_dphy_4l_m_txbyte_clkhs", 374 + mout_phyclk_mipi_dphy_4l_m_txbyte_clkhs_p, 375 + MUX_SEL_DISP1, 8, 1), 376 + MUX(DISP_MOUT_PHYCLK_HDMI_LINK_O_TMDS_CLKHI_USER, 377 + "mout_phyclk_hdmi_link_o_tmds_clkhi_user", 378 + mout_phyclk_hdmi_link_o_tmds_clkhi_user_p, 379 + MUX_SEL_DISP1, 16, 1), 380 + MUX(DISP_MOUT_HDMI_PHY_PIXEL, 381 + "mout_phyclk_hdmi_phy_pixel_clko_user", 382 + mout_phyclk_hdmi_phy_pixel_clko_user_p, 383 + MUX_SEL_DISP1, 20, 1), 384 + MUX(DISP_MOUT_PHYCLK_HDMI_PHY_REF_CLKO_USER, 385 + "mout_phyclk_hdmi_phy_ref_clko_user", 386 + mout_phyclk_hdmi_phy_ref_clko_user_p, 387 + MUX_SEL_DISP1, 24, 1), 388 + MUX(DISP_MOUT_PHYCLK_HDMI_PHY_TMDS_CLKO_USER, 389 + "mout_phyclk_hdmi_phy_tmds_clko_user", 390 + mout_phyclk_hdmi_phy_tmds_clko_user_p, 391 + MUX_SEL_DISP1, 28, 1), 392 + 393 + MUX(DISP_MOUT_PHYCLK_MIPI_DPHY_4LMRXCLK_ESC0_USER, 394 + "mout_phyclk_mipi_dphy_4lmrxclk_esc0_user", 395 + mout_phyclk_mipi_dphy_4lmrxclk_esc0_user_p, 396 + MUX_SEL_DISP2, 0, 1), 397 + MUX(DISP_MOUT_SCLK_HDMI_PIXEL, "mout_sclk_hdmi_pixel", 398 + mout_sclk_hdmi_pixel_p, 399 + MUX_SEL_DISP2, 4, 1), 400 + 401 + MUX(DISP_MOUT_SCLK_HDMI_SPDIF, "mout_sclk_hdmi_spdif", 402 + mout_sclk_hdmi_spdif_p, 403 + MUX_SEL_DISP4, 4, 2), 404 + }; 405 + 406 + struct samsung_div_clock disp_div_clks[] __initdata = { 407 + DIV(DISP_DOUT_PCLK_DISP_111, "dout_pclk_disp_111", 408 + "mout_aclk_disp_222_user", 409 + DIV_DISP, 8, 4), 410 + DIV(DISP_DOUT_SCLK_FIMD1_EXTCLKPLL, "dout_sclk_fimd1_extclkpll", 411 + "mout_sclk_disp_pixel_user", 412 + DIV_DISP, 12, 4), 413 + DIV(DISP_DOUT_SCLK_HDMI_PHY_PIXEL_CLKI, 414 + "dout_sclk_hdmi_phy_pixel_clki", 415 + "mout_sclk_hdmi_pixel", 416 + DIV_DISP, 16, 4), 417 + }; 418 + 419 + struct samsung_gate_clock disp_gate_clks[] __initdata = { 420 + GATE(DISP_MOUT_HDMI_PHY_PIXEL_USER, "sclk_hdmi_link_i_pixel", 421 + "mout_phyclk_hdmi_phy_pixel_clko_user", 422 + EN_SCLK_DISP0, 26, CLK_SET_RATE_PARENT, 0), 423 + GATE(DISP_SCLK_PIXEL, "sclk_hdmi_phy_pixel_clki", 424 + "dout_sclk_hdmi_phy_pixel_clki", 425 + EN_SCLK_DISP0, 29, CLK_SET_RATE_PARENT, 0), 426 + 427 + GATE(DISP_CLK_DP, "clk_dptx_link", "mout_aclk_disp_222_user", 428 + EN_IP_DISP, 4, 0, 0), 429 + GATE(DISP_CLK_DPPHY, "clk_dptx_phy", "mout_aclk_disp_222_user", 430 + EN_IP_DISP, 5, 0, 0), 431 + GATE(DISP_CLK_DSIM1, "clk_dsim1", "mout_aclk_disp_222_user", 432 + EN_IP_DISP, 6, 0, 0), 433 + GATE(DISP_CLK_FIMD1, "clk_fimd1", "mout_aclk_disp_222_user", 434 + EN_IP_DISP, 7, 0, 0), 435 + GATE(DISP_CLK_HDMI, "clk_hdmi", "mout_aclk_disp_222_user", 436 + EN_IP_DISP, 8, 0, 0), 437 + GATE(DISP_CLK_HDMIPHY, "clk_hdmiphy", "mout_aclk_disp_222_user", 438 + EN_IP_DISP, 9, 0, 0), 439 + GATE(DISP_CLK_MIPIPHY, "clk_mipi_dphy", "mout_aclk_disp_222_user", 440 + EN_IP_DISP, 10, 0, 0), 441 + GATE(DISP_CLK_MIXER, "clk_mixer", "mout_aclk_disp_222_user", 442 + EN_IP_DISP, 11, 0, 0), 443 + GATE(DISP_CLK_PIXEL_DISP, "clk_pixel_disp", "mout_aclk_disp_222_user", 444 + EN_IP_DISP, 12, CLK_IGNORE_UNUSED, 0), 445 + GATE(DISP_CLK_PIXEL_MIXER, "clk_pixel_mixer", "mout_aclk_disp_222_user", 446 + EN_IP_DISP, 13, CLK_IGNORE_UNUSED, 0), 447 + GATE(DISP_CLK_SMMU_FIMD1M0, "clk_smmu3_fimd1m0", 448 + "mout_aclk_disp_222_user", 449 + EN_IP_DISP, 22, 0, 0), 450 + GATE(DISP_CLK_SMMU_FIMD1M1, "clk_smmu3_fimd1m1", 451 + "mout_aclk_disp_222_user", 452 + EN_IP_DISP, 23, 0, 0), 453 + GATE(DISP_CLK_SMMU_TV, "clk_smmu3_tv", "mout_aclk_disp_222_user", 454 + EN_IP_DISP, 25, 0, 0), 455 + }; 456 + 457 + static void __init exynos5260_clk_disp_init(struct device_node *np) 458 + { 459 + struct exynos5260_cmu_info cmu = {0}; 460 + 461 + cmu.mux_clks = disp_mux_clks; 462 + cmu.nr_mux_clks = ARRAY_SIZE(disp_mux_clks); 463 + cmu.div_clks = disp_div_clks; 464 + cmu.nr_div_clks = ARRAY_SIZE(disp_div_clks); 465 + cmu.gate_clks = disp_gate_clks; 466 + cmu.nr_gate_clks = ARRAY_SIZE(disp_gate_clks); 467 + cmu.nr_clk_ids = DISP_NR_CLK; 468 + cmu.clk_regs = disp_clk_regs; 469 + cmu.nr_clk_regs = ARRAY_SIZE(disp_clk_regs); 470 + 471 + exynos5260_cmu_register_one(np, &cmu); 472 + } 473 + 474 + CLK_OF_DECLARE(exynos5260_clk_disp, "samsung,exynos5260-clock-disp", 475 + exynos5260_clk_disp_init); 476 + 477 + 478 + /* CMU_EGL */ 479 + 480 + static unsigned long egl_clk_regs[] __initdata = { 481 + EGL_PLL_LOCK, 482 + EGL_PLL_CON0, 483 + EGL_PLL_CON1, 484 + EGL_PLL_FREQ_DET, 485 + MUX_SEL_EGL, 486 + MUX_ENABLE_EGL, 487 + DIV_EGL, 488 + DIV_EGL_PLL_FDET, 489 + EN_ACLK_EGL, 490 + EN_PCLK_EGL, 491 + EN_SCLK_EGL, 492 + }; 493 + 494 + PNAME(mout_egl_b_p) = {"mout_egl_pll", "dout_bus_pll"}; 495 + PNAME(mout_egl_pll_p) = {"fin_pll", "fout_egl_pll"}; 496 + 497 + struct samsung_mux_clock egl_mux_clks[] __initdata = { 498 + MUX(EGL_MOUT_EGL_PLL, "mout_egl_pll", mout_egl_pll_p, 499 + MUX_SEL_EGL, 4, 1), 500 + MUX(EGL_MOUT_EGL_B, "mout_egl_b", mout_egl_b_p, MUX_SEL_EGL, 16, 1), 501 + }; 502 + 503 + struct samsung_div_clock egl_div_clks[] __initdata = { 504 + DIV(EGL_DOUT_EGL1, "dout_egl1", "mout_egl_b", DIV_EGL, 0, 3), 505 + DIV(EGL_DOUT_EGL2, "dout_egl2", "dout_egl1", DIV_EGL, 4, 3), 506 + DIV(EGL_DOUT_ACLK_EGL, "dout_aclk_egl", "dout_egl2", DIV_EGL, 8, 3), 507 + DIV(EGL_DOUT_PCLK_EGL, "dout_pclk_egl", "dout_egl_atclk", 508 + DIV_EGL, 12, 3), 509 + DIV(EGL_DOUT_EGL_ATCLK, "dout_egl_atclk", "dout_egl2", DIV_EGL, 16, 3), 510 + DIV(EGL_DOUT_EGL_PCLK_DBG, "dout_egl_pclk_dbg", "dout_egl_atclk", 511 + DIV_EGL, 20, 3), 512 + DIV(EGL_DOUT_EGL_PLL, "dout_egl_pll", "mout_egl_b", DIV_EGL, 24, 3), 513 + }; 514 + 515 + static struct samsung_pll_clock egl_pll_clks[] __initdata = { 516 + PLL(pll_2550xx, EGL_FOUT_EGL_PLL, "fout_egl_pll", "fin_pll", 517 + EGL_PLL_LOCK, EGL_PLL_CON0, 518 + pll2550_24mhz_tbl), 519 + }; 520 + 521 + static void __init exynos5260_clk_egl_init(struct device_node *np) 522 + { 523 + struct exynos5260_cmu_info cmu = {0}; 524 + 525 + cmu.pll_clks = egl_pll_clks; 526 + cmu.nr_pll_clks = ARRAY_SIZE(egl_pll_clks); 527 + cmu.mux_clks = egl_mux_clks; 528 + cmu.nr_mux_clks = ARRAY_SIZE(egl_mux_clks); 529 + cmu.div_clks = egl_div_clks; 530 + cmu.nr_div_clks = ARRAY_SIZE(egl_div_clks); 531 + cmu.nr_clk_ids = EGL_NR_CLK; 532 + cmu.clk_regs = egl_clk_regs; 533 + cmu.nr_clk_regs = ARRAY_SIZE(egl_clk_regs); 534 + 535 + exynos5260_cmu_register_one(np, &cmu); 536 + } 537 + 538 + CLK_OF_DECLARE(exynos5260_clk_egl, "samsung,exynos5260-clock-egl", 539 + exynos5260_clk_egl_init); 540 + 541 + 542 + /* CMU_FSYS */ 543 + 544 + static unsigned long fsys_clk_regs[] __initdata = { 545 + MUX_SEL_FSYS0, 546 + MUX_SEL_FSYS1, 547 + EN_ACLK_FSYS, 548 + EN_ACLK_FSYS_SECURE_RTIC, 549 + EN_ACLK_FSYS_SECURE_SMMU_RTIC, 550 + EN_SCLK_FSYS, 551 + EN_IP_FSYS, 552 + EN_IP_FSYS_SECURE_RTIC, 553 + EN_IP_FSYS_SECURE_SMMU_RTIC, 554 + }; 555 + 556 + PNAME(mout_phyclk_usbhost20_phyclk_user_p) = {"fin_pll", 557 + "phyclk_usbhost20_phy_phyclock"}; 558 + PNAME(mout_phyclk_usbhost20_freeclk_user_p) = {"fin_pll", 559 + "phyclk_usbhost20_phy_freeclk"}; 560 + PNAME(mout_phyclk_usbhost20_clk48mohci_user_p) = {"fin_pll", 561 + "phyclk_usbhost20_phy_clk48mohci"}; 562 + PNAME(mout_phyclk_usbdrd30_pipe_pclk_user_p) = {"fin_pll", 563 + "phyclk_usbdrd30_udrd30_pipe_pclk"}; 564 + PNAME(mout_phyclk_usbdrd30_phyclock_user_p) = {"fin_pll", 565 + "phyclk_usbdrd30_udrd30_phyclock"}; 566 + 567 + struct samsung_mux_clock fsys_mux_clks[] __initdata = { 568 + MUX(FSYS_MOUT_PHYCLK_USBDRD30_PHYCLOCK_USER, 569 + "mout_phyclk_usbdrd30_phyclock_user", 570 + mout_phyclk_usbdrd30_phyclock_user_p, 571 + MUX_SEL_FSYS1, 0, 1), 572 + MUX(FSYS_MOUT_PHYCLK_USBDRD30_PIPE_PCLK_USER, 573 + "mout_phyclk_usbdrd30_pipe_pclk_user", 574 + mout_phyclk_usbdrd30_pipe_pclk_user_p, 575 + MUX_SEL_FSYS1, 4, 1), 576 + MUX(FSYS_MOUT_PHYCLK_USBHOST20_CLK48MOHCI_USER, 577 + "mout_phyclk_usbhost20_clk48mohci_user", 578 + mout_phyclk_usbhost20_clk48mohci_user_p, 579 + MUX_SEL_FSYS1, 8, 1), 580 + MUX(FSYS_MOUT_PHYCLK_USBHOST20_FREECLK_USER, 581 + "mout_phyclk_usbhost20_freeclk_user", 582 + mout_phyclk_usbhost20_freeclk_user_p, 583 + MUX_SEL_FSYS1, 12, 1), 584 + MUX(FSYS_MOUT_PHYCLK_USBHOST20_PHYCLK_USER, 585 + "mout_phyclk_usbhost20_phyclk_user", 586 + mout_phyclk_usbhost20_phyclk_user_p, 587 + MUX_SEL_FSYS1, 16, 1), 588 + }; 589 + 590 + struct samsung_gate_clock fsys_gate_clks[] __initdata = { 591 + GATE(FSYS_PHYCLK_USBHOST20, "phyclk_usbhost20_phyclock", 592 + "mout_phyclk_usbdrd30_phyclock_user", 593 + EN_SCLK_FSYS, 1, 0, 0), 594 + GATE(FSYS_PHYCLK_USBDRD30, "phyclk_usbdrd30_udrd30_phyclock_g", 595 + "mout_phyclk_usbdrd30_phyclock_user", 596 + EN_SCLK_FSYS, 7, 0, 0), 597 + 598 + GATE(FSYS_CLK_MMC0, "clk_mmc0", "dout_aclk_fsys_200", 599 + EN_IP_FSYS, 6, 0, 0), 600 + GATE(FSYS_CLK_MMC1, "clk_mmc1", "dout_aclk_fsys_200", 601 + EN_IP_FSYS, 7, 0, 0), 602 + GATE(FSYS_CLK_MMC2, "clk_mmc2", "dout_aclk_fsys_200", 603 + EN_IP_FSYS, 8, 0, 0), 604 + GATE(FSYS_CLK_PDMA, "clk_pdma", "dout_aclk_fsys_200", 605 + EN_IP_FSYS, 9, 0, 0), 606 + GATE(FSYS_CLK_SROMC, "clk_sromc", "dout_aclk_fsys_200", 607 + EN_IP_FSYS, 13, 0, 0), 608 + GATE(FSYS_CLK_USBDRD30, "clk_usbdrd30", "dout_aclk_fsys_200", 609 + EN_IP_FSYS, 14, 0, 0), 610 + GATE(FSYS_CLK_USBHOST20, "clk_usbhost20", "dout_aclk_fsys_200", 611 + EN_IP_FSYS, 15, 0, 0), 612 + GATE(FSYS_CLK_USBLINK, "clk_usblink", "dout_aclk_fsys_200", 613 + EN_IP_FSYS, 18, 0, 0), 614 + GATE(FSYS_CLK_TSI, "clk_tsi", "dout_aclk_fsys_200", 615 + EN_IP_FSYS, 20, 0, 0), 616 + 617 + GATE(FSYS_CLK_RTIC, "clk_rtic", "dout_aclk_fsys_200", 618 + EN_IP_FSYS_SECURE_RTIC, 11, 0, 0), 619 + GATE(FSYS_CLK_SMMU_RTIC, "clk_smmu_rtic", "dout_aclk_fsys_200", 620 + EN_IP_FSYS_SECURE_SMMU_RTIC, 12, 0, 0), 621 + }; 622 + 623 + static void __init exynos5260_clk_fsys_init(struct device_node *np) 624 + { 625 + struct exynos5260_cmu_info cmu = {0}; 626 + 627 + cmu.mux_clks = fsys_mux_clks; 628 + cmu.nr_mux_clks = ARRAY_SIZE(fsys_mux_clks); 629 + cmu.gate_clks = fsys_gate_clks; 630 + cmu.nr_gate_clks = ARRAY_SIZE(fsys_gate_clks); 631 + cmu.nr_clk_ids = FSYS_NR_CLK; 632 + cmu.clk_regs = fsys_clk_regs; 633 + cmu.nr_clk_regs = ARRAY_SIZE(fsys_clk_regs); 634 + 635 + exynos5260_cmu_register_one(np, &cmu); 636 + } 637 + 638 + CLK_OF_DECLARE(exynos5260_clk_fsys, "samsung,exynos5260-clock-fsys", 639 + exynos5260_clk_fsys_init); 640 + 641 + 642 + /* CMU_G2D */ 643 + 644 + static unsigned long g2d_clk_regs[] __initdata = { 645 + MUX_SEL_G2D, 646 + MUX_STAT_G2D, 647 + DIV_G2D, 648 + EN_ACLK_G2D, 649 + EN_ACLK_G2D_SECURE_SSS, 650 + EN_ACLK_G2D_SECURE_SLIM_SSS, 651 + EN_ACLK_G2D_SECURE_SMMU_SLIM_SSS, 652 + EN_ACLK_G2D_SECURE_SMMU_SSS, 653 + EN_ACLK_G2D_SECURE_SMMU_MDMA, 654 + EN_ACLK_G2D_SECURE_SMMU_G2D, 655 + EN_PCLK_G2D, 656 + EN_PCLK_G2D_SECURE_SMMU_SLIM_SSS, 657 + EN_PCLK_G2D_SECURE_SMMU_SSS, 658 + EN_PCLK_G2D_SECURE_SMMU_MDMA, 659 + EN_PCLK_G2D_SECURE_SMMU_G2D, 660 + EN_IP_G2D, 661 + EN_IP_G2D_SECURE_SSS, 662 + EN_IP_G2D_SECURE_SLIM_SSS, 663 + EN_IP_G2D_SECURE_SMMU_SLIM_SSS, 664 + EN_IP_G2D_SECURE_SMMU_SSS, 665 + EN_IP_G2D_SECURE_SMMU_MDMA, 666 + EN_IP_G2D_SECURE_SMMU_G2D, 667 + }; 668 + 669 + PNAME(mout_aclk_g2d_333_user_p) = {"fin_pll", "dout_aclk_g2d_333"}; 670 + 671 + struct samsung_mux_clock g2d_mux_clks[] __initdata = { 672 + MUX(G2D_MOUT_ACLK_G2D_333_USER, "mout_aclk_g2d_333_user", 673 + mout_aclk_g2d_333_user_p, 674 + MUX_SEL_G2D, 0, 1), 675 + }; 676 + 677 + struct samsung_div_clock g2d_div_clks[] __initdata = { 678 + DIV(G2D_DOUT_PCLK_G2D_83, "dout_pclk_g2d_83", "mout_aclk_g2d_333_user", 679 + DIV_G2D, 0, 3), 680 + }; 681 + 682 + struct samsung_gate_clock g2d_gate_clks[] __initdata = { 683 + GATE(G2D_CLK_G2D, "clk_g2d", "mout_aclk_g2d_333_user", 684 + EN_IP_G2D, 4, 0, 0), 685 + GATE(G2D_CLK_JPEG, "clk_jpeg", "mout_aclk_g2d_333_user", 686 + EN_IP_G2D, 5, 0, 0), 687 + GATE(G2D_CLK_MDMA, "clk_mdma", "mout_aclk_g2d_333_user", 688 + EN_IP_G2D, 6, 0, 0), 689 + GATE(G2D_CLK_SMMU3_JPEG, "clk_smmu3_jpeg", "mout_aclk_g2d_333_user", 690 + EN_IP_G2D, 16, 0, 0), 691 + 692 + GATE(G2D_CLK_SSS, "clk_sss", "mout_aclk_g2d_333_user", 693 + EN_IP_G2D_SECURE_SSS, 17, 0, 0), 694 + 695 + GATE(G2D_CLK_SLIM_SSS, "clk_slim_sss", "mout_aclk_g2d_333_user", 696 + EN_IP_G2D_SECURE_SLIM_SSS, 11, 0, 0), 697 + 698 + GATE(G2D_CLK_SMMU_SLIM_SSS, "clk_smmu_slim_sss", 699 + "mout_aclk_g2d_333_user", 700 + EN_IP_G2D_SECURE_SMMU_SLIM_SSS, 13, 0, 0), 701 + 702 + GATE(G2D_CLK_SMMU_SSS, "clk_smmu_sss", "mout_aclk_g2d_333_user", 703 + EN_IP_G2D_SECURE_SMMU_SSS, 14, 0, 0), 704 + 705 + GATE(G2D_CLK_SMMU_MDMA, "clk_smmu_mdma", "mout_aclk_g2d_333_user", 706 + EN_IP_G2D_SECURE_SMMU_MDMA, 12, 0, 0), 707 + 708 + GATE(G2D_CLK_SMMU3_G2D, "clk_smmu3_g2d", "mout_aclk_g2d_333_user", 709 + EN_IP_G2D_SECURE_SMMU_G2D, 15, 0, 0), 710 + }; 711 + 712 + static void __init exynos5260_clk_g2d_init(struct device_node *np) 713 + { 714 + struct exynos5260_cmu_info cmu = {0}; 715 + 716 + cmu.mux_clks = g2d_mux_clks; 717 + cmu.nr_mux_clks = ARRAY_SIZE(g2d_mux_clks); 718 + cmu.div_clks = g2d_div_clks; 719 + cmu.nr_div_clks = ARRAY_SIZE(g2d_div_clks); 720 + cmu.gate_clks = g2d_gate_clks; 721 + cmu.nr_gate_clks = ARRAY_SIZE(g2d_gate_clks); 722 + cmu.nr_clk_ids = G2D_NR_CLK; 723 + cmu.clk_regs = g2d_clk_regs; 724 + cmu.nr_clk_regs = ARRAY_SIZE(g2d_clk_regs); 725 + 726 + exynos5260_cmu_register_one(np, &cmu); 727 + } 728 + 729 + CLK_OF_DECLARE(exynos5260_clk_g2d, "samsung,exynos5260-clock-g2d", 730 + exynos5260_clk_g2d_init); 731 + 732 + 733 + /* CMU_G3D */ 734 + 735 + static unsigned long g3d_clk_regs[] __initdata = { 736 + G3D_PLL_LOCK, 737 + G3D_PLL_CON0, 738 + G3D_PLL_CON1, 739 + G3D_PLL_FDET, 740 + MUX_SEL_G3D, 741 + DIV_G3D, 742 + DIV_G3D_PLL_FDET, 743 + EN_ACLK_G3D, 744 + EN_PCLK_G3D, 745 + EN_SCLK_G3D, 746 + EN_IP_G3D, 747 + }; 748 + 749 + PNAME(mout_g3d_pll_p) = {"fin_pll", "fout_g3d_pll"}; 750 + 751 + struct samsung_mux_clock g3d_mux_clks[] __initdata = { 752 + MUX(G3D_MOUT_G3D_PLL, "mout_g3d_pll", mout_g3d_pll_p, 753 + MUX_SEL_G3D, 0, 1), 754 + }; 755 + 756 + struct samsung_div_clock g3d_div_clks[] __initdata = { 757 + DIV(G3D_DOUT_PCLK_G3D, "dout_pclk_g3d", "dout_aclk_g3d", DIV_G3D, 0, 3), 758 + DIV(G3D_DOUT_ACLK_G3D, "dout_aclk_g3d", "mout_g3d_pll", DIV_G3D, 4, 3), 759 + }; 760 + 761 + struct samsung_gate_clock g3d_gate_clks[] __initdata = { 762 + GATE(G3D_CLK_G3D, "clk_g3d", "dout_aclk_g3d", EN_IP_G3D, 2, 0, 0), 763 + GATE(G3D_CLK_G3D_HPM, "clk_g3d_hpm", "dout_aclk_g3d", 764 + EN_IP_G3D, 3, 0, 0), 765 + }; 766 + 767 + static struct samsung_pll_clock g3d_pll_clks[] __initdata = { 768 + PLL(pll_2550, G3D_FOUT_G3D_PLL, "fout_g3d_pll", "fin_pll", 769 + G3D_PLL_LOCK, G3D_PLL_CON0, 770 + pll2550_24mhz_tbl), 771 + }; 772 + 773 + static void __init exynos5260_clk_g3d_init(struct device_node *np) 774 + { 775 + struct exynos5260_cmu_info cmu = {0}; 776 + 777 + cmu.pll_clks = g3d_pll_clks; 778 + cmu.nr_pll_clks = ARRAY_SIZE(g3d_pll_clks); 779 + cmu.mux_clks = g3d_mux_clks; 780 + cmu.nr_mux_clks = ARRAY_SIZE(g3d_mux_clks); 781 + cmu.div_clks = g3d_div_clks; 782 + cmu.nr_div_clks = ARRAY_SIZE(g3d_div_clks); 783 + cmu.gate_clks = g3d_gate_clks; 784 + cmu.nr_gate_clks = ARRAY_SIZE(g3d_gate_clks); 785 + cmu.nr_clk_ids = G3D_NR_CLK; 786 + cmu.clk_regs = g3d_clk_regs; 787 + cmu.nr_clk_regs = ARRAY_SIZE(g3d_clk_regs); 788 + 789 + exynos5260_cmu_register_one(np, &cmu); 790 + } 791 + 792 + CLK_OF_DECLARE(exynos5260_clk_g3d, "samsung,exynos5260-clock-g3d", 793 + exynos5260_clk_g3d_init); 794 + 795 + 796 + /* CMU_GSCL */ 797 + 798 + static unsigned long gscl_clk_regs[] __initdata = { 799 + MUX_SEL_GSCL, 800 + DIV_GSCL, 801 + EN_ACLK_GSCL, 802 + EN_ACLK_GSCL_FIMC, 803 + EN_ACLK_GSCL_SECURE_SMMU_GSCL0, 804 + EN_ACLK_GSCL_SECURE_SMMU_GSCL1, 805 + EN_ACLK_GSCL_SECURE_SMMU_MSCL0, 806 + EN_ACLK_GSCL_SECURE_SMMU_MSCL1, 807 + EN_PCLK_GSCL, 808 + EN_PCLK_GSCL_FIMC, 809 + EN_PCLK_GSCL_SECURE_SMMU_GSCL0, 810 + EN_PCLK_GSCL_SECURE_SMMU_GSCL1, 811 + EN_PCLK_GSCL_SECURE_SMMU_MSCL0, 812 + EN_PCLK_GSCL_SECURE_SMMU_MSCL1, 813 + EN_SCLK_GSCL, 814 + EN_SCLK_GSCL_FIMC, 815 + EN_IP_GSCL, 816 + EN_IP_GSCL_FIMC, 817 + EN_IP_GSCL_SECURE_SMMU_GSCL0, 818 + EN_IP_GSCL_SECURE_SMMU_GSCL1, 819 + EN_IP_GSCL_SECURE_SMMU_MSCL0, 820 + EN_IP_GSCL_SECURE_SMMU_MSCL1, 821 + }; 822 + 823 + PNAME(mout_aclk_gscl_333_user_p) = {"fin_pll", "dout_aclk_gscl_333"}; 824 + PNAME(mout_aclk_m2m_400_user_p) = {"fin_pll", "dout_aclk_gscl_400"}; 825 + PNAME(mout_aclk_gscl_fimc_user_p) = {"fin_pll", "dout_aclk_gscl_400"}; 826 + PNAME(mout_aclk_csis_p) = {"dout_aclk_csis_200", "mout_aclk_gscl_fimc_user"}; 827 + 828 + struct samsung_mux_clock gscl_mux_clks[] __initdata = { 829 + MUX(GSCL_MOUT_ACLK_GSCL_333_USER, "mout_aclk_gscl_333_user", 830 + mout_aclk_gscl_333_user_p, 831 + MUX_SEL_GSCL, 0, 1), 832 + MUX(GSCL_MOUT_ACLK_M2M_400_USER, "mout_aclk_m2m_400_user", 833 + mout_aclk_m2m_400_user_p, 834 + MUX_SEL_GSCL, 4, 1), 835 + MUX(GSCL_MOUT_ACLK_GSCL_FIMC_USER, "mout_aclk_gscl_fimc_user", 836 + mout_aclk_gscl_fimc_user_p, 837 + MUX_SEL_GSCL, 8, 1), 838 + MUX(GSCL_MOUT_ACLK_CSIS, "mout_aclk_csis", mout_aclk_csis_p, 839 + MUX_SEL_GSCL, 24, 1), 840 + }; 841 + 842 + struct samsung_div_clock gscl_div_clks[] __initdata = { 843 + DIV(GSCL_DOUT_PCLK_M2M_100, "dout_pclk_m2m_100", 844 + "mout_aclk_m2m_400_user", 845 + DIV_GSCL, 0, 3), 846 + DIV(GSCL_DOUT_ACLK_CSIS_200, "dout_aclk_csis_200", 847 + "mout_aclk_m2m_400_user", 848 + DIV_GSCL, 4, 3), 849 + }; 850 + 851 + struct samsung_gate_clock gscl_gate_clks[] __initdata = { 852 + GATE(GSCL_SCLK_CSIS0_WRAP, "sclk_csis0_wrap", "dout_aclk_csis_200", 853 + EN_SCLK_GSCL_FIMC, 0, CLK_SET_RATE_PARENT, 0), 854 + GATE(GSCL_SCLK_CSIS1_WRAP, "sclk_csis1_wrap", "dout_aclk_csis_200", 855 + EN_SCLK_GSCL_FIMC, 1, CLK_SET_RATE_PARENT, 0), 856 + 857 + GATE(GSCL_CLK_GSCL0, "clk_gscl0", "mout_aclk_gscl_333_user", 858 + EN_IP_GSCL, 2, 0, 0), 859 + GATE(GSCL_CLK_GSCL1, "clk_gscl1", "mout_aclk_gscl_333_user", 860 + EN_IP_GSCL, 3, 0, 0), 861 + GATE(GSCL_CLK_MSCL0, "clk_mscl0", "mout_aclk_gscl_333_user", 862 + EN_IP_GSCL, 4, 0, 0), 863 + GATE(GSCL_CLK_MSCL1, "clk_mscl1", "mout_aclk_gscl_333_user", 864 + EN_IP_GSCL, 5, 0, 0), 865 + GATE(GSCL_CLK_PIXEL_GSCL0, "clk_pixel_gscl0", 866 + "mout_aclk_gscl_333_user", 867 + EN_IP_GSCL, 8, 0, 0), 868 + GATE(GSCL_CLK_PIXEL_GSCL1, "clk_pixel_gscl1", 869 + "mout_aclk_gscl_333_user", 870 + EN_IP_GSCL, 9, 0, 0), 871 + 872 + GATE(GSCL_CLK_SMMU3_LITE_A, "clk_smmu3_lite_a", 873 + "mout_aclk_gscl_fimc_user", 874 + EN_IP_GSCL_FIMC, 5, 0, 0), 875 + GATE(GSCL_CLK_SMMU3_LITE_B, "clk_smmu3_lite_b", 876 + "mout_aclk_gscl_fimc_user", 877 + EN_IP_GSCL_FIMC, 6, 0, 0), 878 + GATE(GSCL_CLK_SMMU3_LITE_D, "clk_smmu3_lite_d", 879 + "mout_aclk_gscl_fimc_user", 880 + EN_IP_GSCL_FIMC, 7, 0, 0), 881 + GATE(GSCL_CLK_CSIS0, "clk_csis0", "mout_aclk_gscl_fimc_user", 882 + EN_IP_GSCL_FIMC, 8, 0, 0), 883 + GATE(GSCL_CLK_CSIS1, "clk_csis1", "mout_aclk_gscl_fimc_user", 884 + EN_IP_GSCL_FIMC, 9, 0, 0), 885 + GATE(GSCL_CLK_FIMC_LITE_A, "clk_fimc_lite_a", 886 + "mout_aclk_gscl_fimc_user", 887 + EN_IP_GSCL_FIMC, 10, 0, 0), 888 + GATE(GSCL_CLK_FIMC_LITE_B, "clk_fimc_lite_b", 889 + "mout_aclk_gscl_fimc_user", 890 + EN_IP_GSCL_FIMC, 11, 0, 0), 891 + GATE(GSCL_CLK_FIMC_LITE_D, "clk_fimc_lite_d", 892 + "mout_aclk_gscl_fimc_user", 893 + EN_IP_GSCL_FIMC, 12, 0, 0), 894 + 895 + GATE(GSCL_CLK_SMMU3_GSCL0, "clk_smmu3_gscl0", 896 + "mout_aclk_gscl_333_user", 897 + EN_IP_GSCL_SECURE_SMMU_GSCL0, 17, 0, 0), 898 + GATE(GSCL_CLK_SMMU3_GSCL1, "clk_smmu3_gscl1", "mout_aclk_gscl_333_user", 899 + EN_IP_GSCL_SECURE_SMMU_GSCL1, 18, 0, 0), 900 + GATE(GSCL_CLK_SMMU3_MSCL0, "clk_smmu3_mscl0", 901 + "mout_aclk_m2m_400_user", 902 + EN_IP_GSCL_SECURE_SMMU_MSCL0, 19, 0, 0), 903 + GATE(GSCL_CLK_SMMU3_MSCL1, "clk_smmu3_mscl1", 904 + "mout_aclk_m2m_400_user", 905 + EN_IP_GSCL_SECURE_SMMU_MSCL1, 20, 0, 0), 906 + }; 907 + 908 + static void __init exynos5260_clk_gscl_init(struct device_node *np) 909 + { 910 + struct exynos5260_cmu_info cmu = {0}; 911 + 912 + cmu.mux_clks = gscl_mux_clks; 913 + cmu.nr_mux_clks = ARRAY_SIZE(gscl_mux_clks); 914 + cmu.div_clks = gscl_div_clks; 915 + cmu.nr_div_clks = ARRAY_SIZE(gscl_div_clks); 916 + cmu.gate_clks = gscl_gate_clks; 917 + cmu.nr_gate_clks = ARRAY_SIZE(gscl_gate_clks); 918 + cmu.nr_clk_ids = GSCL_NR_CLK; 919 + cmu.clk_regs = gscl_clk_regs; 920 + cmu.nr_clk_regs = ARRAY_SIZE(gscl_clk_regs); 921 + 922 + exynos5260_cmu_register_one(np, &cmu); 923 + } 924 + 925 + CLK_OF_DECLARE(exynos5260_clk_gscl, "samsung,exynos5260-clock-gscl", 926 + exynos5260_clk_gscl_init); 927 + 928 + 929 + /* CMU_ISP */ 930 + 931 + static unsigned long isp_clk_regs[] __initdata = { 932 + MUX_SEL_ISP0, 933 + MUX_SEL_ISP1, 934 + DIV_ISP, 935 + EN_ACLK_ISP0, 936 + EN_ACLK_ISP1, 937 + EN_PCLK_ISP0, 938 + EN_PCLK_ISP1, 939 + EN_SCLK_ISP, 940 + EN_IP_ISP0, 941 + EN_IP_ISP1, 942 + }; 943 + 944 + PNAME(mout_isp_400_user_p) = {"fin_pll", "dout_aclk_isp1_400"}; 945 + PNAME(mout_isp_266_user_p) = {"fin_pll", "dout_aclk_isp1_266"}; 946 + 947 + struct samsung_mux_clock isp_mux_clks[] __initdata = { 948 + MUX(ISP_MOUT_ISP_266_USER, "mout_isp_266_user", mout_isp_266_user_p, 949 + MUX_SEL_ISP0, 0, 1), 950 + MUX(ISP_MOUT_ISP_400_USER, "mout_isp_400_user", mout_isp_400_user_p, 951 + MUX_SEL_ISP0, 4, 1), 952 + }; 953 + 954 + struct samsung_div_clock isp_div_clks[] __initdata = { 955 + DIV(ISP_DOUT_PCLK_ISP_66, "dout_pclk_isp_66", "mout_kfc", 956 + DIV_ISP, 0, 3), 957 + DIV(ISP_DOUT_PCLK_ISP_133, "dout_pclk_isp_133", "mout_kfc", 958 + DIV_ISP, 4, 4), 959 + DIV(ISP_DOUT_CA5_ATCLKIN, "dout_ca5_atclkin", "mout_kfc", 960 + DIV_ISP, 12, 3), 961 + DIV(ISP_DOUT_CA5_PCLKDBG, "dout_ca5_pclkdbg", "mout_kfc", 962 + DIV_ISP, 16, 4), 963 + DIV(ISP_DOUT_SCLK_MPWM, "dout_sclk_mpwm", "mout_kfc", DIV_ISP, 20, 2), 964 + }; 965 + 966 + struct samsung_gate_clock isp_gate_clks[] __initdata = { 967 + GATE(ISP_CLK_GIC, "clk_isp_gic", "mout_aclk_isp1_266", 968 + EN_IP_ISP0, 15, 0, 0), 969 + 970 + GATE(ISP_CLK_CA5, "clk_isp_ca5", "mout_aclk_isp1_266", 971 + EN_IP_ISP1, 1, 0, 0), 972 + GATE(ISP_CLK_FIMC_DRC, "clk_isp_fimc_drc", "mout_aclk_isp1_266", 973 + EN_IP_ISP1, 2, 0, 0), 974 + GATE(ISP_CLK_FIMC_FD, "clk_isp_fimc_fd", "mout_aclk_isp1_266", 975 + EN_IP_ISP1, 3, 0, 0), 976 + GATE(ISP_CLK_FIMC, "clk_isp_fimc", "mout_aclk_isp1_266", 977 + EN_IP_ISP1, 4, 0, 0), 978 + GATE(ISP_CLK_FIMC_SCALERC, "clk_isp_fimc_scalerc", 979 + "mout_aclk_isp1_266", 980 + EN_IP_ISP1, 5, 0, 0), 981 + GATE(ISP_CLK_FIMC_SCALERP, "clk_isp_fimc_scalerp", 982 + "mout_aclk_isp1_266", 983 + EN_IP_ISP1, 6, 0, 0), 984 + GATE(ISP_CLK_I2C0, "clk_isp_i2c0", "mout_aclk_isp1_266", 985 + EN_IP_ISP1, 7, 0, 0), 986 + GATE(ISP_CLK_I2C1, "clk_isp_i2c1", "mout_aclk_isp1_266", 987 + EN_IP_ISP1, 8, 0, 0), 988 + GATE(ISP_CLK_MCUCTL, "clk_isp_mcuctl", "mout_aclk_isp1_266", 989 + EN_IP_ISP1, 9, 0, 0), 990 + GATE(ISP_CLK_MPWM, "clk_isp_mpwm", "mout_aclk_isp1_266", 991 + EN_IP_ISP1, 10, 0, 0), 992 + GATE(ISP_CLK_MTCADC, "clk_isp_mtcadc", "mout_aclk_isp1_266", 993 + EN_IP_ISP1, 11, 0, 0), 994 + GATE(ISP_CLK_PWM, "clk_isp_pwm", "mout_aclk_isp1_266", 995 + EN_IP_ISP1, 14, 0, 0), 996 + GATE(ISP_CLK_SMMU_DRC, "clk_smmu_drc", "mout_aclk_isp1_266", 997 + EN_IP_ISP1, 21, 0, 0), 998 + GATE(ISP_CLK_SMMU_FD, "clk_smmu_fd", "mout_aclk_isp1_266", 999 + EN_IP_ISP1, 22, 0, 0), 1000 + GATE(ISP_CLK_SMMU_ISP, "clk_smmu_isp", "mout_aclk_isp1_266", 1001 + EN_IP_ISP1, 23, 0, 0), 1002 + GATE(ISP_CLK_SMMU_ISPCX, "clk_smmu_ispcx", "mout_aclk_isp1_266", 1003 + EN_IP_ISP1, 24, 0, 0), 1004 + GATE(ISP_CLK_SMMU_SCALERC, "clk_isp_smmu_scalerc", 1005 + "mout_aclk_isp1_266", 1006 + EN_IP_ISP1, 25, 0, 0), 1007 + GATE(ISP_CLK_SMMU_SCALERP, "clk_isp_smmu_scalerp", 1008 + "mout_aclk_isp1_266", 1009 + EN_IP_ISP1, 26, 0, 0), 1010 + GATE(ISP_CLK_SPI0, "clk_isp_spi0", "mout_aclk_isp1_266", 1011 + EN_IP_ISP1, 27, 0, 0), 1012 + GATE(ISP_CLK_SPI1, "clk_isp_spi1", "mout_aclk_isp1_266", 1013 + EN_IP_ISP1, 28, 0, 0), 1014 + GATE(ISP_CLK_WDT, "clk_isp_wdt", "mout_aclk_isp1_266", 1015 + EN_IP_ISP1, 31, 0, 0), 1016 + GATE(ISP_CLK_UART, "clk_isp_uart", "mout_aclk_isp1_266", 1017 + EN_IP_ISP1, 30, 0, 0), 1018 + 1019 + GATE(ISP_SCLK_UART_EXT, "sclk_isp_uart_ext", "fin_pll", 1020 + EN_SCLK_ISP, 7, CLK_SET_RATE_PARENT, 0), 1021 + GATE(ISP_SCLK_SPI1_EXT, "sclk_isp_spi1_ext", "fin_pll", 1022 + EN_SCLK_ISP, 8, CLK_SET_RATE_PARENT, 0), 1023 + GATE(ISP_SCLK_SPI0_EXT, "sclk_isp_spi0_ext", "fin_pll", 1024 + EN_SCLK_ISP, 9, CLK_SET_RATE_PARENT, 0), 1025 + }; 1026 + 1027 + static void __init exynos5260_clk_isp_init(struct device_node *np) 1028 + { 1029 + struct exynos5260_cmu_info cmu = {0}; 1030 + 1031 + cmu.mux_clks = isp_mux_clks; 1032 + cmu.nr_mux_clks = ARRAY_SIZE(isp_mux_clks); 1033 + cmu.div_clks = isp_div_clks; 1034 + cmu.nr_div_clks = ARRAY_SIZE(isp_div_clks); 1035 + cmu.gate_clks = isp_gate_clks; 1036 + cmu.nr_gate_clks = ARRAY_SIZE(isp_gate_clks); 1037 + cmu.nr_clk_ids = ISP_NR_CLK; 1038 + cmu.clk_regs = isp_clk_regs; 1039 + cmu.nr_clk_regs = ARRAY_SIZE(isp_clk_regs); 1040 + 1041 + exynos5260_cmu_register_one(np, &cmu); 1042 + } 1043 + 1044 + CLK_OF_DECLARE(exynos5260_clk_isp, "samsung,exynos5260-clock-isp", 1045 + exynos5260_clk_isp_init); 1046 + 1047 + 1048 + /* CMU_KFC */ 1049 + 1050 + static unsigned long kfc_clk_regs[] __initdata = { 1051 + KFC_PLL_LOCK, 1052 + KFC_PLL_CON0, 1053 + KFC_PLL_CON1, 1054 + KFC_PLL_FDET, 1055 + MUX_SEL_KFC0, 1056 + MUX_SEL_KFC2, 1057 + DIV_KFC, 1058 + DIV_KFC_PLL_FDET, 1059 + EN_ACLK_KFC, 1060 + EN_PCLK_KFC, 1061 + EN_SCLK_KFC, 1062 + EN_IP_KFC, 1063 + }; 1064 + 1065 + PNAME(mout_kfc_pll_p) = {"fin_pll", "fout_kfc_pll"}; 1066 + PNAME(mout_kfc_p) = {"mout_kfc_pll", "dout_media_pll"}; 1067 + 1068 + struct samsung_mux_clock kfc_mux_clks[] __initdata = { 1069 + MUX(KFC_MOUT_KFC_PLL, "mout_kfc_pll", mout_kfc_pll_p, 1070 + MUX_SEL_KFC0, 0, 1), 1071 + MUX(KFC_MOUT_KFC, "mout_kfc", mout_kfc_p, MUX_SEL_KFC2, 0, 1), 1072 + }; 1073 + 1074 + struct samsung_div_clock kfc_div_clks[] __initdata = { 1075 + DIV(KFC_DOUT_KFC1, "dout_kfc1", "mout_kfc", DIV_KFC, 0, 3), 1076 + DIV(KFC_DOUT_KFC2, "dout_kfc2", "dout_kfc1", DIV_KFC, 4, 3), 1077 + DIV(KFC_DOUT_KFC_ATCLK, "dout_kfc_atclk", "dout_kfc2", DIV_KFC, 8, 3), 1078 + DIV(KFC_DOUT_KFC_PCLK_DBG, "dout_kfc_pclk_dbg", "dout_kfc2", 1079 + DIV_KFC, 12, 3), 1080 + DIV(KFC_DOUT_ACLK_KFC, "dout_aclk_kfc", "dout_kfc2", DIV_KFC, 16, 3), 1081 + DIV(KFC_DOUT_PCLK_KFC, "dout_pclk_kfc", "dout_kfc2", DIV_KFC, 20, 3), 1082 + DIV(KFC_DOUT_KFC_PLL, "dout_kfc_pll", "mout_kfc", DIV_KFC, 24, 3), 1083 + }; 1084 + 1085 + static struct samsung_pll_clock kfc_pll_clks[] __initdata = { 1086 + PLL(pll_2550xx, KFC_FOUT_KFC_PLL, "fout_kfc_pll", "fin_pll", 1087 + KFC_PLL_LOCK, KFC_PLL_CON0, 1088 + pll2550_24mhz_tbl), 1089 + }; 1090 + 1091 + static void __init exynos5260_clk_kfc_init(struct device_node *np) 1092 + { 1093 + struct exynos5260_cmu_info cmu = {0}; 1094 + 1095 + cmu.pll_clks = kfc_pll_clks; 1096 + cmu.nr_pll_clks = ARRAY_SIZE(kfc_pll_clks); 1097 + cmu.mux_clks = kfc_mux_clks; 1098 + cmu.nr_mux_clks = ARRAY_SIZE(kfc_mux_clks); 1099 + cmu.div_clks = kfc_div_clks; 1100 + cmu.nr_div_clks = ARRAY_SIZE(kfc_div_clks); 1101 + cmu.nr_clk_ids = KFC_NR_CLK; 1102 + cmu.clk_regs = kfc_clk_regs; 1103 + cmu.nr_clk_regs = ARRAY_SIZE(kfc_clk_regs); 1104 + 1105 + exynos5260_cmu_register_one(np, &cmu); 1106 + } 1107 + 1108 + CLK_OF_DECLARE(exynos5260_clk_kfc, "samsung,exynos5260-clock-kfc", 1109 + exynos5260_clk_kfc_init); 1110 + 1111 + 1112 + /* CMU_MFC */ 1113 + 1114 + static unsigned long mfc_clk_regs[] __initdata = { 1115 + MUX_SEL_MFC, 1116 + DIV_MFC, 1117 + EN_ACLK_MFC, 1118 + EN_ACLK_SECURE_SMMU2_MFC, 1119 + EN_PCLK_MFC, 1120 + EN_PCLK_SECURE_SMMU2_MFC, 1121 + EN_IP_MFC, 1122 + EN_IP_MFC_SECURE_SMMU2_MFC, 1123 + }; 1124 + 1125 + PNAME(mout_aclk_mfc_333_user_p) = {"fin_pll", "dout_aclk_mfc_333"}; 1126 + 1127 + struct samsung_mux_clock mfc_mux_clks[] __initdata = { 1128 + MUX(MFC_MOUT_ACLK_MFC_333_USER, "mout_aclk_mfc_333_user", 1129 + mout_aclk_mfc_333_user_p, 1130 + MUX_SEL_MFC, 0, 1), 1131 + }; 1132 + 1133 + struct samsung_div_clock mfc_div_clks[] __initdata = { 1134 + DIV(MFC_DOUT_PCLK_MFC_83, "dout_pclk_mfc_83", "mout_aclk_mfc_333_user", 1135 + DIV_MFC, 0, 3), 1136 + }; 1137 + 1138 + struct samsung_gate_clock mfc_gate_clks[] __initdata = { 1139 + GATE(MFC_CLK_MFC, "clk_mfc", "mout_aclk_mfc_333_user", 1140 + EN_IP_MFC, 1, 0, 0), 1141 + GATE(MFC_CLK_SMMU2_MFCM0, "clk_smmu2_mfcm0", "mout_aclk_mfc_333_user", 1142 + EN_IP_MFC_SECURE_SMMU2_MFC, 6, 0, 0), 1143 + GATE(MFC_CLK_SMMU2_MFCM1, "clk_smmu2_mfcm1", "mout_aclk_mfc_333_user", 1144 + EN_IP_MFC_SECURE_SMMU2_MFC, 7, 0, 0), 1145 + }; 1146 + 1147 + static void __init exynos5260_clk_mfc_init(struct device_node *np) 1148 + { 1149 + struct exynos5260_cmu_info cmu = {0}; 1150 + 1151 + cmu.mux_clks = mfc_mux_clks; 1152 + cmu.nr_mux_clks = ARRAY_SIZE(mfc_mux_clks); 1153 + cmu.div_clks = mfc_div_clks; 1154 + cmu.nr_div_clks = ARRAY_SIZE(mfc_div_clks); 1155 + cmu.gate_clks = mfc_gate_clks; 1156 + cmu.nr_gate_clks = ARRAY_SIZE(mfc_gate_clks); 1157 + cmu.nr_clk_ids = MFC_NR_CLK; 1158 + cmu.clk_regs = mfc_clk_regs; 1159 + cmu.nr_clk_regs = ARRAY_SIZE(mfc_clk_regs); 1160 + 1161 + exynos5260_cmu_register_one(np, &cmu); 1162 + } 1163 + 1164 + CLK_OF_DECLARE(exynos5260_clk_mfc, "samsung,exynos5260-clock-mfc", 1165 + exynos5260_clk_mfc_init); 1166 + 1167 + 1168 + /* CMU_MIF */ 1169 + 1170 + static unsigned long mif_clk_regs[] __initdata = { 1171 + MEM_PLL_LOCK, 1172 + BUS_PLL_LOCK, 1173 + MEDIA_PLL_LOCK, 1174 + MEM_PLL_CON0, 1175 + MEM_PLL_CON1, 1176 + MEM_PLL_FDET, 1177 + BUS_PLL_CON0, 1178 + BUS_PLL_CON1, 1179 + BUS_PLL_FDET, 1180 + MEDIA_PLL_CON0, 1181 + MEDIA_PLL_CON1, 1182 + MEDIA_PLL_FDET, 1183 + MUX_SEL_MIF, 1184 + DIV_MIF, 1185 + DIV_MIF_PLL_FDET, 1186 + EN_ACLK_MIF, 1187 + EN_ACLK_MIF_SECURE_DREX1_TZ, 1188 + EN_ACLK_MIF_SECURE_DREX0_TZ, 1189 + EN_ACLK_MIF_SECURE_INTMEM, 1190 + EN_PCLK_MIF, 1191 + EN_PCLK_MIF_SECURE_MONOCNT, 1192 + EN_PCLK_MIF_SECURE_RTC_APBIF, 1193 + EN_PCLK_MIF_SECURE_DREX1_TZ, 1194 + EN_PCLK_MIF_SECURE_DREX0_TZ, 1195 + EN_SCLK_MIF, 1196 + EN_IP_MIF, 1197 + EN_IP_MIF_SECURE_MONOCNT, 1198 + EN_IP_MIF_SECURE_RTC_APBIF, 1199 + EN_IP_MIF_SECURE_DREX1_TZ, 1200 + EN_IP_MIF_SECURE_DREX0_TZ, 1201 + EN_IP_MIF_SECURE_INTEMEM, 1202 + }; 1203 + 1204 + PNAME(mout_mem_pll_p) = {"fin_pll", "fout_mem_pll"}; 1205 + PNAME(mout_bus_pll_p) = {"fin_pll", "fout_bus_pll"}; 1206 + PNAME(mout_media_pll_p) = {"fin_pll", "fout_media_pll"}; 1207 + PNAME(mout_mif_drex_p) = {"dout_mem_pll", "dout_bus_pll"}; 1208 + PNAME(mout_mif_drex2x_p) = {"dout_mem_pll", "dout_bus_pll"}; 1209 + PNAME(mout_clkm_phy_p) = {"mout_mif_drex", "dout_media_pll"}; 1210 + PNAME(mout_clk2x_phy_p) = {"mout_mif_drex2x", "dout_media_pll"}; 1211 + 1212 + struct samsung_mux_clock mif_mux_clks[] __initdata = { 1213 + MUX(MIF_MOUT_MEM_PLL, "mout_mem_pll", mout_mem_pll_p, 1214 + MUX_SEL_MIF, 0, 1), 1215 + MUX(MIF_MOUT_BUS_PLL, "mout_bus_pll", mout_bus_pll_p, 1216 + MUX_SEL_MIF, 4, 1), 1217 + MUX(MIF_MOUT_MEDIA_PLL, "mout_media_pll", mout_media_pll_p, 1218 + MUX_SEL_MIF, 8, 1), 1219 + MUX(MIF_MOUT_MIF_DREX, "mout_mif_drex", mout_mif_drex_p, 1220 + MUX_SEL_MIF, 12, 1), 1221 + MUX(MIF_MOUT_CLKM_PHY, "mout_clkm_phy", mout_clkm_phy_p, 1222 + MUX_SEL_MIF, 16, 1), 1223 + MUX(MIF_MOUT_MIF_DREX2X, "mout_mif_drex2x", mout_mif_drex2x_p, 1224 + MUX_SEL_MIF, 20, 1), 1225 + MUX(MIF_MOUT_CLK2X_PHY, "mout_clk2x_phy", mout_clk2x_phy_p, 1226 + MUX_SEL_MIF, 24, 1), 1227 + }; 1228 + 1229 + struct samsung_div_clock mif_div_clks[] __initdata = { 1230 + DIV(MIF_DOUT_MEDIA_PLL, "dout_media_pll", "mout_media_pll", 1231 + DIV_MIF, 0, 3), 1232 + DIV(MIF_DOUT_MEM_PLL, "dout_mem_pll", "mout_mem_pll", 1233 + DIV_MIF, 4, 3), 1234 + DIV(MIF_DOUT_BUS_PLL, "dout_bus_pll", "mout_bus_pll", 1235 + DIV_MIF, 8, 3), 1236 + DIV(MIF_DOUT_CLKM_PHY, "dout_clkm_phy", "mout_clkm_phy", 1237 + DIV_MIF, 12, 3), 1238 + DIV(MIF_DOUT_CLK2X_PHY, "dout_clk2x_phy", "mout_clk2x_phy", 1239 + DIV_MIF, 16, 4), 1240 + DIV(MIF_DOUT_ACLK_MIF_466, "dout_aclk_mif_466", "dout_clk2x_phy", 1241 + DIV_MIF, 20, 3), 1242 + DIV(MIF_DOUT_ACLK_BUS_200, "dout_aclk_bus_200", "dout_bus_pll", 1243 + DIV_MIF, 24, 3), 1244 + DIV(MIF_DOUT_ACLK_BUS_100, "dout_aclk_bus_100", "dout_bus_pll", 1245 + DIV_MIF, 28, 4), 1246 + }; 1247 + 1248 + struct samsung_gate_clock mif_gate_clks[] __initdata = { 1249 + GATE(MIF_CLK_LPDDR3PHY_WRAP0, "clk_lpddr3phy_wrap0", "dout_clk2x_phy", 1250 + EN_IP_MIF, 12, CLK_IGNORE_UNUSED, 0), 1251 + GATE(MIF_CLK_LPDDR3PHY_WRAP1, "clk_lpddr3phy_wrap1", "dout_clk2x_phy", 1252 + EN_IP_MIF, 13, CLK_IGNORE_UNUSED, 0), 1253 + 1254 + GATE(MIF_CLK_MONOCNT, "clk_monocnt", "dout_aclk_bus_100", 1255 + EN_IP_MIF_SECURE_MONOCNT, 22, 1256 + CLK_IGNORE_UNUSED, 0), 1257 + 1258 + GATE(MIF_CLK_MIF_RTC, "clk_mif_rtc", "dout_aclk_bus_100", 1259 + EN_IP_MIF_SECURE_RTC_APBIF, 23, 1260 + CLK_IGNORE_UNUSED, 0), 1261 + 1262 + GATE(MIF_CLK_DREX1, "clk_drex1", "dout_aclk_mif_466", 1263 + EN_IP_MIF_SECURE_DREX1_TZ, 9, 1264 + CLK_IGNORE_UNUSED, 0), 1265 + 1266 + GATE(MIF_CLK_DREX0, "clk_drex0", "dout_aclk_mif_466", 1267 + EN_IP_MIF_SECURE_DREX0_TZ, 9, 1268 + CLK_IGNORE_UNUSED, 0), 1269 + 1270 + GATE(MIF_CLK_INTMEM, "clk_intmem", "dout_aclk_bus_200", 1271 + EN_IP_MIF_SECURE_INTEMEM, 11, 1272 + CLK_IGNORE_UNUSED, 0), 1273 + 1274 + GATE(MIF_SCLK_LPDDR3PHY_WRAP_U0, "sclk_lpddr3phy_wrap_u0", 1275 + "dout_clkm_phy", EN_SCLK_MIF, 0, 1276 + CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0), 1277 + GATE(MIF_SCLK_LPDDR3PHY_WRAP_U1, "sclk_lpddr3phy_wrap_u1", 1278 + "dout_clkm_phy", EN_SCLK_MIF, 1, 1279 + CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0), 1280 + }; 1281 + 1282 + static struct samsung_pll_clock mif_pll_clks[] __initdata = { 1283 + PLL(pll_2550xx, MIF_FOUT_MEM_PLL, "fout_mem_pll", "fin_pll", 1284 + MEM_PLL_LOCK, MEM_PLL_CON0, 1285 + pll2550_24mhz_tbl), 1286 + PLL(pll_2550xx, MIF_FOUT_BUS_PLL, "fout_bus_pll", "fin_pll", 1287 + BUS_PLL_LOCK, BUS_PLL_CON0, 1288 + pll2550_24mhz_tbl), 1289 + PLL(pll_2550xx, MIF_FOUT_MEDIA_PLL, "fout_media_pll", "fin_pll", 1290 + MEDIA_PLL_LOCK, MEDIA_PLL_CON0, 1291 + pll2550_24mhz_tbl), 1292 + }; 1293 + 1294 + static void __init exynos5260_clk_mif_init(struct device_node *np) 1295 + { 1296 + struct exynos5260_cmu_info cmu = {0}; 1297 + 1298 + cmu.pll_clks = mif_pll_clks; 1299 + cmu.nr_pll_clks = ARRAY_SIZE(mif_pll_clks); 1300 + cmu.mux_clks = mif_mux_clks; 1301 + cmu.nr_mux_clks = ARRAY_SIZE(mif_mux_clks); 1302 + cmu.div_clks = mif_div_clks; 1303 + cmu.nr_div_clks = ARRAY_SIZE(mif_div_clks); 1304 + cmu.gate_clks = mif_gate_clks; 1305 + cmu.nr_gate_clks = ARRAY_SIZE(mif_gate_clks); 1306 + cmu.nr_clk_ids = MIF_NR_CLK; 1307 + cmu.clk_regs = mif_clk_regs; 1308 + cmu.nr_clk_regs = ARRAY_SIZE(mif_clk_regs); 1309 + 1310 + exynos5260_cmu_register_one(np, &cmu); 1311 + } 1312 + 1313 + CLK_OF_DECLARE(exynos5260_clk_mif, "samsung,exynos5260-clock-mif", 1314 + exynos5260_clk_mif_init); 1315 + 1316 + 1317 + /* CMU_PERI */ 1318 + 1319 + static unsigned long peri_clk_regs[] __initdata = { 1320 + MUX_SEL_PERI, 1321 + MUX_SEL_PERI1, 1322 + DIV_PERI, 1323 + EN_PCLK_PERI0, 1324 + EN_PCLK_PERI1, 1325 + EN_PCLK_PERI2, 1326 + EN_PCLK_PERI3, 1327 + EN_PCLK_PERI_SECURE_CHIPID, 1328 + EN_PCLK_PERI_SECURE_PROVKEY0, 1329 + EN_PCLK_PERI_SECURE_PROVKEY1, 1330 + EN_PCLK_PERI_SECURE_SECKEY, 1331 + EN_PCLK_PERI_SECURE_ANTIRBKCNT, 1332 + EN_PCLK_PERI_SECURE_TOP_RTC, 1333 + EN_PCLK_PERI_SECURE_TZPC, 1334 + EN_SCLK_PERI, 1335 + EN_SCLK_PERI_SECURE_TOP_RTC, 1336 + EN_IP_PERI0, 1337 + EN_IP_PERI1, 1338 + EN_IP_PERI2, 1339 + EN_IP_PERI_SECURE_CHIPID, 1340 + EN_IP_PERI_SECURE_PROVKEY0, 1341 + EN_IP_PERI_SECURE_PROVKEY1, 1342 + EN_IP_PERI_SECURE_SECKEY, 1343 + EN_IP_PERI_SECURE_ANTIRBKCNT, 1344 + EN_IP_PERI_SECURE_TOP_RTC, 1345 + EN_IP_PERI_SECURE_TZPC, 1346 + }; 1347 + 1348 + PNAME(mout_sclk_pcm_p) = {"ioclk_pcm_extclk", "fin_pll", "dout_aclk_peri_aud", 1349 + "phyclk_hdmi_phy_ref_cko"}; 1350 + PNAME(mout_sclk_i2scod_p) = {"ioclk_i2s_cdclk", "fin_pll", "dout_aclk_peri_aud", 1351 + "phyclk_hdmi_phy_ref_cko"}; 1352 + PNAME(mout_sclk_spdif_p) = {"ioclk_spdif_extclk", "fin_pll", 1353 + "dout_aclk_peri_aud", "phyclk_hdmi_phy_ref_cko"}; 1354 + 1355 + struct samsung_mux_clock peri_mux_clks[] __initdata = { 1356 + MUX(PERI_MOUT_SCLK_PCM, "mout_sclk_pcm", mout_sclk_pcm_p, 1357 + MUX_SEL_PERI1, 4, 2), 1358 + MUX(PERI_MOUT_SCLK_I2SCOD, "mout_sclk_i2scod", mout_sclk_i2scod_p, 1359 + MUX_SEL_PERI1, 12, 2), 1360 + MUX(PERI_MOUT_SCLK_SPDIF, "mout_sclk_spdif", mout_sclk_spdif_p, 1361 + MUX_SEL_PERI1, 20, 2), 1362 + }; 1363 + 1364 + struct samsung_div_clock peri_div_clks[] __initdata = { 1365 + DIV(PERI_DOUT_PCM, "dout_pcm", "mout_sclk_pcm", DIV_PERI, 0, 8), 1366 + DIV(PERI_DOUT_I2S, "dout_i2s", "mout_sclk_i2scod", DIV_PERI, 8, 6), 1367 + }; 1368 + 1369 + struct samsung_gate_clock peri_gate_clks[] __initdata = { 1370 + GATE(PERI_SCLK_PCM1, "sclk_pcm1", "dout_pcm", EN_SCLK_PERI, 0, 1371 + CLK_SET_RATE_PARENT, 0), 1372 + GATE(PERI_SCLK_I2S, "sclk_i2s", "dout_i2s", EN_SCLK_PERI, 1, 1373 + CLK_SET_RATE_PARENT, 0), 1374 + GATE(PERI_SCLK_SPDIF, "sclk_spdif", "dout_sclk_peri_spi0_b", 1375 + EN_SCLK_PERI, 2, CLK_SET_RATE_PARENT, 0), 1376 + GATE(PERI_SCLK_SPI0, "sclk_spi0", "dout_sclk_peri_spi0_b", 1377 + EN_SCLK_PERI, 7, CLK_SET_RATE_PARENT, 0), 1378 + GATE(PERI_SCLK_SPI1, "sclk_spi1", "dout_sclk_peri_spi1_b", 1379 + EN_SCLK_PERI, 8, CLK_SET_RATE_PARENT, 0), 1380 + GATE(PERI_SCLK_SPI2, "sclk_spi2", "dout_sclk_peri_spi2_b", 1381 + EN_SCLK_PERI, 9, CLK_SET_RATE_PARENT, 0), 1382 + GATE(PERI_SCLK_UART0, "sclk_uart0", "dout_sclk_peri_uart0", 1383 + EN_SCLK_PERI, 10, CLK_SET_RATE_PARENT, 0), 1384 + GATE(PERI_SCLK_UART1, "sclk_uart1", "dout_sclk_peri_uart1", 1385 + EN_SCLK_PERI, 11, CLK_SET_RATE_PARENT, 0), 1386 + GATE(PERI_SCLK_UART2, "sclk_uart2", "dout_sclk_peri_uart2", 1387 + EN_SCLK_PERI, 12, CLK_SET_RATE_PARENT, 0), 1388 + 1389 + GATE(PERI_CLK_ABB, "clk_abb", "dout_aclk_peri_66", 1390 + EN_IP_PERI0, 1, 0, 0), 1391 + GATE(PERI_CLK_EFUSE_WRITER, "clk_efuse_writer", "dout_aclk_peri_66", 1392 + EN_IP_PERI0, 5, 0, 0), 1393 + GATE(PERI_CLK_HDMICEC, "clk_hdmicec", "dout_aclk_peri_66", 1394 + EN_IP_PERI0, 6, 0, 0), 1395 + GATE(PERI_CLK_I2C10, "clk_i2c10", "dout_aclk_peri_66", 1396 + EN_IP_PERI0, 7, 0, 0), 1397 + GATE(PERI_CLK_I2C11, "clk_i2c11", "dout_aclk_peri_66", 1398 + EN_IP_PERI0, 8, 0, 0), 1399 + GATE(PERI_CLK_I2C8, "clk_i2c8", "dout_aclk_peri_66", 1400 + EN_IP_PERI0, 9, 0, 0), 1401 + GATE(PERI_CLK_I2C9, "clk_i2c9", "dout_aclk_peri_66", 1402 + EN_IP_PERI0, 10, 0, 0), 1403 + GATE(PERI_CLK_I2C4, "clk_i2c4", "dout_aclk_peri_66", 1404 + EN_IP_PERI0, 11, 0, 0), 1405 + GATE(PERI_CLK_I2C5, "clk_i2c5", "dout_aclk_peri_66", 1406 + EN_IP_PERI0, 12, 0, 0), 1407 + GATE(PERI_CLK_I2C6, "clk_i2c6", "dout_aclk_peri_66", 1408 + EN_IP_PERI0, 13, 0, 0), 1409 + GATE(PERI_CLK_I2C7, "clk_i2c7", "dout_aclk_peri_66", 1410 + EN_IP_PERI0, 14, 0, 0), 1411 + GATE(PERI_CLK_I2CHDMI, "clk_i2chdmi", "dout_aclk_peri_66", 1412 + EN_IP_PERI0, 15, 0, 0), 1413 + GATE(PERI_CLK_I2S, "clk_peri_i2s", "dout_aclk_peri_66", 1414 + EN_IP_PERI0, 16, 0, 0), 1415 + GATE(PERI_CLK_MCT, "clk_mct", "dout_aclk_peri_66", 1416 + EN_IP_PERI0, 17, 0, 0), 1417 + GATE(PERI_CLK_PCM, "clk_peri_pcm", "dout_aclk_peri_66", 1418 + EN_IP_PERI0, 18, 0, 0), 1419 + GATE(PERI_CLK_HSIC0, "clk_hsic0", "dout_aclk_peri_66", 1420 + EN_IP_PERI0, 20, 0, 0), 1421 + GATE(PERI_CLK_HSIC1, "clk_hsic1", "dout_aclk_peri_66", 1422 + EN_IP_PERI0, 21, 0, 0), 1423 + GATE(PERI_CLK_HSIC2, "clk_hsic2", "dout_aclk_peri_66", 1424 + EN_IP_PERI0, 22, 0, 0), 1425 + GATE(PERI_CLK_HSIC3, "clk_hsic3", "dout_aclk_peri_66", 1426 + EN_IP_PERI0, 23, 0, 0), 1427 + GATE(PERI_CLK_WDT_EGL, "clk_wdt_egl", "dout_aclk_peri_66", 1428 + EN_IP_PERI0, 24, 0, 0), 1429 + GATE(PERI_CLK_WDT_KFC, "clk_wdt_kfc", "dout_aclk_peri_66", 1430 + EN_IP_PERI0, 25, 0, 0), 1431 + 1432 + GATE(PERI_CLK_UART4, "clk_uart4", "dout_aclk_peri_66", 1433 + EN_IP_PERI2, 0, 0, 0), 1434 + GATE(PERI_CLK_PWM, "clk_pwm", "dout_aclk_peri_66", 1435 + EN_IP_PERI2, 3, 0, 0), 1436 + GATE(PERI_CLK_SPDIF, "clk_spdif", "dout_aclk_peri_66", 1437 + EN_IP_PERI2, 6, 0, 0), 1438 + GATE(PERI_CLK_SPI0, "clk_spi0", "dout_aclk_peri_66", 1439 + EN_IP_PERI2, 7, 0, 0), 1440 + GATE(PERI_CLK_SPI1, "clk_spi1", "dout_aclk_peri_66", 1441 + EN_IP_PERI2, 8, 0, 0), 1442 + GATE(PERI_CLK_SPI2, "clk_spi2", "dout_aclk_peri_66", 1443 + EN_IP_PERI2, 9, 0, 0), 1444 + GATE(PERI_CLK_TMU0, "clk_tmu0", "dout_aclk_peri_66", 1445 + EN_IP_PERI2, 10, 0, 0), 1446 + GATE(PERI_CLK_TMU1, "clk_tmu1", "dout_aclk_peri_66", 1447 + EN_IP_PERI2, 11, 0, 0), 1448 + GATE(PERI_CLK_TMU2, "clk_tmu2", "dout_aclk_peri_66", 1449 + EN_IP_PERI2, 12, 0, 0), 1450 + GATE(PERI_CLK_TMU3, "clk_tmu3", "dout_aclk_peri_66", 1451 + EN_IP_PERI2, 13, 0, 0), 1452 + GATE(PERI_CLK_TMU4, "clk_tmu4", "dout_aclk_peri_66", 1453 + EN_IP_PERI2, 14, 0, 0), 1454 + GATE(PERI_CLK_ADC, "clk_adc", "dout_aclk_peri_66", 1455 + EN_IP_PERI2, 18, 0, 0), 1456 + GATE(PERI_CLK_UART0, "clk_uart0", "dout_aclk_peri_66", 1457 + EN_IP_PERI2, 19, 0, 0), 1458 + GATE(PERI_CLK_UART1, "clk_uart1", "dout_aclk_peri_66", 1459 + EN_IP_PERI2, 20, 0, 0), 1460 + GATE(PERI_CLK_UART2, "clk_uart2", "dout_aclk_peri_66", 1461 + EN_IP_PERI2, 21, 0, 0), 1462 + 1463 + GATE(PERI_CLK_CHIPID, "clk_chipid", "dout_aclk_peri_66", 1464 + EN_IP_PERI_SECURE_CHIPID, 2, 0, 0), 1465 + 1466 + GATE(PERI_CLK_PROVKEY0, "clk_provkey0", "dout_aclk_peri_66", 1467 + EN_IP_PERI_SECURE_PROVKEY0, 1, 0, 0), 1468 + 1469 + GATE(PERI_CLK_PROVKEY1, "clk_provkey1", "dout_aclk_peri_66", 1470 + EN_IP_PERI_SECURE_PROVKEY1, 2, 0, 0), 1471 + 1472 + GATE(PERI_CLK_SECKEY, "clk_seckey", "dout_aclk_peri_66", 1473 + EN_IP_PERI_SECURE_SECKEY, 5, 0, 0), 1474 + 1475 + GATE(PERI_CLK_TOP_RTC, "clk_top_rtc", "dout_aclk_peri_66", 1476 + EN_IP_PERI_SECURE_TOP_RTC, 5, 0, 0), 1477 + 1478 + GATE(PERI_CLK_TZPC0, "clk_tzpc0", "dout_aclk_peri_66", 1479 + EN_IP_PERI_SECURE_TZPC, 10, 0, 0), 1480 + GATE(PERI_CLK_TZPC1, "clk_tzpc1", "dout_aclk_peri_66", 1481 + EN_IP_PERI_SECURE_TZPC, 11, 0, 0), 1482 + GATE(PERI_CLK_TZPC2, "clk_tzpc2", "dout_aclk_peri_66", 1483 + EN_IP_PERI_SECURE_TZPC, 12, 0, 0), 1484 + GATE(PERI_CLK_TZPC3, "clk_tzpc3", "dout_aclk_peri_66", 1485 + EN_IP_PERI_SECURE_TZPC, 13, 0, 0), 1486 + GATE(PERI_CLK_TZPC4, "clk_tzpc4", "dout_aclk_peri_66", 1487 + EN_IP_PERI_SECURE_TZPC, 14, 0, 0), 1488 + GATE(PERI_CLK_TZPC5, "clk_tzpc5", "dout_aclk_peri_66", 1489 + EN_IP_PERI_SECURE_TZPC, 15, 0, 0), 1490 + GATE(PERI_CLK_TZPC6, "clk_tzpc6", "dout_aclk_peri_66", 1491 + EN_IP_PERI_SECURE_TZPC, 16, 0, 0), 1492 + GATE(PERI_CLK_TZPC7, "clk_tzpc7", "dout_aclk_peri_66", 1493 + EN_IP_PERI_SECURE_TZPC, 17, 0, 0), 1494 + GATE(PERI_CLK_TZPC8, "clk_tzpc8", "dout_aclk_peri_66", 1495 + EN_IP_PERI_SECURE_TZPC, 18, 0, 0), 1496 + GATE(PERI_CLK_TZPC9, "clk_tzpc9", "dout_aclk_peri_66", 1497 + EN_IP_PERI_SECURE_TZPC, 19, 0, 0), 1498 + GATE(PERI_CLK_TZPC10, "clk_tzpc10", "dout_aclk_peri_66", 1499 + EN_IP_PERI_SECURE_TZPC, 20, 0, 0), 1500 + }; 1501 + 1502 + static void __init exynos5260_clk_peri_init(struct device_node *np) 1503 + { 1504 + struct exynos5260_cmu_info cmu = {0}; 1505 + 1506 + cmu.mux_clks = peri_mux_clks; 1507 + cmu.nr_mux_clks = ARRAY_SIZE(peri_mux_clks); 1508 + cmu.div_clks = peri_div_clks; 1509 + cmu.nr_div_clks = ARRAY_SIZE(peri_div_clks); 1510 + cmu.gate_clks = peri_gate_clks; 1511 + cmu.nr_gate_clks = ARRAY_SIZE(peri_gate_clks); 1512 + cmu.nr_clk_ids = PERI_NR_CLK; 1513 + cmu.clk_regs = peri_clk_regs; 1514 + cmu.nr_clk_regs = ARRAY_SIZE(peri_clk_regs); 1515 + 1516 + exynos5260_cmu_register_one(np, &cmu); 1517 + } 1518 + 1519 + CLK_OF_DECLARE(exynos5260_clk_peri, "samsung,exynos5260-clock-peri", 1520 + exynos5260_clk_peri_init); 1521 + 1522 + 1523 + /* CMU_TOP */ 1524 + 1525 + static unsigned long top_clk_regs[] __initdata = { 1526 + DISP_PLL_LOCK, 1527 + AUD_PLL_LOCK, 1528 + DISP_PLL_CON0, 1529 + DISP_PLL_CON1, 1530 + DISP_PLL_FDET, 1531 + AUD_PLL_CON0, 1532 + AUD_PLL_CON1, 1533 + AUD_PLL_CON2, 1534 + AUD_PLL_FDET, 1535 + MUX_SEL_TOP_PLL0, 1536 + MUX_SEL_TOP_MFC, 1537 + MUX_SEL_TOP_G2D, 1538 + MUX_SEL_TOP_GSCL, 1539 + MUX_SEL_TOP_ISP10, 1540 + MUX_SEL_TOP_ISP11, 1541 + MUX_SEL_TOP_DISP0, 1542 + MUX_SEL_TOP_DISP1, 1543 + MUX_SEL_TOP_BUS, 1544 + MUX_SEL_TOP_PERI0, 1545 + MUX_SEL_TOP_PERI1, 1546 + MUX_SEL_TOP_FSYS, 1547 + DIV_TOP_G2D_MFC, 1548 + DIV_TOP_GSCL_ISP0, 1549 + DIV_TOP_ISP10, 1550 + DIV_TOP_ISP11, 1551 + DIV_TOP_DISP, 1552 + DIV_TOP_BUS, 1553 + DIV_TOP_PERI0, 1554 + DIV_TOP_PERI1, 1555 + DIV_TOP_PERI2, 1556 + DIV_TOP_FSYS0, 1557 + DIV_TOP_FSYS1, 1558 + DIV_TOP_HPM, 1559 + DIV_TOP_PLL_FDET, 1560 + EN_ACLK_TOP, 1561 + EN_SCLK_TOP, 1562 + EN_IP_TOP, 1563 + }; 1564 + 1565 + /* fixed rate clocks generated inside the soc */ 1566 + struct samsung_fixed_rate_clock fixed_rate_clks[] __initdata = { 1567 + FRATE(PHYCLK_DPTX_PHY_CH3_TXD_CLK, "phyclk_dptx_phy_ch3_txd_clk", NULL, 1568 + CLK_IS_ROOT, 270000000), 1569 + FRATE(PHYCLK_DPTX_PHY_CH2_TXD_CLK, "phyclk_dptx_phy_ch2_txd_clk", NULL, 1570 + CLK_IS_ROOT, 270000000), 1571 + FRATE(PHYCLK_DPTX_PHY_CH1_TXD_CLK, "phyclk_dptx_phy_ch1_txd_clk", NULL, 1572 + CLK_IS_ROOT, 270000000), 1573 + FRATE(PHYCLK_DPTX_PHY_CH0_TXD_CLK, "phyclk_dptx_phy_ch0_txd_clk", NULL, 1574 + CLK_IS_ROOT, 270000000), 1575 + FRATE(phyclk_hdmi_phy_tmds_clko, "phyclk_hdmi_phy_tmds_clko", NULL, 1576 + CLK_IS_ROOT, 250000000), 1577 + FRATE(PHYCLK_HDMI_PHY_PIXEL_CLKO, "phyclk_hdmi_phy_pixel_clko", NULL, 1578 + CLK_IS_ROOT, 1660000000), 1579 + FRATE(PHYCLK_HDMI_LINK_O_TMDS_CLKHI, "phyclk_hdmi_link_o_tmds_clkhi", 1580 + NULL, CLK_IS_ROOT, 125000000), 1581 + FRATE(PHYCLK_MIPI_DPHY_4L_M_TXBYTECLKHS, 1582 + "phyclk_mipi_dphy_4l_m_txbyteclkhs" , NULL, 1583 + CLK_IS_ROOT, 187500000), 1584 + FRATE(PHYCLK_DPTX_PHY_O_REF_CLK_24M, "phyclk_dptx_phy_o_ref_clk_24m", 1585 + NULL, CLK_IS_ROOT, 24000000), 1586 + FRATE(PHYCLK_DPTX_PHY_CLK_DIV2, "phyclk_dptx_phy_clk_div2", NULL, 1587 + CLK_IS_ROOT, 135000000), 1588 + FRATE(PHYCLK_MIPI_DPHY_4L_M_RXCLKESC0, 1589 + "phyclk_mipi_dphy_4l_m_rxclkesc0", NULL, 1590 + CLK_IS_ROOT, 20000000), 1591 + FRATE(PHYCLK_USBHOST20_PHY_PHYCLOCK, "phyclk_usbhost20_phy_phyclock", 1592 + NULL, CLK_IS_ROOT, 60000000), 1593 + FRATE(PHYCLK_USBHOST20_PHY_FREECLK, "phyclk_usbhost20_phy_freeclk", 1594 + NULL, CLK_IS_ROOT, 60000000), 1595 + FRATE(PHYCLK_USBHOST20_PHY_CLK48MOHCI, 1596 + "phyclk_usbhost20_phy_clk48mohci", 1597 + NULL, CLK_IS_ROOT, 48000000), 1598 + FRATE(PHYCLK_USBDRD30_UDRD30_PIPE_PCLK, 1599 + "phyclk_usbdrd30_udrd30_pipe_pclk", NULL, 1600 + CLK_IS_ROOT, 125000000), 1601 + FRATE(PHYCLK_USBDRD30_UDRD30_PHYCLOCK, 1602 + "phyclk_usbdrd30_udrd30_phyclock", NULL, 1603 + CLK_IS_ROOT, 60000000), 1604 + }; 1605 + 1606 + PNAME(mout_memtop_pll_user_p) = {"fin_pll", "dout_mem_pll"}; 1607 + PNAME(mout_bustop_pll_user_p) = {"fin_pll", "dout_bus_pll"}; 1608 + PNAME(mout_mediatop_pll_user_p) = {"fin_pll", "dout_media_pll"}; 1609 + PNAME(mout_audtop_pll_user_p) = {"fin_pll", "mout_aud_pll"}; 1610 + PNAME(mout_aud_pll_p) = {"fin_pll", "fout_aud_pll"}; 1611 + PNAME(mout_disp_pll_p) = {"fin_pll", "fout_disp_pll"}; 1612 + PNAME(mout_mfc_bustop_333_p) = {"mout_bustop_pll_user", "mout_disp_pll"}; 1613 + PNAME(mout_aclk_mfc_333_p) = {"mout_mediatop_pll_user", "mout_mfc_bustop_333"}; 1614 + PNAME(mout_g2d_bustop_333_p) = {"mout_bustop_pll_user", "mout_disp_pll"}; 1615 + PNAME(mout_aclk_g2d_333_p) = {"mout_mediatop_pll_user", "mout_g2d_bustop_333"}; 1616 + PNAME(mout_gscl_bustop_333_p) = {"mout_bustop_pll_user", "mout_disp_pll"}; 1617 + PNAME(mout_aclk_gscl_333_p) = {"mout_mediatop_pll_user", 1618 + "mout_gscl_bustop_333"}; 1619 + PNAME(mout_m2m_mediatop_400_p) = {"mout_mediatop_pll_user", "mout_disp_pll"}; 1620 + PNAME(mout_aclk_gscl_400_p) = {"mout_bustop_pll_user", 1621 + "mout_m2m_mediatop_400"}; 1622 + PNAME(mout_gscl_bustop_fimc_p) = {"mout_bustop_pll_user", "mout_disp_pll"}; 1623 + PNAME(mout_aclk_gscl_fimc_p) = {"mout_mediatop_pll_user", 1624 + "mout_gscl_bustop_fimc"}; 1625 + PNAME(mout_isp1_media_266_p) = {"mout_mediatop_pll_user", 1626 + "mout_memtop_pll_user"}; 1627 + PNAME(mout_aclk_isp1_266_p) = {"mout_bustop_pll_user", "mout_isp1_media_266"}; 1628 + PNAME(mout_isp1_media_400_p) = {"mout_mediatop_pll_user", "mout_disp_pll"}; 1629 + PNAME(mout_aclk_isp1_400_p) = {"mout_bustop_pll_user", "mout_isp1_media_400"}; 1630 + PNAME(mout_sclk_isp_spi_p) = {"fin_pll", "mout_bustop_pll_user"}; 1631 + PNAME(mout_sclk_isp_uart_p) = {"fin_pll", "mout_bustop_pll_user"}; 1632 + PNAME(mout_sclk_isp_sensor_p) = {"fin_pll", "mout_bustop_pll_user"}; 1633 + PNAME(mout_disp_disp_333_p) = {"mout_disp_pll", "mout_bustop_pll_user"}; 1634 + PNAME(mout_aclk_disp_333_p) = {"mout_mediatop_pll_user", "mout_disp_disp_333"}; 1635 + PNAME(mout_disp_disp_222_p) = {"mout_disp_pll", "mout_bustop_pll_user"}; 1636 + PNAME(mout_aclk_disp_222_p) = {"mout_mediatop_pll_user", "mout_disp_disp_222"}; 1637 + PNAME(mout_disp_media_pixel_p) = {"mout_mediatop_pll_user", 1638 + "mout_bustop_pll_user"}; 1639 + PNAME(mout_sclk_disp_pixel_p) = {"mout_disp_pll", "mout_disp_media_pixel"}; 1640 + PNAME(mout_bus_bustop_400_p) = {"mout_bustop_pll_user", "mout_memtop_pll_user"}; 1641 + PNAME(mout_bus_bustop_100_p) = {"mout_bustop_pll_user", "mout_memtop_pll_user"}; 1642 + PNAME(mout_sclk_peri_spi_clk_p) = {"fin_pll", "mout_bustop_pll_user"}; 1643 + PNAME(mout_sclk_peri_uart_uclk_p) = {"fin_pll", "mout_bustop_pll_user"}; 1644 + PNAME(mout_sclk_fsys_usb_p) = {"fin_pll", "mout_bustop_pll_user"}; 1645 + PNAME(mout_sclk_fsys_mmc_sdclkin_a_p) = {"fin_pll", "mout_bustop_pll_user"}; 1646 + PNAME(mout_sclk_fsys_mmc0_sdclkin_b_p) = {"mout_sclk_fsys_mmc0_sdclkin_a", 1647 + "mout_mediatop_pll_user"}; 1648 + PNAME(mout_sclk_fsys_mmc1_sdclkin_b_p) = {"mout_sclk_fsys_mmc1_sdclkin_a", 1649 + "mout_mediatop_pll_user"}; 1650 + PNAME(mout_sclk_fsys_mmc2_sdclkin_b_p) = {"mout_sclk_fsys_mmc2_sdclkin_a", 1651 + "mout_mediatop_pll_user"}; 1652 + 1653 + struct samsung_mux_clock top_mux_clks[] __initdata = { 1654 + MUX(TOP_MOUT_MEDIATOP_PLL_USER, "mout_mediatop_pll_user", 1655 + mout_mediatop_pll_user_p, 1656 + MUX_SEL_TOP_PLL0, 0, 1), 1657 + MUX(TOP_MOUT_MEMTOP_PLL_USER, "mout_memtop_pll_user", 1658 + mout_memtop_pll_user_p, 1659 + MUX_SEL_TOP_PLL0, 4, 1), 1660 + MUX(TOP_MOUT_BUSTOP_PLL_USER, "mout_bustop_pll_user", 1661 + mout_bustop_pll_user_p, 1662 + MUX_SEL_TOP_PLL0, 8, 1), 1663 + MUX(TOP_MOUT_DISP_PLL, "mout_disp_pll", mout_disp_pll_p, 1664 + MUX_SEL_TOP_PLL0, 12, 1), 1665 + MUX(TOP_MOUT_AUD_PLL, "mout_aud_pll", mout_aud_pll_p, 1666 + MUX_SEL_TOP_PLL0, 16, 1), 1667 + MUX(TOP_MOUT_AUDTOP_PLL_USER, "mout_audtop_pll_user", 1668 + mout_audtop_pll_user_p, 1669 + MUX_SEL_TOP_PLL0, 24, 1), 1670 + 1671 + MUX(TOP_MOUT_DISP_DISP_333, "mout_disp_disp_333", mout_disp_disp_333_p, 1672 + MUX_SEL_TOP_DISP0, 0, 1), 1673 + MUX(TOP_MOUT_ACLK_DISP_333, "mout_aclk_disp_333", mout_aclk_disp_333_p, 1674 + MUX_SEL_TOP_DISP0, 8, 1), 1675 + MUX(TOP_MOUT_DISP_DISP_222, "mout_disp_disp_222", mout_disp_disp_222_p, 1676 + MUX_SEL_TOP_DISP0, 12, 1), 1677 + MUX(TOP_MOUT_ACLK_DISP_222, "mout_aclk_disp_222", mout_aclk_disp_222_p, 1678 + MUX_SEL_TOP_DISP0, 20, 1), 1679 + 1680 + MUX(TOP_MOUT_FIMD1, "mout_sclk_disp_pixel", mout_sclk_disp_pixel_p, 1681 + MUX_SEL_TOP_DISP1, 0, 1), 1682 + MUX(TOP_MOUT_DISP_MEDIA_PIXEL, "mout_disp_media_pixel", 1683 + mout_disp_media_pixel_p, 1684 + MUX_SEL_TOP_DISP1, 8, 1), 1685 + 1686 + MUX(TOP_MOUT_SCLK_PERI_SPI2_CLK, "mout_sclk_peri_spi2_clk", 1687 + mout_sclk_peri_spi_clk_p, 1688 + MUX_SEL_TOP_PERI1, 0, 1), 1689 + MUX(TOP_MOUT_SCLK_PERI_SPI1_CLK, "mout_sclk_peri_spi1_clk", 1690 + mout_sclk_peri_spi_clk_p, 1691 + MUX_SEL_TOP_PERI1, 4, 1), 1692 + MUX(TOP_MOUT_SCLK_PERI_SPI0_CLK, "mout_sclk_peri_spi0_clk", 1693 + mout_sclk_peri_spi_clk_p, 1694 + MUX_SEL_TOP_PERI1, 8, 1), 1695 + MUX(TOP_MOUT_SCLK_PERI_UART1_UCLK, "mout_sclk_peri_uart1_uclk", 1696 + mout_sclk_peri_uart_uclk_p, 1697 + MUX_SEL_TOP_PERI1, 12, 1), 1698 + MUX(TOP_MOUT_SCLK_PERI_UART2_UCLK, "mout_sclk_peri_uart2_uclk", 1699 + mout_sclk_peri_uart_uclk_p, 1700 + MUX_SEL_TOP_PERI1, 16, 1), 1701 + MUX(TOP_MOUT_SCLK_PERI_UART0_UCLK, "mout_sclk_peri_uart0_uclk", 1702 + mout_sclk_peri_uart_uclk_p, 1703 + MUX_SEL_TOP_PERI1, 20, 1), 1704 + 1705 + 1706 + MUX(TOP_MOUT_BUS1_BUSTOP_400, "mout_bus1_bustop_400", 1707 + mout_bus_bustop_400_p, 1708 + MUX_SEL_TOP_BUS, 0, 1), 1709 + MUX(TOP_MOUT_BUS1_BUSTOP_100, "mout_bus1_bustop_100", 1710 + mout_bus_bustop_100_p, 1711 + MUX_SEL_TOP_BUS, 4, 1), 1712 + MUX(TOP_MOUT_BUS2_BUSTOP_100, "mout_bus2_bustop_100", 1713 + mout_bus_bustop_100_p, 1714 + MUX_SEL_TOP_BUS, 8, 1), 1715 + MUX(TOP_MOUT_BUS2_BUSTOP_400, "mout_bus2_bustop_400", 1716 + mout_bus_bustop_400_p, 1717 + MUX_SEL_TOP_BUS, 12, 1), 1718 + MUX(TOP_MOUT_BUS3_BUSTOP_400, "mout_bus3_bustop_400", 1719 + mout_bus_bustop_400_p, 1720 + MUX_SEL_TOP_BUS, 16, 1), 1721 + MUX(TOP_MOUT_BUS3_BUSTOP_100, "mout_bus3_bustop_100", 1722 + mout_bus_bustop_100_p, 1723 + MUX_SEL_TOP_BUS, 20, 1), 1724 + MUX(TOP_MOUT_BUS4_BUSTOP_400, "mout_bus4_bustop_400", 1725 + mout_bus_bustop_400_p, 1726 + MUX_SEL_TOP_BUS, 24, 1), 1727 + MUX(TOP_MOUT_BUS4_BUSTOP_100, "mout_bus4_bustop_100", 1728 + mout_bus_bustop_100_p, 1729 + MUX_SEL_TOP_BUS, 28, 1), 1730 + 1731 + MUX(TOP_MOUT_SCLK_FSYS_USB, "mout_sclk_fsys_usb", 1732 + mout_sclk_fsys_usb_p, 1733 + MUX_SEL_TOP_FSYS, 0, 1), 1734 + MUX(TOP_MOUT_SCLK_FSYS_MMC2_SDCLKIN_A, "mout_sclk_fsys_mmc2_sdclkin_a", 1735 + mout_sclk_fsys_mmc_sdclkin_a_p, 1736 + MUX_SEL_TOP_FSYS, 4, 1), 1737 + MUX(TOP_MOUT_SCLK_FSYS_MMC2_SDCLKIN_B, "mout_sclk_fsys_mmc2_sdclkin_b", 1738 + mout_sclk_fsys_mmc2_sdclkin_b_p, 1739 + MUX_SEL_TOP_FSYS, 8, 1), 1740 + MUX(TOP_MOUT_SCLK_FSYS_MMC1_SDCLKIN_A, "mout_sclk_fsys_mmc1_sdclkin_a", 1741 + mout_sclk_fsys_mmc_sdclkin_a_p, 1742 + MUX_SEL_TOP_FSYS, 12, 1), 1743 + MUX(TOP_MOUT_SCLK_FSYS_MMC1_SDCLKIN_B, "mout_sclk_fsys_mmc1_sdclkin_b", 1744 + mout_sclk_fsys_mmc1_sdclkin_b_p, 1745 + MUX_SEL_TOP_FSYS, 16, 1), 1746 + MUX(TOP_MOUT_SCLK_FSYS_MMC0_SDCLKIN_A, "mout_sclk_fsys_mmc0_sdclkin_a", 1747 + mout_sclk_fsys_mmc_sdclkin_a_p, 1748 + MUX_SEL_TOP_FSYS, 20, 1), 1749 + MUX(TOP_MOUT_SCLK_FSYS_MMC0_SDCLKIN_B, "mout_sclk_fsys_mmc0_sdclkin_b", 1750 + mout_sclk_fsys_mmc0_sdclkin_b_p, 1751 + MUX_SEL_TOP_FSYS, 24, 1), 1752 + 1753 + MUX(TOP_MOUT_ISP1_MEDIA_400, "mout_isp1_media_400", 1754 + mout_isp1_media_400_p, 1755 + MUX_SEL_TOP_ISP10, 4, 1), 1756 + MUX(TOP_MOUT_ACLK_ISP1_400, "mout_aclk_isp1_400", mout_aclk_isp1_400_p, 1757 + MUX_SEL_TOP_ISP10, 8 , 1), 1758 + MUX(TOP_MOUT_ISP1_MEDIA_266, "mout_isp1_media_266", 1759 + mout_isp1_media_266_p, 1760 + MUX_SEL_TOP_ISP10, 16, 1), 1761 + MUX(TOP_MOUT_ACLK_ISP1_266, "mout_aclk_isp1_266", mout_aclk_isp1_266_p, 1762 + MUX_SEL_TOP_ISP10, 20, 1), 1763 + 1764 + MUX(TOP_MOUT_SCLK_ISP1_SPI0, "mout_sclk_isp1_spi0", mout_sclk_isp_spi_p, 1765 + MUX_SEL_TOP_ISP11, 4, 1), 1766 + MUX(TOP_MOUT_SCLK_ISP1_SPI1, "mout_sclk_isp1_spi1", mout_sclk_isp_spi_p, 1767 + MUX_SEL_TOP_ISP11, 8, 1), 1768 + MUX(TOP_MOUT_SCLK_ISP1_UART, "mout_sclk_isp1_uart", 1769 + mout_sclk_isp_uart_p, 1770 + MUX_SEL_TOP_ISP11, 12, 1), 1771 + MUX(TOP_MOUT_SCLK_ISP1_SENSOR0, "mout_sclk_isp1_sensor0", 1772 + mout_sclk_isp_sensor_p, 1773 + MUX_SEL_TOP_ISP11, 16, 1), 1774 + MUX(TOP_MOUT_SCLK_ISP1_SENSOR1, "mout_sclk_isp1_sensor1", 1775 + mout_sclk_isp_sensor_p, 1776 + MUX_SEL_TOP_ISP11, 20, 1), 1777 + MUX(TOP_MOUT_SCLK_ISP1_SENSOR2, "mout_sclk_isp1_sensor2", 1778 + mout_sclk_isp_sensor_p, 1779 + MUX_SEL_TOP_ISP11, 24, 1), 1780 + 1781 + MUX(TOP_MOUT_MFC_BUSTOP_333, "mout_mfc_bustop_333", 1782 + mout_mfc_bustop_333_p, 1783 + MUX_SEL_TOP_MFC, 4, 1), 1784 + MUX(TOP_MOUT_ACLK_MFC_333, "mout_aclk_mfc_333", mout_aclk_mfc_333_p, 1785 + MUX_SEL_TOP_MFC, 8, 1), 1786 + 1787 + MUX(TOP_MOUT_G2D_BUSTOP_333, "mout_g2d_bustop_333", 1788 + mout_g2d_bustop_333_p, 1789 + MUX_SEL_TOP_G2D, 4, 1), 1790 + MUX(TOP_MOUT_ACLK_G2D_333, "mout_aclk_g2d_333", mout_aclk_g2d_333_p, 1791 + MUX_SEL_TOP_G2D, 8, 1), 1792 + 1793 + MUX(TOP_MOUT_M2M_MEDIATOP_400, "mout_m2m_mediatop_400", 1794 + mout_m2m_mediatop_400_p, 1795 + MUX_SEL_TOP_GSCL, 0, 1), 1796 + MUX(TOP_MOUT_ACLK_GSCL_400, "mout_aclk_gscl_400", 1797 + mout_aclk_gscl_400_p, 1798 + MUX_SEL_TOP_GSCL, 4, 1), 1799 + MUX(TOP_MOUT_GSCL_BUSTOP_333, "mout_gscl_bustop_333", 1800 + mout_gscl_bustop_333_p, 1801 + MUX_SEL_TOP_GSCL, 8, 1), 1802 + MUX(TOP_MOUT_ACLK_GSCL_333, "mout_aclk_gscl_333", 1803 + mout_aclk_gscl_333_p, 1804 + MUX_SEL_TOP_GSCL, 12, 1), 1805 + MUX(TOP_MOUT_GSCL_BUSTOP_FIMC, "mout_gscl_bustop_fimc", 1806 + mout_gscl_bustop_fimc_p, 1807 + MUX_SEL_TOP_GSCL, 16, 1), 1808 + MUX(TOP_MOUT_ACLK_GSCL_FIMC, "mout_aclk_gscl_fimc", 1809 + mout_aclk_gscl_fimc_p, 1810 + MUX_SEL_TOP_GSCL, 20, 1), 1811 + }; 1812 + 1813 + struct samsung_div_clock top_div_clks[] __initdata = { 1814 + DIV(TOP_DOUT_ACLK_G2D_333, "dout_aclk_g2d_333", "mout_aclk_g2d_333", 1815 + DIV_TOP_G2D_MFC, 0, 3), 1816 + DIV(TOP_DOUT_ACLK_MFC_333, "dout_aclk_mfc_333", "mout_aclk_mfc_333", 1817 + DIV_TOP_G2D_MFC, 4, 3), 1818 + 1819 + DIV(TOP_DOUT_ACLK_GSCL_333, "dout_aclk_gscl_333", "mout_aclk_gscl_333", 1820 + DIV_TOP_GSCL_ISP0, 0, 3), 1821 + DIV(TOP_DOUT_ACLK_GSCL_400, "dout_aclk_gscl_400", "mout_aclk_gscl_400", 1822 + DIV_TOP_GSCL_ISP0, 4, 3), 1823 + DIV(TOP_DOUT_ACLK_GSCL_FIMC, "dout_aclk_gscl_fimc", 1824 + "mout_aclk_gscl_fimc", DIV_TOP_GSCL_ISP0, 8, 3), 1825 + DIV(TOP_DOUT_SCLK_ISP1_SENSOR0_A, "dout_sclk_isp1_sensor0_a", 1826 + "mout_aclk_gscl_fimc", DIV_TOP_GSCL_ISP0, 16, 4), 1827 + DIV(TOP_DOUT_SCLK_ISP1_SENSOR1_A, "dout_sclk_isp1_sensor1_a", 1828 + "mout_aclk_gscl_400", DIV_TOP_GSCL_ISP0, 20, 4), 1829 + DIV(TOP_DOUT_SCLK_ISP1_SENSOR2_A, "dout_sclk_isp1_sensor2_a", 1830 + "mout_aclk_gscl_fimc", DIV_TOP_GSCL_ISP0, 24, 4), 1831 + 1832 + DIV(TOP_DOUT_ACLK_ISP1_266, "dout_aclk_isp1_266", "mout_aclk_isp1_266", 1833 + DIV_TOP_ISP10, 0, 3), 1834 + DIV(TOP_DOUT_ACLK_ISP1_400, "dout_aclk_isp1_400", "mout_aclk_isp1_400", 1835 + DIV_TOP_ISP10, 4, 3), 1836 + DIV(TOP_DOUT_SCLK_ISP1_SPI0_A, "dout_sclk_isp1_spi0_a", 1837 + "mout_sclk_isp1_spi0", DIV_TOP_ISP10, 12, 4), 1838 + DIV(TOP_DOUT_SCLK_ISP1_SPI0_B, "dout_sclk_isp1_spi0_b", 1839 + "dout_sclk_isp1_spi0_a", DIV_TOP_ISP10, 16, 8), 1840 + 1841 + DIV(TOP_DOUT_SCLK_ISP1_SPI1_A, "dout_sclk_isp1_spi1_a", 1842 + "mout_sclk_isp1_spi1", DIV_TOP_ISP11, 0, 4), 1843 + DIV(TOP_DOUT_SCLK_ISP1_SPI1_B, "dout_sclk_isp1_spi1_b", 1844 + "dout_sclk_isp1_spi1_a", DIV_TOP_ISP11, 4, 8), 1845 + DIV(TOP_DOUT_SCLK_ISP1_UART, "dout_sclk_isp1_uart", 1846 + "mout_sclk_isp1_uart", DIV_TOP_ISP11, 12, 4), 1847 + DIV(TOP_DOUT_SCLK_ISP1_SENSOR0_B, "dout_sclk_isp1_sensor0_b", 1848 + "dout_sclk_isp1_sensor0_a", DIV_TOP_ISP11, 16, 4), 1849 + DIV(TOP_DOUT_SCLK_ISP1_SENSOR1_B, "dout_sclk_isp1_sensor1_b", 1850 + "dout_sclk_isp1_sensor1_a", DIV_TOP_ISP11, 20, 4), 1851 + DIV(TOP_DOUT_SCLK_ISP1_SENSOR2_B, "dout_sclk_isp1_sensor2_b", 1852 + "dout_sclk_isp1_sensor2_a", DIV_TOP_ISP11, 24, 4), 1853 + 1854 + DIV(TOP_DOUTTOP__SCLK_HPM_TARGETCLK, "dout_sclk_hpm_targetclk", 1855 + "mout_bustop_pll_user", DIV_TOP_HPM, 0, 3), 1856 + 1857 + DIV(TOP_DOUT_ACLK_DISP_333, "dout_aclk_disp_333", "mout_aclk_disp_333", 1858 + DIV_TOP_DISP, 0, 3), 1859 + DIV(TOP_DOUT_ACLK_DISP_222, "dout_aclk_disp_222", "mout_aclk_disp_222", 1860 + DIV_TOP_DISP, 4, 3), 1861 + DIV(TOP_DOUT_SCLK_DISP_PIXEL, "dout_sclk_disp_pixel", 1862 + "mout_sclk_disp_pixel", DIV_TOP_DISP, 8, 3), 1863 + 1864 + DIV(TOP_DOUT_ACLK_BUS1_400, "dout_aclk_bus1_400", 1865 + "mout_bus1_bustop_400", DIV_TOP_BUS, 0, 3), 1866 + DIV(TOP_DOUT_ACLK_BUS1_100, "dout_aclk_bus1_100", 1867 + "mout_bus1_bustop_100", DIV_TOP_BUS, 4, 4), 1868 + DIV(TOP_DOUT_ACLK_BUS2_400, "dout_aclk_bus2_400", 1869 + "mout_bus2_bustop_400", DIV_TOP_BUS, 8, 3), 1870 + DIV(TOP_DOUT_ACLK_BUS2_100, "dout_aclk_bus2_100", 1871 + "mout_bus2_bustop_100", DIV_TOP_BUS, 12, 4), 1872 + DIV(TOP_DOUT_ACLK_BUS3_400, "dout_aclk_bus3_400", 1873 + "mout_bus3_bustop_400", DIV_TOP_BUS, 16, 3), 1874 + DIV(TOP_DOUT_ACLK_BUS3_100, "dout_aclk_bus3_100", 1875 + "mout_bus3_bustop_100", DIV_TOP_BUS, 20, 4), 1876 + DIV(TOP_DOUT_ACLK_BUS4_400, "dout_aclk_bus4_400", 1877 + "mout_bus4_bustop_400", DIV_TOP_BUS, 24, 3), 1878 + DIV(TOP_DOUT_ACLK_BUS4_100, "dout_aclk_bus4_100", 1879 + "mout_bus4_bustop_100", DIV_TOP_BUS, 28, 4), 1880 + 1881 + DIV(TOP_DOUT_SCLK_PERI_SPI0_A, "dout_sclk_peri_spi0_a", 1882 + "mout_sclk_peri_spi0_clk", DIV_TOP_PERI0, 4, 4), 1883 + DIV(TOP_DOUT_SCLK_PERI_SPI0_B, "dout_sclk_peri_spi0_b", 1884 + "dout_sclk_peri_spi0_a", DIV_TOP_PERI0, 8, 8), 1885 + DIV(TOP_DOUT_SCLK_PERI_SPI1_A, "dout_sclk_peri_spi1_a", 1886 + "mout_sclk_peri_spi1_clk", DIV_TOP_PERI0, 16, 4), 1887 + DIV(TOP_DOUT_SCLK_PERI_SPI1_B, "dout_sclk_peri_spi1_b", 1888 + "dout_sclk_peri_spi1_a", DIV_TOP_PERI0, 20, 8), 1889 + 1890 + DIV(TOP_DOUT_SCLK_PERI_SPI2_A, "dout_sclk_peri_spi2_a", 1891 + "mout_sclk_peri_spi2_clk", DIV_TOP_PERI1, 0, 4), 1892 + DIV(TOP_DOUT_SCLK_PERI_SPI2_B, "dout_sclk_peri_spi2_b", 1893 + "dout_sclk_peri_spi2_a", DIV_TOP_PERI1, 4, 8), 1894 + DIV(TOP_DOUT_SCLK_PERI_UART1, "dout_sclk_peri_uart1", 1895 + "mout_sclk_peri_uart1_uclk", DIV_TOP_PERI1, 16, 4), 1896 + DIV(TOP_DOUT_SCLK_PERI_UART2, "dout_sclk_peri_uart2", 1897 + "mout_sclk_peri_uart2_uclk", DIV_TOP_PERI1, 20, 4), 1898 + DIV(TOP_DOUT_SCLK_PERI_UART0, "dout_sclk_peri_uart0", 1899 + "mout_sclk_peri_uart0_uclk", DIV_TOP_PERI1, 24, 4), 1900 + 1901 + DIV(TOP_DOUT_ACLK_PERI_66, "dout_aclk_peri_66", "mout_bustop_pll_user", 1902 + DIV_TOP_PERI2, 20, 4), 1903 + DIV(TOP_DOUT_ACLK_PERI_AUD, "dout_aclk_peri_aud", 1904 + "mout_audtop_pll_user", DIV_TOP_PERI2, 24, 3), 1905 + 1906 + DIV(TOP_DOUT_ACLK_FSYS_200, "dout_aclk_fsys_200", 1907 + "mout_bustop_pll_user", DIV_TOP_FSYS0, 0, 3), 1908 + DIV(TOP_DOUT_SCLK_FSYS_USBDRD30_SUSPEND_CLK, 1909 + "dout_sclk_fsys_usbdrd30_suspend_clk", 1910 + "mout_sclk_fsys_usb", DIV_TOP_FSYS0, 4, 4), 1911 + DIV(TOP_DOUT_SCLK_FSYS_MMC0_SDCLKIN_A, "dout_sclk_fsys_mmc0_sdclkin_a", 1912 + "mout_sclk_fsys_mmc0_sdclkin_b", 1913 + DIV_TOP_FSYS0, 12, 4), 1914 + DIV(TOP_DOUT_SCLK_FSYS_MMC0_SDCLKIN_B, "dout_sclk_fsys_mmc0_sdclkin_b", 1915 + "dout_sclk_fsys_mmc0_sdclkin_a", 1916 + DIV_TOP_FSYS0, 16, 8), 1917 + 1918 + 1919 + DIV(TOP_DOUT_SCLK_FSYS_MMC1_SDCLKIN_A, "dout_sclk_fsys_mmc1_sdclkin_a", 1920 + "mout_sclk_fsys_mmc1_sdclkin_b", 1921 + DIV_TOP_FSYS1, 0, 4), 1922 + DIV(TOP_DOUT_SCLK_FSYS_MMC1_SDCLKIN_B, "dout_sclk_fsys_mmc1_sdclkin_b", 1923 + "dout_sclk_fsys_mmc1_sdclkin_a", 1924 + DIV_TOP_FSYS1, 4, 8), 1925 + DIV(TOP_DOUT_SCLK_FSYS_MMC2_SDCLKIN_A, "dout_sclk_fsys_mmc2_sdclkin_a", 1926 + "mout_sclk_fsys_mmc2_sdclkin_b", 1927 + DIV_TOP_FSYS1, 12, 4), 1928 + DIV(TOP_DOUT_SCLK_FSYS_MMC2_SDCLKIN_B, "dout_sclk_fsys_mmc2_sdclkin_b", 1929 + "dout_sclk_fsys_mmc2_sdclkin_a", 1930 + DIV_TOP_FSYS1, 16, 8), 1931 + 1932 + }; 1933 + 1934 + struct samsung_gate_clock top_gate_clks[] __initdata = { 1935 + GATE(TOP_SCLK_MMC0, "sclk_fsys_mmc0_sdclkin", 1936 + "dout_sclk_fsys_mmc0_sdclkin_b", 1937 + EN_SCLK_TOP, 7, CLK_SET_RATE_PARENT, 0), 1938 + GATE(TOP_SCLK_MMC1, "sclk_fsys_mmc1_sdclkin", 1939 + "dout_sclk_fsys_mmc1_sdclkin_b", 1940 + EN_SCLK_TOP, 8, CLK_SET_RATE_PARENT, 0), 1941 + GATE(TOP_SCLK_MMC2, "sclk_fsys_mmc2_sdclkin", 1942 + "dout_sclk_fsys_mmc2_sdclkin_b", 1943 + EN_SCLK_TOP, 9, CLK_SET_RATE_PARENT, 0), 1944 + GATE(TOP_SCLK_FIMD1, "sclk_disp_pixel", "dout_sclk_disp_pixel", 1945 + EN_ACLK_TOP, 10, CLK_IGNORE_UNUSED | 1946 + CLK_SET_RATE_PARENT, 0), 1947 + }; 1948 + 1949 + static struct samsung_pll_clock top_pll_clks[] __initdata = { 1950 + PLL(pll_2550xx, TOP_FOUT_DISP_PLL, "fout_disp_pll", "fin_pll", 1951 + DISP_PLL_LOCK, DISP_PLL_CON0, 1952 + pll2550_24mhz_tbl), 1953 + PLL(pll_2650xx, TOP_FOUT_AUD_PLL, "fout_aud_pll", "fin_pll", 1954 + AUD_PLL_LOCK, AUD_PLL_CON0, 1955 + pll2650_24mhz_tbl), 1956 + }; 1957 + 1958 + static void __init exynos5260_clk_top_init(struct device_node *np) 1959 + { 1960 + struct exynos5260_cmu_info cmu = {0}; 1961 + 1962 + cmu.pll_clks = top_pll_clks; 1963 + cmu.nr_pll_clks = ARRAY_SIZE(top_pll_clks); 1964 + cmu.mux_clks = top_mux_clks; 1965 + cmu.nr_mux_clks = ARRAY_SIZE(top_mux_clks); 1966 + cmu.div_clks = top_div_clks; 1967 + cmu.nr_div_clks = ARRAY_SIZE(top_div_clks); 1968 + cmu.gate_clks = top_gate_clks; 1969 + cmu.nr_gate_clks = ARRAY_SIZE(top_gate_clks); 1970 + cmu.fixed_clks = fixed_rate_clks; 1971 + cmu.nr_fixed_clks = ARRAY_SIZE(fixed_rate_clks); 1972 + cmu.nr_clk_ids = TOP_NR_CLK; 1973 + cmu.clk_regs = top_clk_regs; 1974 + cmu.nr_clk_regs = ARRAY_SIZE(top_clk_regs); 1975 + 1976 + exynos5260_cmu_register_one(np, &cmu); 1977 + } 1978 + 1979 + CLK_OF_DECLARE(exynos5260_clk_top, "samsung,exynos5260-clock-top", 1980 + exynos5260_clk_top_init);
+459
drivers/clk/samsung/clk-exynos5260.h
··· 1 + /* 2 + * Copyright (c) 2014 Samsung Electronics Co., Ltd. 3 + * Author: Rahul Sharma <rahul.sharma@samsung.com> 4 + * 5 + * This program is free software; you can redistribute it and/or modify 6 + * it under the terms of the GNU General Public License version 2 as 7 + * published by the Free Software Foundation. 8 + * 9 + * Common Clock Framework support for Exynos5260 SoC. 10 + */ 11 + 12 + #ifndef __CLK_EXYNOS5260_H 13 + #define __CLK_EXYNOS5260_H 14 + 15 + /* 16 + *Registers for CMU_AUD 17 + */ 18 + #define MUX_SEL_AUD 0x0200 19 + #define MUX_ENABLE_AUD 0x0300 20 + #define MUX_STAT_AUD 0x0400 21 + #define MUX_IGNORE_AUD 0x0500 22 + #define DIV_AUD0 0x0600 23 + #define DIV_AUD1 0x0604 24 + #define DIV_STAT_AUD0 0x0700 25 + #define DIV_STAT_AUD1 0x0704 26 + #define EN_ACLK_AUD 0x0800 27 + #define EN_PCLK_AUD 0x0900 28 + #define EN_SCLK_AUD 0x0a00 29 + #define EN_IP_AUD 0x0b00 30 + 31 + /* 32 + *Registers for CMU_DISP 33 + */ 34 + #define MUX_SEL_DISP0 0x0200 35 + #define MUX_SEL_DISP1 0x0204 36 + #define MUX_SEL_DISP2 0x0208 37 + #define MUX_SEL_DISP3 0x020C 38 + #define MUX_SEL_DISP4 0x0210 39 + #define MUX_ENABLE_DISP0 0x0300 40 + #define MUX_ENABLE_DISP1 0x0304 41 + #define MUX_ENABLE_DISP2 0x0308 42 + #define MUX_ENABLE_DISP3 0x030c 43 + #define MUX_ENABLE_DISP4 0x0310 44 + #define MUX_STAT_DISP0 0x0400 45 + #define MUX_STAT_DISP1 0x0404 46 + #define MUX_STAT_DISP2 0x0408 47 + #define MUX_STAT_DISP3 0x040c 48 + #define MUX_STAT_DISP4 0x0410 49 + #define MUX_IGNORE_DISP0 0x0500 50 + #define MUX_IGNORE_DISP1 0x0504 51 + #define MUX_IGNORE_DISP2 0x0508 52 + #define MUX_IGNORE_DISP3 0x050c 53 + #define MUX_IGNORE_DISP4 0x0510 54 + #define DIV_DISP 0x0600 55 + #define DIV_STAT_DISP 0x0700 56 + #define EN_ACLK_DISP 0x0800 57 + #define EN_PCLK_DISP 0x0900 58 + #define EN_SCLK_DISP0 0x0a00 59 + #define EN_SCLK_DISP1 0x0a04 60 + #define EN_IP_DISP 0x0b00 61 + #define EN_IP_DISP_BUS 0x0b04 62 + 63 + 64 + /* 65 + *Registers for CMU_EGL 66 + */ 67 + #define EGL_PLL_LOCK 0x0000 68 + #define EGL_DPLL_LOCK 0x0004 69 + #define EGL_PLL_CON0 0x0100 70 + #define EGL_PLL_CON1 0x0104 71 + #define EGL_PLL_FREQ_DET 0x010c 72 + #define EGL_DPLL_CON0 0x0110 73 + #define EGL_DPLL_CON1 0x0114 74 + #define EGL_DPLL_FREQ_DET 0x011c 75 + #define MUX_SEL_EGL 0x0200 76 + #define MUX_ENABLE_EGL 0x0300 77 + #define MUX_STAT_EGL 0x0400 78 + #define DIV_EGL 0x0600 79 + #define DIV_EGL_PLL_FDET 0x0604 80 + #define DIV_STAT_EGL 0x0700 81 + #define DIV_STAT_EGL_PLL_FDET 0x0704 82 + #define EN_ACLK_EGL 0x0800 83 + #define EN_PCLK_EGL 0x0900 84 + #define EN_SCLK_EGL 0x0a00 85 + #define EN_IP_EGL 0x0b00 86 + #define CLKOUT_CMU_EGL 0x0c00 87 + #define CLKOUT_CMU_EGL_DIV_STAT 0x0c04 88 + #define ARMCLK_STOPCTRL 0x1000 89 + #define EAGLE_EMA_CTRL 0x1008 90 + #define EAGLE_EMA_STATUS 0x100c 91 + #define PWR_CTRL 0x1020 92 + #define PWR_CTRL2 0x1024 93 + #define CLKSTOP_CTRL 0x1028 94 + #define INTR_SPREAD_EN 0x1080 95 + #define INTR_SPREAD_USE_STANDBYWFI 0x1084 96 + #define INTR_SPREAD_BLOCKING_DURATION 0x1088 97 + #define CMU_EGL_SPARE0 0x2000 98 + #define CMU_EGL_SPARE1 0x2004 99 + #define CMU_EGL_SPARE2 0x2008 100 + #define CMU_EGL_SPARE3 0x200c 101 + #define CMU_EGL_SPARE4 0x2010 102 + 103 + /* 104 + *Registers for CMU_FSYS 105 + */ 106 + 107 + #define MUX_SEL_FSYS0 0x0200 108 + #define MUX_SEL_FSYS1 0x0204 109 + #define MUX_ENABLE_FSYS0 0x0300 110 + #define MUX_ENABLE_FSYS1 0x0304 111 + #define MUX_STAT_FSYS0 0x0400 112 + #define MUX_STAT_FSYS1 0x0404 113 + #define MUX_IGNORE_FSYS0 0x0500 114 + #define MUX_IGNORE_FSYS1 0x0504 115 + #define EN_ACLK_FSYS 0x0800 116 + #define EN_ACLK_FSYS_SECURE_RTIC 0x0804 117 + #define EN_ACLK_FSYS_SECURE_SMMU_RTIC 0x0808 118 + #define EN_PCLK_FSYS 0x0900 119 + #define EN_SCLK_FSYS 0x0a00 120 + #define EN_IP_FSYS 0x0b00 121 + #define EN_IP_FSYS_SECURE_RTIC 0x0b04 122 + #define EN_IP_FSYS_SECURE_SMMU_RTIC 0x0b08 123 + 124 + /* 125 + *Registers for CMU_G2D 126 + */ 127 + 128 + #define MUX_SEL_G2D 0x0200 129 + #define MUX_ENABLE_G2D 0x0300 130 + #define MUX_STAT_G2D 0x0400 131 + #define DIV_G2D 0x0600 132 + #define DIV_STAT_G2D 0x0700 133 + #define EN_ACLK_G2D 0x0800 134 + #define EN_ACLK_G2D_SECURE_SSS 0x0804 135 + #define EN_ACLK_G2D_SECURE_SLIM_SSS 0x0808 136 + #define EN_ACLK_G2D_SECURE_SMMU_SLIM_SSS 0x080c 137 + #define EN_ACLK_G2D_SECURE_SMMU_SSS 0x0810 138 + #define EN_ACLK_G2D_SECURE_SMMU_MDMA 0x0814 139 + #define EN_ACLK_G2D_SECURE_SMMU_G2D 0x0818 140 + #define EN_PCLK_G2D 0x0900 141 + #define EN_PCLK_G2D_SECURE_SMMU_SLIM_SSS 0x0904 142 + #define EN_PCLK_G2D_SECURE_SMMU_SSS 0x0908 143 + #define EN_PCLK_G2D_SECURE_SMMU_MDMA 0x090c 144 + #define EN_PCLK_G2D_SECURE_SMMU_G2D 0x0910 145 + #define EN_IP_G2D 0x0b00 146 + #define EN_IP_G2D_SECURE_SSS 0x0b04 147 + #define EN_IP_G2D_SECURE_SLIM_SSS 0x0b08 148 + #define EN_IP_G2D_SECURE_SMMU_SLIM_SSS 0x0b0c 149 + #define EN_IP_G2D_SECURE_SMMU_SSS 0x0b10 150 + #define EN_IP_G2D_SECURE_SMMU_MDMA 0x0b14 151 + #define EN_IP_G2D_SECURE_SMMU_G2D 0x0b18 152 + 153 + /* 154 + *Registers for CMU_G3D 155 + */ 156 + 157 + #define G3D_PLL_LOCK 0x0000 158 + #define G3D_PLL_CON0 0x0100 159 + #define G3D_PLL_CON1 0x0104 160 + #define G3D_PLL_FDET 0x010c 161 + #define MUX_SEL_G3D 0x0200 162 + #define MUX_EN_G3D 0x0300 163 + #define MUX_STAT_G3D 0x0400 164 + #define MUX_IGNORE_G3D 0x0500 165 + #define DIV_G3D 0x0600 166 + #define DIV_G3D_PLL_FDET 0x0604 167 + #define DIV_STAT_G3D 0x0700 168 + #define DIV_STAT_G3D_PLL_FDET 0x0704 169 + #define EN_ACLK_G3D 0x0800 170 + #define EN_PCLK_G3D 0x0900 171 + #define EN_SCLK_G3D 0x0a00 172 + #define EN_IP_G3D 0x0b00 173 + #define CLKOUT_CMU_G3D 0x0c00 174 + #define CLKOUT_CMU_G3D_DIV_STAT 0x0c04 175 + #define G3DCLK_STOPCTRL 0x1000 176 + #define G3D_EMA_CTRL 0x1008 177 + #define G3D_EMA_STATUS 0x100c 178 + 179 + /* 180 + *Registers for CMU_GSCL 181 + */ 182 + 183 + #define MUX_SEL_GSCL 0x0200 184 + #define MUX_EN_GSCL 0x0300 185 + #define MUX_STAT_GSCL 0x0400 186 + #define MUX_IGNORE_GSCL 0x0500 187 + #define DIV_GSCL 0x0600 188 + #define DIV_STAT_GSCL 0x0700 189 + #define EN_ACLK_GSCL 0x0800 190 + #define EN_ACLK_GSCL_FIMC 0x0804 191 + #define EN_ACLK_GSCL_SECURE_SMMU_GSCL0 0x0808 192 + #define EN_ACLK_GSCL_SECURE_SMMU_GSCL1 0x080c 193 + #define EN_ACLK_GSCL_SECURE_SMMU_MSCL0 0x0810 194 + #define EN_ACLK_GSCL_SECURE_SMMU_MSCL1 0x0814 195 + #define EN_PCLK_GSCL 0x0900 196 + #define EN_PCLK_GSCL_FIMC 0x0904 197 + #define EN_PCLK_GSCL_SECURE_SMMU_GSCL0 0x0908 198 + #define EN_PCLK_GSCL_SECURE_SMMU_GSCL1 0x090c 199 + #define EN_PCLK_GSCL_SECURE_SMMU_MSCL0 0x0910 200 + #define EN_PCLK_GSCL_SECURE_SMMU_MSCL1 0x0914 201 + #define EN_SCLK_GSCL 0x0a00 202 + #define EN_SCLK_GSCL_FIMC 0x0a04 203 + #define EN_IP_GSCL 0x0b00 204 + #define EN_IP_GSCL_FIMC 0x0b04 205 + #define EN_IP_GSCL_SECURE_SMMU_GSCL0 0x0b08 206 + #define EN_IP_GSCL_SECURE_SMMU_GSCL1 0x0b0c 207 + #define EN_IP_GSCL_SECURE_SMMU_MSCL0 0x0b10 208 + #define EN_IP_GSCL_SECURE_SMMU_MSCL1 0x0b14 209 + 210 + /* 211 + *Registers for CMU_ISP 212 + */ 213 + #define MUX_SEL_ISP0 0x0200 214 + #define MUX_SEL_ISP1 0x0204 215 + #define MUX_ENABLE_ISP0 0x0300 216 + #define MUX_ENABLE_ISP1 0x0304 217 + #define MUX_STAT_ISP0 0x0400 218 + #define MUX_STAT_ISP1 0x0404 219 + #define MUX_IGNORE_ISP0 0x0500 220 + #define MUX_IGNORE_ISP1 0x0504 221 + #define DIV_ISP 0x0600 222 + #define DIV_STAT_ISP 0x0700 223 + #define EN_ACLK_ISP0 0x0800 224 + #define EN_ACLK_ISP1 0x0804 225 + #define EN_PCLK_ISP0 0x0900 226 + #define EN_PCLK_ISP1 0x0904 227 + #define EN_SCLK_ISP 0x0a00 228 + #define EN_IP_ISP0 0x0b00 229 + #define EN_IP_ISP1 0x0b04 230 + 231 + /* 232 + *Registers for CMU_KFC 233 + */ 234 + #define KFC_PLL_LOCK 0x0000 235 + #define KFC_PLL_CON0 0x0100 236 + #define KFC_PLL_CON1 0x0104 237 + #define KFC_PLL_FDET 0x010c 238 + #define MUX_SEL_KFC0 0x0200 239 + #define MUX_SEL_KFC2 0x0208 240 + #define MUX_ENABLE_KFC0 0x0300 241 + #define MUX_ENABLE_KFC2 0x0308 242 + #define MUX_STAT_KFC0 0x0400 243 + #define MUX_STAT_KFC2 0x0408 244 + #define DIV_KFC 0x0600 245 + #define DIV_KFC_PLL_FDET 0x0604 246 + #define DIV_STAT_KFC 0x0700 247 + #define DIV_STAT_KFC_PLL_FDET 0x0704 248 + #define EN_ACLK_KFC 0x0800 249 + #define EN_PCLK_KFC 0x0900 250 + #define EN_SCLK_KFC 0x0a00 251 + #define EN_IP_KFC 0x0b00 252 + #define CLKOUT_CMU_KFC 0x0c00 253 + #define CLKOUT_CMU_KFC_DIV_STAT 0x0c04 254 + #define ARMCLK_STOPCTRL_KFC 0x1000 255 + #define ARM_EMA_CTRL 0x1008 256 + #define ARM_EMA_STATUS 0x100c 257 + #define PWR_CTRL_KFC 0x1020 258 + #define PWR_CTRL2_KFC 0x1024 259 + #define CLKSTOP_CTRL_KFC 0x1028 260 + #define INTR_SPREAD_ENABLE_KFC 0x1080 261 + #define INTR_SPREAD_USE_STANDBYWFI_KFC 0x1084 262 + #define INTR_SPREAD_BLOCKING_DURATION_KFC 0x1088 263 + #define CMU_KFC_SPARE0 0x2000 264 + #define CMU_KFC_SPARE1 0x2004 265 + #define CMU_KFC_SPARE2 0x2008 266 + #define CMU_KFC_SPARE3 0x200c 267 + #define CMU_KFC_SPARE4 0x2010 268 + 269 + /* 270 + *Registers for CMU_MFC 271 + */ 272 + #define MUX_SEL_MFC 0x0200 273 + #define MUX_ENABLE_MFC 0x0300 274 + #define MUX_STAT_MFC 0x0400 275 + #define DIV_MFC 0x0600 276 + #define DIV_STAT_MFC 0x0700 277 + #define EN_ACLK_MFC 0x0800 278 + #define EN_ACLK_SECURE_SMMU2_MFC 0x0804 279 + #define EN_PCLK_MFC 0x0900 280 + #define EN_PCLK_SECURE_SMMU2_MFC 0x0904 281 + #define EN_IP_MFC 0x0b00 282 + #define EN_IP_MFC_SECURE_SMMU2_MFC 0x0b04 283 + 284 + /* 285 + *Registers for CMU_MIF 286 + */ 287 + #define MEM_PLL_LOCK 0x0000 288 + #define BUS_PLL_LOCK 0x0004 289 + #define MEDIA_PLL_LOCK 0x0008 290 + #define MEM_PLL_CON0 0x0100 291 + #define MEM_PLL_CON1 0x0104 292 + #define MEM_PLL_FDET 0x010c 293 + #define BUS_PLL_CON0 0x0110 294 + #define BUS_PLL_CON1 0x0114 295 + #define BUS_PLL_FDET 0x011c 296 + #define MEDIA_PLL_CON0 0x0120 297 + #define MEDIA_PLL_CON1 0x0124 298 + #define MEDIA_PLL_FDET 0x012c 299 + #define MUX_SEL_MIF 0x0200 300 + #define MUX_ENABLE_MIF 0x0300 301 + #define MUX_STAT_MIF 0x0400 302 + #define MUX_IGNORE_MIF 0x0500 303 + #define DIV_MIF 0x0600 304 + #define DIV_MIF_PLL_FDET 0x0604 305 + #define DIV_STAT_MIF 0x0700 306 + #define DIV_STAT_MIF_PLL_FDET 0x0704 307 + #define EN_ACLK_MIF 0x0800 308 + #define EN_ACLK_MIF_SECURE_DREX1_TZ 0x0804 309 + #define EN_ACLK_MIF_SECURE_DREX0_TZ 0x0808 310 + #define EN_ACLK_MIF_SECURE_INTMEM 0x080c 311 + #define EN_PCLK_MIF 0x0900 312 + #define EN_PCLK_MIF_SECURE_MONOCNT 0x0904 313 + #define EN_PCLK_MIF_SECURE_RTC_APBIF 0x0908 314 + #define EN_PCLK_MIF_SECURE_DREX1_TZ 0x090c 315 + #define EN_PCLK_MIF_SECURE_DREX0_TZ 0x0910 316 + #define EN_SCLK_MIF 0x0a00 317 + #define EN_IP_MIF 0x0b00 318 + #define EN_IP_MIF_SECURE_MONOCNT 0x0b04 319 + #define EN_IP_MIF_SECURE_RTC_APBIF 0x0b08 320 + #define EN_IP_MIF_SECURE_DREX1_TZ 0x0b0c 321 + #define EN_IP_MIF_SECURE_DREX0_TZ 0x0b10 322 + #define EN_IP_MIF_SECURE_INTEMEM 0x0b14 323 + #define CLKOUT_CMU_MIF_DIV_STAT 0x0c04 324 + #define DREX_FREQ_CTRL 0x1000 325 + #define PAUSE 0x1004 326 + #define DDRPHY_LOCK_CTRL 0x1008 327 + #define CLKOUT_CMU_MIF 0xcb00 328 + 329 + /* 330 + *Registers for CMU_PERI 331 + */ 332 + #define MUX_SEL_PERI 0x0200 333 + #define MUX_SEL_PERI1 0x0204 334 + #define MUX_ENABLE_PERI 0x0300 335 + #define MUX_ENABLE_PERI1 0x0304 336 + #define MUX_STAT_PERI 0x0400 337 + #define MUX_STAT_PERI1 0x0404 338 + #define MUX_IGNORE_PERI 0x0500 339 + #define MUX_IGNORE_PERI1 0x0504 340 + #define DIV_PERI 0x0600 341 + #define DIV_STAT_PERI 0x0700 342 + #define EN_PCLK_PERI0 0x0800 343 + #define EN_PCLK_PERI1 0x0804 344 + #define EN_PCLK_PERI2 0x0808 345 + #define EN_PCLK_PERI3 0x080c 346 + #define EN_PCLK_PERI_SECURE_CHIPID 0x0810 347 + #define EN_PCLK_PERI_SECURE_PROVKEY0 0x0814 348 + #define EN_PCLK_PERI_SECURE_PROVKEY1 0x0818 349 + #define EN_PCLK_PERI_SECURE_SECKEY 0x081c 350 + #define EN_PCLK_PERI_SECURE_ANTIRBKCNT 0x0820 351 + #define EN_PCLK_PERI_SECURE_TOP_RTC 0x0824 352 + #define EN_PCLK_PERI_SECURE_TZPC 0x0828 353 + #define EN_SCLK_PERI 0x0a00 354 + #define EN_SCLK_PERI_SECURE_TOP_RTC 0x0a04 355 + #define EN_IP_PERI0 0x0b00 356 + #define EN_IP_PERI1 0x0b04 357 + #define EN_IP_PERI2 0x0b08 358 + #define EN_IP_PERI_SECURE_CHIPID 0x0b0c 359 + #define EN_IP_PERI_SECURE_PROVKEY0 0x0b10 360 + #define EN_IP_PERI_SECURE_PROVKEY1 0x0b14 361 + #define EN_IP_PERI_SECURE_SECKEY 0x0b18 362 + #define EN_IP_PERI_SECURE_ANTIRBKCNT 0x0b1c 363 + #define EN_IP_PERI_SECURE_TOP_RTC 0x0b20 364 + #define EN_IP_PERI_SECURE_TZPC 0x0b24 365 + 366 + /* 367 + *Registers for CMU_TOP 368 + */ 369 + #define DISP_PLL_LOCK 0x0000 370 + #define AUD_PLL_LOCK 0x0004 371 + #define DISP_PLL_CON0 0x0100 372 + #define DISP_PLL_CON1 0x0104 373 + #define DISP_PLL_FDET 0x0108 374 + #define AUD_PLL_CON0 0x0110 375 + #define AUD_PLL_CON1 0x0114 376 + #define AUD_PLL_CON2 0x0118 377 + #define AUD_PLL_FDET 0x011c 378 + #define MUX_SEL_TOP_PLL0 0x0200 379 + #define MUX_SEL_TOP_MFC 0x0204 380 + #define MUX_SEL_TOP_G2D 0x0208 381 + #define MUX_SEL_TOP_GSCL 0x020c 382 + #define MUX_SEL_TOP_ISP10 0x0214 383 + #define MUX_SEL_TOP_ISP11 0x0218 384 + #define MUX_SEL_TOP_DISP0 0x021c 385 + #define MUX_SEL_TOP_DISP1 0x0220 386 + #define MUX_SEL_TOP_BUS 0x0224 387 + #define MUX_SEL_TOP_PERI0 0x0228 388 + #define MUX_SEL_TOP_PERI1 0x022c 389 + #define MUX_SEL_TOP_FSYS 0x0230 390 + #define MUX_ENABLE_TOP_PLL0 0x0300 391 + #define MUX_ENABLE_TOP_MFC 0x0304 392 + #define MUX_ENABLE_TOP_G2D 0x0308 393 + #define MUX_ENABLE_TOP_GSCL 0x030c 394 + #define MUX_ENABLE_TOP_ISP10 0x0314 395 + #define MUX_ENABLE_TOP_ISP11 0x0318 396 + #define MUX_ENABLE_TOP_DISP0 0x031c 397 + #define MUX_ENABLE_TOP_DISP1 0x0320 398 + #define MUX_ENABLE_TOP_BUS 0x0324 399 + #define MUX_ENABLE_TOP_PERI0 0x0328 400 + #define MUX_ENABLE_TOP_PERI1 0x032c 401 + #define MUX_ENABLE_TOP_FSYS 0x0330 402 + #define MUX_STAT_TOP_PLL0 0x0400 403 + #define MUX_STAT_TOP_MFC 0x0404 404 + #define MUX_STAT_TOP_G2D 0x0408 405 + #define MUX_STAT_TOP_GSCL 0x040c 406 + #define MUX_STAT_TOP_ISP10 0x0414 407 + #define MUX_STAT_TOP_ISP11 0x0418 408 + #define MUX_STAT_TOP_DISP0 0x041c 409 + #define MUX_STAT_TOP_DISP1 0x0420 410 + #define MUX_STAT_TOP_BUS 0x0424 411 + #define MUX_STAT_TOP_PERI0 0x0428 412 + #define MUX_STAT_TOP_PERI1 0x042c 413 + #define MUX_STAT_TOP_FSYS 0x0430 414 + #define MUX_IGNORE_TOP_PLL0 0x0500 415 + #define MUX_IGNORE_TOP_MFC 0x0504 416 + #define MUX_IGNORE_TOP_G2D 0x0508 417 + #define MUX_IGNORE_TOP_GSCL 0x050c 418 + #define MUX_IGNORE_TOP_ISP10 0x0514 419 + #define MUX_IGNORE_TOP_ISP11 0x0518 420 + #define MUX_IGNORE_TOP_DISP0 0x051c 421 + #define MUX_IGNORE_TOP_DISP1 0x0520 422 + #define MUX_IGNORE_TOP_BUS 0x0524 423 + #define MUX_IGNORE_TOP_PERI0 0x0528 424 + #define MUX_IGNORE_TOP_PERI1 0x052c 425 + #define MUX_IGNORE_TOP_FSYS 0x0530 426 + #define DIV_TOP_G2D_MFC 0x0600 427 + #define DIV_TOP_GSCL_ISP0 0x0604 428 + #define DIV_TOP_ISP10 0x0608 429 + #define DIV_TOP_ISP11 0x060c 430 + #define DIV_TOP_DISP 0x0610 431 + #define DIV_TOP_BUS 0x0614 432 + #define DIV_TOP_PERI0 0x0618 433 + #define DIV_TOP_PERI1 0x061c 434 + #define DIV_TOP_PERI2 0x0620 435 + #define DIV_TOP_FSYS0 0x0624 436 + #define DIV_TOP_FSYS1 0x0628 437 + #define DIV_TOP_HPM 0x062c 438 + #define DIV_TOP_PLL_FDET 0x0630 439 + #define DIV_STAT_TOP_G2D_MFC 0x0700 440 + #define DIV_STAT_TOP_GSCL_ISP0 0x0704 441 + #define DIV_STAT_TOP_ISP10 0x0708 442 + #define DIV_STAT_TOP_ISP11 0x070c 443 + #define DIV_STAT_TOP_DISP 0x0710 444 + #define DIV_STAT_TOP_BUS 0x0714 445 + #define DIV_STAT_TOP_PERI0 0x0718 446 + #define DIV_STAT_TOP_PERI1 0x071c 447 + #define DIV_STAT_TOP_PERI2 0x0720 448 + #define DIV_STAT_TOP_FSYS0 0x0724 449 + #define DIV_STAT_TOP_FSYS1 0x0728 450 + #define DIV_STAT_TOP_HPM 0x072c 451 + #define DIV_STAT_TOP_PLL_FDET 0x0730 452 + #define EN_ACLK_TOP 0x0800 453 + #define EN_SCLK_TOP 0x0a00 454 + #define EN_IP_TOP 0x0b00 455 + #define CLKOUT_CMU_TOP 0x0c00 456 + #define CLKOUT_CMU_TOP_DIV_STAT 0x0c04 457 + 458 + #endif /*__CLK_EXYNOS5260_H */ 459 +
+755 -322
drivers/clk/samsung/clk-exynos5420.c
··· 27 27 #define DIV_CPU1 0x504 28 28 #define GATE_BUS_CPU 0x700 29 29 #define GATE_SCLK_CPU 0x800 30 + #define CLKOUT_CMU_CPU 0xa00 31 + #define GATE_IP_G2D 0x8800 30 32 #define CPLL_LOCK 0x10020 31 33 #define DPLL_LOCK 0x10030 32 34 #define EPLL_LOCK 0x10040 33 35 #define RPLL_LOCK 0x10050 34 36 #define IPLL_LOCK 0x10060 35 37 #define SPLL_LOCK 0x10070 36 - #define VPLL_LOCK 0x10070 38 + #define VPLL_LOCK 0x10080 37 39 #define MPLL_LOCK 0x10090 38 40 #define CPLL_CON0 0x10120 39 41 #define DPLL_CON0 0x10128 40 42 #define EPLL_CON0 0x10130 43 + #define EPLL_CON1 0x10134 44 + #define EPLL_CON2 0x10138 41 45 #define RPLL_CON0 0x10140 46 + #define RPLL_CON1 0x10144 47 + #define RPLL_CON2 0x10148 42 48 #define IPLL_CON0 0x10150 43 49 #define SPLL_CON0 0x10160 44 50 #define VPLL_CON0 0x10170 ··· 57 51 #define SRC_TOP5 0x10214 58 52 #define SRC_TOP6 0x10218 59 53 #define SRC_TOP7 0x1021c 54 + #define SRC_TOP8 0x10220 /* 5800 specific */ 55 + #define SRC_TOP9 0x10224 /* 5800 specific */ 60 56 #define SRC_DISP10 0x1022c 61 57 #define SRC_MAU 0x10240 62 58 #define SRC_FSYS 0x10244 63 59 #define SRC_PERIC0 0x10250 64 60 #define SRC_PERIC1 0x10254 61 + #define SRC_ISP 0x10270 62 + #define SRC_CAM 0x10274 /* 5800 specific */ 65 63 #define SRC_TOP10 0x10280 66 64 #define SRC_TOP11 0x10284 67 65 #define SRC_TOP12 0x10288 68 - #define SRC_MASK_DISP10 0x1032c 66 + #define SRC_TOP13 0x1028c /* 5800 specific */ 67 + #define SRC_MASK_TOP2 0x10308 68 + #define SRC_MASK_TOP7 0x1031c 69 + #define SRC_MASK_DISP10 0x1032c 70 + #define SRC_MASK_MAU 0x10334 69 71 #define SRC_MASK_FSYS 0x10340 70 72 #define SRC_MASK_PERIC0 0x10350 71 73 #define SRC_MASK_PERIC1 0x10354 72 74 #define DIV_TOP0 0x10500 73 75 #define DIV_TOP1 0x10504 74 76 #define DIV_TOP2 0x10508 77 + #define DIV_TOP8 0x10520 /* 5800 specific */ 78 + #define DIV_TOP9 0x10524 /* 5800 specific */ 75 79 #define DIV_DISP10 0x1052c 76 80 #define DIV_MAU 0x10544 77 81 #define DIV_FSYS0 0x10548 ··· 92 76 #define DIV_PERIC2 0x10560 93 77 #define DIV_PERIC3 0x10564 94 78 #define DIV_PERIC4 0x10568 79 + #define DIV_CAM 0x10574 /* 5800 specific */ 80 + #define SCLK_DIV_ISP0 0x10580 81 + #define SCLK_DIV_ISP1 0x10584 82 + #define DIV2_RATIO0 0x10590 83 + #define DIV4_RATIO 0x105a0 95 84 #define GATE_BUS_TOP 0x10700 85 + #define GATE_BUS_GEN 0x1073c 96 86 #define GATE_BUS_FSYS0 0x10740 87 + #define GATE_BUS_FSYS2 0x10748 97 88 #define GATE_BUS_PERIC 0x10750 98 89 #define GATE_BUS_PERIC1 0x10754 99 90 #define GATE_BUS_PERIS0 0x10760 100 91 #define GATE_BUS_PERIS1 0x10764 92 + #define GATE_BUS_NOC 0x10770 93 + #define GATE_TOP_SCLK_ISP 0x10870 101 94 #define GATE_IP_GSCL0 0x10910 102 95 #define GATE_IP_GSCL1 0x10920 96 + #define GATE_IP_CAM 0x10924 /* 5800 specific */ 103 97 #define GATE_IP_MFC 0x1092c 104 98 #define GATE_IP_DISP1 0x10928 105 99 #define GATE_IP_G3D 0x10930 106 100 #define GATE_IP_GEN 0x10934 101 + #define GATE_IP_FSYS 0x10944 102 + #define GATE_IP_PERIC 0x10950 103 + #define GATE_IP_PERIS 0x10960 107 104 #define GATE_IP_MSCL 0x10970 108 105 #define GATE_TOP_SCLK_GSCL 0x10820 109 106 #define GATE_TOP_SCLK_DISP1 0x10828 110 107 #define GATE_TOP_SCLK_MAU 0x1083c 111 108 #define GATE_TOP_SCLK_FSYS 0x10840 112 109 #define GATE_TOP_SCLK_PERIC 0x10850 110 + #define TOP_SPARE2 0x10b08 113 111 #define BPLL_LOCK 0x20010 114 112 #define BPLL_CON0 0x20110 115 - #define SRC_CDREX 0x20200 116 113 #define KPLL_LOCK 0x28000 117 114 #define KPLL_CON0 0x28100 118 115 #define SRC_KFC 0x28200 119 116 #define DIV_KFC0 0x28500 120 117 118 + /* Exynos5x SoC type */ 119 + enum exynos5x_soc { 120 + EXYNOS5420, 121 + EXYNOS5800, 122 + }; 123 + 121 124 /* list of PLLs */ 122 - enum exynos5420_plls { 125 + enum exynos5x_plls { 123 126 apll, cpll, dpll, epll, rpll, ipll, spll, vpll, mpll, 124 127 bpll, kpll, 125 128 nr_plls /* number of PLLs */ 126 129 }; 127 130 128 131 static void __iomem *reg_base; 132 + static enum exynos5x_soc exynos5x_soc; 129 133 130 134 #ifdef CONFIG_PM_SLEEP 131 - static struct samsung_clk_reg_dump *exynos5420_save; 135 + static struct samsung_clk_reg_dump *exynos5x_save; 136 + static struct samsung_clk_reg_dump *exynos5800_save; 132 137 133 138 /* 134 139 * list of controller registers to be saved and restored during a 135 140 * suspend/resume cycle. 136 141 */ 137 - static unsigned long exynos5420_clk_regs[] __initdata = { 142 + static unsigned long exynos5x_clk_regs[] __initdata = { 138 143 SRC_CPU, 139 144 DIV_CPU0, 140 145 DIV_CPU1, 141 146 GATE_BUS_CPU, 142 147 GATE_SCLK_CPU, 148 + CLKOUT_CMU_CPU, 149 + EPLL_CON0, 150 + EPLL_CON1, 151 + EPLL_CON2, 152 + RPLL_CON0, 153 + RPLL_CON1, 154 + RPLL_CON2, 143 155 SRC_TOP0, 144 156 SRC_TOP1, 145 157 SRC_TOP2, ··· 184 140 SRC_TOP10, 185 141 SRC_TOP11, 186 142 SRC_TOP12, 143 + SRC_MASK_TOP2, 144 + SRC_MASK_TOP7, 187 145 SRC_MASK_DISP10, 188 146 SRC_MASK_FSYS, 189 147 SRC_MASK_PERIC0, 190 148 SRC_MASK_PERIC1, 149 + SRC_ISP, 191 150 DIV_TOP0, 192 151 DIV_TOP1, 193 152 DIV_TOP2, ··· 204 157 DIV_PERIC2, 205 158 DIV_PERIC3, 206 159 DIV_PERIC4, 160 + SCLK_DIV_ISP0, 161 + SCLK_DIV_ISP1, 162 + DIV2_RATIO0, 163 + DIV4_RATIO, 207 164 GATE_BUS_TOP, 165 + GATE_BUS_GEN, 208 166 GATE_BUS_FSYS0, 167 + GATE_BUS_FSYS2, 209 168 GATE_BUS_PERIC, 210 169 GATE_BUS_PERIC1, 211 170 GATE_BUS_PERIS0, 212 171 GATE_BUS_PERIS1, 172 + GATE_BUS_NOC, 173 + GATE_TOP_SCLK_ISP, 213 174 GATE_IP_GSCL0, 214 175 GATE_IP_GSCL1, 215 176 GATE_IP_MFC, 216 177 GATE_IP_DISP1, 217 178 GATE_IP_G3D, 218 179 GATE_IP_GEN, 180 + GATE_IP_FSYS, 181 + GATE_IP_PERIC, 182 + GATE_IP_PERIS, 219 183 GATE_IP_MSCL, 220 184 GATE_TOP_SCLK_GSCL, 221 185 GATE_TOP_SCLK_DISP1, 222 186 GATE_TOP_SCLK_MAU, 223 187 GATE_TOP_SCLK_FSYS, 224 188 GATE_TOP_SCLK_PERIC, 225 - SRC_CDREX, 189 + TOP_SPARE2, 226 190 SRC_KFC, 227 191 DIV_KFC0, 228 192 }; 229 193 194 + static unsigned long exynos5800_clk_regs[] __initdata = { 195 + SRC_TOP8, 196 + SRC_TOP9, 197 + SRC_CAM, 198 + SRC_TOP1, 199 + DIV_TOP8, 200 + DIV_TOP9, 201 + DIV_CAM, 202 + GATE_IP_CAM, 203 + }; 204 + 230 205 static int exynos5420_clk_suspend(void) 231 206 { 232 - samsung_clk_save(reg_base, exynos5420_save, 233 - ARRAY_SIZE(exynos5420_clk_regs)); 207 + samsung_clk_save(reg_base, exynos5x_save, 208 + ARRAY_SIZE(exynos5x_clk_regs)); 209 + 210 + if (exynos5x_soc == EXYNOS5800) 211 + samsung_clk_save(reg_base, exynos5800_save, 212 + ARRAY_SIZE(exynos5800_clk_regs)); 234 213 235 214 return 0; 236 215 } 237 216 238 217 static void exynos5420_clk_resume(void) 239 218 { 240 - samsung_clk_restore(reg_base, exynos5420_save, 241 - ARRAY_SIZE(exynos5420_clk_regs)); 219 + samsung_clk_restore(reg_base, exynos5x_save, 220 + ARRAY_SIZE(exynos5x_clk_regs)); 221 + 222 + if (exynos5x_soc == EXYNOS5800) 223 + samsung_clk_restore(reg_base, exynos5800_save, 224 + ARRAY_SIZE(exynos5800_clk_regs)); 242 225 } 243 226 244 227 static struct syscore_ops exynos5420_clk_syscore_ops = { ··· 278 201 279 202 static void exynos5420_clk_sleep_init(void) 280 203 { 281 - exynos5420_save = samsung_clk_alloc_reg_dump(exynos5420_clk_regs, 282 - ARRAY_SIZE(exynos5420_clk_regs)); 283 - if (!exynos5420_save) { 204 + exynos5x_save = samsung_clk_alloc_reg_dump(exynos5x_clk_regs, 205 + ARRAY_SIZE(exynos5x_clk_regs)); 206 + if (!exynos5x_save) { 284 207 pr_warn("%s: failed to allocate sleep save data, no sleep support!\n", 285 208 __func__); 286 209 return; 287 210 } 288 211 212 + if (exynos5x_soc == EXYNOS5800) { 213 + exynos5800_save = 214 + samsung_clk_alloc_reg_dump(exynos5800_clk_regs, 215 + ARRAY_SIZE(exynos5800_clk_regs)); 216 + if (!exynos5800_save) 217 + goto err_soc; 218 + } 219 + 289 220 register_syscore_ops(&exynos5420_clk_syscore_ops); 221 + return; 222 + err_soc: 223 + kfree(exynos5x_save); 224 + pr_warn("%s: failed to allocate sleep save data, no sleep support!\n", 225 + __func__); 226 + return; 290 227 } 291 228 #else 292 229 static void exynos5420_clk_sleep_init(void) {} 293 230 #endif 294 231 295 232 /* list of all parent clocks */ 296 - PNAME(mspll_cpu_p) = { "sclk_cpll", "sclk_dpll", 297 - "sclk_mpll", "sclk_spll" }; 298 - PNAME(cpu_p) = { "mout_apll" , "mout_mspll_cpu" }; 299 - PNAME(kfc_p) = { "mout_kpll" , "mout_mspll_kfc" }; 300 - PNAME(apll_p) = { "fin_pll", "fout_apll", }; 301 - PNAME(bpll_p) = { "fin_pll", "fout_bpll", }; 302 - PNAME(cpll_p) = { "fin_pll", "fout_cpll", }; 303 - PNAME(dpll_p) = { "fin_pll", "fout_dpll", }; 304 - PNAME(epll_p) = { "fin_pll", "fout_epll", }; 305 - PNAME(ipll_p) = { "fin_pll", "fout_ipll", }; 306 - PNAME(kpll_p) = { "fin_pll", "fout_kpll", }; 307 - PNAME(mpll_p) = { "fin_pll", "fout_mpll", }; 308 - PNAME(rpll_p) = { "fin_pll", "fout_rpll", }; 309 - PNAME(spll_p) = { "fin_pll", "fout_spll", }; 310 - PNAME(vpll_p) = { "fin_pll", "fout_vpll", }; 233 + PNAME(mout_mspll_cpu_p) = {"mout_sclk_cpll", "mout_sclk_dpll", 234 + "mout_sclk_mpll", "mout_sclk_spll"}; 235 + PNAME(mout_cpu_p) = {"mout_apll" , "mout_mspll_cpu"}; 236 + PNAME(mout_kfc_p) = {"mout_kpll" , "mout_mspll_kfc"}; 237 + PNAME(mout_apll_p) = {"fin_pll", "fout_apll"}; 238 + PNAME(mout_bpll_p) = {"fin_pll", "fout_bpll"}; 239 + PNAME(mout_cpll_p) = {"fin_pll", "fout_cpll"}; 240 + PNAME(mout_dpll_p) = {"fin_pll", "fout_dpll"}; 241 + PNAME(mout_epll_p) = {"fin_pll", "fout_epll"}; 242 + PNAME(mout_ipll_p) = {"fin_pll", "fout_ipll"}; 243 + PNAME(mout_kpll_p) = {"fin_pll", "fout_kpll"}; 244 + PNAME(mout_mpll_p) = {"fin_pll", "fout_mpll"}; 245 + PNAME(mout_rpll_p) = {"fin_pll", "fout_rpll"}; 246 + PNAME(mout_spll_p) = {"fin_pll", "fout_spll"}; 247 + PNAME(mout_vpll_p) = {"fin_pll", "fout_vpll"}; 311 248 312 - PNAME(group1_p) = { "sclk_cpll", "sclk_dpll", "sclk_mpll" }; 313 - PNAME(group2_p) = { "fin_pll", "sclk_cpll", "sclk_dpll", "sclk_mpll", 314 - "sclk_spll", "sclk_ipll", "sclk_epll", "sclk_rpll" }; 315 - PNAME(group3_p) = { "sclk_rpll", "sclk_spll" }; 316 - PNAME(group4_p) = { "sclk_ipll", "sclk_dpll", "sclk_mpll" }; 317 - PNAME(group5_p) = { "sclk_vpll", "sclk_dpll" }; 249 + PNAME(mout_group1_p) = {"mout_sclk_cpll", "mout_sclk_dpll", 250 + "mout_sclk_mpll"}; 251 + PNAME(mout_group2_p) = {"fin_pll", "mout_sclk_cpll", 252 + "mout_sclk_dpll", "mout_sclk_mpll", "mout_sclk_spll", 253 + "mout_sclk_ipll", "mout_sclk_epll", "mout_sclk_rpll"}; 254 + PNAME(mout_group3_p) = {"mout_sclk_rpll", "mout_sclk_spll"}; 255 + PNAME(mout_group4_p) = {"mout_sclk_ipll", "mout_sclk_dpll", "mout_sclk_mpll"}; 256 + PNAME(mout_group5_p) = {"mout_sclk_vpll", "mout_sclk_dpll"}; 318 257 319 - PNAME(sw_aclk66_p) = { "dout_aclk66", "sclk_spll" }; 320 - PNAME(aclk66_peric_p) = { "fin_pll", "mout_sw_aclk66" }; 258 + PNAME(mout_fimd1_final_p) = {"mout_fimd1", "mout_fimd1_opt"}; 259 + PNAME(mout_sw_aclk66_p) = {"dout_aclk66", "mout_sclk_spll"}; 260 + PNAME(mout_user_aclk66_peric_p) = { "fin_pll", "mout_sw_aclk66"}; 261 + PNAME(mout_user_pclk66_gpio_p) = {"mout_sw_aclk66", "ff_sw_aclk66"}; 321 262 322 - PNAME(sw_aclk200_fsys_p) = { "dout_aclk200_fsys", "sclk_spll"}; 323 - PNAME(user_aclk200_fsys_p) = { "fin_pll", "mout_sw_aclk200_fsys" }; 263 + PNAME(mout_sw_aclk200_fsys_p) = {"dout_aclk200_fsys", "mout_sclk_spll"}; 264 + PNAME(mout_sw_pclk200_fsys_p) = {"dout_pclk200_fsys", "mout_sclk_spll"}; 265 + PNAME(mout_user_pclk200_fsys_p) = {"fin_pll", "mout_sw_pclk200_fsys"}; 266 + PNAME(mout_user_aclk200_fsys_p) = {"fin_pll", "mout_sw_aclk200_fsys"}; 324 267 325 - PNAME(sw_aclk200_fsys2_p) = { "dout_aclk200_fsys2", "sclk_spll"}; 326 - PNAME(user_aclk200_fsys2_p) = { "fin_pll", "mout_sw_aclk200_fsys2" }; 268 + PNAME(mout_sw_aclk200_fsys2_p) = {"dout_aclk200_fsys2", "mout_sclk_spll"}; 269 + PNAME(mout_user_aclk200_fsys2_p) = {"fin_pll", "mout_sw_aclk200_fsys2"}; 270 + PNAME(mout_sw_aclk100_noc_p) = {"dout_aclk100_noc", "mout_sclk_spll"}; 271 + PNAME(mout_user_aclk100_noc_p) = {"fin_pll", "mout_sw_aclk100_noc"}; 327 272 328 - PNAME(sw_aclk200_p) = { "dout_aclk200", "sclk_spll"}; 329 - PNAME(aclk200_disp1_p) = { "fin_pll", "mout_sw_aclk200" }; 273 + PNAME(mout_sw_aclk400_wcore_p) = {"dout_aclk400_wcore", "mout_sclk_spll"}; 274 + PNAME(mout_aclk400_wcore_bpll_p) = {"mout_aclk400_wcore", "sclk_bpll"}; 275 + PNAME(mout_user_aclk400_wcore_p) = {"fin_pll", "mout_sw_aclk400_wcore"}; 330 276 331 - PNAME(sw_aclk400_mscl_p) = { "dout_aclk400_mscl", "sclk_spll"}; 332 - PNAME(user_aclk400_mscl_p) = { "fin_pll", "mout_sw_aclk400_mscl" }; 277 + PNAME(mout_sw_aclk400_isp_p) = {"dout_aclk400_isp", "mout_sclk_spll"}; 278 + PNAME(mout_user_aclk400_isp_p) = {"fin_pll", "mout_sw_aclk400_isp"}; 333 279 334 - PNAME(sw_aclk333_p) = { "dout_aclk333", "sclk_spll"}; 335 - PNAME(user_aclk333_p) = { "fin_pll", "mout_sw_aclk333" }; 280 + PNAME(mout_sw_aclk333_432_isp0_p) = {"dout_aclk333_432_isp0", 281 + "mout_sclk_spll"}; 282 + PNAME(mout_user_aclk333_432_isp0_p) = {"fin_pll", "mout_sw_aclk333_432_isp0"}; 336 283 337 - PNAME(sw_aclk166_p) = { "dout_aclk166", "sclk_spll"}; 338 - PNAME(user_aclk166_p) = { "fin_pll", "mout_sw_aclk166" }; 284 + PNAME(mout_sw_aclk333_432_isp_p) = {"dout_aclk333_432_isp", "mout_sclk_spll"}; 285 + PNAME(mout_user_aclk333_432_isp_p) = {"fin_pll", "mout_sw_aclk333_432_isp"}; 339 286 340 - PNAME(sw_aclk266_p) = { "dout_aclk266", "sclk_spll"}; 341 - PNAME(user_aclk266_p) = { "fin_pll", "mout_sw_aclk266" }; 287 + PNAME(mout_sw_aclk200_p) = {"dout_aclk200", "mout_sclk_spll"}; 288 + PNAME(mout_user_aclk200_disp1_p) = {"fin_pll", "mout_sw_aclk200"}; 342 289 343 - PNAME(sw_aclk333_432_gscl_p) = { "dout_aclk333_432_gscl", "sclk_spll"}; 344 - PNAME(user_aclk333_432_gscl_p) = { "fin_pll", "mout_sw_aclk333_432_gscl" }; 290 + PNAME(mout_sw_aclk400_mscl_p) = {"dout_aclk400_mscl", "mout_sclk_spll"}; 291 + PNAME(mout_user_aclk400_mscl_p) = {"fin_pll", "mout_sw_aclk400_mscl"}; 345 292 346 - PNAME(sw_aclk300_gscl_p) = { "dout_aclk300_gscl", "sclk_spll"}; 347 - PNAME(user_aclk300_gscl_p) = { "fin_pll", "mout_sw_aclk300_gscl" }; 293 + PNAME(mout_sw_aclk333_p) = {"dout_aclk333", "mout_sclk_spll"}; 294 + PNAME(mout_user_aclk333_p) = {"fin_pll", "mout_sw_aclk333"}; 348 295 349 - PNAME(sw_aclk300_disp1_p) = { "dout_aclk300_disp1", "sclk_spll"}; 350 - PNAME(user_aclk300_disp1_p) = { "fin_pll", "mout_sw_aclk300_disp1" }; 296 + PNAME(mout_sw_aclk166_p) = {"dout_aclk166", "mout_sclk_spll"}; 297 + PNAME(mout_user_aclk166_p) = {"fin_pll", "mout_sw_aclk166"}; 351 298 352 - PNAME(sw_aclk300_jpeg_p) = { "dout_aclk300_jpeg", "sclk_spll"}; 353 - PNAME(user_aclk300_jpeg_p) = { "fin_pll", "mout_sw_aclk300_jpeg" }; 299 + PNAME(mout_sw_aclk266_p) = {"dout_aclk266", "mout_sclk_spll"}; 300 + PNAME(mout_user_aclk266_p) = {"fin_pll", "mout_sw_aclk266"}; 301 + PNAME(mout_user_aclk266_isp_p) = {"fin_pll", "mout_sw_aclk266"}; 354 302 355 - PNAME(sw_aclk_g3d_p) = { "dout_aclk_g3d", "sclk_spll"}; 356 - PNAME(user_aclk_g3d_p) = { "fin_pll", "mout_sw_aclk_g3d" }; 303 + PNAME(mout_sw_aclk333_432_gscl_p) = {"dout_aclk333_432_gscl", "mout_sclk_spll"}; 304 + PNAME(mout_user_aclk333_432_gscl_p) = {"fin_pll", "mout_sw_aclk333_432_gscl"}; 357 305 358 - PNAME(sw_aclk266_g2d_p) = { "dout_aclk266_g2d", "sclk_spll"}; 359 - PNAME(user_aclk266_g2d_p) = { "fin_pll", "mout_sw_aclk266_g2d" }; 306 + PNAME(mout_sw_aclk300_gscl_p) = {"dout_aclk300_gscl", "mout_sclk_spll"}; 307 + PNAME(mout_user_aclk300_gscl_p) = {"fin_pll", "mout_sw_aclk300_gscl"}; 360 308 361 - PNAME(sw_aclk333_g2d_p) = { "dout_aclk333_g2d", "sclk_spll"}; 362 - PNAME(user_aclk333_g2d_p) = { "fin_pll", "mout_sw_aclk333_g2d" }; 309 + PNAME(mout_sw_aclk300_disp1_p) = {"dout_aclk300_disp1", "mout_sclk_spll"}; 310 + PNAME(mout_sw_aclk400_disp1_p) = {"dout_aclk400_disp1", "mout_sclk_spll"}; 311 + PNAME(mout_user_aclk300_disp1_p) = {"fin_pll", "mout_sw_aclk300_disp1"}; 312 + PNAME(mout_user_aclk400_disp1_p) = {"fin_pll", "mout_sw_aclk400_disp1"}; 363 313 364 - PNAME(audio0_p) = { "fin_pll", "cdclk0", "sclk_dpll", "sclk_mpll", 365 - "sclk_spll", "sclk_ipll", "sclk_epll", "sclk_rpll" }; 366 - PNAME(audio1_p) = { "fin_pll", "cdclk1", "sclk_dpll", "sclk_mpll", 367 - "sclk_spll", "sclk_ipll", "sclk_epll", "sclk_rpll" }; 368 - PNAME(audio2_p) = { "fin_pll", "cdclk2", "sclk_dpll", "sclk_mpll", 369 - "sclk_spll", "sclk_ipll", "sclk_epll", "sclk_rpll" }; 370 - PNAME(spdif_p) = { "fin_pll", "dout_audio0", "dout_audio1", "dout_audio2", 371 - "spdif_extclk", "sclk_ipll", "sclk_epll", "sclk_rpll" }; 372 - PNAME(hdmi_p) = { "dout_hdmi_pixel", "sclk_hdmiphy" }; 373 - PNAME(maudio0_p) = { "fin_pll", "maudio_clk", "sclk_dpll", "sclk_mpll", 374 - "sclk_spll", "sclk_ipll", "sclk_epll", "sclk_rpll" }; 314 + PNAME(mout_sw_aclk300_jpeg_p) = {"dout_aclk300_jpeg", "mout_sclk_spll"}; 315 + PNAME(mout_user_aclk300_jpeg_p) = {"fin_pll", "mout_sw_aclk300_jpeg"}; 316 + 317 + PNAME(mout_sw_aclk_g3d_p) = {"dout_aclk_g3d", "mout_sclk_spll"}; 318 + PNAME(mout_user_aclk_g3d_p) = {"fin_pll", "mout_sw_aclk_g3d"}; 319 + 320 + PNAME(mout_sw_aclk266_g2d_p) = {"dout_aclk266_g2d", "mout_sclk_spll"}; 321 + PNAME(mout_user_aclk266_g2d_p) = {"fin_pll", "mout_sw_aclk266_g2d"}; 322 + 323 + PNAME(mout_sw_aclk333_g2d_p) = {"dout_aclk333_g2d", "mout_sclk_spll"}; 324 + PNAME(mout_user_aclk333_g2d_p) = {"fin_pll", "mout_sw_aclk333_g2d"}; 325 + 326 + PNAME(mout_audio0_p) = {"fin_pll", "cdclk0", "mout_sclk_dpll", 327 + "mout_sclk_mpll", "mout_sclk_spll", "mout_sclk_ipll", 328 + "mout_sclk_epll", "mout_sclk_rpll"}; 329 + PNAME(mout_audio1_p) = {"fin_pll", "cdclk1", "mout_sclk_dpll", 330 + "mout_sclk_mpll", "mout_sclk_spll", "mout_sclk_ipll", 331 + "mout_sclk_epll", "mout_sclk_rpll"}; 332 + PNAME(mout_audio2_p) = {"fin_pll", "cdclk2", "mout_sclk_dpll", 333 + "mout_sclk_mpll", "mout_sclk_spll", "mout_sclk_ipll", 334 + "mout_sclk_epll", "mout_sclk_rpll"}; 335 + PNAME(mout_spdif_p) = {"fin_pll", "dout_audio0", "dout_audio1", 336 + "dout_audio2", "spdif_extclk", "mout_sclk_ipll", 337 + "mout_sclk_epll", "mout_sclk_rpll"}; 338 + PNAME(mout_hdmi_p) = {"dout_hdmi_pixel", "sclk_hdmiphy"}; 339 + PNAME(mout_maudio0_p) = {"fin_pll", "maudio_clk", "mout_sclk_dpll", 340 + "mout_sclk_mpll", "mout_sclk_spll", "mout_sclk_ipll", 341 + "mout_sclk_epll", "mout_sclk_rpll"}; 342 + PNAME(mout_mau_epll_clk_p) = {"mout_sclk_epll", "mout_sclk_dpll", 343 + "mout_sclk_mpll", "mout_sclk_spll"}; 344 + /* List of parents specific to exynos5800 */ 345 + PNAME(mout_epll2_5800_p) = { "mout_sclk_epll", "ff_dout_epll2" }; 346 + PNAME(mout_group1_5800_p) = { "mout_sclk_cpll", "mout_sclk_dpll", 347 + "mout_sclk_mpll", "ff_dout_spll2" }; 348 + PNAME(mout_group2_5800_p) = { "mout_sclk_cpll", "mout_sclk_dpll", 349 + "mout_sclk_mpll", "ff_dout_spll2", 350 + "mout_epll2", "mout_sclk_ipll" }; 351 + PNAME(mout_group3_5800_p) = { "mout_sclk_cpll", "mout_sclk_dpll", 352 + "mout_sclk_mpll", "ff_dout_spll2", 353 + "mout_epll2" }; 354 + PNAME(mout_group5_5800_p) = { "mout_sclk_cpll", "mout_sclk_dpll", 355 + "mout_sclk_mpll", "mout_sclk_spll" }; 356 + PNAME(mout_group6_5800_p) = { "mout_sclk_ipll", "mout_sclk_dpll", 357 + "mout_sclk_mpll", "ff_dout_spll2" }; 358 + PNAME(mout_group7_5800_p) = { "mout_sclk_cpll", "mout_sclk_dpll", 359 + "mout_sclk_mpll", "mout_sclk_spll", 360 + "mout_epll2", "mout_sclk_ipll" }; 361 + PNAME(mout_mau_epll_clk_5800_p) = { "mout_sclk_epll", "mout_sclk_dpll", 362 + "mout_sclk_mpll", 363 + "ff_dout_spll2" }; 364 + PNAME(mout_group8_5800_p) = { "dout_aclk432_scaler", "dout_sclk_sw" }; 365 + PNAME(mout_group9_5800_p) = { "dout_osc_div", "mout_sw_aclk432_scaler" }; 366 + PNAME(mout_group10_5800_p) = { "dout_aclk432_cam", "dout_sclk_sw" }; 367 + PNAME(mout_group11_5800_p) = { "dout_osc_div", "mout_sw_aclk432_cam" }; 368 + PNAME(mout_group12_5800_p) = { "dout_aclkfl1_550_cam", "dout_sclk_sw" }; 369 + PNAME(mout_group13_5800_p) = { "dout_osc_div", "mout_sw_aclkfl1_550_cam" }; 370 + PNAME(mout_group14_5800_p) = { "dout_aclk550_cam", "dout_sclk_sw" }; 371 + PNAME(mout_group15_5800_p) = { "dout_osc_div", "mout_sw_aclk550_cam" }; 375 372 376 373 /* fixed rate clocks generated outside the soc */ 377 - static struct samsung_fixed_rate_clock exynos5420_fixed_rate_ext_clks[] __initdata = { 374 + static struct samsung_fixed_rate_clock 375 + exynos5x_fixed_rate_ext_clks[] __initdata = { 378 376 FRATE(CLK_FIN_PLL, "fin_pll", NULL, CLK_IS_ROOT, 0), 379 377 }; 380 378 381 379 /* fixed rate clocks generated inside the soc */ 382 - static struct samsung_fixed_rate_clock exynos5420_fixed_rate_clks[] __initdata = { 380 + static struct samsung_fixed_rate_clock exynos5x_fixed_rate_clks[] __initdata = { 383 381 FRATE(CLK_SCLK_HDMIPHY, "sclk_hdmiphy", NULL, CLK_IS_ROOT, 24000000), 384 382 FRATE(0, "sclk_pwi", NULL, CLK_IS_ROOT, 24000000), 385 383 FRATE(0, "sclk_usbh20", NULL, CLK_IS_ROOT, 48000000), ··· 462 310 FRATE(0, "sclk_usbh20_scan_clk", NULL, CLK_IS_ROOT, 480000000), 463 311 }; 464 312 465 - static struct samsung_fixed_factor_clock exynos5420_fixed_factor_clks[] __initdata = { 466 - FFACTOR(0, "sclk_hsic_12m", "fin_pll", 1, 2, 0), 313 + static struct samsung_fixed_factor_clock 314 + exynos5x_fixed_factor_clks[] __initdata = { 315 + FFACTOR(0, "ff_hsic_12m", "fin_pll", 1, 2, 0), 316 + FFACTOR(0, "ff_sw_aclk66", "mout_sw_aclk66", 1, 2, 0), 467 317 }; 468 318 469 - static struct samsung_mux_clock exynos5420_mux_clks[] __initdata = { 470 - MUX(0, "mout_mspll_kfc", mspll_cpu_p, SRC_TOP7, 8, 2), 471 - MUX(0, "mout_mspll_cpu", mspll_cpu_p, SRC_TOP7, 12, 2), 472 - MUX(0, "mout_apll", apll_p, SRC_CPU, 0, 1), 473 - MUX(0, "mout_cpu", cpu_p, SRC_CPU, 16, 1), 474 - MUX(0, "mout_kpll", kpll_p, SRC_KFC, 0, 1), 475 - MUX(0, "mout_cpu_kfc", kfc_p, SRC_KFC, 16, 1), 319 + static struct samsung_fixed_factor_clock 320 + exynos5800_fixed_factor_clks[] __initdata = { 321 + FFACTOR(0, "ff_dout_epll2", "mout_sclk_epll", 1, 2, 0), 322 + FFACTOR(0, "ff_dout_spll2", "mout_sclk_spll", 1, 2, 0), 323 + }; 476 324 477 - MUX(0, "sclk_bpll", bpll_p, SRC_CDREX, 0, 1), 325 + struct samsung_mux_clock exynos5800_mux_clks[] __initdata = { 326 + MUX(0, "mout_aclk400_isp", mout_group3_5800_p, SRC_TOP0, 0, 3), 327 + MUX(0, "mout_aclk400_mscl", mout_group3_5800_p, SRC_TOP0, 4, 3), 328 + MUX(0, "mout_aclk400_wcore", mout_group2_5800_p, SRC_TOP0, 16, 3), 329 + MUX(0, "mout_aclk100_noc", mout_group1_5800_p, SRC_TOP0, 20, 2), 478 330 479 - MUX_A(0, "mout_aclk400_mscl", group1_p, 480 - SRC_TOP0, 4, 2, "aclk400_mscl"), 481 - MUX(0, "mout_aclk200", group1_p, SRC_TOP0, 8, 2), 482 - MUX(0, "mout_aclk200_fsys2", group1_p, SRC_TOP0, 12, 2), 483 - MUX(0, "mout_aclk200_fsys", group1_p, SRC_TOP0, 28, 2), 331 + MUX(0, "mout_aclk333_432_gscl", mout_group6_5800_p, SRC_TOP1, 0, 2), 332 + MUX(0, "mout_aclk333_432_isp", mout_group6_5800_p, SRC_TOP1, 4, 2), 333 + MUX(0, "mout_aclk333_432_isp0", mout_group6_5800_p, SRC_TOP1, 12, 2), 334 + MUX(0, "mout_aclk266", mout_group5_5800_p, SRC_TOP1, 20, 2), 335 + MUX(0, "mout_aclk333", mout_group1_5800_p, SRC_TOP1, 28, 2), 484 336 485 - MUX(0, "mout_aclk333_432_gscl", group4_p, SRC_TOP1, 0, 2), 486 - MUX(0, "mout_aclk66", group1_p, SRC_TOP1, 8, 2), 487 - MUX(0, "mout_aclk266", group1_p, SRC_TOP1, 20, 2), 488 - MUX(0, "mout_aclk166", group1_p, SRC_TOP1, 24, 2), 489 - MUX(0, "mout_aclk333", group1_p, SRC_TOP1, 28, 2), 337 + MUX(0, "mout_aclk400_disp1", mout_group7_5800_p, SRC_TOP2, 4, 3), 338 + MUX(0, "mout_aclk333_g2d", mout_group5_5800_p, SRC_TOP2, 8, 2), 339 + MUX(0, "mout_aclk266_g2d", mout_group5_5800_p, SRC_TOP2, 12, 2), 340 + MUX(0, "mout_aclk300_jpeg", mout_group5_5800_p, SRC_TOP2, 20, 2), 341 + MUX(0, "mout_aclk300_disp1", mout_group5_5800_p, SRC_TOP2, 24, 2), 342 + MUX(0, "mout_aclk300_gscl", mout_group5_5800_p, SRC_TOP2, 28, 2), 490 343 491 - MUX(0, "mout_aclk333_g2d", group1_p, SRC_TOP2, 8, 2), 492 - MUX(0, "mout_aclk266_g2d", group1_p, SRC_TOP2, 12, 2), 493 - MUX(0, "mout_aclk_g3d", group5_p, SRC_TOP2, 16, 1), 494 - MUX(0, "mout_aclk300_jpeg", group1_p, SRC_TOP2, 20, 2), 495 - MUX(0, "mout_aclk300_disp1", group1_p, SRC_TOP2, 24, 2), 496 - MUX(0, "mout_aclk300_gscl", group1_p, SRC_TOP2, 28, 2), 344 + MUX(0, "mout_mau_epll_clk", mout_mau_epll_clk_5800_p, SRC_TOP7, 345 + 20, 2), 346 + MUX(0, "sclk_bpll", mout_bpll_p, SRC_TOP7, 24, 1), 347 + MUX(0, "mout_epll2", mout_epll2_5800_p, SRC_TOP7, 28, 1), 497 348 498 - MUX(0, "mout_user_aclk400_mscl", user_aclk400_mscl_p, 349 + MUX(0, "mout_aclk550_cam", mout_group3_5800_p, SRC_TOP8, 16, 3), 350 + MUX(0, "mout_aclkfl1_550_cam", mout_group3_5800_p, SRC_TOP8, 20, 3), 351 + MUX(0, "mout_aclk432_cam", mout_group6_5800_p, SRC_TOP8, 24, 2), 352 + MUX(0, "mout_aclk432_scaler", mout_group6_5800_p, SRC_TOP8, 28, 2), 353 + 354 + MUX(0, "mout_user_aclk550_cam", mout_group15_5800_p, 355 + SRC_TOP9, 16, 1), 356 + MUX(0, "mout_user_aclkfl1_550_cam", mout_group13_5800_p, 357 + SRC_TOP9, 20, 1), 358 + MUX(0, "mout_user_aclk432_cam", mout_group11_5800_p, 359 + SRC_TOP9, 24, 1), 360 + MUX(0, "mout_user_aclk432_scaler", mout_group9_5800_p, 361 + SRC_TOP9, 28, 1), 362 + 363 + MUX(0, "mout_sw_aclk550_cam", mout_group14_5800_p, SRC_TOP13, 16, 1), 364 + MUX(0, "mout_sw_aclkfl1_550_cam", mout_group12_5800_p, 365 + SRC_TOP13, 20, 1), 366 + MUX(0, "mout_sw_aclk432_cam", mout_group10_5800_p, 367 + SRC_TOP13, 24, 1), 368 + MUX(0, "mout_sw_aclk432_scaler", mout_group8_5800_p, 369 + SRC_TOP13, 28, 1), 370 + 371 + MUX(0, "mout_fimd1", mout_group2_p, SRC_DISP10, 4, 3), 372 + }; 373 + 374 + struct samsung_div_clock exynos5800_div_clks[] __initdata = { 375 + DIV(0, "dout_aclk400_wcore", "mout_aclk400_wcore", DIV_TOP0, 16, 3), 376 + 377 + DIV(0, "dout_aclk550_cam", "mout_aclk550_cam", 378 + DIV_TOP8, 16, 3), 379 + DIV(0, "dout_aclkfl1_550_cam", "mout_aclkfl1_550_cam", 380 + DIV_TOP8, 20, 3), 381 + DIV(0, "dout_aclk432_cam", "mout_aclk432_cam", 382 + DIV_TOP8, 24, 3), 383 + DIV(0, "dout_aclk432_scaler", "mout_aclk432_scaler", 384 + DIV_TOP8, 28, 3), 385 + 386 + DIV(0, "dout_osc_div", "fin_pll", DIV_TOP9, 20, 3), 387 + DIV(0, "dout_sclk_sw", "sclk_spll", DIV_TOP9, 24, 6), 388 + }; 389 + 390 + struct samsung_gate_clock exynos5800_gate_clks[] __initdata = { 391 + GATE(CLK_ACLK550_CAM, "aclk550_cam", "mout_user_aclk550_cam", 392 + GATE_BUS_TOP, 24, 0, 0), 393 + GATE(CLK_ACLK432_SCALER, "aclk432_scaler", "mout_user_aclk432_scaler", 394 + GATE_BUS_TOP, 27, 0, 0), 395 + }; 396 + 397 + struct samsung_mux_clock exynos5420_mux_clks[] __initdata = { 398 + MUX(0, "sclk_bpll", mout_bpll_p, TOP_SPARE2, 0, 1), 399 + MUX(0, "mout_aclk400_wcore_bpll", mout_aclk400_wcore_bpll_p, 400 + TOP_SPARE2, 4, 1), 401 + 402 + MUX(0, "mout_aclk400_isp", mout_group1_p, SRC_TOP0, 0, 2), 403 + MUX_A(0, "mout_aclk400_mscl", mout_group1_p, 404 + SRC_TOP0, 4, 2, "aclk400_mscl"), 405 + MUX(0, "mout_aclk400_wcore", mout_group1_p, SRC_TOP0, 16, 2), 406 + MUX(0, "mout_aclk100_noc", mout_group1_p, SRC_TOP0, 20, 2), 407 + 408 + MUX(0, "mout_aclk333_432_gscl", mout_group4_p, SRC_TOP1, 0, 2), 409 + MUX(0, "mout_aclk333_432_isp", mout_group4_p, 410 + SRC_TOP1, 4, 2), 411 + MUX(0, "mout_aclk333_432_isp0", mout_group4_p, SRC_TOP1, 12, 2), 412 + MUX(0, "mout_aclk266", mout_group1_p, SRC_TOP1, 20, 2), 413 + MUX(0, "mout_aclk333", mout_group1_p, SRC_TOP1, 28, 2), 414 + 415 + MUX(0, "mout_aclk400_disp1", mout_group1_p, SRC_TOP2, 4, 2), 416 + MUX(0, "mout_aclk333_g2d", mout_group1_p, SRC_TOP2, 8, 2), 417 + MUX(0, "mout_aclk266_g2d", mout_group1_p, SRC_TOP2, 12, 2), 418 + MUX(0, "mout_aclk300_jpeg", mout_group1_p, SRC_TOP2, 20, 2), 419 + MUX(0, "mout_aclk300_disp1", mout_group1_p, SRC_TOP2, 24, 2), 420 + MUX(0, "mout_aclk300_gscl", mout_group1_p, SRC_TOP2, 28, 2), 421 + 422 + MUX(0, "mout_mau_epll_clk", mout_mau_epll_clk_p, SRC_TOP7, 20, 2), 423 + 424 + MUX(0, "mout_fimd1", mout_group3_p, SRC_DISP10, 4, 1), 425 + }; 426 + 427 + struct samsung_div_clock exynos5420_div_clks[] __initdata = { 428 + DIV(0, "dout_aclk400_wcore", "mout_aclk400_wcore_bpll", 429 + DIV_TOP0, 16, 3), 430 + }; 431 + 432 + static struct samsung_mux_clock exynos5x_mux_clks[] __initdata = { 433 + MUX(0, "mout_user_pclk66_gpio", mout_user_pclk66_gpio_p, 434 + SRC_TOP7, 4, 1), 435 + MUX(0, "mout_mspll_kfc", mout_mspll_cpu_p, SRC_TOP7, 8, 2), 436 + MUX(0, "mout_mspll_cpu", mout_mspll_cpu_p, SRC_TOP7, 12, 2), 437 + 438 + MUX(0, "mout_apll", mout_apll_p, SRC_CPU, 0, 1), 439 + MUX(0, "mout_cpu", mout_cpu_p, SRC_CPU, 16, 1), 440 + MUX(0, "mout_kpll", mout_kpll_p, SRC_KFC, 0, 1), 441 + MUX(0, "mout_kfc", mout_kfc_p, SRC_KFC, 16, 1), 442 + 443 + MUX(0, "mout_aclk200", mout_group1_p, SRC_TOP0, 8, 2), 444 + MUX(0, "mout_aclk200_fsys2", mout_group1_p, SRC_TOP0, 12, 2), 445 + MUX(0, "mout_pclk200_fsys", mout_group1_p, SRC_TOP0, 24, 2), 446 + MUX(0, "mout_aclk200_fsys", mout_group1_p, SRC_TOP0, 28, 2), 447 + 448 + MUX(0, "mout_aclk66", mout_group1_p, SRC_TOP1, 8, 2), 449 + MUX(0, "mout_aclk166", mout_group1_p, SRC_TOP1, 24, 2), 450 + 451 + MUX(0, "mout_aclk_g3d", mout_group5_p, SRC_TOP2, 16, 1), 452 + 453 + MUX(0, "mout_user_aclk400_isp", mout_user_aclk400_isp_p, 454 + SRC_TOP3, 0, 1), 455 + MUX(0, "mout_user_aclk400_mscl", mout_user_aclk400_mscl_p, 499 456 SRC_TOP3, 4, 1), 500 - MUX_A(0, "mout_aclk200_disp1", aclk200_disp1_p, 501 - SRC_TOP3, 8, 1, "aclk200_disp1"), 502 - MUX(0, "mout_user_aclk200_fsys2", user_aclk200_fsys2_p, 457 + MUX(0, "mout_user_aclk200_disp1", mout_user_aclk200_disp1_p, 458 + SRC_TOP3, 8, 1), 459 + MUX(0, "mout_user_aclk200_fsys2", mout_user_aclk200_fsys2_p, 503 460 SRC_TOP3, 12, 1), 504 - MUX(0, "mout_user_aclk200_fsys", user_aclk200_fsys_p, 461 + MUX(0, "mout_user_aclk400_wcore", mout_user_aclk400_wcore_p, 462 + SRC_TOP3, 16, 1), 463 + MUX(0, "mout_user_aclk100_noc", mout_user_aclk100_noc_p, 464 + SRC_TOP3, 20, 1), 465 + MUX(0, "mout_user_pclk200_fsys", mout_user_pclk200_fsys_p, 466 + SRC_TOP3, 24, 1), 467 + MUX(0, "mout_user_aclk200_fsys", mout_user_aclk200_fsys_p, 505 468 SRC_TOP3, 28, 1), 506 469 507 - MUX(0, "mout_user_aclk333_432_gscl", user_aclk333_432_gscl_p, 470 + MUX(0, "mout_user_aclk333_432_gscl", mout_user_aclk333_432_gscl_p, 508 471 SRC_TOP4, 0, 1), 509 - MUX(0, "mout_aclk66_peric", aclk66_peric_p, SRC_TOP4, 8, 1), 510 - MUX(0, "mout_user_aclk266", user_aclk266_p, SRC_TOP4, 20, 1), 511 - MUX(0, "mout_user_aclk166", user_aclk166_p, SRC_TOP4, 24, 1), 512 - MUX(0, "mout_user_aclk333", user_aclk333_p, SRC_TOP4, 28, 1), 472 + MUX(0, "mout_user_aclk333_432_isp", mout_user_aclk333_432_isp_p, 473 + SRC_TOP4, 4, 1), 474 + MUX(0, "mout_user_aclk66_peric", mout_user_aclk66_peric_p, 475 + SRC_TOP4, 8, 1), 476 + MUX(0, "mout_user_aclk333_432_isp0", mout_user_aclk333_432_isp0_p, 477 + SRC_TOP4, 12, 1), 478 + MUX(0, "mout_user_aclk266_isp", mout_user_aclk266_isp_p, 479 + SRC_TOP4, 16, 1), 480 + MUX(0, "mout_user_aclk266", mout_user_aclk266_p, SRC_TOP4, 20, 1), 481 + MUX(0, "mout_user_aclk166", mout_user_aclk166_p, SRC_TOP4, 24, 1), 482 + MUX(0, "mout_user_aclk333", mout_user_aclk333_p, SRC_TOP4, 28, 1), 513 483 514 - MUX(0, "mout_aclk66_psgen", aclk66_peric_p, SRC_TOP5, 4, 1), 515 - MUX(0, "mout_user_aclk333_g2d", user_aclk333_g2d_p, SRC_TOP5, 8, 1), 516 - MUX(0, "mout_user_aclk266_g2d", user_aclk266_g2d_p, SRC_TOP5, 12, 1), 517 - MUX_A(0, "mout_user_aclk_g3d", user_aclk_g3d_p, 518 - SRC_TOP5, 16, 1, "aclkg3d"), 519 - MUX(0, "mout_user_aclk300_jpeg", user_aclk300_jpeg_p, 484 + MUX(0, "mout_user_aclk400_disp1", mout_user_aclk400_disp1_p, 485 + SRC_TOP5, 0, 1), 486 + MUX(0, "mout_user_aclk66_psgen", mout_user_aclk66_peric_p, 487 + SRC_TOP5, 4, 1), 488 + MUX(0, "mout_user_aclk333_g2d", mout_user_aclk333_g2d_p, 489 + SRC_TOP5, 8, 1), 490 + MUX(0, "mout_user_aclk266_g2d", mout_user_aclk266_g2d_p, 491 + SRC_TOP5, 12, 1), 492 + MUX(CLK_MOUT_G3D, "mout_user_aclk_g3d", mout_user_aclk_g3d_p, 493 + SRC_TOP5, 16, 1), 494 + MUX(0, "mout_user_aclk300_jpeg", mout_user_aclk300_jpeg_p, 520 495 SRC_TOP5, 20, 1), 521 - MUX(0, "mout_user_aclk300_disp1", user_aclk300_disp1_p, 496 + MUX(0, "mout_user_aclk300_disp1", mout_user_aclk300_disp1_p, 522 497 SRC_TOP5, 24, 1), 523 - MUX(0, "mout_user_aclk300_gscl", user_aclk300_gscl_p, 498 + MUX(0, "mout_user_aclk300_gscl", mout_user_aclk300_gscl_p, 524 499 SRC_TOP5, 28, 1), 525 500 526 - MUX(0, "sclk_mpll", mpll_p, SRC_TOP6, 0, 1), 527 - MUX(0, "sclk_vpll", vpll_p, SRC_TOP6, 4, 1), 528 - MUX(0, "sclk_spll", spll_p, SRC_TOP6, 8, 1), 529 - MUX(0, "sclk_ipll", ipll_p, SRC_TOP6, 12, 1), 530 - MUX(0, "sclk_rpll", rpll_p, SRC_TOP6, 16, 1), 531 - MUX(0, "sclk_epll", epll_p, SRC_TOP6, 20, 1), 532 - MUX(0, "sclk_dpll", dpll_p, SRC_TOP6, 24, 1), 533 - MUX(0, "sclk_cpll", cpll_p, SRC_TOP6, 28, 1), 501 + MUX(0, "mout_sclk_mpll", mout_mpll_p, SRC_TOP6, 0, 1), 502 + MUX(CLK_MOUT_VPLL, "mout_sclk_vpll", mout_vpll_p, SRC_TOP6, 4, 1), 503 + MUX(0, "mout_sclk_spll", mout_spll_p, SRC_TOP6, 8, 1), 504 + MUX(0, "mout_sclk_ipll", mout_ipll_p, SRC_TOP6, 12, 1), 505 + MUX(0, "mout_sclk_rpll", mout_rpll_p, SRC_TOP6, 16, 1), 506 + MUX(0, "mout_sclk_epll", mout_epll_p, SRC_TOP6, 20, 1), 507 + MUX(0, "mout_sclk_dpll", mout_dpll_p, SRC_TOP6, 24, 1), 508 + MUX(0, "mout_sclk_cpll", mout_cpll_p, SRC_TOP6, 28, 1), 534 509 535 - MUX(0, "mout_sw_aclk400_mscl", sw_aclk400_mscl_p, SRC_TOP10, 4, 1), 536 - MUX(0, "mout_sw_aclk200", sw_aclk200_p, SRC_TOP10, 8, 1), 537 - MUX(0, "mout_sw_aclk200_fsys2", sw_aclk200_fsys2_p, 510 + MUX(0, "mout_sw_aclk400_isp", mout_sw_aclk400_isp_p, 511 + SRC_TOP10, 0, 1), 512 + MUX(0, "mout_sw_aclk400_mscl", mout_sw_aclk400_mscl_p, 513 + SRC_TOP10, 4, 1), 514 + MUX(0, "mout_sw_aclk200", mout_sw_aclk200_p, SRC_TOP10, 8, 1), 515 + MUX(0, "mout_sw_aclk200_fsys2", mout_sw_aclk200_fsys2_p, 538 516 SRC_TOP10, 12, 1), 539 - MUX(0, "mout_sw_aclk200_fsys", sw_aclk200_fsys_p, SRC_TOP10, 28, 1), 517 + MUX(0, "mout_sw_aclk400_wcore", mout_sw_aclk400_wcore_p, 518 + SRC_TOP10, 16, 1), 519 + MUX(0, "mout_sw_aclk100_noc", mout_sw_aclk100_noc_p, 520 + SRC_TOP10, 20, 1), 521 + MUX(0, "mout_sw_pclk200_fsys", mout_sw_pclk200_fsys_p, 522 + SRC_TOP10, 24, 1), 523 + MUX(0, "mout_sw_aclk200_fsys", mout_sw_aclk200_fsys_p, 524 + SRC_TOP10, 28, 1), 540 525 541 - MUX(0, "mout_sw_aclk333_432_gscl", sw_aclk333_432_gscl_p, 526 + MUX(0, "mout_sw_aclk333_432_gscl", mout_sw_aclk333_432_gscl_p, 542 527 SRC_TOP11, 0, 1), 543 - MUX(0, "mout_sw_aclk66", sw_aclk66_p, SRC_TOP11, 8, 1), 544 - MUX(0, "mout_sw_aclk266", sw_aclk266_p, SRC_TOP11, 20, 1), 545 - MUX(0, "mout_sw_aclk166", sw_aclk166_p, SRC_TOP11, 24, 1), 546 - MUX(0, "mout_sw_aclk333", sw_aclk333_p, SRC_TOP11, 28, 1), 528 + MUX(0, "mout_sw_aclk333_432_isp", mout_sw_aclk333_432_isp_p, 529 + SRC_TOP11, 4, 1), 530 + MUX(0, "mout_sw_aclk66", mout_sw_aclk66_p, SRC_TOP11, 8, 1), 531 + MUX(0, "mout_sw_aclk333_432_isp0", mout_sw_aclk333_432_isp0_p, 532 + SRC_TOP11, 12, 1), 533 + MUX(0, "mout_sw_aclk266", mout_sw_aclk266_p, SRC_TOP11, 20, 1), 534 + MUX(0, "mout_sw_aclk166", mout_sw_aclk166_p, SRC_TOP11, 24, 1), 535 + MUX(0, "mout_sw_aclk333", mout_sw_aclk333_p, SRC_TOP11, 28, 1), 547 536 548 - MUX(0, "mout_sw_aclk333_g2d", sw_aclk333_g2d_p, SRC_TOP12, 8, 1), 549 - MUX(0, "mout_sw_aclk266_g2d", sw_aclk266_g2d_p, SRC_TOP12, 12, 1), 550 - MUX(0, "mout_sw_aclk_g3d", sw_aclk_g3d_p, SRC_TOP12, 16, 1), 551 - MUX(0, "mout_sw_aclk300_jpeg", sw_aclk300_jpeg_p, SRC_TOP12, 20, 1), 552 - MUX(0, "mout_sw_aclk300_disp1", sw_aclk300_disp1_p, 537 + MUX(0, "mout_sw_aclk400_disp1", mout_sw_aclk400_disp1_p, 538 + SRC_TOP12, 4, 1), 539 + MUX(0, "mout_sw_aclk333_g2d", mout_sw_aclk333_g2d_p, 540 + SRC_TOP12, 8, 1), 541 + MUX(0, "mout_sw_aclk266_g2d", mout_sw_aclk266_g2d_p, 542 + SRC_TOP12, 12, 1), 543 + MUX(0, "mout_sw_aclk_g3d", mout_sw_aclk_g3d_p, SRC_TOP12, 16, 1), 544 + MUX(0, "mout_sw_aclk300_jpeg", mout_sw_aclk300_jpeg_p, 545 + SRC_TOP12, 20, 1), 546 + MUX(0, "mout_sw_aclk300_disp1", mout_sw_aclk300_disp1_p, 553 547 SRC_TOP12, 24, 1), 554 - MUX(0, "mout_sw_aclk300_gscl", sw_aclk300_gscl_p, SRC_TOP12, 28, 1), 548 + MUX(0, "mout_sw_aclk300_gscl", mout_sw_aclk300_gscl_p, 549 + SRC_TOP12, 28, 1), 555 550 556 551 /* DISP1 Block */ 557 - MUX(0, "mout_fimd1", group3_p, SRC_DISP10, 4, 1), 558 - MUX(0, "mout_mipi1", group2_p, SRC_DISP10, 16, 3), 559 - MUX(0, "mout_dp1", group2_p, SRC_DISP10, 20, 3), 560 - MUX(0, "mout_pixel", group2_p, SRC_DISP10, 24, 3), 561 - MUX(CLK_MOUT_HDMI, "mout_hdmi", hdmi_p, SRC_DISP10, 28, 1), 552 + MUX(0, "mout_mipi1", mout_group2_p, SRC_DISP10, 16, 3), 553 + MUX(0, "mout_dp1", mout_group2_p, SRC_DISP10, 20, 3), 554 + MUX(0, "mout_pixel", mout_group2_p, SRC_DISP10, 24, 3), 555 + MUX(CLK_MOUT_HDMI, "mout_hdmi", mout_hdmi_p, SRC_DISP10, 28, 1), 556 + MUX(0, "mout_fimd1_opt", mout_group2_p, SRC_DISP10, 8, 3), 557 + 558 + MUX(0, "mout_fimd1_final", mout_fimd1_final_p, TOP_SPARE2, 8, 1), 562 559 563 560 /* MAU Block */ 564 - MUX(0, "mout_maudio0", maudio0_p, SRC_MAU, 28, 3), 561 + MUX(CLK_MOUT_MAUDIO0, "mout_maudio0", mout_maudio0_p, SRC_MAU, 28, 3), 565 562 566 563 /* FSYS Block */ 567 - MUX(0, "mout_usbd301", group2_p, SRC_FSYS, 4, 3), 568 - MUX(0, "mout_mmc0", group2_p, SRC_FSYS, 8, 3), 569 - MUX(0, "mout_mmc1", group2_p, SRC_FSYS, 12, 3), 570 - MUX(0, "mout_mmc2", group2_p, SRC_FSYS, 16, 3), 571 - MUX(0, "mout_usbd300", group2_p, SRC_FSYS, 20, 3), 572 - MUX(0, "mout_unipro", group2_p, SRC_FSYS, 24, 3), 564 + MUX(0, "mout_usbd301", mout_group2_p, SRC_FSYS, 4, 3), 565 + MUX(0, "mout_mmc0", mout_group2_p, SRC_FSYS, 8, 3), 566 + MUX(0, "mout_mmc1", mout_group2_p, SRC_FSYS, 12, 3), 567 + MUX(0, "mout_mmc2", mout_group2_p, SRC_FSYS, 16, 3), 568 + MUX(0, "mout_usbd300", mout_group2_p, SRC_FSYS, 20, 3), 569 + MUX(0, "mout_unipro", mout_group2_p, SRC_FSYS, 24, 3), 570 + MUX(0, "mout_mphy_refclk", mout_group2_p, SRC_FSYS, 28, 3), 573 571 574 572 /* PERIC Block */ 575 - MUX(0, "mout_uart0", group2_p, SRC_PERIC0, 4, 3), 576 - MUX(0, "mout_uart1", group2_p, SRC_PERIC0, 8, 3), 577 - MUX(0, "mout_uart2", group2_p, SRC_PERIC0, 12, 3), 578 - MUX(0, "mout_uart3", group2_p, SRC_PERIC0, 16, 3), 579 - MUX(0, "mout_pwm", group2_p, SRC_PERIC0, 24, 3), 580 - MUX(0, "mout_spdif", spdif_p, SRC_PERIC0, 28, 3), 581 - MUX(0, "mout_audio0", audio0_p, SRC_PERIC1, 8, 3), 582 - MUX(0, "mout_audio1", audio1_p, SRC_PERIC1, 12, 3), 583 - MUX(0, "mout_audio2", audio2_p, SRC_PERIC1, 16, 3), 584 - MUX(0, "mout_spi0", group2_p, SRC_PERIC1, 20, 3), 585 - MUX(0, "mout_spi1", group2_p, SRC_PERIC1, 24, 3), 586 - MUX(0, "mout_spi2", group2_p, SRC_PERIC1, 28, 3), 573 + MUX(0, "mout_uart0", mout_group2_p, SRC_PERIC0, 4, 3), 574 + MUX(0, "mout_uart1", mout_group2_p, SRC_PERIC0, 8, 3), 575 + MUX(0, "mout_uart2", mout_group2_p, SRC_PERIC0, 12, 3), 576 + MUX(0, "mout_uart3", mout_group2_p, SRC_PERIC0, 16, 3), 577 + MUX(0, "mout_pwm", mout_group2_p, SRC_PERIC0, 24, 3), 578 + MUX(0, "mout_spdif", mout_spdif_p, SRC_PERIC0, 28, 3), 579 + MUX(0, "mout_audio0", mout_audio0_p, SRC_PERIC1, 8, 3), 580 + MUX(0, "mout_audio1", mout_audio1_p, SRC_PERIC1, 12, 3), 581 + MUX(0, "mout_audio2", mout_audio2_p, SRC_PERIC1, 16, 3), 582 + MUX(0, "mout_spi0", mout_group2_p, SRC_PERIC1, 20, 3), 583 + MUX(0, "mout_spi1", mout_group2_p, SRC_PERIC1, 24, 3), 584 + MUX(0, "mout_spi2", mout_group2_p, SRC_PERIC1, 28, 3), 585 + 586 + /* ISP Block */ 587 + MUX(0, "mout_pwm_isp", mout_group2_p, SRC_ISP, 24, 3), 588 + MUX(0, "mout_uart_isp", mout_group2_p, SRC_ISP, 20, 3), 589 + MUX(0, "mout_spi0_isp", mout_group2_p, SRC_ISP, 12, 3), 590 + MUX(0, "mout_spi1_isp", mout_group2_p, SRC_ISP, 16, 3), 591 + MUX(0, "mout_isp_sensor", mout_group2_p, SRC_ISP, 28, 3), 587 592 }; 588 593 589 - static struct samsung_div_clock exynos5420_div_clks[] __initdata = { 594 + static struct samsung_div_clock exynos5x_div_clks[] __initdata = { 590 595 DIV(0, "div_arm", "mout_cpu", DIV_CPU0, 0, 3), 591 596 DIV(0, "sclk_apll", "mout_apll", DIV_CPU0, 24, 3), 592 597 DIV(0, "armclk2", "div_arm", DIV_CPU0, 28, 3), 593 - DIV(0, "div_kfc", "mout_cpu_kfc", DIV_KFC0, 0, 3), 598 + DIV(0, "div_kfc", "mout_kfc", DIV_KFC0, 0, 3), 594 599 DIV(0, "sclk_kpll", "mout_kpll", DIV_KFC0, 24, 3), 595 600 601 + DIV(0, "dout_aclk400_isp", "mout_aclk400_isp", DIV_TOP0, 0, 3), 596 602 DIV(0, "dout_aclk400_mscl", "mout_aclk400_mscl", DIV_TOP0, 4, 3), 597 603 DIV(0, "dout_aclk200", "mout_aclk200", DIV_TOP0, 8, 3), 598 604 DIV(0, "dout_aclk200_fsys2", "mout_aclk200_fsys2", DIV_TOP0, 12, 3), 605 + DIV(0, "dout_aclk100_noc", "mout_aclk100_noc", DIV_TOP0, 20, 3), 599 606 DIV(0, "dout_pclk200_fsys", "mout_pclk200_fsys", DIV_TOP0, 24, 3), 600 607 DIV(0, "dout_aclk200_fsys", "mout_aclk200_fsys", DIV_TOP0, 28, 3), 601 608 602 609 DIV(0, "dout_aclk333_432_gscl", "mout_aclk333_432_gscl", 603 610 DIV_TOP1, 0, 3), 611 + DIV(0, "dout_aclk333_432_isp", "mout_aclk333_432_isp", 612 + DIV_TOP1, 4, 3), 604 613 DIV(0, "dout_aclk66", "mout_aclk66", DIV_TOP1, 8, 6), 614 + DIV(0, "dout_aclk333_432_isp0", "mout_aclk333_432_isp0", 615 + DIV_TOP1, 16, 3), 605 616 DIV(0, "dout_aclk266", "mout_aclk266", DIV_TOP1, 20, 3), 606 617 DIV(0, "dout_aclk166", "mout_aclk166", DIV_TOP1, 24, 3), 607 618 DIV(0, "dout_aclk333", "mout_aclk333", DIV_TOP1, 28, 3), ··· 773 458 DIV(0, "dout_aclk266_g2d", "mout_aclk266_g2d", DIV_TOP2, 12, 3), 774 459 DIV(0, "dout_aclk_g3d", "mout_aclk_g3d", DIV_TOP2, 16, 3), 775 460 DIV(0, "dout_aclk300_jpeg", "mout_aclk300_jpeg", DIV_TOP2, 20, 3), 776 - DIV_A(0, "dout_aclk300_disp1", "mout_aclk300_disp1", 777 - DIV_TOP2, 24, 3, "aclk300_disp1"), 461 + DIV(0, "dout_aclk300_disp1", "mout_aclk300_disp1", DIV_TOP2, 24, 3), 778 462 DIV(0, "dout_aclk300_gscl", "mout_aclk300_gscl", DIV_TOP2, 28, 3), 779 463 780 464 /* DISP1 Block */ 781 - DIV(0, "dout_fimd1", "mout_fimd1", DIV_DISP10, 0, 4), 465 + DIV(0, "dout_fimd1", "mout_fimd1_final", DIV_DISP10, 0, 4), 782 466 DIV(0, "dout_mipi1", "mout_mipi1", DIV_DISP10, 16, 8), 783 467 DIV(0, "dout_dp1", "mout_dp1", DIV_DISP10, 24, 4), 784 468 DIV(CLK_DOUT_PIXEL, "dout_hdmi_pixel", "mout_pixel", DIV_DISP10, 28, 4), 469 + DIV(0, "dout_disp1_blk", "aclk200_disp1", DIV2_RATIO0, 16, 2), 470 + DIV(0, "dout_aclk400_disp1", "mout_aclk400_disp1", DIV_TOP2, 4, 3), 785 471 786 472 /* Audio Block */ 787 473 DIV(0, "dout_maudio0", "mout_maudio0", DIV_MAU, 20, 4), ··· 800 484 DIV(0, "dout_mmc2", "mout_mmc2", DIV_FSYS1, 20, 10), 801 485 802 486 DIV(0, "dout_unipro", "mout_unipro", DIV_FSYS2, 24, 8), 487 + DIV(0, "dout_mphy_refclk", "mout_mphy_refclk", DIV_FSYS2, 16, 8), 803 488 804 489 /* UART and PWM */ 805 490 DIV(0, "dout_uart0", "mout_uart0", DIV_PERIC0, 8, 4), ··· 814 497 DIV(0, "dout_spi1", "mout_spi1", DIV_PERIC1, 24, 4), 815 498 DIV(0, "dout_spi2", "mout_spi2", DIV_PERIC1, 28, 4), 816 499 500 + /* Mfc Block */ 501 + DIV(0, "dout_mfc_blk", "mout_user_aclk333", DIV4_RATIO, 0, 2), 502 + 817 503 /* PCM */ 818 504 DIV(0, "dout_pcm1", "dout_audio1", DIV_PERIC2, 16, 8), 819 505 DIV(0, "dout_pcm2", "dout_audio2", DIV_PERIC2, 24, 8), ··· 829 509 DIV(0, "dout_audio2", "mout_audio2", DIV_PERIC3, 28, 4), 830 510 831 511 /* SPI Pre-Ratio */ 832 - DIV(0, "dout_pre_spi0", "dout_spi0", DIV_PERIC4, 8, 8), 833 - DIV(0, "dout_pre_spi1", "dout_spi1", DIV_PERIC4, 16, 8), 834 - DIV(0, "dout_pre_spi2", "dout_spi2", DIV_PERIC4, 24, 8), 512 + DIV(0, "dout_spi0_pre", "dout_spi0", DIV_PERIC4, 8, 8), 513 + DIV(0, "dout_spi1_pre", "dout_spi1", DIV_PERIC4, 16, 8), 514 + DIV(0, "dout_spi2_pre", "dout_spi2", DIV_PERIC4, 24, 8), 515 + 516 + /* GSCL Block */ 517 + DIV(0, "dout_gscl_blk_300", "mout_user_aclk300_gscl", 518 + DIV2_RATIO0, 4, 2), 519 + DIV(0, "dout_gscl_blk_333", "aclk333_432_gscl", DIV2_RATIO0, 6, 2), 520 + 521 + /* MSCL Block */ 522 + DIV(0, "dout_mscl_blk", "aclk400_mscl", DIV2_RATIO0, 28, 2), 523 + 524 + /* PSGEN */ 525 + DIV(0, "dout_gen_blk", "mout_user_aclk266", DIV2_RATIO0, 8, 1), 526 + DIV(0, "dout_jpg_blk", "aclk166", DIV2_RATIO0, 20, 1), 527 + 528 + /* ISP Block */ 529 + DIV(0, "dout_isp_sensor0", "mout_isp_sensor", SCLK_DIV_ISP0, 8, 8), 530 + DIV(0, "dout_isp_sensor1", "mout_isp_sensor", SCLK_DIV_ISP0, 16, 8), 531 + DIV(0, "dout_isp_sensor2", "mout_isp_sensor", SCLK_DIV_ISP0, 24, 8), 532 + DIV(0, "dout_pwm_isp", "mout_pwm_isp", SCLK_DIV_ISP1, 28, 4), 533 + DIV(0, "dout_uart_isp", "mout_uart_isp", SCLK_DIV_ISP1, 24, 4), 534 + DIV(0, "dout_spi0_isp", "mout_spi0_isp", SCLK_DIV_ISP1, 16, 4), 535 + DIV(0, "dout_spi1_isp", "mout_spi1_isp", SCLK_DIV_ISP1, 20, 4), 536 + DIV_F(0, "dout_spi0_isp_pre", "dout_spi0_isp", SCLK_DIV_ISP1, 0, 8, 537 + CLK_SET_RATE_PARENT, 0), 538 + DIV_F(0, "dout_spi1_isp_pre", "dout_spi1_isp", SCLK_DIV_ISP1, 8, 8, 539 + CLK_SET_RATE_PARENT, 0), 835 540 }; 836 541 837 - static struct samsung_gate_clock exynos5420_gate_clks[] __initdata = { 838 - /* TODO: Re-verify the CG bits for all the gate clocks */ 839 - GATE_A(CLK_MCT, "pclk_st", "aclk66_psgen", GATE_BUS_PERIS1, 2, 0, 0, 840 - "mct"), 542 + static struct samsung_gate_clock exynos5x_gate_clks[] __initdata = { 543 + /* G2D */ 544 + GATE(CLK_MDMA0, "mdma0", "aclk266_g2d", GATE_IP_G2D, 1, 0, 0), 545 + GATE(CLK_SSS, "sss", "aclk266_g2d", GATE_IP_G2D, 2, 0, 0), 546 + GATE(CLK_G2D, "g2d", "aclk333_g2d", GATE_IP_G2D, 3, 0, 0), 547 + GATE(CLK_SMMU_MDMA0, "smmu_mdma0", "aclk266_g2d", GATE_IP_G2D, 5, 0, 0), 548 + GATE(CLK_SMMU_G2D, "smmu_g2d", "aclk333_g2d", GATE_IP_G2D, 7, 0, 0), 841 549 842 550 GATE(0, "aclk200_fsys", "mout_user_aclk200_fsys", 843 551 GATE_BUS_FSYS0, 9, CLK_IGNORE_UNUSED, 0), ··· 878 530 GATE_BUS_TOP, 1, CLK_IGNORE_UNUSED, 0), 879 531 GATE(0, "aclk300_jpeg", "mout_user_aclk300_jpeg", 880 532 GATE_BUS_TOP, 4, CLK_IGNORE_UNUSED, 0), 533 + GATE(0, "aclk333_432_isp0", "mout_user_aclk333_432_isp0", 534 + GATE_BUS_TOP, 5, 0, 0), 881 535 GATE(0, "aclk300_gscl", "mout_user_aclk300_gscl", 882 536 GATE_BUS_TOP, 6, CLK_IGNORE_UNUSED, 0), 883 537 GATE(0, "aclk333_432_gscl", "mout_user_aclk333_432_gscl", 884 538 GATE_BUS_TOP, 7, CLK_IGNORE_UNUSED, 0), 885 - GATE(0, "pclk66_gpio", "mout_sw_aclk66", 539 + GATE(0, "aclk333_432_isp", "mout_user_aclk333_432_isp", 540 + GATE_BUS_TOP, 8, 0, 0), 541 + GATE(CLK_PCLK66_GPIO, "pclk66_gpio", "mout_user_pclk66_gpio", 886 542 GATE_BUS_TOP, 9, CLK_IGNORE_UNUSED, 0), 887 - GATE(0, "aclk66_psgen", "mout_aclk66_psgen", 543 + GATE(0, "aclk66_psgen", "mout_user_aclk66_psgen", 888 544 GATE_BUS_TOP, 10, CLK_IGNORE_UNUSED, 0), 889 - GATE(0, "aclk66_peric", "mout_aclk66_peric", 890 - GATE_BUS_TOP, 11, 0, 0), 545 + GATE(CLK_ACLK66_PERIC, "aclk66_peric", "mout_user_aclk66_peric", 546 + GATE_BUS_TOP, 11, CLK_IGNORE_UNUSED, 0), 547 + GATE(0, "aclk266_isp", "mout_user_aclk266_isp", 548 + GATE_BUS_TOP, 13, 0, 0), 891 549 GATE(0, "aclk166", "mout_user_aclk166", 892 550 GATE_BUS_TOP, 14, CLK_IGNORE_UNUSED, 0), 893 551 GATE(0, "aclk333", "mout_aclk333", 894 552 GATE_BUS_TOP, 15, CLK_IGNORE_UNUSED, 0), 553 + GATE(0, "aclk400_isp", "mout_user_aclk400_isp", 554 + GATE_BUS_TOP, 16, 0, 0), 555 + GATE(0, "aclk400_mscl", "mout_user_aclk400_mscl", 556 + GATE_BUS_TOP, 17, 0, 0), 557 + GATE(0, "aclk200_disp1", "mout_user_aclk200_disp1", 558 + GATE_BUS_TOP, 18, 0, 0), 559 + GATE(CLK_SCLK_MPHY_IXTAL24, "sclk_mphy_ixtal24", "mphy_refclk_ixtal24", 560 + GATE_BUS_TOP, 28, 0, 0), 561 + GATE(CLK_SCLK_HSIC_12M, "sclk_hsic_12m", "ff_hsic_12m", 562 + GATE_BUS_TOP, 29, 0, 0), 563 + 564 + GATE(0, "aclk300_disp1", "mout_user_aclk300_disp1", 565 + SRC_MASK_TOP2, 24, 0, 0), 566 + 567 + GATE(CLK_MAU_EPLL, "mau_epll", "mout_mau_epll_clk", 568 + SRC_MASK_TOP7, 20, 0, 0), 895 569 896 570 /* sclk */ 897 571 GATE(CLK_SCLK_UART0, "sclk_uart0", "dout_uart0", ··· 924 554 GATE_TOP_SCLK_PERIC, 2, CLK_SET_RATE_PARENT, 0), 925 555 GATE(CLK_SCLK_UART3, "sclk_uart3", "dout_uart3", 926 556 GATE_TOP_SCLK_PERIC, 3, CLK_SET_RATE_PARENT, 0), 927 - GATE(CLK_SCLK_SPI0, "sclk_spi0", "dout_pre_spi0", 557 + GATE(CLK_SCLK_SPI0, "sclk_spi0", "dout_spi0_pre", 928 558 GATE_TOP_SCLK_PERIC, 6, CLK_SET_RATE_PARENT, 0), 929 - GATE(CLK_SCLK_SPI1, "sclk_spi1", "dout_pre_spi1", 559 + GATE(CLK_SCLK_SPI1, "sclk_spi1", "dout_spi1_pre", 930 560 GATE_TOP_SCLK_PERIC, 7, CLK_SET_RATE_PARENT, 0), 931 - GATE(CLK_SCLK_SPI2, "sclk_spi2", "dout_pre_spi2", 561 + GATE(CLK_SCLK_SPI2, "sclk_spi2", "dout_spi2_pre", 932 562 GATE_TOP_SCLK_PERIC, 8, CLK_SET_RATE_PARENT, 0), 933 563 GATE(CLK_SCLK_SPDIF, "sclk_spdif", "mout_spdif", 934 564 GATE_TOP_SCLK_PERIC, 9, CLK_SET_RATE_PARENT, 0), ··· 958 588 GATE(CLK_SCLK_USBD301, "sclk_usbd301", "dout_usbd301", 959 589 GATE_TOP_SCLK_FSYS, 10, CLK_SET_RATE_PARENT, 0), 960 590 961 - GATE(CLK_SCLK_USBD301, "sclk_unipro", "dout_unipro", 962 - SRC_MASK_FSYS, 24, CLK_SET_RATE_PARENT, 0), 963 - 964 - GATE(CLK_SCLK_GSCL_WA, "sclk_gscl_wa", "aclK333_432_gscl", 965 - GATE_TOP_SCLK_GSCL, 6, CLK_SET_RATE_PARENT, 0), 966 - GATE(CLK_SCLK_GSCL_WB, "sclk_gscl_wb", "aclk333_432_gscl", 967 - GATE_TOP_SCLK_GSCL, 7, CLK_SET_RATE_PARENT, 0), 968 - 969 591 /* Display */ 970 592 GATE(CLK_SCLK_FIMD1, "sclk_fimd1", "dout_fimd1", 971 - GATE_TOP_SCLK_DISP1, 0, CLK_SET_RATE_PARENT, 0), 593 + GATE_TOP_SCLK_DISP1, 0, CLK_SET_RATE_PARENT, 0), 972 594 GATE(CLK_SCLK_MIPI1, "sclk_mipi1", "dout_mipi1", 973 - GATE_TOP_SCLK_DISP1, 3, CLK_SET_RATE_PARENT, 0), 595 + GATE_TOP_SCLK_DISP1, 3, CLK_SET_RATE_PARENT, 0), 974 596 GATE(CLK_SCLK_HDMI, "sclk_hdmi", "mout_hdmi", 975 - GATE_TOP_SCLK_DISP1, 9, CLK_SET_RATE_PARENT, 0), 597 + GATE_TOP_SCLK_DISP1, 9, 0, 0), 976 598 GATE(CLK_SCLK_PIXEL, "sclk_pixel", "dout_hdmi_pixel", 977 - GATE_TOP_SCLK_DISP1, 10, CLK_SET_RATE_PARENT, 0), 599 + GATE_TOP_SCLK_DISP1, 10, CLK_SET_RATE_PARENT, 0), 978 600 GATE(CLK_SCLK_DP1, "sclk_dp1", "dout_dp1", 979 - GATE_TOP_SCLK_DISP1, 20, CLK_SET_RATE_PARENT, 0), 601 + GATE_TOP_SCLK_DISP1, 20, CLK_SET_RATE_PARENT, 0), 980 602 981 603 /* Maudio Block */ 982 604 GATE(CLK_SCLK_MAUDIO0, "sclk_maudio0", "dout_maudio0", 983 605 GATE_TOP_SCLK_MAU, 0, CLK_SET_RATE_PARENT, 0), 984 606 GATE(CLK_SCLK_MAUPCM0, "sclk_maupcm0", "dout_maupcm0", 985 607 GATE_TOP_SCLK_MAU, 1, CLK_SET_RATE_PARENT, 0), 986 - /* FSYS */ 608 + 609 + /* FSYS Block */ 987 610 GATE(CLK_TSI, "tsi", "aclk200_fsys", GATE_BUS_FSYS0, 0, 0, 0), 988 611 GATE(CLK_PDMA0, "pdma0", "aclk200_fsys", GATE_BUS_FSYS0, 1, 0, 0), 989 612 GATE(CLK_PDMA1, "pdma1", "aclk200_fsys", GATE_BUS_FSYS0, 2, 0, 0), 990 613 GATE(CLK_UFS, "ufs", "aclk200_fsys2", GATE_BUS_FSYS0, 3, 0, 0), 991 - GATE(CLK_RTIC, "rtic", "aclk200_fsys", GATE_BUS_FSYS0, 5, 0, 0), 992 - GATE(CLK_MMC0, "mmc0", "aclk200_fsys2", GATE_BUS_FSYS0, 12, 0, 0), 993 - GATE(CLK_MMC1, "mmc1", "aclk200_fsys2", GATE_BUS_FSYS0, 13, 0, 0), 994 - GATE(CLK_MMC2, "mmc2", "aclk200_fsys2", GATE_BUS_FSYS0, 14, 0, 0), 614 + GATE(CLK_RTIC, "rtic", "aclk200_fsys", GATE_IP_FSYS, 9, 0, 0), 615 + GATE(CLK_MMC0, "mmc0", "aclk200_fsys2", GATE_IP_FSYS, 12, 0, 0), 616 + GATE(CLK_MMC1, "mmc1", "aclk200_fsys2", GATE_IP_FSYS, 13, 0, 0), 617 + GATE(CLK_MMC2, "mmc2", "aclk200_fsys2", GATE_IP_FSYS, 14, 0, 0), 995 618 GATE(CLK_SROMC, "sromc", "aclk200_fsys2", 996 - GATE_BUS_FSYS0, 19, CLK_IGNORE_UNUSED, 0), 997 - GATE(CLK_USBH20, "usbh20", "aclk200_fsys", GATE_BUS_FSYS0, 20, 0, 0), 998 - GATE(CLK_USBD300, "usbd300", "aclk200_fsys", GATE_BUS_FSYS0, 21, 0, 0), 999 - GATE(CLK_USBD301, "usbd301", "aclk200_fsys", GATE_BUS_FSYS0, 28, 0, 0), 619 + GATE_IP_FSYS, 17, CLK_IGNORE_UNUSED, 0), 620 + GATE(CLK_USBH20, "usbh20", "aclk200_fsys", GATE_IP_FSYS, 18, 0, 0), 621 + GATE(CLK_USBD300, "usbd300", "aclk200_fsys", GATE_IP_FSYS, 19, 0, 0), 622 + GATE(CLK_USBD301, "usbd301", "aclk200_fsys", GATE_IP_FSYS, 20, 0, 0), 623 + GATE(CLK_SCLK_UNIPRO, "sclk_unipro", "dout_unipro", 624 + SRC_MASK_FSYS, 24, CLK_SET_RATE_PARENT, 0), 1000 625 1001 - /* UART */ 1002 - GATE(CLK_UART0, "uart0", "aclk66_peric", GATE_BUS_PERIC, 4, 0, 0), 1003 - GATE(CLK_UART1, "uart1", "aclk66_peric", GATE_BUS_PERIC, 5, 0, 0), 1004 - GATE_A(CLK_UART2, "uart2", "aclk66_peric", 1005 - GATE_BUS_PERIC, 6, CLK_IGNORE_UNUSED, 0, "uart2"), 1006 - GATE(CLK_UART3, "uart3", "aclk66_peric", GATE_BUS_PERIC, 7, 0, 0), 1007 - /* I2C */ 1008 - GATE(CLK_I2C0, "i2c0", "aclk66_peric", GATE_BUS_PERIC, 9, 0, 0), 1009 - GATE(CLK_I2C1, "i2c1", "aclk66_peric", GATE_BUS_PERIC, 10, 0, 0), 1010 - GATE(CLK_I2C2, "i2c2", "aclk66_peric", GATE_BUS_PERIC, 11, 0, 0), 1011 - GATE(CLK_I2C3, "i2c3", "aclk66_peric", GATE_BUS_PERIC, 12, 0, 0), 1012 - GATE(CLK_I2C4, "i2c4", "aclk66_peric", GATE_BUS_PERIC, 13, 0, 0), 1013 - GATE(CLK_I2C5, "i2c5", "aclk66_peric", GATE_BUS_PERIC, 14, 0, 0), 1014 - GATE(CLK_I2C6, "i2c6", "aclk66_peric", GATE_BUS_PERIC, 15, 0, 0), 1015 - GATE(CLK_I2C7, "i2c7", "aclk66_peric", GATE_BUS_PERIC, 16, 0, 0), 1016 - GATE(CLK_I2C_HDMI, "i2c_hdmi", "aclk66_peric", GATE_BUS_PERIC, 17, 0, 1017 - 0), 1018 - GATE(CLK_TSADC, "tsadc", "aclk66_peric", GATE_BUS_PERIC, 18, 0, 0), 1019 - /* SPI */ 1020 - GATE(CLK_SPI0, "spi0", "aclk66_peric", GATE_BUS_PERIC, 19, 0, 0), 1021 - GATE(CLK_SPI1, "spi1", "aclk66_peric", GATE_BUS_PERIC, 20, 0, 0), 1022 - GATE(CLK_SPI2, "spi2", "aclk66_peric", GATE_BUS_PERIC, 21, 0, 0), 626 + /* PERIC Block */ 627 + GATE(CLK_UART0, "uart0", "aclk66_peric", GATE_IP_PERIC, 0, 0, 0), 628 + GATE(CLK_UART1, "uart1", "aclk66_peric", GATE_IP_PERIC, 1, 0, 0), 629 + GATE(CLK_UART2, "uart2", "aclk66_peric", GATE_IP_PERIC, 2, 0, 0), 630 + GATE(CLK_UART3, "uart3", "aclk66_peric", GATE_IP_PERIC, 3, 0, 0), 631 + GATE(CLK_I2C0, "i2c0", "aclk66_peric", GATE_IP_PERIC, 6, 0, 0), 632 + GATE(CLK_I2C1, "i2c1", "aclk66_peric", GATE_IP_PERIC, 7, 0, 0), 633 + GATE(CLK_I2C2, "i2c2", "aclk66_peric", GATE_IP_PERIC, 8, 0, 0), 634 + GATE(CLK_I2C3, "i2c3", "aclk66_peric", GATE_IP_PERIC, 9, 0, 0), 635 + GATE(CLK_USI0, "usi0", "aclk66_peric", GATE_IP_PERIC, 10, 0, 0), 636 + GATE(CLK_USI1, "usi1", "aclk66_peric", GATE_IP_PERIC, 11, 0, 0), 637 + GATE(CLK_USI2, "usi2", "aclk66_peric", GATE_IP_PERIC, 12, 0, 0), 638 + GATE(CLK_USI3, "usi3", "aclk66_peric", GATE_IP_PERIC, 13, 0, 0), 639 + GATE(CLK_I2C_HDMI, "i2c_hdmi", "aclk66_peric", GATE_IP_PERIC, 14, 0, 0), 640 + GATE(CLK_TSADC, "tsadc", "aclk66_peric", GATE_IP_PERIC, 15, 0, 0), 641 + GATE(CLK_SPI0, "spi0", "aclk66_peric", GATE_IP_PERIC, 16, 0, 0), 642 + GATE(CLK_SPI1, "spi1", "aclk66_peric", GATE_IP_PERIC, 17, 0, 0), 643 + GATE(CLK_SPI2, "spi2", "aclk66_peric", GATE_IP_PERIC, 18, 0, 0), 644 + GATE(CLK_I2S1, "i2s1", "aclk66_peric", GATE_IP_PERIC, 20, 0, 0), 645 + GATE(CLK_I2S2, "i2s2", "aclk66_peric", GATE_IP_PERIC, 21, 0, 0), 646 + GATE(CLK_PCM1, "pcm1", "aclk66_peric", GATE_IP_PERIC, 22, 0, 0), 647 + GATE(CLK_PCM2, "pcm2", "aclk66_peric", GATE_IP_PERIC, 23, 0, 0), 648 + GATE(CLK_PWM, "pwm", "aclk66_peric", GATE_IP_PERIC, 24, 0, 0), 649 + GATE(CLK_SPDIF, "spdif", "aclk66_peric", GATE_IP_PERIC, 26, 0, 0), 650 + GATE(CLK_USI4, "usi4", "aclk66_peric", GATE_IP_PERIC, 28, 0, 0), 651 + GATE(CLK_USI5, "usi5", "aclk66_peric", GATE_IP_PERIC, 30, 0, 0), 652 + GATE(CLK_USI6, "usi6", "aclk66_peric", GATE_IP_PERIC, 31, 0, 0), 653 + 1023 654 GATE(CLK_KEYIF, "keyif", "aclk66_peric", GATE_BUS_PERIC, 22, 0, 0), 1024 - /* I2S */ 1025 - GATE(CLK_I2S1, "i2s1", "aclk66_peric", GATE_BUS_PERIC, 23, 0, 0), 1026 - GATE(CLK_I2S2, "i2s2", "aclk66_peric", GATE_BUS_PERIC, 24, 0, 0), 1027 - /* PCM */ 1028 - GATE(CLK_PCM1, "pcm1", "aclk66_peric", GATE_BUS_PERIC, 25, 0, 0), 1029 - GATE(CLK_PCM2, "pcm2", "aclk66_peric", GATE_BUS_PERIC, 26, 0, 0), 1030 - /* PWM */ 1031 - GATE(CLK_PWM, "pwm", "aclk66_peric", GATE_BUS_PERIC, 27, 0, 0), 1032 - /* SPDIF */ 1033 - GATE(CLK_SPDIF, "spdif", "aclk66_peric", GATE_BUS_PERIC, 29, 0, 0), 1034 655 1035 - GATE(CLK_I2C8, "i2c8", "aclk66_peric", GATE_BUS_PERIC1, 0, 0, 0), 1036 - GATE(CLK_I2C9, "i2c9", "aclk66_peric", GATE_BUS_PERIC1, 1, 0, 0), 1037 - GATE(CLK_I2C10, "i2c10", "aclk66_peric", GATE_BUS_PERIC1, 2, 0, 0), 1038 - 656 + /* PERIS Block */ 1039 657 GATE(CLK_CHIPID, "chipid", "aclk66_psgen", 1040 - GATE_BUS_PERIS0, 12, CLK_IGNORE_UNUSED, 0), 658 + GATE_IP_PERIS, 0, CLK_IGNORE_UNUSED, 0), 1041 659 GATE(CLK_SYSREG, "sysreg", "aclk66_psgen", 1042 - GATE_BUS_PERIS0, 13, CLK_IGNORE_UNUSED, 0), 1043 - GATE(CLK_TZPC0, "tzpc0", "aclk66_psgen", GATE_BUS_PERIS0, 18, 0, 0), 1044 - GATE(CLK_TZPC1, "tzpc1", "aclk66_psgen", GATE_BUS_PERIS0, 19, 0, 0), 1045 - GATE(CLK_TZPC2, "tzpc2", "aclk66_psgen", GATE_BUS_PERIS0, 20, 0, 0), 1046 - GATE(CLK_TZPC3, "tzpc3", "aclk66_psgen", GATE_BUS_PERIS0, 21, 0, 0), 1047 - GATE(CLK_TZPC4, "tzpc4", "aclk66_psgen", GATE_BUS_PERIS0, 22, 0, 0), 1048 - GATE(CLK_TZPC5, "tzpc5", "aclk66_psgen", GATE_BUS_PERIS0, 23, 0, 0), 1049 - GATE(CLK_TZPC6, "tzpc6", "aclk66_psgen", GATE_BUS_PERIS0, 24, 0, 0), 1050 - GATE(CLK_TZPC7, "tzpc7", "aclk66_psgen", GATE_BUS_PERIS0, 25, 0, 0), 1051 - GATE(CLK_TZPC8, "tzpc8", "aclk66_psgen", GATE_BUS_PERIS0, 26, 0, 0), 1052 - GATE(CLK_TZPC9, "tzpc9", "aclk66_psgen", GATE_BUS_PERIS0, 27, 0, 0), 660 + GATE_IP_PERIS, 1, CLK_IGNORE_UNUSED, 0), 661 + GATE(CLK_TZPC0, "tzpc0", "aclk66_psgen", GATE_IP_PERIS, 6, 0, 0), 662 + GATE(CLK_TZPC1, "tzpc1", "aclk66_psgen", GATE_IP_PERIS, 7, 0, 0), 663 + GATE(CLK_TZPC2, "tzpc2", "aclk66_psgen", GATE_IP_PERIS, 8, 0, 0), 664 + GATE(CLK_TZPC3, "tzpc3", "aclk66_psgen", GATE_IP_PERIS, 9, 0, 0), 665 + GATE(CLK_TZPC4, "tzpc4", "aclk66_psgen", GATE_IP_PERIS, 10, 0, 0), 666 + GATE(CLK_TZPC5, "tzpc5", "aclk66_psgen", GATE_IP_PERIS, 11, 0, 0), 667 + GATE(CLK_TZPC6, "tzpc6", "aclk66_psgen", GATE_IP_PERIS, 12, 0, 0), 668 + GATE(CLK_TZPC7, "tzpc7", "aclk66_psgen", GATE_IP_PERIS, 13, 0, 0), 669 + GATE(CLK_TZPC8, "tzpc8", "aclk66_psgen", GATE_IP_PERIS, 14, 0, 0), 670 + GATE(CLK_TZPC9, "tzpc9", "aclk66_psgen", GATE_IP_PERIS, 15, 0, 0), 671 + GATE(CLK_HDMI_CEC, "hdmi_cec", "aclk66_psgen", GATE_IP_PERIS, 16, 0, 0), 672 + GATE(CLK_MCT, "mct", "aclk66_psgen", GATE_IP_PERIS, 18, 0, 0), 673 + GATE(CLK_WDT, "wdt", "aclk66_psgen", GATE_IP_PERIS, 19, 0, 0), 674 + GATE(CLK_RTC, "rtc", "aclk66_psgen", GATE_IP_PERIS, 20, 0, 0), 675 + GATE(CLK_TMU, "tmu", "aclk66_psgen", GATE_IP_PERIS, 21, 0, 0), 676 + GATE(CLK_TMU_GPU, "tmu_gpu", "aclk66_psgen", GATE_IP_PERIS, 22, 0, 0), 1053 677 1054 - GATE(CLK_HDMI_CEC, "hdmi_cec", "aclk66_psgen", GATE_BUS_PERIS1, 0, 0, 1055 - 0), 1056 678 GATE(CLK_SECKEY, "seckey", "aclk66_psgen", GATE_BUS_PERIS1, 1, 0, 0), 1057 - GATE(CLK_WDT, "wdt", "aclk66_psgen", GATE_BUS_PERIS1, 3, 0, 0), 1058 - GATE(CLK_RTC, "rtc", "aclk66_psgen", GATE_BUS_PERIS1, 4, 0, 0), 1059 - GATE(CLK_TMU, "tmu", "aclk66_psgen", GATE_BUS_PERIS1, 5, 0, 0), 1060 - GATE(CLK_TMU_GPU, "tmu_gpu", "aclk66_psgen", GATE_BUS_PERIS1, 6, 0, 0), 679 + 680 + /* GEN Block */ 681 + GATE(CLK_ROTATOR, "rotator", "mout_user_aclk266", GATE_IP_GEN, 1, 0, 0), 682 + GATE(CLK_JPEG, "jpeg", "aclk300_jpeg", GATE_IP_GEN, 2, 0, 0), 683 + GATE(CLK_JPEG2, "jpeg2", "aclk300_jpeg", GATE_IP_GEN, 3, 0, 0), 684 + GATE(CLK_MDMA1, "mdma1", "mout_user_aclk266", GATE_IP_GEN, 4, 0, 0), 685 + GATE(CLK_TOP_RTC, "top_rtc", "aclk66_psgen", GATE_IP_GEN, 5, 0, 0), 686 + GATE(CLK_SMMU_ROTATOR, "smmu_rotator", "dout_gen_blk", 687 + GATE_IP_GEN, 6, 0, 0), 688 + GATE(CLK_SMMU_JPEG, "smmu_jpeg", "dout_jpg_blk", GATE_IP_GEN, 7, 0, 0), 689 + GATE(CLK_SMMU_MDMA1, "smmu_mdma1", "dout_gen_blk", 690 + GATE_IP_GEN, 9, 0, 0), 691 + 692 + /* GATE_IP_GEN doesn't list gates for smmu_jpeg2 and mc */ 693 + GATE(CLK_SMMU_JPEG2, "smmu_jpeg2", "dout_jpg_blk", 694 + GATE_BUS_GEN, 28, 0, 0), 695 + GATE(CLK_MC, "mc", "aclk66_psgen", GATE_BUS_GEN, 12, 0, 0), 696 + 697 + /* GSCL Block */ 698 + GATE(CLK_SCLK_GSCL_WA, "sclk_gscl_wa", "mout_user_aclk333_432_gscl", 699 + GATE_TOP_SCLK_GSCL, 6, 0, 0), 700 + GATE(CLK_SCLK_GSCL_WB, "sclk_gscl_wb", "mout_user_aclk333_432_gscl", 701 + GATE_TOP_SCLK_GSCL, 7, 0, 0), 1061 702 1062 703 GATE(CLK_GSCL0, "gscl0", "aclk300_gscl", GATE_IP_GSCL0, 0, 0, 0), 1063 704 GATE(CLK_GSCL1, "gscl1", "aclk300_gscl", GATE_IP_GSCL0, 1, 0, 0), 1064 - GATE(CLK_CLK_3AA, "clk_3aa", "aclk300_gscl", GATE_IP_GSCL0, 4, 0, 0), 705 + GATE(CLK_FIMC_3AA, "fimc_3aa", "aclk333_432_gscl", 706 + GATE_IP_GSCL0, 4, 0, 0), 707 + GATE(CLK_FIMC_LITE0, "fimc_lite0", "aclk333_432_gscl", 708 + GATE_IP_GSCL0, 5, 0, 0), 709 + GATE(CLK_FIMC_LITE1, "fimc_lite1", "aclk333_432_gscl", 710 + GATE_IP_GSCL0, 6, 0, 0), 1065 711 1066 - GATE(CLK_SMMU_3AA, "smmu_3aa", "aclk333_432_gscl", GATE_IP_GSCL1, 2, 0, 1067 - 0), 1068 - GATE(CLK_SMMU_FIMCL0, "smmu_fimcl0", "aclk333_432_gscl", 712 + GATE(CLK_SMMU_3AA, "smmu_3aa", "dout_gscl_blk_333", 713 + GATE_IP_GSCL1, 2, 0, 0), 714 + GATE(CLK_SMMU_FIMCL0, "smmu_fimcl0", "dout_gscl_blk_333", 1069 715 GATE_IP_GSCL1, 3, 0, 0), 1070 - GATE(CLK_SMMU_FIMCL1, "smmu_fimcl1", "aclk333_432_gscl", 716 + GATE(CLK_SMMU_FIMCL1, "smmu_fimcl1", "dout_gscl_blk_333", 1071 717 GATE_IP_GSCL1, 4, 0, 0), 1072 - GATE(CLK_SMMU_GSCL0, "smmu_gscl0", "aclk300_gscl", GATE_IP_GSCL1, 6, 0, 1073 - 0), 1074 - GATE(CLK_SMMU_GSCL1, "smmu_gscl1", "aclk300_gscl", GATE_IP_GSCL1, 7, 0, 1075 - 0), 1076 - GATE(CLK_GSCL_WA, "gscl_wa", "aclk300_gscl", GATE_IP_GSCL1, 12, 0, 0), 1077 - GATE(CLK_GSCL_WB, "gscl_wb", "aclk300_gscl", GATE_IP_GSCL1, 13, 0, 0), 1078 - GATE(CLK_SMMU_FIMCL3, "smmu_fimcl3,", "aclk333_432_gscl", 718 + GATE(CLK_SMMU_GSCL0, "smmu_gscl0", "dout_gscl_blk_300", 719 + GATE_IP_GSCL1, 6, 0, 0), 720 + GATE(CLK_SMMU_GSCL1, "smmu_gscl1", "dout_gscl_blk_300", 721 + GATE_IP_GSCL1, 7, 0, 0), 722 + GATE(CLK_GSCL_WA, "gscl_wa", "sclk_gscl_wa", GATE_IP_GSCL1, 12, 0, 0), 723 + GATE(CLK_GSCL_WB, "gscl_wb", "sclk_gscl_wb", GATE_IP_GSCL1, 13, 0, 0), 724 + GATE(CLK_SMMU_FIMCL3, "smmu_fimcl3,", "dout_gscl_blk_333", 1079 725 GATE_IP_GSCL1, 16, 0, 0), 1080 726 GATE(CLK_FIMC_LITE3, "fimc_lite3", "aclk333_432_gscl", 1081 727 GATE_IP_GSCL1, 17, 0, 0), 1082 728 1083 - GATE(CLK_FIMD1, "fimd1", "aclk300_disp1", GATE_IP_DISP1, 0, 0, 0), 1084 - GATE(CLK_DSIM1, "dsim1", "aclk200_disp1", GATE_IP_DISP1, 3, 0, 0), 1085 - GATE(CLK_DP1, "dp1", "aclk200_disp1", GATE_IP_DISP1, 4, 0, 0), 1086 - GATE(CLK_MIXER, "mixer", "aclk166", GATE_IP_DISP1, 5, 0, 0), 1087 - GATE(CLK_HDMI, "hdmi", "aclk200_disp1", GATE_IP_DISP1, 6, 0, 0), 1088 - GATE(CLK_SMMU_FIMD1, "smmu_fimd1", "aclk300_disp1", GATE_IP_DISP1, 8, 0, 1089 - 0), 1090 - 1091 - GATE(CLK_MFC, "mfc", "aclk333", GATE_IP_MFC, 0, 0, 0), 1092 - GATE(CLK_SMMU_MFCL, "smmu_mfcl", "aclk333", GATE_IP_MFC, 1, 0, 0), 1093 - GATE(CLK_SMMU_MFCR, "smmu_mfcr", "aclk333", GATE_IP_MFC, 2, 0, 0), 1094 - 1095 - GATE(CLK_G3D, "g3d", "aclkg3d", GATE_IP_G3D, 9, 0, 0), 1096 - 1097 - GATE(CLK_ROTATOR, "rotator", "aclk266", GATE_IP_GEN, 1, 0, 0), 1098 - GATE(CLK_JPEG, "jpeg", "aclk300_jpeg", GATE_IP_GEN, 2, 0, 0), 1099 - GATE(CLK_JPEG2, "jpeg2", "aclk300_jpeg", GATE_IP_GEN, 3, 0, 0), 1100 - GATE(CLK_MDMA1, "mdma1", "aclk266", GATE_IP_GEN, 4, 0, 0), 1101 - GATE(CLK_SMMU_ROTATOR, "smmu_rotator", "aclk266", GATE_IP_GEN, 6, 0, 0), 1102 - GATE(CLK_SMMU_JPEG, "smmu_jpeg", "aclk300_jpeg", GATE_IP_GEN, 7, 0, 0), 1103 - GATE(CLK_SMMU_MDMA1, "smmu_mdma1", "aclk266", GATE_IP_GEN, 9, 0, 0), 1104 - 729 + /* MSCL Block */ 1105 730 GATE(CLK_MSCL0, "mscl0", "aclk400_mscl", GATE_IP_MSCL, 0, 0, 0), 1106 731 GATE(CLK_MSCL1, "mscl1", "aclk400_mscl", GATE_IP_MSCL, 1, 0, 0), 1107 732 GATE(CLK_MSCL2, "mscl2", "aclk400_mscl", GATE_IP_MSCL, 2, 0, 0), 1108 - GATE(CLK_SMMU_MSCL0, "smmu_mscl0", "aclk400_mscl", GATE_IP_MSCL, 8, 0, 1109 - 0), 1110 - GATE(CLK_SMMU_MSCL1, "smmu_mscl1", "aclk400_mscl", GATE_IP_MSCL, 9, 0, 1111 - 0), 1112 - GATE(CLK_SMMU_MSCL2, "smmu_mscl2", "aclk400_mscl", GATE_IP_MSCL, 10, 0, 1113 - 0), 1114 - GATE(CLK_SMMU_MIXER, "smmu_mixer", "aclk200_disp1", GATE_IP_DISP1, 9, 0, 1115 - 0), 733 + GATE(CLK_SMMU_MSCL0, "smmu_mscl0", "dout_mscl_blk", 734 + GATE_IP_MSCL, 8, 0, 0), 735 + GATE(CLK_SMMU_MSCL1, "smmu_mscl1", "dout_mscl_blk", 736 + GATE_IP_MSCL, 9, 0, 0), 737 + GATE(CLK_SMMU_MSCL2, "smmu_mscl2", "dout_mscl_blk", 738 + GATE_IP_MSCL, 10, 0, 0), 739 + 740 + GATE(CLK_FIMD1, "fimd1", "aclk300_disp1", GATE_IP_DISP1, 0, 0, 0), 741 + GATE(CLK_DSIM1, "dsim1", "aclk200_disp1", GATE_IP_DISP1, 3, 0, 0), 742 + GATE(CLK_DP1, "dp1", "aclk200_disp1", GATE_IP_DISP1, 4, 0, 0), 743 + GATE(CLK_MIXER, "mixer", "aclk200_disp1", GATE_IP_DISP1, 5, 0, 0), 744 + GATE(CLK_HDMI, "hdmi", "aclk200_disp1", GATE_IP_DISP1, 6, 0, 0), 745 + GATE(CLK_SMMU_FIMD1M0, "smmu_fimd1m0", "dout_disp1_blk", 746 + GATE_IP_DISP1, 7, 0, 0), 747 + GATE(CLK_SMMU_FIMD1M1, "smmu_fimd1m1", "dout_disp1_blk", 748 + GATE_IP_DISP1, 8, 0, 0), 749 + GATE(CLK_SMMU_MIXER, "smmu_mixer", "aclk200_disp1", 750 + GATE_IP_DISP1, 9, 0, 0), 751 + 752 + /* ISP */ 753 + GATE(CLK_SCLK_UART_ISP, "sclk_uart_isp", "dout_uart_isp", 754 + GATE_TOP_SCLK_ISP, 0, CLK_SET_RATE_PARENT, 0), 755 + GATE(CLK_SCLK_SPI0_ISP, "sclk_spi0_isp", "dout_spi0_isp_pre", 756 + GATE_TOP_SCLK_ISP, 1, CLK_SET_RATE_PARENT, 0), 757 + GATE(CLK_SCLK_SPI1_ISP, "sclk_spi1_isp", "dout_spi1_isp_pre", 758 + GATE_TOP_SCLK_ISP, 2, CLK_SET_RATE_PARENT, 0), 759 + GATE(CLK_SCLK_PWM_ISP, "sclk_pwm_isp", "dout_pwm_isp", 760 + GATE_TOP_SCLK_ISP, 3, CLK_SET_RATE_PARENT, 0), 761 + GATE(CLK_SCLK_ISP_SENSOR0, "sclk_isp_sensor0", "dout_isp_sensor0", 762 + GATE_TOP_SCLK_ISP, 4, CLK_SET_RATE_PARENT, 0), 763 + GATE(CLK_SCLK_ISP_SENSOR1, "sclk_isp_sensor1", "dout_isp_sensor1", 764 + GATE_TOP_SCLK_ISP, 8, CLK_SET_RATE_PARENT, 0), 765 + GATE(CLK_SCLK_ISP_SENSOR2, "sclk_isp_sensor2", "dout_isp_sensor2", 766 + GATE_TOP_SCLK_ISP, 12, CLK_SET_RATE_PARENT, 0), 767 + 768 + GATE(CLK_MFC, "mfc", "aclk333", GATE_IP_MFC, 0, 0, 0), 769 + GATE(CLK_SMMU_MFCL, "smmu_mfcl", "dout_mfc_blk", GATE_IP_MFC, 1, 0, 0), 770 + GATE(CLK_SMMU_MFCR, "smmu_mfcr", "dout_mfc_blk", GATE_IP_MFC, 2, 0, 0), 771 + 772 + GATE(CLK_G3D, "g3d", "mout_user_aclk_g3d", GATE_IP_G3D, 9, 0, 0), 1116 773 }; 1117 774 1118 - static struct samsung_pll_clock exynos5420_plls[nr_plls] __initdata = { 775 + static struct samsung_pll_clock exynos5x_plls[nr_plls] __initdata = { 1119 776 [apll] = PLL(pll_2550, CLK_FOUT_APLL, "fout_apll", "fin_pll", APLL_LOCK, 1120 777 APLL_CON0, NULL), 1121 778 [cpll] = PLL(pll_2550, CLK_FOUT_CPLL, "fout_cpll", "fin_pll", CPLL_LOCK, ··· 1173 776 }; 1174 777 1175 778 /* register exynos5420 clocks */ 1176 - static void __init exynos5420_clk_init(struct device_node *np) 779 + static void __init exynos5x_clk_init(struct device_node *np, 780 + enum exynos5x_soc soc) 1177 781 { 782 + struct samsung_clk_provider *ctx; 783 + 1178 784 if (np) { 1179 785 reg_base = of_iomap(np, 0); 1180 786 if (!reg_base) ··· 1186 786 panic("%s: unable to determine soc\n", __func__); 1187 787 } 1188 788 1189 - samsung_clk_init(np, reg_base, CLK_NR_CLKS); 1190 - samsung_clk_of_register_fixed_ext(exynos5420_fixed_rate_ext_clks, 1191 - ARRAY_SIZE(exynos5420_fixed_rate_ext_clks), 789 + exynos5x_soc = soc; 790 + 791 + ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS); 792 + if (!ctx) 793 + panic("%s: unable to allocate context.\n", __func__); 794 + 795 + samsung_clk_of_register_fixed_ext(ctx, exynos5x_fixed_rate_ext_clks, 796 + ARRAY_SIZE(exynos5x_fixed_rate_ext_clks), 1192 797 ext_clk_match); 1193 - samsung_clk_register_pll(exynos5420_plls, ARRAY_SIZE(exynos5420_plls), 798 + samsung_clk_register_pll(ctx, exynos5x_plls, ARRAY_SIZE(exynos5x_plls), 1194 799 reg_base); 1195 - samsung_clk_register_fixed_rate(exynos5420_fixed_rate_clks, 1196 - ARRAY_SIZE(exynos5420_fixed_rate_clks)); 1197 - samsung_clk_register_fixed_factor(exynos5420_fixed_factor_clks, 1198 - ARRAY_SIZE(exynos5420_fixed_factor_clks)); 1199 - samsung_clk_register_mux(exynos5420_mux_clks, 1200 - ARRAY_SIZE(exynos5420_mux_clks)); 1201 - samsung_clk_register_div(exynos5420_div_clks, 1202 - ARRAY_SIZE(exynos5420_div_clks)); 1203 - samsung_clk_register_gate(exynos5420_gate_clks, 1204 - ARRAY_SIZE(exynos5420_gate_clks)); 800 + samsung_clk_register_fixed_rate(ctx, exynos5x_fixed_rate_clks, 801 + ARRAY_SIZE(exynos5x_fixed_rate_clks)); 802 + samsung_clk_register_fixed_factor(ctx, exynos5x_fixed_factor_clks, 803 + ARRAY_SIZE(exynos5x_fixed_factor_clks)); 804 + samsung_clk_register_mux(ctx, exynos5x_mux_clks, 805 + ARRAY_SIZE(exynos5x_mux_clks)); 806 + samsung_clk_register_div(ctx, exynos5x_div_clks, 807 + ARRAY_SIZE(exynos5x_div_clks)); 808 + samsung_clk_register_gate(ctx, exynos5x_gate_clks, 809 + ARRAY_SIZE(exynos5x_gate_clks)); 810 + 811 + if (soc == EXYNOS5420) { 812 + samsung_clk_register_mux(ctx, exynos5420_mux_clks, 813 + ARRAY_SIZE(exynos5420_mux_clks)); 814 + samsung_clk_register_div(ctx, exynos5420_div_clks, 815 + ARRAY_SIZE(exynos5420_div_clks)); 816 + } else { 817 + samsung_clk_register_fixed_factor( 818 + ctx, exynos5800_fixed_factor_clks, 819 + ARRAY_SIZE(exynos5800_fixed_factor_clks)); 820 + samsung_clk_register_mux(ctx, exynos5800_mux_clks, 821 + ARRAY_SIZE(exynos5800_mux_clks)); 822 + samsung_clk_register_div(ctx, exynos5800_div_clks, 823 + ARRAY_SIZE(exynos5800_div_clks)); 824 + samsung_clk_register_gate(ctx, exynos5800_gate_clks, 825 + ARRAY_SIZE(exynos5800_gate_clks)); 826 + } 1205 827 1206 828 exynos5420_clk_sleep_init(); 1207 829 } 830 + 831 + static void __init exynos5420_clk_init(struct device_node *np) 832 + { 833 + exynos5x_clk_init(np, EXYNOS5420); 834 + } 1208 835 CLK_OF_DECLARE(exynos5420_clk, "samsung,exynos5420-clock", exynos5420_clk_init); 836 + 837 + static void __init exynos5800_clk_init(struct device_node *np) 838 + { 839 + exynos5x_clk_init(np, EXYNOS5800); 840 + } 841 + CLK_OF_DECLARE(exynos5800_clk, "samsung,exynos5800-clock", exynos5800_clk_init);
+11 -7
drivers/clk/samsung/clk-exynos5440.c
··· 93 93 static void __init exynos5440_clk_init(struct device_node *np) 94 94 { 95 95 void __iomem *reg_base; 96 + struct samsung_clk_provider *ctx; 96 97 97 98 reg_base = of_iomap(np, 0); 98 99 if (!reg_base) { ··· 102 101 return; 103 102 } 104 103 105 - samsung_clk_init(np, reg_base, CLK_NR_CLKS); 106 - samsung_clk_of_register_fixed_ext(exynos5440_fixed_rate_ext_clks, 104 + ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS); 105 + if (!ctx) 106 + panic("%s: unable to allocate context.\n", __func__); 107 + 108 + samsung_clk_of_register_fixed_ext(ctx, exynos5440_fixed_rate_ext_clks, 107 109 ARRAY_SIZE(exynos5440_fixed_rate_ext_clks), ext_clk_match); 108 110 109 111 samsung_clk_register_pll2550x("cplla", "xtal", reg_base + 0x1c, 0x10); 110 112 samsung_clk_register_pll2550x("cpllb", "xtal", reg_base + 0x20, 0x10); 111 113 112 - samsung_clk_register_fixed_rate(exynos5440_fixed_rate_clks, 114 + samsung_clk_register_fixed_rate(ctx, exynos5440_fixed_rate_clks, 113 115 ARRAY_SIZE(exynos5440_fixed_rate_clks)); 114 - samsung_clk_register_fixed_factor(exynos5440_fixed_factor_clks, 116 + samsung_clk_register_fixed_factor(ctx, exynos5440_fixed_factor_clks, 115 117 ARRAY_SIZE(exynos5440_fixed_factor_clks)); 116 - samsung_clk_register_mux(exynos5440_mux_clks, 118 + samsung_clk_register_mux(ctx, exynos5440_mux_clks, 117 119 ARRAY_SIZE(exynos5440_mux_clks)); 118 - samsung_clk_register_div(exynos5440_div_clks, 120 + samsung_clk_register_div(ctx, exynos5440_div_clks, 119 121 ARRAY_SIZE(exynos5440_div_clks)); 120 - samsung_clk_register_gate(exynos5440_gate_clks, 122 + samsung_clk_register_gate(ctx, exynos5440_gate_clks, 121 123 ARRAY_SIZE(exynos5440_gate_clks)); 122 124 123 125 pr_info("Exynos5440: arm_clk = %ldHz\n", _get_rate("arm_clk"));
+481 -8
drivers/clk/samsung/clk-pll.c
··· 11 11 12 12 #include <linux/errno.h> 13 13 #include <linux/hrtimer.h> 14 + #include <linux/delay.h> 14 15 #include "clk.h" 15 16 #include "clk-pll.h" 16 17 ··· 58 57 /* return minimum supported value */ 59 58 return rate_table[i - 1].rate; 60 59 } 60 + 61 + /* 62 + * PLL2126 Clock Type 63 + */ 64 + 65 + #define PLL2126_MDIV_MASK (0xff) 66 + #define PLL2126_PDIV_MASK (0x3f) 67 + #define PLL2126_SDIV_MASK (0x3) 68 + #define PLL2126_MDIV_SHIFT (16) 69 + #define PLL2126_PDIV_SHIFT (8) 70 + #define PLL2126_SDIV_SHIFT (0) 71 + 72 + static unsigned long samsung_pll2126_recalc_rate(struct clk_hw *hw, 73 + unsigned long parent_rate) 74 + { 75 + struct samsung_clk_pll *pll = to_clk_pll(hw); 76 + u32 pll_con, mdiv, pdiv, sdiv; 77 + u64 fvco = parent_rate; 78 + 79 + pll_con = __raw_readl(pll->con_reg); 80 + mdiv = (pll_con >> PLL2126_MDIV_SHIFT) & PLL2126_MDIV_MASK; 81 + pdiv = (pll_con >> PLL2126_PDIV_SHIFT) & PLL2126_PDIV_MASK; 82 + sdiv = (pll_con >> PLL2126_SDIV_SHIFT) & PLL2126_SDIV_MASK; 83 + 84 + fvco *= (mdiv + 8); 85 + do_div(fvco, (pdiv + 2) << sdiv); 86 + 87 + return (unsigned long)fvco; 88 + } 89 + 90 + static const struct clk_ops samsung_pll2126_clk_ops = { 91 + .recalc_rate = samsung_pll2126_recalc_rate, 92 + }; 93 + 94 + /* 95 + * PLL3000 Clock Type 96 + */ 97 + 98 + #define PLL3000_MDIV_MASK (0xff) 99 + #define PLL3000_PDIV_MASK (0x3) 100 + #define PLL3000_SDIV_MASK (0x3) 101 + #define PLL3000_MDIV_SHIFT (16) 102 + #define PLL3000_PDIV_SHIFT (8) 103 + #define PLL3000_SDIV_SHIFT (0) 104 + 105 + static unsigned long samsung_pll3000_recalc_rate(struct clk_hw *hw, 106 + unsigned long parent_rate) 107 + { 108 + struct samsung_clk_pll *pll = to_clk_pll(hw); 109 + u32 pll_con, mdiv, pdiv, sdiv; 110 + u64 fvco = parent_rate; 111 + 112 + pll_con = __raw_readl(pll->con_reg); 113 + mdiv = (pll_con >> PLL3000_MDIV_SHIFT) & PLL3000_MDIV_MASK; 114 + pdiv = (pll_con >> PLL3000_PDIV_SHIFT) & PLL3000_PDIV_MASK; 115 + sdiv = (pll_con >> PLL3000_SDIV_SHIFT) & PLL3000_SDIV_MASK; 116 + 117 + fvco *= (2 * (mdiv + 8)); 118 + do_div(fvco, pdiv << sdiv); 119 + 120 + return (unsigned long)fvco; 121 + } 122 + 123 + static const struct clk_ops samsung_pll3000_clk_ops = { 124 + .recalc_rate = samsung_pll3000_recalc_rate, 125 + }; 61 126 62 127 /* 63 128 * PLL35xx Clock Type ··· 631 564 #define PLL6552_PDIV_MASK 0x3f 632 565 #define PLL6552_SDIV_MASK 0x7 633 566 #define PLL6552_MDIV_SHIFT 16 567 + #define PLL6552_MDIV_SHIFT_2416 14 634 568 #define PLL6552_PDIV_SHIFT 8 569 + #define PLL6552_PDIV_SHIFT_2416 5 635 570 #define PLL6552_SDIV_SHIFT 0 636 571 637 572 static unsigned long samsung_pll6552_recalc_rate(struct clk_hw *hw, ··· 644 575 u64 fvco = parent_rate; 645 576 646 577 pll_con = __raw_readl(pll->con_reg); 647 - mdiv = (pll_con >> PLL6552_MDIV_SHIFT) & PLL6552_MDIV_MASK; 648 - pdiv = (pll_con >> PLL6552_PDIV_SHIFT) & PLL6552_PDIV_MASK; 578 + if (pll->type == pll_6552_s3c2416) { 579 + mdiv = (pll_con >> PLL6552_MDIV_SHIFT_2416) & PLL6552_MDIV_MASK; 580 + pdiv = (pll_con >> PLL6552_PDIV_SHIFT_2416) & PLL6552_PDIV_MASK; 581 + } else { 582 + mdiv = (pll_con >> PLL6552_MDIV_SHIFT) & PLL6552_MDIV_MASK; 583 + pdiv = (pll_con >> PLL6552_PDIV_SHIFT) & PLL6552_PDIV_MASK; 584 + } 649 585 sdiv = (pll_con >> PLL6552_SDIV_SHIFT) & PLL6552_SDIV_MASK; 650 586 651 587 fvco *= mdiv; ··· 699 625 700 626 static const struct clk_ops samsung_pll6553_clk_ops = { 701 627 .recalc_rate = samsung_pll6553_recalc_rate, 628 + }; 629 + 630 + /* 631 + * PLL Clock Type of S3C24XX before S3C2443 632 + */ 633 + 634 + #define PLLS3C2410_MDIV_MASK (0xff) 635 + #define PLLS3C2410_PDIV_MASK (0x1f) 636 + #define PLLS3C2410_SDIV_MASK (0x3) 637 + #define PLLS3C2410_MDIV_SHIFT (12) 638 + #define PLLS3C2410_PDIV_SHIFT (4) 639 + #define PLLS3C2410_SDIV_SHIFT (0) 640 + 641 + #define PLLS3C2410_ENABLE_REG_OFFSET 0x10 642 + 643 + static unsigned long samsung_s3c2410_pll_recalc_rate(struct clk_hw *hw, 644 + unsigned long parent_rate) 645 + { 646 + struct samsung_clk_pll *pll = to_clk_pll(hw); 647 + u32 pll_con, mdiv, pdiv, sdiv; 648 + u64 fvco = parent_rate; 649 + 650 + pll_con = __raw_readl(pll->con_reg); 651 + mdiv = (pll_con >> PLLS3C2410_MDIV_SHIFT) & PLLS3C2410_MDIV_MASK; 652 + pdiv = (pll_con >> PLLS3C2410_PDIV_SHIFT) & PLLS3C2410_PDIV_MASK; 653 + sdiv = (pll_con >> PLLS3C2410_SDIV_SHIFT) & PLLS3C2410_SDIV_MASK; 654 + 655 + fvco *= (mdiv + 8); 656 + do_div(fvco, (pdiv + 2) << sdiv); 657 + 658 + return (unsigned int)fvco; 659 + } 660 + 661 + static unsigned long samsung_s3c2440_mpll_recalc_rate(struct clk_hw *hw, 662 + unsigned long parent_rate) 663 + { 664 + struct samsung_clk_pll *pll = to_clk_pll(hw); 665 + u32 pll_con, mdiv, pdiv, sdiv; 666 + u64 fvco = parent_rate; 667 + 668 + pll_con = __raw_readl(pll->con_reg); 669 + mdiv = (pll_con >> PLLS3C2410_MDIV_SHIFT) & PLLS3C2410_MDIV_MASK; 670 + pdiv = (pll_con >> PLLS3C2410_PDIV_SHIFT) & PLLS3C2410_PDIV_MASK; 671 + sdiv = (pll_con >> PLLS3C2410_SDIV_SHIFT) & PLLS3C2410_SDIV_MASK; 672 + 673 + fvco *= (2 * (mdiv + 8)); 674 + do_div(fvco, (pdiv + 2) << sdiv); 675 + 676 + return (unsigned int)fvco; 677 + } 678 + 679 + static int samsung_s3c2410_pll_set_rate(struct clk_hw *hw, unsigned long drate, 680 + unsigned long prate) 681 + { 682 + struct samsung_clk_pll *pll = to_clk_pll(hw); 683 + const struct samsung_pll_rate_table *rate; 684 + u32 tmp; 685 + 686 + /* Get required rate settings from table */ 687 + rate = samsung_get_pll_settings(pll, drate); 688 + if (!rate) { 689 + pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, 690 + drate, __clk_get_name(hw->clk)); 691 + return -EINVAL; 692 + } 693 + 694 + tmp = __raw_readl(pll->con_reg); 695 + 696 + /* Change PLL PMS values */ 697 + tmp &= ~((PLLS3C2410_MDIV_MASK << PLLS3C2410_MDIV_SHIFT) | 698 + (PLLS3C2410_PDIV_MASK << PLLS3C2410_PDIV_SHIFT) | 699 + (PLLS3C2410_SDIV_MASK << PLLS3C2410_SDIV_SHIFT)); 700 + tmp |= (rate->mdiv << PLLS3C2410_MDIV_SHIFT) | 701 + (rate->pdiv << PLLS3C2410_PDIV_SHIFT) | 702 + (rate->sdiv << PLLS3C2410_SDIV_SHIFT); 703 + __raw_writel(tmp, pll->con_reg); 704 + 705 + /* Time to settle according to the manual */ 706 + udelay(300); 707 + 708 + return 0; 709 + } 710 + 711 + static int samsung_s3c2410_pll_enable(struct clk_hw *hw, int bit, bool enable) 712 + { 713 + struct samsung_clk_pll *pll = to_clk_pll(hw); 714 + u32 pll_en = __raw_readl(pll->lock_reg + PLLS3C2410_ENABLE_REG_OFFSET); 715 + u32 pll_en_orig = pll_en; 716 + 717 + if (enable) 718 + pll_en &= ~BIT(bit); 719 + else 720 + pll_en |= BIT(bit); 721 + 722 + __raw_writel(pll_en, pll->lock_reg + PLLS3C2410_ENABLE_REG_OFFSET); 723 + 724 + /* if we started the UPLL, then allow to settle */ 725 + if (enable && (pll_en_orig & BIT(bit))) 726 + udelay(300); 727 + 728 + return 0; 729 + } 730 + 731 + static int samsung_s3c2410_mpll_enable(struct clk_hw *hw) 732 + { 733 + return samsung_s3c2410_pll_enable(hw, 5, true); 734 + } 735 + 736 + static void samsung_s3c2410_mpll_disable(struct clk_hw *hw) 737 + { 738 + samsung_s3c2410_pll_enable(hw, 5, false); 739 + } 740 + 741 + static int samsung_s3c2410_upll_enable(struct clk_hw *hw) 742 + { 743 + return samsung_s3c2410_pll_enable(hw, 7, true); 744 + } 745 + 746 + static void samsung_s3c2410_upll_disable(struct clk_hw *hw) 747 + { 748 + samsung_s3c2410_pll_enable(hw, 7, false); 749 + } 750 + 751 + static const struct clk_ops samsung_s3c2410_mpll_clk_min_ops = { 752 + .recalc_rate = samsung_s3c2410_pll_recalc_rate, 753 + .enable = samsung_s3c2410_mpll_enable, 754 + .disable = samsung_s3c2410_mpll_disable, 755 + }; 756 + 757 + static const struct clk_ops samsung_s3c2410_upll_clk_min_ops = { 758 + .recalc_rate = samsung_s3c2410_pll_recalc_rate, 759 + .enable = samsung_s3c2410_upll_enable, 760 + .disable = samsung_s3c2410_upll_disable, 761 + }; 762 + 763 + static const struct clk_ops samsung_s3c2440_mpll_clk_min_ops = { 764 + .recalc_rate = samsung_s3c2440_mpll_recalc_rate, 765 + .enable = samsung_s3c2410_mpll_enable, 766 + .disable = samsung_s3c2410_mpll_disable, 767 + }; 768 + 769 + static const struct clk_ops samsung_s3c2410_mpll_clk_ops = { 770 + .recalc_rate = samsung_s3c2410_pll_recalc_rate, 771 + .enable = samsung_s3c2410_mpll_enable, 772 + .disable = samsung_s3c2410_mpll_disable, 773 + .round_rate = samsung_pll_round_rate, 774 + .set_rate = samsung_s3c2410_pll_set_rate, 775 + }; 776 + 777 + static const struct clk_ops samsung_s3c2410_upll_clk_ops = { 778 + .recalc_rate = samsung_s3c2410_pll_recalc_rate, 779 + .enable = samsung_s3c2410_upll_enable, 780 + .disable = samsung_s3c2410_upll_disable, 781 + .round_rate = samsung_pll_round_rate, 782 + .set_rate = samsung_s3c2410_pll_set_rate, 783 + }; 784 + 785 + static const struct clk_ops samsung_s3c2440_mpll_clk_ops = { 786 + .recalc_rate = samsung_s3c2440_mpll_recalc_rate, 787 + .enable = samsung_s3c2410_mpll_enable, 788 + .disable = samsung_s3c2410_mpll_disable, 789 + .round_rate = samsung_pll_round_rate, 790 + .set_rate = samsung_s3c2410_pll_set_rate, 702 791 }; 703 792 704 793 /* ··· 947 710 return clk; 948 711 } 949 712 950 - static void __init _samsung_clk_register_pll(struct samsung_pll_clock *pll_clk, 951 - void __iomem *base) 713 + /* 714 + * PLL2550xx Clock Type 715 + */ 716 + 717 + /* Maximum lock time can be 270 * PDIV cycles */ 718 + #define PLL2550XX_LOCK_FACTOR 270 719 + 720 + #define PLL2550XX_M_MASK 0x3FF 721 + #define PLL2550XX_P_MASK 0x3F 722 + #define PLL2550XX_S_MASK 0x7 723 + #define PLL2550XX_LOCK_STAT_MASK 0x1 724 + #define PLL2550XX_M_SHIFT 9 725 + #define PLL2550XX_P_SHIFT 3 726 + #define PLL2550XX_S_SHIFT 0 727 + #define PLL2550XX_LOCK_STAT_SHIFT 21 728 + 729 + static unsigned long samsung_pll2550xx_recalc_rate(struct clk_hw *hw, 730 + unsigned long parent_rate) 731 + { 732 + struct samsung_clk_pll *pll = to_clk_pll(hw); 733 + u32 mdiv, pdiv, sdiv, pll_con; 734 + u64 fvco = parent_rate; 735 + 736 + pll_con = __raw_readl(pll->con_reg); 737 + mdiv = (pll_con >> PLL2550XX_M_SHIFT) & PLL2550XX_M_MASK; 738 + pdiv = (pll_con >> PLL2550XX_P_SHIFT) & PLL2550XX_P_MASK; 739 + sdiv = (pll_con >> PLL2550XX_S_SHIFT) & PLL2550XX_S_MASK; 740 + 741 + fvco *= mdiv; 742 + do_div(fvco, (pdiv << sdiv)); 743 + 744 + return (unsigned long)fvco; 745 + } 746 + 747 + static inline bool samsung_pll2550xx_mp_change(u32 mdiv, u32 pdiv, u32 pll_con) 748 + { 749 + u32 old_mdiv, old_pdiv; 750 + 751 + old_mdiv = (pll_con >> PLL2550XX_M_SHIFT) & PLL2550XX_M_MASK; 752 + old_pdiv = (pll_con >> PLL2550XX_P_SHIFT) & PLL2550XX_P_MASK; 753 + 754 + return mdiv != old_mdiv || pdiv != old_pdiv; 755 + } 756 + 757 + static int samsung_pll2550xx_set_rate(struct clk_hw *hw, unsigned long drate, 758 + unsigned long prate) 759 + { 760 + struct samsung_clk_pll *pll = to_clk_pll(hw); 761 + const struct samsung_pll_rate_table *rate; 762 + u32 tmp; 763 + 764 + /* Get required rate settings from table */ 765 + rate = samsung_get_pll_settings(pll, drate); 766 + if (!rate) { 767 + pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, 768 + drate, __clk_get_name(hw->clk)); 769 + return -EINVAL; 770 + } 771 + 772 + tmp = __raw_readl(pll->con_reg); 773 + 774 + if (!(samsung_pll2550xx_mp_change(rate->mdiv, rate->pdiv, tmp))) { 775 + /* If only s change, change just s value only*/ 776 + tmp &= ~(PLL2550XX_S_MASK << PLL2550XX_S_SHIFT); 777 + tmp |= rate->sdiv << PLL2550XX_S_SHIFT; 778 + __raw_writel(tmp, pll->con_reg); 779 + 780 + return 0; 781 + } 782 + 783 + /* Set PLL lock time. */ 784 + __raw_writel(rate->pdiv * PLL2550XX_LOCK_FACTOR, pll->lock_reg); 785 + 786 + /* Change PLL PMS values */ 787 + tmp &= ~((PLL2550XX_M_MASK << PLL2550XX_M_SHIFT) | 788 + (PLL2550XX_P_MASK << PLL2550XX_P_SHIFT) | 789 + (PLL2550XX_S_MASK << PLL2550XX_S_SHIFT)); 790 + tmp |= (rate->mdiv << PLL2550XX_M_SHIFT) | 791 + (rate->pdiv << PLL2550XX_P_SHIFT) | 792 + (rate->sdiv << PLL2550XX_S_SHIFT); 793 + __raw_writel(tmp, pll->con_reg); 794 + 795 + /* wait_lock_time */ 796 + do { 797 + cpu_relax(); 798 + tmp = __raw_readl(pll->con_reg); 799 + } while (!(tmp & (PLL2550XX_LOCK_STAT_MASK 800 + << PLL2550XX_LOCK_STAT_SHIFT))); 801 + 802 + return 0; 803 + } 804 + 805 + static const struct clk_ops samsung_pll2550xx_clk_ops = { 806 + .recalc_rate = samsung_pll2550xx_recalc_rate, 807 + .round_rate = samsung_pll_round_rate, 808 + .set_rate = samsung_pll2550xx_set_rate, 809 + }; 810 + 811 + static const struct clk_ops samsung_pll2550xx_clk_min_ops = { 812 + .recalc_rate = samsung_pll2550xx_recalc_rate, 813 + }; 814 + 815 + /* 816 + * PLL2650XX Clock Type 817 + */ 818 + 819 + /* Maximum lock time can be 3000 * PDIV cycles */ 820 + #define PLL2650XX_LOCK_FACTOR 3000 821 + 822 + #define PLL2650XX_MDIV_SHIFT 9 823 + #define PLL2650XX_PDIV_SHIFT 3 824 + #define PLL2650XX_SDIV_SHIFT 0 825 + #define PLL2650XX_KDIV_SHIFT 0 826 + #define PLL2650XX_MDIV_MASK 0x1ff 827 + #define PLL2650XX_PDIV_MASK 0x3f 828 + #define PLL2650XX_SDIV_MASK 0x7 829 + #define PLL2650XX_KDIV_MASK 0xffff 830 + #define PLL2650XX_PLL_ENABLE_SHIFT 23 831 + #define PLL2650XX_PLL_LOCKTIME_SHIFT 21 832 + #define PLL2650XX_PLL_FOUTMASK_SHIFT 31 833 + 834 + static unsigned long samsung_pll2650xx_recalc_rate(struct clk_hw *hw, 835 + unsigned long parent_rate) 836 + { 837 + struct samsung_clk_pll *pll = to_clk_pll(hw); 838 + u32 mdiv, pdiv, sdiv, pll_con0, pll_con2; 839 + s16 kdiv; 840 + u64 fvco = parent_rate; 841 + 842 + pll_con0 = __raw_readl(pll->con_reg); 843 + pll_con2 = __raw_readl(pll->con_reg + 8); 844 + mdiv = (pll_con0 >> PLL2650XX_MDIV_SHIFT) & PLL2650XX_MDIV_MASK; 845 + pdiv = (pll_con0 >> PLL2650XX_PDIV_SHIFT) & PLL2650XX_PDIV_MASK; 846 + sdiv = (pll_con0 >> PLL2650XX_SDIV_SHIFT) & PLL2650XX_SDIV_MASK; 847 + kdiv = (s16)(pll_con2 & PLL2650XX_KDIV_MASK); 848 + 849 + fvco *= (mdiv << 16) + kdiv; 850 + do_div(fvco, (pdiv << sdiv)); 851 + fvco >>= 16; 852 + 853 + return (unsigned long)fvco; 854 + } 855 + 856 + static int samsung_pll2650xx_set_rate(struct clk_hw *hw, unsigned long drate, 857 + unsigned long parent_rate) 858 + { 859 + struct samsung_clk_pll *pll = to_clk_pll(hw); 860 + u32 tmp, pll_con0, pll_con2; 861 + const struct samsung_pll_rate_table *rate; 862 + 863 + rate = samsung_get_pll_settings(pll, drate); 864 + if (!rate) { 865 + pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, 866 + drate, __clk_get_name(hw->clk)); 867 + return -EINVAL; 868 + } 869 + 870 + pll_con0 = __raw_readl(pll->con_reg); 871 + pll_con2 = __raw_readl(pll->con_reg + 8); 872 + 873 + /* Change PLL PMS values */ 874 + pll_con0 &= ~(PLL2650XX_MDIV_MASK << PLL2650XX_MDIV_SHIFT | 875 + PLL2650XX_PDIV_MASK << PLL2650XX_PDIV_SHIFT | 876 + PLL2650XX_SDIV_MASK << PLL2650XX_SDIV_SHIFT); 877 + pll_con0 |= rate->mdiv << PLL2650XX_MDIV_SHIFT; 878 + pll_con0 |= rate->pdiv << PLL2650XX_PDIV_SHIFT; 879 + pll_con0 |= rate->sdiv << PLL2650XX_SDIV_SHIFT; 880 + pll_con0 |= 1 << PLL2650XX_PLL_ENABLE_SHIFT; 881 + pll_con0 |= 1 << PLL2650XX_PLL_FOUTMASK_SHIFT; 882 + 883 + pll_con2 &= ~(PLL2650XX_KDIV_MASK << PLL2650XX_KDIV_SHIFT); 884 + pll_con2 |= ((~(rate->kdiv) + 1) & PLL2650XX_KDIV_MASK) 885 + << PLL2650XX_KDIV_SHIFT; 886 + 887 + /* Set PLL lock time. */ 888 + __raw_writel(PLL2650XX_LOCK_FACTOR * rate->pdiv, pll->lock_reg); 889 + 890 + __raw_writel(pll_con0, pll->con_reg); 891 + __raw_writel(pll_con2, pll->con_reg + 8); 892 + 893 + do { 894 + tmp = __raw_readl(pll->con_reg); 895 + } while (!(tmp & (0x1 << PLL2650XX_PLL_LOCKTIME_SHIFT))); 896 + 897 + return 0; 898 + } 899 + 900 + static const struct clk_ops samsung_pll2650xx_clk_ops = { 901 + .recalc_rate = samsung_pll2650xx_recalc_rate, 902 + .set_rate = samsung_pll2650xx_set_rate, 903 + .round_rate = samsung_pll_round_rate, 904 + }; 905 + 906 + static const struct clk_ops samsung_pll2650xx_clk_min_ops = { 907 + .recalc_rate = samsung_pll2650xx_recalc_rate, 908 + }; 909 + 910 + static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx, 911 + struct samsung_pll_clock *pll_clk, 912 + void __iomem *base) 952 913 { 953 914 struct samsung_clk_pll *pll; 954 915 struct clk *clk; ··· 1181 746 } 1182 747 1183 748 switch (pll_clk->type) { 749 + case pll_2126: 750 + init.ops = &samsung_pll2126_clk_ops; 751 + break; 752 + case pll_3000: 753 + init.ops = &samsung_pll3000_clk_ops; 754 + break; 1184 755 /* clk_ops for 35xx and 2550 are similar */ 1185 756 case pll_35xx: 1186 757 case pll_2550: ··· 1214 773 init.ops = &samsung_pll36xx_clk_ops; 1215 774 break; 1216 775 case pll_6552: 776 + case pll_6552_s3c2416: 1217 777 init.ops = &samsung_pll6552_clk_ops; 1218 778 break; 1219 779 case pll_6553: ··· 1227 785 init.ops = &samsung_pll46xx_clk_min_ops; 1228 786 else 1229 787 init.ops = &samsung_pll46xx_clk_ops; 788 + break; 789 + case pll_s3c2410_mpll: 790 + if (!pll->rate_table) 791 + init.ops = &samsung_s3c2410_mpll_clk_min_ops; 792 + else 793 + init.ops = &samsung_s3c2410_mpll_clk_ops; 794 + break; 795 + case pll_s3c2410_upll: 796 + if (!pll->rate_table) 797 + init.ops = &samsung_s3c2410_upll_clk_min_ops; 798 + else 799 + init.ops = &samsung_s3c2410_upll_clk_ops; 800 + break; 801 + case pll_s3c2440_mpll: 802 + if (!pll->rate_table) 803 + init.ops = &samsung_s3c2440_mpll_clk_min_ops; 804 + else 805 + init.ops = &samsung_s3c2440_mpll_clk_ops; 806 + break; 807 + case pll_2550xx: 808 + if (!pll->rate_table) 809 + init.ops = &samsung_pll2550xx_clk_min_ops; 810 + else 811 + init.ops = &samsung_pll2550xx_clk_ops; 812 + break; 813 + case pll_2650xx: 814 + if (!pll->rate_table) 815 + init.ops = &samsung_pll2650xx_clk_min_ops; 816 + else 817 + init.ops = &samsung_pll2650xx_clk_ops; 1230 818 break; 1231 819 default: 1232 820 pr_warn("%s: Unknown pll type for pll clk %s\n", ··· 1276 804 return; 1277 805 } 1278 806 1279 - samsung_clk_add_lookup(clk, pll_clk->id); 807 + samsung_clk_add_lookup(ctx, clk, pll_clk->id); 1280 808 1281 809 if (!pll_clk->alias) 1282 810 return; ··· 1287 815 __func__, pll_clk->name, ret); 1288 816 } 1289 817 1290 - void __init samsung_clk_register_pll(struct samsung_pll_clock *pll_list, 1291 - unsigned int nr_pll, void __iomem *base) 818 + void __init samsung_clk_register_pll(struct samsung_clk_provider *ctx, 819 + struct samsung_pll_clock *pll_list, 820 + unsigned int nr_pll, void __iomem *base) 1292 821 { 1293 822 int cnt; 1294 823 1295 824 for (cnt = 0; cnt < nr_pll; cnt++) 1296 - _samsung_clk_register_pll(&pll_list[cnt], base); 825 + _samsung_clk_register_pll(ctx, &pll_list[cnt], base); 1297 826 }
+8
drivers/clk/samsung/clk-pll.h
··· 13 13 #define __SAMSUNG_CLK_PLL_H 14 14 15 15 enum samsung_pll_type { 16 + pll_2126, 17 + pll_3000, 16 18 pll_35xx, 17 19 pll_36xx, 18 20 pll_2550, ··· 26 24 pll_4650, 27 25 pll_4650c, 28 26 pll_6552, 27 + pll_6552_s3c2416, 29 28 pll_6553, 29 + pll_s3c2410_mpll, 30 + pll_s3c2410_upll, 31 + pll_s3c2440_mpll, 32 + pll_2550xx, 33 + pll_2650xx, 30 34 }; 31 35 32 36 #define PLL_35XX_RATE(_rate, _m, _p, _s) \
+440
drivers/clk/samsung/clk-s3c2410-dclk.c
··· 1 + /* 2 + * Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de> 3 + * 4 + * This program is free software; you can redistribute it and/or modify 5 + * it under the terms of the GNU General Public License version 2 as 6 + * published by the Free Software Foundation. 7 + * 8 + * Common Clock Framework support for s3c24xx external clock output. 9 + */ 10 + 11 + #include <linux/platform_device.h> 12 + #include <linux/module.h> 13 + #include "clk.h" 14 + 15 + /* legacy access to misccr, until dt conversion is finished */ 16 + #include <mach/hardware.h> 17 + #include <mach/regs-gpio.h> 18 + 19 + #define MUX_DCLK0 0 20 + #define MUX_DCLK1 1 21 + #define DIV_DCLK0 2 22 + #define DIV_DCLK1 3 23 + #define GATE_DCLK0 4 24 + #define GATE_DCLK1 5 25 + #define MUX_CLKOUT0 6 26 + #define MUX_CLKOUT1 7 27 + #define DCLK_MAX_CLKS (MUX_CLKOUT1 + 1) 28 + 29 + enum supported_socs { 30 + S3C2410, 31 + S3C2412, 32 + S3C2440, 33 + S3C2443, 34 + }; 35 + 36 + struct s3c24xx_dclk_drv_data { 37 + const char **clkout0_parent_names; 38 + int clkout0_num_parents; 39 + const char **clkout1_parent_names; 40 + int clkout1_num_parents; 41 + const char **mux_parent_names; 42 + int mux_num_parents; 43 + }; 44 + 45 + /* 46 + * Clock for output-parent selection in misccr 47 + */ 48 + 49 + struct s3c24xx_clkout { 50 + struct clk_hw hw; 51 + u32 mask; 52 + u8 shift; 53 + }; 54 + 55 + #define to_s3c24xx_clkout(_hw) container_of(_hw, struct s3c24xx_clkout, hw) 56 + 57 + static u8 s3c24xx_clkout_get_parent(struct clk_hw *hw) 58 + { 59 + struct s3c24xx_clkout *clkout = to_s3c24xx_clkout(hw); 60 + int num_parents = __clk_get_num_parents(hw->clk); 61 + u32 val; 62 + 63 + val = readl_relaxed(S3C24XX_MISCCR) >> clkout->shift; 64 + val >>= clkout->shift; 65 + val &= clkout->mask; 66 + 67 + if (val >= num_parents) 68 + return -EINVAL; 69 + 70 + return val; 71 + } 72 + 73 + static int s3c24xx_clkout_set_parent(struct clk_hw *hw, u8 index) 74 + { 75 + struct s3c24xx_clkout *clkout = to_s3c24xx_clkout(hw); 76 + int ret = 0; 77 + 78 + s3c2410_modify_misccr((clkout->mask << clkout->shift), 79 + (index << clkout->shift)); 80 + 81 + return ret; 82 + } 83 + 84 + const struct clk_ops s3c24xx_clkout_ops = { 85 + .get_parent = s3c24xx_clkout_get_parent, 86 + .set_parent = s3c24xx_clkout_set_parent, 87 + .determine_rate = __clk_mux_determine_rate, 88 + }; 89 + 90 + struct clk *s3c24xx_register_clkout(struct device *dev, const char *name, 91 + const char **parent_names, u8 num_parents, 92 + u8 shift, u32 mask) 93 + { 94 + struct s3c24xx_clkout *clkout; 95 + struct clk *clk; 96 + struct clk_init_data init; 97 + 98 + /* allocate the clkout */ 99 + clkout = kzalloc(sizeof(*clkout), GFP_KERNEL); 100 + if (!clkout) 101 + return ERR_PTR(-ENOMEM); 102 + 103 + init.name = name; 104 + init.ops = &s3c24xx_clkout_ops; 105 + init.flags = CLK_IS_BASIC; 106 + init.parent_names = parent_names; 107 + init.num_parents = num_parents; 108 + 109 + clkout->shift = shift; 110 + clkout->mask = mask; 111 + clkout->hw.init = &init; 112 + 113 + clk = clk_register(dev, &clkout->hw); 114 + 115 + return clk; 116 + } 117 + 118 + /* 119 + * dclk and clkout init 120 + */ 121 + 122 + struct s3c24xx_dclk { 123 + struct device *dev; 124 + void __iomem *base; 125 + struct clk_onecell_data clk_data; 126 + struct notifier_block dclk0_div_change_nb; 127 + struct notifier_block dclk1_div_change_nb; 128 + spinlock_t dclk_lock; 129 + unsigned long reg_save; 130 + }; 131 + 132 + #define to_s3c24xx_dclk0(x) \ 133 + container_of(x, struct s3c24xx_dclk, dclk0_div_change_nb) 134 + 135 + #define to_s3c24xx_dclk1(x) \ 136 + container_of(x, struct s3c24xx_dclk, dclk1_div_change_nb) 137 + 138 + PNAME(dclk_s3c2410_p) = { "pclk", "uclk" }; 139 + PNAME(clkout0_s3c2410_p) = { "mpll", "upll", "fclk", "hclk", "pclk", 140 + "gate_dclk0" }; 141 + PNAME(clkout1_s3c2410_p) = { "mpll", "upll", "fclk", "hclk", "pclk", 142 + "gate_dclk1" }; 143 + 144 + PNAME(clkout0_s3c2412_p) = { "mpll", "upll", "rtc_clkout", 145 + "hclk", "pclk", "gate_dclk0" }; 146 + PNAME(clkout1_s3c2412_p) = { "xti", "upll", "fclk", "hclk", "pclk", 147 + "gate_dclk1" }; 148 + 149 + PNAME(clkout0_s3c2440_p) = { "xti", "upll", "fclk", "hclk", "pclk", 150 + "gate_dclk0" }; 151 + PNAME(clkout1_s3c2440_p) = { "mpll", "upll", "rtc_clkout", 152 + "hclk", "pclk", "gate_dclk1" }; 153 + 154 + PNAME(dclk_s3c2443_p) = { "pclk", "epll" }; 155 + PNAME(clkout0_s3c2443_p) = { "xti", "epll", "armclk", "hclk", "pclk", 156 + "gate_dclk0" }; 157 + PNAME(clkout1_s3c2443_p) = { "dummy", "epll", "rtc_clkout", 158 + "hclk", "pclk", "gate_dclk1" }; 159 + 160 + #define DCLKCON_DCLK_DIV_MASK 0xf 161 + #define DCLKCON_DCLK0_DIV_SHIFT 4 162 + #define DCLKCON_DCLK0_CMP_SHIFT 8 163 + #define DCLKCON_DCLK1_DIV_SHIFT 20 164 + #define DCLKCON_DCLK1_CMP_SHIFT 24 165 + 166 + static void s3c24xx_dclk_update_cmp(struct s3c24xx_dclk *s3c24xx_dclk, 167 + int div_shift, int cmp_shift) 168 + { 169 + unsigned long flags = 0; 170 + u32 dclk_con, div, cmp; 171 + 172 + spin_lock_irqsave(&s3c24xx_dclk->dclk_lock, flags); 173 + 174 + dclk_con = readl_relaxed(s3c24xx_dclk->base); 175 + 176 + div = ((dclk_con >> div_shift) & DCLKCON_DCLK_DIV_MASK) + 1; 177 + cmp = ((div + 1) / 2) - 1; 178 + 179 + dclk_con &= ~(DCLKCON_DCLK_DIV_MASK << cmp_shift); 180 + dclk_con |= (cmp << cmp_shift); 181 + 182 + writel_relaxed(dclk_con, s3c24xx_dclk->base); 183 + 184 + spin_unlock_irqrestore(&s3c24xx_dclk->dclk_lock, flags); 185 + } 186 + 187 + static int s3c24xx_dclk0_div_notify(struct notifier_block *nb, 188 + unsigned long event, void *data) 189 + { 190 + struct s3c24xx_dclk *s3c24xx_dclk = to_s3c24xx_dclk0(nb); 191 + 192 + if (event == POST_RATE_CHANGE) { 193 + s3c24xx_dclk_update_cmp(s3c24xx_dclk, 194 + DCLKCON_DCLK0_DIV_SHIFT, DCLKCON_DCLK0_CMP_SHIFT); 195 + } 196 + 197 + return NOTIFY_DONE; 198 + } 199 + 200 + static int s3c24xx_dclk1_div_notify(struct notifier_block *nb, 201 + unsigned long event, void *data) 202 + { 203 + struct s3c24xx_dclk *s3c24xx_dclk = to_s3c24xx_dclk1(nb); 204 + 205 + if (event == POST_RATE_CHANGE) { 206 + s3c24xx_dclk_update_cmp(s3c24xx_dclk, 207 + DCLKCON_DCLK1_DIV_SHIFT, DCLKCON_DCLK1_CMP_SHIFT); 208 + } 209 + 210 + return NOTIFY_DONE; 211 + } 212 + 213 + #ifdef CONFIG_PM_SLEEP 214 + static int s3c24xx_dclk_suspend(struct device *dev) 215 + { 216 + struct platform_device *pdev = to_platform_device(dev); 217 + struct s3c24xx_dclk *s3c24xx_dclk = platform_get_drvdata(pdev); 218 + 219 + s3c24xx_dclk->reg_save = readl_relaxed(s3c24xx_dclk->base); 220 + return 0; 221 + } 222 + 223 + static int s3c24xx_dclk_resume(struct device *dev) 224 + { 225 + struct platform_device *pdev = to_platform_device(dev); 226 + struct s3c24xx_dclk *s3c24xx_dclk = platform_get_drvdata(pdev); 227 + 228 + writel_relaxed(s3c24xx_dclk->reg_save, s3c24xx_dclk->base); 229 + return 0; 230 + } 231 + #endif 232 + 233 + static SIMPLE_DEV_PM_OPS(s3c24xx_dclk_pm_ops, 234 + s3c24xx_dclk_suspend, s3c24xx_dclk_resume); 235 + 236 + static int s3c24xx_dclk_probe(struct platform_device *pdev) 237 + { 238 + struct s3c24xx_dclk *s3c24xx_dclk; 239 + struct resource *mem; 240 + struct clk **clk_table; 241 + struct s3c24xx_dclk_drv_data *dclk_variant; 242 + int ret, i; 243 + 244 + s3c24xx_dclk = devm_kzalloc(&pdev->dev, sizeof(*s3c24xx_dclk), 245 + GFP_KERNEL); 246 + if (!s3c24xx_dclk) 247 + return -ENOMEM; 248 + 249 + s3c24xx_dclk->dev = &pdev->dev; 250 + platform_set_drvdata(pdev, s3c24xx_dclk); 251 + spin_lock_init(&s3c24xx_dclk->dclk_lock); 252 + 253 + clk_table = devm_kzalloc(&pdev->dev, 254 + sizeof(struct clk *) * DCLK_MAX_CLKS, 255 + GFP_KERNEL); 256 + if (!clk_table) 257 + return -ENOMEM; 258 + 259 + s3c24xx_dclk->clk_data.clks = clk_table; 260 + s3c24xx_dclk->clk_data.clk_num = DCLK_MAX_CLKS; 261 + 262 + mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 263 + s3c24xx_dclk->base = devm_ioremap_resource(&pdev->dev, mem); 264 + if (IS_ERR(s3c24xx_dclk->base)) 265 + return PTR_ERR(s3c24xx_dclk->base); 266 + 267 + dclk_variant = (struct s3c24xx_dclk_drv_data *) 268 + platform_get_device_id(pdev)->driver_data; 269 + 270 + 271 + clk_table[MUX_DCLK0] = clk_register_mux(&pdev->dev, "mux_dclk0", 272 + dclk_variant->mux_parent_names, 273 + dclk_variant->mux_num_parents, 0, 274 + s3c24xx_dclk->base, 1, 1, 0, 275 + &s3c24xx_dclk->dclk_lock); 276 + clk_table[MUX_DCLK1] = clk_register_mux(&pdev->dev, "mux_dclk1", 277 + dclk_variant->mux_parent_names, 278 + dclk_variant->mux_num_parents, 0, 279 + s3c24xx_dclk->base, 17, 1, 0, 280 + &s3c24xx_dclk->dclk_lock); 281 + 282 + clk_table[DIV_DCLK0] = clk_register_divider(&pdev->dev, "div_dclk0", 283 + "mux_dclk0", 0, s3c24xx_dclk->base, 284 + 4, 4, 0, &s3c24xx_dclk->dclk_lock); 285 + clk_table[DIV_DCLK1] = clk_register_divider(&pdev->dev, "div_dclk1", 286 + "mux_dclk1", 0, s3c24xx_dclk->base, 287 + 20, 4, 0, &s3c24xx_dclk->dclk_lock); 288 + 289 + clk_table[GATE_DCLK0] = clk_register_gate(&pdev->dev, "gate_dclk0", 290 + "div_dclk0", CLK_SET_RATE_PARENT, 291 + s3c24xx_dclk->base, 0, 0, 292 + &s3c24xx_dclk->dclk_lock); 293 + clk_table[GATE_DCLK1] = clk_register_gate(&pdev->dev, "gate_dclk1", 294 + "div_dclk1", CLK_SET_RATE_PARENT, 295 + s3c24xx_dclk->base, 16, 0, 296 + &s3c24xx_dclk->dclk_lock); 297 + 298 + clk_table[MUX_CLKOUT0] = s3c24xx_register_clkout(&pdev->dev, 299 + "clkout0", dclk_variant->clkout0_parent_names, 300 + dclk_variant->clkout0_num_parents, 4, 7); 301 + clk_table[MUX_CLKOUT1] = s3c24xx_register_clkout(&pdev->dev, 302 + "clkout1", dclk_variant->clkout1_parent_names, 303 + dclk_variant->clkout1_num_parents, 8, 7); 304 + 305 + for (i = 0; i < DCLK_MAX_CLKS; i++) 306 + if (IS_ERR(clk_table[i])) { 307 + dev_err(&pdev->dev, "clock %d failed to register\n", i); 308 + ret = PTR_ERR(clk_table[i]); 309 + goto err_clk_register; 310 + } 311 + 312 + ret = clk_register_clkdev(clk_table[MUX_DCLK0], "dclk0", NULL); 313 + if (!ret) 314 + ret = clk_register_clkdev(clk_table[MUX_DCLK1], "dclk1", NULL); 315 + if (!ret) 316 + ret = clk_register_clkdev(clk_table[MUX_CLKOUT0], 317 + "clkout0", NULL); 318 + if (!ret) 319 + ret = clk_register_clkdev(clk_table[MUX_CLKOUT1], 320 + "clkout1", NULL); 321 + if (ret) { 322 + dev_err(&pdev->dev, "failed to register aliases, %d\n", ret); 323 + goto err_clk_register; 324 + } 325 + 326 + s3c24xx_dclk->dclk0_div_change_nb.notifier_call = 327 + s3c24xx_dclk0_div_notify; 328 + 329 + s3c24xx_dclk->dclk1_div_change_nb.notifier_call = 330 + s3c24xx_dclk1_div_notify; 331 + 332 + ret = clk_notifier_register(clk_table[DIV_DCLK0], 333 + &s3c24xx_dclk->dclk0_div_change_nb); 334 + if (ret) 335 + goto err_clk_register; 336 + 337 + ret = clk_notifier_register(clk_table[DIV_DCLK1], 338 + &s3c24xx_dclk->dclk1_div_change_nb); 339 + if (ret) 340 + goto err_dclk_notify; 341 + 342 + return 0; 343 + 344 + err_dclk_notify: 345 + clk_notifier_unregister(clk_table[DIV_DCLK0], 346 + &s3c24xx_dclk->dclk0_div_change_nb); 347 + err_clk_register: 348 + for (i = 0; i < DCLK_MAX_CLKS; i++) 349 + if (clk_table[i] && !IS_ERR(clk_table[i])) 350 + clk_unregister(clk_table[i]); 351 + 352 + return ret; 353 + } 354 + 355 + static int s3c24xx_dclk_remove(struct platform_device *pdev) 356 + { 357 + struct s3c24xx_dclk *s3c24xx_dclk = platform_get_drvdata(pdev); 358 + struct clk **clk_table = s3c24xx_dclk->clk_data.clks; 359 + int i; 360 + 361 + clk_notifier_unregister(clk_table[DIV_DCLK1], 362 + &s3c24xx_dclk->dclk1_div_change_nb); 363 + clk_notifier_unregister(clk_table[DIV_DCLK0], 364 + &s3c24xx_dclk->dclk0_div_change_nb); 365 + 366 + for (i = 0; i < DCLK_MAX_CLKS; i++) 367 + clk_unregister(clk_table[i]); 368 + 369 + return 0; 370 + } 371 + 372 + static struct s3c24xx_dclk_drv_data dclk_variants[] = { 373 + [S3C2410] = { 374 + .clkout0_parent_names = clkout0_s3c2410_p, 375 + .clkout0_num_parents = ARRAY_SIZE(clkout0_s3c2410_p), 376 + .clkout1_parent_names = clkout1_s3c2410_p, 377 + .clkout1_num_parents = ARRAY_SIZE(clkout1_s3c2410_p), 378 + .mux_parent_names = dclk_s3c2410_p, 379 + .mux_num_parents = ARRAY_SIZE(dclk_s3c2410_p), 380 + }, 381 + [S3C2412] = { 382 + .clkout0_parent_names = clkout0_s3c2412_p, 383 + .clkout0_num_parents = ARRAY_SIZE(clkout0_s3c2412_p), 384 + .clkout1_parent_names = clkout1_s3c2412_p, 385 + .clkout1_num_parents = ARRAY_SIZE(clkout1_s3c2412_p), 386 + .mux_parent_names = dclk_s3c2410_p, 387 + .mux_num_parents = ARRAY_SIZE(dclk_s3c2410_p), 388 + }, 389 + [S3C2440] = { 390 + .clkout0_parent_names = clkout0_s3c2440_p, 391 + .clkout0_num_parents = ARRAY_SIZE(clkout0_s3c2440_p), 392 + .clkout1_parent_names = clkout1_s3c2440_p, 393 + .clkout1_num_parents = ARRAY_SIZE(clkout1_s3c2440_p), 394 + .mux_parent_names = dclk_s3c2410_p, 395 + .mux_num_parents = ARRAY_SIZE(dclk_s3c2410_p), 396 + }, 397 + [S3C2443] = { 398 + .clkout0_parent_names = clkout0_s3c2443_p, 399 + .clkout0_num_parents = ARRAY_SIZE(clkout0_s3c2443_p), 400 + .clkout1_parent_names = clkout1_s3c2443_p, 401 + .clkout1_num_parents = ARRAY_SIZE(clkout1_s3c2443_p), 402 + .mux_parent_names = dclk_s3c2443_p, 403 + .mux_num_parents = ARRAY_SIZE(dclk_s3c2443_p), 404 + }, 405 + }; 406 + 407 + static struct platform_device_id s3c24xx_dclk_driver_ids[] = { 408 + { 409 + .name = "s3c2410-dclk", 410 + .driver_data = (kernel_ulong_t)&dclk_variants[S3C2410], 411 + }, { 412 + .name = "s3c2412-dclk", 413 + .driver_data = (kernel_ulong_t)&dclk_variants[S3C2412], 414 + }, { 415 + .name = "s3c2440-dclk", 416 + .driver_data = (kernel_ulong_t)&dclk_variants[S3C2440], 417 + }, { 418 + .name = "s3c2443-dclk", 419 + .driver_data = (kernel_ulong_t)&dclk_variants[S3C2443], 420 + }, 421 + { } 422 + }; 423 + 424 + MODULE_DEVICE_TABLE(platform, s3c24xx_dclk_driver_ids); 425 + 426 + static struct platform_driver s3c24xx_dclk_driver = { 427 + .driver = { 428 + .name = "s3c24xx-dclk", 429 + .owner = THIS_MODULE, 430 + .pm = &s3c24xx_dclk_pm_ops, 431 + }, 432 + .probe = s3c24xx_dclk_probe, 433 + .remove = s3c24xx_dclk_remove, 434 + .id_table = s3c24xx_dclk_driver_ids, 435 + }; 436 + module_platform_driver(s3c24xx_dclk_driver); 437 + 438 + MODULE_LICENSE("GPL v2"); 439 + MODULE_AUTHOR("Heiko Stuebner <heiko@sntech.de>"); 440 + MODULE_DESCRIPTION("Driver for the S3C24XX external clock outputs");
+482
drivers/clk/samsung/clk-s3c2410.c
··· 1 + /* 2 + * Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de> 3 + * 4 + * This program is free software; you can redistribute it and/or modify 5 + * it under the terms of the GNU General Public License version 2 as 6 + * published by the Free Software Foundation. 7 + * 8 + * Common Clock Framework support for S3C2410 and following SoCs. 9 + */ 10 + 11 + #include <linux/clk.h> 12 + #include <linux/clkdev.h> 13 + #include <linux/clk-provider.h> 14 + #include <linux/of.h> 15 + #include <linux/of_address.h> 16 + #include <linux/syscore_ops.h> 17 + 18 + #include <dt-bindings/clock/s3c2410.h> 19 + 20 + #include "clk.h" 21 + #include "clk-pll.h" 22 + 23 + #define LOCKTIME 0x00 24 + #define MPLLCON 0x04 25 + #define UPLLCON 0x08 26 + #define CLKCON 0x0c 27 + #define CLKSLOW 0x10 28 + #define CLKDIVN 0x14 29 + #define CAMDIVN 0x18 30 + 31 + /* the soc types */ 32 + enum supported_socs { 33 + S3C2410, 34 + S3C2440, 35 + S3C2442, 36 + }; 37 + 38 + /* list of PLLs to be registered */ 39 + enum s3c2410_plls { 40 + mpll, upll, 41 + }; 42 + 43 + static void __iomem *reg_base; 44 + 45 + #ifdef CONFIG_PM_SLEEP 46 + static struct samsung_clk_reg_dump *s3c2410_save; 47 + 48 + /* 49 + * list of controller registers to be saved and restored during a 50 + * suspend/resume cycle. 51 + */ 52 + static unsigned long s3c2410_clk_regs[] __initdata = { 53 + LOCKTIME, 54 + MPLLCON, 55 + UPLLCON, 56 + CLKCON, 57 + CLKSLOW, 58 + CLKDIVN, 59 + CAMDIVN, 60 + }; 61 + 62 + static int s3c2410_clk_suspend(void) 63 + { 64 + samsung_clk_save(reg_base, s3c2410_save, 65 + ARRAY_SIZE(s3c2410_clk_regs)); 66 + 67 + return 0; 68 + } 69 + 70 + static void s3c2410_clk_resume(void) 71 + { 72 + samsung_clk_restore(reg_base, s3c2410_save, 73 + ARRAY_SIZE(s3c2410_clk_regs)); 74 + } 75 + 76 + static struct syscore_ops s3c2410_clk_syscore_ops = { 77 + .suspend = s3c2410_clk_suspend, 78 + .resume = s3c2410_clk_resume, 79 + }; 80 + 81 + static void s3c2410_clk_sleep_init(void) 82 + { 83 + s3c2410_save = samsung_clk_alloc_reg_dump(s3c2410_clk_regs, 84 + ARRAY_SIZE(s3c2410_clk_regs)); 85 + if (!s3c2410_save) { 86 + pr_warn("%s: failed to allocate sleep save data, no sleep support!\n", 87 + __func__); 88 + return; 89 + } 90 + 91 + register_syscore_ops(&s3c2410_clk_syscore_ops); 92 + return; 93 + } 94 + #else 95 + static void s3c2410_clk_sleep_init(void) {} 96 + #endif 97 + 98 + PNAME(fclk_p) = { "mpll", "div_slow" }; 99 + 100 + struct samsung_mux_clock s3c2410_common_muxes[] __initdata = { 101 + MUX(FCLK, "fclk", fclk_p, CLKSLOW, 4, 1), 102 + }; 103 + 104 + static struct clk_div_table divslow_d[] = { 105 + { .val = 0, .div = 1 }, 106 + { .val = 1, .div = 2 }, 107 + { .val = 2, .div = 4 }, 108 + { .val = 3, .div = 6 }, 109 + { .val = 4, .div = 8 }, 110 + { .val = 5, .div = 10 }, 111 + { .val = 6, .div = 12 }, 112 + { .val = 7, .div = 14 }, 113 + { /* sentinel */ }, 114 + }; 115 + 116 + struct samsung_div_clock s3c2410_common_dividers[] __initdata = { 117 + DIV_T(0, "div_slow", "xti", CLKSLOW, 0, 3, divslow_d), 118 + DIV(PCLK, "pclk", "hclk", CLKDIVN, 0, 1), 119 + }; 120 + 121 + struct samsung_gate_clock s3c2410_common_gates[] __initdata = { 122 + GATE(PCLK_SPI, "spi", "pclk", CLKCON, 18, 0, 0), 123 + GATE(PCLK_I2S, "i2s", "pclk", CLKCON, 17, 0, 0), 124 + GATE(PCLK_I2C, "i2c", "pclk", CLKCON, 16, 0, 0), 125 + GATE(PCLK_ADC, "adc", "pclk", CLKCON, 15, 0, 0), 126 + GATE(PCLK_RTC, "rtc", "pclk", CLKCON, 14, 0, 0), 127 + GATE(PCLK_GPIO, "gpio", "pclk", CLKCON, 13, CLK_IGNORE_UNUSED, 0), 128 + GATE(PCLK_UART2, "uart2", "pclk", CLKCON, 12, 0, 0), 129 + GATE(PCLK_UART1, "uart1", "pclk", CLKCON, 11, 0, 0), 130 + GATE(PCLK_UART0, "uart0", "pclk", CLKCON, 10, 0, 0), 131 + GATE(PCLK_SDI, "sdi", "pclk", CLKCON, 9, 0, 0), 132 + GATE(PCLK_PWM, "pwm", "pclk", CLKCON, 8, 0, 0), 133 + GATE(HCLK_USBD, "usb-device", "hclk", CLKCON, 7, 0, 0), 134 + GATE(HCLK_USBH, "usb-host", "hclk", CLKCON, 6, 0, 0), 135 + GATE(HCLK_LCD, "lcd", "hclk", CLKCON, 5, 0, 0), 136 + GATE(HCLK_NAND, "nand", "hclk", CLKCON, 4, 0, 0), 137 + }; 138 + 139 + /* should be added _after_ the soc-specific clocks are created */ 140 + struct samsung_clock_alias s3c2410_common_aliases[] __initdata = { 141 + ALIAS(PCLK_I2C, "s3c2410-i2c.0", "i2c"), 142 + ALIAS(PCLK_ADC, NULL, "adc"), 143 + ALIAS(PCLK_RTC, NULL, "rtc"), 144 + ALIAS(PCLK_PWM, NULL, "timers"), 145 + ALIAS(HCLK_LCD, NULL, "lcd"), 146 + ALIAS(HCLK_USBD, NULL, "usb-device"), 147 + ALIAS(HCLK_USBH, NULL, "usb-host"), 148 + ALIAS(UCLK, NULL, "usb-bus-host"), 149 + ALIAS(UCLK, NULL, "usb-bus-gadget"), 150 + ALIAS(ARMCLK, NULL, "armclk"), 151 + ALIAS(UCLK, NULL, "uclk"), 152 + ALIAS(HCLK, NULL, "hclk"), 153 + ALIAS(MPLL, NULL, "mpll"), 154 + ALIAS(FCLK, NULL, "fclk"), 155 + }; 156 + 157 + /* S3C2410 specific clocks */ 158 + 159 + static struct samsung_pll_rate_table pll_s3c2410_12mhz_tbl[] __initdata = { 160 + /* sorted in descending order */ 161 + /* 2410A extras */ 162 + PLL_35XX_RATE(270000000, 127, 1, 1), 163 + PLL_35XX_RATE(268000000, 126, 1, 1), 164 + PLL_35XX_RATE(266000000, 125, 1, 1), 165 + PLL_35XX_RATE(226000000, 105, 1, 1), 166 + PLL_35XX_RATE(210000000, 132, 2, 1), 167 + /* 2410 common */ 168 + PLL_35XX_RATE(203000000, 161, 3, 1), 169 + PLL_35XX_RATE(192000000, 88, 1, 1), 170 + PLL_35XX_RATE(186000000, 85, 1, 1), 171 + PLL_35XX_RATE(180000000, 82, 1, 1), 172 + PLL_35XX_RATE(170000000, 77, 1, 1), 173 + PLL_35XX_RATE(158000000, 71, 1, 1), 174 + PLL_35XX_RATE(152000000, 68, 1, 1), 175 + PLL_35XX_RATE(147000000, 90, 2, 1), 176 + PLL_35XX_RATE(135000000, 82, 2, 1), 177 + PLL_35XX_RATE(124000000, 116, 1, 2), 178 + PLL_35XX_RATE(118000000, 150, 2, 2), 179 + PLL_35XX_RATE(113000000, 105, 1, 2), 180 + PLL_35XX_RATE(101000000, 127, 2, 2), 181 + PLL_35XX_RATE(90000000, 112, 2, 2), 182 + PLL_35XX_RATE(85000000, 105, 2, 2), 183 + PLL_35XX_RATE(79000000, 71, 1, 2), 184 + PLL_35XX_RATE(68000000, 82, 2, 2), 185 + PLL_35XX_RATE(56000000, 142, 2, 3), 186 + PLL_35XX_RATE(48000000, 120, 2, 3), 187 + PLL_35XX_RATE(51000000, 161, 3, 3), 188 + PLL_35XX_RATE(45000000, 82, 1, 3), 189 + PLL_35XX_RATE(34000000, 82, 2, 3), 190 + { /* sentinel */ }, 191 + }; 192 + 193 + static struct samsung_pll_clock s3c2410_plls[] __initdata = { 194 + [mpll] = PLL(pll_s3c2410_mpll, MPLL, "mpll", "xti", 195 + LOCKTIME, MPLLCON, NULL), 196 + [upll] = PLL(pll_s3c2410_upll, UPLL, "upll", "xti", 197 + LOCKTIME, UPLLCON, NULL), 198 + }; 199 + 200 + struct samsung_div_clock s3c2410_dividers[] __initdata = { 201 + DIV(HCLK, "hclk", "mpll", CLKDIVN, 1, 1), 202 + }; 203 + 204 + struct samsung_fixed_factor_clock s3c2410_ffactor[] __initdata = { 205 + /* 206 + * armclk is directly supplied by the fclk, without 207 + * switching possibility like on the s3c244x below. 208 + */ 209 + FFACTOR(ARMCLK, "armclk", "fclk", 1, 1, 0), 210 + 211 + /* uclk is fed from the unmodified upll */ 212 + FFACTOR(UCLK, "uclk", "upll", 1, 1, 0), 213 + }; 214 + 215 + struct samsung_clock_alias s3c2410_aliases[] __initdata = { 216 + ALIAS(PCLK_UART0, "s3c2410-uart.0", "uart"), 217 + ALIAS(PCLK_UART1, "s3c2410-uart.1", "uart"), 218 + ALIAS(PCLK_UART2, "s3c2410-uart.2", "uart"), 219 + ALIAS(PCLK_UART0, "s3c2410-uart.0", "clk_uart_baud0"), 220 + ALIAS(PCLK_UART1, "s3c2410-uart.1", "clk_uart_baud0"), 221 + ALIAS(PCLK_UART2, "s3c2410-uart.2", "clk_uart_baud0"), 222 + ALIAS(UCLK, NULL, "clk_uart_baud1"), 223 + }; 224 + 225 + /* S3C244x specific clocks */ 226 + 227 + static struct samsung_pll_rate_table pll_s3c244x_12mhz_tbl[] __initdata = { 228 + /* sorted in descending order */ 229 + PLL_35XX_RATE(400000000, 0x5c, 1, 1), 230 + PLL_35XX_RATE(390000000, 0x7a, 2, 1), 231 + PLL_35XX_RATE(380000000, 0x57, 1, 1), 232 + PLL_35XX_RATE(370000000, 0xb1, 4, 1), 233 + PLL_35XX_RATE(360000000, 0x70, 2, 1), 234 + PLL_35XX_RATE(350000000, 0xa7, 4, 1), 235 + PLL_35XX_RATE(340000000, 0x4d, 1, 1), 236 + PLL_35XX_RATE(330000000, 0x66, 2, 1), 237 + PLL_35XX_RATE(320000000, 0x98, 4, 1), 238 + PLL_35XX_RATE(310000000, 0x93, 4, 1), 239 + PLL_35XX_RATE(300000000, 0x75, 3, 1), 240 + PLL_35XX_RATE(240000000, 0x70, 1, 2), 241 + PLL_35XX_RATE(230000000, 0x6b, 1, 2), 242 + PLL_35XX_RATE(220000000, 0x66, 1, 2), 243 + PLL_35XX_RATE(210000000, 0x84, 2, 2), 244 + PLL_35XX_RATE(200000000, 0x5c, 1, 2), 245 + PLL_35XX_RATE(190000000, 0x57, 1, 2), 246 + PLL_35XX_RATE(180000000, 0x70, 2, 2), 247 + PLL_35XX_RATE(170000000, 0x4d, 1, 2), 248 + PLL_35XX_RATE(160000000, 0x98, 4, 2), 249 + PLL_35XX_RATE(150000000, 0x75, 3, 2), 250 + PLL_35XX_RATE(120000000, 0x70, 1, 3), 251 + PLL_35XX_RATE(110000000, 0x66, 1, 3), 252 + PLL_35XX_RATE(100000000, 0x5c, 1, 3), 253 + PLL_35XX_RATE(90000000, 0x70, 2, 3), 254 + PLL_35XX_RATE(80000000, 0x98, 4, 3), 255 + PLL_35XX_RATE(75000000, 0x75, 3, 3), 256 + { /* sentinel */ }, 257 + }; 258 + 259 + static struct samsung_pll_clock s3c244x_common_plls[] __initdata = { 260 + [mpll] = PLL(pll_s3c2440_mpll, MPLL, "mpll", "xti", 261 + LOCKTIME, MPLLCON, NULL), 262 + [upll] = PLL(pll_s3c2410_upll, UPLL, "upll", "xti", 263 + LOCKTIME, UPLLCON, NULL), 264 + }; 265 + 266 + PNAME(hclk_p) = { "fclk", "div_hclk_2", "div_hclk_4", "div_hclk_3" }; 267 + PNAME(armclk_p) = { "fclk", "hclk" }; 268 + 269 + struct samsung_mux_clock s3c244x_common_muxes[] __initdata = { 270 + MUX(HCLK, "hclk", hclk_p, CLKDIVN, 1, 2), 271 + MUX(ARMCLK, "armclk", armclk_p, CAMDIVN, 12, 1), 272 + }; 273 + 274 + struct samsung_fixed_factor_clock s3c244x_common_ffactor[] __initdata = { 275 + FFACTOR(0, "div_hclk_2", "fclk", 1, 2, 0), 276 + FFACTOR(0, "ff_cam", "div_cam", 2, 1, CLK_SET_RATE_PARENT), 277 + }; 278 + 279 + static struct clk_div_table div_hclk_4_d[] = { 280 + { .val = 0, .div = 4 }, 281 + { .val = 1, .div = 8 }, 282 + { /* sentinel */ }, 283 + }; 284 + 285 + static struct clk_div_table div_hclk_3_d[] = { 286 + { .val = 0, .div = 3 }, 287 + { .val = 1, .div = 6 }, 288 + { /* sentinel */ }, 289 + }; 290 + 291 + struct samsung_div_clock s3c244x_common_dividers[] __initdata = { 292 + DIV(UCLK, "uclk", "upll", CLKDIVN, 3, 1), 293 + DIV(0, "div_hclk", "fclk", CLKDIVN, 1, 1), 294 + DIV_T(0, "div_hclk_4", "fclk", CAMDIVN, 9, 1, div_hclk_4_d), 295 + DIV_T(0, "div_hclk_3", "fclk", CAMDIVN, 8, 1, div_hclk_3_d), 296 + DIV(0, "div_cam", "upll", CAMDIVN, 0, 3), 297 + }; 298 + 299 + struct samsung_gate_clock s3c244x_common_gates[] __initdata = { 300 + GATE(HCLK_CAM, "cam", "hclk", CLKCON, 19, 0, 0), 301 + }; 302 + 303 + struct samsung_clock_alias s3c244x_common_aliases[] __initdata = { 304 + ALIAS(PCLK_UART0, "s3c2440-uart.0", "uart"), 305 + ALIAS(PCLK_UART1, "s3c2440-uart.1", "uart"), 306 + ALIAS(PCLK_UART2, "s3c2440-uart.2", "uart"), 307 + ALIAS(PCLK_UART0, "s3c2440-uart.0", "clk_uart_baud2"), 308 + ALIAS(PCLK_UART1, "s3c2440-uart.1", "clk_uart_baud2"), 309 + ALIAS(PCLK_UART2, "s3c2440-uart.2", "clk_uart_baud2"), 310 + ALIAS(HCLK_CAM, NULL, "camif"), 311 + ALIAS(CAMIF, NULL, "camif-upll"), 312 + }; 313 + 314 + /* S3C2440 specific clocks */ 315 + 316 + PNAME(s3c2440_camif_p) = { "upll", "ff_cam" }; 317 + 318 + struct samsung_mux_clock s3c2440_muxes[] __initdata = { 319 + MUX(CAMIF, "camif", s3c2440_camif_p, CAMDIVN, 4, 1), 320 + }; 321 + 322 + struct samsung_gate_clock s3c2440_gates[] __initdata = { 323 + GATE(PCLK_AC97, "ac97", "pclk", CLKCON, 20, 0, 0), 324 + }; 325 + 326 + /* S3C2442 specific clocks */ 327 + 328 + struct samsung_fixed_factor_clock s3c2442_ffactor[] __initdata = { 329 + FFACTOR(0, "upll_3", "upll", 1, 3, 0), 330 + }; 331 + 332 + PNAME(s3c2442_camif_p) = { "upll", "ff_cam", "upll", "upll_3" }; 333 + 334 + struct samsung_mux_clock s3c2442_muxes[] __initdata = { 335 + MUX(CAMIF, "camif", s3c2442_camif_p, CAMDIVN, 4, 2), 336 + }; 337 + 338 + /* 339 + * fixed rate clocks generated outside the soc 340 + * Only necessary until the devicetree-move is complete 341 + */ 342 + #define XTI 1 343 + struct samsung_fixed_rate_clock s3c2410_common_frate_clks[] __initdata = { 344 + FRATE(XTI, "xti", NULL, CLK_IS_ROOT, 0), 345 + }; 346 + 347 + static void __init s3c2410_common_clk_register_fixed_ext( 348 + struct samsung_clk_provider *ctx, 349 + unsigned long xti_f) 350 + { 351 + struct samsung_clock_alias xti_alias = ALIAS(XTI, NULL, "xtal"); 352 + 353 + s3c2410_common_frate_clks[0].fixed_rate = xti_f; 354 + samsung_clk_register_fixed_rate(ctx, s3c2410_common_frate_clks, 355 + ARRAY_SIZE(s3c2410_common_frate_clks)); 356 + 357 + samsung_clk_register_alias(ctx, &xti_alias, 1); 358 + } 359 + 360 + void __init s3c2410_common_clk_init(struct device_node *np, unsigned long xti_f, 361 + int current_soc, 362 + void __iomem *base) 363 + { 364 + struct samsung_clk_provider *ctx; 365 + reg_base = base; 366 + 367 + if (np) { 368 + reg_base = of_iomap(np, 0); 369 + if (!reg_base) 370 + panic("%s: failed to map registers\n", __func__); 371 + } 372 + 373 + ctx = samsung_clk_init(np, reg_base, NR_CLKS); 374 + if (!ctx) 375 + panic("%s: unable to allocate context.\n", __func__); 376 + 377 + /* Register external clocks only in non-dt cases */ 378 + if (!np) 379 + s3c2410_common_clk_register_fixed_ext(ctx, xti_f); 380 + 381 + if (current_soc == 2410) { 382 + if (_get_rate("xti") == 12 * MHZ) { 383 + s3c2410_plls[mpll].rate_table = pll_s3c2410_12mhz_tbl; 384 + s3c2410_plls[upll].rate_table = pll_s3c2410_12mhz_tbl; 385 + } 386 + 387 + /* Register PLLs. */ 388 + samsung_clk_register_pll(ctx, s3c2410_plls, 389 + ARRAY_SIZE(s3c2410_plls), reg_base); 390 + 391 + } else { /* S3C2440, S3C2442 */ 392 + if (_get_rate("xti") == 12 * MHZ) { 393 + /* 394 + * plls follow different calculation schemes, with the 395 + * upll following the same scheme as the s3c2410 plls 396 + */ 397 + s3c244x_common_plls[mpll].rate_table = 398 + pll_s3c244x_12mhz_tbl; 399 + s3c244x_common_plls[upll].rate_table = 400 + pll_s3c2410_12mhz_tbl; 401 + } 402 + 403 + /* Register PLLs. */ 404 + samsung_clk_register_pll(ctx, s3c244x_common_plls, 405 + ARRAY_SIZE(s3c244x_common_plls), reg_base); 406 + } 407 + 408 + /* Register common internal clocks. */ 409 + samsung_clk_register_mux(ctx, s3c2410_common_muxes, 410 + ARRAY_SIZE(s3c2410_common_muxes)); 411 + samsung_clk_register_div(ctx, s3c2410_common_dividers, 412 + ARRAY_SIZE(s3c2410_common_dividers)); 413 + samsung_clk_register_gate(ctx, s3c2410_common_gates, 414 + ARRAY_SIZE(s3c2410_common_gates)); 415 + 416 + if (current_soc == S3C2440 || current_soc == S3C2442) { 417 + samsung_clk_register_div(ctx, s3c244x_common_dividers, 418 + ARRAY_SIZE(s3c244x_common_dividers)); 419 + samsung_clk_register_gate(ctx, s3c244x_common_gates, 420 + ARRAY_SIZE(s3c244x_common_gates)); 421 + samsung_clk_register_mux(ctx, s3c244x_common_muxes, 422 + ARRAY_SIZE(s3c244x_common_muxes)); 423 + samsung_clk_register_fixed_factor(ctx, s3c244x_common_ffactor, 424 + ARRAY_SIZE(s3c244x_common_ffactor)); 425 + } 426 + 427 + /* Register SoC-specific clocks. */ 428 + switch (current_soc) { 429 + case S3C2410: 430 + samsung_clk_register_div(ctx, s3c2410_dividers, 431 + ARRAY_SIZE(s3c2410_dividers)); 432 + samsung_clk_register_fixed_factor(ctx, s3c2410_ffactor, 433 + ARRAY_SIZE(s3c2410_ffactor)); 434 + samsung_clk_register_alias(ctx, s3c2410_aliases, 435 + ARRAY_SIZE(s3c2410_common_aliases)); 436 + break; 437 + case S3C2440: 438 + samsung_clk_register_mux(ctx, s3c2440_muxes, 439 + ARRAY_SIZE(s3c2440_muxes)); 440 + samsung_clk_register_gate(ctx, s3c2440_gates, 441 + ARRAY_SIZE(s3c2440_gates)); 442 + break; 443 + case S3C2442: 444 + samsung_clk_register_mux(ctx, s3c2442_muxes, 445 + ARRAY_SIZE(s3c2442_muxes)); 446 + samsung_clk_register_fixed_factor(ctx, s3c2442_ffactor, 447 + ARRAY_SIZE(s3c2442_ffactor)); 448 + break; 449 + } 450 + 451 + /* 452 + * Register common aliases at the end, as some of the aliased clocks 453 + * are SoC specific. 454 + */ 455 + samsung_clk_register_alias(ctx, s3c2410_common_aliases, 456 + ARRAY_SIZE(s3c2410_common_aliases)); 457 + 458 + if (current_soc == S3C2440 || current_soc == S3C2442) { 459 + samsung_clk_register_alias(ctx, s3c244x_common_aliases, 460 + ARRAY_SIZE(s3c244x_common_aliases)); 461 + } 462 + 463 + s3c2410_clk_sleep_init(); 464 + } 465 + 466 + static void __init s3c2410_clk_init(struct device_node *np) 467 + { 468 + s3c2410_common_clk_init(np, 0, S3C2410, 0); 469 + } 470 + CLK_OF_DECLARE(s3c2410_clk, "samsung,s3c2410-clock", s3c2410_clk_init); 471 + 472 + static void __init s3c2440_clk_init(struct device_node *np) 473 + { 474 + s3c2410_common_clk_init(np, 0, S3C2440, 0); 475 + } 476 + CLK_OF_DECLARE(s3c2440_clk, "samsung,s3c2440-clock", s3c2440_clk_init); 477 + 478 + static void __init s3c2442_clk_init(struct device_node *np) 479 + { 480 + s3c2410_common_clk_init(np, 0, S3C2442, 0); 481 + } 482 + CLK_OF_DECLARE(s3c2442_clk, "samsung,s3c2442-clock", s3c2442_clk_init);
+274
drivers/clk/samsung/clk-s3c2412.c
··· 1 + /* 2 + * Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de> 3 + * 4 + * This program is free software; you can redistribute it and/or modify 5 + * it under the terms of the GNU General Public License version 2 as 6 + * published by the Free Software Foundation. 7 + * 8 + * Common Clock Framework support for S3C2412 and S3C2413. 9 + */ 10 + 11 + #include <linux/clk.h> 12 + #include <linux/clkdev.h> 13 + #include <linux/clk-provider.h> 14 + #include <linux/of.h> 15 + #include <linux/of_address.h> 16 + #include <linux/syscore_ops.h> 17 + 18 + #include <dt-bindings/clock/s3c2412.h> 19 + 20 + #include "clk.h" 21 + #include "clk-pll.h" 22 + 23 + #define LOCKTIME 0x00 24 + #define MPLLCON 0x04 25 + #define UPLLCON 0x08 26 + #define CLKCON 0x0c 27 + #define CLKDIVN 0x14 28 + #define CLKSRC 0x1c 29 + 30 + /* list of PLLs to be registered */ 31 + enum s3c2412_plls { 32 + mpll, upll, 33 + }; 34 + 35 + static void __iomem *reg_base; 36 + 37 + #ifdef CONFIG_PM_SLEEP 38 + static struct samsung_clk_reg_dump *s3c2412_save; 39 + 40 + /* 41 + * list of controller registers to be saved and restored during a 42 + * suspend/resume cycle. 43 + */ 44 + static unsigned long s3c2412_clk_regs[] __initdata = { 45 + LOCKTIME, 46 + MPLLCON, 47 + UPLLCON, 48 + CLKCON, 49 + CLKDIVN, 50 + CLKSRC, 51 + }; 52 + 53 + static int s3c2412_clk_suspend(void) 54 + { 55 + samsung_clk_save(reg_base, s3c2412_save, 56 + ARRAY_SIZE(s3c2412_clk_regs)); 57 + 58 + return 0; 59 + } 60 + 61 + static void s3c2412_clk_resume(void) 62 + { 63 + samsung_clk_restore(reg_base, s3c2412_save, 64 + ARRAY_SIZE(s3c2412_clk_regs)); 65 + } 66 + 67 + static struct syscore_ops s3c2412_clk_syscore_ops = { 68 + .suspend = s3c2412_clk_suspend, 69 + .resume = s3c2412_clk_resume, 70 + }; 71 + 72 + static void s3c2412_clk_sleep_init(void) 73 + { 74 + s3c2412_save = samsung_clk_alloc_reg_dump(s3c2412_clk_regs, 75 + ARRAY_SIZE(s3c2412_clk_regs)); 76 + if (!s3c2412_save) { 77 + pr_warn("%s: failed to allocate sleep save data, no sleep support!\n", 78 + __func__); 79 + return; 80 + } 81 + 82 + register_syscore_ops(&s3c2412_clk_syscore_ops); 83 + return; 84 + } 85 + #else 86 + static void s3c2412_clk_sleep_init(void) {} 87 + #endif 88 + 89 + static struct clk_div_table divxti_d[] = { 90 + { .val = 0, .div = 1 }, 91 + { .val = 1, .div = 2 }, 92 + { .val = 2, .div = 4 }, 93 + { .val = 3, .div = 6 }, 94 + { .val = 4, .div = 8 }, 95 + { .val = 5, .div = 10 }, 96 + { .val = 6, .div = 12 }, 97 + { .val = 7, .div = 14 }, 98 + { /* sentinel */ }, 99 + }; 100 + 101 + struct samsung_div_clock s3c2412_dividers[] __initdata = { 102 + DIV_T(0, "div_xti", "xti", CLKSRC, 0, 3, divxti_d), 103 + DIV(0, "div_cam", "mux_cam", CLKDIVN, 16, 4), 104 + DIV(0, "div_i2s", "mux_i2s", CLKDIVN, 12, 4), 105 + DIV(0, "div_uart", "mux_uart", CLKDIVN, 8, 4), 106 + DIV(0, "div_usb", "mux_usb", CLKDIVN, 6, 1), 107 + DIV(0, "div_hclk_half", "hclk", CLKDIVN, 5, 1), 108 + DIV(ARMDIV, "armdiv", "msysclk", CLKDIVN, 3, 1), 109 + DIV(PCLK, "pclk", "hclk", CLKDIVN, 2, 1), 110 + DIV(HCLK, "hclk", "armdiv", CLKDIVN, 0, 2), 111 + }; 112 + 113 + struct samsung_fixed_factor_clock s3c2412_ffactor[] __initdata = { 114 + FFACTOR(0, "ff_hclk", "hclk", 2, 1, CLK_SET_RATE_PARENT), 115 + }; 116 + 117 + /* 118 + * The first two use the OM[4] setting, which is not readable from 119 + * software, so assume it is set to xti. 120 + */ 121 + PNAME(erefclk_p) = { "xti", "xti", "xti", "ext" }; 122 + PNAME(urefclk_p) = { "xti", "xti", "xti", "ext" }; 123 + 124 + PNAME(camclk_p) = { "usysclk", "hclk" }; 125 + PNAME(usbclk_p) = { "usysclk", "hclk" }; 126 + PNAME(i2sclk_p) = { "erefclk", "mpll" }; 127 + PNAME(uartclk_p) = { "erefclk", "mpll" }; 128 + PNAME(usysclk_p) = { "urefclk", "upll" }; 129 + PNAME(msysclk_p) = { "mdivclk", "mpll" }; 130 + PNAME(mdivclk_p) = { "xti", "div_xti" }; 131 + PNAME(armclk_p) = { "armdiv", "hclk" }; 132 + 133 + struct samsung_mux_clock s3c2412_muxes[] __initdata = { 134 + MUX(0, "erefclk", erefclk_p, CLKSRC, 14, 2), 135 + MUX(0, "urefclk", urefclk_p, CLKSRC, 12, 2), 136 + MUX(0, "mux_cam", camclk_p, CLKSRC, 11, 1), 137 + MUX(0, "mux_usb", usbclk_p, CLKSRC, 10, 1), 138 + MUX(0, "mux_i2s", i2sclk_p, CLKSRC, 9, 1), 139 + MUX(0, "mux_uart", uartclk_p, CLKSRC, 8, 1), 140 + MUX(USYSCLK, "usysclk", usysclk_p, CLKSRC, 5, 1), 141 + MUX(MSYSCLK, "msysclk", msysclk_p, CLKSRC, 4, 1), 142 + MUX(MDIVCLK, "mdivclk", mdivclk_p, CLKSRC, 3, 1), 143 + MUX(ARMCLK, "armclk", armclk_p, CLKDIVN, 4, 1), 144 + }; 145 + 146 + static struct samsung_pll_clock s3c2412_plls[] __initdata = { 147 + [mpll] = PLL(pll_s3c2440_mpll, MPLL, "mpll", "xti", 148 + LOCKTIME, MPLLCON, NULL), 149 + [upll] = PLL(pll_s3c2410_upll, UPLL, "upll", "urefclk", 150 + LOCKTIME, UPLLCON, NULL), 151 + }; 152 + 153 + struct samsung_gate_clock s3c2412_gates[] __initdata = { 154 + GATE(PCLK_WDT, "wdt", "pclk", CLKCON, 28, 0, 0), 155 + GATE(PCLK_SPI, "spi", "pclk", CLKCON, 27, 0, 0), 156 + GATE(PCLK_I2S, "i2s", "pclk", CLKCON, 26, 0, 0), 157 + GATE(PCLK_I2C, "i2c", "pclk", CLKCON, 25, 0, 0), 158 + GATE(PCLK_ADC, "adc", "pclk", CLKCON, 24, 0, 0), 159 + GATE(PCLK_RTC, "rtc", "pclk", CLKCON, 23, 0, 0), 160 + GATE(PCLK_GPIO, "gpio", "pclk", CLKCON, 22, CLK_IGNORE_UNUSED, 0), 161 + GATE(PCLK_UART2, "uart2", "pclk", CLKCON, 21, 0, 0), 162 + GATE(PCLK_UART1, "uart1", "pclk", CLKCON, 20, 0, 0), 163 + GATE(PCLK_UART0, "uart0", "pclk", CLKCON, 19, 0, 0), 164 + GATE(PCLK_SDI, "sdi", "pclk", CLKCON, 18, 0, 0), 165 + GATE(PCLK_PWM, "pwm", "pclk", CLKCON, 17, 0, 0), 166 + GATE(PCLK_USBD, "usb-device", "pclk", CLKCON, 16, 0, 0), 167 + GATE(SCLK_CAM, "sclk_cam", "div_cam", CLKCON, 15, 0, 0), 168 + GATE(SCLK_UART, "sclk_uart", "div_uart", CLKCON, 14, 0, 0), 169 + GATE(SCLK_I2S, "sclk_i2s", "div_i2s", CLKCON, 13, 0, 0), 170 + GATE(SCLK_USBH, "sclk_usbh", "div_usb", CLKCON, 12, 0, 0), 171 + GATE(SCLK_USBD, "sclk_usbd", "div_usb", CLKCON, 11, 0, 0), 172 + GATE(HCLK_HALF, "hclk_half", "div_hclk_half", CLKCON, 10, CLK_IGNORE_UNUSED, 0), 173 + GATE(HCLK_X2, "hclkx2", "ff_hclk", CLKCON, 9, CLK_IGNORE_UNUSED, 0), 174 + GATE(HCLK_SDRAM, "sdram", "hclk", CLKCON, 8, CLK_IGNORE_UNUSED, 0), 175 + GATE(HCLK_USBH, "usb-host", "hclk", CLKCON, 6, 0, 0), 176 + GATE(HCLK_LCD, "lcd", "hclk", CLKCON, 5, 0, 0), 177 + GATE(HCLK_NAND, "nand", "hclk", CLKCON, 4, 0, 0), 178 + GATE(HCLK_DMA3, "dma3", "hclk", CLKCON, 3, CLK_IGNORE_UNUSED, 0), 179 + GATE(HCLK_DMA2, "dma2", "hclk", CLKCON, 2, CLK_IGNORE_UNUSED, 0), 180 + GATE(HCLK_DMA1, "dma1", "hclk", CLKCON, 1, CLK_IGNORE_UNUSED, 0), 181 + GATE(HCLK_DMA0, "dma0", "hclk", CLKCON, 0, CLK_IGNORE_UNUSED, 0), 182 + }; 183 + 184 + struct samsung_clock_alias s3c2412_aliases[] __initdata = { 185 + ALIAS(PCLK_UART0, "s3c2412-uart.0", "uart"), 186 + ALIAS(PCLK_UART1, "s3c2412-uart.1", "uart"), 187 + ALIAS(PCLK_UART2, "s3c2412-uart.2", "uart"), 188 + ALIAS(PCLK_UART0, "s3c2412-uart.0", "clk_uart_baud2"), 189 + ALIAS(PCLK_UART1, "s3c2412-uart.1", "clk_uart_baud2"), 190 + ALIAS(PCLK_UART2, "s3c2412-uart.2", "clk_uart_baud2"), 191 + ALIAS(SCLK_UART, NULL, "clk_uart_baud3"), 192 + ALIAS(PCLK_I2C, "s3c2410-i2c.0", "i2c"), 193 + ALIAS(PCLK_ADC, NULL, "adc"), 194 + ALIAS(PCLK_RTC, NULL, "rtc"), 195 + ALIAS(PCLK_PWM, NULL, "timers"), 196 + ALIAS(HCLK_LCD, NULL, "lcd"), 197 + ALIAS(PCLK_USBD, NULL, "usb-device"), 198 + ALIAS(SCLK_USBD, NULL, "usb-bus-gadget"), 199 + ALIAS(HCLK_USBH, NULL, "usb-host"), 200 + ALIAS(SCLK_USBH, NULL, "usb-bus-host"), 201 + ALIAS(ARMCLK, NULL, "armclk"), 202 + ALIAS(HCLK, NULL, "hclk"), 203 + ALIAS(MPLL, NULL, "mpll"), 204 + ALIAS(MSYSCLK, NULL, "fclk"), 205 + }; 206 + 207 + /* 208 + * fixed rate clocks generated outside the soc 209 + * Only necessary until the devicetree-move is complete 210 + */ 211 + #define XTI 1 212 + struct samsung_fixed_rate_clock s3c2412_common_frate_clks[] __initdata = { 213 + FRATE(XTI, "xti", NULL, CLK_IS_ROOT, 0), 214 + FRATE(0, "ext", NULL, CLK_IS_ROOT, 0), 215 + }; 216 + 217 + static void __init s3c2412_common_clk_register_fixed_ext( 218 + struct samsung_clk_provider *ctx, 219 + unsigned long xti_f, unsigned long ext_f) 220 + { 221 + /* xtal alias is necessary for the current cpufreq driver */ 222 + struct samsung_clock_alias xti_alias = ALIAS(XTI, NULL, "xtal"); 223 + 224 + s3c2412_common_frate_clks[0].fixed_rate = xti_f; 225 + s3c2412_common_frate_clks[1].fixed_rate = ext_f; 226 + samsung_clk_register_fixed_rate(ctx, s3c2412_common_frate_clks, 227 + ARRAY_SIZE(s3c2412_common_frate_clks)); 228 + 229 + samsung_clk_register_alias(ctx, &xti_alias, 1); 230 + } 231 + 232 + void __init s3c2412_common_clk_init(struct device_node *np, unsigned long xti_f, 233 + unsigned long ext_f, void __iomem *base) 234 + { 235 + struct samsung_clk_provider *ctx; 236 + reg_base = base; 237 + 238 + if (np) { 239 + reg_base = of_iomap(np, 0); 240 + if (!reg_base) 241 + panic("%s: failed to map registers\n", __func__); 242 + } 243 + 244 + ctx = samsung_clk_init(np, reg_base, NR_CLKS); 245 + if (!ctx) 246 + panic("%s: unable to allocate context.\n", __func__); 247 + 248 + /* Register external clocks only in non-dt cases */ 249 + if (!np) 250 + s3c2412_common_clk_register_fixed_ext(ctx, xti_f, ext_f); 251 + 252 + /* Register PLLs. */ 253 + samsung_clk_register_pll(ctx, s3c2412_plls, ARRAY_SIZE(s3c2412_plls), 254 + reg_base); 255 + 256 + /* Register common internal clocks. */ 257 + samsung_clk_register_mux(ctx, s3c2412_muxes, ARRAY_SIZE(s3c2412_muxes)); 258 + samsung_clk_register_div(ctx, s3c2412_dividers, 259 + ARRAY_SIZE(s3c2412_dividers)); 260 + samsung_clk_register_gate(ctx, s3c2412_gates, 261 + ARRAY_SIZE(s3c2412_gates)); 262 + samsung_clk_register_fixed_factor(ctx, s3c2412_ffactor, 263 + ARRAY_SIZE(s3c2412_ffactor)); 264 + samsung_clk_register_alias(ctx, s3c2412_aliases, 265 + ARRAY_SIZE(s3c2412_aliases)); 266 + 267 + s3c2412_clk_sleep_init(); 268 + } 269 + 270 + static void __init s3c2412_clk_init(struct device_node *np) 271 + { 272 + s3c2412_common_clk_init(np, 0, 0, 0); 273 + } 274 + CLK_OF_DECLARE(s3c2412_clk, "samsung,s3c2412-clock", s3c2412_clk_init);
+466
drivers/clk/samsung/clk-s3c2443.c
··· 1 + /* 2 + * Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de> 3 + * 4 + * This program is free software; you can redistribute it and/or modify 5 + * it under the terms of the GNU General Public License version 2 as 6 + * published by the Free Software Foundation. 7 + * 8 + * Common Clock Framework support for S3C2443 and following SoCs. 9 + */ 10 + 11 + #include <linux/clk.h> 12 + #include <linux/clkdev.h> 13 + #include <linux/clk-provider.h> 14 + #include <linux/of.h> 15 + #include <linux/of_address.h> 16 + #include <linux/syscore_ops.h> 17 + 18 + #include <dt-bindings/clock/s3c2443.h> 19 + 20 + #include "clk.h" 21 + #include "clk-pll.h" 22 + 23 + /* S3C2416 clock controller register offsets */ 24 + #define LOCKCON0 0x00 25 + #define LOCKCON1 0x04 26 + #define MPLLCON 0x10 27 + #define EPLLCON 0x18 28 + #define EPLLCON_K 0x1C 29 + #define CLKSRC 0x20 30 + #define CLKDIV0 0x24 31 + #define CLKDIV1 0x28 32 + #define CLKDIV2 0x2C 33 + #define HCLKCON 0x30 34 + #define PCLKCON 0x34 35 + #define SCLKCON 0x38 36 + 37 + /* the soc types */ 38 + enum supported_socs { 39 + S3C2416, 40 + S3C2443, 41 + S3C2450, 42 + }; 43 + 44 + /* list of PLLs to be registered */ 45 + enum s3c2443_plls { 46 + mpll, epll, 47 + }; 48 + 49 + static void __iomem *reg_base; 50 + 51 + #ifdef CONFIG_PM_SLEEP 52 + static struct samsung_clk_reg_dump *s3c2443_save; 53 + 54 + /* 55 + * list of controller registers to be saved and restored during a 56 + * suspend/resume cycle. 57 + */ 58 + static unsigned long s3c2443_clk_regs[] __initdata = { 59 + LOCKCON0, 60 + LOCKCON1, 61 + MPLLCON, 62 + EPLLCON, 63 + EPLLCON_K, 64 + CLKSRC, 65 + CLKDIV0, 66 + CLKDIV1, 67 + CLKDIV2, 68 + PCLKCON, 69 + HCLKCON, 70 + SCLKCON, 71 + }; 72 + 73 + static int s3c2443_clk_suspend(void) 74 + { 75 + samsung_clk_save(reg_base, s3c2443_save, 76 + ARRAY_SIZE(s3c2443_clk_regs)); 77 + 78 + return 0; 79 + } 80 + 81 + static void s3c2443_clk_resume(void) 82 + { 83 + samsung_clk_restore(reg_base, s3c2443_save, 84 + ARRAY_SIZE(s3c2443_clk_regs)); 85 + } 86 + 87 + static struct syscore_ops s3c2443_clk_syscore_ops = { 88 + .suspend = s3c2443_clk_suspend, 89 + .resume = s3c2443_clk_resume, 90 + }; 91 + 92 + static void s3c2443_clk_sleep_init(void) 93 + { 94 + s3c2443_save = samsung_clk_alloc_reg_dump(s3c2443_clk_regs, 95 + ARRAY_SIZE(s3c2443_clk_regs)); 96 + if (!s3c2443_save) { 97 + pr_warn("%s: failed to allocate sleep save data, no sleep support!\n", 98 + __func__); 99 + return; 100 + } 101 + 102 + register_syscore_ops(&s3c2443_clk_syscore_ops); 103 + return; 104 + } 105 + #else 106 + static void s3c2443_clk_sleep_init(void) {} 107 + #endif 108 + 109 + PNAME(epllref_p) = { "mpllref", "mpllref", "xti", "ext" }; 110 + PNAME(esysclk_p) = { "epllref", "epll" }; 111 + PNAME(mpllref_p) = { "xti", "mdivclk" }; 112 + PNAME(msysclk_p) = { "mpllref", "mpll" }; 113 + PNAME(armclk_p) = { "armdiv" , "hclk" }; 114 + PNAME(i2s0_p) = { "div_i2s0", "ext_i2s", "epllref", "epllref" }; 115 + 116 + struct samsung_mux_clock s3c2443_common_muxes[] __initdata = { 117 + MUX(0, "epllref", epllref_p, CLKSRC, 7, 2), 118 + MUX(ESYSCLK, "esysclk", esysclk_p, CLKSRC, 6, 1), 119 + MUX(0, "mpllref", mpllref_p, CLKSRC, 3, 1), 120 + MUX_A(MSYSCLK, "msysclk", msysclk_p, CLKSRC, 4, 1, "msysclk"), 121 + MUX_A(ARMCLK, "armclk", armclk_p, CLKDIV0, 13, 1, "armclk"), 122 + MUX(0, "mux_i2s0", i2s0_p, CLKSRC, 14, 2), 123 + }; 124 + 125 + static struct clk_div_table hclk_d[] = { 126 + { .val = 0, .div = 1 }, 127 + { .val = 1, .div = 2 }, 128 + { .val = 3, .div = 4 }, 129 + { /* sentinel */ }, 130 + }; 131 + 132 + static struct clk_div_table mdivclk_d[] = { 133 + { .val = 0, .div = 1 }, 134 + { .val = 1, .div = 3 }, 135 + { .val = 2, .div = 5 }, 136 + { .val = 3, .div = 7 }, 137 + { .val = 4, .div = 9 }, 138 + { .val = 5, .div = 11 }, 139 + { .val = 6, .div = 13 }, 140 + { .val = 7, .div = 15 }, 141 + { /* sentinel */ }, 142 + }; 143 + 144 + struct samsung_div_clock s3c2443_common_dividers[] __initdata = { 145 + DIV_T(0, "mdivclk", "xti", CLKDIV0, 6, 3, mdivclk_d), 146 + DIV(0, "prediv", "msysclk", CLKDIV0, 4, 2), 147 + DIV_T(HCLK, "hclk", "prediv", CLKDIV0, 0, 2, hclk_d), 148 + DIV(PCLK, "pclk", "hclk", CLKDIV0, 2, 1), 149 + DIV(0, "div_hsspi0_epll", "esysclk", CLKDIV1, 24, 2), 150 + DIV(0, "div_fimd", "esysclk", CLKDIV1, 16, 8), 151 + DIV(0, "div_i2s0", "esysclk", CLKDIV1, 12, 4), 152 + DIV(0, "div_uart", "esysclk", CLKDIV1, 8, 4), 153 + DIV(0, "div_hsmmc1", "esysclk", CLKDIV1, 6, 2), 154 + DIV(0, "div_usbhost", "esysclk", CLKDIV1, 4, 2), 155 + }; 156 + 157 + struct samsung_gate_clock s3c2443_common_gates[] __initdata = { 158 + GATE(SCLK_HSMMC_EXT, "sclk_hsmmcext", "ext", SCLKCON, 13, 0, 0), 159 + GATE(SCLK_HSMMC1, "sclk_hsmmc1", "div_hsmmc1", SCLKCON, 12, 0, 0), 160 + GATE(SCLK_FIMD, "sclk_fimd", "div_fimd", SCLKCON, 10, 0, 0), 161 + GATE(SCLK_I2S0, "sclk_i2s0", "mux_i2s0", SCLKCON, 9, 0, 0), 162 + GATE(SCLK_UART, "sclk_uart", "div_uart", SCLKCON, 8, 0, 0), 163 + GATE(SCLK_USBH, "sclk_usbhost", "div_usbhost", SCLKCON, 1, 0, 0), 164 + GATE(HCLK_DRAM, "dram", "hclk", HCLKCON, 19, CLK_IGNORE_UNUSED, 0), 165 + GATE(HCLK_SSMC, "ssmc", "hclk", HCLKCON, 18, CLK_IGNORE_UNUSED, 0), 166 + GATE(HCLK_HSMMC1, "hsmmc1", "hclk", HCLKCON, 16, 0, 0), 167 + GATE(HCLK_USBD, "usb-device", "hclk", HCLKCON, 12, 0, 0), 168 + GATE(HCLK_USBH, "usb-host", "hclk", HCLKCON, 11, 0, 0), 169 + GATE(HCLK_LCD, "lcd", "hclk", HCLKCON, 9, 0, 0), 170 + GATE(HCLK_DMA5, "dma5", "hclk", HCLKCON, 5, CLK_IGNORE_UNUSED, 0), 171 + GATE(HCLK_DMA4, "dma4", "hclk", HCLKCON, 4, CLK_IGNORE_UNUSED, 0), 172 + GATE(HCLK_DMA3, "dma3", "hclk", HCLKCON, 3, CLK_IGNORE_UNUSED, 0), 173 + GATE(HCLK_DMA2, "dma2", "hclk", HCLKCON, 2, CLK_IGNORE_UNUSED, 0), 174 + GATE(HCLK_DMA1, "dma1", "hclk", HCLKCON, 1, CLK_IGNORE_UNUSED, 0), 175 + GATE(HCLK_DMA0, "dma0", "hclk", HCLKCON, 0, CLK_IGNORE_UNUSED, 0), 176 + GATE(PCLK_GPIO, "gpio", "pclk", PCLKCON, 13, CLK_IGNORE_UNUSED, 0), 177 + GATE(PCLK_RTC, "rtc", "pclk", PCLKCON, 12, 0, 0), 178 + GATE(PCLK_WDT, "wdt", "pclk", PCLKCON, 11, 0, 0), 179 + GATE(PCLK_PWM, "pwm", "pclk", PCLKCON, 10, 0, 0), 180 + GATE(PCLK_I2S0, "i2s0", "pclk", PCLKCON, 9, 0, 0), 181 + GATE(PCLK_AC97, "ac97", "pclk", PCLKCON, 8, 0, 0), 182 + GATE(PCLK_ADC, "adc", "pclk", PCLKCON, 7, 0, 0), 183 + GATE(PCLK_SPI0, "spi0", "pclk", PCLKCON, 6, 0, 0), 184 + GATE(PCLK_I2C0, "i2c0", "pclk", PCLKCON, 4, 0, 0), 185 + GATE(PCLK_UART3, "uart3", "pclk", PCLKCON, 3, 0, 0), 186 + GATE(PCLK_UART2, "uart2", "pclk", PCLKCON, 2, 0, 0), 187 + GATE(PCLK_UART1, "uart1", "pclk", PCLKCON, 1, 0, 0), 188 + GATE(PCLK_UART0, "uart0", "pclk", PCLKCON, 0, 0, 0), 189 + }; 190 + 191 + struct samsung_clock_alias s3c2443_common_aliases[] __initdata = { 192 + ALIAS(HCLK, NULL, "hclk"), 193 + ALIAS(HCLK_SSMC, NULL, "nand"), 194 + ALIAS(PCLK_UART0, "s3c2440-uart.0", "uart"), 195 + ALIAS(PCLK_UART1, "s3c2440-uart.1", "uart"), 196 + ALIAS(PCLK_UART2, "s3c2440-uart.2", "uart"), 197 + ALIAS(PCLK_UART3, "s3c2440-uart.3", "uart"), 198 + ALIAS(PCLK_UART0, "s3c2440-uart.0", "clk_uart_baud2"), 199 + ALIAS(PCLK_UART1, "s3c2440-uart.1", "clk_uart_baud2"), 200 + ALIAS(PCLK_UART2, "s3c2440-uart.2", "clk_uart_baud2"), 201 + ALIAS(PCLK_UART3, "s3c2440-uart.3", "clk_uart_baud2"), 202 + ALIAS(SCLK_UART, NULL, "clk_uart_baud3"), 203 + ALIAS(PCLK_PWM, NULL, "timers"), 204 + ALIAS(PCLK_RTC, NULL, "rtc"), 205 + ALIAS(PCLK_WDT, NULL, "watchdog"), 206 + ALIAS(PCLK_ADC, NULL, "adc"), 207 + ALIAS(PCLK_I2C0, "s3c2410-i2c.0", "i2c"), 208 + ALIAS(HCLK_USBD, NULL, "usb-device"), 209 + ALIAS(HCLK_USBH, NULL, "usb-host"), 210 + ALIAS(SCLK_USBH, NULL, "usb-bus-host"), 211 + ALIAS(PCLK_SPI0, "s3c2443-spi.0", "spi"), 212 + ALIAS(PCLK_SPI0, "s3c2443-spi.0", "spi_busclk0"), 213 + ALIAS(HCLK_HSMMC1, "s3c-sdhci.1", "hsmmc"), 214 + ALIAS(HCLK_HSMMC1, "s3c-sdhci.1", "mmc_busclk.0"), 215 + ALIAS(PCLK_I2S0, "samsung-i2s.0", "iis"), 216 + ALIAS(SCLK_I2S0, NULL, "i2s-if"), 217 + ALIAS(HCLK_LCD, NULL, "lcd"), 218 + ALIAS(SCLK_FIMD, NULL, "sclk_fimd"), 219 + }; 220 + 221 + /* S3C2416 specific clocks */ 222 + 223 + static struct samsung_pll_clock s3c2416_pll_clks[] __initdata = { 224 + [mpll] = PLL(pll_6552_s3c2416, 0, "mpll", "mpllref", 225 + LOCKCON0, MPLLCON, NULL), 226 + [epll] = PLL(pll_6553, 0, "epll", "epllref", 227 + LOCKCON1, EPLLCON, NULL), 228 + }; 229 + 230 + PNAME(s3c2416_hsmmc0_p) = { "sclk_hsmmc0", "sclk_hsmmcext" }; 231 + PNAME(s3c2416_hsmmc1_p) = { "sclk_hsmmc1", "sclk_hsmmcext" }; 232 + PNAME(s3c2416_hsspi0_p) = { "hsspi0_epll", "hsspi0_mpll" }; 233 + 234 + static struct clk_div_table armdiv_s3c2416_d[] = { 235 + { .val = 0, .div = 1 }, 236 + { .val = 1, .div = 2 }, 237 + { .val = 2, .div = 3 }, 238 + { .val = 3, .div = 4 }, 239 + { .val = 5, .div = 6 }, 240 + { .val = 7, .div = 8 }, 241 + { /* sentinel */ }, 242 + }; 243 + 244 + struct samsung_div_clock s3c2416_dividers[] __initdata = { 245 + DIV_T(ARMDIV, "armdiv", "msysclk", CLKDIV0, 9, 3, armdiv_s3c2416_d), 246 + DIV(0, "div_hsspi0_mpll", "msysclk", CLKDIV2, 0, 4), 247 + DIV(0, "div_hsmmc0", "esysclk", CLKDIV2, 6, 2), 248 + }; 249 + 250 + struct samsung_mux_clock s3c2416_muxes[] __initdata = { 251 + MUX(MUX_HSMMC0, "mux_hsmmc0", s3c2416_hsmmc0_p, CLKSRC, 16, 1), 252 + MUX(MUX_HSMMC1, "mux_hsmmc1", s3c2416_hsmmc1_p, CLKSRC, 17, 1), 253 + MUX(MUX_HSSPI0, "mux_hsspi0", s3c2416_hsspi0_p, CLKSRC, 18, 1), 254 + }; 255 + 256 + struct samsung_gate_clock s3c2416_gates[] __initdata = { 257 + GATE(0, "hsspi0_mpll", "div_hsspi0_mpll", SCLKCON, 19, 0, 0), 258 + GATE(0, "hsspi0_epll", "div_hsspi0_epll", SCLKCON, 14, 0, 0), 259 + GATE(0, "sclk_hsmmc0", "div_hsmmc0", SCLKCON, 6, 0, 0), 260 + GATE(HCLK_2D, "2d", "hclk", HCLKCON, 20, 0, 0), 261 + GATE(HCLK_HSMMC0, "hsmmc0", "hclk", HCLKCON, 15, 0, 0), 262 + GATE(HCLK_IROM, "irom", "hclk", HCLKCON, 13, CLK_IGNORE_UNUSED, 0), 263 + GATE(PCLK_PCM, "pcm", "pclk", PCLKCON, 19, 0, 0), 264 + }; 265 + 266 + struct samsung_clock_alias s3c2416_aliases[] __initdata = { 267 + ALIAS(HCLK_HSMMC0, "s3c-sdhci.0", "hsmmc"), 268 + ALIAS(HCLK_HSMMC0, "s3c-sdhci.0", "mmc_busclk.0"), 269 + ALIAS(MUX_HSMMC0, "s3c-sdhci.0", "mmc_busclk.2"), 270 + ALIAS(MUX_HSMMC1, "s3c-sdhci.1", "mmc_busclk.2"), 271 + ALIAS(MUX_HSSPI0, "s3c2443-spi.0", "spi_busclk2"), 272 + ALIAS(ARMDIV, NULL, "armdiv"), 273 + }; 274 + 275 + /* S3C2443 specific clocks */ 276 + 277 + static struct samsung_pll_clock s3c2443_pll_clks[] __initdata = { 278 + [mpll] = PLL(pll_3000, 0, "mpll", "mpllref", 279 + LOCKCON0, MPLLCON, NULL), 280 + [epll] = PLL(pll_2126, 0, "epll", "epllref", 281 + LOCKCON1, EPLLCON, NULL), 282 + }; 283 + 284 + static struct clk_div_table armdiv_s3c2443_d[] = { 285 + { .val = 0, .div = 1 }, 286 + { .val = 8, .div = 2 }, 287 + { .val = 2, .div = 3 }, 288 + { .val = 9, .div = 4 }, 289 + { .val = 10, .div = 6 }, 290 + { .val = 11, .div = 8 }, 291 + { .val = 13, .div = 12 }, 292 + { .val = 15, .div = 16 }, 293 + { /* sentinel */ }, 294 + }; 295 + 296 + struct samsung_div_clock s3c2443_dividers[] __initdata = { 297 + DIV_T(ARMDIV, "armdiv", "msysclk", CLKDIV0, 9, 4, armdiv_s3c2443_d), 298 + DIV(0, "div_cam", "esysclk", CLKDIV1, 26, 4), 299 + }; 300 + 301 + struct samsung_gate_clock s3c2443_gates[] __initdata = { 302 + GATE(SCLK_HSSPI0, "sclk_hsspi0", "div_hsspi0_epll", SCLKCON, 14, 0, 0), 303 + GATE(SCLK_CAM, "sclk_cam", "div_cam", SCLKCON, 11, 0, 0), 304 + GATE(HCLK_CFC, "cfc", "hclk", HCLKCON, 17, CLK_IGNORE_UNUSED, 0), 305 + GATE(HCLK_CAM, "cam", "hclk", HCLKCON, 8, 0, 0), 306 + GATE(PCLK_SPI1, "spi1", "pclk", PCLKCON, 15, 0, 0), 307 + GATE(PCLK_SDI, "sdi", "pclk", PCLKCON, 5, 0, 0), 308 + }; 309 + 310 + struct samsung_clock_alias s3c2443_aliases[] __initdata = { 311 + ALIAS(SCLK_HSSPI0, "s3c2443-spi.0", "spi_busclk2"), 312 + ALIAS(SCLK_HSMMC1, "s3c-sdhci.1", "mmc_busclk.2"), 313 + ALIAS(SCLK_CAM, NULL, "camif-upll"), 314 + ALIAS(PCLK_SPI1, "s3c2410-spi.0", "spi"), 315 + ALIAS(PCLK_SDI, NULL, "sdi"), 316 + ALIAS(HCLK_CFC, NULL, "cfc"), 317 + ALIAS(ARMDIV, NULL, "armdiv"), 318 + }; 319 + 320 + /* S3C2450 specific clocks */ 321 + 322 + PNAME(s3c2450_cam_p) = { "div_cam", "hclk" }; 323 + PNAME(s3c2450_hsspi1_p) = { "hsspi1_epll", "hsspi1_mpll" }; 324 + PNAME(i2s1_p) = { "div_i2s1", "ext_i2s", "epllref", "epllref" }; 325 + 326 + struct samsung_div_clock s3c2450_dividers[] __initdata = { 327 + DIV(0, "div_cam", "esysclk", CLKDIV1, 26, 4), 328 + DIV(0, "div_hsspi1_epll", "esysclk", CLKDIV2, 24, 2), 329 + DIV(0, "div_hsspi1_mpll", "msysclk", CLKDIV2, 16, 4), 330 + DIV(0, "div_i2s1", "esysclk", CLKDIV2, 12, 4), 331 + }; 332 + 333 + struct samsung_mux_clock s3c2450_muxes[] __initdata = { 334 + MUX(0, "mux_cam", s3c2450_cam_p, CLKSRC, 20, 1), 335 + MUX(MUX_HSSPI1, "mux_hsspi1", s3c2450_hsspi1_p, CLKSRC, 19, 1), 336 + MUX(0, "mux_i2s1", i2s1_p, CLKSRC, 12, 2), 337 + }; 338 + 339 + struct samsung_gate_clock s3c2450_gates[] __initdata = { 340 + GATE(SCLK_I2S1, "sclk_i2s1", "div_i2s1", SCLKCON, 5, 0, 0), 341 + GATE(HCLK_CFC, "cfc", "hclk", HCLKCON, 17, 0, 0), 342 + GATE(HCLK_CAM, "cam", "hclk", HCLKCON, 8, 0, 0), 343 + GATE(HCLK_DMA7, "dma7", "hclk", HCLKCON, 7, CLK_IGNORE_UNUSED, 0), 344 + GATE(HCLK_DMA6, "dma6", "hclk", HCLKCON, 6, CLK_IGNORE_UNUSED, 0), 345 + GATE(PCLK_I2S1, "i2s1", "pclk", PCLKCON, 17, 0, 0), 346 + GATE(PCLK_I2C1, "i2c1", "pclk", PCLKCON, 16, 0, 0), 347 + GATE(PCLK_SPI1, "spi1", "pclk", PCLKCON, 14, 0, 0), 348 + }; 349 + 350 + struct samsung_clock_alias s3c2450_aliases[] __initdata = { 351 + ALIAS(PCLK_SPI1, "s3c2443-spi.1", "spi"), 352 + ALIAS(PCLK_SPI1, "s3c2443-spi.1", "spi_busclk0"), 353 + ALIAS(MUX_HSSPI1, "s3c2443-spi.1", "spi_busclk2"), 354 + ALIAS(PCLK_I2C1, "s3c2410-i2c.1", "i2c"), 355 + }; 356 + 357 + /* 358 + * fixed rate clocks generated outside the soc 359 + * Only necessary until the devicetree-move is complete 360 + */ 361 + struct samsung_fixed_rate_clock s3c2443_common_frate_clks[] __initdata = { 362 + FRATE(0, "xti", NULL, CLK_IS_ROOT, 0), 363 + FRATE(0, "ext", NULL, CLK_IS_ROOT, 0), 364 + FRATE(0, "ext_i2s", NULL, CLK_IS_ROOT, 0), 365 + FRATE(0, "ext_uart", NULL, CLK_IS_ROOT, 0), 366 + }; 367 + 368 + static void __init s3c2443_common_clk_register_fixed_ext( 369 + struct samsung_clk_provider *ctx, unsigned long xti_f) 370 + { 371 + s3c2443_common_frate_clks[0].fixed_rate = xti_f; 372 + samsung_clk_register_fixed_rate(ctx, s3c2443_common_frate_clks, 373 + ARRAY_SIZE(s3c2443_common_frate_clks)); 374 + } 375 + 376 + void __init s3c2443_common_clk_init(struct device_node *np, unsigned long xti_f, 377 + int current_soc, 378 + void __iomem *base) 379 + { 380 + struct samsung_clk_provider *ctx; 381 + reg_base = base; 382 + 383 + if (np) { 384 + reg_base = of_iomap(np, 0); 385 + if (!reg_base) 386 + panic("%s: failed to map registers\n", __func__); 387 + } 388 + 389 + ctx = samsung_clk_init(np, reg_base, NR_CLKS); 390 + if (!ctx) 391 + panic("%s: unable to allocate context.\n", __func__); 392 + 393 + /* Register external clocks only in non-dt cases */ 394 + if (!np) 395 + s3c2443_common_clk_register_fixed_ext(ctx, xti_f); 396 + 397 + /* Register PLLs. */ 398 + if (current_soc == S3C2416 || current_soc == S3C2450) 399 + samsung_clk_register_pll(ctx, s3c2416_pll_clks, 400 + ARRAY_SIZE(s3c2416_pll_clks), reg_base); 401 + else 402 + samsung_clk_register_pll(ctx, s3c2443_pll_clks, 403 + ARRAY_SIZE(s3c2443_pll_clks), reg_base); 404 + 405 + /* Register common internal clocks. */ 406 + samsung_clk_register_mux(ctx, s3c2443_common_muxes, 407 + ARRAY_SIZE(s3c2443_common_muxes)); 408 + samsung_clk_register_div(ctx, s3c2443_common_dividers, 409 + ARRAY_SIZE(s3c2443_common_dividers)); 410 + samsung_clk_register_gate(ctx, s3c2443_common_gates, 411 + ARRAY_SIZE(s3c2443_common_gates)); 412 + samsung_clk_register_alias(ctx, s3c2443_common_aliases, 413 + ARRAY_SIZE(s3c2443_common_aliases)); 414 + 415 + /* Register SoC-specific clocks. */ 416 + switch (current_soc) { 417 + case S3C2450: 418 + samsung_clk_register_div(ctx, s3c2450_dividers, 419 + ARRAY_SIZE(s3c2450_dividers)); 420 + samsung_clk_register_mux(ctx, s3c2450_muxes, 421 + ARRAY_SIZE(s3c2450_muxes)); 422 + samsung_clk_register_gate(ctx, s3c2450_gates, 423 + ARRAY_SIZE(s3c2450_gates)); 424 + samsung_clk_register_alias(ctx, s3c2450_aliases, 425 + ARRAY_SIZE(s3c2450_aliases)); 426 + /* fall through, as s3c2450 extends the s3c2416 clocks */ 427 + case S3C2416: 428 + samsung_clk_register_div(ctx, s3c2416_dividers, 429 + ARRAY_SIZE(s3c2416_dividers)); 430 + samsung_clk_register_mux(ctx, s3c2416_muxes, 431 + ARRAY_SIZE(s3c2416_muxes)); 432 + samsung_clk_register_gate(ctx, s3c2416_gates, 433 + ARRAY_SIZE(s3c2416_gates)); 434 + samsung_clk_register_alias(ctx, s3c2416_aliases, 435 + ARRAY_SIZE(s3c2416_aliases)); 436 + break; 437 + case S3C2443: 438 + samsung_clk_register_div(ctx, s3c2443_dividers, 439 + ARRAY_SIZE(s3c2443_dividers)); 440 + samsung_clk_register_gate(ctx, s3c2443_gates, 441 + ARRAY_SIZE(s3c2443_gates)); 442 + samsung_clk_register_alias(ctx, s3c2443_aliases, 443 + ARRAY_SIZE(s3c2443_aliases)); 444 + break; 445 + } 446 + 447 + s3c2443_clk_sleep_init(); 448 + } 449 + 450 + static void __init s3c2416_clk_init(struct device_node *np) 451 + { 452 + s3c2443_common_clk_init(np, 0, S3C2416, 0); 453 + } 454 + CLK_OF_DECLARE(s3c2416_clk, "samsung,s3c2416-clock", s3c2416_clk_init); 455 + 456 + static void __init s3c2443_clk_init(struct device_node *np) 457 + { 458 + s3c2443_common_clk_init(np, 0, S3C2443, 0); 459 + } 460 + CLK_OF_DECLARE(s3c2443_clk, "samsung,s3c2443-clock", s3c2443_clk_init); 461 + 462 + static void __init s3c2450_clk_init(struct device_node *np) 463 + { 464 + s3c2443_common_clk_init(np, 0, S3C2450, 0); 465 + } 466 + CLK_OF_DECLARE(s3c2450_clk, "samsung,s3c2450-clock", s3c2450_clk_init);
+25 -19
drivers/clk/samsung/clk-s3c64xx.c
··· 442 442 ALIAS(MEM0_SROM, NULL, "srom"), 443 443 }; 444 444 445 - static void __init s3c64xx_clk_register_fixed_ext(unsigned long fin_pll_f, 446 - unsigned long xusbxti_f) 445 + static void __init s3c64xx_clk_register_fixed_ext( 446 + struct samsung_clk_provider *ctx, 447 + unsigned long fin_pll_f, 448 + unsigned long xusbxti_f) 447 449 { 448 450 s3c64xx_fixed_rate_ext_clks[0].fixed_rate = fin_pll_f; 449 451 s3c64xx_fixed_rate_ext_clks[1].fixed_rate = xusbxti_f; 450 - samsung_clk_register_fixed_rate(s3c64xx_fixed_rate_ext_clks, 452 + samsung_clk_register_fixed_rate(ctx, s3c64xx_fixed_rate_ext_clks, 451 453 ARRAY_SIZE(s3c64xx_fixed_rate_ext_clks)); 452 454 } 453 455 ··· 458 456 unsigned long xusbxti_f, bool s3c6400, 459 457 void __iomem *base) 460 458 { 459 + struct samsung_clk_provider *ctx; 460 + 461 461 reg_base = base; 462 462 is_s3c6400 = s3c6400; 463 463 ··· 469 465 panic("%s: failed to map registers\n", __func__); 470 466 } 471 467 472 - samsung_clk_init(np, reg_base, NR_CLKS); 468 + ctx = samsung_clk_init(np, reg_base, NR_CLKS); 469 + if (!ctx) 470 + panic("%s: unable to allocate context.\n", __func__); 473 471 474 472 /* Register external clocks. */ 475 473 if (!np) 476 - s3c64xx_clk_register_fixed_ext(xtal_f, xusbxti_f); 474 + s3c64xx_clk_register_fixed_ext(ctx, xtal_f, xusbxti_f); 477 475 478 476 /* Register PLLs. */ 479 - samsung_clk_register_pll(s3c64xx_pll_clks, 477 + samsung_clk_register_pll(ctx, s3c64xx_pll_clks, 480 478 ARRAY_SIZE(s3c64xx_pll_clks), reg_base); 481 479 482 480 /* Register common internal clocks. */ 483 - samsung_clk_register_fixed_rate(s3c64xx_fixed_rate_clks, 481 + samsung_clk_register_fixed_rate(ctx, s3c64xx_fixed_rate_clks, 484 482 ARRAY_SIZE(s3c64xx_fixed_rate_clks)); 485 - samsung_clk_register_mux(s3c64xx_mux_clks, 483 + samsung_clk_register_mux(ctx, s3c64xx_mux_clks, 486 484 ARRAY_SIZE(s3c64xx_mux_clks)); 487 - samsung_clk_register_div(s3c64xx_div_clks, 485 + samsung_clk_register_div(ctx, s3c64xx_div_clks, 488 486 ARRAY_SIZE(s3c64xx_div_clks)); 489 - samsung_clk_register_gate(s3c64xx_gate_clks, 487 + samsung_clk_register_gate(ctx, s3c64xx_gate_clks, 490 488 ARRAY_SIZE(s3c64xx_gate_clks)); 491 489 492 490 /* Register SoC-specific clocks. */ 493 491 if (is_s3c6400) { 494 - samsung_clk_register_mux(s3c6400_mux_clks, 492 + samsung_clk_register_mux(ctx, s3c6400_mux_clks, 495 493 ARRAY_SIZE(s3c6400_mux_clks)); 496 - samsung_clk_register_div(s3c6400_div_clks, 494 + samsung_clk_register_div(ctx, s3c6400_div_clks, 497 495 ARRAY_SIZE(s3c6400_div_clks)); 498 - samsung_clk_register_gate(s3c6400_gate_clks, 496 + samsung_clk_register_gate(ctx, s3c6400_gate_clks, 499 497 ARRAY_SIZE(s3c6400_gate_clks)); 500 - samsung_clk_register_alias(s3c6400_clock_aliases, 498 + samsung_clk_register_alias(ctx, s3c6400_clock_aliases, 501 499 ARRAY_SIZE(s3c6400_clock_aliases)); 502 500 } else { 503 - samsung_clk_register_mux(s3c6410_mux_clks, 501 + samsung_clk_register_mux(ctx, s3c6410_mux_clks, 504 502 ARRAY_SIZE(s3c6410_mux_clks)); 505 - samsung_clk_register_div(s3c6410_div_clks, 503 + samsung_clk_register_div(ctx, s3c6410_div_clks, 506 504 ARRAY_SIZE(s3c6410_div_clks)); 507 - samsung_clk_register_gate(s3c6410_gate_clks, 505 + samsung_clk_register_gate(ctx, s3c6410_gate_clks, 508 506 ARRAY_SIZE(s3c6410_gate_clks)); 509 - samsung_clk_register_alias(s3c6410_clock_aliases, 507 + samsung_clk_register_alias(ctx, s3c6410_clock_aliases, 510 508 ARRAY_SIZE(s3c6410_clock_aliases)); 511 509 } 512 510 513 - samsung_clk_register_alias(s3c64xx_clock_aliases, 511 + samsung_clk_register_alias(ctx, s3c64xx_clock_aliases, 514 512 ARRAY_SIZE(s3c64xx_clock_aliases)); 515 513 s3c64xx_clk_sleep_init(); 516 514
+70 -55
drivers/clk/samsung/clk.c
··· 14 14 #include <linux/syscore_ops.h> 15 15 #include "clk.h" 16 16 17 - static DEFINE_SPINLOCK(lock); 18 - static struct clk **clk_table; 19 - static void __iomem *reg_base; 20 - #ifdef CONFIG_OF 21 - static struct clk_onecell_data clk_data; 22 - #endif 23 - 24 17 void samsung_clk_save(void __iomem *base, 25 18 struct samsung_clk_reg_dump *rd, 26 19 unsigned int num_regs) ··· 48 55 } 49 56 50 57 /* setup the essentials required to support clock lookup using ccf */ 51 - void __init samsung_clk_init(struct device_node *np, void __iomem *base, 52 - unsigned long nr_clks) 58 + struct samsung_clk_provider *__init samsung_clk_init(struct device_node *np, 59 + void __iomem *base, unsigned long nr_clks) 53 60 { 54 - reg_base = base; 61 + struct samsung_clk_provider *ctx; 62 + struct clk **clk_table; 63 + int ret; 64 + int i; 55 65 56 - clk_table = kzalloc(sizeof(struct clk *) * nr_clks, GFP_KERNEL); 66 + ctx = kzalloc(sizeof(struct samsung_clk_provider), GFP_KERNEL); 67 + if (!ctx) 68 + panic("could not allocate clock provider context.\n"); 69 + 70 + clk_table = kcalloc(nr_clks, sizeof(struct clk *), GFP_KERNEL); 57 71 if (!clk_table) 58 72 panic("could not allocate clock lookup table\n"); 59 73 60 - if (!np) 61 - return; 74 + for (i = 0; i < nr_clks; ++i) 75 + clk_table[i] = ERR_PTR(-ENOENT); 62 76 63 - #ifdef CONFIG_OF 64 - clk_data.clks = clk_table; 65 - clk_data.clk_num = nr_clks; 66 - of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); 67 - #endif 77 + ctx->reg_base = base; 78 + ctx->clk_data.clks = clk_table; 79 + ctx->clk_data.clk_num = nr_clks; 80 + spin_lock_init(&ctx->lock); 81 + 82 + if (!np) 83 + return ctx; 84 + 85 + ret = of_clk_add_provider(np, of_clk_src_onecell_get, 86 + &ctx->clk_data); 87 + if (ret) 88 + panic("could not register clock provide\n"); 89 + 90 + return ctx; 68 91 } 69 92 70 93 /* add a clock instance to the clock lookup table used for dt based lookup */ 71 - void samsung_clk_add_lookup(struct clk *clk, unsigned int id) 94 + void samsung_clk_add_lookup(struct samsung_clk_provider *ctx, struct clk *clk, 95 + unsigned int id) 72 96 { 73 - if (clk_table && id) 74 - clk_table[id] = clk; 97 + if (ctx->clk_data.clks && id) 98 + ctx->clk_data.clks[id] = clk; 75 99 } 76 100 77 101 /* register a list of aliases */ 78 - void __init samsung_clk_register_alias(struct samsung_clock_alias *list, 79 - unsigned int nr_clk) 102 + void __init samsung_clk_register_alias(struct samsung_clk_provider *ctx, 103 + struct samsung_clock_alias *list, 104 + unsigned int nr_clk) 80 105 { 81 106 struct clk *clk; 82 107 unsigned int idx, ret; 83 108 84 - if (!clk_table) { 109 + if (!ctx->clk_data.clks) { 85 110 pr_err("%s: clock table missing\n", __func__); 86 111 return; 87 112 } ··· 111 100 continue; 112 101 } 113 102 114 - clk = clk_table[list->id]; 103 + clk = ctx->clk_data.clks[list->id]; 115 104 if (!clk) { 116 105 pr_err("%s: failed to find clock %d\n", __func__, 117 106 list->id); ··· 126 115 } 127 116 128 117 /* register a list of fixed clocks */ 129 - void __init samsung_clk_register_fixed_rate( 118 + void __init samsung_clk_register_fixed_rate(struct samsung_clk_provider *ctx, 130 119 struct samsung_fixed_rate_clock *list, unsigned int nr_clk) 131 120 { 132 121 struct clk *clk; ··· 141 130 continue; 142 131 } 143 132 144 - samsung_clk_add_lookup(clk, list->id); 133 + samsung_clk_add_lookup(ctx, clk, list->id); 145 134 146 135 /* 147 136 * Unconditionally add a clock lookup for the fixed rate clocks. ··· 155 144 } 156 145 157 146 /* register a list of fixed factor clocks */ 158 - void __init samsung_clk_register_fixed_factor( 147 + void __init samsung_clk_register_fixed_factor(struct samsung_clk_provider *ctx, 159 148 struct samsung_fixed_factor_clock *list, unsigned int nr_clk) 160 149 { 161 150 struct clk *clk; ··· 170 159 continue; 171 160 } 172 161 173 - samsung_clk_add_lookup(clk, list->id); 162 + samsung_clk_add_lookup(ctx, clk, list->id); 174 163 } 175 164 } 176 165 177 166 /* register a list of mux clocks */ 178 - void __init samsung_clk_register_mux(struct samsung_mux_clock *list, 179 - unsigned int nr_clk) 167 + void __init samsung_clk_register_mux(struct samsung_clk_provider *ctx, 168 + struct samsung_mux_clock *list, 169 + unsigned int nr_clk) 180 170 { 181 171 struct clk *clk; 182 172 unsigned int idx, ret; 183 173 184 174 for (idx = 0; idx < nr_clk; idx++, list++) { 185 175 clk = clk_register_mux(NULL, list->name, list->parent_names, 186 - list->num_parents, list->flags, reg_base + list->offset, 187 - list->shift, list->width, list->mux_flags, &lock); 176 + list->num_parents, list->flags, 177 + ctx->reg_base + list->offset, 178 + list->shift, list->width, list->mux_flags, &ctx->lock); 188 179 if (IS_ERR(clk)) { 189 180 pr_err("%s: failed to register clock %s\n", __func__, 190 181 list->name); 191 182 continue; 192 183 } 193 184 194 - samsung_clk_add_lookup(clk, list->id); 185 + samsung_clk_add_lookup(ctx, clk, list->id); 195 186 196 187 /* register a clock lookup only if a clock alias is specified */ 197 188 if (list->alias) { ··· 207 194 } 208 195 209 196 /* register a list of div clocks */ 210 - void __init samsung_clk_register_div(struct samsung_div_clock *list, 211 - unsigned int nr_clk) 197 + void __init samsung_clk_register_div(struct samsung_clk_provider *ctx, 198 + struct samsung_div_clock *list, 199 + unsigned int nr_clk) 212 200 { 213 201 struct clk *clk; 214 202 unsigned int idx, ret; ··· 217 203 for (idx = 0; idx < nr_clk; idx++, list++) { 218 204 if (list->table) 219 205 clk = clk_register_divider_table(NULL, list->name, 220 - list->parent_name, list->flags, 221 - reg_base + list->offset, list->shift, 222 - list->width, list->div_flags, 223 - list->table, &lock); 206 + list->parent_name, list->flags, 207 + ctx->reg_base + list->offset, 208 + list->shift, list->width, list->div_flags, 209 + list->table, &ctx->lock); 224 210 else 225 211 clk = clk_register_divider(NULL, list->name, 226 - list->parent_name, list->flags, 227 - reg_base + list->offset, list->shift, 228 - list->width, list->div_flags, &lock); 212 + list->parent_name, list->flags, 213 + ctx->reg_base + list->offset, list->shift, 214 + list->width, list->div_flags, &ctx->lock); 229 215 if (IS_ERR(clk)) { 230 216 pr_err("%s: failed to register clock %s\n", __func__, 231 217 list->name); 232 218 continue; 233 219 } 234 220 235 - samsung_clk_add_lookup(clk, list->id); 221 + samsung_clk_add_lookup(ctx, clk, list->id); 236 222 237 223 /* register a clock lookup only if a clock alias is specified */ 238 224 if (list->alias) { ··· 246 232 } 247 233 248 234 /* register a list of gate clocks */ 249 - void __init samsung_clk_register_gate(struct samsung_gate_clock *list, 250 - unsigned int nr_clk) 235 + void __init samsung_clk_register_gate(struct samsung_clk_provider *ctx, 236 + struct samsung_gate_clock *list, 237 + unsigned int nr_clk) 251 238 { 252 239 struct clk *clk; 253 240 unsigned int idx, ret; 254 241 255 242 for (idx = 0; idx < nr_clk; idx++, list++) { 256 243 clk = clk_register_gate(NULL, list->name, list->parent_name, 257 - list->flags, reg_base + list->offset, 258 - list->bit_idx, list->gate_flags, &lock); 244 + list->flags, ctx->reg_base + list->offset, 245 + list->bit_idx, list->gate_flags, &ctx->lock); 259 246 if (IS_ERR(clk)) { 260 247 pr_err("%s: failed to register clock %s\n", __func__, 261 248 list->name); ··· 272 257 __func__, list->alias); 273 258 } 274 259 275 - samsung_clk_add_lookup(clk, list->id); 260 + samsung_clk_add_lookup(ctx, clk, list->id); 276 261 } 277 262 } 278 263 ··· 281 266 * tree and register it 282 267 */ 283 268 #ifdef CONFIG_OF 284 - void __init samsung_clk_of_register_fixed_ext( 269 + void __init samsung_clk_of_register_fixed_ext(struct samsung_clk_provider *ctx, 285 270 struct samsung_fixed_rate_clock *fixed_rate_clk, 286 271 unsigned int nr_fixed_rate_clk, 287 272 struct of_device_id *clk_matches) 288 273 { 289 274 const struct of_device_id *match; 290 - struct device_node *np; 275 + struct device_node *clk_np; 291 276 u32 freq; 292 277 293 - for_each_matching_node_and_match(np, clk_matches, &match) { 294 - if (of_property_read_u32(np, "clock-frequency", &freq)) 278 + for_each_matching_node_and_match(clk_np, clk_matches, &match) { 279 + if (of_property_read_u32(clk_np, "clock-frequency", &freq)) 295 280 continue; 296 - fixed_rate_clk[(u32)match->data].fixed_rate = freq; 281 + fixed_rate_clk[(unsigned long)match->data].fixed_rate = freq; 297 282 } 298 - samsung_clk_register_fixed_rate(fixed_rate_clk, nr_fixed_rate_clk); 283 + samsung_clk_register_fixed_rate(ctx, fixed_rate_clk, nr_fixed_rate_clk); 299 284 } 300 285 #endif 301 286
+48 -24
drivers/clk/samsung/clk.h
··· 22 22 #include "clk-pll.h" 23 23 24 24 /** 25 + * struct samsung_clk_provider: information about clock provider 26 + * @reg_base: virtual address for the register base. 27 + * @clk_data: holds clock related data like clk* and number of clocks. 28 + * @lock: maintains exclusion bwtween callbacks for a given clock-provider. 29 + */ 30 + struct samsung_clk_provider { 31 + void __iomem *reg_base; 32 + struct clk_onecell_data clk_data; 33 + spinlock_t lock; 34 + }; 35 + 36 + /** 25 37 * struct samsung_clock_alias: information about mux clock 26 38 * @id: platform specific id of the clock. 27 39 * @dev_name: name of the device to which this clock belongs. ··· 324 312 __PLL(_typ, _id, NULL, _name, _pname, CLK_GET_RATE_NOCACHE, \ 325 313 _lock, _con, _rtable, _alias) 326 314 327 - extern void __init samsung_clk_init(struct device_node *np, void __iomem *base, 328 - unsigned long nr_clks); 315 + extern struct samsung_clk_provider *__init samsung_clk_init( 316 + struct device_node *np, void __iomem *base, 317 + unsigned long nr_clks); 329 318 extern void __init samsung_clk_of_register_fixed_ext( 330 - struct samsung_fixed_rate_clock *fixed_rate_clk, 331 - unsigned int nr_fixed_rate_clk, 332 - struct of_device_id *clk_matches); 319 + struct samsung_clk_provider *ctx, 320 + struct samsung_fixed_rate_clock *fixed_rate_clk, 321 + unsigned int nr_fixed_rate_clk, 322 + struct of_device_id *clk_matches); 333 323 334 - extern void samsung_clk_add_lookup(struct clk *clk, unsigned int id); 324 + extern void samsung_clk_add_lookup(struct samsung_clk_provider *ctx, 325 + struct clk *clk, unsigned int id); 335 326 336 - extern void samsung_clk_register_alias(struct samsung_clock_alias *list, 337 - unsigned int nr_clk); 327 + extern void samsung_clk_register_alias(struct samsung_clk_provider *ctx, 328 + struct samsung_clock_alias *list, 329 + unsigned int nr_clk); 338 330 extern void __init samsung_clk_register_fixed_rate( 339 - struct samsung_fixed_rate_clock *clk_list, unsigned int nr_clk); 331 + struct samsung_clk_provider *ctx, 332 + struct samsung_fixed_rate_clock *clk_list, 333 + unsigned int nr_clk); 340 334 extern void __init samsung_clk_register_fixed_factor( 341 - struct samsung_fixed_factor_clock *list, unsigned int nr_clk); 342 - extern void __init samsung_clk_register_mux(struct samsung_mux_clock *clk_list, 343 - unsigned int nr_clk); 344 - extern void __init samsung_clk_register_div(struct samsung_div_clock *clk_list, 345 - unsigned int nr_clk); 346 - extern void __init samsung_clk_register_gate( 347 - struct samsung_gate_clock *clk_list, unsigned int nr_clk); 348 - extern void __init samsung_clk_register_pll(struct samsung_pll_clock *pll_list, 349 - unsigned int nr_clk, void __iomem *base); 335 + struct samsung_clk_provider *ctx, 336 + struct samsung_fixed_factor_clock *list, 337 + unsigned int nr_clk); 338 + extern void __init samsung_clk_register_mux(struct samsung_clk_provider *ctx, 339 + struct samsung_mux_clock *clk_list, 340 + unsigned int nr_clk); 341 + extern void __init samsung_clk_register_div(struct samsung_clk_provider *ctx, 342 + struct samsung_div_clock *clk_list, 343 + unsigned int nr_clk); 344 + extern void __init samsung_clk_register_gate(struct samsung_clk_provider *ctx, 345 + struct samsung_gate_clock *clk_list, 346 + unsigned int nr_clk); 347 + extern void __init samsung_clk_register_pll(struct samsung_clk_provider *ctx, 348 + struct samsung_pll_clock *pll_list, 349 + unsigned int nr_clk, void __iomem *base); 350 350 351 351 extern unsigned long _get_rate(const char *clk_name); 352 352 353 353 extern void samsung_clk_save(void __iomem *base, 354 - struct samsung_clk_reg_dump *rd, 355 - unsigned int num_regs); 354 + struct samsung_clk_reg_dump *rd, 355 + unsigned int num_regs); 356 356 extern void samsung_clk_restore(void __iomem *base, 357 - const struct samsung_clk_reg_dump *rd, 358 - unsigned int num_regs); 357 + const struct samsung_clk_reg_dump *rd, 358 + unsigned int num_regs); 359 359 extern struct samsung_clk_reg_dump *samsung_clk_alloc_reg_dump( 360 - const unsigned long *rdump, 361 - unsigned long nr_rdump); 360 + const unsigned long *rdump, 361 + unsigned long nr_rdump); 362 362 363 363 #endif /* __SAMSUNG_CLK_H */
+1
drivers/cpufreq/s3c24xx-cpufreq.c
··· 141 141 142 142 static void s3c_cpufreq_setfvco(struct s3c_cpufreq_config *cfg) 143 143 { 144 + cfg->mpll = _clk_mpll; 144 145 (cfg->info->set_fvco)(cfg); 145 146 } 146 147
+6
drivers/cpuidle/Kconfig.arm
··· 44 44 depends on ARCH_AT91 45 45 help 46 46 Select this to enable cpuidle for AT91 processors 47 + 48 + config ARM_EXYNOS_CPUIDLE 49 + bool "Cpu Idle Driver for the Exynos processors" 50 + depends on ARCH_EXYNOS 51 + help 52 + Select this to enable cpuidle for Exynos processors
+1
drivers/cpuidle/Makefile
··· 13 13 obj-$(CONFIG_ARM_ZYNQ_CPUIDLE) += cpuidle-zynq.o 14 14 obj-$(CONFIG_ARM_U8500_CPUIDLE) += cpuidle-ux500.o 15 15 obj-$(CONFIG_ARM_AT91_CPUIDLE) += cpuidle-at91.o 16 + obj-$(CONFIG_ARM_EXYNOS_CPUIDLE) += cpuidle-exynos.o 16 17 17 18 ############################################################################### 18 19 # POWERPC drivers
+99
drivers/cpuidle/cpuidle-exynos.c
··· 1 + /* linux/arch/arm/mach-exynos/cpuidle.c 2 + * 3 + * Copyright (c) 2011 Samsung Electronics Co., Ltd. 4 + * http://www.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 + */ 10 + 11 + #include <linux/cpuidle.h> 12 + #include <linux/cpu_pm.h> 13 + #include <linux/export.h> 14 + #include <linux/module.h> 15 + #include <linux/platform_device.h> 16 + 17 + #include <asm/proc-fns.h> 18 + #include <asm/suspend.h> 19 + #include <asm/cpuidle.h> 20 + 21 + static void (*exynos_enter_aftr)(void); 22 + 23 + static int idle_finisher(unsigned long flags) 24 + { 25 + exynos_enter_aftr(); 26 + cpu_do_idle(); 27 + 28 + return 1; 29 + } 30 + 31 + static int exynos_enter_core0_aftr(struct cpuidle_device *dev, 32 + struct cpuidle_driver *drv, 33 + int index) 34 + { 35 + cpu_pm_enter(); 36 + cpu_suspend(0, idle_finisher); 37 + cpu_pm_exit(); 38 + 39 + return index; 40 + } 41 + 42 + static int exynos_enter_lowpower(struct cpuidle_device *dev, 43 + struct cpuidle_driver *drv, 44 + int index) 45 + { 46 + int new_index = index; 47 + 48 + /* AFTR can only be entered when cores other than CPU0 are offline */ 49 + if (num_online_cpus() > 1 || dev->cpu != 0) 50 + new_index = drv->safe_state_index; 51 + 52 + if (new_index == 0) 53 + return arm_cpuidle_simple_enter(dev, drv, new_index); 54 + else 55 + return exynos_enter_core0_aftr(dev, drv, new_index); 56 + } 57 + 58 + static struct cpuidle_driver exynos_idle_driver = { 59 + .name = "exynos_idle", 60 + .owner = THIS_MODULE, 61 + .states = { 62 + [0] = ARM_CPUIDLE_WFI_STATE, 63 + [1] = { 64 + .enter = exynos_enter_lowpower, 65 + .exit_latency = 300, 66 + .target_residency = 100000, 67 + .flags = CPUIDLE_FLAG_TIME_VALID, 68 + .name = "C1", 69 + .desc = "ARM power down", 70 + }, 71 + }, 72 + .state_count = 2, 73 + .safe_state_index = 0, 74 + }; 75 + 76 + static int exynos_cpuidle_probe(struct platform_device *pdev) 77 + { 78 + int ret; 79 + 80 + exynos_enter_aftr = (void *)(pdev->dev.platform_data); 81 + 82 + ret = cpuidle_register(&exynos_idle_driver, NULL); 83 + if (ret) { 84 + dev_err(&pdev->dev, "failed to register cpuidle driver\n"); 85 + return ret; 86 + } 87 + 88 + return 0; 89 + } 90 + 91 + static struct platform_driver exynos_cpuidle_driver = { 92 + .probe = exynos_cpuidle_probe, 93 + .driver = { 94 + .name = "exynos_cpuidle", 95 + .owner = THIS_MODULE, 96 + }, 97 + }; 98 + 99 + module_platform_driver(exynos_cpuidle_driver);
+258
include/dt-bindings/clock/exynos3250.h
··· 1 + /* 2 + * Copyright (c) 2014 Samsung Electronics Co., Ltd. 3 + * Author: Tomasz Figa <t.figa@samsung.com> 4 + * 5 + * This program is free software; you can redistribute it and/or modify 6 + * it under the terms of the GNU General Public License version 2 as 7 + * published by the Free Software Foundation. 8 + * 9 + * Device Tree binding constants for Samsung Exynos3250 clock controllers. 10 + */ 11 + 12 + #ifndef _DT_BINDINGS_CLOCK_SAMSUNG_EXYNOS3250_CLOCK_H 13 + #define _DT_BINDINGS_CLOCK_SAMSUNG_EXYNOS3250_CLOCK_H 14 + 15 + /* 16 + * Let each exported clock get a unique index, which is used on DT-enabled 17 + * platforms to lookup the clock from a clock specifier. These indices are 18 + * therefore considered an ABI and so must not be changed. This implies 19 + * that new clocks should be added either in free spaces between clock groups 20 + * or at the end. 21 + */ 22 + 23 + 24 + /* 25 + * Main CMU 26 + */ 27 + 28 + #define CLK_OSCSEL 1 29 + #define CLK_FIN_PLL 2 30 + #define CLK_FOUT_APLL 3 31 + #define CLK_FOUT_VPLL 4 32 + #define CLK_FOUT_UPLL 5 33 + #define CLK_FOUT_MPLL 6 34 + 35 + /* Muxes */ 36 + #define CLK_MOUT_MPLL_USER_L 16 37 + #define CLK_MOUT_GDL 17 38 + #define CLK_MOUT_MPLL_USER_R 18 39 + #define CLK_MOUT_GDR 19 40 + #define CLK_MOUT_EBI 20 41 + #define CLK_MOUT_ACLK_200 21 42 + #define CLK_MOUT_ACLK_160 22 43 + #define CLK_MOUT_ACLK_100 23 44 + #define CLK_MOUT_ACLK_266_1 24 45 + #define CLK_MOUT_ACLK_266_0 25 46 + #define CLK_MOUT_ACLK_266 26 47 + #define CLK_MOUT_VPLL 27 48 + #define CLK_MOUT_EPLL_USER 28 49 + #define CLK_MOUT_EBI_1 29 50 + #define CLK_MOUT_UPLL 30 51 + #define CLK_MOUT_ACLK_400_MCUISP_SUB 31 52 + #define CLK_MOUT_MPLL 32 53 + #define CLK_MOUT_ACLK_400_MCUISP 33 54 + #define CLK_MOUT_VPLLSRC 34 55 + #define CLK_MOUT_CAM1 35 56 + #define CLK_MOUT_CAM_BLK 36 57 + #define CLK_MOUT_MFC 37 58 + #define CLK_MOUT_MFC_1 38 59 + #define CLK_MOUT_MFC_0 39 60 + #define CLK_MOUT_G3D 40 61 + #define CLK_MOUT_G3D_1 41 62 + #define CLK_MOUT_G3D_0 42 63 + #define CLK_MOUT_MIPI0 43 64 + #define CLK_MOUT_FIMD0 44 65 + #define CLK_MOUT_UART_ISP 45 66 + #define CLK_MOUT_SPI1_ISP 46 67 + #define CLK_MOUT_SPI0_ISP 47 68 + #define CLK_MOUT_TSADC 48 69 + #define CLK_MOUT_MMC1 49 70 + #define CLK_MOUT_MMC0 50 71 + #define CLK_MOUT_UART1 51 72 + #define CLK_MOUT_UART0 52 73 + #define CLK_MOUT_SPI1 53 74 + #define CLK_MOUT_SPI0 54 75 + #define CLK_MOUT_AUDIO 55 76 + #define CLK_MOUT_MPLL_USER_C 56 77 + #define CLK_MOUT_HPM 57 78 + #define CLK_MOUT_CORE 58 79 + #define CLK_MOUT_APLL 59 80 + #define CLK_MOUT_ACLK_266_SUB 60 81 + 82 + /* Dividers */ 83 + #define CLK_DIV_GPL 64 84 + #define CLK_DIV_GDL 65 85 + #define CLK_DIV_GPR 66 86 + #define CLK_DIV_GDR 67 87 + #define CLK_DIV_MPLL_PRE 68 88 + #define CLK_DIV_ACLK_400_MCUISP 69 89 + #define CLK_DIV_EBI 70 90 + #define CLK_DIV_ACLK_200 71 91 + #define CLK_DIV_ACLK_160 72 92 + #define CLK_DIV_ACLK_100 73 93 + #define CLK_DIV_ACLK_266 74 94 + #define CLK_DIV_CAM1 75 95 + #define CLK_DIV_CAM_BLK 76 96 + #define CLK_DIV_MFC 77 97 + #define CLK_DIV_G3D 78 98 + #define CLK_DIV_MIPI0_PRE 79 99 + #define CLK_DIV_MIPI0 80 100 + #define CLK_DIV_FIMD0 81 101 + #define CLK_DIV_UART_ISP 82 102 + #define CLK_DIV_SPI1_ISP_PRE 83 103 + #define CLK_DIV_SPI1_ISP 84 104 + #define CLK_DIV_SPI0_ISP_PRE 85 105 + #define CLK_DIV_SPI0_ISP 86 106 + #define CLK_DIV_TSADC_PRE 87 107 + #define CLK_DIV_TSADC 88 108 + #define CLK_DIV_MMC1_PRE 89 109 + #define CLK_DIV_MMC1 90 110 + #define CLK_DIV_MMC0_PRE 91 111 + #define CLK_DIV_MMC0 92 112 + #define CLK_DIV_UART1 93 113 + #define CLK_DIV_UART0 94 114 + #define CLK_DIV_SPI1_PRE 95 115 + #define CLK_DIV_SPI1 96 116 + #define CLK_DIV_SPI0_PRE 97 117 + #define CLK_DIV_SPI0 98 118 + #define CLK_DIV_PCM 99 119 + #define CLK_DIV_AUDIO 100 120 + #define CLK_DIV_I2S 101 121 + #define CLK_DIV_CORE2 102 122 + #define CLK_DIV_APLL 103 123 + #define CLK_DIV_PCLK_DBG 104 124 + #define CLK_DIV_ATB 105 125 + #define CLK_DIV_COREM 106 126 + #define CLK_DIV_CORE 107 127 + #define CLK_DIV_HPM 108 128 + #define CLK_DIV_COPY 109 129 + 130 + /* Gates */ 131 + #define CLK_ASYNC_G3D 128 132 + #define CLK_ASYNC_MFCL 129 133 + #define CLK_PPMULEFT 130 134 + #define CLK_GPIO_LEFT 131 135 + #define CLK_ASYNC_ISPMX 132 136 + #define CLK_ASYNC_FSYSD 133 137 + #define CLK_ASYNC_LCD0X 134 138 + #define CLK_ASYNC_CAMX 135 139 + #define CLK_PPMURIGHT 136 140 + #define CLK_GPIO_RIGHT 137 141 + #define CLK_MONOCNT 138 142 + #define CLK_TZPC6 139 143 + #define CLK_PROVISIONKEY1 140 144 + #define CLK_PROVISIONKEY0 141 145 + #define CLK_CMU_ISPPART 142 146 + #define CLK_TMU_APBIF 143 147 + #define CLK_KEYIF 144 148 + #define CLK_RTC 145 149 + #define CLK_WDT 146 150 + #define CLK_MCT 147 151 + #define CLK_SECKEY 148 152 + #define CLK_TZPC5 149 153 + #define CLK_TZPC4 150 154 + #define CLK_TZPC3 151 155 + #define CLK_TZPC2 152 156 + #define CLK_TZPC1 153 157 + #define CLK_TZPC0 154 158 + #define CLK_CMU_COREPART 155 159 + #define CLK_CMU_TOPPART 156 160 + #define CLK_PMU_APBIF 157 161 + #define CLK_SYSREG 158 162 + #define CLK_CHIP_ID 159 163 + #define CLK_QEJPEG 160 164 + #define CLK_PIXELASYNCM1 161 165 + #define CLK_PIXELASYNCM0 162 166 + #define CLK_PPMUCAMIF 163 167 + #define CLK_QEM2MSCALER 164 168 + #define CLK_QEGSCALER1 165 169 + #define CLK_QEGSCALER0 166 170 + #define CLK_SMMUJPEG 167 171 + #define CLK_SMMUM2M2SCALER 168 172 + #define CLK_SMMUGSCALER1 169 173 + #define CLK_SMMUGSCALER0 170 174 + #define CLK_JPEG 171 175 + #define CLK_M2MSCALER 172 176 + #define CLK_GSCALER1 173 177 + #define CLK_GSCALER0 174 178 + #define CLK_QEMFC 175 179 + #define CLK_PPMUMFC_L 176 180 + #define CLK_SMMUMFC_L 177 181 + #define CLK_MFC 178 182 + #define CLK_SMMUG3D 179 183 + #define CLK_QEG3D 180 184 + #define CLK_PPMUG3D 181 185 + #define CLK_G3D 182 186 + #define CLK_QE_CH1_LCD 183 187 + #define CLK_QE_CH0_LCD 184 188 + #define CLK_PPMULCD0 185 189 + #define CLK_SMMUFIMD0 186 190 + #define CLK_DSIM0 187 191 + #define CLK_FIMD0 188 192 + #define CLK_CAM1 189 193 + #define CLK_UART_ISP_TOP 190 194 + #define CLK_SPI1_ISP_TOP 191 195 + #define CLK_SPI0_ISP_TOP 192 196 + #define CLK_TSADC 193 197 + #define CLK_PPMUFILE 194 198 + #define CLK_USBOTG 195 199 + #define CLK_USBHOST 196 200 + #define CLK_SROMC 197 201 + #define CLK_SDMMC1 198 202 + #define CLK_SDMMC0 199 203 + #define CLK_PDMA1 200 204 + #define CLK_PDMA0 201 205 + #define CLK_PWM 202 206 + #define CLK_PCM 203 207 + #define CLK_I2S 204 208 + #define CLK_SPI1 205 209 + #define CLK_SPI0 206 210 + #define CLK_I2C7 207 211 + #define CLK_I2C6 208 212 + #define CLK_I2C5 209 213 + #define CLK_I2C4 210 214 + #define CLK_I2C3 211 215 + #define CLK_I2C2 212 216 + #define CLK_I2C1 213 217 + #define CLK_I2C0 214 218 + #define CLK_UART1 215 219 + #define CLK_UART0 216 220 + #define CLK_BLOCK_LCD 217 221 + #define CLK_BLOCK_G3D 218 222 + #define CLK_BLOCK_MFC 219 223 + #define CLK_BLOCK_CAM 220 224 + #define CLK_SMIES 221 225 + 226 + /* Special clocks */ 227 + #define CLK_SCLK_JPEG 224 228 + #define CLK_SCLK_M2MSCALER 225 229 + #define CLK_SCLK_GSCALER1 226 230 + #define CLK_SCLK_GSCALER0 227 231 + #define CLK_SCLK_MFC 228 232 + #define CLK_SCLK_G3D 229 233 + #define CLK_SCLK_MIPIDPHY2L 230 234 + #define CLK_SCLK_MIPI0 231 235 + #define CLK_SCLK_FIMD0 232 236 + #define CLK_SCLK_CAM1 233 237 + #define CLK_SCLK_UART_ISP 234 238 + #define CLK_SCLK_SPI1_ISP 235 239 + #define CLK_SCLK_SPI0_ISP 236 240 + #define CLK_SCLK_UPLL 237 241 + #define CLK_SCLK_TSADC 238 242 + #define CLK_SCLK_EBI 239 243 + #define CLK_SCLK_MMC1 240 244 + #define CLK_SCLK_MMC0 241 245 + #define CLK_SCLK_I2S 242 246 + #define CLK_SCLK_PCM 243 247 + #define CLK_SCLK_SPI1 244 248 + #define CLK_SCLK_SPI0 245 249 + #define CLK_SCLK_UART1 246 250 + #define CLK_SCLK_UART0 247 251 + 252 + /* 253 + * Total number of clocks of main CMU. 254 + * NOTE: Must be equal to last clock ID increased by one. 255 + */ 256 + #define CLK_NR_CLKS 248 257 + 258 + #endif /* _DT_BINDINGS_CLOCK_SAMSUNG_EXYNOS3250_CLOCK_H */
+1 -1
include/dt-bindings/clock/exynos4.h
··· 33 33 #define CLK_MOUT_MPLL_USER_C 18 /* Exynos4x12 only */ 34 34 #define CLK_MOUT_CORE 19 35 35 #define CLK_MOUT_APLL 20 36 + #define CLK_SCLK_HDMIPHY 22 36 37 37 38 /* gate for special clocks (sclk) */ 38 39 #define CLK_SCLK_FIMC0 128 ··· 182 181 #define CLK_KEYIF 347 183 182 #define CLK_AUDSS 348 184 183 #define CLK_MIPI_HSI 349 /* Exynos4210 only */ 185 - #define CLK_MDMA2 350 /* Exynos4210 only */ 186 184 #define CLK_PIXELASYNCM0 351 187 185 #define CLK_PIXELASYNCM1 352 188 186 #define CLK_FIMC_LITE0 353 /* Exynos4x12 only */
+4 -1
include/dt-bindings/clock/exynos5250.h
··· 150 150 #define CLK_G2D 345 151 151 #define CLK_MDMA0 346 152 152 #define CLK_SMMU_MDMA0 347 153 + #define CLK_SSS 348 154 + #define CLK_G3D 349 153 155 154 156 /* mux clocks */ 155 157 #define CLK_MOUT_HDMI 1024 158 + #define CLK_MOUT_GPLL 1025 156 159 157 160 /* must be greater than maximal clock id */ 158 - #define CLK_NR_CLKS 1025 161 + #define CLK_NR_CLKS 1026 159 162 160 163 #endif /* _DT_BINDINGS_CLOCK_EXYNOS_5250_H */
+469
include/dt-bindings/clock/exynos5260-clk.h
··· 1 + /* 2 + * Copyright (c) 2014 Samsung Electronics Co., Ltd. 3 + * Author: Rahul Sharma <rahul.sharma@samsung.com> 4 + * 5 + * This program is free software; you can redistribute it and/or modify 6 + * it under the terms of the GNU General Public License version 2 as 7 + * published by the Free Software Foundation. 8 + * 9 + * Provides Constants for Exynos5260 clocks. 10 + */ 11 + 12 + #ifndef _DT_BINDINGS_CLK_EXYNOS5260_H 13 + #define _DT_BINDINGS_CLK_EXYNOS5260_H 14 + 15 + /* Clock names: <cmu><type><IP> */ 16 + 17 + /* List Of Clocks For CMU_TOP */ 18 + 19 + #define TOP_FOUT_DISP_PLL 1 20 + #define TOP_FOUT_AUD_PLL 2 21 + #define TOP_MOUT_AUDTOP_PLL_USER 3 22 + #define TOP_MOUT_AUD_PLL 4 23 + #define TOP_MOUT_DISP_PLL 5 24 + #define TOP_MOUT_BUSTOP_PLL_USER 6 25 + #define TOP_MOUT_MEMTOP_PLL_USER 7 26 + #define TOP_MOUT_MEDIATOP_PLL_USER 8 27 + #define TOP_MOUT_DISP_DISP_333 9 28 + #define TOP_MOUT_ACLK_DISP_333 10 29 + #define TOP_MOUT_DISP_DISP_222 11 30 + #define TOP_MOUT_ACLK_DISP_222 12 31 + #define TOP_MOUT_DISP_MEDIA_PIXEL 13 32 + #define TOP_MOUT_FIMD1 14 33 + #define TOP_MOUT_SCLK_PERI_SPI0_CLK 15 34 + #define TOP_MOUT_SCLK_PERI_SPI1_CLK 16 35 + #define TOP_MOUT_SCLK_PERI_SPI2_CLK 17 36 + #define TOP_MOUT_SCLK_PERI_UART0_UCLK 18 37 + #define TOP_MOUT_SCLK_PERI_UART2_UCLK 19 38 + #define TOP_MOUT_SCLK_PERI_UART1_UCLK 20 39 + #define TOP_MOUT_BUS4_BUSTOP_100 21 40 + #define TOP_MOUT_BUS4_BUSTOP_400 22 41 + #define TOP_MOUT_BUS3_BUSTOP_100 23 42 + #define TOP_MOUT_BUS3_BUSTOP_400 24 43 + #define TOP_MOUT_BUS2_BUSTOP_400 25 44 + #define TOP_MOUT_BUS2_BUSTOP_100 26 45 + #define TOP_MOUT_BUS1_BUSTOP_100 27 46 + #define TOP_MOUT_BUS1_BUSTOP_400 28 47 + #define TOP_MOUT_SCLK_FSYS_USB 29 48 + #define TOP_MOUT_SCLK_FSYS_MMC0_SDCLKIN_A 30 49 + #define TOP_MOUT_SCLK_FSYS_MMC1_SDCLKIN_A 31 50 + #define TOP_MOUT_SCLK_FSYS_MMC2_SDCLKIN_A 32 51 + #define TOP_MOUT_SCLK_FSYS_MMC0_SDCLKIN_B 33 52 + #define TOP_MOUT_SCLK_FSYS_MMC1_SDCLKIN_B 34 53 + #define TOP_MOUT_SCLK_FSYS_MMC2_SDCLKIN_B 35 54 + #define TOP_MOUT_ACLK_ISP1_266 36 55 + #define TOP_MOUT_ISP1_MEDIA_266 37 56 + #define TOP_MOUT_ACLK_ISP1_400 38 57 + #define TOP_MOUT_ISP1_MEDIA_400 39 58 + #define TOP_MOUT_SCLK_ISP1_SPI0 40 59 + #define TOP_MOUT_SCLK_ISP1_SPI1 41 60 + #define TOP_MOUT_SCLK_ISP1_UART 42 61 + #define TOP_MOUT_SCLK_ISP1_SENSOR2 43 62 + #define TOP_MOUT_SCLK_ISP1_SENSOR1 44 63 + #define TOP_MOUT_SCLK_ISP1_SENSOR0 45 64 + #define TOP_MOUT_ACLK_MFC_333 46 65 + #define TOP_MOUT_MFC_BUSTOP_333 47 66 + #define TOP_MOUT_ACLK_G2D_333 48 67 + #define TOP_MOUT_G2D_BUSTOP_333 49 68 + #define TOP_MOUT_ACLK_GSCL_FIMC 50 69 + #define TOP_MOUT_GSCL_BUSTOP_FIMC 51 70 + #define TOP_MOUT_ACLK_GSCL_333 52 71 + #define TOP_MOUT_GSCL_BUSTOP_333 53 72 + #define TOP_MOUT_ACLK_GSCL_400 54 73 + #define TOP_MOUT_M2M_MEDIATOP_400 55 74 + #define TOP_DOUT_ACLK_MFC_333 56 75 + #define TOP_DOUT_ACLK_G2D_333 57 76 + #define TOP_DOUT_SCLK_ISP1_SENSOR2_A 58 77 + #define TOP_DOUT_SCLK_ISP1_SENSOR1_A 59 78 + #define TOP_DOUT_SCLK_ISP1_SENSOR0_A 60 79 + #define TOP_DOUT_ACLK_GSCL_FIMC 61 80 + #define TOP_DOUT_ACLK_GSCL_400 62 81 + #define TOP_DOUT_ACLK_GSCL_333 63 82 + #define TOP_DOUT_SCLK_ISP1_SPI0_B 64 83 + #define TOP_DOUT_SCLK_ISP1_SPI0_A 65 84 + #define TOP_DOUT_ACLK_ISP1_400 66 85 + #define TOP_DOUT_ACLK_ISP1_266 67 86 + #define TOP_DOUT_SCLK_ISP1_UART 68 87 + #define TOP_DOUT_SCLK_ISP1_SPI1_B 69 88 + #define TOP_DOUT_SCLK_ISP1_SPI1_A 70 89 + #define TOP_DOUT_SCLK_ISP1_SENSOR2_B 71 90 + #define TOP_DOUT_SCLK_ISP1_SENSOR1_B 72 91 + #define TOP_DOUT_SCLK_ISP1_SENSOR0_B 73 92 + #define TOP_DOUTTOP__SCLK_HPM_TARGETCLK 74 93 + #define TOP_DOUT_SCLK_DISP_PIXEL 75 94 + #define TOP_DOUT_ACLK_DISP_222 76 95 + #define TOP_DOUT_ACLK_DISP_333 77 96 + #define TOP_DOUT_ACLK_BUS4_100 78 97 + #define TOP_DOUT_ACLK_BUS4_400 79 98 + #define TOP_DOUT_ACLK_BUS3_100 80 99 + #define TOP_DOUT_ACLK_BUS3_400 81 100 + #define TOP_DOUT_ACLK_BUS2_100 82 101 + #define TOP_DOUT_ACLK_BUS2_400 83 102 + #define TOP_DOUT_ACLK_BUS1_100 84 103 + #define TOP_DOUT_ACLK_BUS1_400 85 104 + #define TOP_DOUT_SCLK_PERI_SPI1_B 86 105 + #define TOP_DOUT_SCLK_PERI_SPI1_A 87 106 + #define TOP_DOUT_SCLK_PERI_SPI0_B 88 107 + #define TOP_DOUT_SCLK_PERI_SPI0_A 89 108 + #define TOP_DOUT_SCLK_PERI_UART0 90 109 + #define TOP_DOUT_SCLK_PERI_UART2 91 110 + #define TOP_DOUT_SCLK_PERI_UART1 92 111 + #define TOP_DOUT_SCLK_PERI_SPI2_B 93 112 + #define TOP_DOUT_SCLK_PERI_SPI2_A 94 113 + #define TOP_DOUT_ACLK_PERI_AUD 95 114 + #define TOP_DOUT_ACLK_PERI_66 96 115 + #define TOP_DOUT_SCLK_FSYS_MMC0_SDCLKIN_B 97 116 + #define TOP_DOUT_SCLK_FSYS_MMC0_SDCLKIN_A 98 117 + #define TOP_DOUT_SCLK_FSYS_USBDRD30_SUSPEND_CLK 99 118 + #define TOP_DOUT_ACLK_FSYS_200 100 119 + #define TOP_DOUT_SCLK_FSYS_MMC2_SDCLKIN_B 101 120 + #define TOP_DOUT_SCLK_FSYS_MMC2_SDCLKIN_A 102 121 + #define TOP_DOUT_SCLK_FSYS_MMC1_SDCLKIN_B 103 122 + #define TOP_DOUT_SCLK_FSYS_MMC1_SDCLKIN_A 104 123 + #define TOP_SCLK_FIMD1 105 124 + #define TOP_SCLK_MMC2 106 125 + #define TOP_SCLK_MMC1 107 126 + #define TOP_SCLK_MMC0 108 127 + #define PHYCLK_DPTX_PHY_CH3_TXD_CLK 109 128 + #define PHYCLK_DPTX_PHY_CH2_TXD_CLK 110 129 + #define PHYCLK_DPTX_PHY_CH1_TXD_CLK 111 130 + #define PHYCLK_DPTX_PHY_CH0_TXD_CLK 112 131 + #define phyclk_hdmi_phy_tmds_clko 113 132 + #define PHYCLK_HDMI_PHY_PIXEL_CLKO 114 133 + #define PHYCLK_HDMI_LINK_O_TMDS_CLKHI 115 134 + #define PHYCLK_MIPI_DPHY_4L_M_TXBYTECLKHS 116 135 + #define PHYCLK_DPTX_PHY_O_REF_CLK_24M 117 136 + #define PHYCLK_DPTX_PHY_CLK_DIV2 118 137 + #define PHYCLK_MIPI_DPHY_4L_M_RXCLKESC0 119 138 + #define PHYCLK_USBHOST20_PHY_PHYCLOCK 120 139 + #define PHYCLK_USBHOST20_PHY_FREECLK 121 140 + #define PHYCLK_USBHOST20_PHY_CLK48MOHCI 122 141 + #define PHYCLK_USBDRD30_UDRD30_PIPE_PCLK 123 142 + #define PHYCLK_USBDRD30_UDRD30_PHYCLOCK 124 143 + #define TOP_NR_CLK 125 144 + 145 + 146 + /* List Of Clocks For CMU_EGL */ 147 + 148 + #define EGL_FOUT_EGL_PLL 1 149 + #define EGL_FOUT_EGL_DPLL 2 150 + #define EGL_MOUT_EGL_B 3 151 + #define EGL_MOUT_EGL_PLL 4 152 + #define EGL_DOUT_EGL_PLL 5 153 + #define EGL_DOUT_EGL_PCLK_DBG 6 154 + #define EGL_DOUT_EGL_ATCLK 7 155 + #define EGL_DOUT_PCLK_EGL 8 156 + #define EGL_DOUT_ACLK_EGL 9 157 + #define EGL_DOUT_EGL2 10 158 + #define EGL_DOUT_EGL1 11 159 + #define EGL_NR_CLK 12 160 + 161 + 162 + /* List Of Clocks For CMU_KFC */ 163 + 164 + #define KFC_FOUT_KFC_PLL 1 165 + #define KFC_MOUT_KFC_PLL 2 166 + #define KFC_MOUT_KFC 3 167 + #define KFC_DOUT_KFC_PLL 4 168 + #define KFC_DOUT_PCLK_KFC 5 169 + #define KFC_DOUT_ACLK_KFC 6 170 + #define KFC_DOUT_KFC_PCLK_DBG 7 171 + #define KFC_DOUT_KFC_ATCLK 8 172 + #define KFC_DOUT_KFC2 9 173 + #define KFC_DOUT_KFC1 10 174 + #define KFC_NR_CLK 11 175 + 176 + 177 + /* List Of Clocks For CMU_MIF */ 178 + 179 + #define MIF_FOUT_MEM_PLL 1 180 + #define MIF_FOUT_MEDIA_PLL 2 181 + #define MIF_FOUT_BUS_PLL 3 182 + #define MIF_MOUT_CLK2X_PHY 4 183 + #define MIF_MOUT_MIF_DREX2X 5 184 + #define MIF_MOUT_CLKM_PHY 6 185 + #define MIF_MOUT_MIF_DREX 7 186 + #define MIF_MOUT_MEDIA_PLL 8 187 + #define MIF_MOUT_BUS_PLL 9 188 + #define MIF_MOUT_MEM_PLL 10 189 + #define MIF_DOUT_ACLK_BUS_100 11 190 + #define MIF_DOUT_ACLK_BUS_200 12 191 + #define MIF_DOUT_ACLK_MIF_466 13 192 + #define MIF_DOUT_CLK2X_PHY 14 193 + #define MIF_DOUT_CLKM_PHY 15 194 + #define MIF_DOUT_BUS_PLL 16 195 + #define MIF_DOUT_MEM_PLL 17 196 + #define MIF_DOUT_MEDIA_PLL 18 197 + #define MIF_CLK_LPDDR3PHY_WRAP1 19 198 + #define MIF_CLK_LPDDR3PHY_WRAP0 20 199 + #define MIF_CLK_MONOCNT 21 200 + #define MIF_CLK_MIF_RTC 22 201 + #define MIF_CLK_DREX1 23 202 + #define MIF_CLK_DREX0 24 203 + #define MIF_CLK_INTMEM 25 204 + #define MIF_SCLK_LPDDR3PHY_WRAP_U1 26 205 + #define MIF_SCLK_LPDDR3PHY_WRAP_U0 27 206 + #define MIF_NR_CLK 28 207 + 208 + 209 + /* List Of Clocks For CMU_G3D */ 210 + 211 + #define G3D_FOUT_G3D_PLL 1 212 + #define G3D_MOUT_G3D_PLL 2 213 + #define G3D_DOUT_PCLK_G3D 3 214 + #define G3D_DOUT_ACLK_G3D 4 215 + #define G3D_CLK_G3D_HPM 5 216 + #define G3D_CLK_G3D 6 217 + #define G3D_NR_CLK 7 218 + 219 + 220 + /* List Of Clocks For CMU_AUD */ 221 + 222 + #define AUD_MOUT_SCLK_AUD_PCM 1 223 + #define AUD_MOUT_SCLK_AUD_I2S 2 224 + #define AUD_MOUT_AUD_PLL_USER 3 225 + #define AUD_DOUT_ACLK_AUD_131 4 226 + #define AUD_DOUT_SCLK_AUD_UART 5 227 + #define AUD_DOUT_SCLK_AUD_PCM 6 228 + #define AUD_DOUT_SCLK_AUD_I2S 7 229 + #define AUD_CLK_AUD_UART 8 230 + #define AUD_CLK_PCM 9 231 + #define AUD_CLK_I2S 10 232 + #define AUD_CLK_DMAC 11 233 + #define AUD_CLK_SRAMC 12 234 + #define AUD_SCLK_AUD_UART 13 235 + #define AUD_SCLK_PCM 14 236 + #define AUD_SCLK_I2S 15 237 + #define AUD_NR_CLK 16 238 + 239 + 240 + /* List Of Clocks For CMU_MFC */ 241 + 242 + #define MFC_MOUT_ACLK_MFC_333_USER 1 243 + #define MFC_DOUT_PCLK_MFC_83 2 244 + #define MFC_CLK_MFC 3 245 + #define MFC_CLK_SMMU2_MFCM1 4 246 + #define MFC_CLK_SMMU2_MFCM0 5 247 + #define MFC_NR_CLK 6 248 + 249 + 250 + /* List Of Clocks For CMU_GSCL */ 251 + 252 + #define GSCL_MOUT_ACLK_CSIS 1 253 + #define GSCL_MOUT_ACLK_GSCL_FIMC_USER 2 254 + #define GSCL_MOUT_ACLK_M2M_400_USER 3 255 + #define GSCL_MOUT_ACLK_GSCL_333_USER 4 256 + #define GSCL_DOUT_ACLK_CSIS_200 5 257 + #define GSCL_DOUT_PCLK_M2M_100 6 258 + #define GSCL_CLK_PIXEL_GSCL1 7 259 + #define GSCL_CLK_PIXEL_GSCL0 8 260 + #define GSCL_CLK_MSCL1 9 261 + #define GSCL_CLK_MSCL0 10 262 + #define GSCL_CLK_GSCL1 11 263 + #define GSCL_CLK_GSCL0 12 264 + #define GSCL_CLK_FIMC_LITE_D 13 265 + #define GSCL_CLK_FIMC_LITE_B 14 266 + #define GSCL_CLK_FIMC_LITE_A 15 267 + #define GSCL_CLK_CSIS1 16 268 + #define GSCL_CLK_CSIS0 17 269 + #define GSCL_CLK_SMMU3_LITE_D 18 270 + #define GSCL_CLK_SMMU3_LITE_B 19 271 + #define GSCL_CLK_SMMU3_LITE_A 20 272 + #define GSCL_CLK_SMMU3_GSCL0 21 273 + #define GSCL_CLK_SMMU3_GSCL1 22 274 + #define GSCL_CLK_SMMU3_MSCL0 23 275 + #define GSCL_CLK_SMMU3_MSCL1 24 276 + #define GSCL_SCLK_CSIS1_WRAP 25 277 + #define GSCL_SCLK_CSIS0_WRAP 26 278 + #define GSCL_NR_CLK 27 279 + 280 + 281 + /* List Of Clocks For CMU_FSYS */ 282 + 283 + #define FSYS_MOUT_PHYCLK_USBHOST20_PHYCLK_USER 1 284 + #define FSYS_MOUT_PHYCLK_USBHOST20_FREECLK_USER 2 285 + #define FSYS_MOUT_PHYCLK_USBHOST20_CLK48MOHCI_USER 3 286 + #define FSYS_MOUT_PHYCLK_USBDRD30_PIPE_PCLK_USER 4 287 + #define FSYS_MOUT_PHYCLK_USBDRD30_PHYCLOCK_USER 5 288 + #define FSYS_CLK_TSI 6 289 + #define FSYS_CLK_USBLINK 7 290 + #define FSYS_CLK_USBHOST20 8 291 + #define FSYS_CLK_USBDRD30 9 292 + #define FSYS_CLK_SROMC 10 293 + #define FSYS_CLK_PDMA 11 294 + #define FSYS_CLK_MMC2 12 295 + #define FSYS_CLK_MMC1 13 296 + #define FSYS_CLK_MMC0 14 297 + #define FSYS_CLK_RTIC 15 298 + #define FSYS_CLK_SMMU_RTIC 16 299 + #define FSYS_PHYCLK_USBDRD30 17 300 + #define FSYS_PHYCLK_USBHOST20 18 301 + #define FSYS_NR_CLK 19 302 + 303 + 304 + /* List Of Clocks For CMU_PERI */ 305 + 306 + #define PERI_MOUT_SCLK_SPDIF 1 307 + #define PERI_MOUT_SCLK_I2SCOD 2 308 + #define PERI_MOUT_SCLK_PCM 3 309 + #define PERI_DOUT_I2S 4 310 + #define PERI_DOUT_PCM 5 311 + #define PERI_CLK_WDT_KFC 6 312 + #define PERI_CLK_WDT_EGL 7 313 + #define PERI_CLK_HSIC3 8 314 + #define PERI_CLK_HSIC2 9 315 + #define PERI_CLK_HSIC1 10 316 + #define PERI_CLK_HSIC0 11 317 + #define PERI_CLK_PCM 12 318 + #define PERI_CLK_MCT 13 319 + #define PERI_CLK_I2S 14 320 + #define PERI_CLK_I2CHDMI 15 321 + #define PERI_CLK_I2C7 16 322 + #define PERI_CLK_I2C6 17 323 + #define PERI_CLK_I2C5 18 324 + #define PERI_CLK_I2C4 19 325 + #define PERI_CLK_I2C9 20 326 + #define PERI_CLK_I2C8 21 327 + #define PERI_CLK_I2C11 22 328 + #define PERI_CLK_I2C10 23 329 + #define PERI_CLK_HDMICEC 24 330 + #define PERI_CLK_EFUSE_WRITER 25 331 + #define PERI_CLK_ABB 26 332 + #define PERI_CLK_UART2 27 333 + #define PERI_CLK_UART1 28 334 + #define PERI_CLK_UART0 29 335 + #define PERI_CLK_ADC 30 336 + #define PERI_CLK_TMU4 31 337 + #define PERI_CLK_TMU3 32 338 + #define PERI_CLK_TMU2 33 339 + #define PERI_CLK_TMU1 34 340 + #define PERI_CLK_TMU0 35 341 + #define PERI_CLK_SPI2 36 342 + #define PERI_CLK_SPI1 37 343 + #define PERI_CLK_SPI0 38 344 + #define PERI_CLK_SPDIF 39 345 + #define PERI_CLK_PWM 40 346 + #define PERI_CLK_UART4 41 347 + #define PERI_CLK_CHIPID 42 348 + #define PERI_CLK_PROVKEY0 43 349 + #define PERI_CLK_PROVKEY1 44 350 + #define PERI_CLK_SECKEY 45 351 + #define PERI_CLK_TOP_RTC 46 352 + #define PERI_CLK_TZPC10 47 353 + #define PERI_CLK_TZPC9 48 354 + #define PERI_CLK_TZPC8 49 355 + #define PERI_CLK_TZPC7 50 356 + #define PERI_CLK_TZPC6 51 357 + #define PERI_CLK_TZPC5 52 358 + #define PERI_CLK_TZPC4 53 359 + #define PERI_CLK_TZPC3 54 360 + #define PERI_CLK_TZPC2 55 361 + #define PERI_CLK_TZPC1 56 362 + #define PERI_CLK_TZPC0 57 363 + #define PERI_SCLK_UART2 58 364 + #define PERI_SCLK_UART1 59 365 + #define PERI_SCLK_UART0 60 366 + #define PERI_SCLK_SPI2 61 367 + #define PERI_SCLK_SPI1 62 368 + #define PERI_SCLK_SPI0 63 369 + #define PERI_SCLK_SPDIF 64 370 + #define PERI_SCLK_I2S 65 371 + #define PERI_SCLK_PCM1 66 372 + #define PERI_NR_CLK 67 373 + 374 + 375 + /* List Of Clocks For CMU_DISP */ 376 + 377 + #define DISP_MOUT_SCLK_HDMI_SPDIF 1 378 + #define DISP_MOUT_SCLK_HDMI_PIXEL 2 379 + #define DISP_MOUT_PHYCLK_MIPI_DPHY_4LMRXCLK_ESC0_USER 3 380 + #define DISP_MOUT_PHYCLK_HDMI_PHY_TMDS_CLKO_USER 4 381 + #define DISP_MOUT_PHYCLK_HDMI_PHY_REF_CLKO_USER 5 382 + #define DISP_MOUT_HDMI_PHY_PIXEL 6 383 + #define DISP_MOUT_PHYCLK_HDMI_LINK_O_TMDS_CLKHI_USER 7 384 + #define DISP_MOUT_PHYCLK_MIPI_DPHY_4L_M_TXBYTE_CLKHS 8 385 + #define DISP_MOUT_PHYCLK_DPTX_PHY_O_REF_CLK_24M_USER 9 386 + #define DISP_MOUT_PHYCLK_DPTX_PHY_CLK_DIV2_USER 10 387 + #define DISP_MOUT_PHYCLK_DPTX_PHY_CH3_TXD_CLK_USER 11 388 + #define DISP_MOUT_PHYCLK_DPTX_PHY_CH2_TXD_CLK_USER 12 389 + #define DISP_MOUT_PHYCLK_DPTX_PHY_CH1_TXD_CLK_USER 13 390 + #define DISP_MOUT_PHYCLK_DPTX_PHY_CH0_TXD_CLK_USER 14 391 + #define DISP_MOUT_ACLK_DISP_222_USER 15 392 + #define DISP_MOUT_SCLK_DISP_PIXEL_USER 16 393 + #define DISP_MOUT_ACLK_DISP_333_USER 17 394 + #define DISP_DOUT_SCLK_HDMI_PHY_PIXEL_CLKI 18 395 + #define DISP_DOUT_SCLK_FIMD1_EXTCLKPLL 19 396 + #define DISP_DOUT_PCLK_DISP_111 20 397 + #define DISP_CLK_SMMU_TV 21 398 + #define DISP_CLK_SMMU_FIMD1M1 22 399 + #define DISP_CLK_SMMU_FIMD1M0 23 400 + #define DISP_CLK_PIXEL_MIXER 24 401 + #define DISP_CLK_PIXEL_DISP 25 402 + #define DISP_CLK_MIXER 26 403 + #define DISP_CLK_MIPIPHY 27 404 + #define DISP_CLK_HDMIPHY 28 405 + #define DISP_CLK_HDMI 29 406 + #define DISP_CLK_FIMD1 30 407 + #define DISP_CLK_DSIM1 31 408 + #define DISP_CLK_DPPHY 32 409 + #define DISP_CLK_DP 33 410 + #define DISP_SCLK_PIXEL 34 411 + #define DISP_MOUT_HDMI_PHY_PIXEL_USER 35 412 + #define DISP_NR_CLK 36 413 + 414 + 415 + /* List Of Clocks For CMU_G2D */ 416 + 417 + #define G2D_MOUT_ACLK_G2D_333_USER 1 418 + #define G2D_DOUT_PCLK_G2D_83 2 419 + #define G2D_CLK_SMMU3_JPEG 3 420 + #define G2D_CLK_MDMA 4 421 + #define G2D_CLK_JPEG 5 422 + #define G2D_CLK_G2D 6 423 + #define G2D_CLK_SSS 7 424 + #define G2D_CLK_SLIM_SSS 8 425 + #define G2D_CLK_SMMU_SLIM_SSS 9 426 + #define G2D_CLK_SMMU_SSS 10 427 + #define G2D_CLK_SMMU_MDMA 11 428 + #define G2D_CLK_SMMU3_G2D 12 429 + #define G2D_NR_CLK 13 430 + 431 + 432 + /* List Of Clocks For CMU_ISP */ 433 + 434 + #define ISP_MOUT_ISP_400_USER 1 435 + #define ISP_MOUT_ISP_266_USER 2 436 + #define ISP_DOUT_SCLK_MPWM 3 437 + #define ISP_DOUT_CA5_PCLKDBG 4 438 + #define ISP_DOUT_CA5_ATCLKIN 5 439 + #define ISP_DOUT_PCLK_ISP_133 6 440 + #define ISP_DOUT_PCLK_ISP_66 7 441 + #define ISP_CLK_GIC 8 442 + #define ISP_CLK_WDT 9 443 + #define ISP_CLK_UART 10 444 + #define ISP_CLK_SPI1 11 445 + #define ISP_CLK_SPI0 12 446 + #define ISP_CLK_SMMU_SCALERP 13 447 + #define ISP_CLK_SMMU_SCALERC 14 448 + #define ISP_CLK_SMMU_ISPCX 15 449 + #define ISP_CLK_SMMU_ISP 16 450 + #define ISP_CLK_SMMU_FD 17 451 + #define ISP_CLK_SMMU_DRC 18 452 + #define ISP_CLK_PWM 19 453 + #define ISP_CLK_MTCADC 20 454 + #define ISP_CLK_MPWM 21 455 + #define ISP_CLK_MCUCTL 22 456 + #define ISP_CLK_I2C1 23 457 + #define ISP_CLK_I2C0 24 458 + #define ISP_CLK_FIMC_SCALERP 25 459 + #define ISP_CLK_FIMC_SCALERC 26 460 + #define ISP_CLK_FIMC 27 461 + #define ISP_CLK_FIMC_FD 28 462 + #define ISP_CLK_FIMC_DRC 29 463 + #define ISP_CLK_CA5 30 464 + #define ISP_SCLK_SPI0_EXT 31 465 + #define ISP_SCLK_SPI1_EXT 32 466 + #define ISP_SCLK_UART_EXT 33 467 + #define ISP_NR_CLK 34 468 + 469 + #endif
+34 -9
include/dt-bindings/clock/exynos5420.h
··· 58 58 #define CLK_SCLK_GSCL_WA 156 59 59 #define CLK_SCLK_GSCL_WB 157 60 60 #define CLK_SCLK_HDMIPHY 158 61 + #define CLK_MAU_EPLL 159 62 + #define CLK_SCLK_HSIC_12M 160 63 + #define CLK_SCLK_MPHY_IXTAL24 161 61 64 62 65 /* gate clocks */ 63 66 #define CLK_ACLK66_PERIC 256 ··· 72 69 #define CLK_I2C1 262 73 70 #define CLK_I2C2 263 74 71 #define CLK_I2C3 264 75 - #define CLK_I2C4 265 76 - #define CLK_I2C5 266 77 - #define CLK_I2C6 267 78 - #define CLK_I2C7 268 72 + #define CLK_USI0 265 73 + #define CLK_USI1 266 74 + #define CLK_USI2 267 75 + #define CLK_USI3 268 79 76 #define CLK_I2C_HDMI 269 80 77 #define CLK_TSADC 270 81 78 #define CLK_SPI0 271 ··· 88 85 #define CLK_PCM2 278 89 86 #define CLK_PWM 279 90 87 #define CLK_SPDIF 280 91 - #define CLK_I2C8 281 92 - #define CLK_I2C9 282 93 - #define CLK_I2C10 283 88 + #define CLK_USI4 281 89 + #define CLK_USI5 282 90 + #define CLK_USI6 283 94 91 #define CLK_ACLK66_PSGEN 300 95 92 #define CLK_CHIPID 301 96 93 #define CLK_SYSREG 302 ··· 143 140 #define CLK_HDMI 413 144 141 #define CLK_ACLK300_DISP1 420 145 142 #define CLK_FIMD1 421 146 - #define CLK_SMMU_FIMD1 422 143 + #define CLK_SMMU_FIMD1M0 422 144 + #define CLK_SMMU_FIMD1M1 423 147 145 #define CLK_ACLK166 430 148 146 #define CLK_MIXER 431 149 147 #define CLK_ACLK266 440 ··· 156 152 #define CLK_JPEG 451 157 153 #define CLK_JPEG2 452 158 154 #define CLK_SMMU_JPEG 453 155 + #define CLK_SMMU_JPEG2 454 159 156 #define CLK_ACLK300_GSCL 460 160 157 #define CLK_SMMU_GSCL0 461 161 158 #define CLK_SMMU_GSCL1 462 ··· 164 159 #define CLK_GSCL_WB 464 165 160 #define CLK_GSCL0 465 166 161 #define CLK_GSCL1 466 167 - #define CLK_CLK_3AA 467 162 + #define CLK_FIMC_3AA 467 168 163 #define CLK_ACLK266_G2D 470 169 164 #define CLK_SSS 471 170 165 #define CLK_SLIM_SSS 472 ··· 177 172 #define CLK_SMMU_FIMCL1 493 178 173 #define CLK_SMMU_FIMCL3 494 179 174 #define CLK_FIMC_LITE3 495 175 + #define CLK_FIMC_LITE0 496 176 + #define CLK_FIMC_LITE1 497 180 177 #define CLK_ACLK_G3D 500 181 178 #define CLK_G3D 501 182 179 #define CLK_SMMU_MIXER 502 180 + #define CLK_SMMU_G2D 503 181 + #define CLK_SMMU_MDMA0 504 182 + #define CLK_MC 505 183 + #define CLK_TOP_RTC 506 184 + #define CLK_SCLK_UART_ISP 510 185 + #define CLK_SCLK_SPI0_ISP 511 186 + #define CLK_SCLK_SPI1_ISP 512 187 + #define CLK_SCLK_PWM_ISP 513 188 + #define CLK_SCLK_ISP_SENSOR0 514 189 + #define CLK_SCLK_ISP_SENSOR1 515 190 + #define CLK_SCLK_ISP_SENSOR2 516 191 + #define CLK_ACLK432_SCALER 517 192 + #define CLK_ACLK432_CAM 518 193 + #define CLK_ACLK_FL1550_CAM 519 194 + #define CLK_ACLK550_CAM 520 183 195 184 196 /* mux clocks */ 185 197 #define CLK_MOUT_HDMI 640 198 + #define CLK_MOUT_G3D 641 199 + #define CLK_MOUT_VPLL 642 200 + #define CLK_MOUT_MAUDIO0 643 186 201 187 202 /* divider clocks */ 188 203 #define CLK_DOUT_PIXEL 768
+62
include/dt-bindings/clock/s3c2410.h
··· 1 + /* 2 + * Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de> 3 + * 4 + * This program is free software; you can redistribute it and/or modify 5 + * it under the terms of the GNU General Public License version 2 as 6 + * published by the Free Software Foundation. 7 + * 8 + * Device Tree binding constants clock controllers of Samsung S3C2410 and later. 9 + */ 10 + 11 + #ifndef _DT_BINDINGS_CLOCK_SAMSUNG_S3C2410_CLOCK_H 12 + #define _DT_BINDINGS_CLOCK_SAMSUNG_S3C2410_CLOCK_H 13 + 14 + /* 15 + * Let each exported clock get a unique index, which is used on DT-enabled 16 + * platforms to lookup the clock from a clock specifier. These indices are 17 + * therefore considered an ABI and so must not be changed. This implies 18 + * that new clocks should be added either in free spaces between clock groups 19 + * or at the end. 20 + */ 21 + 22 + /* Core clocks. */ 23 + 24 + /* id 1 is reserved */ 25 + #define MPLL 2 26 + #define UPLL 3 27 + #define FCLK 4 28 + #define HCLK 5 29 + #define PCLK 6 30 + #define UCLK 7 31 + #define ARMCLK 8 32 + 33 + /* pclk-gates */ 34 + #define PCLK_UART0 16 35 + #define PCLK_UART1 17 36 + #define PCLK_UART2 18 37 + #define PCLK_I2C 19 38 + #define PCLK_SDI 20 39 + #define PCLK_SPI 21 40 + #define PCLK_ADC 22 41 + #define PCLK_AC97 23 42 + #define PCLK_I2S 24 43 + #define PCLK_PWM 25 44 + #define PCLK_RTC 26 45 + #define PCLK_GPIO 27 46 + 47 + 48 + /* hclk-gates */ 49 + #define HCLK_LCD 32 50 + #define HCLK_USBH 33 51 + #define HCLK_USBD 34 52 + #define HCLK_NAND 35 53 + #define HCLK_CAM 36 54 + 55 + 56 + #define CAMIF 40 57 + 58 + 59 + /* Total number of clocks. */ 60 + #define NR_CLKS (CAMIF + 1) 61 + 62 + #endif /* _DT_BINDINGS_CLOCK_SAMSUNG_S3C2443_CLOCK_H */
+73
include/dt-bindings/clock/s3c2412.h
··· 1 + /* 2 + * Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de> 3 + * 4 + * This program is free software; you can redistribute it and/or modify 5 + * it under the terms of the GNU General Public License version 2 as 6 + * published by the Free Software Foundation. 7 + * 8 + * Device Tree binding constants clock controllers of Samsung S3C2412. 9 + */ 10 + 11 + #ifndef _DT_BINDINGS_CLOCK_SAMSUNG_S3C2412_CLOCK_H 12 + #define _DT_BINDINGS_CLOCK_SAMSUNG_S3C2412_CLOCK_H 13 + 14 + /* 15 + * Let each exported clock get a unique index, which is used on DT-enabled 16 + * platforms to lookup the clock from a clock specifier. These indices are 17 + * therefore considered an ABI and so must not be changed. This implies 18 + * that new clocks should be added either in free spaces between clock groups 19 + * or at the end. 20 + */ 21 + 22 + /* Core clocks. */ 23 + 24 + /* id 1 is reserved */ 25 + #define MPLL 2 26 + #define UPLL 3 27 + #define MDIVCLK 4 28 + #define MSYSCLK 5 29 + #define USYSCLK 6 30 + #define HCLK 7 31 + #define PCLK 8 32 + #define ARMDIV 9 33 + #define ARMCLK 10 34 + 35 + 36 + /* Special clocks */ 37 + #define SCLK_CAM 16 38 + #define SCLK_UART 17 39 + #define SCLK_I2S 18 40 + #define SCLK_USBD 19 41 + #define SCLK_USBH 20 42 + 43 + /* pclk-gates */ 44 + #define PCLK_WDT 32 45 + #define PCLK_SPI 33 46 + #define PCLK_I2S 34 47 + #define PCLK_I2C 35 48 + #define PCLK_ADC 36 49 + #define PCLK_RTC 37 50 + #define PCLK_GPIO 38 51 + #define PCLK_UART2 39 52 + #define PCLK_UART1 40 53 + #define PCLK_UART0 41 54 + #define PCLK_SDI 42 55 + #define PCLK_PWM 43 56 + #define PCLK_USBD 44 57 + 58 + /* hclk-gates */ 59 + #define HCLK_HALF 48 60 + #define HCLK_X2 49 61 + #define HCLK_SDRAM 50 62 + #define HCLK_USBH 51 63 + #define HCLK_LCD 52 64 + #define HCLK_NAND 53 65 + #define HCLK_DMA3 54 66 + #define HCLK_DMA2 55 67 + #define HCLK_DMA1 56 68 + #define HCLK_DMA0 57 69 + 70 + /* Total number of clocks. */ 71 + #define NR_CLKS (HCLK_DMA0 + 1) 72 + 73 + #endif /* _DT_BINDINGS_CLOCK_SAMSUNG_S3C2412_CLOCK_H */
+92
include/dt-bindings/clock/s3c2443.h
··· 1 + /* 2 + * Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de> 3 + * 4 + * This program is free software; you can redistribute it and/or modify 5 + * it under the terms of the GNU General Public License version 2 as 6 + * published by the Free Software Foundation. 7 + * 8 + * Device Tree binding constants clock controllers of Samsung S3C2443 and later. 9 + */ 10 + 11 + #ifndef _DT_BINDINGS_CLOCK_SAMSUNG_S3C2443_CLOCK_H 12 + #define _DT_BINDINGS_CLOCK_SAMSUNG_S3C2443_CLOCK_H 13 + 14 + /* 15 + * Let each exported clock get a unique index, which is used on DT-enabled 16 + * platforms to lookup the clock from a clock specifier. These indices are 17 + * therefore considered an ABI and so must not be changed. This implies 18 + * that new clocks should be added either in free spaces between clock groups 19 + * or at the end. 20 + */ 21 + 22 + /* Core clocks. */ 23 + #define MSYSCLK 1 24 + #define ESYSCLK 2 25 + #define ARMDIV 3 26 + #define ARMCLK 4 27 + #define HCLK 5 28 + #define PCLK 6 29 + 30 + /* Special clocks */ 31 + #define SCLK_HSSPI0 16 32 + #define SCLK_FIMD 17 33 + #define SCLK_I2S0 18 34 + #define SCLK_I2S1 19 35 + #define SCLK_HSMMC1 20 36 + #define SCLK_HSMMC_EXT 21 37 + #define SCLK_CAM 22 38 + #define SCLK_UART 23 39 + #define SCLK_USBH 24 40 + 41 + /* Muxes */ 42 + #define MUX_HSSPI0 32 43 + #define MUX_HSSPI1 33 44 + #define MUX_HSMMC0 34 45 + #define MUX_HSMMC1 35 46 + 47 + /* hclk-gates */ 48 + #define HCLK_DMA0 48 49 + #define HCLK_DMA1 49 50 + #define HCLK_DMA2 50 51 + #define HCLK_DMA3 51 52 + #define HCLK_DMA4 52 53 + #define HCLK_DMA5 53 54 + #define HCLK_DMA6 54 55 + #define HCLK_DMA7 55 56 + #define HCLK_CAM 56 57 + #define HCLK_LCD 57 58 + #define HCLK_USBH 58 59 + #define HCLK_USBD 59 60 + #define HCLK_IROM 60 61 + #define HCLK_HSMMC0 61 62 + #define HCLK_HSMMC1 62 63 + #define HCLK_CFC 63 64 + #define HCLK_SSMC 64 65 + #define HCLK_DRAM 65 66 + #define HCLK_2D 66 67 + 68 + /* pclk-gates */ 69 + #define PCLK_UART0 72 70 + #define PCLK_UART1 73 71 + #define PCLK_UART2 74 72 + #define PCLK_UART3 75 73 + #define PCLK_I2C0 76 74 + #define PCLK_SDI 77 75 + #define PCLK_SPI0 78 76 + #define PCLK_ADC 79 77 + #define PCLK_AC97 80 78 + #define PCLK_I2S0 81 79 + #define PCLK_PWM 82 80 + #define PCLK_WDT 83 81 + #define PCLK_RTC 84 82 + #define PCLK_GPIO 85 83 + #define PCLK_SPI1 86 84 + #define PCLK_CHIPID 87 85 + #define PCLK_I2C1 88 86 + #define PCLK_I2S1 89 87 + #define PCLK_PCM 90 88 + 89 + /* Total number of clocks. */ 90 + #define NR_CLKS (PCLK_PCM + 1) 91 + 92 + #endif /* _DT_BINDINGS_CLOCK_SAMSUNG_S3C2443_CLOCK_H */