mirror of https://github.com/OpenIPC/firmware.git
				
				
				
			
		
			
				
	
	
		
			363 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Diff
		
	
	
			
		
		
	
	
			363 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Diff
		
	
	
| diff -drupN a/drivers/clk/ingenic/clk-x2000-v12.c b/drivers/clk/ingenic/clk-x2000-v12.c
 | |
| --- a/drivers/clk/ingenic/clk-x2000-v12.c	1970-01-01 03:00:00.000000000 +0300
 | |
| +++ b/drivers/clk/ingenic/clk-x2000-v12.c	2022-06-09 05:02:28.000000000 +0300
 | |
| @@ -0,0 +1,358 @@
 | |
| +#include <linux/slab.h>
 | |
| +#include <linux/clk-provider.h>
 | |
| +#include <linux/of.h>
 | |
| +#include <linux/of_address.h>
 | |
| +#include <linux/syscore_ops.h>
 | |
| +#include <linux/clk.h>
 | |
| +
 | |
| +#include <dt-bindings/clock/ingenic-x2000-v12.h>
 | |
| +
 | |
| +#include "clk.h"
 | |
| +
 | |
| +
 | |
| +
 | |
| +/*******************************************************************************
 | |
| + *      FIXED CLK
 | |
| + ********************************************************************************/
 | |
| +static struct ingenic_fixed_rate_clock x2000_fixed_rate_ext_clks[] __initdata = {
 | |
| +	FRATE(CLK_EXT, "ext", NULL, CLK_IS_ROOT, 24000000),
 | |
| +	FRATE(CLK_RTC_EXT, "rtc_ext", NULL, CLK_IS_ROOT, 32768),
 | |
| +};
 | |
| +
 | |
| +
 | |
| +
 | |
| +/*******************************************************************************
 | |
| + *      PLL
 | |
| + ********************************************************************************/
 | |
| +
 | |
| +static struct ingenic_pll_rate_table x2000_pll_rate_table[] = {
 | |
| +	PLL_RATE(1500000000, 124, 1, 1),
 | |
| +	PLL_RATE(1200000000, 49, 0, 1),
 | |
| +	PLL_RATE(800000000, 199, 2, 2),
 | |
| +	PLL_RATE(600000000, 49, 0, 2),
 | |
| +	PLL_RATE(300000000, 49, 0, 3),
 | |
| +};
 | |
| +
 | |
| +
 | |
| +
 | |
| +/*PLL HWDESC*/
 | |
| +static struct ingenic_pll_hwdesc apll_hwdesc = \
 | |
| +	PLL_DESC(CPM_CPAPCR, 20, 9, 14, 6, 11, 3, 3, 0, pll_od_encode);
 | |
| +
 | |
| +static struct ingenic_pll_hwdesc mpll_hwdesc = \
 | |
| +	PLL_DESC(CPM_CPMPCR, 20, 9, 14, 6, 11, 3, 3, 0, pll_od_encode);
 | |
| +
 | |
| +static struct ingenic_pll_hwdesc epll_hwdesc = \
 | |
| +	PLL_DESC(CPM_CPEPCR, 20, 9, 14, 6, 11, 3, 3, 0, pll_od_encode);
 | |
| +
 | |
| +
 | |
| +
 | |
| +static struct ingenic_pll_clock x2000_pll_clks[] __initdata = {
 | |
| +	PLL(CLK_PLL_APLL, "apll", "ext", &apll_hwdesc, x2000_pll_rate_table),
 | |
| +	PLL(CLK_PLL_MPLL, "mpll", "ext", &mpll_hwdesc, x2000_pll_rate_table),
 | |
| +	PLL(CLK_PLL_EPLL, "epll", "ext", &epll_hwdesc, x2000_pll_rate_table),
 | |
| +};
 | |
| +
 | |
| +
 | |
| +/*******************************************************************************
 | |
| + *      MUX
 | |
| + ********************************************************************************/
 | |
| +PNAME(mux_table_0)	= {"stop",	"ext",		"apll"};
 | |
| +PNAME(mux_table_1)	= {"stop",	"sclka",	"mpll"};
 | |
