Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OS
U-Boot.Mirror
提交
a9f793a3
U
U-Boot.Mirror
项目概览
OS
/
U-Boot.Mirror
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
U-Boot.Mirror
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a9f793a3
编写于
5月 22, 2020
作者:
T
Tom Rini
浏览文件
操作
浏览文件
下载
差异文件
Merge tag 'imx8qxp-fixes' of
https://gitlab.denx.de/u-boot/custodians/u-boot-video
- Fix i.MX8QXP boot hang when getting CPU temperature
上级
2fdb5cd6
4e7413a9
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
28 addition
and
26 deletion
+28
-26
drivers/cpu/imx8_cpu.c
drivers/cpu/imx8_cpu.c
+25
-25
drivers/thermal/imx_scu_thermal.c
drivers/thermal/imx_scu_thermal.c
+3
-1
未找到文件。
drivers/cpu/imx8_cpu.c
浏览文件 @
a9f793a3
...
...
@@ -20,6 +20,7 @@ struct cpu_imx_platdata {
const
char
*
name
;
const
char
*
rev
;
const
char
*
type
;
u32
cpu_rsrc
;
u32
cpurev
;
u32
freq_mhz
;
u32
mpidr
;
...
...
@@ -52,16 +53,23 @@ const char *get_imx8_rev(u32 rev)
}
}
const
char
*
get_core_name
(
struct
udevice
*
dev
)
static
void
set_core_data
(
struct
udevice
*
dev
)
{
if
(
!
device_is_compatible
(
dev
,
"arm,cortex-a35"
))
return
"A35"
;
else
if
(
!
device_is_compatible
(
dev
,
"arm,cortex-a53"
))
return
"A53"
;
else
if
(
!
device_is_compatible
(
dev
,
"arm,cortex-a72"
))
return
"A72"
;
else
return
"?"
;
struct
cpu_imx_platdata
*
plat
=
dev_get_platdata
(
dev
);
if
(
device_is_compatible
(
dev
,
"arm,cortex-a35"
))
{
plat
->
cpu_rsrc
=
SC_R_A35
;
plat
->
name
=
"A35"
;
}
else
if
(
device_is_compatible
(
dev
,
"arm,cortex-a53"
))
{
plat
->
cpu_rsrc
=
SC_R_A53
;
plat
->
name
=
"A53"
;
}
else
if
(
device_is_compatible
(
dev
,
"arm,cortex-a72"
))
{
plat
->
cpu_rsrc
=
SC_R_A72
;
plat
->
name
=
"A72"
;
}
else
{
plat
->
cpu_rsrc
=
SC_R_A53
;
plat
->
name
=
"?"
;
}
}
#if IS_ENABLED(CONFIG_IMX_SCU_THERMAL)
...
...
@@ -69,12 +77,12 @@ static int cpu_imx_get_temp(struct cpu_imx_platdata *plat)
{
struct
udevice
*
thermal_dev
;
int
cpu_tmp
,
ret
;
int
idx
=
1
;
/* use "cpu-thermal0" device */
if
(
!
strcmp
(
plat
->
name
,
"A72"
))
ret
=
uclass_get_device
(
UCLASS_THERMAL
,
1
,
&
thermal_dev
);
else
ret
=
uclass_get_device
(
UCLASS_THERMAL
,
0
,
&
thermal_dev
);
if
(
plat
->
cpu_rsrc
==
SC_R_A72
)
idx
=
2
;
/* use "cpu-thermal1" device */
ret
=
uclass_get_device
(
UCLASS_THERMAL
,
idx
,
&
thermal_dev
);
if
(
!
ret
)
{
ret
=
thermal_get_temp
(
thermal_dev
,
&
cpu_tmp
);
if
(
ret
)
...
...
@@ -182,19 +190,11 @@ static const struct udevice_id cpu_imx8_ids[] = {
static
ulong
imx8_get_cpu_rate
(
struct
udevice
*
dev
)
{
struct
cpu_imx_platdata
*
plat
=
dev_get_platdata
(
dev
);
ulong
rate
;
int
ret
,
type
;
if
(
!
device_is_compatible
(
dev
,
"arm,cortex-a35"
))
type
=
SC_R_A35
;
else
if
(
!
device_is_compatible
(
dev
,
"arm,cortex-a53"
))
type
=
SC_R_A53
;
else
if
(
!
device_is_compatible
(
dev
,
"arm,cortex-a72"
))
type
=
SC_R_A72
;
else
return
0
;
int
ret
;
ret
=
sc_pm_get_clock_rate
(
-
1
,
type
,
SC_PM_CLK_CPU
,
ret
=
sc_pm_get_clock_rate
(
-
1
,
plat
->
cpu_rsrc
,
SC_PM_CLK_CPU
,
(
sc_pm_clock_rate_t
*
)
&
rate
);
if
(
ret
)
{
printf
(
"Could not read CPU frequency: %d
\n
"
,
ret
);
...
...
@@ -209,9 +209,9 @@ static int imx8_cpu_probe(struct udevice *dev)
struct
cpu_imx_platdata
*
plat
=
dev_get_platdata
(
dev
);
u32
cpurev
;
set_core_data
(
dev
);
cpurev
=
get_cpu_rev
();
plat
->
cpurev
=
cpurev
;
plat
->
name
=
get_core_name
(
dev
);
plat
->
rev
=
get_imx8_rev
(
cpurev
&
0xFFF
);
plat
->
type
=
get_imx8_type
((
cpurev
&
0xFF000
)
>>
12
);
plat
->
freq_mhz
=
imx8_get_cpu_rate
(
dev
)
/
1000000
;
...
...
drivers/thermal/imx_scu_thermal.c
浏览文件 @
a9f793a3
...
...
@@ -61,13 +61,15 @@ int imx_sc_thermal_get_temp(struct udevice *dev, int *temp)
return
ret
;
while
(
cpu_temp
>=
pdata
->
alert
)
{
printf
(
"CPU Temperature (%dC)
has
beyond alert (%dC), close to critical (%dC)"
,
printf
(
"CPU Temperature (%dC) beyond alert (%dC), close to critical (%dC)"
,
cpu_temp
,
pdata
->
alert
,
pdata
->
critical
);
puts
(
" waiting...
\n
"
);
mdelay
(
pdata
->
polling_delay
);
ret
=
read_temperature
(
dev
,
&
cpu_temp
);
if
(
ret
)
return
ret
;
if
(
cpu_temp
>=
pdata
->
alert
&&
!
pdata
->
alert
)
break
;
}
*
temp
=
cpu_temp
/
1000
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录