Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
fe9ba5bc
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看板
提交
fe9ba5bc
编写于
11月 02, 2017
作者:
Z
Zhang Rui
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'imx-nvmem' into thermal-soc
上级
b2fd708f
531fcdeb
变更
3
显示空白变更内容
内联
并排
Showing
3 changed file
with
82 addition
and
30 deletion
+82
-30
Documentation/devicetree/bindings/thermal/imx-thermal.txt
Documentation/devicetree/bindings/thermal/imx-thermal.txt
+7
-0
drivers/thermal/Kconfig
drivers/thermal/Kconfig
+1
-0
drivers/thermal/imx_thermal.c
drivers/thermal/imx_thermal.c
+74
-30
未找到文件。
Documentation/devicetree/bindings/thermal/imx-thermal.txt
浏览文件 @
fe9ba5bc
...
@@ -7,10 +7,17 @@ Required properties:
...
@@ -7,10 +7,17 @@ Required properties:
is higher than panic threshold, system will auto reboot by SRC module.
is higher than panic threshold, system will auto reboot by SRC module.
- fsl,tempmon : phandle pointer to system controller that contains TEMPMON
- fsl,tempmon : phandle pointer to system controller that contains TEMPMON
control registers, e.g. ANATOP on imx6q.
control registers, e.g. ANATOP on imx6q.
- nvmem-cells: A phandle to the calibration cells provided by ocotp.
- nvmem-cell-names: Should be "calib", "temp_grade".
Deprecated properties:
- fsl,tempmon-data : phandle pointer to fuse controller that contains TEMPMON
- fsl,tempmon-data : phandle pointer to fuse controller that contains TEMPMON
calibration data, e.g. OCOTP on imx6q. The details about calibration data
calibration data, e.g. OCOTP on imx6q. The details about calibration data
can be found in SoC Reference Manual.
can be found in SoC Reference Manual.
Direct access to OCOTP via fsl,tempmon-data is incorrect on some newer chips
because it does not handle OCOTP clock requirements.
Optional properties:
Optional properties:
- clocks : thermal sensor's clock source.
- clocks : thermal sensor's clock source.
...
...
drivers/thermal/Kconfig
浏览文件 @
fe9ba5bc
...
@@ -206,6 +206,7 @@ config HISI_THERMAL
...
@@ -206,6 +206,7 @@ config HISI_THERMAL
config IMX_THERMAL
config IMX_THERMAL
tristate "Temperature sensor driver for Freescale i.MX SoCs"
tristate "Temperature sensor driver for Freescale i.MX SoCs"
depends on (ARCH_MXC && CPU_THERMAL) || COMPILE_TEST
depends on (ARCH_MXC && CPU_THERMAL) || COMPILE_TEST
depends on NVMEM || !NVMEM
depends on MFD_SYSCON
depends on MFD_SYSCON
depends on OF
depends on OF
help
help
...
...
drivers/thermal/imx_thermal.c
浏览文件 @
fe9ba5bc
...
@@ -25,6 +25,7 @@
...
@@ -25,6 +25,7 @@
#include <linux/slab.h>
#include <linux/slab.h>
#include <linux/thermal.h>
#include <linux/thermal.h>
#include <linux/types.h>
#include <linux/types.h>
#include <linux/nvmem-consumer.h>
#define REG_SET 0x4
#define REG_SET 0x4
#define REG_CLR 0x8
#define REG_CLR 0x8
...
@@ -94,7 +95,7 @@ struct imx_thermal_data {
...
@@ -94,7 +95,7 @@ struct imx_thermal_data {
struct
thermal_cooling_device
*
cdev
;
struct
thermal_cooling_device
*
cdev
;
enum
thermal_device_mode
mode
;
enum
thermal_device_mode
mode
;
struct
regmap
*
tempmon
;
struct
regmap
*
tempmon
;
u32
c1
,
c2
;
/* See formula in imx_
get_sensor_data
() */
u32
c1
,
c2
;
/* See formula in imx_
init_calib
() */
int
temp_passive
;
int
temp_passive
;
int
temp_critical
;
int
temp_critical
;
int
temp_max
;
int
temp_max
;
...
@@ -177,7 +178,7 @@ static int imx_get_temp(struct thermal_zone_device *tz, int *temp)
...
@@ -177,7 +178,7 @@ static int imx_get_temp(struct thermal_zone_device *tz, int *temp)
n_meas
=
(
val
&
TEMPSENSE0_TEMP_CNT_MASK
)
>>
TEMPSENSE0_TEMP_CNT_SHIFT
;
n_meas
=
(
val
&
TEMPSENSE0_TEMP_CNT_MASK
)
>>
TEMPSENSE0_TEMP_CNT_SHIFT
;
/* See imx_
get_sensor_data
() for formula derivation */
/* See imx_
init_calib
() for formula derivation */
*
temp
=
data
->
c2
-
n_meas
*
data
->
c1
;
*
temp
=
data
->
c2
-
n_meas
*
data
->
c1
;
/* Update alarm value to next higher trip point for TEMPMON_IMX6Q */
/* Update alarm value to next higher trip point for TEMPMON_IMX6Q */
...
@@ -346,29 +347,12 @@ static struct thermal_zone_device_ops imx_tz_ops = {
...
@@ -346,29 +347,12 @@ static struct thermal_zone_device_ops imx_tz_ops = {
.
set_trip_temp
=
imx_set_trip_temp
,
.
set_trip_temp
=
imx_set_trip_temp
,
};
};
static
int
imx_
get_sensor_data
(
struct
platform_device
*
pdev
)
static
int
imx_
init_calib
(
struct
platform_device
*
pdev
,
u32
val
)
{
{
struct
imx_thermal_data
*
data
=
platform_get_drvdata
(
pdev
);
struct
imx_thermal_data
*
data
=
platform_get_drvdata
(
pdev
);
struct
regmap
*
map
;
int
t1
,
n1
;
int
t1
,
n1
;
int
ret
;
u32
val
;
u64
temp64
;
u64
temp64
;
map
=
syscon_regmap_lookup_by_phandle
(
pdev
->
dev
.
of_node
,
"fsl,tempmon-data"
);
if
(
IS_ERR
(
map
))
{
ret
=
PTR_ERR
(
map
);
dev_err
(
&
pdev
->
dev
,
"failed to get sensor regmap: %d
\n
"
,
ret
);
return
ret
;
}
ret
=
regmap_read
(
map
,
OCOTP_ANA1
,
&
val
);
if
(
ret
)
{
dev_err
(
&
pdev
->
dev
,
"failed to read sensor data: %d
\n
"
,
ret
);
return
ret
;
}
if
(
val
==
0
||
val
==
~
0
)
{
if
(
val
==
0
||
val
==
~
0
)
{
dev_err
(
&
pdev
->
dev
,
"invalid sensor calibration data
\n
"
);
dev_err
(
&
pdev
->
dev
,
"invalid sensor calibration data
\n
"
);
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -405,12 +389,12 @@ static int imx_get_sensor_data(struct platform_device *pdev)
...
@@ -405,12 +389,12 @@ static int imx_get_sensor_data(struct platform_device *pdev)
data
->
c1
=
temp64
;
data
->
c1
=
temp64
;
data
->
c2
=
n1
*
data
->
c1
+
1000
*
t1
;
data
->
c2
=
n1
*
data
->
c1
+
1000
*
t1
;
/* use OTP for thermal grade */
return
0
;
ret
=
regmap_read
(
map
,
OCOTP_MEM0
,
&
val
);
}
if
(
ret
)
{
dev_err
(
&
pdev
->
dev
,
"failed to read temp grade: %d
\n
"
,
ret
);
static
void
imx_init_temp_grade
(
struct
platform_device
*
pdev
,
u32
val
)
return
ret
;
{
}
struct
imx_thermal_data
*
data
=
platform_get_drvdata
(
pdev
);
/* The maximum die temp is specified by the Temperature Grade */
/* The maximum die temp is specified by the Temperature Grade */
switch
((
val
>>
6
)
&
0x3
)
{
switch
((
val
>>
6
)
&
0x3
)
{
...
@@ -438,6 +422,55 @@ static int imx_get_sensor_data(struct platform_device *pdev)
...
@@ -438,6 +422,55 @@ static int imx_get_sensor_data(struct platform_device *pdev)
*/
*/
data
->
temp_critical
=
data
->
temp_max
-
(
1000
*
5
);
data
->
temp_critical
=
data
->
temp_max
-
(
1000
*
5
);
data
->
temp_passive
=
data
->
temp_max
-
(
1000
*
10
);
data
->
temp_passive
=
data
->
temp_max
-
(
1000
*
10
);
}
static
int
imx_init_from_tempmon_data
(
struct
platform_device
*
pdev
)
{
struct
regmap
*
map
;
int
ret
;
u32
val
;
map
=
syscon_regmap_lookup_by_phandle
(
pdev
->
dev
.
of_node
,
"fsl,tempmon-data"
);
if
(
IS_ERR
(
map
))
{
ret
=
PTR_ERR
(
map
);
dev_err
(
&
pdev
->
dev
,
"failed to get sensor regmap: %d
\n
"
,
ret
);
return
ret
;
}
ret
=
regmap_read
(
map
,
OCOTP_ANA1
,
&
val
);
if
(
ret
)
{
dev_err
(
&
pdev
->
dev
,
"failed to read sensor data: %d
\n
"
,
ret
);
return
ret
;
}
ret
=
imx_init_calib
(
pdev
,
val
);
if
(
ret
)
return
ret
;
ret
=
regmap_read
(
map
,
OCOTP_MEM0
,
&
val
);
if
(
ret
)
{
dev_err
(
&
pdev
->
dev
,
"failed to read sensor data: %d
\n
"
,
ret
);
return
ret
;
}
imx_init_temp_grade
(
pdev
,
val
);
return
0
;
}
static
int
imx_init_from_nvmem_cells
(
struct
platform_device
*
pdev
)
{
int
ret
;
u32
val
;
ret
=
nvmem_cell_read_u32
(
&
pdev
->
dev
,
"calib"
,
&
val
);
if
(
ret
)
return
ret
;
imx_init_calib
(
pdev
,
val
);
ret
=
nvmem_cell_read_u32
(
&
pdev
->
dev
,
"temp_grade"
,
&
val
);
if
(
ret
)
return
ret
;
imx_init_temp_grade
(
pdev
,
val
);
return
0
;
return
0
;
}
}
...
@@ -514,11 +547,22 @@ static int imx_thermal_probe(struct platform_device *pdev)
...
@@ -514,11 +547,22 @@ static int imx_thermal_probe(struct platform_device *pdev)
platform_set_drvdata
(
pdev
,
data
);
platform_set_drvdata
(
pdev
,
data
);
ret
=
imx_get_sensor_data
(
pdev
);
if
(
of_find_property
(
pdev
->
dev
.
of_node
,
"nvmem-cells"
,
NULL
))
{
ret
=
imx_init_from_nvmem_cells
(
pdev
);
if
(
ret
==
-
EPROBE_DEFER
)
return
ret
;
if
(
ret
)
{
if
(
ret
)
{
dev_err
(
&
pdev
->
dev
,
"failed to get sensor data
\n
"
);
dev_err
(
&
pdev
->
dev
,
"failed to init from nvmem: %d
\n
"
,
ret
);
return
ret
;
return
ret
;
}
}
}
else
{
ret
=
imx_init_from_tempmon_data
(
pdev
);
if
(
ret
)
{
dev_err
(
&
pdev
->
dev
,
"failed to init from from fsl,tempmon-data
\n
"
);
return
ret
;
}
}
/* Make sure sensor is in known good state for measurements */
/* Make sure sensor is in known good state for measurements */
regmap_write
(
map
,
TEMPSENSE0
+
REG_CLR
,
TEMPSENSE0_POWER_DOWN
);
regmap_write
(
map
,
TEMPSENSE0
+
REG_CLR
,
TEMPSENSE0_POWER_DOWN
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录