| +PNAME(mux_table_2)	= {"sclka",	"mpll",		"epll"};
 | |
| +PNAME(mux_table_3)	= {"sclka", 	"mpll",		"ext"};
 | |
| +PNAME(mux_table_4)	= {"sclka", 	"epll"};
 | |
| +PNAME(mux_table_5)	= {"mux_ahb2",	"ext"};
 | |
| +PNAME(mux_table_6)	= {"ext",	"div_i2s3"};
 | |
| +PNAME(mux_table_7)	= {"div_i2s0",	"div_i2s1",	"div_i2s2",	"div_i2s3"};
 | |
| +
 | |
| +static unsigned int ingenic_mux_table[] = {0, 1, 2, 3};
 | |
| +
 | |
| +
 | |
| +static struct ingenic_mux_clock x2000_mux_clks[] __initdata = {
 | |
| +	MUX(CLK_MUX_SCLKA,	"sclka",		ingenic_mux_table, mux_table_0, CPM_CPCCR,	30, 2, 0),
 | |
| +	MUX(CLK_MUX_CPU_L2C,	"mux_cpu_l2c",		ingenic_mux_table, mux_table_1, CPM_CPCCR,	28, 2, 0),
 | |
| +	MUX(CLK_MUX_AHB0,	"mux_ahb0",		ingenic_mux_table, mux_table_1, CPM_CPCCR,	26, 2, 0),
 | |
| +	MUX(CLK_MUX_AHB2,	"mux_ahb2",		ingenic_mux_table, mux_table_1, CPM_CPCCR,	24, 2, 0),
 | |
| +
 | |
| +	MUX(CLK_MUX_DDR,	"mux_ddr",		ingenic_mux_table, mux_table_1, CPM_DDRCDR,	30, 2, 0),
 | |
| +	MUX(CLK_MUX_MACPHY,	"mux_macphy",		ingenic_mux_table, mux_table_2, CPM_MACCDR,	30, 2, 0),
 | |
| +	MUX(CLK_MUX_MACTXPHY,	"mux_mactxphy",		ingenic_mux_table, mux_table_2, CPM_MACTXCDR,	30, 2, 0),
 | |
| +	MUX(CLK_MUX_MACTXPHY1,	"mux_mactxphy1",	ingenic_mux_table, mux_table_2, CPM_MACTXCDR1,	30, 2, 0),
 | |
| +	MUX(CLK_MUX_MACPTP,	"mux_macptp",		ingenic_mux_table, mux_table_2, CPM_MACPTP,	30, 2, 0),
 | |
| +	MUX(CLK_MUX_I2S0,	"mux_i2s0",		ingenic_mux_table, mux_table_4, CPM_I2S0CDR,	30, 1, 0),
 | |
| +	MUX(CLK_MUX_I2S1,	"mux_i2s1",		ingenic_mux_table, mux_table_4, CPM_I2S1CDR,	30, 1, 0),
 | |
| +	MUX(CLK_MUX_I2S2,	"mux_i2s2",		ingenic_mux_table, mux_table_4, CPM_I2S2CDR,	30, 1, 0),
 | |
| +	MUX(CLK_MUX_I2S3,	"mux_i2s3",		ingenic_mux_table, mux_table_4, CPM_I2S3CDR,	30, 1, 0),
 | |
| +	MUX(CLK_MUX_AUDIO_RAM,	"mux_audio_ram",	ingenic_mux_table, mux_table_5, CPM_AUDIOCR,	30, 1, 0),
 | |
| +	MUX(CLK_MUX_SPDIF,	"mux_spdif",		ingenic_mux_table, mux_table_7, CPM_AUDIOCR,	3,  2, CLK_SET_RATE_PARENT|CLK_SET_RATE_NO_REPARENT),
 | |
| +	MUX(CLK_MUX_PCM,	"mux_pcm",		ingenic_mux_table, mux_table_7, CPM_AUDIOCR,	1,  2, CLK_SET_RATE_PARENT|CLK_SET_RATE_NO_REPARENT),
 | |
| +	MUX(CLK_MUX_DMIC,	"mux_dmic",		ingenic_mux_table, mux_table_6, CPM_AUDIOCR,	0,  1, CLK_SET_RATE_PARENT|CLK_SET_RATE_NO_REPARENT),
 | |
| +	MUX(CLK_MUX_LCD,	"mux_lcd",		ingenic_mux_table, mux_table_2, CPM_LPCDR,	30, 2, 0),
 | |
| +	MUX(CLK_MUX_MSC0,	"mux_msc0",		ingenic_mux_table, mux_table_3, CPM_MSC0CDR,	30, 2, 0),
 | |
| +	MUX(CLK_MUX_MSC1,	"mux_msc1",		ingenic_mux_table, mux_table_3, CPM_MSC1CDR,	30, 2, 0),
 | |
| +	MUX(CLK_MUX_MSC2,	"mux_msc2",		ingenic_mux_table, mux_table_3, CPM_MSC2CDR,	30, 2, 0),
 | |
| +	MUX(CLK_MUX_SFC,	"mux_sfc",		ingenic_mux_table, mux_table_2, CPM_SFCCDR,	30, 2, 0),
 | |
| +	MUX(CLK_MUX_SSI,	"mux_ssi",		ingenic_mux_table, mux_table_2, CPM_SSICDR,	30, 2, 0),
 | |
| +	MUX(CLK_MUX_CIM,	"mux_cim",		ingenic_mux_table, mux_table_2, CPM_CIMCDR,	30, 2, 0),
 | |
| +	MUX(CLK_MUX_PWM,	"mux_pwm",		ingenic_mux_table, mux_table_2, CPM_PWMCDR,	30, 2, 0),
 | |
| +	MUX(CLK_MUX_ISP,	"mux_isp",		ingenic_mux_table, mux_table_2, CPM_ISPCDR,	30, 2, 0),
 | |
| +	MUX(CLK_MUX_RSA,	"mux_rsa",		ingenic_mux_table, mux_table_2, CPM_RSACDR,	30, 2, 0),
 | |
| +
 | |
| +};
 | |
