| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132 | /* linux/arch/arm/mach-s5pv210/clock.c * * Copyright (c) 2010 Samsung Electronics Co., Ltd. *		http://www.samsung.com/ * * S5PV210 - Clock support * * 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.*/#include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/list.h>#include <linux/errno.h>#include <linux/err.h>#include <linux/clk.h>#include <linux/device.h>#include <linux/io.h>#include <mach/map.h>#include <plat/cpu-freq.h>#include <mach/regs-clock.h>#include <plat/clock.h>#include <plat/cpu.h>#include <plat/pll.h>#include <plat/s5p-clock.h>#include <plat/clock-clksrc.h>#include "common.h"static unsigned long xtal;static struct clksrc_clk clk_mout_apll = {	.clk	= {		.name		= "mout_apll",	},	.sources	= &clk_src_apll,	.reg_src	= { .reg = S5P_CLK_SRC0, .shift = 0, .size = 1 },};static struct clksrc_clk clk_mout_epll = {	.clk	= {		.name		= "mout_epll",	},	.sources	= &clk_src_epll,	.reg_src	= { .reg = S5P_CLK_SRC0, .shift = 8, .size = 1 },};static struct clksrc_clk clk_mout_mpll = {	.clk = {		.name		= "mout_mpll",	},	.sources	= &clk_src_mpll,	.reg_src	= { .reg = S5P_CLK_SRC0, .shift = 4, .size = 1 },};static struct clk *clkset_armclk_list[] = {	[0] = &clk_mout_apll.clk,	[1] = &clk_mout_mpll.clk,};static struct clksrc_sources clkset_armclk = {	.sources	= clkset_armclk_list,	.nr_sources	= ARRAY_SIZE(clkset_armclk_list),};static struct clksrc_clk clk_armclk = {	.clk	= {		.name		= "armclk",	},	.sources	= &clkset_armclk,	.reg_src	= { .reg = S5P_CLK_SRC0, .shift = 16, .size = 1 },	.reg_div	= { .reg = S5P_CLK_DIV0, .shift = 0, .size = 3 },};static struct clksrc_clk clk_hclk_msys = {	.clk	= {		.name		= "hclk_msys",		.parent		= &clk_armclk.clk,	},	.reg_div	= { .reg = S5P_CLK_DIV0, .shift = 8, .size = 3 },};static struct clksrc_clk clk_pclk_msys = {	.clk	= {		.name		= "pclk_msys",		.parent		= &clk_hclk_msys.clk,	},	.reg_div        = { .reg = S5P_CLK_DIV0, .shift = 12, .size = 3 },};static struct clksrc_clk clk_sclk_a2m = {	.clk	= {		.name		= "sclk_a2m",		.parent		= &clk_mout_apll.clk,	},	.reg_div	= { .reg = S5P_CLK_DIV0, .shift = 4, .size = 3 },};static struct clk *clkset_hclk_sys_list[] = {	[0] = &clk_mout_mpll.clk,	[1] = &clk_sclk_a2m.clk,};static struct clksrc_sources clkset_hclk_sys = {	.sources	= clkset_hclk_sys_list,	.nr_sources	= ARRAY_SIZE(clkset_hclk_sys_list),};static struct clksrc_clk clk_hclk_dsys = {	.clk	= {		.name	= "hclk_dsys",	},	.sources	= &clkset_hclk_sys,	.reg_src        = { .reg = S5P_CLK_SRC0, .shift = 20, .size = 1 },	.reg_div        = { .reg = S5P_CLK_DIV0, .shift = 16, .size = 4 },};static struct clksrc_clk clk_pclk_dsys = {	.clk	= {		.name	= "pclk_dsys",		.parent	= &clk_hclk_dsys.clk,	},	.reg_div = { .reg = S5P_CLK_DIV0, .shift = 20, .size = 3 },};static struct clksrc_clk clk_hclk_psys = {	.clk	= {		.name	= "hclk_psys",	},	.sources	= &clkset_hclk_sys,	.reg_src        = { .reg = S5P_CLK_SRC0, .shift = 24, .size = 1 },	.reg_div        = { .reg = S5P_CLK_DIV0, .shift = 24, .size = 4 },};static struct clksrc_clk clk_pclk_psys = {	.clk	= {		.name	= "pclk_psys",		.parent	= &clk_hclk_psys.clk,	},	.reg_div        = { .reg = S5P_CLK_DIV0, .shift = 28, .size = 3 },};static int s5pv210_clk_ip0_ctrl(struct clk *clk, int enable){	return s5p_gatectrl(S5P_CLKGATE_IP0, clk, enable);}static int s5pv210_clk_ip1_ctrl(struct clk *clk, int enable){	return s5p_gatectrl(S5P_CLKGATE_IP1, clk, enable);}static int s5pv210_clk_ip2_ctrl(struct clk *clk, int enable){	return s5p_gatectrl(S5P_CLKGATE_IP2, clk, enable);}static int s5pv210_clk_ip3_ctrl(struct clk *clk, int enable){	return s5p_gatectrl(S5P_CLKGATE_IP3, clk, enable);}static int s5pv210_clk_mask0_ctrl(struct clk *clk, int enable){	return s5p_gatectrl(S5P_CLK_SRC_MASK0, clk, enable);}static int s5pv210_clk_mask1_ctrl(struct clk *clk, int enable){	return s5p_gatectrl(S5P_CLK_SRC_MASK1, clk, enable);}static int s5pv210_clk_hdmiphy_ctrl(struct clk *clk, int enable){	return s5p_gatectrl(S5P_HDMI_PHY_CONTROL, clk, enable);}static int exynos4_clk_dac_ctrl(struct clk *clk, int enable){	return s5p_gatectrl(S5P_DAC_PHY_CONTROL, clk, enable);}static struct clk clk_sclk_hdmi27m = {	.name		= "sclk_hdmi27m",	.rate		= 27000000,};static struct clk clk_sclk_hdmiphy = {	.name		= "sclk_hdmiphy",};static struct clk clk_sclk_usbphy0 = {	.name		= "sclk_usbphy0",};static struct clk clk_sclk_usbphy1 = {	.name		= "sclk_usbphy1",};static struct clk clk_pcmcdclk0 = {	.name		= "pcmcdclk",};static struct clk clk_pcmcdclk1 = {	.name		= "pcmcdclk",};static struct clk clk_pcmcdclk2 = {	.name		= "pcmcdclk",};static struct clk dummy_apb_pclk = {	.name		= "apb_pclk",	.id		= -1,};static struct clk *clkset_vpllsrc_list[] = {	[0] = &clk_fin_vpll,	[1] = &clk_sclk_hdmi27m,};static struct clksrc_sources clkset_vpllsrc = {	.sources	= clkset_vpllsrc_list,	.nr_sources	= ARRAY_SIZE(clkset_vpllsrc_list),};static struct clksrc_clk clk_vpllsrc = {	.clk	= {		.name		= "vpll_src",		.enable		= s5pv210_clk_mask0_ctrl,		.ctrlbit	= (1 << 7),	},	.sources	= &clkset_vpllsrc,	.reg_src	= { .reg = S5P_CLK_SRC1, .shift = 28, .size = 1 },};static struct clk *clkset_sclk_vpll_list[] = {	[0] = &clk_vpllsrc.clk,	[1] = &clk_fout_vpll,};static struct clksrc_sources clkset_sclk_vpll = {	.sources	= clkset_sclk_vpll_list,	.nr_sources	= ARRAY_SIZE(clkset_sclk_vpll_list),};static struct clksrc_clk clk_sclk_vpll = {	.clk	= {		.name		= "sclk_vpll",	},	.sources	= &clkset_sclk_vpll,	.reg_src	= { .reg = S5P_CLK_SRC0, .shift = 12, .size = 1 },};static struct clk *clkset_moutdmc0src_list[] = {	[0] = &clk_sclk_a2m.clk,	[1] = &clk_mout_mpll.clk,	[2] = NULL,	[3] = NULL,};static struct clksrc_sources clkset_moutdmc0src = {	.sources	= clkset_moutdmc0src_list,	.nr_sources	= ARRAY_SIZE(clkset_moutdmc0src_list),};static struct clksrc_clk clk_mout_dmc0 = {	.clk	= {		.name		= "mout_dmc0",	},	.sources	= &clkset_moutdmc0src,	.reg_src	= { .reg = S5P_CLK_SRC6, .shift = 24, .size = 2 },};static struct clksrc_clk clk_sclk_dmc0 = {	.clk	= {		.name		= "sclk_dmc0",		.parent		= &clk_mout_dmc0.clk,	},	.reg_div	= { .reg = S5P_CLK_DIV6, .shift = 28, .size = 4 },};static unsigned long s5pv210_clk_imem_get_rate(struct clk *clk){	return clk_get_rate(clk->parent) / 2;}static struct clk_ops clk_hclk_imem_ops = {	.get_rate	= s5pv210_clk_imem_get_rate,};static unsigned long s5pv210_clk_fout_apll_get_rate(struct clk *clk){	return s5p_get_pll45xx(xtal, __raw_readl(S5P_APLL_CON), pll_4508);}static struct clk_ops clk_fout_apll_ops = {	.get_rate	= s5pv210_clk_fout_apll_get_rate,};static struct clk init_clocks_off[] = {	{		.name		= "dma",		.devname	= "dma-pl330.0",		.parent		= &clk_hclk_psys.clk,		.enable		= s5pv210_clk_ip0_ctrl,		.ctrlbit	= (1 << 3),	}, {		.name		= "dma",		.devname	= "dma-pl330.1",		.parent		= &clk_hclk_psys.clk,		.enable		= s5pv210_clk_ip0_ctrl,		.ctrlbit	= (1 << 4),	}, {		.name		= "rot",		.parent		= &clk_hclk_dsys.clk,		.enable		= s5pv210_clk_ip0_ctrl,		.ctrlbit	= (1<<29),	}, {		.name		= "fimc",		.devname	= "s5pv210-fimc.0",		.parent		= &clk_hclk_dsys.clk,		.enable		= s5pv210_clk_ip0_ctrl,		.ctrlbit	= (1 << 24),	}, {		.name		= "fimc",		.devname	= "s5pv210-fimc.1",		.parent		= &clk_hclk_dsys.clk,		.enable		= s5pv210_clk_ip0_ctrl,		.ctrlbit	= (1 << 25),	}, {		.name		= "fimc",		.devname	= "s5pv210-fimc.2",		.parent		= &clk_hclk_dsys.clk,		.enable		= s5pv210_clk_ip0_ctrl,		.ctrlbit	= (1 << 26),	}, {		.name		= "jpeg",		.parent		= &clk_hclk_dsys.clk,		.enable		= s5pv210_clk_ip0_ctrl,		.ctrlbit	= (1 << 28),	}, {		.name		= "mfc",		.devname	= "s5p-mfc",		.parent		= &clk_pclk_psys.clk,		.enable		= s5pv210_clk_ip0_ctrl,		.ctrlbit	= (1 << 16),	}, {		.name		= "dac",		.devname	= "s5p-sdo",		.parent		= &clk_hclk_dsys.clk,		.enable		= s5pv210_clk_ip1_ctrl,		.ctrlbit	= (1 << 10),	}, {		.name		= "mixer",		.devname	= "s5p-mixer",		.parent		= &clk_hclk_dsys.clk,		.enable		= s5pv210_clk_ip1_ctrl,		.ctrlbit	= (1 << 9),	}, {		.name		= "vp",		.devname	= "s5p-mixer",		.parent		= &clk_hclk_dsys.clk,		.enable		= s5pv210_clk_ip1_ctrl,		.ctrlbit	= (1 << 8),	}, {		.name		= "hdmi",		.devname	= "s5pv210-hdmi",		.parent		= &clk_hclk_dsys.clk,		.enable		= s5pv210_clk_ip1_ctrl,		.ctrlbit	= (1 << 11),	}, {		.name		= "hdmiphy",		.devname	= "s5pv210-hdmi",		.enable		= s5pv210_clk_hdmiphy_ctrl,		.ctrlbit	= (1 << 0),	}, {		.name		= "dacphy",		.devname	= "s5p-sdo",		.enable		= exynos4_clk_dac_ctrl,		.ctrlbit	= (1 << 0),	}, {		.name		= "otg",		.parent		= &clk_hclk_psys.clk,		.enable		= s5pv210_clk_ip1_ctrl,		.ctrlbit	= (1<<16),	}, {		.name		= "usb-host",		.parent		= &clk_hclk_psys.clk,		.enable		= s5pv210_clk_ip1_ctrl,		.ctrlbit	= (1<<17),	}, {		.name		= "lcd",		.parent		= &clk_hclk_dsys.clk,		.enable		= s5pv210_clk_ip1_ctrl,		.ctrlbit	= (1<<0),	}, {		.name		= "cfcon",		.parent		= &clk_hclk_psys.clk,		.enable		= s5pv210_clk_ip1_ctrl,		.ctrlbit	= (1<<25),	}, {		.name		= "systimer",		.parent		= &clk_pclk_psys.clk,		.enable		= s5pv210_clk_ip3_ctrl,		.ctrlbit	= (1<<16),	}, {		.name		= "watchdog",		.parent		= &clk_pclk_psys.clk,		.enable		= s5pv210_clk_ip3_ctrl,		.ctrlbit	= (1<<22),	}, {		.name		= "rtc",		.parent		= &clk_pclk_psys.clk,		.enable		= s5pv210_clk_ip3_ctrl,		.ctrlbit	= (1<<15),	}, {		.name		= "i2c",		.devname	= "s3c2440-i2c.0",		.parent		= &clk_pclk_psys.clk,		.enable		= s5pv210_clk_ip3_ctrl,		.ctrlbit	= (1<<7),	}, {		.name		= "i2c",		.devname	= "s3c2440-i2c.1",		.parent		= &clk_pclk_psys.clk,		.enable		= s5pv210_clk_ip3_ctrl,		.ctrlbit	= (1 << 10),	}, {		.name		= "i2c",		.devname	= "s3c2440-i2c.2",		.parent		= &clk_pclk_psys.clk,		.enable		= s5pv210_clk_ip3_ctrl,		.ctrlbit	= (1<<9),	}, {		.name		= "i2c",		.devname	= "s3c2440-hdmiphy-i2c",		.parent		= &clk_pclk_psys.clk,		.enable		= s5pv210_clk_ip3_ctrl,		.ctrlbit	= (1 << 11),	}, {		.name		= "spi",		.devname	= "s5pv210-spi.0",		.parent		= &clk_pclk_psys.clk,		.enable		= s5pv210_clk_ip3_ctrl,		.ctrlbit	= (1<<12),	}, {		.name		= "spi",		.devname	= "s5pv210-spi.1",		.parent		= &clk_pclk_psys.clk,		.enable		= s5pv210_clk_ip3_ctrl,		.ctrlbit	= (1<<13),	}, {		.name		= "spi",		.devname	= "s5pv210-spi.2",		.parent		= &clk_pclk_psys.clk,		.enable		= s5pv210_clk_ip3_ctrl,		.ctrlbit	= (1<<14),	}, {		.name		= "timers",		.parent		= &clk_pclk_psys.clk,		.enable		= s5pv210_clk_ip3_ctrl,		.ctrlbit	= (1<<23),	}, {		.name		= "adc",		.parent		= &clk_pclk_psys.clk,		.enable		= s5pv210_clk_ip3_ctrl,		.ctrlbit	= (1<<24),	}, {		.name		= "keypad",		.parent		= &clk_pclk_psys.clk,		.enable		= s5pv210_clk_ip3_ctrl,		.ctrlbit	= (1<<21),	}, {		.name		= "iis",		.devname	= "samsung-i2s.0",		.parent		= &clk_p,		.enable		= s5pv210_clk_ip3_ctrl,		.ctrlbit	= (1<<4),	}, {		.name		= "iis",		.devname	= "samsung-i2s.1",		.parent		= &clk_p,		.enable		= s5pv210_clk_ip3_ctrl,		.ctrlbit	= (1 << 5),	}, {		.name		= "iis",		.devname	= "samsung-i2s.2",		.parent		= &clk_p,		.enable		= s5pv210_clk_ip3_ctrl,		.ctrlbit	= (1 << 6),	}, {		.name		= "spdif",		.parent		= &clk_p,		.enable		= s5pv210_clk_ip3_ctrl,		.ctrlbit	= (1 << 0),	},};static struct clk init_clocks[] = {	{		.name		= "hclk_imem",		.parent		= &clk_hclk_msys.clk,		.ctrlbit	= (1 << 5),		.enable		= s5pv210_clk_ip0_ctrl,		.ops		= &clk_hclk_imem_ops,	}, {		.name		= "uart",		.devname	= "s5pv210-uart.0",		.parent		= &clk_pclk_psys.clk,		.enable		= s5pv210_clk_ip3_ctrl,		.ctrlbit	= (1 << 17),	}, {		.name		= "uart",		.devname	= "s5pv210-uart.1",		.parent		= &clk_pclk_psys.clk,		.enable		= s5pv210_clk_ip3_ctrl,		.ctrlbit	= (1 << 18),	}, {		.name		= "uart",		.devname	= "s5pv210-uart.2",		.parent		= &clk_pclk_psys.clk,		.enable		= s5pv210_clk_ip3_ctrl,		.ctrlbit	= (1 << 19),	}, {		.name		= "uart",		.devname	= "s5pv210-uart.3",		.parent		= &clk_pclk_psys.clk,		.enable		= s5pv210_clk_ip3_ctrl,		.ctrlbit	= (1 << 20),	}, {		.name		= "sromc",		.parent		= &clk_hclk_psys.clk,		.enable		= s5pv210_clk_ip1_ctrl,		.ctrlbit	= (1 << 26),	},};static struct clk clk_hsmmc0 = {	.name		= "hsmmc",	.devname	= "s3c-sdhci.0",	.parent		= &clk_hclk_psys.clk,	.enable		= s5pv210_clk_ip2_ctrl,	.ctrlbit	= (1<<16),};static struct clk clk_hsmmc1 = {	.name		= "hsmmc",	.devname	= "s3c-sdhci.1",	.parent		= &clk_hclk_psys.clk,	.enable		= s5pv210_clk_ip2_ctrl,	.ctrlbit	= (1<<17),};static struct clk clk_hsmmc2 = {	.name		= "hsmmc",	.devname	= "s3c-sdhci.2",	.parent		= &clk_hclk_psys.clk,	.enable		= s5pv210_clk_ip2_ctrl,	.ctrlbit	= (1<<18),};static struct clk clk_hsmmc3 = {	.name		= "hsmmc",	.devname	= "s3c-sdhci.3",	.parent		= &clk_hclk_psys.clk,	.enable		= s5pv210_clk_ip2_ctrl,	.ctrlbit	= (1<<19),};static struct clk *clkset_uart_list[] = {	[6] = &clk_mout_mpll.clk,	[7] = &clk_mout_epll.clk,};static struct clksrc_sources clkset_uart = {	.sources	= clkset_uart_list,	.nr_sources	= ARRAY_SIZE(clkset_uart_list),};static struct clk *clkset_group1_list[] = {	[0] = &clk_sclk_a2m.clk,	[1] = &clk_mout_mpll.clk,	[2] = &clk_mout_epll.clk,	[3] = &clk_sclk_vpll.clk,};static struct clksrc_sources clkset_group1 = {	.sources	= clkset_group1_list,	.nr_sources	= ARRAY_SIZE(clkset_group1_list),};static struct clk *clkset_sclk_onenand_list[] = {	[0] = &clk_hclk_psys.clk,	[1] = &clk_hclk_dsys.clk,};static struct clksrc_sources clkset_sclk_onenand = {	.sources	= clkset_sclk_onenand_list,	.nr_sources	= ARRAY_SIZE(clkset_sclk_onenand_list),};static struct clk *clkset_sclk_dac_list[] = {	[0] = &clk_sclk_vpll.clk,	[1] = &clk_sclk_hdmiphy,};static struct clksrc_sources clkset_sclk_dac = {	.sources	= clkset_sclk_dac_list,	.nr_sources	= ARRAY_SIZE(clkset_sclk_dac_list),};static struct clksrc_clk clk_sclk_dac = {	.clk		= {		.name		= "sclk_dac",		.enable		= s5pv210_clk_mask0_ctrl,		.ctrlbit	= (1 << 2),	},	.sources	= &clkset_sclk_dac,	.reg_src	= { .reg = S5P_CLK_SRC1, .shift = 8, .size = 1 },};static struct clksrc_clk clk_sclk_pixel = {	.clk		= {		.name		= "sclk_pixel",		.parent		= &clk_sclk_vpll.clk,	},	.reg_div	= { .reg = S5P_CLK_DIV1, .shift = 0, .size = 4},};static struct clk *clkset_sclk_hdmi_list[] = {	[0] = &clk_sclk_pixel.clk,	[1] = &clk_sclk_hdmiphy,};static struct clksrc_sources clkset_sclk_hdmi = {	.sources	= clkset_sclk_hdmi_list,	.nr_sources	= ARRAY_SIZE(clkset_sclk_hdmi_list),};static struct clksrc_clk clk_sclk_hdmi = {	.clk		= {		.name		= "sclk_hdmi",		.enable		= s5pv210_clk_mask0_ctrl,		.ctrlbit	= (1 << 0),	},	.sources	= &clkset_sclk_hdmi,	.reg_src	= { .reg = S5P_CLK_SRC1, .shift = 0, .size = 1 },};static struct clk *clkset_sclk_mixer_list[] = {	[0] = &clk_sclk_dac.clk,	[1] = &clk_sclk_hdmi.clk,};static struct clksrc_sources clkset_sclk_mixer = {	.sources	= clkset_sclk_mixer_list,	.nr_sources	= ARRAY_SIZE(clkset_sclk_mixer_list),};static struct clksrc_clk clk_sclk_mixer = {	.clk		= {		.name		= "sclk_mixer",		.enable		= s5pv210_clk_mask0_ctrl,		.ctrlbit	= (1 << 1),	},	.sources = &clkset_sclk_mixer,	.reg_src = { .reg = S5P_CLK_SRC1, .shift = 4, .size = 1 },};static struct clksrc_clk *sclk_tv[] = {	&clk_sclk_dac,	&clk_sclk_pixel,	&clk_sclk_hdmi,	&clk_sclk_mixer,};static struct clk *clkset_sclk_audio0_list[] = {	[0] = &clk_ext_xtal_mux,	[1] = &clk_pcmcdclk0,	[2] = &clk_sclk_hdmi27m,	[3] = &clk_sclk_usbphy0,	[4] = &clk_sclk_usbphy1,	[5] = &clk_sclk_hdmiphy,	[6] = &clk_mout_mpll.clk,	[7] = &clk_mout_epll.clk,	[8] = &clk_sclk_vpll.clk,};static struct clksrc_sources clkset_sclk_audio0 = {	.sources	= clkset_sclk_audio0_list,	.nr_sources	= ARRAY_SIZE(clkset_sclk_audio0_list),};static struct clksrc_clk clk_sclk_audio0 = {	.clk		= {		.name		= "sclk_audio",		.devname	= "soc-audio.0",		.enable		= s5pv210_clk_mask0_ctrl,		.ctrlbit	= (1 << 24),	},	.sources = &clkset_sclk_audio0,	.reg_src = { .reg = S5P_CLK_SRC6, .shift = 0, .size = 4 },	.reg_div = { .reg = S5P_CLK_DIV6, .shift = 0, .size = 4 },};static struct clk *clkset_sclk_audio1_list[] = {	[0] = &clk_ext_xtal_mux,	[1] = &clk_pcmcdclk1,	[2] = &clk_sclk_hdmi27m,	[3] = &clk_sclk_usbphy0,	[4] = &clk_sclk_usbphy1,	[5] = &clk_sclk_hdmiphy,	[6] = &clk_mout_mpll.clk,	[7] = &clk_mout_epll.clk,	[8] = &clk_sclk_vpll.clk,};static struct clksrc_sources clkset_sclk_audio1 = {	.sources	= clkset_sclk_audio1_list,	.nr_sources	= ARRAY_SIZE(clkset_sclk_audio1_list),};static struct clksrc_clk clk_sclk_audio1 = {	.clk		= {		.name		= "sclk_audio",		.devname	= "soc-audio.1",		.enable		= s5pv210_clk_mask0_ctrl,		.ctrlbit	= (1 << 25),	},	.sources = &clkset_sclk_audio1,	.reg_src = { .reg = S5P_CLK_SRC6, .shift = 4, .size = 4 },	.reg_div = { .reg = S5P_CLK_DIV6, .shift = 4, .size = 4 },};static struct clk *clkset_sclk_audio2_list[] = {	[0] = &clk_ext_xtal_mux,	[1] = &clk_pcmcdclk0,	[2] = &clk_sclk_hdmi27m,	[3] = &clk_sclk_usbphy0,	[4] = &clk_sclk_usbphy1,	[5] = &clk_sclk_hdmiphy,	[6] = &clk_mout_mpll.clk,	[7] = &clk_mout_epll.clk,	[8] = &clk_sclk_vpll.clk,};static struct clksrc_sources clkset_sclk_audio2 = {	.sources	= clkset_sclk_audio2_list,	.nr_sources	= ARRAY_SIZE(clkset_sclk_audio2_list),};static struct clksrc_clk clk_sclk_audio2 = {	.clk		= {		.name		= "sclk_audio",		.devname	= "soc-audio.2",		.enable		= s5pv210_clk_mask0_ctrl,		.ctrlbit	= (1 << 26),	},	.sources = &clkset_sclk_audio2,	.reg_src = { .reg = S5P_CLK_SRC6, .shift = 8, .size = 4 },	.reg_div = { .reg = S5P_CLK_DIV6, .shift = 8, .size = 4 },};static struct clk *clkset_sclk_spdif_list[] = {	[0] = &clk_sclk_audio0.clk,	[1] = &clk_sclk_audio1.clk,	[2] = &clk_sclk_audio2.clk,};static struct clksrc_sources clkset_sclk_spdif = {	.sources	= clkset_sclk_spdif_list,	.nr_sources	= ARRAY_SIZE(clkset_sclk_spdif_list),};static struct clksrc_clk clk_sclk_spdif = {	.clk		= {		.name		= "sclk_spdif",		.enable		= s5pv210_clk_mask0_ctrl,		.ctrlbit	= (1 << 27),		.ops		= &s5p_sclk_spdif_ops,	},	.sources = &clkset_sclk_spdif,	.reg_src = { .reg = S5P_CLK_SRC6, .shift = 12, .size = 2 },};static struct clk *clkset_group2_list[] = {	[0] = &clk_ext_xtal_mux,	[1] = &clk_xusbxti,	[2] = &clk_sclk_hdmi27m,	[3] = &clk_sclk_usbphy0,	[4] = &clk_sclk_usbphy1,	[5] = &clk_sclk_hdmiphy,	[6] = &clk_mout_mpll.clk,	[7] = &clk_mout_epll.clk,	[8] = &clk_sclk_vpll.clk,};static struct clksrc_sources clkset_group2 = {	.sources	= clkset_group2_list,	.nr_sources	= ARRAY_SIZE(clkset_group2_list),};static struct clksrc_clk clksrcs[] = {	{		.clk	= {			.name		= "sclk_dmc",		},		.sources = &clkset_group1,		.reg_src = { .reg = S5P_CLK_SRC6, .shift = 24, .size = 2 },		.reg_div = { .reg = S5P_CLK_DIV6, .shift = 28, .size = 4 },	}, {		.clk	= {			.name		= "sclk_onenand",		},		.sources = &clkset_sclk_onenand,		.reg_src = { .reg = S5P_CLK_SRC0, .shift = 28, .size = 1 },		.reg_div = { .reg = S5P_CLK_DIV6, .shift = 12, .size = 3 },	}, {		.clk	= {			.name		= "sclk_fimc",			.devname	= "s5pv210-fimc.0",			.enable		= s5pv210_clk_mask1_ctrl,			.ctrlbit	= (1 << 2),		},		.sources = &clkset_group2,		.reg_src = { .reg = S5P_CLK_SRC3, .shift = 12, .size = 4 },		.reg_div = { .reg = S5P_CLK_DIV3, .shift = 12, .size = 4 },	}, {		.clk	= {			.name		= "sclk_fimc",			.devname	= "s5pv210-fimc.1",			.enable		= s5pv210_clk_mask1_ctrl,			.ctrlbit	= (1 << 3),		},		.sources = &clkset_group2,		.reg_src = { .reg = S5P_CLK_SRC3, .shift = 16, .size = 4 },		.reg_div = { .reg = S5P_CLK_DIV3, .shift = 16, .size = 4 },	}, {		.clk	= {			.name		= "sclk_fimc",			.devname	= "s5pv210-fimc.2",			.enable		= s5pv210_clk_mask1_ctrl,			.ctrlbit	= (1 << 4),		},		.sources = &clkset_group2,		.reg_src = { .reg = S5P_CLK_SRC3, .shift = 20, .size = 4 },		.reg_div = { .reg = S5P_CLK_DIV3, .shift = 20, .size = 4 },	}, {		.clk		= {			.name		= "sclk_cam0",			.enable		= s5pv210_clk_mask0_ctrl,			.ctrlbit	= (1 << 3),		},		.sources = &clkset_group2,		.reg_src = { .reg = S5P_CLK_SRC1, .shift = 12, .size = 4 },		.reg_div = { .reg = S5P_CLK_DIV1, .shift = 12, .size = 4 },	}, {		.clk		= {			.name		= "sclk_cam1",			.enable		= s5pv210_clk_mask0_ctrl,			.ctrlbit	= (1 << 4),		},		.sources = &clkset_group2,		.reg_src = { .reg = S5P_CLK_SRC1, .shift = 16, .size = 4 },		.reg_div = { .reg = S5P_CLK_DIV1, .shift = 16, .size = 4 },	}, {		.clk		= {			.name		= "sclk_fimd",			.enable		= s5pv210_clk_mask0_ctrl,			.ctrlbit	= (1 << 5),		},		.sources = &clkset_group2,		.reg_src = { .reg = S5P_CLK_SRC1, .shift = 20, .size = 4 },		.reg_div = { .reg = S5P_CLK_DIV1, .shift = 20, .size = 4 },	}, {		.clk		= {			.name		= "sclk_mfc",			.devname	= "s5p-mfc",			.enable		= s5pv210_clk_ip0_ctrl,			.ctrlbit	= (1 << 16),		},		.sources = &clkset_group1,		.reg_src = { .reg = S5P_CLK_SRC2, .shift = 4, .size = 2 },		.reg_div = { .reg = S5P_CLK_DIV2, .shift = 4, .size = 4 },	}, {		.clk		= {			.name		= "sclk_g2d",			.enable		= s5pv210_clk_ip0_ctrl,			.ctrlbit	= (1 << 12),		},		.sources = &clkset_group1,		.reg_src = { .reg = S5P_CLK_SRC2, .shift = 8, .size = 2 },		.reg_div = { .reg = S5P_CLK_DIV2, .shift = 8, .size = 4 },	}, {		.clk		= {			.name		= "sclk_g3d",			.enable		= s5pv210_clk_ip0_ctrl,			.ctrlbit	= (1 << 8),		},		.sources = &clkset_group1,		.reg_src = { .reg = S5P_CLK_SRC2, .shift = 0, .size = 2 },		.reg_div = { .reg = S5P_CLK_DIV2, .shift = 0, .size = 4 },	}, {		.clk		= {			.name		= "sclk_csis",			.enable		= s5pv210_clk_mask0_ctrl,			.ctrlbit	= (1 << 6),		},		.sources = &clkset_group2,		.reg_src = { .reg = S5P_CLK_SRC1, .shift = 24, .size = 4 },		.reg_div = { .reg = S5P_CLK_DIV1, .shift = 28, .size = 4 },	}, {		.clk		= {			.name		= "sclk_pwi",			.enable		= s5pv210_clk_mask0_ctrl,			.ctrlbit	= (1 << 29),		},		.sources = &clkset_group2,		.reg_src = { .reg = S5P_CLK_SRC6, .shift = 20, .size = 4 },		.reg_div = { .reg = S5P_CLK_DIV6, .shift = 24, .size = 4 },	}, {		.clk		= {			.name		= "sclk_pwm",			.enable		= s5pv210_clk_mask0_ctrl,			.ctrlbit	= (1 << 19),		},		.sources = &clkset_group2,		.reg_src = { .reg = S5P_CLK_SRC5, .shift = 12, .size = 4 },		.reg_div = { .reg = S5P_CLK_DIV5, .shift = 12, .size = 4 },	},};static struct clksrc_clk clk_sclk_uart0 = {	.clk	= {		.name		= "uclk1",		.devname	= "s5pv210-uart.0",		.enable		= s5pv210_clk_mask0_ctrl,		.ctrlbit	= (1 << 12),	},	.sources = &clkset_uart,	.reg_src = { .reg = S5P_CLK_SRC4, .shift = 16, .size = 4 },	.reg_div = { .reg = S5P_CLK_DIV4, .shift = 16, .size = 4 },};static struct clksrc_clk clk_sclk_uart1 = {	.clk		= {		.name		= "uclk1",		.devname	= "s5pv210-uart.1",		.enable		= s5pv210_clk_mask0_ctrl,		.ctrlbit	= (1 << 13),	},	.sources = &clkset_uart,	.reg_src = { .reg = S5P_CLK_SRC4, .shift = 20, .size = 4 },	.reg_div = { .reg = S5P_CLK_DIV4, .shift = 20, .size = 4 },};static struct clksrc_clk clk_sclk_uart2 = {	.clk		= {		.name		= "uclk1",		.devname	= "s5pv210-uart.2",		.enable		= s5pv210_clk_mask0_ctrl,		.ctrlbit	= (1 << 14),	},	.sources = &clkset_uart,	.reg_src = { .reg = S5P_CLK_SRC4, .shift = 24, .size = 4 },	.reg_div = { .reg = S5P_CLK_DIV4, .shift = 24, .size = 4 },};static struct clksrc_clk clk_sclk_uart3	= {	.clk		= {		.name		= "uclk1",		.devname	= "s5pv210-uart.3",		.enable		= s5pv210_clk_mask0_ctrl,		.ctrlbit	= (1 << 15),	},	.sources = &clkset_uart,	.reg_src = { .reg = S5P_CLK_SRC4, .shift = 28, .size = 4 },	.reg_div = { .reg = S5P_CLK_DIV4, .shift = 28, .size = 4 },};static struct clksrc_clk clk_sclk_mmc0 = {	.clk		= {		.name		= "sclk_mmc",		.devname	= "s3c-sdhci.0",		.enable		= s5pv210_clk_mask0_ctrl,		.ctrlbit	= (1 << 8),	},	.sources = &clkset_group2,	.reg_src = { .reg = S5P_CLK_SRC4, .shift = 0, .size = 4 },	.reg_div = { .reg = S5P_CLK_DIV4, .shift = 0, .size = 4 },};static struct clksrc_clk clk_sclk_mmc1 = {	.clk		= {		.name		= "sclk_mmc",		.devname	= "s3c-sdhci.1",		.enable		= s5pv210_clk_mask0_ctrl,		.ctrlbit	= (1 << 9),	},	.sources = &clkset_group2,	.reg_src = { .reg = S5P_CLK_SRC4, .shift = 4, .size = 4 },	.reg_div = { .reg = S5P_CLK_DIV4, .shift = 4, .size = 4 },};static struct clksrc_clk clk_sclk_mmc2 = {	.clk		= {		.name		= "sclk_mmc",		.devname	= "s3c-sdhci.2",		.enable		= s5pv210_clk_mask0_ctrl,		.ctrlbit	= (1 << 10),	},	.sources = &clkset_group2,	.reg_src = { .reg = S5P_CLK_SRC4, .shift = 8, .size = 4 },	.reg_div = { .reg = S5P_CLK_DIV4, .shift = 8, .size = 4 },};static struct clksrc_clk clk_sclk_mmc3 = {	.clk		= {		.name		= "sclk_mmc",		.devname	= "s3c-sdhci.3",		.enable		= s5pv210_clk_mask0_ctrl,		.ctrlbit	= (1 << 11),	},	.sources = &clkset_group2,	.reg_src = { .reg = S5P_CLK_SRC4, .shift = 12, .size = 4 },	.reg_div = { .reg = S5P_CLK_DIV4, .shift = 12, .size = 4 },};static struct clksrc_clk clk_sclk_spi0 = {	.clk		= {		.name		= "sclk_spi",		.devname	= "s5pv210-spi.0",		.enable		= s5pv210_clk_mask0_ctrl,		.ctrlbit	= (1 << 16),	},	.sources = &clkset_group2,	.reg_src = { .reg = S5P_CLK_SRC5, .shift = 0, .size = 4 },	.reg_div = { .reg = S5P_CLK_DIV5, .shift = 0, .size = 4 },	};static struct clksrc_clk clk_sclk_spi1 = {	.clk		= {		.name		= "sclk_spi",		.devname	= "s5pv210-spi.1",		.enable		= s5pv210_clk_mask0_ctrl,		.ctrlbit	= (1 << 17),	},	.sources = &clkset_group2,	.reg_src = { .reg = S5P_CLK_SRC5, .shift = 4, .size = 4 },	.reg_div = { .reg = S5P_CLK_DIV5, .shift = 4, .size = 4 },	};static struct clksrc_clk *clksrc_cdev[] = {	&clk_sclk_uart0,	&clk_sclk_uart1,	&clk_sclk_uart2,	&clk_sclk_uart3,	&clk_sclk_mmc0,	&clk_sclk_mmc1,	&clk_sclk_mmc2,	&clk_sclk_mmc3,	&clk_sclk_spi0,	&clk_sclk_spi1,};static struct clk *clk_cdev[] = {	&clk_hsmmc0,	&clk_hsmmc1,	&clk_hsmmc2,	&clk_hsmmc3,};/* Clock initialisation code */static struct clksrc_clk *sysclks[] = {	&clk_mout_apll,	&clk_mout_epll,	&clk_mout_mpll,	&clk_armclk,	&clk_hclk_msys,	&clk_sclk_a2m,	&clk_hclk_dsys,	&clk_hclk_psys,	&clk_pclk_msys,	&clk_pclk_dsys,	&clk_pclk_psys,	&clk_vpllsrc,	&clk_sclk_vpll,	&clk_mout_dmc0,	&clk_sclk_dmc0,	&clk_sclk_audio0,	&clk_sclk_audio1,	&clk_sclk_audio2,	&clk_sclk_spdif,};static u32 epll_div[][6] = {	{  48000000, 0, 48, 3, 3, 0 },	{  96000000, 0, 48, 3, 2, 0 },	{ 144000000, 1, 72, 3, 2, 0 },	{ 192000000, 0, 48, 3, 1, 0 },	{ 288000000, 1, 72, 3, 1, 0 },	{  32750000, 1, 65, 3, 4, 35127 },	{  32768000, 1, 65, 3, 4, 35127 },	{  45158400, 0, 45, 3, 3, 10355 },	{  45000000, 0, 45, 3, 3, 10355 },	{  45158000, 0, 45, 3, 3, 10355 },	{  49125000, 0, 49, 3, 3, 9961 },	{  49152000, 0, 49, 3, 3, 9961 },	{  67737600, 1, 67, 3, 3, 48366 },	{  67738000, 1, 67, 3, 3, 48366 },	{  73800000, 1, 73, 3, 3, 47710 },	{  73728000, 1, 73, 3, 3, 47710 },	{  36000000, 1, 32, 3, 4, 0 },	{  60000000, 1, 60, 3, 3, 0 },	{  72000000, 1, 72, 3, 3, 0 },	{  80000000, 1, 80, 3, 3, 0 },	{  84000000, 0, 42, 3, 2, 0 },	{  50000000, 0, 50, 3, 3, 0 },};static int s5pv210_epll_set_rate(struct clk *clk, unsigned long rate){	unsigned int epll_con, epll_con_k;	unsigned int i;
 |