Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 91cfbd4e authored by Thomas Abraham's avatar Thomas Abraham Committed by Kukjin Kim
Browse files

ARM: EXYNOS: Hook up power domains to generic power domain infrastructure



Add support for generic power domain for Exynos4 platforms and remove the
Samsung specific power domain control for Exynos4.

The generic power domain infrastructure is used to control the power domains
available on Exynos4. For non-dt platforms, the power domains are statically
instantiated. For dt platforms, the power domain nodes found in the device
tree are instantiated.

Cc: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Rob Herring <rob.herring@calxeda.com>
Cc: Grant Likely <grant.likely@secretlab.ca>
Signed-off-by: default avatarThomas Abraham <thomas.abraham@linaro.org>
Acked-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: default avatarKukjin Kim <kgene.kim@samsung.com>
parent c8aa130b
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
* Samsung Exynos Power Domains

Exynos processors include support for multiple power domains which are used
to gate power to one or more peripherals on the processor.

Required Properties:
- compatiable: should be one of the following.
    * samsung,exynos4210-pd - for exynos4210 type power domain.
- reg: physical base address of the controller and length of memory mapped
    region.

Optional Properties:
- samsung,exynos4210-pd-off: Specifies that the power domain is in turned-off
    state during boot and remains to be turned-off until explicitly turned-on.

Example:

	lcd0: power-domain-lcd0 {
		compatible = "samsung,exynos4210-pd";
		reg = <0x10023C00 0x10>;
	};
+1 −9
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ config CPU_EXYNOS4210
	select ARM_CPU_SUSPEND if PM
	select S5P_PM if PM
	select S5P_SLEEP if PM
	select PM_GENERIC_DOMAINS
	help
	  Enable EXYNOS4210 CPU support

@@ -74,11 +75,6 @@ config EXYNOS4_SETUP_FIMD0
	help
	  Common setup code for FIMD0.

config EXYNOS4_DEV_PD
	bool
	help
	  Compile in platform device definitions for Power Domain

config EXYNOS4_DEV_SYSMMU
	bool
	help
@@ -195,7 +191,6 @@ config MACH_SMDKV310
	select EXYNOS4_DEV_AHCI
	select SAMSUNG_DEV_KEYPAD
	select EXYNOS4_DEV_DMA
	select EXYNOS4_DEV_PD
	select SAMSUNG_DEV_PWM
	select EXYNOS4_DEV_USB_OHCI
	select EXYNOS4_DEV_SYSMMU
@@ -243,7 +238,6 @@ config MACH_UNIVERSAL_C210
	select S5P_DEV_ONENAND
	select S5P_DEV_TV
	select EXYNOS4_DEV_DMA
	select EXYNOS4_DEV_PD
	select EXYNOS4_SETUP_FIMD0
	select EXYNOS4_SETUP_I2C1
	select EXYNOS4_SETUP_I2C3
@@ -277,7 +271,6 @@ config MACH_NURI
	select S5P_DEV_USB_EHCI
	select S5P_SETUP_MIPIPHY
	select EXYNOS4_DEV_DMA
	select EXYNOS4_DEV_PD
	select EXYNOS4_SETUP_FIMC
	select EXYNOS4_SETUP_FIMD0
	select EXYNOS4_SETUP_I2C1
@@ -310,7 +303,6 @@ config MACH_ORIGEN
	select SAMSUNG_DEV_BACKLIGHT
	select SAMSUNG_DEV_PWM
	select EXYNOS4_DEV_DMA
	select EXYNOS4_DEV_PD
	select EXYNOS4_DEV_USB_OHCI
	select EXYNOS4_SETUP_FIMD0
	select EXYNOS4_SETUP_SDHCI
+1 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ obj-$(CONFIG_CPU_EXYNOS4210) += clock-exynos4210.o
obj-$(CONFIG_SOC_EXYNOS4212)	+= clock-exynos4212.o

obj-$(CONFIG_PM)		+= pm.o
obj-$(CONFIG_PM_GENERIC_DOMAINS) += pm_domains.o
obj-$(CONFIG_CPU_IDLE)		+= cpuidle.o

obj-$(CONFIG_ARCH_EXYNOS4)	+= pmu.o
@@ -45,7 +46,6 @@ obj-$(CONFIG_MACH_EXYNOS4_DT) += mach-exynos4-dt.o

obj-$(CONFIG_ARCH_EXYNOS4)		+= dev-audio.o
obj-$(CONFIG_EXYNOS4_DEV_AHCI)		+= dev-ahci.o
obj-$(CONFIG_EXYNOS4_DEV_PD)		+= dev-pd.o
obj-$(CONFIG_EXYNOS4_DEV_SYSMMU)	+= dev-sysmmu.o
obj-$(CONFIG_EXYNOS4_DEV_DWMCI)		+= dev-dwmci.o
obj-$(CONFIG_EXYNOS4_DEV_DMA)		+= dma.o

arch/arm/mach-exynos/dev-pd.c