| +
 | |
| +/*******************************************************************************
 | |
| + *      DIV BUS
 | |
| + ********************************************************************************/
 | |
| +
 | |
| +static struct ingenic_bus_clock x2000_bus_div_clks[] __initdata = {
 | |
| +	BUS_DIV(CLK_DIV_CPU,		"div_cpu",		"mux_cpu_l2c",		CPM_CPCCR,	0,  4, 0, 0, CPM_CPCSR, 0, 22, BUS_DIV_SELF),
 | |
| +	BUS_DIV(CLK_DIV_L2C,		"div_l2c",		"mux_cpu_l2c",		CPM_CPCCR,	4,  4, 0, 0, CPM_CPCSR, 0, 22, BUS_DIV_SELF),
 | |
| +	BUS_DIV(CLK_DIV_AHB0,		"div_ahb0",		"mux_ahb0",		CPM_CPCCR,	8,  4, 0, 0, CPM_CPCSR, 1, 21, BUS_DIV_SELF),
 | |
| +	BUS_DIV(CLK_DIV_AHB2,		"div_ahb2",		"mux_ahb2",		CPM_CPCCR,	12, 4, 0, 0, CPM_CPCSR, 2, 20, BUS_DIV_SELF),
 | |
| +	BUS_DIV(CLK_DIV_APB,		"div_apb",		"mux_ahb2",		CPM_CPCCR,	16, 4, 0, 0, CPM_CPCSR, 2, 20, BUS_DIV_SELF),
 | |
| +	BUS_DIV(CLK_DIV_CPU_L2C_X1,	"div_cpu_l2c_x1",	"mux_cpu_l2c",		CPM_CPCCR,	0,  4, 4, 4, CPM_CPCSR, 0, 22, BUS_DIV_ONE),
 | |
| +	BUS_DIV(CLK_DIV_CPU_L2C_X2,	"div_cpu_l2c_x2",	"mux_cpu_l2c",		CPM_CPCCR,	0,  4, 4, 4, CPM_CPCSR, 0, 22, BUS_DIV_TWO),
 | |
| +};
 | |
| +
 | |
| +
 | |
| +/*******************************************************************************
 | |
| + *      DIV
 | |
| + ********************************************************************************/
 | |
