[PATCH] ARM: Exynos4: add support for GATE BLOCK clocks

Kukjin Kim kgene.kim at samsung.com
Thu May 10 05:13:34 EDT 2012


Marek Szyprowski wrote:
> 
> EXYNOS4_CLKGATE_BLOCK register can be used to disable the respective
> multimedia block hardware planes. It acts similar to the power domains.
> This patch adds transparent support for this method of gating of
> multimedia blocks. New clocks are added as parents to the respective
> block bus clocks. This patch has been tested on NURI and UniversalC210
> boards, which have bootloader which disable all multimedia blocks with
> both GATE BLOCK method and power domains.
> 
> Signed-off-by: Marek Szyprowski <m.szyprowski at samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park at samsung.com>
> ---
>  arch/arm/mach-exynos/clock-exynos4.c |   54
> ++++++++++++++++++++++++++++++++++
>  1 files changed, 54 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm/mach-exynos/clock-exynos4.c b/arch/arm/mach-
> exynos/clock-exynos4.c
> index 4287311..a2f8b2e 100644
> --- a/arch/arm/mach-exynos/clock-exynos4.c
> +++ b/arch/arm/mach-exynos/clock-exynos4.c
> @@ -213,6 +213,11 @@ static int exynos4_clk_dac_ctrl(struct clk *clk, int
> enable)
>  	return s5p_gatectrl(S5P_DAC_PHY_CONTROL, clk, enable);
>  }
> 
> +static int exynos4_clk_gate_block_ctrl(struct clk *clk, int enable)
> +{
> +	return s5p_gatectrl(EXYNOS4_CLKGATE_BLOCK, clk, enable);
> +}
> +
>  /* Core list of CMU_CPU side */
> 
>  static struct clksrc_clk exynos4_clk_mout_apll = {
> @@ -459,6 +464,37 @@ static struct clksrc_clk exynos4_clk_sclk_vpll = {
>  	.reg_src = { .reg = EXYNOS4_CLKSRC_TOP0, .shift = 8, .size = 1 },
>  };
> 
> +static struct clk exynos4_clk_gate_cam = {
> +	.name		= "cam",
> +	.enable		= exynos4_clk_gate_block_ctrl,
> +	.ctrlbit	= (1 << 0),
> +};
> +
> +static struct clk exynos4_clk_gate_tv = {
> +	.name		= "tv",
> +	.enable		= exynos4_clk_gate_block_ctrl,
> +	.ctrlbit	= (1 << 1),
> +};
> +
> +static struct clk exynos4_clk_gate_mfc = {
> +	.name		= "mfc",
> +	.enable		= exynos4_clk_gate_block_ctrl,
> +	.ctrlbit	= (1 << 2),
> +};
> +
> +static struct clk exynos4_clk_gate_lcd0 = {
> +	.name		= "lcd0",
> +	.enable		= exynos4_clk_gate_block_ctrl,
> +	.ctrlbit	= (1 << 4),
> +};
> +
> +static struct clk *exynos4_gate_clocks[] = {
> +	&exynos4_clk_gate_cam,
> +	&exynos4_clk_gate_tv,
> +	&exynos4_clk_gate_mfc,
> +	&exynos4_clk_gate_lcd0,
> +};
> +
>  static struct clk exynos4_init_clocks_off[] = {
>  	{
>  		.name		= "timers",
> @@ -470,36 +506,43 @@ static struct clk exynos4_init_clocks_off[] = {
>  		.devname	= "s5p-mipi-csis.0",
>  		.enable		= exynos4_clk_ip_cam_ctrl,
>  		.ctrlbit	= (1 << 4),
> +		.parent		= &exynos4_clk_gate_cam,
>  	}, {
>  		.name		= "csis",
>  		.devname	= "s5p-mipi-csis.1",
>  		.enable		= exynos4_clk_ip_cam_ctrl,
>  		.ctrlbit	= (1 << 5),
> +		.parent		= &exynos4_clk_gate_cam,
>  	}, {
>  		.name		= "jpeg",
>  		.id		= 0,
>  		.enable		= exynos4_clk_ip_cam_ctrl,
>  		.ctrlbit	= (1 << 6),
> +		.parent		= &exynos4_clk_gate_cam,
>  	}, {
>  		.name		= "fimc",
>  		.devname	= "exynos4-fimc.0",
>  		.enable		= exynos4_clk_ip_cam_ctrl,
>  		.ctrlbit	= (1 << 0),
> +		.parent		= &exynos4_clk_gate_cam,
>  	}, {
>  		.name		= "fimc",
>  		.devname	= "exynos4-fimc.1",
>  		.enable		= exynos4_clk_ip_cam_ctrl,
>  		.ctrlbit	= (1 << 1),
> +		.parent		= &exynos4_clk_gate_cam,
>  	}, {
>  		.name		= "fimc",
>  		.devname	= "exynos4-fimc.2",
>  		.enable		= exynos4_clk_ip_cam_ctrl,
>  		.ctrlbit	= (1 << 2),
> +		.parent		= &exynos4_clk_gate_cam,
>  	}, {
>  		.name		= "fimc",
>  		.devname	= "exynos4-fimc.3",
>  		.enable		= exynos4_clk_ip_cam_ctrl,
>  		.ctrlbit	= (1 << 3),
> +		.parent		= &exynos4_clk_gate_cam,
>  	}, {
>  		.name		= "hsmmc",
>  		.devname	= "s3c-sdhci.0",
> @@ -534,31 +577,37 @@ static struct clk exynos4_init_clocks_off[] = {
>  		.devname	= "s5p-sdo",
>  		.enable		= exynos4_clk_ip_tv_ctrl,
>  		.ctrlbit	= (1 << 2),
> +		.parent		= &exynos4_clk_gate_tv,
>  	}, {
>  		.name		= "mixer",
>  		.devname	= "s5p-mixer",
>  		.enable		= exynos4_clk_ip_tv_ctrl,
>  		.ctrlbit	= (1 << 1),
> +		.parent		= &exynos4_clk_gate_tv,
>  	}, {
>  		.name		= "vp",
>  		.devname	= "s5p-mixer",
>  		.enable		= exynos4_clk_ip_tv_ctrl,
>  		.ctrlbit	= (1 << 0),
> +		.parent		= &exynos4_clk_gate_tv,
>  	}, {
>  		.name		= "hdmi",
>  		.devname	= "exynos4-hdmi",
>  		.enable		= exynos4_clk_ip_tv_ctrl,
>  		.ctrlbit	= (1 << 3),
> +		.parent		= &exynos4_clk_gate_tv,
>  	}, {
>  		.name		= "hdmiphy",
>  		.devname	= "exynos4-hdmi",
>  		.enable		= exynos4_clk_hdmiphy_ctrl,
>  		.ctrlbit	= (1 << 0),
> +		.parent		= &exynos4_clk_gate_tv,
>  	}, {
>  		.name		= "dacphy",
>  		.devname	= "s5p-sdo",
>  		.enable		= exynos4_clk_dac_ctrl,
>  		.ctrlbit	= (1 << 0),
> +		.parent		= &exynos4_clk_gate_tv,
>  	}, {
>  		.name		= "adc",
>  		.enable		= exynos4_clk_ip_peril_ctrl,
> @@ -623,11 +672,13 @@ static struct clk exynos4_init_clocks_off[] = {
>  		.name		= "fimg2d",
>  		.enable		= exynos4_clk_ip_image_ctrl,
>  		.ctrlbit	= (1 << 0),
> +		.parent		= &exynos4_clk_gate_lcd0,
>  	}, {
>  		.name		= "mfc",
>  		.devname	= "s5p-mfc",
>  		.enable		= exynos4_clk_ip_mfc_ctrl,
>  		.ctrlbit	= (1 << 0),
> +		.parent		= &exynos4_clk_gate_mfc,
>  	}, {
>  		.name		= "i2c",
>  		.devname	= "s3c2440-i2c.0",
> @@ -795,6 +846,7 @@ static struct clk exynos4_clk_fimd0 = {
>  	.devname	= "exynos4-fb.0",
>  	.enable		= exynos4_clk_ip_lcd0_ctrl,
>  	.ctrlbit	= (1 << 0),
> +	.parent		= &exynos4_clk_gate_lcd0,
>  };
> 
>  struct clk *exynos4_clkset_group_list[] = {
> @@ -1565,6 +1617,8 @@ void __init exynos4_register_clocks(void)
>  	s3c_register_clksrc(exynos4_clksrcs, ARRAY_SIZE(exynos4_clksrcs));
>  	s3c_register_clocks(exynos4_init_clocks_on,
> ARRAY_SIZE(exynos4_init_clocks_on));
> 
> +	s3c24xx_register_clocks(exynos4_gate_clocks,
> ARRAY_SIZE(exynos4_gate_clocks));
> +
>  	s3c24xx_register_clocks(exynos4_clk_cdev,
> ARRAY_SIZE(exynos4_clk_cdev));
>  	for (ptr = 0; ptr < ARRAY_SIZE(exynos4_clk_cdev); ptr++)
>  		s3c_disable_clocks(exynos4_clk_cdev[ptr], 1);
> --
> 1.7.1.569.g6f426

I remember, we talked about the GATE BLOCK for EXYNOS.
So now, there are any reasons it should be implemented?

Thanks.

Best regards,
Kgene.
--
Kukjin Kim <kgene.kim at samsung.com>, Senior Engineer,
SW Solution Development Team, Samsung Electronics Co., Ltd.




More information about the linux-arm-kernel mailing list