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

Commit 48ed0003 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

Merge branch 'pm-domains'

* pm-domains:
  PM / Domains: Fix include for PM_GENERIC_DOMAINS=n case
  PM / Domains: Provide a dummy dev_gpd_data() when generic domains are not used
  PM / Domains: Run late/early device suspend callbacks at the right time
  ARM: EXYNOS: Hook up power domains to generic power domain infrastructure
  PM / Domains: Add OF support
parents 643161ac b642631d
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