| +
 | |
| +static struct clk_div_table x2000_clk_div_table[256] = {};
 | |
| +
 | |
| +static struct ingenic_div_clock x2000_div_clks[] __initdata = {
 | |
| +	DIV(CLK_DIV_DDR,		"div_ddr",		"mux_ddr",		CPM_DDRCDR,	4,  0, NULL),
 | |
| +	DIV(CLK_DIV_MACPHY,		"div_macphy",		"mux_macphy",		CPM_MACCDR,	8,  0, NULL),
 | |
| +	DIV(CLK_DIV_MACTXPHY,		"div_mactxphy0",	"mux_mactxphy",		CPM_MACTXCDR,	8,  0, NULL),
 | |
| +	DIV(CLK_DIV_MACTXPHY1,		"div_mactxphy1",	"mux_mactxphy1",	CPM_MACTXCDR1,	8,  0, NULL),
 | |
| +	DIV(CLK_DIV_MACPTP,		"div_macptp",		"mux_macptp",		CPM_MACPTP,	8,  0, NULL),
 | |
| +	DIV(CLK_DIV_LCD,		"div_lcd",		"mux_lcd",		CPM_LPCDR,	8,  0, NULL),
 | |
| +	DIV(CLK_DIV_MSC0,		"div_msc0",		"mux_msc0",		CPM_MSC0CDR,	8,  0, x2000_clk_div_table),
 | |
| +	DIV(CLK_DIV_MSC1,		"div_msc1",		"mux_msc1",		CPM_MSC1CDR,	8,  0, x2000_clk_div_table),
 | |
| +	DIV(CLK_DIV_MSC2,		"div_msc2",		"mux_msc2",		CPM_MSC2CDR,	8,  0, x2000_clk_div_table),
 | |
| +	DIV(CLK_DIV_SFC,		"div_sfc",		"mux_sfc",		CPM_SFCCDR,	8,  0, NULL),
 | |
| +	DIV(CLK_DIV_SSI,		"div_ssi",		"mux_ssi",		CPM_SSICDR,	8,  0, NULL),
 | |
| +	DIV(CLK_DIV_CIM,		"div_cim",		"mux_cim",		CPM_CIMCDR,	8,  0, NULL),
 | |
| +	DIV(CLK_DIV_PWM,		"div_pwm",		"mux_pwm",		CPM_PWMCDR,	4,  0, NULL),
 | |
| +	DIV(CLK_DIV_ISP,		"div_isp",		"mux_isp",		CPM_ISPCDR,	4,  0, NULL),
 | |
| +	DIV(CLK_DIV_RSA,		"div_rsa",		"mux_rsa",		CPM_RSACDR,	4,  0, NULL),
 | |
| +
 | |
| +};
 | |
| +
 | |
| +/*******************************************************************************
 | |
| + *      FRACTIONAL-DIVIDER
 | |
| + ********************************************************************************/
 | |
| +
 | |
| +static struct ingenic_fra_div_clock x2000_fdiv_clks[] __initdata = {
 | |
| +	FRA_DIV(CLK_DIV_I2S0,	"div_i2s0",	"mux_i2s0",	CPM_I2S0CDR,	20, 9, 0, 20),
 | |
| +	FRA_DIV(CLK_DIV_I2S1,	"div_i2s1",	"mux_i2s1",	CPM_I2S1CDR,	20, 9, 0, 20),
 | |
| +	FRA_DIV(CLK_DIV_I2S2,	"div_i2s2",	"mux_i2s2",	CPM_I2S2CDR,	20, 9, 0, 20),
 | |
| +	FRA_DIV(CLK_DIV_I2S3,	"div_i2s3",	"mux_i2s3",	CPM_I2S3CDR,	20, 9, 0, 20),
 | |
| +};
 | |
| +
 | |
| +/*******************************************************************************
 | |
| + *      GATE
 | |
| + ********************************************************************************/
 | |
