2013-03-09 12:02:57 +04:00
/*
* Copyright ( c ) 2013 Samsung Electronics Co . , Ltd .
* Copyright ( c ) 2013 Linaro Ltd .
* Author : Thomas Abraham < thomas . ab @ samsung . com >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*
* Common Clock Framework support for Exynos5250 SoC .
*/
2014-01-07 18:47:34 +04:00
# include <dt-bindings/clock/exynos5250.h>
2013-03-09 12:02:57 +04:00
# include <linux/clk-provider.h>
# include <linux/of.h>
# include <linux/of_address.h>
2014-02-14 03:16:00 +04:00
# include <linux/syscore_ops.h>
2013-03-09 12:02:57 +04:00
# include "clk.h"
2015-07-01 16:10:35 +03:00
# include "clk-cpu.h"
2018-03-06 17:33:10 +03:00
# include "clk-exynos5-subcmu.h"
2013-03-09 12:02:57 +04:00
2013-06-11 13:31:08 +04:00
# define APLL_LOCK 0x0
# define APLL_CON0 0x100
2013-03-09 12:02:57 +04:00
# define SRC_CPU 0x200
# define DIV_CPU0 0x500
2014-05-09 01:43:26 +04:00
# define PWR_CTRL1 0x1020
# define PWR_CTRL2 0x1024
2013-06-11 13:31:08 +04:00
# define MPLL_LOCK 0x4000
# define MPLL_CON0 0x4100
2013-03-09 12:02:57 +04:00
# define SRC_CORE1 0x4204
2013-12-12 07:02:00 +04:00
# define GATE_IP_ACP 0x8800
2014-05-22 02:23:19 +04:00
# define GATE_IP_ISP0 0xc800
# define GATE_IP_ISP1 0xc804
2013-06-11 13:31:08 +04:00
# define CPLL_LOCK 0x10020
# define EPLL_LOCK 0x10030
# define VPLL_LOCK 0x10040
# define GPLL_LOCK 0x10050
# define CPLL_CON0 0x10120
# define EPLL_CON0 0x10130
# define VPLL_CON0 0x10140
# define GPLL_CON0 0x10150
2013-03-09 12:02:57 +04:00
# define SRC_TOP0 0x10210
2014-04-28 13:37:01 +04:00
# define SRC_TOP1 0x10214
2013-03-09 12:02:57 +04:00
# define SRC_TOP2 0x10218
2013-10-15 21:41:17 +04:00
# define SRC_TOP3 0x1021c
2013-03-09 12:02:57 +04:00
# define SRC_GSCL 0x10220
# define SRC_DISP1_0 0x1022c
# define SRC_MAU 0x10240
# define SRC_FSYS 0x10244
# define SRC_GEN 0x10248
# define SRC_PERIC0 0x10250
# define SRC_PERIC1 0x10254
# define SRC_MASK_GSCL 0x10320
# define SRC_MASK_DISP1_0 0x1032c
# define SRC_MASK_MAU 0x10334
# define SRC_MASK_FSYS 0x10340
# define SRC_MASK_GEN 0x10344
# define SRC_MASK_PERIC0 0x10350
# define SRC_MASK_PERIC1 0x10354
# define DIV_TOP0 0x10510
# define DIV_TOP1 0x10514
# define DIV_GSCL 0x10520
# define DIV_DISP1_0 0x1052c
# define DIV_GEN 0x1053c
# define DIV_MAU 0x10544
# define DIV_FSYS0 0x10548
# define DIV_FSYS1 0x1054c
# define DIV_FSYS2 0x10550
# define DIV_PERIC0 0x10558
# define DIV_PERIC1 0x1055c
# define DIV_PERIC2 0x10560
# define DIV_PERIC3 0x10564
# define DIV_PERIC4 0x10568
# define DIV_PERIC5 0x1056c
# define GATE_IP_GSCL 0x10920
2013-10-15 21:41:15 +04:00
# define GATE_IP_DISP1 0x10928
2013-03-09 12:02:57 +04:00
# define GATE_IP_MFC 0x1092c
2014-04-28 13:37:01 +04:00
# define GATE_IP_G3D 0x10930
2013-03-09 12:02:57 +04:00
# define GATE_IP_GEN 0x10934
# define GATE_IP_FSYS 0x10944
# define GATE_IP_PERIC 0x10950
# define GATE_IP_PERIS 0x10960
2013-06-11 13:31:08 +04:00
# define BPLL_LOCK 0x20010
# define BPLL_CON0 0x20110
2013-03-09 12:02:57 +04:00
# define SRC_CDREX 0x20200
# define PLL_DIV2_SEL 0x20a24
2014-05-09 01:43:26 +04:00
/*Below definitions are used for PWR_CTRL settings*/
# define PWR_CTRL1_CORE2_DOWN_RATIO (7 << 28)
# define PWR_CTRL1_CORE1_DOWN_RATIO (7 << 16)
# define PWR_CTRL1_DIV2_DOWN_EN (1 << 9)
# define PWR_CTRL1_DIV1_DOWN_EN (1 << 8)
# define PWR_CTRL1_USE_CORE1_WFE (1 << 5)
# define PWR_CTRL1_USE_CORE0_WFE (1 << 4)
# define PWR_CTRL1_USE_CORE1_WFI (1 << 1)
# define PWR_CTRL1_USE_CORE0_WFI (1 << 0)
# define PWR_CTRL2_DIV2_UP_EN (1 << 25)
# define PWR_CTRL2_DIV1_UP_EN (1 << 24)
# define PWR_CTRL2_DUR_STANDBY2_VAL (1 << 16)
# define PWR_CTRL2_DUR_STANDBY1_VAL (1 << 8)
# define PWR_CTRL2_CORE2_UP_RATIO (1 << 4)
# define PWR_CTRL2_CORE1_UP_RATIO (1 << 0)
2013-06-11 13:31:08 +04:00
/* list of PLLs to be registered */
enum exynos5250_plls {
apll , mpll , cpll , epll , vpll , gpll , bpll ,
nr_plls /* number of PLLs */
} ;
2014-02-14 03:16:00 +04:00
static void __iomem * reg_base ;
# ifdef CONFIG_PM_SLEEP
static struct samsung_clk_reg_dump * exynos5250_save ;
2013-03-09 12:02:57 +04:00
/*
* list of controller registers to be saved and restored during a
* suspend / resume cycle .
*/
2016-05-11 15:02:04 +03:00
static const unsigned long exynos5250_clk_regs [ ] __initconst = {
2013-03-09 12:02:57 +04:00
SRC_CPU ,
DIV_CPU0 ,
2014-05-09 01:43:26 +04:00
PWR_CTRL1 ,
PWR_CTRL2 ,
2013-03-09 12:02:57 +04:00
SRC_CORE1 ,
SRC_TOP0 ,
2014-04-28 13:37:01 +04:00
SRC_TOP1 ,
2013-03-09 12:02:57 +04:00
SRC_TOP2 ,
2013-10-15 21:41:17 +04:00
SRC_TOP3 ,
2013-03-09 12:02:57 +04:00
SRC_GSCL ,
SRC_DISP1_0 ,
SRC_MAU ,
SRC_FSYS ,
SRC_GEN ,
SRC_PERIC0 ,
SRC_PERIC1 ,
SRC_MASK_GSCL ,
SRC_MASK_DISP1_0 ,
SRC_MASK_MAU ,
SRC_MASK_FSYS ,
SRC_MASK_GEN ,
SRC_MASK_PERIC0 ,
SRC_MASK_PERIC1 ,
DIV_TOP0 ,
DIV_TOP1 ,
DIV_GSCL ,
DIV_DISP1_0 ,
DIV_GEN ,
DIV_MAU ,
DIV_FSYS0 ,
DIV_FSYS1 ,
DIV_FSYS2 ,
DIV_PERIC0 ,
DIV_PERIC1 ,
DIV_PERIC2 ,
DIV_PERIC3 ,
DIV_PERIC4 ,
DIV_PERIC5 ,
GATE_IP_GSCL ,
GATE_IP_MFC ,
2014-04-28 13:37:01 +04:00
GATE_IP_G3D ,
2013-03-09 12:02:57 +04:00
GATE_IP_GEN ,
GATE_IP_FSYS ,
GATE_IP_PERIC ,
GATE_IP_PERIS ,
SRC_CDREX ,
PLL_DIV2_SEL ,
2013-04-04 10:44:40 +04:00
GATE_IP_DISP1 ,
2013-07-05 12:42:27 +04:00
GATE_IP_ACP ,
2014-05-22 02:23:19 +04:00
GATE_IP_ISP0 ,
GATE_IP_ISP1 ,
2013-03-09 12:02:57 +04:00
} ;
2014-02-14 03:16:00 +04:00
static int exynos5250_clk_suspend ( void )
{
samsung_clk_save ( reg_base , exynos5250_save ,
ARRAY_SIZE ( exynos5250_clk_regs ) ) ;
return 0 ;
}
static void exynos5250_clk_resume ( void )
{
samsung_clk_restore ( reg_base , exynos5250_save ,
ARRAY_SIZE ( exynos5250_clk_regs ) ) ;
}
static struct syscore_ops exynos5250_clk_syscore_ops = {
. suspend = exynos5250_clk_suspend ,
. resume = exynos5250_clk_resume ,
} ;
2016-05-11 15:02:13 +03:00
static void __init exynos5250_clk_sleep_init ( void )
2014-02-14 03:16:00 +04:00
{
exynos5250_save = samsung_clk_alloc_reg_dump ( exynos5250_clk_regs ,
ARRAY_SIZE ( exynos5250_clk_regs ) ) ;
if ( ! exynos5250_save ) {
pr_warn ( " %s: failed to allocate sleep save data, no sleep support! \n " ,
__func__ ) ;
return ;
}
register_syscore_ops ( & exynos5250_clk_syscore_ops ) ;
}
# else
2016-05-11 15:02:13 +03:00
static void __init exynos5250_clk_sleep_init ( void ) { }
2014-02-14 03:16:00 +04:00
# endif
2013-03-09 12:02:57 +04:00
/* list of all parent clock list */
PNAME ( mout_apll_p ) = { " fin_pll " , " fout_apll " , } ;
2013-10-15 21:41:16 +04:00
PNAME ( mout_cpu_p ) = { " mout_apll " , " mout_mpll " , } ;
2013-03-09 12:02:57 +04:00
PNAME ( mout_mpll_fout_p ) = { " fout_mplldiv2 " , " fout_mpll " } ;
PNAME ( mout_mpll_p ) = { " fin_pll " , " mout_mpll_fout " } ;
PNAME ( mout_bpll_fout_p ) = { " fout_bplldiv2 " , " fout_bpll " } ;
PNAME ( mout_bpll_p ) = { " fin_pll " , " mout_bpll_fout " } ;
PNAME ( mout_vpllsrc_p ) = { " fin_pll " , " sclk_hdmi27m " } ;
PNAME ( mout_vpll_p ) = { " mout_vpllsrc " , " fout_vpll " } ;
PNAME ( mout_cpll_p ) = { " fin_pll " , " fout_cpll " } ;
PNAME ( mout_epll_p ) = { " fin_pll " , " fout_epll " } ;
2014-04-28 13:37:01 +04:00
PNAME ( mout_gpll_p ) = { " fin_pll " , " fout_gpll " } ;
2013-10-15 21:41:16 +04:00
PNAME ( mout_mpll_user_p ) = { " fin_pll " , " mout_mpll " } ;
PNAME ( mout_bpll_user_p ) = { " fin_pll " , " mout_bpll " } ;
PNAME ( mout_aclk166_p ) = { " mout_cpll " , " mout_mpll_user " } ;
PNAME ( mout_aclk200_p ) = { " mout_mpll_user " , " mout_bpll_user " } ;
2015-10-15 13:31:23 +03:00
PNAME ( mout_aclk300_p ) = { " mout_aclk300_disp1_mid " ,
" mout_aclk300_disp1_mid1 " } ;
2014-04-28 13:37:01 +04:00
PNAME ( mout_aclk400_p ) = { " mout_aclk400_g3d_mid " , " mout_gpll " } ;
2013-10-15 21:41:18 +04:00
PNAME ( mout_aclk200_sub_p ) = { " fin_pll " , " div_aclk200 " } ;
2013-10-15 21:41:17 +04:00
PNAME ( mout_aclk266_sub_p ) = { " fin_pll " , " div_aclk266 " } ;
2015-10-15 13:31:23 +03:00
PNAME ( mout_aclk300_sub_p ) = { " fin_pll " , " div_aclk300_disp " } ;
PNAME ( mout_aclk300_disp1_mid1_p ) = { " mout_vpll " , " mout_cpll " } ;
2013-10-15 21:41:21 +04:00
PNAME ( mout_aclk333_sub_p ) = { " fin_pll " , " div_aclk333 " } ;
2014-05-22 02:23:19 +04:00
PNAME ( mout_aclk400_isp_sub_p ) = { " fin_pll " , " div_aclk400_isp " } ;
2013-03-09 12:02:57 +04:00
PNAME ( mout_hdmi_p ) = { " div_hdmi_pixel " , " sclk_hdmiphy " } ;
2013-10-15 21:41:16 +04:00
PNAME ( mout_usb3_p ) = { " mout_mpll_user " , " mout_cpll " } ;
2013-03-09 12:02:57 +04:00
PNAME ( mout_group1_p ) = { " fin_pll " , " fin_pll " , " sclk_hdmi27m " ,
" sclk_dptxphy " , " sclk_uhostphy " , " sclk_hdmiphy " ,
2013-10-15 21:41:16 +04:00
" mout_mpll_user " , " mout_epll " , " mout_vpll " ,
2013-10-15 21:41:19 +04:00
" mout_cpll " , " none " , " none " ,
" none " , " none " , " none " ,
" none " } ;
2013-03-09 12:02:57 +04:00
PNAME ( mout_audio0_p ) = { " cdclk0 " , " fin_pll " , " sclk_hdmi27m " , " sclk_dptxphy " ,
2013-10-15 21:41:20 +04:00
" sclk_uhostphy " , " fin_pll " ,
2013-10-15 21:41:16 +04:00
" mout_mpll_user " , " mout_epll " , " mout_vpll " ,
2013-10-15 21:41:19 +04:00
" mout_cpll " , " none " , " none " ,
" none " , " none " , " none " ,
" none " } ;
2013-03-09 12:02:57 +04:00
PNAME ( mout_audio1_p ) = { " cdclk1 " , " fin_pll " , " sclk_hdmi27m " , " sclk_dptxphy " ,
2013-10-15 21:41:20 +04:00
" sclk_uhostphy " , " fin_pll " ,
2013-10-15 21:41:16 +04:00
" mout_mpll_user " , " mout_epll " , " mout_vpll " ,
2013-10-15 21:41:19 +04:00
" mout_cpll " , " none " , " none " ,
" none " , " none " , " none " ,
" none " } ;
2013-03-09 12:02:57 +04:00
PNAME ( mout_audio2_p ) = { " cdclk2 " , " fin_pll " , " sclk_hdmi27m " , " sclk_dptxphy " ,
2013-10-15 21:41:20 +04:00
" sclk_uhostphy " , " fin_pll " ,
2013-10-15 21:41:16 +04:00
" mout_mpll_user " , " mout_epll " , " mout_vpll " ,
2013-10-15 21:41:19 +04:00
" mout_cpll " , " none " , " none " ,
" none " , " none " , " none " ,
" none " } ;
2013-03-09 12:02:57 +04:00
PNAME ( mout_spdif_p ) = { " sclk_audio0 " , " sclk_audio1 " , " sclk_audio2 " ,
" spdif_extclk " } ;
/* fixed rate clocks generated outside the soc */
2013-07-18 14:01:19 +04:00
static struct samsung_fixed_rate_clock exynos5250_fixed_rate_ext_clks [ ] __initdata = {
2016-03-01 21:59:58 +03:00
FRATE ( CLK_FIN_PLL , " fin_pll " , NULL , 0 , 0 ) ,
2013-03-09 12:02:57 +04:00
} ;
/* fixed rate clocks generated inside the soc */
2016-05-11 15:02:04 +03:00
static const struct samsung_fixed_rate_clock exynos5250_fixed_rate_clks [ ] __initconst = {
2016-03-01 21:59:58 +03:00
FRATE ( CLK_SCLK_HDMIPHY , " sclk_hdmiphy " , NULL , 0 , 24000000 ) ,
FRATE ( 0 , " sclk_hdmi27m " , NULL , 0 , 27000000 ) ,
FRATE ( 0 , " sclk_dptxphy " , NULL , 0 , 24000000 ) ,
FRATE ( 0 , " sclk_uhostphy " , NULL , 0 , 48000000 ) ,
2013-03-09 12:02:57 +04:00
} ;
2016-05-11 15:02:04 +03:00
static const struct samsung_fixed_factor_clock exynos5250_fixed_factor_clks [ ] __initconst = {
2014-01-07 18:47:34 +04:00
FFACTOR ( 0 , " fout_mplldiv2 " , " fout_mpll " , 1 , 2 , 0 ) ,
FFACTOR ( 0 , " fout_bplldiv2 " , " fout_bpll " , 1 , 2 , 0 ) ,
2013-03-09 12:02:57 +04:00
} ;
2016-05-11 15:02:04 +03:00
static const struct samsung_mux_clock exynos5250_pll_pmux_clks [ ] __initconst = {
2014-01-07 18:47:34 +04:00
MUX ( 0 , " mout_vpllsrc " , mout_vpllsrc_p , SRC_TOP2 , 0 , 1 ) ,
2013-06-11 13:31:15 +04:00
} ;
2016-05-11 15:02:04 +03:00
static const struct samsung_mux_clock exynos5250_mux_clks [ ] __initconst = {
2013-10-15 21:41:15 +04:00
/*
* NOTE : Following table is sorted by ( clock domain , register address ,
* bitfield shift ) triplet in ascending order . When adding new entries ,
* please make sure that the order is kept , to avoid merge conflicts
* and make further work with defined data easier .
*/
/*
* CMU_CPU
*/
2017-10-03 13:00:11 +03:00
MUX_F ( 0 , " mout_apll " , mout_apll_p , SRC_CPU , 0 , 1 ,
CLK_SET_RATE_PARENT , 0 ) ,
MUX ( 0 , " mout_cpu " , mout_cpu_p , SRC_CPU , 16 , 1 ) ,
2013-10-15 21:41:15 +04:00
/*
* CMU_CORE
*/
2017-10-03 13:00:11 +03:00
MUX ( 0 , " mout_mpll " , mout_mpll_p , SRC_CORE1 , 8 , 1 ) ,
2013-10-15 21:41:15 +04:00
/*
* CMU_TOP
*/
2014-01-07 18:47:34 +04:00
MUX ( 0 , " mout_aclk166 " , mout_aclk166_p , SRC_TOP0 , 8 , 1 ) ,
MUX ( 0 , " mout_aclk200 " , mout_aclk200_p , SRC_TOP0 , 12 , 1 ) ,
2015-10-15 13:31:23 +03:00
MUX ( 0 , " mout_aclk300_disp1_mid " , mout_aclk200_p , SRC_TOP0 , 14 , 1 ) ,
MUX ( 0 , " mout_aclk300 " , mout_aclk300_p , SRC_TOP0 , 15 , 1 ) ,
2014-01-07 18:47:34 +04:00
MUX ( 0 , " mout_aclk333 " , mout_aclk166_p , SRC_TOP0 , 16 , 1 ) ,
2014-04-28 13:37:01 +04:00
MUX ( 0 , " mout_aclk400_g3d_mid " , mout_aclk200_p , SRC_TOP0 , 20 , 1 ) ,
2015-10-15 13:31:23 +03:00
MUX ( 0 , " mout_aclk300_disp1_mid1 " , mout_aclk300_disp1_mid1_p , SRC_TOP1 ,
8 , 1 ) ,
2014-05-22 02:23:19 +04:00
MUX ( 0 , " mout_aclk400_isp " , mout_aclk200_p , SRC_TOP1 , 24 , 1 ) ,
2014-04-28 13:37:01 +04:00
MUX ( 0 , " mout_aclk400_g3d " , mout_aclk400_p , SRC_TOP1 , 28 , 1 ) ,
2014-01-07 18:47:34 +04:00
MUX ( 0 , " mout_cpll " , mout_cpll_p , SRC_TOP2 , 8 , 1 ) ,
MUX ( 0 , " mout_epll " , mout_epll_p , SRC_TOP2 , 12 , 1 ) ,
MUX ( 0 , " mout_vpll " , mout_vpll_p , SRC_TOP2 , 16 , 1 ) ,
MUX ( 0 , " mout_mpll_user " , mout_mpll_user_p , SRC_TOP2 , 20 , 1 ) ,
MUX ( 0 , " mout_bpll_user " , mout_bpll_user_p , SRC_TOP2 , 24 , 1 ) ,
2014-04-28 13:37:01 +04:00
MUX ( CLK_MOUT_GPLL , " mout_gpll " , mout_gpll_p , SRC_TOP2 , 28 , 1 ) ,
2014-01-07 18:47:34 +04:00
2015-10-15 13:31:23 +03:00
MUX ( CLK_MOUT_ACLK200_DISP1_SUB , " mout_aclk200_disp1_sub " ,
mout_aclk200_sub_p , SRC_TOP3 , 4 , 1 ) ,
MUX ( CLK_MOUT_ACLK300_DISP1_SUB , " mout_aclk300_disp1_sub " ,
mout_aclk300_sub_p , SRC_TOP3 , 6 , 1 ) ,
2014-01-07 18:47:34 +04:00
MUX ( 0 , " mout_aclk266_gscl_sub " , mout_aclk266_sub_p , SRC_TOP3 , 8 , 1 ) ,
2014-05-22 02:23:19 +04:00
MUX ( 0 , " mout_aclk_266_isp_sub " , mout_aclk266_sub_p , SRC_TOP3 , 16 , 1 ) ,
MUX ( 0 , " mout_aclk_400_isp_sub " , mout_aclk400_isp_sub_p ,
SRC_TOP3 , 20 , 1 ) ,
2014-01-07 18:47:34 +04:00
MUX ( 0 , " mout_aclk333_sub " , mout_aclk333_sub_p , SRC_TOP3 , 24 , 1 ) ,
MUX ( 0 , " mout_cam_bayer " , mout_group1_p , SRC_GSCL , 12 , 4 ) ,
MUX ( 0 , " mout_cam0 " , mout_group1_p , SRC_GSCL , 16 , 4 ) ,
MUX ( 0 , " mout_cam1 " , mout_group1_p , SRC_GSCL , 20 , 4 ) ,
MUX ( 0 , " mout_gscl_wa " , mout_group1_p , SRC_GSCL , 24 , 4 ) ,
MUX ( 0 , " mout_gscl_wb " , mout_group1_p , SRC_GSCL , 28 , 4 ) ,
MUX ( 0 , " mout_fimd1 " , mout_group1_p , SRC_DISP1_0 , 0 , 4 ) ,
MUX ( 0 , " mout_mipi1 " , mout_group1_p , SRC_DISP1_0 , 12 , 4 ) ,
MUX ( 0 , " mout_dp " , mout_group1_p , SRC_DISP1_0 , 16 , 4 ) ,
MUX ( CLK_MOUT_HDMI , " mout_hdmi " , mout_hdmi_p , SRC_DISP1_0 , 20 , 1 ) ,
MUX ( 0 , " mout_audio0 " , mout_audio0_p , SRC_MAU , 0 , 4 ) ,
MUX ( 0 , " mout_mmc0 " , mout_group1_p , SRC_FSYS , 0 , 4 ) ,
MUX ( 0 , " mout_mmc1 " , mout_group1_p , SRC_FSYS , 4 , 4 ) ,
MUX ( 0 , " mout_mmc2 " , mout_group1_p , SRC_FSYS , 8 , 4 ) ,
MUX ( 0 , " mout_mmc3 " , mout_group1_p , SRC_FSYS , 12 , 4 ) ,
MUX ( 0 , " mout_sata " , mout_aclk200_p , SRC_FSYS , 24 , 1 ) ,
MUX ( 0 , " mout_usb3 " , mout_usb3_p , SRC_FSYS , 28 , 1 ) ,
MUX ( 0 , " mout_jpeg " , mout_group1_p , SRC_GEN , 0 , 4 ) ,
MUX ( 0 , " mout_uart0 " , mout_group1_p , SRC_PERIC0 , 0 , 4 ) ,
MUX ( 0 , " mout_uart1 " , mout_group1_p , SRC_PERIC0 , 4 , 4 ) ,
MUX ( 0 , " mout_uart2 " , mout_group1_p , SRC_PERIC0 , 8 , 4 ) ,
MUX ( 0 , " mout_uart3 " , mout_group1_p , SRC_PERIC0 , 12 , 4 ) ,
MUX ( 0 , " mout_pwm " , mout_group1_p , SRC_PERIC0 , 24 , 4 ) ,
MUX ( 0 , " mout_audio1 " , mout_audio1_p , SRC_PERIC1 , 0 , 4 ) ,
MUX ( 0 , " mout_audio2 " , mout_audio2_p , SRC_PERIC1 , 4 , 4 ) ,
MUX ( 0 , " mout_spdif " , mout_spdif_p , SRC_PERIC1 , 8 , 2 ) ,
MUX ( 0 , " mout_spi0 " , mout_group1_p , SRC_PERIC1 , 16 , 4 ) ,
MUX ( 0 , " mout_spi1 " , mout_group1_p , SRC_PERIC1 , 20 , 4 ) ,
MUX ( 0 , " mout_spi2 " , mout_group1_p , SRC_PERIC1 , 24 , 4 ) ,
2013-10-15 21:41:15 +04:00
/*
* CMU_CDREX
*/
2014-01-07 18:47:34 +04:00
MUX ( 0 , " mout_bpll " , mout_bpll_p , SRC_CDREX , 0 , 1 ) ,
2013-10-15 21:41:15 +04:00
2014-01-07 18:47:34 +04:00
MUX ( 0 , " mout_mpll_fout " , mout_mpll_fout_p , PLL_DIV2_SEL , 4 , 1 ) ,
MUX ( 0 , " mout_bpll_fout " , mout_bpll_fout_p , PLL_DIV2_SEL , 0 , 1 ) ,
2013-03-09 12:02:57 +04:00
} ;
2016-05-11 15:02:04 +03:00
static const struct samsung_div_clock exynos5250_div_clks [ ] __initconst = {
2013-10-15 21:41:15 +04:00
/*
* NOTE : Following table is sorted by ( clock domain , register address ,
* bitfield shift ) triplet in ascending order . When adding new entries ,
* please make sure that the order is kept , to avoid merge conflicts
* and make further work with defined data easier .
*/
/*
* CMU_CPU
*/
2014-01-07 18:47:34 +04:00
DIV ( 0 , " div_arm " , " mout_cpu " , DIV_CPU0 , 0 , 3 ) ,
DIV ( 0 , " div_apll " , " mout_apll " , DIV_CPU0 , 24 , 3 ) ,
2017-10-03 13:00:11 +03:00
DIV ( 0 , " div_arm2 " , " div_arm " , DIV_CPU0 , 28 , 3 ) ,
2013-10-15 21:41:15 +04:00
/*
* CMU_TOP
*/
2014-01-07 18:47:34 +04:00
DIV ( 0 , " div_aclk66 " , " div_aclk66_pre " , DIV_TOP0 , 0 , 3 ) ,
DIV ( 0 , " div_aclk166 " , " mout_aclk166 " , DIV_TOP0 , 8 , 3 ) ,
DIV ( 0 , " div_aclk200 " , " mout_aclk200 " , DIV_TOP0 , 12 , 3 ) ,
DIV ( 0 , " div_aclk266 " , " mout_mpll_user " , DIV_TOP0 , 16 , 3 ) ,
DIV ( 0 , " div_aclk333 " , " mout_aclk333 " , DIV_TOP0 , 20 , 3 ) ,
2014-04-28 13:37:01 +04:00
DIV ( 0 , " div_aclk400_g3d " , " mout_aclk400_g3d " , DIV_TOP0 ,
24 , 3 ) ,
2015-10-15 13:31:23 +03:00
DIV ( 0 , " div_aclk300_disp " , " mout_aclk300 " , DIV_TOP0 , 28 , 3 ) ,
2014-01-07 18:47:34 +04:00
2014-05-22 02:23:19 +04:00
DIV ( 0 , " div_aclk400_isp " , " mout_aclk400_isp " , DIV_TOP1 , 20 , 3 ) ,
2014-01-07 18:47:34 +04:00
DIV ( 0 , " div_aclk66_pre " , " mout_mpll_user " , DIV_TOP1 , 24 , 3 ) ,
DIV ( 0 , " div_cam_bayer " , " mout_cam_bayer " , DIV_GSCL , 12 , 4 ) ,
DIV ( 0 , " div_cam0 " , " mout_cam0 " , DIV_GSCL , 16 , 4 ) ,
DIV ( 0 , " div_cam1 " , " mout_cam1 " , DIV_GSCL , 20 , 4 ) ,
DIV ( 0 , " div_gscl_wa " , " mout_gscl_wa " , DIV_GSCL , 24 , 4 ) ,
DIV ( 0 , " div_gscl_wb " , " mout_gscl_wb " , DIV_GSCL , 28 , 4 ) ,
DIV ( 0 , " div_fimd1 " , " mout_fimd1 " , DIV_DISP1_0 , 0 , 4 ) ,
DIV ( 0 , " div_mipi1 " , " mout_mipi1 " , DIV_DISP1_0 , 16 , 4 ) ,
DIV_F ( 0 , " div_mipi1_pre " , " div_mipi1 " ,
2013-10-15 21:41:15 +04:00
DIV_DISP1_0 , 20 , 4 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
DIV ( 0 , " div_dp " , " mout_dp " , DIV_DISP1_0 , 24 , 4 ) ,
DIV ( CLK_SCLK_PIXEL , " div_hdmi_pixel " , " mout_vpll " , DIV_DISP1_0 , 28 , 4 ) ,
2013-10-15 21:41:15 +04:00
2014-01-07 18:47:34 +04:00
DIV ( 0 , " div_jpeg " , " mout_jpeg " , DIV_GEN , 4 , 4 ) ,
2013-10-15 21:41:15 +04:00
2014-01-07 18:47:34 +04:00
DIV ( 0 , " div_audio0 " , " mout_audio0 " , DIV_MAU , 0 , 4 ) ,
2013-09-26 01:12:49 +04:00
DIV ( CLK_DIV_PCM0 , " div_pcm0 " , " sclk_audio0 " , DIV_MAU , 4 , 8 ) ,
2013-10-15 21:41:15 +04:00
2014-01-07 18:47:34 +04:00
DIV ( 0 , " div_sata " , " mout_sata " , DIV_FSYS0 , 20 , 4 ) ,
DIV ( 0 , " div_usb3 " , " mout_usb3 " , DIV_FSYS0 , 24 , 4 ) ,
2013-10-15 21:41:15 +04:00
2014-01-07 18:47:34 +04:00
DIV ( 0 , " div_mmc0 " , " mout_mmc0 " , DIV_FSYS1 , 0 , 4 ) ,
DIV_F ( 0 , " div_mmc_pre0 " , " div_mmc0 " ,
2013-10-15 21:41:15 +04:00
DIV_FSYS1 , 8 , 8 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
DIV ( 0 , " div_mmc1 " , " mout_mmc1 " , DIV_FSYS1 , 16 , 4 ) ,
DIV_F ( 0 , " div_mmc_pre1 " , " div_mmc1 " ,
2013-10-15 21:41:15 +04:00
DIV_FSYS1 , 24 , 8 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
DIV ( 0 , " div_mmc2 " , " mout_mmc2 " , DIV_FSYS2 , 0 , 4 ) ,
DIV_F ( 0 , " div_mmc_pre2 " , " div_mmc2 " ,
2013-10-15 21:41:15 +04:00
DIV_FSYS2 , 8 , 8 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
DIV ( 0 , " div_mmc3 " , " mout_mmc3 " , DIV_FSYS2 , 16 , 4 ) ,
DIV_F ( 0 , " div_mmc_pre3 " , " div_mmc3 " ,
2013-10-15 21:41:15 +04:00
DIV_FSYS2 , 24 , 8 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
DIV ( 0 , " div_uart0 " , " mout_uart0 " , DIV_PERIC0 , 0 , 4 ) ,
DIV ( 0 , " div_uart1 " , " mout_uart1 " , DIV_PERIC0 , 4 , 4 ) ,
DIV ( 0 , " div_uart2 " , " mout_uart2 " , DIV_PERIC0 , 8 , 4 ) ,
DIV ( 0 , " div_uart3 " , " mout_uart3 " , DIV_PERIC0 , 12 , 4 ) ,
2013-10-15 21:41:15 +04:00
2014-01-07 18:47:34 +04:00
DIV ( 0 , " div_spi0 " , " mout_spi0 " , DIV_PERIC1 , 0 , 4 ) ,
DIV_F ( 0 , " div_spi_pre0 " , " div_spi0 " ,
2013-10-15 21:41:15 +04:00
DIV_PERIC1 , 8 , 8 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
DIV ( 0 , " div_spi1 " , " mout_spi1 " , DIV_PERIC1 , 16 , 4 ) ,
DIV_F ( 0 , " div_spi_pre1 " , " div_spi1 " ,
2013-10-15 21:41:15 +04:00
DIV_PERIC1 , 24 , 8 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
DIV ( 0 , " div_spi2 " , " mout_spi2 " , DIV_PERIC2 , 0 , 4 ) ,
DIV_F ( 0 , " div_spi_pre2 " , " div_spi2 " ,
2013-10-15 21:41:15 +04:00
DIV_PERIC2 , 8 , 8 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
DIV ( 0 , " div_pwm " , " mout_pwm " , DIV_PERIC3 , 0 , 4 ) ,
2013-10-15 21:41:15 +04:00
2014-01-07 18:47:34 +04:00
DIV ( 0 , " div_audio1 " , " mout_audio1 " , DIV_PERIC4 , 0 , 4 ) ,
DIV ( 0 , " div_pcm1 " , " sclk_audio1 " , DIV_PERIC4 , 4 , 8 ) ,
DIV ( 0 , " div_audio2 " , " mout_audio2 " , DIV_PERIC4 , 16 , 4 ) ,
DIV ( 0 , " div_pcm2 " , " sclk_audio2 " , DIV_PERIC4 , 20 , 8 ) ,
2013-10-15 21:41:15 +04:00
2014-01-07 18:47:34 +04:00
DIV ( CLK_DIV_I2S1 , " div_i2s1 " , " sclk_audio1 " , DIV_PERIC5 , 0 , 6 ) ,
DIV ( CLK_DIV_I2S2 , " div_i2s2 " , " sclk_audio2 " , DIV_PERIC5 , 8 , 6 ) ,
2013-03-09 12:02:57 +04:00
} ;
2016-05-11 15:02:04 +03:00
static const struct samsung_gate_clock exynos5250_gate_clks [ ] __initconst = {
2013-10-15 21:41:15 +04:00
/*
* NOTE : Following table is sorted by ( clock domain , register address ,
* bitfield shift ) triplet in ascending order . When adding new entries ,
* please make sure that the order is kept , to avoid merge conflicts
* and make further work with defined data easier .
*/
/*
* CMU_ACP
*/
2014-01-07 18:47:34 +04:00
GATE ( CLK_MDMA0 , " mdma0 " , " div_aclk266 " , GATE_IP_ACP , 1 , 0 , 0 ) ,
2014-02-17 13:44:31 +04:00
GATE ( CLK_SSS , " sss " , " div_aclk266 " , GATE_IP_ACP , 2 , 0 , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_G2D , " g2d " , " div_aclk200 " , GATE_IP_ACP , 3 , 0 , 0 ) ,
GATE ( CLK_SMMU_MDMA0 , " smmu_mdma0 " , " div_aclk266 " , GATE_IP_ACP , 5 , 0 , 0 ) ,
2013-10-15 21:41:15 +04:00
/*
* CMU_TOP
*/
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_CAM_BAYER , " sclk_cam_bayer " , " div_cam_bayer " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_GSCL , 12 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_CAM0 , " sclk_cam0 " , " div_cam0 " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_GSCL , 16 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_CAM1 , " sclk_cam1 " , " div_cam1 " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_GSCL , 20 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_GSCL_WA , " sclk_gscl_wa " , " div_gscl_wa " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_GSCL , 24 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_GSCL_WB , " sclk_gscl_wb " , " div_gscl_wb " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_GSCL , 28 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_FIMD1 , " sclk_fimd1 " , " div_fimd1 " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_DISP1_0 , 0 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_MIPI1 , " sclk_mipi1 " , " div_mipi1 " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_DISP1_0 , 12 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_DP , " sclk_dp " , " div_dp " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_DISP1_0 , 16 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_HDMI , " sclk_hdmi " , " mout_hdmi " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_DISP1_0 , 20 , 0 , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_AUDIO0 , " sclk_audio0 " , " div_audio0 " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_MAU , 0 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_MMC0 , " sclk_mmc0 " , " div_mmc_pre0 " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_FSYS , 0 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_MMC1 , " sclk_mmc1 " , " div_mmc_pre1 " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_FSYS , 4 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_MMC2 , " sclk_mmc2 " , " div_mmc_pre2 " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_FSYS , 8 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_MMC3 , " sclk_mmc3 " , " div_mmc_pre3 " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_FSYS , 12 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_SATA , " sclk_sata " , " div_sata " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_FSYS , 24 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_USB3 , " sclk_usb3 " , " div_usb3 " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_FSYS , 28 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_JPEG , " sclk_jpeg " , " div_jpeg " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_GEN , 0 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_UART0 , " sclk_uart0 " , " div_uart0 " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_PERIC0 , 0 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_UART1 , " sclk_uart1 " , " div_uart1 " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_PERIC0 , 4 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_UART2 , " sclk_uart2 " , " div_uart2 " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_PERIC0 , 8 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_UART3 , " sclk_uart3 " , " div_uart3 " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_PERIC0 , 12 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_PWM , " sclk_pwm " , " div_pwm " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_PERIC0 , 24 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_AUDIO1 , " sclk_audio1 " , " div_audio1 " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_PERIC1 , 0 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_AUDIO2 , " sclk_audio2 " , " div_audio2 " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_PERIC1 , 4 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_SPDIF , " sclk_spdif " , " mout_spdif " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_PERIC1 , 4 , 0 , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_SPI0 , " sclk_spi0 " , " div_spi_pre0 " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_PERIC1 , 16 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_SPI1 , " sclk_spi1 " , " div_spi_pre1 " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_PERIC1 , 20 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SCLK_SPI2 , " sclk_spi2 " , " div_spi_pre2 " ,
2013-10-15 21:41:15 +04:00
SRC_MASK_PERIC1 , 24 , CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_GSCL0 , " gscl0 " , " mout_aclk266_gscl_sub " , GATE_IP_GSCL , 0 , 0 ,
0 ) ,
GATE ( CLK_GSCL1 , " gscl1 " , " mout_aclk266_gscl_sub " , GATE_IP_GSCL , 1 , 0 ,
0 ) ,
GATE ( CLK_GSCL2 , " gscl2 " , " mout_aclk266_gscl_sub " , GATE_IP_GSCL , 2 , 0 ,
0 ) ,
GATE ( CLK_GSCL3 , " gscl3 " , " mout_aclk266_gscl_sub " , GATE_IP_GSCL , 3 , 0 ,
0 ) ,
2018-03-13 13:46:12 +03:00
GATE ( CLK_CAMIF_TOP , " camif_top " , " mout_aclk266_gscl_sub " ,
GATE_IP_GSCL , 4 , 0 , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_GSCL_WA , " gscl_wa " , " div_gscl_wa " , GATE_IP_GSCL , 5 , 0 , 0 ) ,
GATE ( CLK_GSCL_WB , " gscl_wb " , " div_gscl_wb " , GATE_IP_GSCL , 6 , 0 , 0 ) ,
GATE ( CLK_SMMU_GSCL0 , " smmu_gscl0 " , " mout_aclk266_gscl_sub " ,
2013-10-15 21:41:17 +04:00
GATE_IP_GSCL , 7 , 0 , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SMMU_GSCL1 , " smmu_gscl1 " , " mout_aclk266_gscl_sub " ,
2013-10-15 21:41:17 +04:00
GATE_IP_GSCL , 8 , 0 , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SMMU_GSCL2 , " smmu_gscl2 " , " mout_aclk266_gscl_sub " ,
2013-10-15 21:41:17 +04:00
GATE_IP_GSCL , 9 , 0 , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SMMU_GSCL3 , " smmu_gscl3 " , " mout_aclk266_gscl_sub " ,
2013-10-15 21:41:17 +04:00
GATE_IP_GSCL , 10 , 0 , 0 ) ,
2018-03-13 13:46:12 +03:00
GATE ( CLK_SMMU_FIMC_LITE0 , " smmu_fimc_lite0 " , " mout_aclk266_gscl_sub " ,
GATE_IP_GSCL , 11 , 0 , 0 ) ,
GATE ( CLK_SMMU_FIMC_LITE1 , " smmu_fimc_lite1 " , " mout_aclk266_gscl_sub " ,
GATE_IP_GSCL , 12 , 0 , 0 ) ,
2013-10-15 21:41:16 +04:00
2014-01-07 18:47:34 +04:00
GATE ( CLK_MFC , " mfc " , " mout_aclk333_sub " , GATE_IP_MFC , 0 , 0 , 0 ) ,
GATE ( CLK_SMMU_MFCR , " smmu_mfcr " , " mout_aclk333_sub " , GATE_IP_MFC , 1 , 0 ,
0 ) ,
GATE ( CLK_SMMU_MFCL , " smmu_mfcl " , " mout_aclk333_sub " , GATE_IP_MFC , 2 , 0 ,
0 ) ,
2014-04-28 13:37:01 +04:00
GATE ( CLK_G3D , " g3d " , " div_aclk400_g3d " , GATE_IP_G3D , 0 ,
CLK_SET_RATE_PARENT , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_ROTATOR , " rotator " , " div_aclk266 " , GATE_IP_GEN , 1 , 0 , 0 ) ,
GATE ( CLK_JPEG , " jpeg " , " div_aclk166 " , GATE_IP_GEN , 2 , 0 , 0 ) ,
GATE ( CLK_MDMA1 , " mdma1 " , " div_aclk266 " , GATE_IP_GEN , 4 , 0 , 0 ) ,
GATE ( CLK_SMMU_ROTATOR , " smmu_rotator " , " div_aclk266 " , GATE_IP_GEN , 6 , 0 ,
0 ) ,
GATE ( CLK_SMMU_JPEG , " smmu_jpeg " , " div_aclk166 " , GATE_IP_GEN , 7 , 0 , 0 ) ,
GATE ( CLK_SMMU_MDMA1 , " smmu_mdma1 " , " div_aclk266 " , GATE_IP_GEN , 9 , 0 , 0 ) ,
GATE ( CLK_PDMA0 , " pdma0 " , " div_aclk200 " , GATE_IP_FSYS , 1 , 0 , 0 ) ,
GATE ( CLK_PDMA1 , " pdma1 " , " div_aclk200 " , GATE_IP_FSYS , 2 , 0 , 0 ) ,
GATE ( CLK_SATA , " sata " , " div_aclk200 " , GATE_IP_FSYS , 6 , 0 , 0 ) ,
GATE ( CLK_USBOTG , " usbotg " , " div_aclk200 " , GATE_IP_FSYS , 7 , 0 , 0 ) ,
GATE ( CLK_MIPI_HSI , " mipi_hsi " , " div_aclk200 " , GATE_IP_FSYS , 8 , 0 , 0 ) ,
GATE ( CLK_SDMMC0 , " sdmmc0 " , " div_aclk200 " , GATE_IP_FSYS , 12 , 0 , 0 ) ,
GATE ( CLK_SDMMC1 , " sdmmc1 " , " div_aclk200 " , GATE_IP_FSYS , 13 , 0 , 0 ) ,
GATE ( CLK_SDMMC2 , " sdmmc2 " , " div_aclk200 " , GATE_IP_FSYS , 14 , 0 , 0 ) ,
GATE ( CLK_SDMMC3 , " sdmmc3 " , " div_aclk200 " , GATE_IP_FSYS , 15 , 0 , 0 ) ,
GATE ( CLK_SROMC , " sromc " , " div_aclk200 " , GATE_IP_FSYS , 17 , 0 , 0 ) ,
GATE ( CLK_USB2 , " usb2 " , " div_aclk200 " , GATE_IP_FSYS , 18 , 0 , 0 ) ,
GATE ( CLK_USB3 , " usb3 " , " div_aclk200 " , GATE_IP_FSYS , 19 , 0 , 0 ) ,
GATE ( CLK_SATA_PHYCTRL , " sata_phyctrl " , " div_aclk200 " ,
2013-10-15 21:41:16 +04:00
GATE_IP_FSYS , 24 , 0 , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_SATA_PHYI2C , " sata_phyi2c " , " div_aclk200 " , GATE_IP_FSYS , 25 , 0 ,
0 ) ,
GATE ( CLK_UART0 , " uart0 " , " div_aclk66 " , GATE_IP_PERIC , 0 , 0 , 0 ) ,
GATE ( CLK_UART1 , " uart1 " , " div_aclk66 " , GATE_IP_PERIC , 1 , 0 , 0 ) ,
GATE ( CLK_UART2 , " uart2 " , " div_aclk66 " , GATE_IP_PERIC , 2 , 0 , 0 ) ,
GATE ( CLK_UART3 , " uart3 " , " div_aclk66 " , GATE_IP_PERIC , 3 , 0 , 0 ) ,
GATE ( CLK_UART4 , " uart4 " , " div_aclk66 " , GATE_IP_PERIC , 4 , 0 , 0 ) ,
GATE ( CLK_I2C0 , " i2c0 " , " div_aclk66 " , GATE_IP_PERIC , 6 , 0 , 0 ) ,
GATE ( CLK_I2C1 , " i2c1 " , " div_aclk66 " , GATE_IP_PERIC , 7 , 0 , 0 ) ,
GATE ( CLK_I2C2 , " i2c2 " , " div_aclk66 " , GATE_IP_PERIC , 8 , 0 , 0 ) ,
GATE ( CLK_I2C3 , " i2c3 " , " div_aclk66 " , GATE_IP_PERIC , 9 , 0 , 0 ) ,
GATE ( CLK_I2C4 , " i2c4 " , " div_aclk66 " , GATE_IP_PERIC , 10 , 0 , 0 ) ,
GATE ( CLK_I2C5 , " i2c5 " , " div_aclk66 " , GATE_IP_PERIC , 11 , 0 , 0 ) ,
GATE ( CLK_I2C6 , " i2c6 " , " div_aclk66 " , GATE_IP_PERIC , 12 , 0 , 0 ) ,
GATE ( CLK_I2C7 , " i2c7 " , " div_aclk66 " , GATE_IP_PERIC , 13 , 0 , 0 ) ,
GATE ( CLK_I2C_HDMI , " i2c_hdmi " , " div_aclk66 " , GATE_IP_PERIC , 14 , 0 , 0 ) ,
GATE ( CLK_ADC , " adc " , " div_aclk66 " , GATE_IP_PERIC , 15 , 0 , 0 ) ,
GATE ( CLK_SPI0 , " spi0 " , " div_aclk66 " , GATE_IP_PERIC , 16 , 0 , 0 ) ,
GATE ( CLK_SPI1 , " spi1 " , " div_aclk66 " , GATE_IP_PERIC , 17 , 0 , 0 ) ,
GATE ( CLK_SPI2 , " spi2 " , " div_aclk66 " , GATE_IP_PERIC , 18 , 0 , 0 ) ,
GATE ( CLK_I2S1 , " i2s1 " , " div_aclk66 " , GATE_IP_PERIC , 20 , 0 , 0 ) ,
GATE ( CLK_I2S2 , " i2s2 " , " div_aclk66 " , GATE_IP_PERIC , 21 , 0 , 0 ) ,
GATE ( CLK_PCM1 , " pcm1 " , " div_aclk66 " , GATE_IP_PERIC , 22 , 0 , 0 ) ,
GATE ( CLK_PCM2 , " pcm2 " , " div_aclk66 " , GATE_IP_PERIC , 23 , 0 , 0 ) ,
GATE ( CLK_PWM , " pwm " , " div_aclk66 " , GATE_IP_PERIC , 24 , 0 , 0 ) ,
GATE ( CLK_SPDIF , " spdif " , " div_aclk66 " , GATE_IP_PERIC , 26 , 0 , 0 ) ,
GATE ( CLK_AC97 , " ac97 " , " div_aclk66 " , GATE_IP_PERIC , 27 , 0 , 0 ) ,
GATE ( CLK_HSI2C0 , " hsi2c0 " , " div_aclk66 " , GATE_IP_PERIC , 28 , 0 , 0 ) ,
GATE ( CLK_HSI2C1 , " hsi2c1 " , " div_aclk66 " , GATE_IP_PERIC , 29 , 0 , 0 ) ,
GATE ( CLK_HSI2C2 , " hsi2c2 " , " div_aclk66 " , GATE_IP_PERIC , 30 , 0 , 0 ) ,
GATE ( CLK_HSI2C3 , " hsi2c3 " , " div_aclk66 " , GATE_IP_PERIC , 31 , 0 , 0 ) ,
GATE ( CLK_CHIPID , " chipid " , " div_aclk66 " , GATE_IP_PERIS , 0 , 0 , 0 ) ,
GATE ( CLK_SYSREG , " sysreg " , " div_aclk66 " ,
2013-12-11 15:57:05 +04:00
GATE_IP_PERIS , 1 , CLK_IGNORE_UNUSED , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_PMU , " pmu " , " div_aclk66 " , GATE_IP_PERIS , 2 , CLK_IGNORE_UNUSED ,
0 ) ,
GATE ( CLK_CMU_TOP , " cmu_top " , " div_aclk66 " ,
2013-10-15 21:41:15 +04:00
GATE_IP_PERIS , 3 , CLK_IGNORE_UNUSED , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_CMU_CORE , " cmu_core " , " div_aclk66 " ,
2013-10-15 21:41:15 +04:00
GATE_IP_PERIS , 4 , CLK_IGNORE_UNUSED , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_CMU_MEM , " cmu_mem " , " div_aclk66 " ,
2013-10-15 21:41:15 +04:00
GATE_IP_PERIS , 5 , CLK_IGNORE_UNUSED , 0 ) ,
2014-01-07 18:47:34 +04:00
GATE ( CLK_TZPC0 , " tzpc0 " , " div_aclk66 " , GATE_IP_PERIS , 6 , 0 , 0 ) ,
GATE ( CLK_TZPC1 , " tzpc1 " , " div_aclk66 " , GATE_IP_PERIS , 7 , 0 , 0 ) ,
GATE ( CLK_TZPC2 , " tzpc2 " , " div_aclk66 " , GATE_IP_PERIS , 8 , 0 , 0 ) ,
GATE ( CLK_TZPC3 , " tzpc3 " , " div_aclk66 " , GATE_IP_PERIS , 9 , 0 , 0 ) ,
GATE ( CLK_TZPC4 , " tzpc4 " , " div_aclk66 " , GATE_IP_PERIS , 10 , 0 , 0 ) ,
GATE ( CLK_TZPC5 , " tzpc5 " , " div_aclk66 " , GATE_IP_PERIS , 11 , 0 , 0 ) ,
GATE ( CLK_TZPC6 , " tzpc6 " , " div_aclk66 " , GATE_IP_PERIS , 12 , 0 , 0 ) ,
GATE ( CLK_TZPC7 , " tzpc7 " , " div_aclk66 " , GATE_IP_PERIS , 13 , 0 , 0 ) ,
GATE ( CLK_TZPC8 , " tzpc8 " , " div_aclk66 " , GATE_IP_PERIS , 14 , 0 , 0 ) ,
GATE ( CLK_TZPC9 , " tzpc9 " , " div_aclk66 " , GATE_IP_PERIS , 15 , 0 , 0 ) ,
GATE ( CLK_HDMI_CEC , " hdmi_cec " , " div_aclk66 " , GATE_IP_PERIS , 16 , 0 , 0 ) ,
GATE ( CLK_MCT , " mct " , " div_aclk66 " , GATE_IP_PERIS , 18 , 0 , 0 ) ,
GATE ( CLK_WDT , " wdt " , " div_aclk66 " , GATE_IP_PERIS , 19 , 0 , 0 ) ,
GATE ( CLK_RTC , " rtc " , " div_aclk66 " , GATE_IP_PERIS , 20 , 0 , 0 ) ,
GATE ( CLK_TMU , " tmu " , " div_aclk66 " , GATE_IP_PERIS , 21 , 0 , 0 ) ,
2014-05-22 02:23:19 +04:00
GATE ( CLK_SMMU_2D , " smmu_2d " , " div_aclk200 " , GATE_IP_ACP , 7 , 0 , 0 ) ,
GATE ( CLK_SMMU_FIMC_ISP , " smmu_fimc_isp " , " mout_aclk_266_isp_sub " ,
GATE_IP_ISP0 , 8 , 0 , 0 ) ,
GATE ( CLK_SMMU_FIMC_DRC , " smmu_fimc_drc " , " mout_aclk_266_isp_sub " ,
GATE_IP_ISP0 , 9 , 0 , 0 ) ,
GATE ( CLK_SMMU_FIMC_FD , " smmu_fimc_fd " , " mout_aclk_266_isp_sub " ,
GATE_IP_ISP0 , 10 , 0 , 0 ) ,
GATE ( CLK_SMMU_FIMC_SCC , " smmu_fimc_scc " , " mout_aclk_266_isp_sub " ,
GATE_IP_ISP0 , 11 , 0 , 0 ) ,
GATE ( CLK_SMMU_FIMC_SCP , " smmu_fimc_scp " , " mout_aclk_266_isp_sub " ,
GATE_IP_ISP0 , 12 , 0 , 0 ) ,
GATE ( CLK_SMMU_FIMC_MCU , " smmu_fimc_mcu " , " mout_aclk_400_isp_sub " ,
GATE_IP_ISP0 , 13 , 0 , 0 ) ,
GATE ( CLK_SMMU_FIMC_ODC , " smmu_fimc_odc " , " mout_aclk_266_isp_sub " ,
GATE_IP_ISP1 , 4 , 0 , 0 ) ,
GATE ( CLK_SMMU_FIMC_DIS0 , " smmu_fimc_dis0 " , " mout_aclk_266_isp_sub " ,
GATE_IP_ISP1 , 5 , 0 , 0 ) ,
GATE ( CLK_SMMU_FIMC_DIS1 , " smmu_fimc_dis1 " , " mout_aclk_266_isp_sub " ,
GATE_IP_ISP1 , 6 , 0 , 0 ) ,
GATE ( CLK_SMMU_FIMC_3DNR , " smmu_fimc_3dnr " , " mout_aclk_266_isp_sub " ,
GATE_IP_ISP1 , 7 , 0 , 0 ) ,
2013-03-09 12:02:57 +04:00
} ;
2018-03-06 17:33:10 +03:00
static const struct samsung_gate_clock exynos5250_disp_gate_clks [ ] __initconst = {
GATE ( CLK_FIMD1 , " fimd1 " , " mout_aclk200_disp1_sub " , GATE_IP_DISP1 , 0 , 0 ,
0 ) ,
GATE ( CLK_MIE1 , " mie1 " , " mout_aclk200_disp1_sub " , GATE_IP_DISP1 , 1 , 0 ,
0 ) ,
GATE ( CLK_DSIM0 , " dsim0 " , " mout_aclk200_disp1_sub " , GATE_IP_DISP1 , 3 , 0 ,
0 ) ,
GATE ( CLK_DP , " dp " , " mout_aclk200_disp1_sub " , GATE_IP_DISP1 , 4 , 0 , 0 ) ,
GATE ( CLK_MIXER , " mixer " , " mout_aclk200_disp1_sub " , GATE_IP_DISP1 , 5 , 0 ,
0 ) ,
GATE ( CLK_HDMI , " hdmi " , " mout_aclk200_disp1_sub " , GATE_IP_DISP1 , 6 , 0 ,
0 ) ,
GATE ( CLK_SMMU_TV , " smmu_tv " , " mout_aclk200_disp1_sub " ,
GATE_IP_DISP1 , 9 , 0 , 0 ) ,
GATE ( CLK_SMMU_FIMD1 , " smmu_fimd1 " , " mout_aclk200_disp1_sub " ,
GATE_IP_DISP1 , 8 , 0 , 0 ) ,
} ;
static struct exynos5_subcmu_reg_dump exynos5250_disp_suspend_regs [ ] = {
{ GATE_IP_DISP1 , 0xffffffff , 0xffffffff } , /* DISP1 gates */
{ SRC_TOP3 , 0 , BIT ( 4 ) } , /* MUX mout_aclk200_disp1_sub */
{ SRC_TOP3 , 0 , BIT ( 6 ) } , /* MUX mout_aclk300_disp1_sub */
} ;
static const struct exynos5_subcmu_info exynos5250_disp_subcmu = {
. gate_clks = exynos5250_disp_gate_clks ,
. nr_gate_clks = ARRAY_SIZE ( exynos5250_disp_gate_clks ) ,
. suspend_regs = exynos5250_disp_suspend_regs ,
. nr_suspend_regs = ARRAY_SIZE ( exynos5250_disp_suspend_regs ) ,
. pd_name = " DISP1 " ,
} ;
2016-05-11 15:02:04 +03:00
static const struct samsung_pll_rate_table vpll_24mhz_tbl [ ] __initconst = {
2013-06-11 13:31:16 +04:00
/* sorted in descending order */
/* PLL_36XX_RATE(rate, m, p, s, k) */
2018-02-20 10:05:39 +03:00
PLL_36XX_RATE ( 24 * MHZ , 266000000 , 266 , 3 , 3 , 0 ) ,
2013-06-11 13:31:16 +04:00
/* Not in UM, but need for eDP on snow */
2018-02-20 10:05:39 +03:00
PLL_36XX_RATE ( 24 * MHZ , 70500000 , 94 , 2 , 4 , 0 ) ,
2013-06-11 13:31:16 +04:00
{ } ,
} ;
2016-05-11 15:02:04 +03:00
static const struct samsung_pll_rate_table epll_24mhz_tbl [ ] __initconst = {
2013-06-11 13:31:16 +04:00
/* sorted in descending order */
/* PLL_36XX_RATE(rate, m, p, s, k) */
2018-02-20 10:05:39 +03:00
PLL_36XX_RATE ( 24 * MHZ , 192000000 , 64 , 2 , 2 , 0 ) ,
PLL_36XX_RATE ( 24 * MHZ , 180633605 , 90 , 3 , 2 , 20762 ) ,
PLL_36XX_RATE ( 24 * MHZ , 180000000 , 90 , 3 , 2 , 0 ) ,
PLL_36XX_RATE ( 24 * MHZ , 73728000 , 98 , 2 , 4 , 19923 ) ,
PLL_36XX_RATE ( 24 * MHZ , 67737602 , 90 , 2 , 4 , 20762 ) ,
PLL_36XX_RATE ( 24 * MHZ , 49152000 , 98 , 3 , 4 , 19923 ) ,
PLL_36XX_RATE ( 24 * MHZ , 45158401 , 90 , 3 , 4 , 20762 ) ,
PLL_36XX_RATE ( 24 * MHZ , 32768001 , 131 , 3 , 5 , 4719 ) ,
2013-06-11 13:31:16 +04:00
{ } ,
} ;
2016-05-11 15:02:04 +03:00
static const struct samsung_pll_rate_table apll_24mhz_tbl [ ] __initconst = {
2013-11-08 14:14:08 +04:00
/* sorted in descending order */
2018-02-20 10:05:39 +03:00
/* PLL_35XX_RATE(fin, rate, m, p, s) */
PLL_35XX_RATE ( 24 * MHZ , 1700000000 , 425 , 6 , 0 ) ,
PLL_35XX_RATE ( 24 * MHZ , 1600000000 , 200 , 3 , 0 ) ,
PLL_35XX_RATE ( 24 * MHZ , 1500000000 , 250 , 4 , 0 ) ,
PLL_35XX_RATE ( 24 * MHZ , 1400000000 , 175 , 3 , 0 ) ,
PLL_35XX_RATE ( 24 * MHZ , 1300000000 , 325 , 6 , 0 ) ,
PLL_35XX_RATE ( 24 * MHZ , 1200000000 , 200 , 4 , 0 ) ,
PLL_35XX_RATE ( 24 * MHZ , 1100000000 , 275 , 6 , 0 ) ,
PLL_35XX_RATE ( 24 * MHZ , 1000000000 , 125 , 3 , 0 ) ,
PLL_35XX_RATE ( 24 * MHZ , 900000000 , 150 , 4 , 0 ) ,
PLL_35XX_RATE ( 24 * MHZ , 800000000 , 100 , 3 , 0 ) ,
PLL_35XX_RATE ( 24 * MHZ , 700000000 , 175 , 3 , 1 ) ,
PLL_35XX_RATE ( 24 * MHZ , 600000000 , 200 , 4 , 1 ) ,
PLL_35XX_RATE ( 24 * MHZ , 500000000 , 125 , 3 , 1 ) ,
PLL_35XX_RATE ( 24 * MHZ , 400000000 , 100 , 3 , 1 ) ,
PLL_35XX_RATE ( 24 * MHZ , 300000000 , 200 , 4 , 2 ) ,
PLL_35XX_RATE ( 24 * MHZ , 200000000 , 100 , 3 , 2 ) ,
2013-11-08 14:14:08 +04:00
} ;
2013-08-07 08:48:38 +04:00
static struct samsung_pll_clock exynos5250_plls [ nr_plls ] __initdata = {
2017-10-03 13:00:11 +03:00
[ apll ] = PLL ( pll_35xx , CLK_FOUT_APLL , " fout_apll " , " fin_pll " , APLL_LOCK ,
APLL_CON0 , NULL ) ,
[ mpll ] = PLL ( pll_35xx , CLK_FOUT_MPLL , " fout_mpll " , " fin_pll " , MPLL_LOCK ,
MPLL_CON0 , NULL ) ,
2014-01-07 18:47:34 +04:00
[ bpll ] = PLL ( pll_35xx , CLK_FOUT_BPLL , " fout_bpll " , " fin_pll " , BPLL_LOCK ,
2013-06-11 13:31:12 +04:00
BPLL_CON0 , NULL ) ,
2014-01-07 18:47:34 +04:00
[ gpll ] = PLL ( pll_35xx , CLK_FOUT_GPLL , " fout_gpll " , " fin_pll " , GPLL_LOCK ,
2013-06-11 13:31:12 +04:00
GPLL_CON0 , NULL ) ,
2014-01-07 18:47:34 +04:00
[ cpll ] = PLL ( pll_35xx , CLK_FOUT_CPLL , " fout_cpll " , " fin_pll " , CPLL_LOCK ,
2013-06-11 13:31:12 +04:00
CPLL_CON0 , NULL ) ,
2014-01-07 18:47:34 +04:00
[ epll ] = PLL ( pll_36xx , CLK_FOUT_EPLL , " fout_epll " , " fin_pll " , EPLL_LOCK ,
2013-06-11 13:31:12 +04:00
EPLL_CON0 , NULL ) ,
2014-01-07 18:47:34 +04:00
[ vpll ] = PLL ( pll_36xx , CLK_FOUT_VPLL , " fout_vpll " , " mout_vpllsrc " ,
2013-06-11 13:31:12 +04:00
VPLL_LOCK , VPLL_CON0 , NULL ) ,
2013-06-11 13:31:08 +04:00
} ;
2015-07-01 16:10:35 +03:00
# define E5250_CPU_DIV0(apll, pclk_dbg, atb, periph, acp, cpud) \
( ( ( ( apll ) < < 24 ) | ( ( pclk_dbg ) < < 20 ) | ( ( atb ) < < 16 ) | \
( ( periph ) < < 12 ) | ( ( acp ) < < 8 ) | ( ( cpud ) < < 4 ) ) )
# define E5250_CPU_DIV1(hpm, copy) \
( ( ( hpm ) < < 4 ) | ( copy ) )
static const struct exynos_cpuclk_cfg_data exynos5250_armclk_d [ ] __initconst = {
{ 1700000 , E5250_CPU_DIV0 ( 5 , 3 , 7 , 7 , 7 , 3 ) , E5250_CPU_DIV1 ( 2 , 0 ) , } ,
{ 1600000 , E5250_CPU_DIV0 ( 4 , 1 , 7 , 7 , 7 , 3 ) , E5250_CPU_DIV1 ( 2 , 0 ) , } ,
{ 1500000 , E5250_CPU_DIV0 ( 4 , 1 , 7 , 7 , 7 , 2 ) , E5250_CPU_DIV1 ( 2 , 0 ) , } ,
{ 1400000 , E5250_CPU_DIV0 ( 4 , 1 , 6 , 7 , 7 , 2 ) , E5250_CPU_DIV1 ( 2 , 0 ) , } ,
{ 1300000 , E5250_CPU_DIV0 ( 3 , 1 , 6 , 7 , 7 , 2 ) , E5250_CPU_DIV1 ( 2 , 0 ) , } ,
{ 1200000 , E5250_CPU_DIV0 ( 3 , 1 , 5 , 7 , 7 , 2 ) , E5250_CPU_DIV1 ( 2 , 0 ) , } ,
{ 1100000 , E5250_CPU_DIV0 ( 3 , 1 , 5 , 7 , 7 , 3 ) , E5250_CPU_DIV1 ( 2 , 0 ) , } ,
{ 1000000 , E5250_CPU_DIV0 ( 2 , 1 , 4 , 7 , 7 , 1 ) , E5250_CPU_DIV1 ( 2 , 0 ) , } ,
{ 900000 , E5250_CPU_DIV0 ( 2 , 1 , 4 , 7 , 7 , 1 ) , E5250_CPU_DIV1 ( 2 , 0 ) , } ,
{ 800000 , E5250_CPU_DIV0 ( 2 , 1 , 4 , 7 , 7 , 1 ) , E5250_CPU_DIV1 ( 2 , 0 ) , } ,
{ 700000 , E5250_CPU_DIV0 ( 1 , 1 , 3 , 7 , 7 , 1 ) , E5250_CPU_DIV1 ( 2 , 0 ) , } ,
{ 600000 , E5250_CPU_DIV0 ( 1 , 1 , 3 , 7 , 7 , 1 ) , E5250_CPU_DIV1 ( 2 , 0 ) , } ,
{ 500000 , E5250_CPU_DIV0 ( 1 , 1 , 2 , 7 , 7 , 1 ) , E5250_CPU_DIV1 ( 2 , 0 ) , } ,
{ 400000 , E5250_CPU_DIV0 ( 1 , 1 , 2 , 7 , 7 , 1 ) , E5250_CPU_DIV1 ( 2 , 0 ) , } ,
{ 300000 , E5250_CPU_DIV0 ( 1 , 1 , 1 , 7 , 7 , 1 ) , E5250_CPU_DIV1 ( 2 , 0 ) , } ,
{ 200000 , E5250_CPU_DIV0 ( 1 , 1 , 1 , 7 , 7 , 1 ) , E5250_CPU_DIV1 ( 2 , 0 ) , } ,
{ 0 } ,
} ;
2014-06-26 16:00:06 +04:00
static const struct of_device_id ext_clk_match [ ] __initconst = {
2013-03-09 12:02:57 +04:00
{ . compatible = " samsung,clock-xxti " , . data = ( void * ) 0 , } ,
{ } ,
} ;
/* register exynox5250 clocks */
2013-07-18 14:01:19 +04:00
static void __init exynos5250_clk_init ( struct device_node * np )
2013-03-09 12:02:57 +04:00
{
2014-03-12 18:56:44 +04:00
struct samsung_clk_provider * ctx ;
2014-05-09 01:43:26 +04:00
unsigned int tmp ;
2014-03-12 18:56:44 +04:00
2013-03-09 12:02:57 +04:00
if ( np ) {
reg_base = of_iomap ( np , 0 ) ;
if ( ! reg_base )
panic ( " %s: failed to map registers \n " , __func__ ) ;
} else {
panic ( " %s: unable to determine soc \n " , __func__ ) ;
}
2014-03-12 18:56:44 +04:00
ctx = samsung_clk_init ( np , reg_base , CLK_NR_CLKS ) ;
2016-05-09 20:32:31 +03:00
2014-03-12 18:56:44 +04:00
samsung_clk_of_register_fixed_ext ( ctx , exynos5250_fixed_rate_ext_clks ,
2013-03-09 12:02:57 +04:00
ARRAY_SIZE ( exynos5250_fixed_rate_ext_clks ) ,
ext_clk_match ) ;
2014-03-12 18:56:44 +04:00
samsung_clk_register_mux ( ctx , exynos5250_pll_pmux_clks ,
2013-06-11 13:31:15 +04:00
ARRAY_SIZE ( exynos5250_pll_pmux_clks ) ) ;
2013-06-11 13:31:16 +04:00
2013-11-08 14:14:08 +04:00
if ( _get_rate ( " fin_pll " ) = = 24 * MHZ ) {
2013-06-11 13:31:16 +04:00
exynos5250_plls [ epll ] . rate_table = epll_24mhz_tbl ;
2013-11-08 14:14:08 +04:00
exynos5250_plls [ apll ] . rate_table = apll_24mhz_tbl ;
}
2013-06-11 13:31:16 +04:00
2013-08-26 21:09:11 +04:00
if ( _get_rate ( " mout_vpllsrc " ) = = 24 * MHZ )
2013-06-11 13:31:16 +04:00
exynos5250_plls [ vpll ] . rate_table = vpll_24mhz_tbl ;
2014-03-12 18:56:44 +04:00
samsung_clk_register_pll ( ctx , exynos5250_plls ,
ARRAY_SIZE ( exynos5250_plls ) ,
reg_base ) ;
samsung_clk_register_fixed_rate ( ctx , exynos5250_fixed_rate_clks ,
2013-03-09 12:02:57 +04:00
ARRAY_SIZE ( exynos5250_fixed_rate_clks ) ) ;
2014-03-12 18:56:44 +04:00
samsung_clk_register_fixed_factor ( ctx , exynos5250_fixed_factor_clks ,
2013-03-09 12:02:57 +04:00
ARRAY_SIZE ( exynos5250_fixed_factor_clks ) ) ;
2014-03-12 18:56:44 +04:00
samsung_clk_register_mux ( ctx , exynos5250_mux_clks ,
2013-03-09 12:02:57 +04:00
ARRAY_SIZE ( exynos5250_mux_clks ) ) ;
2014-03-12 18:56:44 +04:00
samsung_clk_register_div ( ctx , exynos5250_div_clks ,
2013-03-09 12:02:57 +04:00
ARRAY_SIZE ( exynos5250_div_clks ) ) ;
2014-03-12 18:56:44 +04:00
samsung_clk_register_gate ( ctx , exynos5250_gate_clks ,
2013-03-09 12:02:57 +04:00
ARRAY_SIZE ( exynos5250_gate_clks ) ) ;
2015-07-01 16:10:35 +03:00
exynos_register_cpu_clock ( ctx , CLK_ARM_CLK , " armclk " ,
mout_cpu_p [ 0 ] , mout_cpu_p [ 1 ] , 0x200 ,
exynos5250_armclk_d , ARRAY_SIZE ( exynos5250_armclk_d ) ,
CLK_CPU_HAS_DIV1 ) ;
2013-03-09 12:02:57 +04:00
2014-05-09 01:43:26 +04:00
/*
* Enable arm clock down ( in idle ) and set arm divider
* ratios in WFI / WFE state .
*/
tmp = ( PWR_CTRL1_CORE2_DOWN_RATIO | PWR_CTRL1_CORE1_DOWN_RATIO |
PWR_CTRL1_DIV2_DOWN_EN | PWR_CTRL1_DIV1_DOWN_EN |
PWR_CTRL1_USE_CORE1_WFE | PWR_CTRL1_USE_CORE0_WFE |
PWR_CTRL1_USE_CORE1_WFI | PWR_CTRL1_USE_CORE0_WFI ) ;
__raw_writel ( tmp , reg_base + PWR_CTRL1 ) ;
/*
* Enable arm clock up ( on exiting idle ) . Set arm divider
* ratios when not in idle along with the standby duration
* ratios .
*/
tmp = ( PWR_CTRL2_DIV2_UP_EN | PWR_CTRL2_DIV1_UP_EN |
PWR_CTRL2_DUR_STANDBY2_VAL | PWR_CTRL2_DUR_STANDBY1_VAL |
PWR_CTRL2_CORE2_UP_RATIO | PWR_CTRL2_CORE1_UP_RATIO ) ;
__raw_writel ( tmp , reg_base + PWR_CTRL2 ) ;
2014-02-14 03:16:00 +04:00
exynos5250_clk_sleep_init ( ) ;
2018-03-06 17:33:10 +03:00
exynos5_subcmus_init ( ctx , 1 , & exynos5250_disp_subcmu ) ;
2014-02-14 03:16:00 +04:00
2014-06-18 19:46:52 +04:00
samsung_clk_of_add_provider ( np , ctx ) ;
2013-03-09 12:02:57 +04:00
pr_info ( " Exynos5250: clock setup completed, armclk=%ld \n " ,
2013-10-15 21:41:16 +04:00
_get_rate ( " div_arm2 " ) ) ;
2013-03-09 12:02:57 +04:00
}
2018-03-06 17:33:10 +03:00
CLK_OF_DECLARE_DRIVER ( exynos5250_clk , " samsung,exynos5250-clock " , exynos5250_clk_init ) ;