/* 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, }, }, }, };