Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
2bb6375f
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 4 年多
通知
15
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
2bb6375f
编写于
11月 14, 2016
作者:
T
Tony Lindgren
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'omap-for-v4.10/cpuidle-v2' into omap-for-v4.10/soc
上级
6cd9699c
7abdb0e2
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
141 addition
and
23 deletion
+141
-23
arch/arm/mach-omap2/Makefile
arch/arm/mach-omap2/Makefile
+1
-1
arch/arm/mach-omap2/common.h
arch/arm/mach-omap2/common.h
+29
-9
arch/arm/mach-omap2/cpuidle44xx.c
arch/arm/mach-omap2/cpuidle44xx.c
+79
-1
arch/arm/mach-omap2/io.c
arch/arm/mach-omap2/io.c
+2
-1
arch/arm/mach-omap2/omap-mpuss-lowpower.c
arch/arm/mach-omap2/omap-mpuss-lowpower.c
+27
-10
arch/arm/mach-omap2/omap4-sar-layout.h
arch/arm/mach-omap2/omap4-sar-layout.h
+2
-0
arch/arm/mach-omap2/pm44xx.c
arch/arm/mach-omap2/pm44xx.c
+1
-1
未找到文件。
arch/arm/mach-omap2/Makefile
浏览文件 @
2bb6375f
...
...
@@ -80,7 +80,7 @@ endif
# Power Management
omap-4-5-pm-common
=
omap-mpuss-lowpower.o
obj-$(CONFIG_ARCH_OMAP4)
+=
$
(
omap-4-5-pm-common
)
obj-$(CONFIG_
ARCH_OMAP5)
+=
$
(
omap-4-5-pm-common
)
obj-$(CONFIG_
SOC_OMAP5)
+=
$
(
omap-4-5-pm-common
)
obj-$(CONFIG_OMAP_PM_NOOP)
+=
omap-pm-noop.o
ifeq
($(CONFIG_PM),y)
...
...
arch/arm/mach-omap2/common.h
浏览文件 @
2bb6375f
...
...
@@ -262,8 +262,6 @@ extern void __iomem *omap4_get_sar_ram_base(void);
extern
void
omap4_mpuss_early_init
(
void
);
extern
void
omap_do_wfi
(
void
);
extern
void
omap4_secondary_startup
(
void
);
extern
void
omap4460_secondary_startup
(
void
);
#ifdef CONFIG_SMP
/* Needed for secondary core boot */
...
...
@@ -275,16 +273,11 @@ extern void omap4_cpu_die(unsigned int cpu);
extern
int
omap4_cpu_kill
(
unsigned
int
cpu
);
extern
const
struct
smp_operations
omap4_smp_ops
;
extern
void
omap5_secondary_startup
(
void
);
extern
void
omap5_secondary_hyp_startup
(
void
);
#endif
#if defined(CONFIG_SMP) && defined(CONFIG_PM)
extern
int
omap4_mpuss_init
(
void
);
extern
int
omap4_enter_lowpower
(
unsigned
int
cpu
,
unsigned
int
power_state
);
extern
int
omap4_finish_suspend
(
unsigned
long
cpu_state
);
extern
void
omap4_cpu_resume
(
void
);
extern
int
omap4_hotplug_cpu
(
unsigned
int
cpu
,
unsigned
int
power_state
);
#else
static
inline
int
omap4_enter_lowpower
(
unsigned
int
cpu
,
...
...
@@ -305,14 +298,41 @@ static inline int omap4_mpuss_init(void)
return
0
;
}
#endif
#ifdef CONFIG_ARCH_OMAP4
void
omap4_secondary_startup
(
void
);
void
omap4460_secondary_startup
(
void
);
int
omap4_finish_suspend
(
unsigned
long
cpu_state
);
void
omap4_cpu_resume
(
void
);
#else
static
inline
void
omap4_secondary_startup
(
void
)
{
}
static
inline
void
omap4460_secondary_startup
(
void
)
{
}
static
inline
int
omap4_finish_suspend
(
unsigned
long
cpu_state
)
{
return
0
;
}
static
inline
void
omap4_cpu_resume
(
void
)
{}
{
}
#endif
#if defined(CONFIG_SOC_OMAP5) || defined(CONFIG_SOC_DRA7XX)
void
omap5_secondary_startup
(
void
);
void
omap5_secondary_hyp_startup
(
void
);
#else
static
inline
void
omap5_secondary_startup
(
void
)
{
}
static
inline
void
omap5_secondary_hyp_startup
(
void
)
{
}
#endif
void
pdata_quirks_init
(
const
struct
of_device_id
*
);
...
...
arch/arm/mach-omap2/cpuidle44xx.c
浏览文件 @
2bb6375f
...
...
@@ -21,6 +21,7 @@
#include "common.h"
#include "pm.h"
#include "prm.h"
#include "soc.h"
#include "clockdomain.h"
#define MAX_CPUS 2
...
...
@@ -30,6 +31,7 @@ struct idle_statedata {
u32
cpu_state
;
u32
mpu_logic_state
;
u32
mpu_state
;
u32
mpu_state_vote
;
};
static
struct
idle_statedata
omap4_idle_data
[]
=
{
...
...
@@ -50,12 +52,26 @@ static struct idle_statedata omap4_idle_data[] = {
},
};
static
struct
idle_statedata
omap5_idle_data
[]
=
{
{
.
cpu_state
=
PWRDM_POWER_ON
,
.
mpu_state
=
PWRDM_POWER_ON
,
.
mpu_logic_state
=
PWRDM_POWER_ON
,
},
{
.
cpu_state
=
PWRDM_POWER_RET
,
.
mpu_state
=
PWRDM_POWER_RET
,
.
mpu_logic_state
=
PWRDM_POWER_RET
,
},
};
static
struct
powerdomain
*
mpu_pd
,
*
cpu_pd
[
MAX_CPUS
];
static
struct
clockdomain
*
cpu_clkdm
[
MAX_CPUS
];
static
atomic_t
abort_barrier
;
static
bool
cpu_done
[
MAX_CPUS
];
static
struct
idle_statedata
*
state_ptr
=
&
omap4_idle_data
[
0
];
static
DEFINE_RAW_SPINLOCK
(
mpu_lock
);
/* Private functions */
...
...
@@ -77,6 +93,32 @@ static int omap_enter_idle_simple(struct cpuidle_device *dev,
return
index
;
}
static
int
omap_enter_idle_smp
(
struct
cpuidle_device
*
dev
,
struct
cpuidle_driver
*
drv
,
int
index
)
{
struct
idle_statedata
*
cx
=
state_ptr
+
index
;
unsigned
long
flag
;
raw_spin_lock_irqsave
(
&
mpu_lock
,
flag
);
cx
->
mpu_state_vote
++
;
if
(
cx
->
mpu_state_vote
==
num_online_cpus
())
{
pwrdm_set_logic_retst
(
mpu_pd
,
cx
->
mpu_logic_state
);
omap_set_pwrdm_state
(
mpu_pd
,
cx
->
mpu_state
);
}
raw_spin_unlock_irqrestore
(
&
mpu_lock
,
flag
);
omap4_enter_lowpower
(
dev
->
cpu
,
cx
->
cpu_state
);
raw_spin_lock_irqsave
(
&
mpu_lock
,
flag
);
if
(
cx
->
mpu_state_vote
==
num_online_cpus
())
omap_set_pwrdm_state
(
mpu_pd
,
PWRDM_POWER_ON
);
cx
->
mpu_state_vote
--
;
raw_spin_unlock_irqrestore
(
&
mpu_lock
,
flag
);
return
index
;
}
static
int
omap_enter_idle_coupled
(
struct
cpuidle_device
*
dev
,
struct
cpuidle_driver
*
drv
,
int
index
)
...
...
@@ -220,6 +262,32 @@ static struct cpuidle_driver omap4_idle_driver = {
.
safe_state_index
=
0
,
};
static
struct
cpuidle_driver
omap5_idle_driver
=
{
.
name
=
"omap5_idle"
,
.
owner
=
THIS_MODULE
,
.
states
=
{
{
/* C1 - CPU0 ON + CPU1 ON + MPU ON */
.
exit_latency
=
2
+
2
,
.
target_residency
=
5
,
.
enter
=
omap_enter_idle_simple
,
.
name
=
"C1"
,
.
desc
=
"CPUx WFI, MPUSS ON"
},
{
/* C2 - CPU0 RET + CPU1 RET + MPU CSWR */
.
exit_latency
=
48
+
60
,
.
target_residency
=
100
,
.
flags
=
CPUIDLE_FLAG_TIMER_STOP
,
.
enter
=
omap_enter_idle_smp
,
.
name
=
"C2"
,
.
desc
=
"CPUx CSWR, MPUSS CSWR"
,
},
},
.
state_count
=
ARRAY_SIZE
(
omap5_idle_data
),
.
safe_state_index
=
0
,
};
/* Public functions */
/**
...
...
@@ -230,6 +298,16 @@ static struct cpuidle_driver omap4_idle_driver = {
*/
int
__init
omap4_idle_init
(
void
)
{
struct
cpuidle_driver
*
idle_driver
;
if
(
soc_is_omap54xx
())
{
state_ptr
=
&
omap5_idle_data
[
0
];
idle_driver
=
&
omap5_idle_driver
;
}
else
{
state_ptr
=
&
omap4_idle_data
[
0
];
idle_driver
=
&
omap4_idle_driver
;
}
mpu_pd
=
pwrdm_lookup
(
"mpu_pwrdm"
);
cpu_pd
[
0
]
=
pwrdm_lookup
(
"cpu0_pwrdm"
);
cpu_pd
[
1
]
=
pwrdm_lookup
(
"cpu1_pwrdm"
);
...
...
@@ -244,5 +322,5 @@ int __init omap4_idle_init(void)
/* Configure the broadcast timer on each cpu */
on_each_cpu
(
omap_setup_broadcast_timer
,
NULL
,
1
);
return
cpuidle_register
(
&
omap4_
idle_driver
,
cpu_online_mask
);
return
cpuidle_register
(
idle_driver
,
cpu_online_mask
);
}
arch/arm/mach-omap2/io.c
浏览文件 @
2bb6375f
...
...
@@ -717,10 +717,11 @@ void __init omap5_init_early(void)
OMAP2_L4_IO_ADDRESS
(
OMAP54XX_SCM_BASE
));
omap2_set_globals_prcm_mpu
(
OMAP2_L4_IO_ADDRESS
(
OMAP54XX_PRCM_MPU_BASE
));
omap2_control_base_init
();
omap4_pm_init_early
();
omap2_prcm_base_init
();
omap5xxx_check_revision
();
omap4_sar_ram_init
();
omap4_mpuss_early_init
();
omap4_pm_init_early
();
omap54xx_voltagedomains_init
();
omap54xx_powerdomains_init
();
omap54xx_clockdomains_init
();
...
...
arch/arm/mach-omap2/omap-mpuss-lowpower.c
浏览文件 @
2bb6375f
...
...
@@ -48,6 +48,7 @@
#include <asm/smp_scu.h>
#include <asm/pgalloc.h>
#include <asm/suspend.h>
#include <asm/virt.h>
#include <asm/hardware/cache-l2x0.h>
#include "soc.h"
...
...
@@ -244,10 +245,9 @@ int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state)
save_state
=
1
;
break
;
case
PWRDM_POWER_RET
:
if
(
IS_PM44XX_ERRATUM
(
PM_OMAP4_CPU_OSWR_DISABLE
))
{
if
(
IS_PM44XX_ERRATUM
(
PM_OMAP4_CPU_OSWR_DISABLE
))
save_state
=
0
;
break
;
}
break
;
default:
/*
* CPUx CSWR is invalid hardware state. Also CPUx OSWR
...
...
@@ -371,8 +371,12 @@ int __init omap4_mpuss_init(void)
pm_info
=
&
per_cpu
(
omap4_pm_info
,
0x0
);
if
(
sar_base
)
{
pm_info
->
scu_sar_addr
=
sar_base
+
SCU_OFFSET0
;
pm_info
->
wkup_sar_addr
=
sar_base
+
CPU0_WAKEUP_NS_PA_ADDR_OFFSET
;
if
(
cpu_is_omap44xx
())
pm_info
->
wkup_sar_addr
=
sar_base
+
CPU0_WAKEUP_NS_PA_ADDR_OFFSET
;
else
pm_info
->
wkup_sar_addr
=
sar_base
+
OMAP5_CPU0_WAKEUP_NS_PA_ADDR_OFFSET
;
pm_info
->
l2x0_sar_addr
=
sar_base
+
L2X0_SAVE_OFFSET0
;
}
pm_info
->
pwrdm
=
pwrdm_lookup
(
"cpu0_pwrdm"
);
...
...
@@ -391,8 +395,12 @@ int __init omap4_mpuss_init(void)
pm_info
=
&
per_cpu
(
omap4_pm_info
,
0x1
);
if
(
sar_base
)
{
pm_info
->
scu_sar_addr
=
sar_base
+
SCU_OFFSET1
;
pm_info
->
wkup_sar_addr
=
sar_base
+
CPU1_WAKEUP_NS_PA_ADDR_OFFSET
;
if
(
cpu_is_omap44xx
())
pm_info
->
wkup_sar_addr
=
sar_base
+
CPU1_WAKEUP_NS_PA_ADDR_OFFSET
;
else
pm_info
->
wkup_sar_addr
=
sar_base
+
OMAP5_CPU1_WAKEUP_NS_PA_ADDR_OFFSET
;
pm_info
->
l2x0_sar_addr
=
sar_base
+
L2X0_SAVE_OFFSET1
;
}
...
...
@@ -453,15 +461,24 @@ void __init omap4_mpuss_early_init(void)
{
unsigned
long
startup_pa
;
if
(
!
cpu_is_omap44xx
(
))
if
(
!
(
cpu_is_omap44xx
()
||
soc_is_omap54xx
()
))
return
;
sar_base
=
omap4_get_sar_ram_base
();
if
(
cpu_is_omap443x
())
startup_pa
=
virt_to_phys
(
omap4_secondary_startup
);
else
else
if
(
cpu_is_omap446x
())
startup_pa
=
virt_to_phys
(
omap4460_secondary_startup
);
else
if
((
__boot_cpu_mode
&
MODE_MASK
)
==
HYP_MODE
)
startup_pa
=
virt_to_phys
(
omap5_secondary_hyp_startup
);
else
startup_pa
=
virt_to_phys
(
omap5_secondary_startup
);
writel_relaxed
(
startup_pa
,
sar_base
+
CPU1_WAKEUP_NS_PA_ADDR_OFFSET
);
if
(
cpu_is_omap44xx
())
writel_relaxed
(
startup_pa
,
sar_base
+
CPU1_WAKEUP_NS_PA_ADDR_OFFSET
);
else
writel_relaxed
(
startup_pa
,
sar_base
+
OMAP5_CPU1_WAKEUP_NS_PA_ADDR_OFFSET
);
}
arch/arm/mach-omap2/omap4-sar-layout.h
浏览文件 @
2bb6375f
...
...
@@ -31,6 +31,8 @@
/* CPUx Wakeup Non-Secure Physical Address offsets in SAR_BANK3 */
#define CPU0_WAKEUP_NS_PA_ADDR_OFFSET 0xa04
#define CPU1_WAKEUP_NS_PA_ADDR_OFFSET 0xa08
#define OMAP5_CPU0_WAKEUP_NS_PA_ADDR_OFFSET 0xe00
#define OMAP5_CPU1_WAKEUP_NS_PA_ADDR_OFFSET 0xe04
#define SAR_BACKUP_STATUS_OFFSET (SAR_BANK3_OFFSET + 0x500)
#define SAR_SECURE_RAM_SIZE_OFFSET (SAR_BANK3_OFFSET + 0x504)
...
...
arch/arm/mach-omap2/pm44xx.c
浏览文件 @
2bb6375f
...
...
@@ -287,7 +287,7 @@ int __init omap4_pm_init(void)
/* Overwrite the default cpu_do_idle() */
arm_pm_idle
=
omap_default_idle
;
if
(
cpu_is_omap44xx
())
if
(
cpu_is_omap44xx
()
||
soc_is_omap54xx
()
)
omap4_idle_init
();
err2:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录