Commit f327e07b authored by Rajendra Nayak's avatar Rajendra Nayak Committed by Paul Walmsley

OMAP: powerdomain: Arch specific funcs for state control

Define the following architecture specific funtions for omap2/3/4
.pwrdm_set_next_pwrst
.pwrdm_read_next_pwrst
.pwrdm_read_pwrst
.pwrdm_read_prev_pwrst

Convert the platform-independent framework to call these functions.
Signed-off-by: default avatarRajendra Nayak <rnayak@ti.com>
[paul@pwsan.com: remove remaining static allocations in powerdomains.h file;
 remove path in file header comments, rearranged Makefile changes]
Signed-off-by: default avatarPaul Walmsley <paul@pwsan.com>
Cc: Benoit Cousson <b-cousson@ti.com>
Cc: Kevin Hilman <khilman@deeprootsystems.com>
Reviewed-by: default avatarKevin Hilman <khilman@deeprootsystems.com>
Tested-by: default avatarKevin Hilman <khilman@deeprootsystems.com>
Tested-by: default avatarSantosh Shilimkar <santosh.shilimkar@ti.com>
Tested-by: default avatarRajendra Nayak <rnayak@ti.com>
parent 3b1e8b21
...@@ -79,7 +79,12 @@ obj-$(CONFIG_ARCH_OMAP4) += prcm.o cm4xxx.o ...@@ -79,7 +79,12 @@ obj-$(CONFIG_ARCH_OMAP4) += prcm.o cm4xxx.o
# OMAP powerdomain framework # OMAP powerdomain framework
powerdomain-common += powerdomain.o powerdomains_data.o powerdomain-common += powerdomain.o powerdomains_data.o
obj-y += $(powerdomain-common) obj-$(CONFIG_ARCH_OMAP2) += $(powerdomain-common) \
powerdomain2xxx_3xxx.o
obj-$(CONFIG_ARCH_OMAP3) += $(powerdomain-common) \
powerdomain2xxx_3xxx.o
obj-$(CONFIG_ARCH_OMAP4) += $(powerdomain-common) \
powerdomain44xx.o
# Clock framework # Clock framework
obj-$(CONFIG_ARCH_OMAP2) += $(clock-common) clock2xxx.o \ obj-$(CONFIG_ARCH_OMAP2) += $(clock-common) clock2xxx.o \
......
...@@ -439,6 +439,8 @@ int pwrdm_get_mem_bank_count(struct powerdomain *pwrdm) ...@@ -439,6 +439,8 @@ int pwrdm_get_mem_bank_count(struct powerdomain *pwrdm)
*/ */
int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst) int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
{ {
int ret = -EINVAL;
if (!pwrdm) if (!pwrdm)
return -EINVAL; return -EINVAL;
...@@ -448,11 +450,10 @@ int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst) ...@@ -448,11 +450,10 @@ int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
pr_debug("powerdomain: setting next powerstate for %s to %0x\n", pr_debug("powerdomain: setting next powerstate for %s to %0x\n",
pwrdm->name, pwrst); pwrdm->name, pwrst);
prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK, if (arch_pwrdm && arch_pwrdm->pwrdm_set_next_pwrst)
(pwrst << OMAP_POWERSTATE_SHIFT), ret = arch_pwrdm->pwrdm_set_next_pwrst(pwrdm, pwrst);
pwrdm->prcm_offs, pwrstctrl_reg_offs);
return 0; return ret;
} }
/** /**
...@@ -465,11 +466,15 @@ int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst) ...@@ -465,11 +466,15 @@ int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
*/ */
int pwrdm_read_next_pwrst(struct powerdomain *pwrdm) int pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
{ {
int ret = -EINVAL;
if (!pwrdm) if (!pwrdm)
return -EINVAL; return -EINVAL;
return prm_read_mod_bits_shift(pwrdm->prcm_offs, if (arch_pwrdm && arch_pwrdm->pwrdm_read_next_pwrst)
pwrstctrl_reg_offs, OMAP_POWERSTATE_MASK); ret = arch_pwrdm->pwrdm_read_next_pwrst(pwrdm);
return ret;
} }
/** /**
...@@ -482,11 +487,15 @@ int pwrdm_read_next_pwrst(struct powerdomain *pwrdm) ...@@ -482,11 +487,15 @@ int pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
*/ */
int pwrdm_read_pwrst(struct powerdomain *pwrdm) int pwrdm_read_pwrst(struct powerdomain *pwrdm)
{ {
int ret = -EINVAL;
if (!pwrdm) if (!pwrdm)
return -EINVAL; return -EINVAL;
return prm_read_mod_bits_shift(pwrdm->prcm_offs, if (arch_pwrdm && arch_pwrdm->pwrdm_read_pwrst)
pwrstst_reg_offs, OMAP_POWERSTATEST_MASK); ret = arch_pwrdm->pwrdm_read_pwrst(pwrdm);
return ret;
} }
/** /**
...@@ -499,11 +508,15 @@ int pwrdm_read_pwrst(struct powerdomain *pwrdm) ...@@ -499,11 +508,15 @@ int pwrdm_read_pwrst(struct powerdomain *pwrdm)
*/ */
int pwrdm_read_prev_pwrst(struct powerdomain *pwrdm) int pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
{ {
int ret = -EINVAL;
if (!pwrdm) if (!pwrdm)
return -EINVAL; return -EINVAL;
return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP3430_PM_PREPWSTST, if (arch_pwrdm && arch_pwrdm->pwrdm_read_prev_pwrst)
OMAP3430_LASTPOWERSTATEENTERED_MASK); ret = arch_pwrdm->pwrdm_read_prev_pwrst(pwrdm);
return ret;
} }
/** /**
......
/*
* OMAP2 and OMAP3 powerdomain control
*
* Copyright (C) 2009-2010 Texas Instruments, Inc.
* Copyright (C) 2007-2009 Nokia Corporation
*
* Derived from mach-omap2/powerdomain.c written by Paul Walmsley
* Rajendra Nayak <rnayak@ti.com>
*
* 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/errno.h>
#include <linux/delay.h>
#include <plat/prcm.h>
#include "prm.h"
#include "prm-regbits-34xx.h"
#include "powerdomains.h"
/* Common functions across OMAP2 and OMAP3 */
static int omap2_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
{
prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK,
(pwrst << OMAP_POWERSTATE_SHIFT),
pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL);
return 0;
}
static int omap2_pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
{
return prm_read_mod_bits_shift(pwrdm->prcm_offs,
OMAP2_PM_PWSTCTRL, OMAP_POWERSTATE_MASK);
}
static int omap2_pwrdm_read_pwrst(struct powerdomain *pwrdm)
{
return prm_read_mod_bits_shift(pwrdm->prcm_offs,
OMAP2_PM_PWSTST, OMAP_POWERSTATEST_MASK);
}
/* Applicable only for OMAP3. Not supported on OMAP2 */
static int omap3_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
{
return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP3430_PM_PREPWSTST,
OMAP3430_LASTPOWERSTATEENTERED_MASK);
}
struct pwrdm_ops omap2_pwrdm_operations = {
.pwrdm_set_next_pwrst = omap2_pwrdm_set_next_pwrst,
.pwrdm_read_next_pwrst = omap2_pwrdm_read_next_pwrst,
.pwrdm_read_pwrst = omap2_pwrdm_read_pwrst,
};
struct pwrdm_ops omap3_pwrdm_operations = {
.pwrdm_set_next_pwrst = omap2_pwrdm_set_next_pwrst,
.pwrdm_read_next_pwrst = omap2_pwrdm_read_next_pwrst,
.pwrdm_read_pwrst = omap2_pwrdm_read_pwrst,
.pwrdm_read_prev_pwrst = omap3_pwrdm_read_prev_pwrst,
};
/*
* OMAP4 powerdomain control
*
* Copyright (C) 2009-2010 Texas Instruments, Inc.
* Copyright (C) 2007-2009 Nokia Corporation
*
* Derived from mach-omap2/powerdomain.c written by Paul Walmsley
* Rajendra Nayak <rnayak@ti.com>
*
* 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/errno.h>
#include <linux/delay.h>
#include <plat/powerdomain.h>
#include <plat/prcm.h>
#include "prm.h"
#include "prm-regbits-44xx.h"
#include "powerdomains.h"
static int omap4_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
{
prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK,
(pwrst << OMAP_POWERSTATE_SHIFT),
pwrdm->prcm_offs, OMAP4_PM_PWSTCTRL);
return 0;
}
static int omap4_pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
{
return prm_read_mod_bits_shift(pwrdm->prcm_offs,
OMAP4_PM_PWSTCTRL, OMAP_POWERSTATE_MASK);
}
static int omap4_pwrdm_read_pwrst(struct powerdomain *pwrdm)
{
return prm_read_mod_bits_shift(pwrdm->prcm_offs,
OMAP4_PM_PWSTST, OMAP_POWERSTATEST_MASK);
}
static int omap4_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
{
return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP4_PM_PWSTST,
OMAP4430_LASTPOWERSTATEENTERED_MASK);
}
struct pwrdm_ops omap4_pwrdm_operations = {
.pwrdm_set_next_pwrst = omap4_pwrdm_set_next_pwrst,
.pwrdm_read_next_pwrst = omap4_pwrdm_read_next_pwrst,
.pwrdm_read_pwrst = omap4_pwrdm_read_pwrst,
.pwrdm_read_prev_pwrst = omap4_pwrdm_read_prev_pwrst,
};
/*
* OMAP2+ powerdomain prototypes
*
* Copyright (C) 2010 Texas Instruments, Inc.
*
* Rajendra Nayak <rnayak@ti.com>
*
* 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.
*/
#ifndef ARCH_ARM_MACH_OMAP2_POWERDOMAINS
#define ARCH_ARM_MACH_OMAP2_POWERDOMAINS
#include <plat/powerdomain.h>
extern struct pwrdm_ops omap2_pwrdm_operations;
extern struct pwrdm_ops omap3_pwrdm_operations;
extern struct pwrdm_ops omap4_pwrdm_operations;
#endif /* ARCH_ARM_MACH_OMAP2_POWERDOMAINS */
...@@ -55,6 +55,7 @@ ...@@ -55,6 +55,7 @@
#include "powerdomains24xx.h" #include "powerdomains24xx.h"
#include "powerdomains34xx.h" #include "powerdomains34xx.h"
#include "powerdomains44xx.h" #include "powerdomains44xx.h"
#include "powerdomains.h"
/* OMAP2/3-common powerdomains */ /* OMAP2/3-common powerdomains */
...@@ -149,5 +150,10 @@ static struct powerdomain *powerdomains_omap[] __initdata = { ...@@ -149,5 +150,10 @@ static struct powerdomain *powerdomains_omap[] __initdata = {
void pwrdm_fw_init(void) void pwrdm_fw_init(void)
{ {
pwrdm_init(powerdomains_omap, NULL); if (cpu_is_omap24xx())
pwrdm_init(powerdomains_omap, &omap2_pwrdm_operations);
else if (cpu_is_omap34xx())
pwrdm_init(powerdomains_omap, &omap3_pwrdm_operations);
else if (cpu_is_omap44xx())
pwrdm_init(powerdomains_omap, &omap4_pwrdm_operations);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment