mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-12 05:24:12 +08:00
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: Rajendra 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: Paul Walmsley <paul@pwsan.com> Cc: Benoit Cousson <b-cousson@ti.com> Cc: Kevin Hilman <khilman@deeprootsystems.com> Reviewed-by: Kevin Hilman <khilman@deeprootsystems.com> Tested-by: Kevin Hilman <khilman@deeprootsystems.com> Tested-by: Santosh Shilimkar <santosh.shilimkar@ti.com> Tested-by: Rajendra Nayak <rnayak@ti.com>
This commit is contained in:
parent
3b1e8b21fc
commit
f327e07b0e
@ -79,7 +79,12 @@ obj-$(CONFIG_ARCH_OMAP4) += prcm.o cm4xxx.o
|
||||
|
||||
# OMAP powerdomain framework
|
||||
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
|
||||
obj-$(CONFIG_ARCH_OMAP2) += $(clock-common) clock2xxx.o \
|
||||
|
@ -439,6 +439,8 @@ int pwrdm_get_mem_bank_count(struct powerdomain *pwrdm)
|
||||
*/
|
||||
int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
|
||||
{
|
||||
int ret = -EINVAL;
|
||||
|
||||
if (!pwrdm)
|
||||
return -EINVAL;
|
||||
|
||||
@ -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",
|
||||
pwrdm->name, pwrst);
|
||||
|
||||
prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK,
|
||||
(pwrst << OMAP_POWERSTATE_SHIFT),
|
||||
pwrdm->prcm_offs, pwrstctrl_reg_offs);
|
||||
if (arch_pwrdm && arch_pwrdm->pwrdm_set_next_pwrst)
|
||||
ret = arch_pwrdm->pwrdm_set_next_pwrst(pwrdm, pwrst);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -465,11 +466,15 @@ int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
|
||||
*/
|
||||
int pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
|
||||
{
|
||||
int ret = -EINVAL;
|
||||
|
||||
if (!pwrdm)
|
||||
return -EINVAL;
|
||||
|
||||
return prm_read_mod_bits_shift(pwrdm->prcm_offs,
|
||||
pwrstctrl_reg_offs, OMAP_POWERSTATE_MASK);
|
||||
if (arch_pwrdm && arch_pwrdm->pwrdm_read_next_pwrst)
|
||||
ret = arch_pwrdm->pwrdm_read_next_pwrst(pwrdm);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -482,11 +487,15 @@ int pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
|
||||
*/
|
||||
int pwrdm_read_pwrst(struct powerdomain *pwrdm)
|
||||
{
|
||||
int ret = -EINVAL;
|
||||
|
||||
if (!pwrdm)
|
||||
return -EINVAL;
|
||||
|
||||
return prm_read_mod_bits_shift(pwrdm->prcm_offs,
|
||||
pwrstst_reg_offs, OMAP_POWERSTATEST_MASK);
|
||||
if (arch_pwrdm && arch_pwrdm->pwrdm_read_pwrst)
|
||||
ret = arch_pwrdm->pwrdm_read_pwrst(pwrdm);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -499,11 +508,15 @@ int pwrdm_read_pwrst(struct powerdomain *pwrdm)
|
||||
*/
|
||||
int pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
|
||||
{
|
||||
int ret = -EINVAL;
|
||||
|
||||
if (!pwrdm)
|
||||
return -EINVAL;
|
||||
|
||||
return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP3430_PM_PREPWSTST,
|
||||
OMAP3430_LASTPOWERSTATEENTERED_MASK);
|
||||
if (arch_pwrdm && arch_pwrdm->pwrdm_read_prev_pwrst)
|
||||
ret = arch_pwrdm->pwrdm_read_prev_pwrst(pwrdm);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
|
62
arch/arm/mach-omap2/powerdomain2xxx_3xxx.c
Normal file
62
arch/arm/mach-omap2/powerdomain2xxx_3xxx.c
Normal file
@ -0,0 +1,62 @@
|
||||
/*
|
||||
* 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,
|
||||
};
|
55
arch/arm/mach-omap2/powerdomain44xx.c
Normal file
55
arch/arm/mach-omap2/powerdomain44xx.c
Normal file
@ -0,0 +1,55 @@
|
||||
/*
|
||||
* 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,
|
||||
};
|
22
arch/arm/mach-omap2/powerdomains.h
Normal file
22
arch/arm/mach-omap2/powerdomains.h
Normal file
@ -0,0 +1,22 @@
|
||||
/*
|
||||
* 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 @@
|
||||
#include "powerdomains24xx.h"
|
||||
#include "powerdomains34xx.h"
|
||||
#include "powerdomains44xx.h"
|
||||
#include "powerdomains.h"
|
||||
|
||||
/* OMAP2/3-common powerdomains */
|
||||
|
||||
@ -149,5 +150,10 @@ static struct powerdomain *powerdomains_omap[] __initdata = {
|
||||
|
||||
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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user