| +static struct ingenic_gate_clock x2000_gate_clks[] __initdata = {
 | |
| +
 | |
| +	GATE(CLK_GATE_DDR,	"gate_ddr",		"div_ddr",	CPM_CLKGR,  31, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE),
 | |
| +//	GATE(CLK_GATE_IPU,	"gate_ipu",		"div_ipu",	CPM_CLKGR,  30, 0,			 CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_AHB0,	"gate_ahb0",		"div_ahb0",	CPM_CLKGR,  29, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_APB0,	"gate_apb0",		"div_ahb0",	CPM_CLKGR,  28, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_RTC,	"gate_rtc",		"rtc_ext",	CPM_CLKGR,  27, 0,			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_SSI1,	"gate_ssi1",		"div_ssi",	CPM_CLKGR,  26, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_RSA,	"gate_rsa",		"div_rsa",	CPM_CLKGR,  25, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_AES,	"gate_aes",		"div_ahb2",	CPM_CLKGR,  24, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_LCD,	"gate_lcd",		"div_lcd",	CPM_CLKGR,  23, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_CIM,	"gate_cim",		"div_cim",	CPM_CLKGR,  22, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_PDMA,	"gate_pdma",		"div_ahb2",	CPM_CLKGR,  21, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_OST,	"gate_ost",		"ext",		CPM_CLKGR,  20, CLK_IGNORE_UNUSED, 	CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_SSI0,	"gate_ssi0",		"div_ssi",	CPM_CLKGR,  19, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_TCU,	"gate_tcu",		"div_apb",	CPM_CLKGR,  18, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_DTRNG,	"gate_dtrng",		"div_apb",	CPM_CLKGR,  17, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_UART2,	"gate_uart2",		"div_apb",	CPM_CLKGR,  16, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_UART1,	"gate_uart1",		"div_apb",	CPM_CLKGR,  15, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_UART0,	"gate_uart0",		"div_apb",	CPM_CLKGR,  14, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_SADC,	"gate_sadc",		"div_apb",	CPM_CLKGR,  13, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_HELIX,	"gate_helix",		"div_ahb0",	CPM_CLKGR,  12, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_AUDIO,	"gate_audio",		"div_ahb2",	CPM_CLKGR,  11, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_SMB3,	"gate_i2c3",		"div_apb",	CPM_CLKGR,  10, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_SMB2,	"gate_i2c2",		"div_apb",	CPM_CLKGR,  9,  0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_SMB1,	"gate_i2c1",		"div_apb",	CPM_CLKGR,  8,  0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_SMB0,	"gate_i2c0",		"div_apb",	CPM_CLKGR,  7,  0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_SCC,	"gate_scc",		"div_apb",	CPM_CLKGR,  6,  0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_MSC1,	"gate_msc1",		"div_msc1",	CPM_CLKGR,  5,  0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_MSC0,	"gate_msc0",		"div_msc0",	CPM_CLKGR,  4,  0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_OTG,	"gate_otg",		"div_ahb2",	CPM_CLKGR,  3,  0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_SFC,	"gate_sfc",		"div_sfc",	CPM_CLKGR,  2,  0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_EFUSE,	"gate_efuse",		"div_ahb2",	CPM_CLKGR,  1,  0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_NEMC,	"gate_nemc",		"div_ahb2",	CPM_CLKGR,  0,  0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_ARB,	"gate_arb",		"div_ahb0",	CPM_CLKGR1, 30, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_MIPI_DSI, "gate_dsi",		"div_ahb0",	CPM_CLKGR1, 29, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_MIPI_CSI, "gate_csi",		"div_ahb0",	CPM_CLKGR1, 28, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_INTC,	"gate_intc",		"div_ahb2",	CPM_CLKGR1, 26, CLK_IGNORE_UNUSED, 	CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_MSC2,	"gate_msc2",		"div_msc2",	CPM_CLKGR1, 25, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_GMAC1,	"gate_gmac1",		"div_ahb2",	CPM_CLKGR1, 24, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_GMAC0,	"gate_gmac0",		"div_ahb2",	CPM_CLKGR1, 23, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_UART9,	"gate_uart9",		"div_apb",	CPM_CLKGR1, 22, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_UART8,	"gate_uart8",		"div_apb",	CPM_CLKGR1, 21, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_UART7,	"gate_uart7",		"div_apb",	CPM_CLKGR1, 20, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_UATR6,	"gate_uart6",		"div_apb",	CPM_CLKGR1, 19, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_UART5,	"gate_uart5",		"div_apb",	CPM_CLKGR1, 18, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_UART4,	"gate_uart4",		"div_apb",	CPM_CLKGR1, 17, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_UART3,	"gate_uart3",		"div_apb",	CPM_CLKGR1, 16, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_SPDIF,	"gate_spdif",		"mux_spdif",	CPM_CLKGR1, 14, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_DMIC,	"gate_dmic",		"mux_dmic",	CPM_CLKGR1, 13, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_PCM,	"gate_pcm",		"mux_pcm",	CPM_CLKGR1, 12, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_I2S3,	"gate_i2s3",		"div_i2s3",	CPM_CLKGR1, 11, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_I2S2,	"gate_i2s2",		"div_i2s2",	CPM_CLKGR1, 10, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_I2S1,	"gate_i2s1",		"div_i2s1",	CPM_CLKGR1, 9,  0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_I2S0,	"gate_i2s0",		"div_i2s0",	CPM_CLKGR1, 8,  0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_ROT,	"gate_rot",		"div_ahb0",	CPM_CLKGR1, 7,  0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_HASH,	"gate_hash",		"div_ahb2",	CPM_CLKGR1, 6,  0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_PWM,	"gate_pwm",		"div_pwm",	CPM_CLKGR1, 5,  0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_FELIX,	"gate_felix",		"div_ahb0",	CPM_CLKGR1, 4,  0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_ISP1,	"gate_isp1",		"div_apb",	CPM_CLKGR1, 3,  0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_ISP0,	"gate_isp0",		"div_apb",	CPM_CLKGR1, 2,  0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_SMB5,	"gate_i2c5",		"div_apb",	CPM_CLKGR1, 1,  0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_SMB4,	"gate_i2c4",		"div_apb",	CPM_CLKGR1, 0,  0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_GATE_USBPHY,	"gate_usbphy",		"div_apb",	CPM_OPCR,   23, 0, 			CLK_GATE_SET_TO_DISABLE),
 | |
| +	GATE(CLK_CE_I2S0,	"ce_i2s0",		"div_i2s0",	CPM_I2S0CDR, 29, 0, 0),
 | |
| +	GATE(CLK_CE_I2S1,	"ce_i2s1",		"div_i2s1",	CPM_I2S1CDR, 29, 0, 0),
 | |
| +	GATE(CLK_CE_I2S2,	"ce_i2s2",		"div_i2s2",	CPM_I2S2CDR, 29, 0, 0),
 | |
| +	GATE(CLK_CE_I2S3,	"ce_i2s3",		"div_i2s3",	CPM_I2S3CDR, 29, 0, 0),
 | |
| +};
 | |
| +
 | |
| +static struct ingenic_gate_power x2000_gate_power[] __initdata = {
 | |
| +
 | |
| +	POWER(POWER_ISP0,	"power_isp0",		"gate_isp0",	CPM_LCR,  31, 27, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, POWER_GATE_WAIT),
 | |
| +	POWER(POWER_ISP1,	"power_isp1",		"gate_isp1",	CPM_LCR,  30, 26, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, POWER_GATE_WAIT),
 | |
| +	POWER(POWER_FELIX,	"power_felix",		"gate_felix",	CPM_LCR,  29, 25, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, POWER_GATE_WAIT),
 | |
| +	POWER(POWER_HELIX,	"power_helix",		"gate_helix",	CPM_LCR,  28, 24, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, POWER_GATE_WAIT),
 | |
| +
 | |
| +	POWER(PD_MEM_NEMC,	"pd_mem_nemc",		"gate_nemc",	CPM_MPDCR,  28, 0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_USB,	"pd_mem_usb",		"gate_usb",	CPM_MPDCR,  27, 0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_SFC,	"pd_mem_sfc",		"gate_sfc",	CPM_MPDCR,  26, 0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_PDMA_SEC,	"pd_mem_pdma_sec",	"gate_pdma",	CPM_MPDCR,  25, 0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_PDMA,	"pd_mem_pdma",		"gate_pdma",	CPM_MPDCR,  24, 0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_MSC2,	"pd_mem_msc2",		"gate_msc2",	CPM_MPDCR,  23, 0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_MSC1,	"pd_mem_msc1",		"gate_msc1",	CPM_MPDCR,  22, 0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_MSC0,	"pd_mem_msc0",		"gate_msc0",	CPM_MPDCR,  21, 0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_GMAC1,	"pd_mem_gmac1",		"gate_gmac1",	CPM_MPDCR,  20, 0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_GMAC0,	"pd_mem_gmac0",		"gate_gmac0",	CPM_MPDCR,  19, 0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_DMIC,	"pd_mem_dmic",		"gate_dmic",	CPM_MPDCR,  18, 0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_AUDIO,	"pd_mem_audio",		"gate_audio",	CPM_MPDCR,  17, 0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_AES,	"pd_mem_aes",		"gate_aes",	CPM_MPDCR,  16, 0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_DSI,	"pd_mem_dsi",		"gate_dsi",	CPM_MPDCR,  12, 0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_SSI1,	"pd_mem_ssi1",		"gate_ssi1",	CPM_MPDCR,  11, 0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_SSI0,	"pd_mem_ssi0",		"gate_ssi0",	CPM_MPDCR,  10, 0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_UART9,	"pd_mem_uart9",		"gate_uart9",	CPM_MPDCR,  9,  0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_UART8,	"pd_mem_uart8",		"gate_uart8",	CPM_MPDCR,  8,  0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_UART7,	"pd_mem_uart7",		"gate_uart7",	CPM_MPDCR,  7,  0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_UART6,	"pd_mem_uart6",		"gate_uart6",	CPM_MPDCR,  6,  0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_UART5,	"pd_mem_uart5",		"gate_uart5",	CPM_MPDCR,  5,  0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_UART4,	"pd_mem_uart4",		"gate_uart4",	CPM_MPDCR,  4,  0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_UART3,	"pd_mem_uart3",		"gate_uart3",	CPM_MPDCR,  3,  0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_UART2,	"pd_mem_uart2",		"gate_uart2",	CPM_MPDCR,  2,  0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_UART1,	"pd_mem_uart1",		"gate_uart1",	CPM_MPDCR,  1,  0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_UART0,	"pd_mem_uart0",		"gate_uart0",	CPM_MPDCR,  0,  0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_ROT,	"pd_mem_rot",		"gate_rot",	CPM_MPDCR1, 8,  0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_CIM,	"pd_mem_cim",		"gate_cim",	CPM_MPDCR1, 7,  0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_DPU,	"pd_mem_dpu",		"gate_dpu",	CPM_MPDCR1, 6,  0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_DDR_CH6,	"pd_mem_ddr_ch6",	"gate_ddr",	CPM_MPDCR1, 5,  0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_DDR_CH5,	"pd_mem_ddr_ch5",	"gate_ddr",	CPM_MPDCR1, 4,  0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_DDR_CH3,	"pd_mem_ddr_ch3",	"gate_ddr",	CPM_MPDCR1, 3,  0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_DDR_CH1,	"pd_mem_ddr_ch1",	"gate_ddr",	CPM_MPDCR1, 2,  0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_DDR_CH0,	"pd_mem_ddr_ch0",	"gate_ddr",	CPM_MPDCR1, 1,  0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +	POWER(PD_MEM_DDR_TOP,	"pd_mem_ddr_top",	"gate_ddr",	CPM_MPDCR1, 0,  0, CLK_IGNORE_UNUSED,	CLK_GATE_SET_TO_DISABLE, 0),
 | |
| +
 | |
| +};
 | |
| +
 | |
| +static void clk_div_table_generate(void)
 | |
| +{
 | |
| +	int i;
 | |
| +	for (i = 0; i < ARRAY_SIZE(x2000_clk_div_table); i++) {
 | |
| +		x2000_clk_div_table[i].val = i;
 | |
| +		x2000_clk_div_table[i].div = (i + 1) * 4;
 | |
| +	}
 | |
| +
 | |
| +}
 | |
| +
 | |
| +static const struct of_device_id ext_clk_match[] __initconst = {
 | |
| +	        { .compatible = "ingenic,fixed-clock", .data = (void *)0, },
 | |
| +		{},
 | |
| +};
 | |
| +
 | |
| +
 | |
| +/* Register x2000 clocks. */
 | |
| +static void __init x2000_clk_init(struct device_node *np, void __iomem *base)
 | |
| +{
 | |
| +	struct ingenic_clk_provider *ctx;
 | |
| +	void __iomem *reg_base;
 | |
| +
 | |
| +
 | |
| +	printk("x2000 Clock Power Management Unit init!\n");
 | |
| +
 | |
| +	reg_base = base;
 | |
| +
 | |
| +	if (np) {
 | |
| +		reg_base = of_iomap(np, 0);
 | |
| +		if (!reg_base)
 | |
| +			panic("%s: failed to map registers\n", __func__);
 | |
| +	}
 | |
| +
 | |
| +
 | |
| +	ctx = ingenic_clk_init(np, reg_base, NR_CLKS);
 | |
| +	if (!ctx)
 | |
| +		panic("%s: unable to allocate context.\n", __func__);
 | |
| +
 | |
| +	/* Register Ext Clocks From DT */
 | |
| +	ingenic_clk_of_register_fixed_ext(ctx, x2000_fixed_rate_ext_clks,
 | |
| +			                        ARRAY_SIZE(x2000_fixed_rate_ext_clks), ext_clk_match);
 | |
| +
 | |
| +	/* Register PLLs. */
 | |
| +	ingenic_clk_register_pll(ctx, x2000_pll_clks,
 | |
| +				ARRAY_SIZE(x2000_pll_clks), reg_base);
 | |
| +
 | |
| +
 | |
| +	/* Register Muxs */
 | |
| +	ingenic_clk_register_mux(ctx, x2000_mux_clks, ARRAY_SIZE(x2000_mux_clks));
 | |
| +
 | |
| +	/* Register Bus Divs */
 | |
| +	ingenic_clk_register_bus_div(ctx, x2000_bus_div_clks, ARRAY_SIZE(x2000_bus_div_clks));
 | |
| +
 | |
| +	/* Register Divs */
 | |
| +	clk_div_table_generate();
 | |
| +	ingenic_clk_register_cgu_div(ctx, x2000_div_clks, ARRAY_SIZE(x2000_div_clks));
 | |
| +
 | |
| +	/* Register Fractional Divs */
 | |
| +	ingenic_clk_register_fra_div(ctx, x2000_fdiv_clks, ARRAY_SIZE(x2000_fdiv_clks));
 | |
| +
 | |
| +	/* Register Gates */
 | |
| +	ingenic_clk_register_gate(ctx, x2000_gate_clks, ARRAY_SIZE(x2000_gate_clks));
 | |
| +
 | |
| +	/* Register Powers */
 | |
| +	ingenic_power_register_gate(ctx, x2000_gate_power, ARRAY_SIZE(x2000_gate_power));
 | |
| +
 | |
| +	ingenic_clk_of_add_provider(np, ctx);
 | |
| +
 | |
| +
 | |
| +	//ingenic_clk_of_dump(ctx);
 | |
| +
 | |
| +
 | |
| +	pr_info("=========== x2000 clocks: =============\n"
 | |
| +		"\tapll     = %lu , mpll     = %lu\n"
 | |
| +		"\tcpu_clk  = %lu , l2c_clk  = %lu\n"
 | |
| +		"\tahb0_clk = %lu , ahb2_clk = %lu\n"
 | |
| +		"\tapb_clk  = %lu , ext_clk  = %lu\n\n",
 | |
| +		_get_rate("apll"),	_get_rate("mpll"),
 | |
| +		_get_rate("div_cpu"), _get_rate("div_l2c"),
 | |
| +		_get_rate("div_ahb0"), _get_rate("div_ahb2"),
 | |
| +		_get_rate("div_apb"), _get_rate("ext"));
 | |
| +
 | |
| +}
 | |
| +
 | |
| +CLK_OF_DECLARE(x2000_clk, "ingenic,x2000-v12-clocks", x2000_clk_init);
 | |
| +
 |