Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
92711269
cloud-kernel
项目概览
openanolis
/
cloud-kernel
大约 1 年 前同步成功
通知
158
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
92711269
编写于
2月 24, 2012
作者:
G
Guenter Roeck
提交者:
Guenter Roeck
3月 18, 2012
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
hwmon: (adm1275) Add support for ADM1075
Signed-off-by:
N
Guenter Roeck
<
linux@roeck-us.net
>
上级
590defe5
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
109 addition
and
13 deletion
+109
-13
Documentation/hwmon/adm1275
Documentation/hwmon/adm1275
+23
-7
drivers/hwmon/pmbus/Kconfig
drivers/hwmon/pmbus/Kconfig
+2
-2
drivers/hwmon/pmbus/adm1275.c
drivers/hwmon/pmbus/adm1275.c
+84
-4
未找到文件。
Documentation/hwmon/adm1275
浏览文件 @
92711269
...
...
@@ -2,6 +2,10 @@ Kernel driver adm1275
=====================
Supported chips:
* Analog Devices ADM1075
Prefix: 'adm1075'
Addresses scanned: -
Datasheet: www.analog.com/static/imported-files/data_sheets/ADM1075.pdf
* Analog Devices ADM1275
Prefix: 'adm1275'
Addresses scanned: -
...
...
@@ -17,13 +21,13 @@ Author: Guenter Roeck <guenter.roeck@ericsson.com>
Description
-----------
This driver supports hardware montoring for Analog Devices ADM1
275 and ADM1276
Hot-Swap Controller and Digital Power Monitor.
This driver supports hardware montoring for Analog Devices ADM1
075, ADM1275,
and ADM1276
Hot-Swap Controller and Digital Power Monitor.
ADM1
275 and ADM1276 are hot-swap controllers that allow a circuit board to be
removed from or inserted into a live backplane. They also feature current and
voltage readback via an integrated 12-bit analog-to-digital converter (ADC),
accessed using a PMBus interface.
ADM1
075, ADM1275, and ADM1276 are hot-swap controllers that allow a circuit
board to be removed from or inserted into a live backplane. They also feature
current and voltage readback via an integrated 12-bit analog-to-digital
converter (ADC),
accessed using a PMBus interface.
The driver is a client driver to the core PMBus driver. Please see
Documentation/hwmon/pmbus for details on PMBus client drivers.
...
...
@@ -36,6 +40,10 @@ This driver does not auto-detect devices. You will have to instantiate the
devices explicitly. Please see Documentation/i2c/instantiating-devices for
details.
The ADM1075, unlike many other PMBus devices, does not support internal voltage
or current scaling. Reported voltages, currents, and power are raw measurements,
and will typically have to be scaled.
Platform data support
---------------------
...
...
@@ -51,7 +59,8 @@ The following attributes are supported. Limits are read-write, history reset
attributes are write-only, all other attributes are read-only.
in1_label "vin1" or "vout1" depending on chip variant and
configuration.
configuration. On ADM1075, vout1 reports the voltage on
the VAUX pin.
in1_input Measured voltage.
in1_min Minumum Voltage.
in1_max Maximum voltage.
...
...
@@ -74,3 +83,10 @@ curr1_crit Critical maximum current. Depending on the chip
curr1_crit_alarm Critical current high alarm.
curr1_highest Historical maximum current.
curr1_reset_history Write any value to reset history.
power1_label "pin1"
power1_input Input power.
power1_reset_history Write any value to reset history.
Power attributes are supported on ADM1075 and ADM1276
only.
drivers/hwmon/pmbus/Kconfig
浏览文件 @
92711269
...
...
@@ -31,8 +31,8 @@ config SENSORS_ADM1275
default n
help
If you say yes here you get hardware monitoring support for Analog
Devices ADM1
275 and ADM1276 Hot-Swap Controller and Digital Power
Monitor
.
Devices ADM1
075, ADM1275, and ADM1276 Hot-Swap Controller and Digital
Power Monitors
.
This driver can also be built as a module. If so, the module will
be called adm1275.
...
...
drivers/hwmon/pmbus/adm1275.c
浏览文件 @
92711269
...
...
@@ -23,7 +23,7 @@
#include <linux/i2c.h>
#include "pmbus.h"
enum
chips
{
adm1275
,
adm1276
};
enum
chips
{
adm1
075
,
adm1
275
,
adm1276
};
#define ADM1275_PEAK_IOUT 0xd0
#define ADM1275_PEAK_VIN 0xd1
...
...
@@ -32,6 +32,9 @@ enum chips { adm1275, adm1276 };
#define ADM1275_VIN_VOUT_SELECT (1 << 6)
#define ADM1275_VRANGE (1 << 5)
#define ADM1075_IRANGE_50 (1 << 4)
#define ADM1075_IRANGE_25 (1 << 3)
#define ADM1075_IRANGE_MASK ((1 << 3) | (1 << 4))
#define ADM1275_IOUT_WARN2_LIMIT 0xd7
#define ADM1275_DEVICE_CONFIG 0xd8
...
...
@@ -42,6 +45,14 @@ enum chips { adm1275, adm1276 };
#define ADM1275_MFR_STATUS_IOUT_WARN2 (1 << 0)
#define ADM1075_READ_VAUX 0xdd
#define ADM1075_VAUX_OV_WARN_LIMIT 0xde
#define ADM1075_VAUX_UV_WARN_LIMIT 0xdf
#define ADM1075_VAUX_STATUS 0xf6
#define ADM1075_VAUX_OV_WARN (1<<7)
#define ADM1075_VAUX_UV_WARN (1<<6)
struct
adm1275_data
{
int
id
;
bool
have_oc_fault
;
...
...
@@ -74,6 +85,29 @@ static int adm1275_read_word_data(struct i2c_client *client, int page, int reg)
}
ret
=
pmbus_read_word_data
(
client
,
0
,
ADM1275_IOUT_WARN2_LIMIT
);
break
;
case
PMBUS_VOUT_OV_WARN_LIMIT
:
if
(
data
->
id
!=
adm1075
)
{
ret
=
-
ENODATA
;
break
;
}
ret
=
pmbus_read_word_data
(
client
,
0
,
ADM1075_VAUX_OV_WARN_LIMIT
);
break
;
case
PMBUS_VOUT_UV_WARN_LIMIT
:
if
(
data
->
id
!=
adm1075
)
{
ret
=
-
ENODATA
;
break
;
}
ret
=
pmbus_read_word_data
(
client
,
0
,
ADM1075_VAUX_UV_WARN_LIMIT
);
break
;
case
PMBUS_READ_VOUT
:
if
(
data
->
id
!=
adm1075
)
{
ret
=
-
ENODATA
;
break
;
}
ret
=
pmbus_read_word_data
(
client
,
0
,
ADM1075_READ_VAUX
);
break
;
case
PMBUS_VIRT_READ_IOUT_MAX
:
ret
=
pmbus_read_word_data
(
client
,
0
,
ADM1275_PEAK_IOUT
);
break
;
...
...
@@ -84,7 +118,7 @@ static int adm1275_read_word_data(struct i2c_client *client, int page, int reg)
ret
=
pmbus_read_word_data
(
client
,
0
,
ADM1275_PEAK_VIN
);
break
;
case
PMBUS_VIRT_READ_PIN_MAX
:
if
(
data
->
id
!=
adm1276
)
{
if
(
data
->
id
==
adm1275
)
{
ret
=
-
ENXIO
;
break
;
}
...
...
@@ -95,7 +129,7 @@ static int adm1275_read_word_data(struct i2c_client *client, int page, int reg)
case
PMBUS_VIRT_RESET_VIN_HISTORY
:
break
;
case
PMBUS_VIRT_RESET_PIN_HISTORY
:
if
(
data
->
id
!=
adm1276
)
if
(
data
->
id
==
adm1275
)
ret
=
-
ENXIO
;
break
;
default:
...
...
@@ -163,6 +197,19 @@ static int adm1275_read_byte_data(struct i2c_client *client, int page, int reg)
PB_IOUT_OC_FAULT
:
PB_IOUT_UC_FAULT
;
}
break
;
case
PMBUS_STATUS_VOUT
:
if
(
data
->
id
!=
adm1075
)
{
ret
=
-
ENODATA
;
break
;
}
ret
=
0
;
mfr_status
=
pmbus_read_byte_data
(
client
,
0
,
ADM1075_VAUX_STATUS
);
if
(
mfr_status
&
ADM1075_VAUX_OV_WARN
)
ret
|=
PB_VOLTAGE_OV_WARNING
;
if
(
mfr_status
&
ADM1075_VAUX_UV_WARN
)
ret
|=
PB_VOLTAGE_UV_WARNING
;
break
;
default:
ret
=
-
ENODATA
;
break
;
...
...
@@ -171,6 +218,7 @@ static int adm1275_read_byte_data(struct i2c_client *client, int page, int reg)
}
static
const
struct
i2c_device_id
adm1275_id
[]
=
{
{
"adm1075"
,
adm1075
},
{
"adm1275"
,
adm1275
},
{
"adm1276"
,
adm1276
},
{
}
...
...
@@ -251,7 +299,14 @@ static int adm1275_probe(struct i2c_client *client,
info
->
read_byte_data
=
adm1275_read_byte_data
;
info
->
write_word_data
=
adm1275_write_word_data
;
if
(
config
&
ADM1275_VRANGE
)
{
if
(
data
->
id
==
adm1075
)
{
info
->
m
[
PSC_VOLTAGE_IN
]
=
27169
;
info
->
b
[
PSC_VOLTAGE_IN
]
=
0
;
info
->
R
[
PSC_VOLTAGE_IN
]
=
-
1
;
info
->
m
[
PSC_VOLTAGE_OUT
]
=
27169
;
info
->
b
[
PSC_VOLTAGE_OUT
]
=
0
;
info
->
R
[
PSC_VOLTAGE_OUT
]
=
-
1
;
}
else
if
(
config
&
ADM1275_VRANGE
)
{
info
->
m
[
PSC_VOLTAGE_IN
]
=
19199
;
info
->
b
[
PSC_VOLTAGE_IN
]
=
0
;
info
->
R
[
PSC_VOLTAGE_IN
]
=
-
2
;
...
...
@@ -271,6 +326,31 @@ static int adm1275_probe(struct i2c_client *client,
data
->
have_oc_fault
=
true
;
switch
(
data
->
id
)
{
case
adm1075
:
info
->
format
[
PSC_POWER
]
=
direct
;
info
->
b
[
PSC_POWER
]
=
0
;
info
->
R
[
PSC_POWER
]
=
-
1
;
switch
(
config
&
ADM1075_IRANGE_MASK
)
{
case
ADM1075_IRANGE_25
:
info
->
m
[
PSC_POWER
]
=
8549
;
info
->
m
[
PSC_CURRENT_OUT
]
=
806
;
break
;
case
ADM1075_IRANGE_50
:
info
->
m
[
PSC_POWER
]
=
4279
;
info
->
m
[
PSC_CURRENT_OUT
]
=
404
;
break
;
default:
dev_err
(
&
client
->
dev
,
"Invalid input current range"
);
info
->
m
[
PSC_POWER
]
=
0
;
info
->
m
[
PSC_CURRENT_OUT
]
=
0
;
break
;
}
info
->
func
[
0
]
|=
PMBUS_HAVE_VIN
|
PMBUS_HAVE_PIN
|
PMBUS_HAVE_STATUS_INPUT
;
if
(
config
&
ADM1275_VIN_VOUT_SELECT
)
info
->
func
[
0
]
|=
PMBUS_HAVE_VOUT
|
PMBUS_HAVE_STATUS_VOUT
;
break
;
case
adm1275
:
if
(
config
&
ADM1275_VIN_VOUT_SELECT
)
info
->
func
[
0
]
|=
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录