Samsung drivers/soc update for v4.8:

1. Move the power domain driver from arm/mach-exynos and prepare
    for supporting ARMv8.
 2. Add COMPILE_TEST.
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQIcBAABAgAGBQJXVWC+AAoJEME3ZuaGi4PXf4gP/3Hv1/awGDmI0eCoPovzp4fS
 uxTtPmp5V4NgU2R7tYzmo6/8fUu2YSFlSVFrM1CYgCwM+E67GQsmfBS0MB4r3ssZ
 q4QvTIynvV0jybl0ZjPC0bso1A9rDhKSg+mME8nghkb6JBfqqUcKzx1fYm2nTH/9
 lksO13WWwNgtQ4qs9xMlilFKxKZAX/XpYakLsvNqH3v/iNz/OKn2kneyGtkKiplZ
 lsab3bJn+bKJOQFLtBTstnVNNb0ji0Q7ZbLylgFfskyqFOPp2om+6TEjnn/czNYU
 t6reUFABZq4E2XvkZRwBP5y/4JquSbJO3UzvfgDYEqnJpArEnzG8xe+cvw6inono
 Nwv2nXRo40v7Ta43oSmLiHvCeLKd/ldmoKK0s9IKB5dxfmpkixqu2qHuleqRmrYp
 bFy1mxkpq7CwFxBpxpIyN91TNdieTF/O49pzUGCBjqnEVYC0EiZT4VxTuvv2jg0J
 tSWDAxc0u8Uk0N5yol0yWejYQgq6i/hJH+HwR6iDoeKSbaoj72dYgBNGD9HsSgcn
 BHeb1L1T4qWdgvNX5wzfnnoh4nIAh64UmxQCrzbzPDGuCmUx7EOEPQpvrwl8JBNT
 DM7XRh4NpTpU8KIDA8MxeHzG47YHOSkk7Y4UzSv+C+S6IGxzrDZ5uXnz4tVDIWhV
 1YBOmVufh9JXHxMRcIpy
 =P4zd
 -----END PGP SIGNATURE-----

Merge tag 'samsung-drivers-4.8' of git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux into next/drivers

Samsung drivers/soc update for v4.8:
1. Move the power domain driver from arm/mach-exynos and prepare
   for supporting ARMv8.
2. Add COMPILE_TEST.

* tag 'samsung-drivers-4.8' of git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux:
  soc: samsung: pm_domains: Enable COMPILE_TEST for build coverage
  soc: samsung: pm_domains: Prepare for supporting ARMv8 Exynos
  ARM: EXYNOS: Move pm_domains driver to drivers/soc/samsung

Signed-off-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
Olof Johansson 2016-06-13 14:28:37 -07:00
Родитель e7a6bb9a05 9479f7cc91
Коммит 4c43d1c1bc
5 изменённых файлов: 34 добавлений и 7 удалений

Просмотреть файл

@ -19,6 +19,7 @@ menuconfig ARCH_EXYNOS
select EXYNOS_THERMAL
select EXYNOS_PMU
select EXYNOS_SROM
select EXYNOS_PM_DOMAINS if PM_GENERIC_DOMAINS
select HAVE_ARM_SCU if SMP
select HAVE_S3C2410_I2C if I2C
select HAVE_S3C2410_WATCHDOG if WATCHDOG

Просмотреть файл

@ -13,7 +13,6 @@ obj-$(CONFIG_ARCH_EXYNOS) += exynos.o exynos-smc.o firmware.o
obj-$(CONFIG_EXYNOS_CPU_SUSPEND) += pm.o sleep.o
obj-$(CONFIG_PM_SLEEP) += suspend.o
obj-$(CONFIG_PM_GENERIC_DOMAINS) += pm_domains.o
obj-$(CONFIG_SMP) += platsmp.o headsmp.o

Просмотреть файл

@ -10,4 +10,8 @@ config EXYNOS_PMU
bool "Exynos PMU controller driver" if COMPILE_TEST
depends on (ARM && ARCH_EXYNOS) || ((ARM || ARM64) && COMPILE_TEST)
config EXYNOS_PM_DOMAINS
bool "Exynos PM domains" if COMPILE_TEST
depends on PM_GENERIC_DOMAINS || COMPILE_TEST
endif

