Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
aff6e00e
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看板
提交
aff6e00e
编写于
1月 19, 2012
作者:
G
Guenter Roeck
提交者:
Guenter Roeck
3月 18, 2012
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
hwmon: (w83781d) Fix multi-line comments
Signed-off-by:
N
Guenter Roeck
<
linux@roeck-us.net
>
上级
2a52dd66
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
117 addition
and
80 deletion
+117
-80
drivers/hwmon/w83781d.c
drivers/hwmon/w83781d.c
+117
-80
未找到文件。
drivers/hwmon/w83781d.c
浏览文件 @
aff6e00e
/*
/*
w83781d.c - Part of lm_sensors, Linux kernel modules for hardware
*
w83781d.c - Part of lm_sensors, Linux kernel modules for hardware
monitoring
*
monitoring
Copyright (c) 1998 - 2001 Frodo Looijaard <frodol@dds.nl>,
*
Copyright (c) 1998 - 2001 Frodo Looijaard <frodol@dds.nl>,
Philip Edelbrock <phil@netroedge.com>,
*
Philip Edelbrock <phil@netroedge.com>,
and Mark Studebaker <mdsxyz123@yahoo.com>
*
and Mark Studebaker <mdsxyz123@yahoo.com>
Copyright (c) 2007 - 2008 Jean Delvare <khali@linux-fr.org>
*
Copyright (c) 2007 - 2008 Jean Delvare <khali@linux-fr.org>
*
This program is free software; you can redistribute it and/or modify
*
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
*
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
*
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
*
(at your option) any later version.
*
This program is distributed in the hope that it will be useful,
*
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
*
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
*
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
*
GNU General Public License for more details.
*
You should have received a copy of the GNU General Public License
*
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
*
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
*/
/*
/*
Supports following chips:
*
Supports following chips:
*
Chip #vin #fanin #pwm #temp wchipid vendid i2c ISA
*
Chip #vin #fanin #pwm #temp wchipid vendid i2c ISA
as99127f 7 3 0 3 0x31 0x12c3 yes no
*
as99127f 7 3 0 3 0x31 0x12c3 yes no
as99127f rev.2 (type_name = as99127f) 0x31 0x5ca3 yes no
*
as99127f rev.2 (type_name = as99127f) 0x31 0x5ca3 yes no
w83781d 7 3 0 3 0x10-1 0x5ca3 yes yes
*
w83781d 7 3 0 3 0x10-1 0x5ca3 yes yes
w83782d 9 3 2-4 3 0x30 0x5ca3 yes yes
*
w83782d 9 3 2-4 3 0x30 0x5ca3 yes yes
w83783s 5-6 3 2 1-2 0x40 0x5ca3 yes no
*
w83783s 5-6 3 2 1-2 0x40 0x5ca3 yes no
*
*/
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
...
@@ -145,8 +145,10 @@ static const u8 W83781D_REG_PWM[] = { 0x5B, 0x5A, 0x5E, 0x5F };
...
@@ -145,8 +145,10 @@ static const u8 W83781D_REG_PWM[] = { 0x5B, 0x5A, 0x5E, 0x5F };
#define W83781D_REG_I2C_ADDR 0x48
#define W83781D_REG_I2C_ADDR 0x48
#define W83781D_REG_I2C_SUBADDR 0x4A
#define W83781D_REG_I2C_SUBADDR 0x4A
/* The following are undocumented in the data sheets however we
/*
received the information in an email from Winbond tech support */
* The following are undocumented in the data sheets however we
* received the information in an email from Winbond tech support
*/
/* Sensor selection - not on 781d */
/* Sensor selection - not on 781d */
#define W83781D_REG_SCFG1 0x5D
#define W83781D_REG_SCFG1 0x5D
static
const
u8
BIT_SCFG1
[]
=
{
0x02
,
0x04
,
0x08
};
static
const
u8
BIT_SCFG1
[]
=
{
0x02
,
0x04
,
0x08
};
...
@@ -238,9 +240,11 @@ struct w83781d_data {
...
@@ -238,9 +240,11 @@ struct w83781d_data {
u32
beep_mask
;
/* Register encoding, combined */
u32
beep_mask
;
/* Register encoding, combined */
u8
pwm
[
4
];
/* Register value */
u8
pwm
[
4
];
/* Register value */
u8
pwm2_enable
;
/* Boolean */
u8
pwm2_enable
;
/* Boolean */
u16
sens
[
3
];
/* 782D/783S only.
u16
sens
[
3
];
/*
1 = pentium diode; 2 = 3904 diode;
* 782D/783S only.
4 = thermistor */
* 1 = pentium diode; 2 = 3904 diode;
* 4 = thermistor
*/
u8
vrm
;
u8
vrm
;
};
};
...
@@ -636,10 +640,12 @@ show_fan_div(struct device *dev, struct device_attribute *da, char *buf)
...
@@ -636,10 +640,12 @@ show_fan_div(struct device *dev, struct device_attribute *da, char *buf)
(
long
)
DIV_FROM_REG
(
data
->
fan_div
[
attr
->
index
]));
(
long
)
DIV_FROM_REG
(
data
->
fan_div
[
attr
->
index
]));
}
}
/* Note: we save and restore the fan minimum here, because its value is
/*
determined in part by the fan divisor. This follows the principle of
* Note: we save and restore the fan minimum here, because its value is
least surprise; the user doesn't expect the fan minimum to change just
* determined in part by the fan divisor. This follows the principle of
because the divisor changed. */
* least surprise; the user doesn't expect the fan minimum to change just
* because the divisor changed.
*/
static
ssize_t
static
ssize_t
store_fan_div
(
struct
device
*
dev
,
struct
device_attribute
*
da
,
store_fan_div
(
struct
device
*
dev
,
struct
device_attribute
*
da
,
const
char
*
buf
,
size_t
count
)
const
char
*
buf
,
size_t
count
)
...
@@ -847,7 +853,8 @@ static SENSOR_DEVICE_ATTR(temp2_type, S_IRUGO | S_IWUSR,
...
@@ -847,7 +853,8 @@ static SENSOR_DEVICE_ATTR(temp2_type, S_IRUGO | S_IWUSR,
static
SENSOR_DEVICE_ATTR
(
temp3_type
,
S_IRUGO
|
S_IWUSR
,
static
SENSOR_DEVICE_ATTR
(
temp3_type
,
S_IRUGO
|
S_IWUSR
,
show_sensor
,
store_sensor
,
2
);
show_sensor
,
store_sensor
,
2
);
/* Assumes that adapter is of I2C, not ISA variety.
/*
* Assumes that adapter is of I2C, not ISA variety.
* OTHERWISE DON'T CALL THIS
* OTHERWISE DON'T CALL THIS
*/
*/
static
int
static
int
...
@@ -1102,9 +1109,11 @@ w83781d_detect(struct i2c_client *client, struct i2c_board_info *info)
...
@@ -1102,9 +1109,11 @@ w83781d_detect(struct i2c_client *client, struct i2c_board_info *info)
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
))
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
))
return
-
ENODEV
;
return
-
ENODEV
;
/* We block updates of the ISA device to minimize the risk of
/*
concurrent access to the same W83781D chip through different
* We block updates of the ISA device to minimize the risk of
interfaces. */
* concurrent access to the same W83781D chip through different
* interfaces.
*/
if
(
isa
)
if
(
isa
)
mutex_lock
(
&
isa
->
update_lock
);
mutex_lock
(
&
isa
->
update_lock
);
...
@@ -1124,8 +1133,10 @@ w83781d_detect(struct i2c_client *client, struct i2c_board_info *info)
...
@@ -1124,8 +1133,10 @@ w83781d_detect(struct i2c_client *client, struct i2c_board_info *info)
"Detection of w83781d chip failed at step 4
\n
"
);
"Detection of w83781d chip failed at step 4
\n
"
);
goto
err_nodev
;
goto
err_nodev
;
}
}
/* If Winbond SMBus, check address at 0x48.
/*
Asus doesn't support, except for as99127f rev.2 */
* If Winbond SMBus, check address at 0x48.
* Asus doesn't support, except for as99127f rev.2
*/
if
((
!
(
val1
&
0x80
)
&&
val2
==
0xa3
)
||
if
((
!
(
val1
&
0x80
)
&&
val2
==
0xa3
)
||
((
val1
&
0x80
)
&&
val2
==
0x5c
))
{
((
val1
&
0x80
)
&&
val2
==
0x5c
))
{
if
(
i2c_smbus_read_byte_data
(
client
,
W83781D_REG_I2C_ADDR
)
if
(
i2c_smbus_read_byte_data
(
client
,
W83781D_REG_I2C_ADDR
)
...
@@ -1346,25 +1357,33 @@ w83781d_init_device(struct device *dev)
...
@@ -1346,25 +1357,33 @@ w83781d_init_device(struct device *dev)
int
type
=
data
->
type
;
int
type
=
data
->
type
;
u8
tmp
;
u8
tmp
;
if
(
reset
&&
type
!=
as99127f
)
{
/* this resets registers we don't have
if
(
reset
&&
type
!=
as99127f
)
{
/*
documentation for on the as99127f */
* this resets registers we don't have
/* Resetting the chip has been the default for a long time,
* documentation for on the as99127f
but it causes the BIOS initializations (fan clock dividers,
*/
thermal sensor types...) to be lost, so it is now optional.
/*
It might even go away if nobody reports it as being useful,
* Resetting the chip has been the default for a long time,
as I see very little reason why this would be needed at
* but it causes the BIOS initializations (fan clock dividers,
all. */
* thermal sensor types...) to be lost, so it is now optional.
* It might even go away if nobody reports it as being useful,
* as I see very little reason why this would be needed at
* all.
*/
dev_info
(
dev
,
"If reset=1 solved a problem you were "
dev_info
(
dev
,
"If reset=1 solved a problem you were "
"having, please report!
\n
"
);
"having, please report!
\n
"
);
/* save these registers */
/* save these registers */
i
=
w83781d_read_value
(
data
,
W83781D_REG_BEEP_CONFIG
);
i
=
w83781d_read_value
(
data
,
W83781D_REG_BEEP_CONFIG
);
p
=
w83781d_read_value
(
data
,
W83781D_REG_PWMCLK12
);
p
=
w83781d_read_value
(
data
,
W83781D_REG_PWMCLK12
);
/* Reset all except Watchdog values and last conversion values
/*
This sets fan-divs to 2, among others */
* Reset all except Watchdog values and last conversion values
* This sets fan-divs to 2, among others
*/
w83781d_write_value
(
data
,
W83781D_REG_CONFIG
,
0x80
);
w83781d_write_value
(
data
,
W83781D_REG_CONFIG
,
0x80
);
/* Restore the registers and disable power-on abnormal beep.
/*
This saves FAN 1/2/3 input/output values set by BIOS. */
* Restore the registers and disable power-on abnormal beep.
* This saves FAN 1/2/3 input/output values set by BIOS.
*/
w83781d_write_value
(
data
,
W83781D_REG_BEEP_CONFIG
,
i
|
0x80
);
w83781d_write_value
(
data
,
W83781D_REG_BEEP_CONFIG
,
i
|
0x80
);
w83781d_write_value
(
data
,
W83781D_REG_PWMCLK12
,
p
);
w83781d_write_value
(
data
,
W83781D_REG_PWMCLK12
,
p
);
/*
/*
...
@@ -1375,8 +1394,10 @@ w83781d_init_device(struct device *dev)
...
@@ -1375,8 +1394,10 @@ w83781d_init_device(struct device *dev)
w83781d_write_value
(
data
,
W83781D_REG_BEEP_INTS2
,
0
);
w83781d_write_value
(
data
,
W83781D_REG_BEEP_INTS2
,
0
);
}
}
/* Disable power-on abnormal beep, as advised by the datasheet.
/*
Already done if reset=1. */
* Disable power-on abnormal beep, as advised by the datasheet.
* Already done if reset=1.
*/
if
(
init
&&
!
reset
&&
type
!=
as99127f
)
{
if
(
init
&&
!
reset
&&
type
!=
as99127f
)
{
i
=
w83781d_read_value
(
data
,
W83781D_REG_BEEP_CONFIG
);
i
=
w83781d_read_value
(
data
,
W83781D_REG_BEEP_CONFIG
);
w83781d_write_value
(
data
,
W83781D_REG_BEEP_CONFIG
,
i
|
0x80
);
w83781d_write_value
(
data
,
W83781D_REG_BEEP_CONFIG
,
i
|
0x80
);
...
@@ -1533,8 +1554,10 @@ static struct w83781d_data *w83781d_update_device(struct device *dev)
...
@@ -1533,8 +1554,10 @@ static struct w83781d_data *w83781d_update_device(struct device *dev)
|
(
w83781d_read_value
(
data
,
|
(
w83781d_read_value
(
data
,
W83782D_REG_ALARM2
)
<<
8
);
W83782D_REG_ALARM2
)
<<
8
);
}
else
{
}
else
{
/* No real-time status registers, fall back to
/*
interrupt status registers */
* No real-time status registers, fall back to
* interrupt status registers
*/
data
->
alarms
=
w83781d_read_value
(
data
,
data
->
alarms
=
w83781d_read_value
(
data
,
W83781D_REG_ALARM1
)
W83781D_REG_ALARM1
)
|
(
w83781d_read_value
(
data
,
|
(
w83781d_read_value
(
data
,
...
@@ -1588,8 +1611,10 @@ static struct platform_device *pdev;
...
@@ -1588,8 +1611,10 @@ static struct platform_device *pdev;
static
unsigned
short
isa_address
=
0x290
;
static
unsigned
short
isa_address
=
0x290
;
/* I2C devices get this name attribute automatically, but for ISA devices
/*
we must create it by ourselves. */
* I2C devices get this name attribute automatically, but for ISA devices
* we must create it by ourselves.
*/
static
ssize_t
static
ssize_t
show_name
(
struct
device
*
dev
,
struct
device_attribute
*
devattr
,
char
*
buf
)
show_name
(
struct
device
*
dev
,
struct
device_attribute
*
devattr
,
char
*
buf
)
{
{
...
@@ -1619,8 +1644,10 @@ static int w83781d_alias_detect(struct i2c_client *client, u8 chipid)
...
@@ -1619,8 +1644,10 @@ static int w83781d_alias_detect(struct i2c_client *client, u8 chipid)
if
(
w83781d_read_value
(
isa
,
W83781D_REG_WCHIPID
)
!=
chipid
)
if
(
w83781d_read_value
(
isa
,
W83781D_REG_WCHIPID
)
!=
chipid
)
return
0
;
/* Chip type doesn't match */
return
0
;
/* Chip type doesn't match */
/* We compare all the limit registers, the config register and the
/*
* interrupt mask registers */
* We compare all the limit registers, the config register and the
* interrupt mask registers
*/
for
(
i
=
0x2b
;
i
<=
0x3d
;
i
++
)
{
for
(
i
=
0x2b
;
i
<=
0x3d
;
i
++
)
{
if
(
w83781d_read_value
(
isa
,
i
)
!=
if
(
w83781d_read_value
(
isa
,
i
)
!=
i2c_smbus_read_byte_data
(
client
,
i
))
i2c_smbus_read_byte_data
(
client
,
i
))
...
@@ -1701,12 +1728,14 @@ w83781d_write_value_isa(struct w83781d_data *data, u16 reg, u16 value)
...
@@ -1701,12 +1728,14 @@ w83781d_write_value_isa(struct w83781d_data *data, u16 reg, u16 value)
}
}
}
}
/* The SMBus locks itself, usually, but nothing may access the Winbond between
/*
bank switches. ISA access must always be locked explicitly!
* The SMBus locks itself, usually, but nothing may access the Winbond between
We ignore the W83781D BUSY flag at this moment - it could lead to deadlocks,
* bank switches. ISA access must always be locked explicitly!
would slow down the W83781D access and should not be necessary.
* We ignore the W83781D BUSY flag at this moment - it could lead to deadlocks,
There are some ugly typecasts here, but the good news is - they should
* would slow down the W83781D access and should not be necessary.
nowhere else be necessary! */
* There are some ugly typecasts here, but the good news is - they should
* nowhere else be necessary!
*/
static
int
static
int
w83781d_read_value
(
struct
w83781d_data
*
data
,
u16
reg
)
w83781d_read_value
(
struct
w83781d_data
*
data
,
u16
reg
)
{
{
...
@@ -1833,9 +1862,11 @@ w83781d_isa_found(unsigned short address)
...
@@ -1833,9 +1862,11 @@ w83781d_isa_found(unsigned short address)
int
val
,
save
,
found
=
0
;
int
val
,
save
,
found
=
0
;
int
port
;
int
port
;
/* Some boards declare base+0 to base+7 as a PNP device, some base+4
/*
* Some boards declare base+0 to base+7 as a PNP device, some base+4
* to base+7 and some base+5 to base+6. So we better request each port
* to base+7 and some base+5 to base+6. So we better request each port
* individually for the probing phase. */
* individually for the probing phase.
*/
for
(
port
=
address
;
port
<
address
+
W83781D_EXTENT
;
port
++
)
{
for
(
port
=
address
;
port
<
address
+
W83781D_EXTENT
;
port
++
)
{
if
(
!
request_region
(
port
,
1
,
"w83781d"
))
{
if
(
!
request_region
(
port
,
1
,
"w83781d"
))
{
pr_debug
(
"Failed to request port 0x%x
\n
"
,
port
);
pr_debug
(
"Failed to request port 0x%x
\n
"
,
port
);
...
@@ -1844,8 +1875,10 @@ w83781d_isa_found(unsigned short address)
...
@@ -1844,8 +1875,10 @@ w83781d_isa_found(unsigned short address)
}
}
#define REALLY_SLOW_IO
#define REALLY_SLOW_IO
/* We need the timeouts for at least some W83781D-like
/*
chips. But only if we read 'undefined' registers. */
* We need the timeouts for at least some W83781D-like
* chips. But only if we read 'undefined' registers.
*/
val
=
inb_p
(
address
+
1
);
val
=
inb_p
(
address
+
1
);
if
(
inb_p
(
address
+
2
)
!=
val
if
(
inb_p
(
address
+
2
)
!=
val
||
inb_p
(
address
+
3
)
!=
val
||
inb_p
(
address
+
3
)
!=
val
...
@@ -1855,8 +1888,10 @@ w83781d_isa_found(unsigned short address)
...
@@ -1855,8 +1888,10 @@ w83781d_isa_found(unsigned short address)
}
}
#undef REALLY_SLOW_IO
#undef REALLY_SLOW_IO
/* We should be able to change the 7 LSB of the address port. The
/*
MSB (busy flag) should be clear initially, set after the write. */
* We should be able to change the 7 LSB of the address port. The
* MSB (busy flag) should be clear initially, set after the write.
*/
save
=
inb_p
(
address
+
W83781D_ADDR_REG_OFFSET
);
save
=
inb_p
(
address
+
W83781D_ADDR_REG_OFFSET
);
if
(
save
&
0x80
)
{
if
(
save
&
0x80
)
{
pr_debug
(
"Detection failed at step %d
\n
"
,
2
);
pr_debug
(
"Detection failed at step %d
\n
"
,
2
);
...
@@ -2042,8 +2077,10 @@ sensors_w83781d_init(void)
...
@@ -2042,8 +2077,10 @@ sensors_w83781d_init(void)
{
{
int
res
;
int
res
;
/* We register the ISA device first, so that we can skip the
/*
* registration of an I2C interface to the same device. */
* We register the ISA device first, so that we can skip the
* registration of an I2C interface to the same device.
*/
res
=
w83781d_isa_register
();
res
=
w83781d_isa_register
();
if
(
res
)
if
(
res
)
goto
exit
;
goto
exit
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录