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:
Коммит
4c43d1c1bc
|
@ -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;
|
||||
|
Загрузка…
Ссылка в новой задаче