Просмотреть файл

@ -1,2 +1,3 @@
obj-$(CONFIG_EXYNOS_PMU) += exynos-pmu.o exynos3250-pmu.o exynos4-pmu.o \
exynos5250-pmu.o exynos5420-pmu.o
obj-$(CONFIG_EXYNOS_PM_DOMAINS) += pm_domains.o

Просмотреть файл

@ -23,9 +23,13 @@
#include <linux/of_platform.h>
#include <linux/sched.h>
#define INT_LOCAL_PWR_EN 0x7
#define MAX_CLK_PER_DOMAIN 4
struct exynos_pm_domain_config {
/* Value for LOCAL_PWR_CFG and STATUS fields for each domain */
u32 local_pwr_cfg;
};
/*
* Exynos specific wrapper around the generic power domain
*/
@ -38,6 +42,7 @@ struct exynos_pm_domain {
struct clk *clk[MAX_CLK_PER_DOMAIN];
struct clk *pclk[MAX_CLK_PER_DOMAIN];
struct clk *asb_clk[MAX_CLK_PER_DOMAIN];
u32 local_pwr_cfg;
};
static int exynos_pd_power(struct generic_pm_domain *domain, bool power_on)
@ -69,13 +74,13 @@ static int exynos_pd_power(struct generic_pm_domain *domain, bool power_on)
}
}
pwr = power_on ? INT_LOCAL_PWR_EN : 0;
pwr = power_on ? pd->local_pwr_cfg : 0;
__raw_writel(pwr, base);
/* Wait max 1ms */
timeout = 10;
while ((__raw_readl(base + 0x4) & INT_LOCAL_PWR_EN) != pwr) {
while ((__raw_readl(base + 0x4) & pd->local_pwr_cfg) != pwr) {
if (!timeout) {
op = (power_on) ? "enable" : "disable";
pr_err("Power domain %s %s failed\n", domain->name, op);
@ -119,14 +124,30 @@ static int exynos_pd_power_off(struct generic_pm_domain *domain)
return exynos_pd_power(domain, false);
}
static const struct exynos_pm_domain_config exynos4210_cfg __initconst = {
.local_pwr_cfg = 0x7,
};
static const struct of_device_id exynos_pm_domain_of_match[] __initconst = {
{
.compatible = "samsung,exynos4210-pd",
.data = &exynos4210_cfg,
},
{ },
};
static __init int exynos4_pm_init_power_domain(void)
{
struct device_node *np;
const struct of_device_id *match;
for_each_compatible_node(np, NULL, "samsung,exynos4210-pd") {
for_each_matching_node_and_match(np, exynos_pm_domain_of_match, &match) {
const struct exynos_pm_domain_config *pm_domain_cfg;
struct exynos_pm_domain *pd;
int on, i;
pm_domain_cfg = match->data;
pd = kzalloc(sizeof(*pd), GFP_KERNEL);
if (!pd) {
pr_err("%s: failed to allocate memory for domain\n",
@ -153,6 +174,7 @@ static __init int exynos4_pm_init_power_domain(void)
pd->pd.power_off = exynos_pd_power_off;
pd->pd.power_on = exynos_pd_power_on;
pd->local_pwr_cfg = pm_domain_cfg->local_pwr_cfg;
for (i = 0; i < MAX_CLK_PER_DOMAIN; i++) {
char clk_name[8];
@ -185,14 +207,14 @@ static __init int exynos4_pm_init_power_domain(void)
clk_put(pd->oscclk);
no_clk:
on = __raw_readl(pd->base + 0x4) & INT_LOCAL_PWR_EN;
on = __raw_readl(pd->base + 0x4) & pd->local_pwr_cfg;
pm_genpd_init(&pd->pd, NULL, !on);
of_genpd_add_provider_simple(np, &pd->pd);
}
/* Assign the child power domains to their parents */
for_each_compatible_node(np, NULL, "samsung,exynos4210-pd") {
for_each_matching_node(np, exynos_pm_domain_of_match) {
struct generic_pm_domain *child_domain, *parent_domain;
struct of_phandle_args args;