deleted100644 → 0
+0 −139
Original line number Diff line number Diff line
/* linux/arch/arm/mach-exynos4/dev-pd.c
 *
 * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
 *		http://www.samsung.com
 *
 * EXYNOS4 - Power Domain 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/io.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/delay.h>

#include <mach/regs-pmu.h>

#include <plat/pd.h>

static int exynos4_pd_enable(struct device *dev)
{
	struct samsung_pd_info *pdata =  dev->platform_data;
	u32 timeout;

	__raw_writel(S5P_INT_LOCAL_PWR_EN, pdata->base);

	/* Wait max 1ms */
	timeout = 10;
	while ((__raw_readl(pdata->base + 0x4) & S5P_INT_LOCAL_PWR_EN)
		!= S5P_INT_LOCAL_PWR_EN) {
		if (timeout == 0) {
			printk(KERN_ERR "Power domain %s enable failed.\n",
				dev_name(dev));
			return -ETIMEDOUT;
		}
		timeout--;
		udelay(100);
	}

	return 0;
}

static int exynos4_pd_disable(struct device *dev)
{
	struct samsung_pd_info *pdata =  dev->platform_data;
	u32 timeout;

	__raw_writel(0, pdata->base);

	/* Wait max 1ms */
	timeout = 10;
	while (__raw_readl(pdata->base + 0x4) & S5P_INT_LOCAL_PWR_EN) {
		if (timeout == 0) {
			printk(KERN_ERR "Power domain %s disable failed.\n",
				dev_name(dev));
			return -ETIMEDOUT;
		}
		timeout--;
		udelay(100);
	}

	return 0;
}

struct platform_device exynos4_device_pd[] = {
	{
		.name		= "samsung-pd",
		.id		= 0,
		.dev = {
			.platform_data = &(struct samsung_pd_info) {
				.enable		= exynos4_pd_enable,
				.disable	= exynos4_pd_disable,
				.base		= S5P_PMU_MFC_CONF,
			},
		},
	}, {
		.name		= "samsung-pd",
		.id		= 1,
		.dev = {
			.platform_data = &(struct samsung_pd_info) {
				.enable		= exynos4_pd_enable,
				.disable	= exynos4_pd_disable,
				.base		= S5P_PMU_G3D_CONF,
			},
		},
	}, {
		.name		= "samsung-pd",
		.id		= 2,
		.dev = {
			.platform_data = &(struct samsung_pd_info) {
				.enable		= exynos4_pd_enable,
				.disable	= exynos4_pd_disable,
				.base		= S5P_PMU_LCD0_CONF,
			},
		},
	}, {
		.name		= "samsung-pd",
		.id		= 3,
		.dev = {
			.platform_data = &(struct samsung_pd_info) {
				.enable		= exynos4_pd_enable,
				.disable	= exynos4_pd_disable,
				.base		= S5P_PMU_LCD1_CONF,
			},
		},
	}, {
		.name		= "samsung-pd",
		.id		= 4,
		.dev = {
			.platform_data = &(struct samsung_pd_info) {
				.enable		= exynos4_pd_enable,
				.disable	= exynos4_pd_disable,
				.base		= S5P_PMU_TV_CONF,
			},
		},
	}, {
		.name		= "samsung-pd",
		.id		= 5,
		.dev = {
			.platform_data = &(struct samsung_pd_info) {
				.enable		= exynos4_pd_enable,
				.disable	= exynos4_pd_disable,
				.base		= S5P_PMU_CAM_CONF,
			},
		},
	}, {
		.name		= "samsung-pd",
		.id		= 6,
		.dev = {
			.platform_data = &(struct samsung_pd_info) {
				.enable		= exynos4_pd_enable,
				.disable	= exynos4_pd_disable,
				.base		= S5P_PMU_GPS_CONF,
			},
		},
	},
};
+0 −11
Original line number Diff line number Diff line
@@ -1263,9 +1263,6 @@ static struct platform_device *nuri_devices[] __initdata = {
	&s5p_device_mfc,
	&s5p_device_mfc_l,
	&s5p_device_mfc_r,
	&exynos4_device_pd[PD_MFC],
	&exynos4_device_pd[PD_LCD0],
	&exynos4_device_pd[PD_CAM],
	&s5p_device_fimc_md,

	/* NURI Devices */
@@ -1315,14 +1312,6 @@ static void __init nuri_machine_init(void)

	/* Last */
	platform_add_devices(nuri_devices, ARRAY_SIZE(nuri_devices));
	s5p_device_mfc.dev.parent = &exynos4_device_pd[PD_MFC].dev;
	s5p_device_fimd0.dev.parent = &exynos4_device_pd[PD_LCD0].dev;

	s5p_device_fimc0.dev.parent = &exynos4_device_pd[PD_CAM].dev;
	s5p_device_fimc1.dev.parent = &exynos4_device_pd[PD_CAM].dev;
	s5p_device_fimc2.dev.parent = &exynos4_device_pd[PD_CAM].dev;
	s5p_device_fimc3.dev.parent = &exynos4_device_pd[PD_CAM].dev;
	s5p_device_mipi_csis0.dev.parent = &exynos4_device_pd[PD_CAM].dev;
}

MACHINE_START(NURI, "NURI")
Loading