Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
c43c1be0
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
c43c1be0
编写于
7月 17, 2008
作者:
I
Ingo Molnar
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'linus' into x86/urgent
上级
e22146e6
a3cf8593
变更
55
展开全部
隐藏空白更改
内联
并排
Showing
55 changed file
with
2148 addition
and
2800 deletion
+2148
-2800
Documentation/i2c/chips/max6875
Documentation/i2c/chips/max6875
+1
-1
Documentation/i2c/chips/pca9539
Documentation/i2c/chips/pca9539
+9
-1
Documentation/i2c/chips/pcf8574
Documentation/i2c/chips/pcf8574
+5
-7
Documentation/i2c/chips/pcf8575
Documentation/i2c/chips/pcf8575
+3
-6
Makefile
Makefile
+2
-2
arch/powerpc/platforms/82xx/ep8248e.c
arch/powerpc/platforms/82xx/ep8248e.c
+4
-0
drivers/hwmon/ad7418.c
drivers/hwmon/ad7418.c
+26
-83
drivers/hwmon/adm1021.c
drivers/hwmon/adm1021.c
+53
-52
drivers/hwmon/adm1025.c
drivers/hwmon/adm1025.c
+49
-52
drivers/hwmon/adm1026.c
drivers/hwmon/adm1026.c
+44
-65
drivers/hwmon/adm1029.c
drivers/hwmon/adm1029.c
+44
-53
drivers/hwmon/adm1031.c
drivers/hwmon/adm1031.c
+49
-47
drivers/hwmon/adm9240.c
drivers/hwmon/adm9240.c
+46
-47
drivers/hwmon/ads7828.c
drivers/hwmon/ads7828.c
+38
-51
drivers/hwmon/adt7470.c
drivers/hwmon/adt7470.c
+48
-52
drivers/hwmon/adt7473.c
drivers/hwmon/adt7473.c
+48
-54
drivers/hwmon/asb100.c
drivers/hwmon/asb100.c
+83
-124
drivers/hwmon/atxp1.c
drivers/hwmon/atxp1.c
+52
-57
drivers/hwmon/ds1621.c
drivers/hwmon/ds1621.c
+47
-52
drivers/hwmon/f75375s.c
drivers/hwmon/f75375s.c
+12
-77
drivers/hwmon/fscher.c
drivers/hwmon/fscher.c
+42
-51
drivers/hwmon/fschmd.c
drivers/hwmon/fschmd.c
+57
-55
drivers/hwmon/fscpos.c
drivers/hwmon/fscpos.c
+41
-53
drivers/hwmon/gl518sm.c
drivers/hwmon/gl518sm.c
+47
-52
drivers/hwmon/gl520sm.c
drivers/hwmon/gl520sm.c
+43
-48
drivers/hwmon/lm63.c
drivers/hwmon/lm63.c
+44
-55
drivers/hwmon/lm77.c
drivers/hwmon/lm77.c
+45
-57
drivers/hwmon/lm80.c
drivers/hwmon/lm80.c
+43
-51
drivers/hwmon/lm83.c
drivers/hwmon/lm83.c
+49
-55
drivers/hwmon/lm87.c
drivers/hwmon/lm87.c
+46
-53
drivers/hwmon/lm90.c
drivers/hwmon/lm90.c
+63
-56
drivers/hwmon/lm92.c
drivers/hwmon/lm92.c
+40
-58
drivers/hwmon/lm93.c
drivers/hwmon/lm93.c
+60
-66
drivers/hwmon/max1619.c
drivers/hwmon/max1619.c
+44
-57
drivers/hwmon/max6650.c
drivers/hwmon/max6650.c
+47
-55
drivers/hwmon/smsc47m192.c
drivers/hwmon/smsc47m192.c
+46
-56
drivers/hwmon/thmc50.c
drivers/hwmon/thmc50.c
+53
-54
drivers/hwmon/w83791d.c
drivers/hwmon/w83791d.c
+71
-134
drivers/hwmon/w83792d.c
drivers/hwmon/w83792d.c
+72
-142
drivers/hwmon/w83793.c
drivers/hwmon/w83793.c
+90
-137
drivers/hwmon/w83l785ts.c
drivers/hwmon/w83l785ts.c
+60
-57
drivers/hwmon/w83l786ng.c
drivers/hwmon/w83l786ng.c
+45
-53
drivers/i2c/busses/i2c-amd756-s4882.c
drivers/i2c/busses/i2c-amd756-s4882.c
+13
-14
drivers/i2c/busses/i2c-nforce2-s4985.c
drivers/i2c/busses/i2c-nforce2-s4985.c
+15
-16
drivers/i2c/chips/eeprom.c
drivers/i2c/chips/eeprom.c
+40
-52
drivers/i2c/chips/max6875.c
drivers/i2c/chips/max6875.c
+49
-71
drivers/i2c/chips/pca9539.c
drivers/i2c/chips/pca9539.c
+33
-76
drivers/i2c/chips/pcf8574.c
drivers/i2c/chips/pcf8574.c
+46
-62
drivers/i2c/chips/pcf8575.c
drivers/i2c/chips/pcf8575.c
+40
-56
drivers/i2c/chips/pcf8591.c
drivers/i2c/chips/pcf8591.c
+40
-54
drivers/i2c/i2c-core.c
drivers/i2c/i2c-core.c
+4
-0
drivers/w1/masters/ds2482.c
drivers/w1/masters/ds2482.c
+44
-60
firmware/.gitignore
firmware/.gitignore
+6
-0
firmware/Makefile
firmware/Makefile
+1
-1
fs/compat_ioctl.c
fs/compat_ioctl.c
+6
-0
未找到文件。
Documentation/i2c/chips/max6875
浏览文件 @
c43c1be0
...
...
@@ -49,7 +49,7 @@ $ modprobe max6875 force=0,0x50
The MAX6874/MAX6875 ignores address bit 0, so this driver attaches to multiple
addresses. For example, for address 0x50, it also reserves 0x51.
The even-address instance is called 'max6875', the odd one is '
max6875 subclient
'.
The even-address instance is called 'max6875', the odd one is '
dummy
'.
Programming the chip using i2c-dev
...
...
Documentation/i2c/chips/pca9539
浏览文件 @
c43c1be0
...
...
@@ -7,7 +7,7 @@ drivers/gpio/pca9539.c instead.
Supported chips:
* Philips PCA9539
Prefix: 'pca9539'
Addresses scanned:
0x74 - 0x77
Addresses scanned:
none
Datasheet:
http://www.semiconductors.philips.com/acrobat/datasheets/PCA9539_2.pdf
...
...
@@ -23,6 +23,14 @@ The input sense can also be inverted.
The 16 lines are split between two bytes.
Detection
---------
The PCA9539 is difficult to detect and not commonly found in PC machines,
so you have to pass the I2C bus and address of the installed PCA9539
devices explicitly to the driver at load time via the force=... parameter.
Sysfs entries
-------------
...
...
Documentation/i2c/chips/pcf8574
浏览文件 @
c43c1be0
...
...
@@ -4,13 +4,13 @@ Kernel driver pcf8574
Supported chips:
* Philips PCF8574
Prefix: 'pcf8574'
Addresses scanned:
I2C 0x20 - 0x27
Addresses scanned:
none
Datasheet: Publicly available at the Philips Semiconductors website
http://www.semiconductors.philips.com/pip/PCF8574P.html
* Philips PCF8574A
Prefix: 'pcf8574a'
Addresses scanned:
I2C 0x38 - 0x3f
Addresses scanned:
none
Datasheet: Publicly available at the Philips Semiconductors website
http://www.semiconductors.philips.com/pip/PCF8574P.html
...
...
@@ -38,12 +38,10 @@ For more informations see the datasheet.
Accessing PCF8574(A) via /sys interface
-------------------------------------
! Be careful !
The PCF8574(A) is plainly impossible to detect ! Stupid chip.
So every chip with address in the interval [20..27] and [38..3f] are
detected as PCF8574(A). If you have other chips in this address
range, the workaround is to load this module after the one
for your others chips.
So, you have to pass the I2C bus and address of the installed PCF857A
and PCF8574A devices explicitly to the driver at load time via the
force=... parameter.
On detection (i.e. insmod, modprobe et al.), directories are being
created for each detected PCF8574(A):
...
...
Documentation/i2c/chips/pcf8575
浏览文件 @
c43c1be0
...
...
@@ -40,12 +40,9 @@ Detection
---------
There is no method known to detect whether a chip on a given I2C address is
a PCF8575 or whether it is any other I2C device. So there are two alternatives
to let the driver find the installed PCF8575 devices:
- Load this driver after any other I2C driver for I2C devices with addresses
in the range 0x20 .. 0x27.
- Pass the I2C bus and address of the installed PCF8575 devices explicitly to
the driver at load time via the probe=... or force=... parameters.
a PCF8575 or whether it is any other I2C device, so you have to pass the I2C
bus and address of the installed PCF8575 devices explicitly to the driver at
load time via the force=... parameter.
/sys interface
--------------
...
...
Makefile
浏览文件 @
c43c1be0
...
...
@@ -508,6 +508,8 @@ else
KBUILD_CFLAGS
+=
-O2
endif
include
$(srctree)/arch/$(SRCARCH)/Makefile
ifneq
(CONFIG_FRAME_WARN,0)
KBUILD_CFLAGS
+=
$(
call
cc-option,-Wframe-larger-than
=
${CONFIG_FRAME_WARN}
)
endif
...
...
@@ -516,8 +518,6 @@ endif
# Arch Makefiles may override this setting
KBUILD_CFLAGS
+=
$(
call
cc-option,
-fno-stack-protector
)
include
$(srctree)/arch/$(SRCARCH)/Makefile
ifdef
CONFIG_FRAME_POINTER
KBUILD_CFLAGS
+=
-fno-omit-frame-pointer
-fno-optimize-sibling-calls
else
...
...
arch/powerpc/platforms/82xx/ep8248e.c
浏览文件 @
c43c1be0
...
...
@@ -59,6 +59,7 @@ static void __init ep8248e_pic_init(void)
of_node_put
(
np
);
}
#ifdef CONFIG_FS_ENET_MDIO_FCC
static
void
ep8248e_set_mdc
(
struct
mdiobb_ctrl
*
ctrl
,
int
level
)
{
if
(
level
)
...
...
@@ -164,6 +165,7 @@ static struct of_platform_driver ep8248e_mdio_driver = {
.
probe
=
ep8248e_mdio_probe
,
.
remove
=
ep8248e_mdio_remove
,
};
#endif
struct
cpm_pin
{
int
port
,
pin
,
flags
;
...
...
@@ -296,7 +298,9 @@ static __initdata struct of_device_id of_bus_ids[] = {
static
int
__init
declare_of_platform_devices
(
void
)
{
of_platform_bus_probe
(
NULL
,
of_bus_ids
,
NULL
);
#ifdef CONFIG_FS_ENET_MDIO_FCC
of_register_platform_driver
(
&
ep8248e_mdio_driver
);
#endif
return
0
;
}
...
...
drivers/hwmon/ad7418.c
浏览文件 @
c43c1be0
...
...
@@ -23,12 +23,9 @@
#include "lm75.h"
#define DRV_VERSION "0.
3
"
#define DRV_VERSION "0.
4
"
/* Addresses to scan */
static
const
unsigned
short
normal_i2c
[]
=
{
0x28
,
I2C_CLIENT_END
};
/* Insmod parameters */
I2C_CLIENT_INSMOD_3
(
ad7416
,
ad7417
,
ad7418
);
enum
chips
{
ad7416
,
ad7417
,
ad7418
};
/* AD7418 registers */
#define AD7418_REG_TEMP_IN 0x00
...
...
@@ -46,7 +43,6 @@ static const u8 AD7418_REG_TEMP[] = { AD7418_REG_TEMP_IN,
AD7418_REG_TEMP_OS
};
struct
ad7418_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
attribute_group
attrs
;
enum
chips
type
;
...
...
@@ -58,16 +54,25 @@ struct ad7418_data {
u16
in
[
4
];
};
static
int
ad7418_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
ad7418_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
ad7418_detach_client
(
struct
i2c_client
*
client
);
static
int
ad7418_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
ad7418_remove
(
struct
i2c_client
*
client
);
static
const
struct
i2c_device_id
ad7418_id
[]
=
{
{
"ad7416"
,
ad7416
},
{
"ad7417"
,
ad7417
},
{
"ad7418"
,
ad7418
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
ad7418_id
);
static
struct
i2c_driver
ad7418_driver
=
{
.
driver
=
{
.
name
=
"ad7418"
,
},
.
attach_adapter
=
ad7418_attach_adapter
,
.
detach_client
=
ad7418_detach_client
,
.
probe
=
ad7418_probe
,
.
remove
=
ad7418_remove
,
.
id_table
=
ad7418_id
,
};
/* All registers are word-sized, except for the configuration registers.
...
...
@@ -192,13 +197,6 @@ static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_adc, NULL, 1);
static
SENSOR_DEVICE_ATTR
(
in3_input
,
S_IRUGO
,
show_adc
,
NULL
,
2
);
static
SENSOR_DEVICE_ATTR
(
in4_input
,
S_IRUGO
,
show_adc
,
NULL
,
3
);
static
int
ad7418_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
ad7418_detect
);
}
static
struct
attribute
*
ad7416_attributes
[]
=
{
&
sensor_dev_attr_temp1_max
.
dev_attr
.
attr
,
&
sensor_dev_attr_temp1_max_hyst
.
dev_attr
.
attr
,
...
...
@@ -225,98 +223,46 @@ static struct attribute *ad7418_attributes[] = {
NULL
};
static
int
ad7418_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
static
int
ad7418_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
)
{
struct
i2c_
client
*
client
;
struct
i2c_
adapter
*
adapter
=
client
->
adapter
;
struct
ad7418_data
*
data
;
int
err
=
0
;
int
err
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
|
I2C_FUNC_SMBUS_WORD_DATA
))
I2C_FUNC_SMBUS_WORD_DATA
))
{
err
=
-
EOPNOTSUPP
;
goto
exit
;
}
if
(
!
(
data
=
kzalloc
(
sizeof
(
struct
ad7418_data
),
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
exit
;
}
client
=
&
data
->
client
;
client
->
addr
=
address
;
client
->
adapter
=
adapter
;
client
->
driver
=
&
ad7418_driver
;
i2c_set_clientdata
(
client
,
data
);
mutex_init
(
&
data
->
lock
);
/* AD7418 has a curious behaviour on registers 6 and 7. They
* both always read 0xC071 and are not documented on the datasheet.
* We use them to detect the chip.
*/
if
(
kind
<=
0
)
{
int
reg
,
reg6
,
reg7
;
/* the AD7416 lies within this address range, but I have
* no means to check.
*/
if
(
address
>=
0x48
&&
address
<=
0x4f
)
{
/* XXX add tests for AD7416 here */
/* data->type = ad7416; */
}
/* here we might have AD7417 or AD7418 */
else
if
(
address
>=
0x28
&&
address
<=
0x2f
)
{
reg6
=
i2c_smbus_read_word_data
(
client
,
0x06
);
reg7
=
i2c_smbus_read_word_data
(
client
,
0x07
);
if
(
address
==
0x28
&&
reg6
==
0xC071
&&
reg7
==
0xC071
)
data
->
type
=
ad7418
;
/* XXX add tests for AD7417 here */
/* both AD7417 and AD7418 have bits 0-5 of
* the CONF2 register at 0
*/
reg
=
i2c_smbus_read_byte_data
(
client
,
AD7418_REG_CONF2
);
if
(
reg
&
0x3F
)
data
->
type
=
any_chip
;
/* detection failed */
}
}
else
{
dev_dbg
(
&
adapter
->
dev
,
"detection forced
\n
"
);
}
if
(
kind
>
0
)
data
->
type
=
kind
;
else
if
(
kind
<
0
&&
data
->
type
==
any_chip
)
{
err
=
-
ENODEV
;
goto
exit_free
;
}
data
->
type
=
id
->
driver_data
;
switch
(
data
->
type
)
{
case
any_chip
:
case
ad7416
:
data
->
adc_max
=
0
;
data
->
attrs
.
attrs
=
ad7416_attributes
;
strlcpy
(
client
->
name
,
"ad7416"
,
I2C_NAME_SIZE
);
break
;
case
ad7417
:
data
->
adc_max
=
4
;
data
->
attrs
.
attrs
=
ad7417_attributes
;
strlcpy
(
client
->
name
,
"ad7417"
,
I2C_NAME_SIZE
);
break
;
case
ad7418
:
data
->
adc_max
=
1
;
data
->
attrs
.
attrs
=
ad7418_attributes
;
strlcpy
(
client
->
name
,
"ad7418"
,
I2C_NAME_SIZE
);
break
;
}
if
((
err
=
i2c_attach_client
(
client
)))
goto
exit_free
;
dev_info
(
&
client
->
dev
,
"%s chip found
\n
"
,
client
->
name
);
/* Initialize the AD7418 chip */
...
...
@@ -324,7 +270,7 @@ static int ad7418_detect(struct i2c_adapter *adapter, int address, int kind)
/* Register sysfs hooks */
if
((
err
=
sysfs_create_group
(
&
client
->
dev
.
kobj
,
&
data
->
attrs
)))
goto
exit_
detach
;
goto
exit_
free
;
data
->
hwmon_dev
=
hwmon_device_register
(
&
client
->
dev
);
if
(
IS_ERR
(
data
->
hwmon_dev
))
{
...
...
@@ -336,20 +282,17 @@ static int ad7418_detect(struct i2c_adapter *adapter, int address, int kind)
exit_remove:
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
data
->
attrs
);
exit_detach:
i2c_detach_client
(
client
);
exit_free:
kfree
(
data
);
exit:
return
err
;
}
static
int
ad7418_
detach_client
(
struct
i2c_client
*
client
)
static
int
ad7418_
remove
(
struct
i2c_client
*
client
)
{
struct
ad7418_data
*
data
=
i2c_get_clientdata
(
client
);
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
data
->
attrs
);
i2c_detach_client
(
client
);
kfree
(
data
);
return
0
;
}
...
...
drivers/hwmon/adm1021.c
浏览文件 @
c43c1be0
...
...
@@ -78,7 +78,6 @@ clearing it. Weird, ey? --Phil */
/* Each client has this additional data */
struct
adm1021_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
enum
chips
type
;
...
...
@@ -98,23 +97,42 @@ struct adm1021_data {
u8
remote_temp_offset_prec
;
};
static
int
adm1021_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
adm1021_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
adm1021_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
adm1021_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
void
adm1021_init_client
(
struct
i2c_client
*
client
);
static
int
adm1021_
detach_client
(
struct
i2c_client
*
client
);
static
int
adm1021_
remove
(
struct
i2c_client
*
client
);
static
struct
adm1021_data
*
adm1021_update_device
(
struct
device
*
dev
);
/* (amalysh) read only mode, otherwise any limit's writing confuse BIOS */
static
int
read_only
;
static
const
struct
i2c_device_id
adm1021_id
[]
=
{
{
"adm1021"
,
adm1021
},
{
"adm1023"
,
adm1023
},
{
"max1617"
,
max1617
},
{
"max1617a"
,
max1617a
},
{
"thmc10"
,
thmc10
},
{
"lm84"
,
lm84
},
{
"gl523sm"
,
gl523sm
},
{
"mc1066"
,
mc1066
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
adm1021_id
);
/* This is the driver that will be inserted */
static
struct
i2c_driver
adm1021_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"adm1021"
,
},
.
attach_adapter
=
adm1021_attach_adapter
,
.
detach_client
=
adm1021_detach_client
,
.
probe
=
adm1021_probe
,
.
remove
=
adm1021_remove
,
.
id_table
=
adm1021_id
,
.
detect
=
adm1021_detect
,
.
address_data
=
&
addr_data
,
};
static
ssize_t
show_temp
(
struct
device
*
dev
,
...
...
@@ -216,13 +234,6 @@ static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO, show_alarm, NULL, 2);
static
DEVICE_ATTR
(
alarms
,
S_IRUGO
,
show_alarms
,
NULL
);
static
int
adm1021_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
adm1021_detect
);
}
static
struct
attribute
*
adm1021_attributes
[]
=
{
&
sensor_dev_attr_temp1_max
.
dev_attr
.
attr
,
&
sensor_dev_attr_temp1_min
.
dev_attr
.
attr
,
...
...
@@ -243,36 +254,21 @@ static const struct attribute_group adm1021_group = {
.
attrs
=
adm1021_attributes
,
};
static
int
adm1021_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
adm1021_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
struct
i2c_adapter
*
adapter
=
client
->
adapter
;
int
i
;
struct
i2c_client
*
client
;
struct
adm1021_data
*
data
;
int
err
=
0
;
const
char
*
type_name
=
""
;
int
conv_rate
,
status
,
config
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
))
{
pr_debug
(
"adm1021: detect failed, "
"smbus byte data not supported!
\n
"
);
goto
error0
;
}
/* OK. For now, we presume we have a valid client. We now create the
client structure, even though we cannot fill it completely yet.
But it allows us to access adm1021 register values. */
if
(
!
(
data
=
kzalloc
(
sizeof
(
struct
adm1021_data
),
GFP_KERNEL
)))
{
pr_debug
(
"adm1021: detect failed, kzalloc failed!
\n
"
);
err
=
-
ENOMEM
;
goto
error0
;
return
-
ENODEV
;
}
client
=
&
data
->
client
;
i2c_set_clientdata
(
client
,
data
);
client
->
addr
=
address
;
client
->
adapter
=
adapter
;
client
->
driver
=
&
adm1021_driver
;
status
=
i2c_smbus_read_byte_data
(
client
,
ADM1021_REG_STATUS
);
conv_rate
=
i2c_smbus_read_byte_data
(
client
,
ADM1021_REG_CONV_RATE_R
);
...
...
@@ -284,8 +280,7 @@ static int adm1021_detect(struct i2c_adapter *adapter, int address, int kind)
||
(
conv_rate
&
0xF8
)
!=
0x00
)
{
pr_debug
(
"adm1021: detect failed, "
"chip not detected!
\n
"
);
err
=
-
ENODEV
;
goto
error1
;
return
-
ENODEV
;
}
}
...
...
@@ -336,24 +331,36 @@ static int adm1021_detect(struct i2c_adapter *adapter, int address, int kind)
type_name
=
"mc1066"
;
}
pr_debug
(
"adm1021: Detected chip %s at adapter %d, address 0x%02x.
\n
"
,
type_name
,
i2c_adapter_id
(
adapter
),
address
);
type_name
,
i2c_adapter_id
(
adapter
),
client
->
addr
);
strlcpy
(
info
->
type
,
type_name
,
I2C_NAME_SIZE
);
/* Fill in the remaining client fields */
strlcpy
(
client
->
name
,
type_name
,
I2C_NAME_SIZE
);
data
->
type
=
kind
;
mutex_init
(
&
data
->
update_lock
);
return
0
;
}
/* Tell the I2C layer a new client has arrived */
if
((
err
=
i2c_attach_client
(
client
)))
goto
error1
;
static
int
adm1021_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
)
{
struct
adm1021_data
*
data
;
int
err
;
data
=
kzalloc
(
sizeof
(
struct
adm1021_data
),
GFP_KERNEL
);
if
(
!
data
)
{
pr_debug
(
"adm1021: detect failed, kzalloc failed!
\n
"
);
err
=
-
ENOMEM
;
goto
error0
;
}
i2c_set_clientdata
(
client
,
data
);
data
->
type
=
id
->
driver_data
;
mutex_init
(
&
data
->
update_lock
);
/* Initialize the ADM1021 chip */
if
(
kind
!=
lm84
&&
!
read_only
)
if
(
data
->
type
!=
lm84
&&
!
read_only
)
adm1021_init_client
(
client
);
/* Register sysfs hooks */
if
((
err
=
sysfs_create_group
(
&
client
->
dev
.
kobj
,
&
adm1021_group
)))
goto
error
2
;
goto
error
1
;
data
->
hwmon_dev
=
hwmon_device_register
(
&
client
->
dev
);
if
(
IS_ERR
(
data
->
hwmon_dev
))
{
...
...
@@ -365,8 +372,6 @@ static int adm1021_detect(struct i2c_adapter *adapter, int address, int kind)
error3:
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
adm1021_group
);
error2:
i2c_detach_client
(
client
);
error1:
kfree
(
data
);
error0:
...
...
@@ -382,17 +387,13 @@ static void adm1021_init_client(struct i2c_client *client)
i2c_smbus_write_byte_data
(
client
,
ADM1021_REG_CONV_RATE_W
,
0x04
);
}
static
int
adm1021_
detach_client
(
struct
i2c_client
*
client
)
static
int
adm1021_
remove
(
struct
i2c_client
*
client
)
{
struct
adm1021_data
*
data
=
i2c_get_clientdata
(
client
);
int
err
;
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
adm1021_group
);
if
((
err
=
i2c_detach_client
(
client
)))
return
err
;
kfree
(
data
);
return
0
;
}
...
...
drivers/hwmon/adm1025.c
浏览文件 @
c43c1be0
...
...
@@ -2,7 +2,7 @@
* adm1025.c
*
* Copyright (C) 2000 Chen-Yuan Wu <gwu@esoft.com>
* Copyright (C) 2003-200
4
Jean Delvare <khali@linux-fr.org>
* Copyright (C) 2003-200
8
Jean Delvare <khali@linux-fr.org>
*
* The ADM1025 is a sensor chip made by Analog Devices. It reports up to 6
* voltages (including its own power source) and up to two temperatures
...
...
@@ -109,22 +109,35 @@ static const int in_scale[6] = { 2500, 2250, 3300, 5000, 12000, 3300 };
* Functions declaration
*/
static
int
adm1025_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
adm1025_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
adm1025_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
adm1025_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
void
adm1025_init_client
(
struct
i2c_client
*
client
);
static
int
adm1025_
detach_client
(
struct
i2c_client
*
client
);
static
int
adm1025_
remove
(
struct
i2c_client
*
client
);
static
struct
adm1025_data
*
adm1025_update_device
(
struct
device
*
dev
);
/*
* Driver data (common to all clients)
*/
static
const
struct
i2c_device_id
adm1025_id
[]
=
{
{
"adm1025"
,
adm1025
},
{
"ne1619"
,
ne1619
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
adm1025_id
);
static
struct
i2c_driver
adm1025_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"adm1025"
,
},
.
attach_adapter
=
adm1025_attach_adapter
,
.
detach_client
=
adm1025_detach_client
,
.
probe
=
adm1025_probe
,
.
remove
=
adm1025_remove
,
.
id_table
=
adm1025_id
,
.
detect
=
adm1025_detect
,
.
address_data
=
&
addr_data
,
};
/*
...
...
@@ -132,7 +145,6 @@ static struct i2c_driver adm1025_driver = {
*/
struct
adm1025_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
mutex
update_lock
;
char
valid
;
/* zero until following fields are valid */
...
...
@@ -344,13 +356,6 @@ static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm, set_vrm);
* Real code
*/
static
int
adm1025_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
adm1025_detect
);
}
static
struct
attribute
*
adm1025_attributes
[]
=
{
&
sensor_dev_attr_in0_input
.
dev_attr
.
attr
,
&
sensor_dev_attr_in1_input
.
dev_attr
.
attr
,
...
...
@@ -403,31 +408,16 @@ static const struct attribute_group adm1025_group_in4 = {
.
attrs
=
adm1025_attributes_in4
,
};
/*
* The following function does more than just detection. If detection
* succeeds, it also registers the new chip.
*/
static
int
adm1025_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
adm1025_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
struct
i2c_client
*
client
;
struct
adm1025_data
*
data
;
int
err
=
0
;
struct
i2c_adapter
*
adapter
=
client
->
adapter
;
const
char
*
name
=
""
;
u8
config
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
))
goto
exit
;
if
(
!
(
data
=
kzalloc
(
sizeof
(
struct
adm1025_data
),
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
exit
;
}
client
=
&
data
->
client
;
i2c_set_clientdata
(
client
,
data
);
client
->
addr
=
address
;
client
->
adapter
=
adapter
;
client
->
driver
=
&
adm1025_driver
;
return
-
ENODEV
;
/*
* Now we do the remaining detection. A negative kind means that
...
...
@@ -448,8 +438,8 @@ static int adm1025_detect(struct i2c_adapter *adapter, int address, int kind)
ADM1025_REG_STATUS2
)
&
0xBC
)
!=
0x00
)
{
dev_dbg
(
&
adapter
->
dev
,
"ADM1025 detection failed at 0x%02x.
\n
"
,
address
);
goto
exit_free
;
client
->
addr
);
return
-
ENODEV
;
}
}
...
...
@@ -465,7 +455,7 @@ static int adm1025_detect(struct i2c_adapter *adapter, int address, int kind)
}
}
else
if
(
man_id
==
0xA1
)
{
/* Philips */
if
(
address
!=
0x2E
if
(
client
->
addr
!=
0x2E
&&
(
chip_id
&
0xF0
)
==
0x20
)
{
/* NE1619 */
kind
=
ne1619
;
}
...
...
@@ -475,7 +465,7 @@ static int adm1025_detect(struct i2c_adapter *adapter, int address, int kind)
dev_info
(
&
adapter
->
dev
,
"Unsupported chip (man_id=0x%02X, "
"chip_id=0x%02X).
\n
"
,
man_id
,
chip_id
);
goto
exit_free
;
return
-
ENODEV
;
}
}
...
...
@@ -484,23 +474,36 @@ static int adm1025_detect(struct i2c_adapter *adapter, int address, int kind)
}
else
if
(
kind
==
ne1619
)
{
name
=
"ne1619"
;
}
strlcpy
(
info
->
type
,
name
,
I2C_NAME_SIZE
);
/* We can fill in the remaining client fields */
strlcpy
(
client
->
name
,
name
,
I2C_NAME_SIZE
);
mutex_init
(
&
data
->
update_lock
);
return
0
;
}
/* Tell the I2C layer a new client has arrived */
if
((
err
=
i2c_attach_client
(
client
)))
goto
exit_free
;
static
int
adm1025_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
)
{
struct
adm1025_data
*
data
;
int
err
;
u8
config
;
data
=
kzalloc
(
sizeof
(
struct
adm1025_data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
ENOMEM
;
goto
exit
;
}
i2c_set_clientdata
(
client
,
data
);
mutex_init
(
&
data
->
update_lock
);
/* Initialize the ADM1025 chip */
adm1025_init_client
(
client
);
/* Register sysfs hooks */
if
((
err
=
sysfs_create_group
(
&
client
->
dev
.
kobj
,
&
adm1025_group
)))
goto
exit_
detach
;
goto
exit_
free
;
/* Pin 11 is either in4 (+12V) or VID4 */
config
=
i2c_smbus_read_byte_data
(
client
,
ADM1025_REG_CONFIG
);
if
(
!
(
config
&
0x20
))
{
if
((
err
=
sysfs_create_group
(
&
client
->
dev
.
kobj
,
&
adm1025_group_in4
)))
...
...
@@ -518,8 +521,6 @@ static int adm1025_detect(struct i2c_adapter *adapter, int address, int kind)
exit_remove:
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
adm1025_group
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
adm1025_group_in4
);
exit_detach:
i2c_detach_client
(
client
);
exit_free:
kfree
(
data
);
exit:
...
...
@@ -568,18 +569,14 @@ static void adm1025_init_client(struct i2c_client *client)
(
reg
&
0x7E
)
|
0x01
);
}
static
int
adm1025_
detach_client
(
struct
i2c_client
*
client
)
static
int
adm1025_
remove
(
struct
i2c_client
*
client
)
{
struct
adm1025_data
*
data
=
i2c_get_clientdata
(
client
);
int
err
;
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
adm1025_group
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
adm1025_group_in4
);
if
((
err
=
i2c_detach_client
(
client
)))
return
err
;
kfree
(
data
);
return
0
;
}
...
...
drivers/hwmon/adm1026.c
浏览文件 @
c43c1be0
...
...
@@ -259,7 +259,6 @@ struct pwm_data {
};
struct
adm1026_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
mutex
update_lock
;
...
...
@@ -293,10 +292,11 @@ struct adm1026_data {
u8
config3
;
/* Register value */
};
static
int
adm1026_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
adm1026_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
adm1026_detach_client
(
struct
i2c_client
*
client
);
static
int
adm1026_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
adm1026_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
int
adm1026_remove
(
struct
i2c_client
*
client
);
static
int
adm1026_read_value
(
struct
i2c_client
*
client
,
u8
reg
);
static
int
adm1026_write_value
(
struct
i2c_client
*
client
,
u8
reg
,
int
value
);
static
void
adm1026_print_gpio
(
struct
i2c_client
*
client
);
...
...
@@ -305,22 +305,24 @@ static struct adm1026_data *adm1026_update_device(struct device *dev);
static
void
adm1026_init_client
(
struct
i2c_client
*
client
);
static
const
struct
i2c_device_id
adm1026_id
[]
=
{
{
"adm1026"
,
adm1026
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
adm1026_id
);
static
struct
i2c_driver
adm1026_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"adm1026"
,
},
.
attach_adapter
=
adm1026_attach_adapter
,
.
detach_client
=
adm1026_detach_client
,
.
probe
=
adm1026_probe
,
.
remove
=
adm1026_remove
,
.
id_table
=
adm1026_id
,
.
detect
=
adm1026_detect
,
.
address_data
=
&
addr_data
,
};
static
int
adm1026_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
{
return
0
;
}
return
i2c_probe
(
adapter
,
&
addr_data
,
adm1026_detect
);
}
static
int
adm1026_read_value
(
struct
i2c_client
*
client
,
u8
reg
)
{
int
res
;
...
...
@@ -1647,48 +1649,32 @@ static const struct attribute_group adm1026_group_in8_9 = {
.
attrs
=
adm1026_attributes_in8_9
,
};
static
int
adm1026_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
adm1026_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
struct
i2c_adapter
*
adapter
=
client
->
adapter
;
int
address
=
client
->
addr
;
int
company
,
verstep
;
struct
i2c_client
*
client
;
struct
adm1026_data
*
data
;
int
err
=
0
;
const
char
*
type_name
=
""
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
))
{
/* We need to be able to do byte I/O */
goto
exit
;
return
-
ENODEV
;
};
/* OK. For now, we presume we have a valid client. We now create the
client structure, even though we cannot fill it completely yet.
But it allows us to access adm1026_{read,write}_value. */
if
(
!
(
data
=
kzalloc
(
sizeof
(
struct
adm1026_data
),
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
exit
;
}
client
=
&
data
->
client
;
i2c_set_clientdata
(
client
,
data
);
client
->
addr
=
address
;
client
->
adapter
=
adapter
;
client
->
driver
=
&
adm1026_driver
;
/* Now, we do the remaining detection. */
company
=
adm1026_read_value
(
client
,
ADM1026_REG_COMPANY
);
verstep
=
adm1026_read_value
(
client
,
ADM1026_REG_VERSTEP
);
dev_dbg
(
&
client
->
dev
,
"Detecting device at %d,0x%02x with"
dev_dbg
(
&
adapter
->
dev
,
"Detecting device at %d,0x%02x with"
" COMPANY: 0x%02x and VERSTEP: 0x%02x
\n
"
,
i2c_adapter_id
(
client
->
adapter
),
client
->
addr
,
company
,
verstep
);
/* If auto-detecting, Determine the chip type. */
if
(
kind
<=
0
)
{
dev_dbg
(
&
client
->
dev
,
"Autodetecting device at %d,0x%02x "
dev_dbg
(
&
adapter
->
dev
,
"Autodetecting device at %d,0x%02x "
"...
\n
"
,
i2c_adapter_id
(
adapter
),
address
);
if
(
company
==
ADM1026_COMPANY_ANALOG_DEV
&&
verstep
==
ADM1026_VERSTEP_ADM1026
)
{
...
...
@@ -1704,7 +1690,7 @@ static int adm1026_detect(struct i2c_adapter *adapter, int address,
verstep
);
kind
=
any_chip
;
}
else
{
dev_dbg
(
&
client
->
dev
,
": Autodetection "
dev_dbg
(
&
adapter
->
dev
,
": Autodetection "
"failed
\n
"
);
/* Not an ADM1026 ... */
if
(
kind
==
0
)
{
/* User used force=x,y */
...
...
@@ -1713,33 +1699,29 @@ static int adm1026_detect(struct i2c_adapter *adapter, int address,
"force_adm1026.
\n
"
,
i2c_adapter_id
(
adapter
),
address
);
}
goto
exitfree
;
return
-
ENODEV
;
}
}
strlcpy
(
info
->
type
,
"adm1026"
,
I2C_NAME_SIZE
);
/* Fill in the chip specific driver values */
switch
(
kind
)
{
case
any_chip
:
type_name
=
"adm1026"
;
break
;
case
adm1026
:
type_name
=
"adm1026"
;
break
;
default
:
dev_err
(
&
adapter
->
dev
,
": Internal error, invalid "
"kind (%d)!
\n
"
,
kind
);
err
=
-
E
FAULT
;
goto
exit
free
;
return
0
;
}
static
int
adm1026_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
)
{
struct
adm1026_data
*
data
;
int
err
;
data
=
kzalloc
(
sizeof
(
struct
adm1026_data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
E
NOMEM
;
goto
exit
;
}
strlcpy
(
client
->
name
,
type_name
,
I2C_NAME_SIZE
);
/* Fill in the remaining client fields */
i2c_set_clientdata
(
client
,
data
);
mutex_init
(
&
data
->
update_lock
);
/* Tell the I2C layer a new client has arrived */
if
((
err
=
i2c_attach_client
(
client
)))
goto
exitfree
;
/* Set the VRM version */
data
->
vrm
=
vid_which_vrm
();
...
...
@@ -1748,7 +1730,7 @@ static int adm1026_detect(struct i2c_adapter *adapter, int address,
/* Register sysfs hooks */
if
((
err
=
sysfs_create_group
(
&
client
->
dev
.
kobj
,
&
adm1026_group
)))
goto
exit
detach
;
goto
exit
free
;
if
(
data
->
config1
&
CFG1_AIN8_9
)
err
=
sysfs_create_group
(
&
client
->
dev
.
kobj
,
&
adm1026_group_in8_9
);
...
...
@@ -1773,15 +1755,13 @@ static int adm1026_detect(struct i2c_adapter *adapter, int address,
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
adm1026_group_in8_9
);
else
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
adm1026_group_temp3
);
exitdetach:
i2c_detach_client
(
client
);
exitfree:
kfree
(
data
);
exit:
return
err
;
}
static
int
adm1026_
detach_client
(
struct
i2c_client
*
client
)
static
int
adm1026_
remove
(
struct
i2c_client
*
client
)
{
struct
adm1026_data
*
data
=
i2c_get_clientdata
(
client
);
hwmon_device_unregister
(
data
->
hwmon_dev
);
...
...
@@ -1790,7 +1770,6 @@ static int adm1026_detach_client(struct i2c_client *client)
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
adm1026_group_in8_9
);
else
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
adm1026_group_temp3
);
i2c_detach_client
(
client
);
kfree
(
data
);
return
0
;
}
...
...
drivers/hwmon/adm1029.c
浏览文件 @
c43c1be0
...
...
@@ -115,9 +115,11 @@ static const u8 ADM1029_REG_FAN_DIV[] = {
* Functions declaration
*/
static
int
adm1029_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
adm1029_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
adm1029_detach_client
(
struct
i2c_client
*
client
);
static
int
adm1029_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
adm1029_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
int
adm1029_remove
(
struct
i2c_client
*
client
);
static
struct
adm1029_data
*
adm1029_update_device
(
struct
device
*
dev
);
static
int
adm1029_init_client
(
struct
i2c_client
*
client
);
...
...
@@ -125,12 +127,22 @@ static int adm1029_init_client(struct i2c_client *client);
* Driver data (common to all clients)
*/
static
const
struct
i2c_device_id
adm1029_id
[]
=
{
{
"adm1029"
,
adm1029
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
adm1029_id
);
static
struct
i2c_driver
adm1029_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"adm1029"
,
},
.
attach_adapter
=
adm1029_attach_adapter
,
.
detach_client
=
adm1029_detach_client
,
.
probe
=
adm1029_probe
,
.
remove
=
adm1029_remove
,
.
id_table
=
adm1029_id
,
.
detect
=
adm1029_detect
,
.
address_data
=
&
addr_data
,
};
/*
...
...
@@ -138,7 +150,6 @@ static struct i2c_driver adm1029_driver = {
*/
struct
adm1029_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
mutex
update_lock
;
char
valid
;
/* zero until following fields are valid */
...
...
@@ -284,37 +295,14 @@ static const struct attribute_group adm1029_group = {
* Real code
*/
static
int
adm1029_attach_adapter
(
struct
i2c_adapter
*
adapter
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
adm1029_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
adm1029_detect
);
}
struct
i2c_adapter
*
adapter
=
client
->
adapter
;
/*
* The following function does more than just detection. If detection
* succeeds, it also registers the new chip.
*/
static
int
adm1029_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
{
struct
i2c_client
*
client
;
struct
adm1029_data
*
data
;
int
err
=
0
;
const
char
*
name
=
""
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
))
goto
exit
;
if
(
!
(
data
=
kzalloc
(
sizeof
(
struct
adm1029_data
),
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
exit
;
}
client
=
&
data
->
client
;
i2c_set_clientdata
(
client
,
data
);
client
->
addr
=
address
;
client
->
adapter
=
adapter
;
client
->
driver
=
&
adm1029_driver
;
return
-
ENODEV
;
/* Now we do the detection and identification. A negative kind
* means that the driver was loaded with no force parameter
...
...
@@ -362,32 +350,41 @@ static int adm1029_detect(struct i2c_adapter *adapter, int address, int kind)
if
(
kind
<=
0
)
{
/* identification failed */
pr_debug
(
"adm1029: Unsupported chip (man_id=0x%02X, "
"chip_id=0x%02X)
\n
"
,
man_id
,
chip_id
);
goto
exit_free
;
return
-
ENODEV
;
}
}
strlcpy
(
info
->
type
,
"adm1029"
,
I2C_NAME_SIZE
);
if
(
kind
==
adm1029
)
{
name
=
"adm1029"
;
return
0
;
}
static
int
adm1029_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
)
{
struct
adm1029_data
*
data
;
int
err
;
data
=
kzalloc
(
sizeof
(
struct
adm1029_data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
ENOMEM
;
goto
exit
;
}
/* We can fill in the remaining client fields */
strlcpy
(
client
->
name
,
name
,
I2C_NAME_SIZE
);
i2c_set_clientdata
(
client
,
data
);
mutex_init
(
&
data
->
update_lock
);
/* Tell the I2C layer a new client has arrived */
if
((
err
=
i2c_attach_client
(
client
)))
goto
exit_free
;
/*
* Initialize the ADM1029 chip
* Check config register
*/
if
(
adm1029_init_client
(
client
)
==
0
)
goto
exit_detach
;
if
(
adm1029_init_client
(
client
)
==
0
)
{
err
=
-
ENODEV
;
goto
exit_free
;
}
/* Register sysfs hooks */
if
((
err
=
sysfs_create_group
(
&
client
->
dev
.
kobj
,
&
adm1029_group
)))
goto
exit_
detach
;
goto
exit_
free
;
data
->
hwmon_dev
=
hwmon_device_register
(
&
client
->
dev
);
if
(
IS_ERR
(
data
->
hwmon_dev
))
{
...
...
@@ -399,8 +396,6 @@ static int adm1029_detect(struct i2c_adapter *adapter, int address, int kind)
exit_remove_files:
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
adm1029_group
);
exit_detach:
i2c_detach_client
(
client
);
exit_free:
kfree
(
data
);
exit:
...
...
@@ -424,17 +419,13 @@ static int adm1029_init_client(struct i2c_client *client)
return
1
;
}
static
int
adm1029_
detach_client
(
struct
i2c_client
*
client
)
static
int
adm1029_
remove
(
struct
i2c_client
*
client
)
{
struct
adm1029_data
*
data
=
i2c_get_clientdata
(
client
);
int
err
;
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
adm1029_group
);
if
((
err
=
i2c_detach_client
(
client
)))
return
err
;
kfree
(
data
);
return
0
;
}
...
...
drivers/hwmon/adm1031.c
浏览文件 @
c43c1be0
...
...
@@ -70,7 +70,6 @@ typedef u8 auto_chan_table_t[8][2];
/* Each client has this additional data */
struct
adm1031_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
mutex
update_lock
;
int
chip_type
;
...
...
@@ -99,19 +98,32 @@ struct adm1031_data {
s8
temp_crit
[
3
];
};
static
int
adm1031_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
adm1031_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
adm1031_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
adm1031_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
void
adm1031_init_client
(
struct
i2c_client
*
client
);
static
int
adm1031_
detach_client
(
struct
i2c_client
*
client
);
static
int
adm1031_
remove
(
struct
i2c_client
*
client
);
static
struct
adm1031_data
*
adm1031_update_device
(
struct
device
*
dev
);
static
const
struct
i2c_device_id
adm1031_id
[]
=
{
{
"adm1030"
,
adm1030
},
{
"adm1031"
,
adm1031
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
adm1031_id
);
/* This is the driver that will be inserted */
static
struct
i2c_driver
adm1031_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"adm1031"
,
},
.
attach_adapter
=
adm1031_attach_adapter
,
.
detach_client
=
adm1031_detach_client
,
.
probe
=
adm1031_probe
,
.
remove
=
adm1031_remove
,
.
id_table
=
adm1031_id
,
.
detect
=
adm1031_detect
,
.
address_data
=
&
addr_data
,
};
static
inline
u8
adm1031_read_value
(
struct
i2c_client
*
client
,
u8
reg
)
...
...
@@ -693,13 +705,6 @@ static SENSOR_DEVICE_ATTR(temp3_crit_alarm, S_IRUGO, show_alarm, NULL, 12);
static
SENSOR_DEVICE_ATTR
(
temp3_fault
,
S_IRUGO
,
show_alarm
,
NULL
,
13
);
static
SENSOR_DEVICE_ATTR
(
temp1_crit_alarm
,
S_IRUGO
,
show_alarm
,
NULL
,
14
);
static
int
adm1031_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
adm1031_detect
);
}
static
struct
attribute
*
adm1031_attributes
[]
=
{
&
sensor_dev_attr_fan1_input
.
dev_attr
.
attr
,
&
sensor_dev_attr_fan1_div
.
dev_attr
.
attr
,
...
...
@@ -770,27 +775,15 @@ static const struct attribute_group adm1031_group_opt = {
.
attrs
=
adm1031_attributes_opt
,
};
/* This function is called by i2c_probe */
static
int
adm1031_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
adm1031_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
struct
i2c_client
*
client
;
struct
adm1031_data
*
data
;
int
err
=
0
;
struct
i2c_adapter
*
adapter
=
client
->
adapter
;
const
char
*
name
=
""
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
))
goto
exit
;
if
(
!
(
data
=
kzalloc
(
sizeof
(
struct
adm1031_data
),
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
exit
;
}
client
=
&
data
->
client
;
i2c_set_clientdata
(
client
,
data
);
client
->
addr
=
address
;
client
->
adapter
=
adapter
;
client
->
driver
=
&
adm1031_driver
;
return
-
ENODEV
;
if
(
kind
<
0
)
{
int
id
,
co
;
...
...
@@ -798,7 +791,7 @@ static int adm1031_detect(struct i2c_adapter *adapter, int address, int kind)
co
=
i2c_smbus_read_byte_data
(
client
,
0x3e
);
if
(
!
((
id
==
0x31
||
id
==
0x30
)
&&
co
==
0x41
))
goto
exit_free
;
return
-
ENODEV
;
kind
=
(
id
==
0x30
)
?
adm1030
:
adm1031
;
}
...
...
@@ -809,28 +802,43 @@ static int adm1031_detect(struct i2c_adapter *adapter, int address, int kind)
* auto fan control helper table. */
if
(
kind
==
adm1030
)
{
name
=
"adm1030"
;
data
->
chan_select_table
=
&
auto_channel_select_table_adm1030
;
}
else
if
(
kind
==
adm1031
)
{
name
=
"adm1031"
;
data
->
chan_select_table
=
&
auto_channel_select_table_adm1031
;
}
data
->
chip_type
=
kind
;
strlcpy
(
info
->
type
,
name
,
I2C_NAME_SIZE
)
;
strlcpy
(
client
->
name
,
name
,
I2C_NAME_SIZE
);
return
0
;
}
static
int
adm1031_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
)
{
struct
adm1031_data
*
data
;
int
err
;
data
=
kzalloc
(
sizeof
(
struct
adm1031_data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
ENOMEM
;
goto
exit
;
}
i2c_set_clientdata
(
client
,
data
);
data
->
chip_type
=
id
->
driver_data
;
mutex_init
(
&
data
->
update_lock
);
/* Tell the I2C layer a new client has arrived */
if
((
err
=
i2c_attach_client
(
client
)))
goto
exit_free
;
if
(
data
->
chip_type
==
adm1030
)
data
->
chan_select_table
=
&
auto_channel_select_table_adm1030
;
else
data
->
chan_select_table
=
&
auto_channel_select_table_adm1031
;
/* Initialize the ADM1031 chip */
adm1031_init_client
(
client
);
/* Register sysfs hooks */
if
((
err
=
sysfs_create_group
(
&
client
->
dev
.
kobj
,
&
adm1031_group
)))
goto
exit_
detach
;
goto
exit_
free
;
if
(
kind
==
adm1031
)
{
if
(
data
->
chip_type
==
adm1031
)
{
if
((
err
=
sysfs_create_group
(
&
client
->
dev
.
kobj
,
&
adm1031_group_opt
)))
goto
exit_remove
;
...
...
@@ -847,25 +855,19 @@ static int adm1031_detect(struct i2c_adapter *adapter, int address, int kind)
exit_remove:
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
adm1031_group
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
adm1031_group_opt
);
exit_detach:
i2c_detach_client
(
client
);
exit_free:
kfree
(
data
);
exit:
return
err
;
}
static
int
adm1031_
detach_client
(
struct
i2c_client
*
client
)
static
int
adm1031_
remove
(
struct
i2c_client
*
client
)
{
struct
adm1031_data
*
data
=
i2c_get_clientdata
(
client
);
int
ret
;
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
adm1031_group
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
adm1031_group_opt
);
if
((
ret
=
i2c_detach_client
(
client
))
!=
0
)
{
return
ret
;
}
kfree
(
data
);
return
0
;
}
...
...
drivers/hwmon/adm9240.c
浏览文件 @
c43c1be0
...
...
@@ -130,25 +130,37 @@ static inline unsigned int AOUT_FROM_REG(u8 reg)
return
SCALE
(
reg
,
1250
,
255
);
}
static
int
adm9240_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
adm9240_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
adm9240_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
adm9240_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
void
adm9240_init_client
(
struct
i2c_client
*
client
);
static
int
adm9240_
detach_client
(
struct
i2c_client
*
client
);
static
int
adm9240_
remove
(
struct
i2c_client
*
client
);
static
struct
adm9240_data
*
adm9240_update_device
(
struct
device
*
dev
);
/* driver data */
static
const
struct
i2c_device_id
adm9240_id
[]
=
{
{
"adm9240"
,
adm9240
},
{
"ds1780"
,
ds1780
},
{
"lm81"
,
lm81
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
adm9240_id
);
static
struct
i2c_driver
adm9240_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"adm9240"
,
},
.
attach_adapter
=
adm9240_attach_adapter
,
.
detach_client
=
adm9240_detach_client
,
.
probe
=
adm9240_probe
,
.
remove
=
adm9240_remove
,
.
id_table
=
adm9240_id
,
.
detect
=
adm9240_detect
,
.
address_data
=
&
addr_data
,
};
/* per client data */
struct
adm9240_data
{
enum
chips
type
;
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
mutex
update_lock
;
char
valid
;
...
...
@@ -532,28 +544,17 @@ static const struct attribute_group adm9240_group = {
/*** sensor chip detect and driver install ***/
static
int
adm9240_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
adm9240_detect
(
struct
i2c_client
*
new_client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
struct
i2c_client
*
new_client
;
struct
adm9240_data
*
data
;
int
err
=
0
;
struct
i2c_adapter
*
adapter
=
new_client
->
adapter
;
const
char
*
name
=
""
;
int
address
=
new_client
->
addr
;
u8
man_id
,
die_rev
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
))
goto
exit
;
if
(
!
(
data
=
kzalloc
(
sizeof
(
*
data
),
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
exit
;
}
new_client
=
&
data
->
client
;
i2c_set_clientdata
(
new_client
,
data
);
new_client
->
addr
=
address
;
new_client
->
adapter
=
adapter
;
new_client
->
driver
=
&
adm9240_driver
;
new_client
->
flags
=
0
;
return
-
ENODEV
;
if
(
kind
==
0
)
{
kind
=
adm9240
;
...
...
@@ -566,7 +567,7 @@ static int adm9240_detect(struct i2c_adapter *adapter, int address, int kind)
!=
address
)
{
dev_err
(
&
adapter
->
dev
,
"detect fail: address match, "
"0x%02x
\n
"
,
address
);
goto
exit_free
;
return
-
ENODEV
;
}
/* check known chip manufacturer */
...
...
@@ -581,7 +582,7 @@ static int adm9240_detect(struct i2c_adapter *adapter, int address, int kind)
}
else
{
dev_err
(
&
adapter
->
dev
,
"detect fail: unknown manuf, "
"0x%02x
\n
"
,
man_id
);
goto
exit_free
;
return
-
ENODEV
;
}
/* successful detect, print chip info */
...
...
@@ -600,20 +601,31 @@ static int adm9240_detect(struct i2c_adapter *adapter, int address, int kind)
}
else
if
(
kind
==
lm81
)
{
name
=
"lm81"
;
}
strlcpy
(
info
->
type
,
name
,
I2C_NAME_SIZE
);
/* fill in the remaining client fields and attach */
strlcpy
(
new_client
->
name
,
name
,
I2C_NAME_SIZE
);
data
->
type
=
kind
;
mutex_init
(
&
data
->
update_lock
);
return
0
;
}
if
((
err
=
i2c_attach_client
(
new_client
)))
goto
exit_free
;
static
int
adm9240_probe
(
struct
i2c_client
*
new_client
,
const
struct
i2c_device_id
*
id
)
{
struct
adm9240_data
*
data
;
int
err
;
data
=
kzalloc
(
sizeof
(
*
data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
ENOMEM
;
goto
exit
;
}
i2c_set_clientdata
(
new_client
,
data
);
mutex_init
(
&
data
->
update_lock
);
adm9240_init_client
(
new_client
);
/* populate sysfs filesystem */
if
((
err
=
sysfs_create_group
(
&
new_client
->
dev
.
kobj
,
&
adm9240_group
)))
goto
exit_
detach
;
goto
exit_
free
;
data
->
hwmon_dev
=
hwmon_device_register
(
&
new_client
->
dev
);
if
(
IS_ERR
(
data
->
hwmon_dev
))
{
...
...
@@ -625,32 +637,19 @@ static int adm9240_detect(struct i2c_adapter *adapter, int address, int kind)
exit_remove:
sysfs_remove_group
(
&
new_client
->
dev
.
kobj
,
&
adm9240_group
);
exit_detach:
i2c_detach_client
(
new_client
);
exit_free:
kfree
(
data
);
exit:
return
err
;
}
static
int
adm9240_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
adm9240_detect
);
}
static
int
adm9240_detach_client
(
struct
i2c_client
*
client
)
static
int
adm9240_remove
(
struct
i2c_client
*
client
)
{
struct
adm9240_data
*
data
=
i2c_get_clientdata
(
client
);
int
err
;
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
adm9240_group
);
if
((
err
=
i2c_detach_client
(
client
)))
return
err
;
kfree
(
data
);
return
0
;
}
...
...
drivers/hwmon/ads7828.c
浏览文件 @
c43c1be0
...
...
@@ -64,7 +64,6 @@ static unsigned int ads7828_lsb_resol; /* resolution of the ADC sample lsb */
/* Each client has this additional data */
struct
ads7828_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
mutex
update_lock
;
/* mutex protect updates */
char
valid
;
/* !=0 if following fields are valid */
...
...
@@ -73,7 +72,10 @@ struct ads7828_data {
};
/* Function declaration - necessary due to function dependencies */
static
int
ads7828_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
ads7828_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
int
ads7828_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
/* The ADS7828 returns the 12-bit sample in two bytes,
these are read as a word then byte-swapped */
...
...
@@ -156,58 +158,43 @@ static const struct attribute_group ads7828_group = {
.
attrs
=
ads7828_attributes
,
};
static
int
ads7828_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
ads7828_detect
);
}
static
int
ads7828_detach_client
(
struct
i2c_client
*
client
)
static
int
ads7828_remove
(
struct
i2c_client
*
client
)
{
struct
ads7828_data
*
data
=
i2c_get_clientdata
(
client
);
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
ads7828_group
);
i2c_detach_client
(
client
);
kfree
(
i2c_get_clientdata
(
client
));
return
0
;
}
static
const
struct
i2c_device_id
ads7828_id
[]
=
{
{
"ads7828"
,
ads7828
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
ads7828_id
);
/* This is the driver that will be inserted */
static
struct
i2c_driver
ads7828_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"ads7828"
,
},
.
attach_adapter
=
ads7828_attach_adapter
,
.
detach_client
=
ads7828_detach_client
,
.
probe
=
ads7828_probe
,
.
remove
=
ads7828_remove
,
.
id_table
=
ads7828_id
,
.
detect
=
ads7828_detect
,
.
address_data
=
&
addr_data
,
};
/* This function is called by i2c_probe */
static
int
ads7828_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
ads7828_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
struct
i2c_client
*
client
;
struct
ads7828_data
*
data
;
int
err
=
0
;
const
char
*
name
=
""
;
struct
i2c_adapter
*
adapter
=
client
->
adapter
;
/* Check we have a valid client */
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_READ_WORD_DATA
))
goto
exit
;
/* OK. For now, we presume we have a valid client. We now create the
client structure, even though we cannot fill it completely yet.
But it allows us to access ads7828_read_value. */
data
=
kzalloc
(
sizeof
(
struct
ads7828_data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
ENOMEM
;
goto
exit
;
}
client
=
&
data
->
client
;
i2c_set_clientdata
(
client
,
data
);
client
->
addr
=
address
;
client
->
adapter
=
adapter
;
client
->
driver
=
&
ads7828_driver
;
return
-
ENODEV
;
/* Now, we do the remaining detection. There is no identification
dedicated register so attempt to sanity check using knowledge of
...
...
@@ -225,32 +212,34 @@ static int ads7828_detect(struct i2c_adapter *adapter, int address, int kind)
printk
(
KERN_DEBUG
"%s : Doesn't look like an ads7828 device
\n
"
,
__func__
);
goto
exit_free
;
return
-
ENODEV
;
}
}
}
strlcpy
(
info
->
type
,
"ads7828"
,
I2C_NAME_SIZE
);
/* Determine the chip type - only one kind supported! */
if
(
kind
<=
0
)
kind
=
ads7828
;
return
0
;
}
if
(
kind
==
ads7828
)
name
=
"ads7828"
;
static
int
ads7828_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
)
{
struct
ads7828_data
*
data
;
int
err
;
/* Fill in the remaining client fields, put it into the global list */
strlcpy
(
client
->
name
,
name
,
I2C_NAME_SIZE
);
data
=
kzalloc
(
sizeof
(
struct
ads7828_data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
ENOMEM
;
goto
exit
;
}
i2c_set_clientdata
(
client
,
data
);
mutex_init
(
&
data
->
update_lock
);
/* Tell the I2C layer a new client has arrived */
err
=
i2c_attach_client
(
client
);
if
(
err
)
goto
exit_free
;
/* Register sysfs hooks */
err
=
sysfs_create_group
(
&
client
->
dev
.
kobj
,
&
ads7828_group
);
if
(
err
)
goto
exit_
detach
;
goto
exit_
free
;
data
->
hwmon_dev
=
hwmon_device_register
(
&
client
->
dev
);
if
(
IS_ERR
(
data
->
hwmon_dev
))
{
...
...
@@ -262,8 +251,6 @@ static int ads7828_detect(struct i2c_adapter *adapter, int address, int kind)
exit_remove:
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
ads7828_group
);
exit_detach:
i2c_detach_client
(
client
);
exit_free:
kfree
(
data
);
exit:
...
...
drivers/hwmon/adt7470.c
浏览文件 @
c43c1be0
...
...
@@ -138,7 +138,6 @@ I2C_CLIENT_INSMOD_1(adt7470);
#define FAN_DATA_VALID(x) ((x) && (x) != FAN_PERIOD_INVALID)
struct
adt7470_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
attribute_group
attrs
;
struct
mutex
lock
;
...
...
@@ -164,16 +163,28 @@ struct adt7470_data {
u8
pwm_auto_temp
[
ADT7470_PWM_COUNT
];
};
static
int
adt7470_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
adt7470_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
adt7470_detach_client
(
struct
i2c_client
*
client
);
static
int
adt7470_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
adt7470_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
int
adt7470_remove
(
struct
i2c_client
*
client
);
static
const
struct
i2c_device_id
adt7470_id
[]
=
{
{
"adt7470"
,
adt7470
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
adt7470_id
);
static
struct
i2c_driver
adt7470_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"adt7470"
,
},
.
attach_adapter
=
adt7470_attach_adapter
,
.
detach_client
=
adt7470_detach_client
,
.
probe
=
adt7470_probe
,
.
remove
=
adt7470_remove
,
.
id_table
=
adt7470_id
,
.
detect
=
adt7470_detect
,
.
address_data
=
&
addr_data
,
};
/*
...
...
@@ -1004,64 +1015,52 @@ static struct attribute *adt7470_attr[] =
NULL
};
static
int
adt7470_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
adt7470_detect
);
}
static
int
adt7470_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
adt7470_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
struct
i2c_client
*
client
;
struct
adt7470_data
*
data
;
int
err
=
0
;
struct
i2c_adapter
*
adapter
=
client
->
adapter
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
))
goto
exit
;
if
(
!
(
data
=
kzalloc
(
sizeof
(
struct
adt7470_data
),
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
exit
;
}
client
=
&
data
->
client
;
client
->
addr
=
address
;
client
->
adapter
=
adapter
;
client
->
driver
=
&
adt7470_driver
;
i2c_set_clientdata
(
client
,
data
);
mutex_init
(
&
data
->
lock
);
return
-
ENODEV
;
if
(
kind
<=
0
)
{
int
vendor
,
device
,
revision
;
vendor
=
i2c_smbus_read_byte_data
(
client
,
ADT7470_REG_VENDOR
);
if
(
vendor
!=
ADT7470_VENDOR
)
{
err
=
-
ENODEV
;
goto
exit_free
;
}
if
(
vendor
!=
ADT7470_VENDOR
)
return
-
ENODEV
;
device
=
i2c_smbus_read_byte_data
(
client
,
ADT7470_REG_DEVICE
);
if
(
device
!=
ADT7470_DEVICE
)
{
err
=
-
ENODEV
;
goto
exit_free
;
}
if
(
device
!=
ADT7470_DEVICE
)
return
-
ENODEV
;
revision
=
i2c_smbus_read_byte_data
(
client
,
ADT7470_REG_REVISION
);
if
(
revision
!=
ADT7470_REVISION
)
{
err
=
-
ENODEV
;
goto
exit_free
;
}
if
(
revision
!=
ADT7470_REVISION
)
return
-
ENODEV
;
}
else
dev_dbg
(
&
adapter
->
dev
,
"detection forced
\n
"
);
strlcpy
(
client
->
nam
e
,
"adt7470"
,
I2C_NAME_SIZE
);
strlcpy
(
info
->
typ
e
,
"adt7470"
,
I2C_NAME_SIZE
);
if
((
err
=
i2c_attach_client
(
client
)))
goto
exit_free
;
return
0
;
}
static
int
adt7470_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
)
{
struct
adt7470_data
*
data
;
int
err
;
data
=
kzalloc
(
sizeof
(
struct
adt7470_data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
ENOMEM
;
goto
exit
;
}
i2c_set_clientdata
(
client
,
data
);
mutex_init
(
&
data
->
lock
);
dev_info
(
&
client
->
dev
,
"%s chip found
\n
"
,
client
->
name
);
...
...
@@ -1071,7 +1070,7 @@ static int adt7470_detect(struct i2c_adapter *adapter, int address, int kind)
/* Register sysfs hooks */
data
->
attrs
.
attrs
=
adt7470_attr
;
if
((
err
=
sysfs_create_group
(
&
client
->
dev
.
kobj
,
&
data
->
attrs
)))
goto
exit_
detach
;
goto
exit_
free
;
data
->
hwmon_dev
=
hwmon_device_register
(
&
client
->
dev
);
if
(
IS_ERR
(
data
->
hwmon_dev
))
{
...
...
@@ -1083,21 +1082,18 @@ static int adt7470_detect(struct i2c_adapter *adapter, int address, int kind)
exit_remove:
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
data
->
attrs
);
exit_detach:
i2c_detach_client
(
client
);
exit_free:
kfree
(
data
);
exit:
return
err
;
}
static
int
adt7470_
detach_client
(
struct
i2c_client
*
client
)
static
int
adt7470_
remove
(
struct
i2c_client
*
client
)
{
struct
adt7470_data
*
data
=
i2c_get_clientdata
(
client
);
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
data
->
attrs
);
i2c_detach_client
(
client
);
kfree
(
data
);
return
0
;
}
...
...
drivers/hwmon/adt7473.c
浏览文件 @
c43c1be0
...
...
@@ -143,7 +143,6 @@ I2C_CLIENT_INSMOD_1(adt7473);
#define FAN_DATA_VALID(x) ((x) && (x) != FAN_PERIOD_INVALID)
struct
adt7473_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
attribute_group
attrs
;
struct
mutex
lock
;
...
...
@@ -178,16 +177,28 @@ struct adt7473_data {
u8
max_duty_at_overheat
;
};
static
int
adt7473_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
adt7473_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
adt7473_detach_client
(
struct
i2c_client
*
client
);
static
int
adt7473_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
adt7473_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
int
adt7473_remove
(
struct
i2c_client
*
client
);
static
const
struct
i2c_device_id
adt7473_id
[]
=
{
{
"adt7473"
,
adt7473
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
adt7473_id
);
static
struct
i2c_driver
adt7473_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"adt7473"
,
},
.
attach_adapter
=
adt7473_attach_adapter
,
.
detach_client
=
adt7473_detach_client
,
.
probe
=
adt7473_probe
,
.
remove
=
adt7473_remove
,
.
id_table
=
adt7473_id
,
.
detect
=
adt7473_detect
,
.
address_data
=
&
addr_data
,
};
/*
...
...
@@ -1042,66 +1053,52 @@ static struct attribute *adt7473_attr[] =
NULL
};
static
int
adt7473_attach_adapter
(
struct
i2c_adapter
*
adapter
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
adt7473_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
adt7473_detect
);
}
static
int
adt7473_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
{
struct
i2c_client
*
client
;
struct
adt7473_data
*
data
;
int
err
=
0
;
struct
i2c_adapter
*
adapter
=
client
->
adapter
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
))
goto
exit
;
data
=
kzalloc
(
sizeof
(
struct
adt7473_data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
ENOMEM
;
goto
exit
;
}
client
=
&
data
->
client
;
client
->
addr
=
address
;
client
->
adapter
=
adapter
;
client
->
driver
=
&
adt7473_driver
;
i2c_set_clientdata
(
client
,
data
);
mutex_init
(
&
data
->
lock
);
return
-
ENODEV
;
if
(
kind
<=
0
)
{
int
vendor
,
device
,
revision
;
vendor
=
i2c_smbus_read_byte_data
(
client
,
ADT7473_REG_VENDOR
);
if
(
vendor
!=
ADT7473_VENDOR
)
{
err
=
-
ENODEV
;
goto
exit_free
;
}
if
(
vendor
!=
ADT7473_VENDOR
)
return
-
ENODEV
;
device
=
i2c_smbus_read_byte_data
(
client
,
ADT7473_REG_DEVICE
);
if
(
device
!=
ADT7473_DEVICE
)
{
err
=
-
ENODEV
;
goto
exit_free
;
}
if
(
device
!=
ADT7473_DEVICE
)
return
-
ENODEV
;
revision
=
i2c_smbus_read_byte_data
(
client
,
ADT7473_REG_REVISION
);
if
(
revision
!=
ADT7473_REV_68
&&
revision
!=
ADT7473_REV_69
)
{
err
=
-
ENODEV
;
goto
exit_free
;
}
if
(
revision
!=
ADT7473_REV_68
&&
revision
!=
ADT7473_REV_69
)
return
-
ENODEV
;
}
else
dev_dbg
(
&
adapter
->
dev
,
"detection forced
\n
"
);
strlcpy
(
client
->
nam
e
,
"adt7473"
,
I2C_NAME_SIZE
);
strlcpy
(
info
->
typ
e
,
"adt7473"
,
I2C_NAME_SIZE
);
err
=
i2c_attach_client
(
client
);
if
(
err
)
goto
exit_free
;
return
0
;
}
static
int
adt7473_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
)
{
struct
adt7473_data
*
data
;
int
err
;
data
=
kzalloc
(
sizeof
(
struct
adt7473_data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
ENOMEM
;
goto
exit
;
}
i2c_set_clientdata
(
client
,
data
);
mutex_init
(
&
data
->
lock
);
dev_info
(
&
client
->
dev
,
"%s chip found
\n
"
,
client
->
name
);
...
...
@@ -1112,7 +1109,7 @@ static int adt7473_detect(struct i2c_adapter *adapter, int address, int kind)
data
->
attrs
.
attrs
=
adt7473_attr
;
err
=
sysfs_create_group
(
&
client
->
dev
.
kobj
,
&
data
->
attrs
);
if
(
err
)
goto
exit_
detach
;
goto
exit_
free
;
data
->
hwmon_dev
=
hwmon_device_register
(
&
client
->
dev
);
if
(
IS_ERR
(
data
->
hwmon_dev
))
{
...
...
@@ -1124,21 +1121,18 @@ static int adt7473_detect(struct i2c_adapter *adapter, int address, int kind)
exit_remove:
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
data
->
attrs
);
exit_detach:
i2c_detach_client
(
client
);
exit_free:
kfree
(
data
);
exit:
return
err
;
}
static
int
adt7473_
detach_client
(
struct
i2c_client
*
client
)
static
int
adt7473_
remove
(
struct
i2c_client
*
client
)
{
struct
adt7473_data
*
data
=
i2c_get_clientdata
(
client
);
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
data
->
attrs
);
i2c_detach_client
(
client
);
kfree
(
data
);
return
0
;
}
...
...
drivers/hwmon/asb100.c
浏览文件 @
c43c1be0
...
...
@@ -176,10 +176,8 @@ static u8 DIV_TO_REG(long val)
data is pointed to by client->data. The structure itself is
dynamically allocated, at the same time the client itself is allocated. */
struct
asb100_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
mutex
lock
;
enum
chips
type
;
struct
mutex
update_lock
;
unsigned
long
last_updated
;
/* In jiffies */
...
...
@@ -206,18 +204,30 @@ struct asb100_data {
static
int
asb100_read_value
(
struct
i2c_client
*
client
,
u16
reg
);
static
void
asb100_write_value
(
struct
i2c_client
*
client
,
u16
reg
,
u16
val
);
static
int
asb100_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
asb100_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
asb100_detach_client
(
struct
i2c_client
*
client
);
static
int
asb100_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
asb100_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
int
asb100_remove
(
struct
i2c_client
*
client
);
static
struct
asb100_data
*
asb100_update_device
(
struct
device
*
dev
);
static
void
asb100_init_client
(
struct
i2c_client
*
client
);
static
const
struct
i2c_device_id
asb100_id
[]
=
{
{
"asb100"
,
asb100
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
asb100_id
);
static
struct
i2c_driver
asb100_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"asb100"
,
},
.
attach_adapter
=
asb100_attach_adapter
,
.
detach_client
=
asb100_detach_client
,
.
probe
=
asb100_probe
,
.
remove
=
asb100_remove
,
.
id_table
=
asb100_id
,
.
detect
=
asb100_detect
,
.
address_data
=
&
addr_data
,
};
/* 7 Voltages */
...
...
@@ -619,35 +629,13 @@ static const struct attribute_group asb100_group = {
.
attrs
=
asb100_attributes
,
};
/* This function is called when:
asb100_driver is inserted (when this module is loaded), for each
available adapter
when a new adapter is inserted (and asb100_driver is still present)
*/
static
int
asb100_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
asb100_detect
);
}
static
int
asb100_detect_subclients
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
,
struct
i2c_client
*
client
)
static
int
asb100_detect_subclients
(
struct
i2c_client
*
client
)
{
int
i
,
id
,
err
;
int
address
=
client
->
addr
;
unsigned
short
sc_addr
[
2
];
struct
asb100_data
*
data
=
i2c_get_clientdata
(
client
);
data
->
lm75
[
0
]
=
kzalloc
(
sizeof
(
struct
i2c_client
),
GFP_KERNEL
);
if
(
!
(
data
->
lm75
[
0
]))
{
err
=
-
ENOMEM
;
goto
ERROR_SC_0
;
}
data
->
lm75
[
1
]
=
kzalloc
(
sizeof
(
struct
i2c_client
),
GFP_KERNEL
);
if
(
!
(
data
->
lm75
[
1
]))
{
err
=
-
ENOMEM
;
goto
ERROR_SC_1
;
}
struct
i2c_adapter
*
adapter
=
client
->
adapter
;
id
=
i2c_adapter_id
(
adapter
);
...
...
@@ -665,37 +653,34 @@ static int asb100_detect_subclients(struct i2c_adapter *adapter, int address,
asb100_write_value
(
client
,
ASB100_REG_I2C_SUBADDR
,
(
force_subclients
[
2
]
&
0x07
)
|
((
force_subclients
[
3
]
&
0x07
)
<<
4
));
data
->
lm75
[
0
]
->
addr
=
force_subclients
[
2
];
data
->
lm75
[
1
]
->
addr
=
force_subclients
[
3
];
sc_addr
[
0
]
=
force_subclients
[
2
];
sc_addr
[
1
]
=
force_subclients
[
3
];
}
else
{
int
val
=
asb100_read_value
(
client
,
ASB100_REG_I2C_SUBADDR
);
data
->
lm75
[
0
]
->
addr
=
0x48
+
(
val
&
0x07
);
data
->
lm75
[
1
]
->
addr
=
0x48
+
((
val
>>
4
)
&
0x07
);
sc_addr
[
0
]
=
0x48
+
(
val
&
0x07
);
sc_addr
[
1
]
=
0x48
+
((
val
>>
4
)
&
0x07
);
}
if
(
data
->
lm75
[
0
]
->
addr
==
data
->
lm75
[
1
]
->
addr
)
{
if
(
sc_addr
[
0
]
==
sc_addr
[
1
]
)
{
dev_err
(
&
client
->
dev
,
"duplicate addresses 0x%x "
"for subclients
\n
"
,
data
->
lm75
[
0
]
->
addr
);
"for subclients
\n
"
,
sc_addr
[
0
]
);
err
=
-
ENODEV
;
goto
ERROR_SC_2
;
}
for
(
i
=
0
;
i
<=
1
;
i
++
)
{
i2c_set_clientdata
(
data
->
lm75
[
i
],
NULL
);
data
->
lm75
[
i
]
->
adapter
=
adapter
;
data
->
lm75
[
i
]
->
driver
=
&
asb100_driver
;
strlcpy
(
data
->
lm75
[
i
]
->
name
,
"asb100 subclient"
,
I2C_NAME_SIZE
);
}
if
((
err
=
i2c_attach_client
(
data
->
lm75
[
0
])))
{
data
->
lm75
[
0
]
=
i2c_new_dummy
(
adapter
,
sc_addr
[
0
]);
if
(
!
data
->
lm75
[
0
])
{
dev_err
(
&
client
->
dev
,
"subclient %d registration "
"at address 0x%x failed.
\n
"
,
i
,
data
->
lm75
[
0
]
->
addr
);
"at address 0x%x failed.
\n
"
,
1
,
sc_addr
[
0
]);
err
=
-
ENOMEM
;
goto
ERROR_SC_2
;
}
if
((
err
=
i2c_attach_client
(
data
->
lm75
[
1
])))
{
data
->
lm75
[
1
]
=
i2c_new_dummy
(
adapter
,
sc_addr
[
1
]);
if
(
!
data
->
lm75
[
1
])
{
dev_err
(
&
client
->
dev
,
"subclient %d registration "
"at address 0x%x failed.
\n
"
,
i
,
data
->
lm75
[
1
]
->
addr
);
"at address 0x%x failed.
\n
"
,
2
,
sc_addr
[
1
]);
err
=
-
ENOMEM
;
goto
ERROR_SC_3
;
}
...
...
@@ -703,55 +688,31 @@ static int asb100_detect_subclients(struct i2c_adapter *adapter, int address,
/* Undo inits in case of errors */
ERROR_SC_3:
i2c_
detach_client
(
data
->
lm75
[
0
]);
i2c_
unregister_device
(
data
->
lm75
[
0
]);
ERROR_SC_2:
kfree
(
data
->
lm75
[
1
]);
ERROR_SC_1:
kfree
(
data
->
lm75
[
0
]);
ERROR_SC_0:
return
err
;
}
static
int
asb100_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
asb100_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
int
err
;
struct
i2c_client
*
client
;
struct
asb100_data
*
data
;
struct
i2c_adapter
*
adapter
=
client
->
adapter
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
))
{
pr_debug
(
"asb100.o: detect failed, "
"smbus byte data not supported!
\n
"
);
err
=
-
ENODEV
;
goto
ERROR0
;
return
-
ENODEV
;
}
/* OK. For now, we presume we have a valid client. We now create the
client structure, even though we cannot fill it completely yet.
But it allows us to access asb100_{read,write}_value. */
if
(
!
(
data
=
kzalloc
(
sizeof
(
struct
asb100_data
),
GFP_KERNEL
)))
{
pr_debug
(
"asb100.o: detect failed, kzalloc failed!
\n
"
);
err
=
-
ENOMEM
;
goto
ERROR0
;
}
client
=
&
data
->
client
;
mutex_init
(
&
data
->
lock
);
i2c_set_clientdata
(
client
,
data
);
client
->
addr
=
address
;
client
->
adapter
=
adapter
;
client
->
driver
=
&
asb100_driver
;
/* Now, we do the remaining detection. */
/* The chip may be stuck in some other bank than bank 0. This may
make reading other information impossible. Specify a force=... or
force_*=... parameter, and the chip will be reset to the right
bank. */
if
(
kind
<
0
)
{
int
val1
=
asb100_read_value
(
client
,
ASB100_REG_BANK
);
int
val2
=
asb100_read_value
(
client
,
ASB100_REG_CHIPMAN
);
int
val1
=
i2c_smbus_read_byte_data
(
client
,
ASB100_REG_BANK
);
int
val2
=
i2c_smbus_read_byte_data
(
client
,
ASB100_REG_CHIPMAN
);
/* If we're in bank 0 */
if
((
!
(
val1
&
0x07
))
&&
...
...
@@ -761,48 +722,60 @@ static int asb100_detect(struct i2c_adapter *adapter, int address, int kind)
((
val1
&
0x80
)
&&
(
val2
!=
0x06
))))
{
pr_debug
(
"asb100.o: detect failed, "
"bad chip id 0x%02x!
\n
"
,
val2
);
err
=
-
ENODEV
;
goto
ERROR1
;
return
-
ENODEV
;
}
}
/* kind < 0 */
/* We have either had a force parameter, or we have already detected
Winbond. Put it now into bank 0 and Vendor ID High Byte */
asb100_write_value
(
client
,
ASB100_REG_BANK
,
(
asb100_read_value
(
client
,
ASB100_REG_BANK
)
&
0x78
)
|
0x80
);
i2c_smbus_write_byte_data
(
client
,
ASB100_REG_BANK
,
(
i2c_smbus_read_byte_data
(
client
,
ASB100_REG_BANK
)
&
0x78
)
|
0x80
);
/* Determine the chip type. */
if
(
kind
<=
0
)
{
int
val1
=
asb100_read_value
(
client
,
ASB100_REG_WCHIPID
);
int
val2
=
asb100_read_value
(
client
,
ASB100_REG_CHIPMAN
);
int
val1
=
i2c_smbus_read_byte_data
(
client
,
ASB100_REG_WCHIPID
);
int
val2
=
i2c_smbus_read_byte_data
(
client
,
ASB100_REG_CHIPMAN
);
if
((
val1
==
0x31
)
&&
(
val2
==
0x06
))
kind
=
asb100
;
else
{
if
(
kind
==
0
)
dev_warn
(
&
client
->
dev
,
"ignoring "
dev_warn
(
&
adapter
->
dev
,
"ignoring "
"'force' parameter for unknown chip "
"at adapter %d, address 0x%02x.
\n
"
,
i2c_adapter_id
(
adapter
),
address
);
err
=
-
ENODEV
;
goto
ERROR1
;
i2c_adapter_id
(
adapter
),
client
->
addr
);
return
-
ENODEV
;
}
}
/* Fill in remaining client fields and put it into the global list */
strlcpy
(
client
->
name
,
"asb100"
,
I2C_NAME_SIZE
);
data
->
type
=
kind
;
mutex_init
(
&
data
->
update_lock
);
strlcpy
(
info
->
type
,
"asb100"
,
I2C_NAME_SIZE
);
/* Tell the I2C layer a new client has arrived */
if
((
err
=
i2c_attach_client
(
client
)))
goto
ERROR1
;
return
0
;
}
static
int
asb100_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
)
{
int
err
;
struct
asb100_data
*
data
;
data
=
kzalloc
(
sizeof
(
struct
asb100_data
),
GFP_KERNEL
);
if
(
!
data
)
{
pr_debug
(
"asb100.o: probe failed, kzalloc failed!
\n
"
);
err
=
-
ENOMEM
;
goto
ERROR0
;
}
i2c_set_clientdata
(
client
,
data
);
mutex_init
(
&
data
->
lock
);
mutex_init
(
&
data
->
update_lock
);
/* Attach secondary lm75 clients */
if
((
err
=
asb100_detect_subclients
(
adapter
,
address
,
kind
,
client
))
)
goto
ERROR
2
;
err
=
asb100_detect_subclients
(
client
);
if
(
err
)
goto
ERROR
1
;
/* Initialize the chip */
asb100_init_client
(
client
);
...
...
@@ -827,39 +800,25 @@ static int asb100_detect(struct i2c_adapter *adapter, int address, int kind)
ERROR4:
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
asb100_group
);
ERROR3:
i2c_detach_client
(
data
->
lm75
[
1
]);
i2c_detach_client
(
data
->
lm75
[
0
]);
kfree
(
data
->
lm75
[
1
]);
kfree
(
data
->
lm75
[
0
]);
ERROR2:
i2c_detach_client
(
client
);
i2c_unregister_device
(
data
->
lm75
[
1
]);
i2c_unregister_device
(
data
->
lm75
[
0
]);
ERROR1:
kfree
(
data
);
ERROR0:
return
err
;
}
static
int
asb100_
detach_client
(
struct
i2c_client
*
client
)
static
int
asb100_
remove
(
struct
i2c_client
*
client
)
{
struct
asb100_data
*
data
=
i2c_get_clientdata
(
client
);
int
err
;
/* main client */
if
(
data
)
{
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
asb100_group
);
}
if
((
err
=
i2c_detach_client
(
client
)))
return
err
;
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
asb100_group
)
;
/* main client */
if
(
data
)
kfree
(
data
);
i2c_unregister_device
(
data
->
lm75
[
1
]);
i2c_unregister_device
(
data
->
lm75
[
0
]);
/* subclient */
else
kfree
(
client
);
kfree
(
data
);
return
0
;
}
...
...
drivers/hwmon/atxp1.c
浏览文件 @
c43c1be0
...
...
@@ -46,21 +46,32 @@ static const unsigned short normal_i2c[] = { 0x37, 0x4e, I2C_CLIENT_END };
I2C_CLIENT_INSMOD_1
(
atxp1
);
static
int
atxp1_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
atxp1_detach_client
(
struct
i2c_client
*
client
);
static
int
atxp1_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
atxp1_remove
(
struct
i2c_client
*
client
);
static
struct
atxp1_data
*
atxp1_update_device
(
struct
device
*
dev
);
static
int
atxp1_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
atxp1_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
const
struct
i2c_device_id
atxp1_id
[]
=
{
{
"atxp1"
,
atxp1
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
atxp1_id
);
static
struct
i2c_driver
atxp1_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"atxp1"
,
},
.
attach_adapter
=
atxp1_attach_adapter
,
.
detach_client
=
atxp1_detach_client
,
.
probe
=
atxp1_probe
,
.
remove
=
atxp1_remove
,
.
id_table
=
atxp1_id
,
.
detect
=
atxp1_detect
,
.
address_data
=
&
addr_data
,
};
struct
atxp1_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
mutex
update_lock
;
unsigned
long
last_updated
;
...
...
@@ -263,35 +274,16 @@ static const struct attribute_group atxp1_group = {
};
static
int
atxp1_attach_adapter
(
struct
i2c_adapter
*
adapter
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
atxp1_detect
(
struct
i2c_client
*
new_client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
&
atxp1_detect
);
};
struct
i2c_adapter
*
adapter
=
new_client
->
adapter
;
static
int
atxp1_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
{
struct
i2c_client
*
new_client
;
struct
atxp1_data
*
data
;
int
err
=
0
;
u8
temp
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
))
goto
exit
;
if
(
!
(
data
=
kzalloc
(
sizeof
(
struct
atxp1_data
),
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
exit
;
}
new_client
=
&
data
->
client
;
i2c_set_clientdata
(
new_client
,
data
);
new_client
->
addr
=
address
;
new_client
->
adapter
=
adapter
;
new_client
->
driver
=
&
atxp1_driver
;
new_client
->
flags
=
0
;
return
-
ENODEV
;
/* Detect ATXP1, checking if vendor ID registers are all zero */
if
(
!
((
i2c_smbus_read_byte_data
(
new_client
,
0x3e
)
==
0
)
&&
...
...
@@ -305,35 +297,46 @@ static int atxp1_detect(struct i2c_adapter *adapter, int address, int kind)
if
(
!
((
i2c_smbus_read_byte_data
(
new_client
,
0x10
)
==
temp
)
&&
(
i2c_smbus_read_byte_data
(
new_client
,
0x11
)
==
temp
)
))
goto
exit_free
;
return
-
ENODEV
;
}
/* Get VRM */
data
->
vrm
=
vid_which_vrm
();
temp
=
vid_which_vrm
();
if
((
data
->
vrm
!=
90
)
&&
(
data
->
vrm
!=
91
))
{
dev_err
(
&
new_client
->
dev
,
"
Not supporting VRM %d.%d
\n
"
,
data
->
vrm
/
10
,
data
->
vrm
%
10
);
goto
exit_free
;
if
((
temp
!=
90
)
&&
(
temp
!=
91
))
{
dev_err
(
&
adapter
->
dev
,
"atxp1:
Not supporting VRM %d.%d
\n
"
,
temp
/
10
,
temp
%
10
);
return
-
ENODEV
;
}
strncpy
(
new_client
->
name
,
"atxp1"
,
I2C_NAME_SIZE
);
data
->
valid
=
0
;
strlcpy
(
info
->
type
,
"atxp1"
,
I2C_NAME_SIZE
);
mutex_init
(
&
data
->
update_lock
);
return
0
;
}
err
=
i2c_attach_client
(
new_client
);
static
int
atxp1_probe
(
struct
i2c_client
*
new_client
,
const
struct
i2c_device_id
*
id
)
{
struct
atxp1_data
*
data
;
int
err
;
if
(
err
)
{
dev_err
(
&
new_client
->
dev
,
"Attach client error.
\n
"
)
;
goto
exit
_free
;
data
=
kzalloc
(
sizeof
(
struct
atxp1_data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
ENOMEM
;
goto
exit
;
}
/* Get VRM */
data
->
vrm
=
vid_which_vrm
();
i2c_set_clientdata
(
new_client
,
data
);
data
->
valid
=
0
;
mutex_init
(
&
data
->
update_lock
);
/* Register sysfs hooks */
if
((
err
=
sysfs_create_group
(
&
new_client
->
dev
.
kobj
,
&
atxp1_group
)))
goto
exit_
detach
;
goto
exit_
free
;
data
->
hwmon_dev
=
hwmon_device_register
(
&
new_client
->
dev
);
if
(
IS_ERR
(
data
->
hwmon_dev
))
{
...
...
@@ -348,30 +351,22 @@ static int atxp1_detect(struct i2c_adapter *adapter, int address, int kind)
exit_remove_files:
sysfs_remove_group
(
&
new_client
->
dev
.
kobj
,
&
atxp1_group
);
exit_detach:
i2c_detach_client
(
new_client
);
exit_free:
kfree
(
data
);
exit:
return
err
;
};
static
int
atxp1_
detach_client
(
struct
i2c_client
*
client
)
static
int
atxp1_
remove
(
struct
i2c_client
*
client
)
{
struct
atxp1_data
*
data
=
i2c_get_clientdata
(
client
);
int
err
;
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
atxp1_group
);
err
=
i2c_detach_client
(
client
);
if
(
err
)
dev_err
(
&
client
->
dev
,
"Failed to detach client.
\n
"
);
else
kfree
(
data
);
kfree
(
data
);
return
err
;
return
0
;
};
static
int
__init
atxp1_init
(
void
)
...
...
drivers/hwmon/ds1621.c
浏览文件 @
c43c1be0
...
...
@@ -72,7 +72,6 @@ static const u8 DS1621_REG_TEMP[3] = {
/* Each client has this additional data */
struct
ds1621_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
mutex
update_lock
;
char
valid
;
/* !=0 if following fields are valid */
...
...
@@ -82,20 +81,32 @@ struct ds1621_data {
u8
conf
;
/* Register encoding, combined */
};
static
int
ds1621_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
ds1621_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
ds1621_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
ds1621_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
void
ds1621_init_client
(
struct
i2c_client
*
client
);
static
int
ds1621_
detach_client
(
struct
i2c_client
*
client
);
static
int
ds1621_
remove
(
struct
i2c_client
*
client
);
static
struct
ds1621_data
*
ds1621_update_client
(
struct
device
*
dev
);
static
const
struct
i2c_device_id
ds1621_id
[]
=
{
{
"ds1621"
,
ds1621
},
{
"ds1625"
,
ds1621
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
ds1621_id
);
/* This is the driver that will be inserted */
static
struct
i2c_driver
ds1621_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"ds1621"
,
},
.
attach_adapter
=
ds1621_attach_adapter
,
.
detach_client
=
ds1621_detach_client
,
.
probe
=
ds1621_probe
,
.
remove
=
ds1621_remove
,
.
id_table
=
ds1621_id
,
.
detect
=
ds1621_detect
,
.
address_data
=
&
addr_data
,
};
/* All registers are word-sized, except for the configuration register.
...
...
@@ -199,40 +210,18 @@ static const struct attribute_group ds1621_group = {
};
static
int
ds1621_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
ds1621_detect
);
}
/* This function is called by i2c_probe */
static
int
ds1621_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
ds1621_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
struct
i2c_adapter
*
adapter
=
client
->
adapter
;
int
conf
,
temp
;
struct
i2c_client
*
client
;
struct
ds1621_data
*
data
;
int
i
,
err
=
0
;
int
i
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
|
I2C_FUNC_SMBUS_WORD_DATA
|
I2C_FUNC_SMBUS_WRITE_BYTE
))
goto
exit
;
/* OK. For now, we presume we have a valid client. We now create the
client structure, even though we cannot fill it completely yet.
But it allows us to access ds1621_{read,write}_value. */
if
(
!
(
data
=
kzalloc
(
sizeof
(
struct
ds1621_data
),
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
exit
;
}
client
=
&
data
->
client
;
i2c_set_clientdata
(
client
,
data
);
client
->
addr
=
address
;
client
->
adapter
=
adapter
;
client
->
driver
=
&
ds1621_driver
;
return
-
ENODEV
;
/* Now, we do the remaining detection. It is lousy. */
if
(
kind
<
0
)
{
...
...
@@ -241,29 +230,41 @@ static int ds1621_detect(struct i2c_adapter *adapter, int address,
improbable in our case. */
conf
=
ds1621_read_value
(
client
,
DS1621_REG_CONF
);
if
(
conf
&
DS1621_REG_CONFIG_NVB
)
goto
exit_free
;
return
-
ENODEV
;
/* The 7 lowest bits of a temperature should always be 0. */
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
data
->
temp
);
i
++
)
{
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
DS1621_REG_TEMP
);
i
++
)
{
temp
=
ds1621_read_value
(
client
,
DS1621_REG_TEMP
[
i
]);
if
(
temp
&
0x007f
)
goto
exit_free
;
return
-
ENODEV
;
}
}
/* Fill in remaining client fields and put it into the global list */
strlcpy
(
client
->
name
,
"ds1621"
,
I2C_NAME_SIZE
);
mutex_init
(
&
data
->
update_lock
);
strlcpy
(
info
->
type
,
"ds1621"
,
I2C_NAME_SIZE
);
/* Tell the I2C layer a new client has arrived */
if
((
err
=
i2c_attach_client
(
client
)))
goto
exit_free
;
return
0
;
}
static
int
ds1621_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
)
{
struct
ds1621_data
*
data
;
int
err
;
data
=
kzalloc
(
sizeof
(
struct
ds1621_data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
ENOMEM
;
goto
exit
;
}
i2c_set_clientdata
(
client
,
data
);
mutex_init
(
&
data
->
update_lock
);
/* Initialize the DS1621 chip */
ds1621_init_client
(
client
);
/* Register sysfs hooks */
if
((
err
=
sysfs_create_group
(
&
client
->
dev
.
kobj
,
&
ds1621_group
)))
goto
exit_
detach
;
goto
exit_
free
;
data
->
hwmon_dev
=
hwmon_device_register
(
&
client
->
dev
);
if
(
IS_ERR
(
data
->
hwmon_dev
))
{
...
...
@@ -275,25 +276,19 @@ static int ds1621_detect(struct i2c_adapter *adapter, int address,
exit_remove_files:
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
ds1621_group
);
exit_detach:
i2c_detach_client
(
client
);
exit_free:
kfree
(
data
);
exit:
return
err
;
}
static
int
ds1621_
detach_client
(
struct
i2c_client
*
client
)
static
int
ds1621_
remove
(
struct
i2c_client
*
client
)
{
struct
ds1621_data
*
data
=
i2c_get_clientdata
(
client
);
int
err
;
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
ds1621_group
);
if
((
err
=
i2c_detach_client
(
client
)))
return
err
;
kfree
(
data
);
return
0
;
...
...
drivers/hwmon/f75375s.c
浏览文件 @
c43c1be0
...
...
@@ -87,7 +87,6 @@ I2C_CLIENT_INSMOD_2(f75373, f75375);
struct
f75375_data
{
unsigned
short
addr
;
struct
i2c_client
*
client
;
struct
device
*
hwmon_dev
;
const
char
*
name
;
...
...
@@ -114,21 +113,12 @@ struct f75375_data {
s8
temp_max_hyst
[
2
];
};
static
int
f75375_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
f75375_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
f75375_detach_client
(
struct
i2c_client
*
client
);
static
int
f75375_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
int
f75375_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
f75375_remove
(
struct
i2c_client
*
client
);
static
struct
i2c_driver
f75375_legacy_driver
=
{
.
driver
=
{
.
name
=
"f75375_legacy"
,
},
.
attach_adapter
=
f75375_attach_adapter
,
.
detach_client
=
f75375_detach_client
,
};
static
const
struct
i2c_device_id
f75375_id
[]
=
{
{
"f75373"
,
f75373
},
{
"f75375"
,
f75375
},
...
...
@@ -137,12 +127,15 @@ static const struct i2c_device_id f75375_id[] = {
MODULE_DEVICE_TABLE
(
i2c
,
f75375_id
);
static
struct
i2c_driver
f75375_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"f75375"
,
},
.
probe
=
f75375_probe
,
.
remove
=
f75375_remove
,
.
id_table
=
f75375_id
,
.
detect
=
f75375_detect
,
.
address_data
=
&
addr_data
,
};
static
inline
int
f75375_read8
(
struct
i2c_client
*
client
,
u8
reg
)
...
...
@@ -607,22 +600,6 @@ static const struct attribute_group f75375_group = {
.
attrs
=
f75375_attributes
,
};
static
int
f75375_detach_client
(
struct
i2c_client
*
client
)
{
int
err
;
f75375_remove
(
client
);
err
=
i2c_detach_client
(
client
);
if
(
err
)
{
dev_err
(
&
client
->
dev
,
"Client deregistration failed, "
"client not detached.
\n
"
);
return
err
;
}
kfree
(
client
);
return
0
;
}
static
void
f75375_init
(
struct
i2c_client
*
client
,
struct
f75375_data
*
data
,
struct
f75375s_platform_data
*
f75375s_pdata
)
{
...
...
@@ -651,7 +628,6 @@ static int f75375_probe(struct i2c_client *client,
return
-
ENOMEM
;
i2c_set_clientdata
(
client
,
data
);
data
->
client
=
client
;
mutex_init
(
&
data
->
update_lock
);
data
->
kind
=
id
->
driver_data
;
...
...
@@ -700,29 +676,13 @@ static int f75375_remove(struct i2c_client *client)
return
0
;
}
static
int
f75375_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
f75375_detect
);
}
/* This function is called by i2c_probe */
static
int
f75375_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
f75375_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
struct
i2c_
client
*
client
;
struct
i2c_
adapter
*
adapter
=
client
->
adapter
;
u8
version
=
0
;
int
err
=
0
;
const
char
*
name
=
""
;
struct
i2c_device_id
id
;
if
(
!
(
client
=
kzalloc
(
sizeof
(
*
client
),
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
exit
;
}
client
->
addr
=
address
;
client
->
adapter
=
adapter
;
client
->
driver
=
&
f75375_legacy_driver
;
if
(
kind
<
0
)
{
u16
vendid
=
f75375_read16
(
client
,
F75375_REG_VENDOR
);
...
...
@@ -736,7 +696,7 @@ static int f75375_detect(struct i2c_adapter *adapter, int address, int kind)
dev_err
(
&
adapter
->
dev
,
"failed,%02X,%02X,%02X
\n
"
,
chipid
,
version
,
vendid
);
goto
exit_free
;
return
-
ENODEV
;
}
}
...
...
@@ -746,43 +706,18 @@ static int f75375_detect(struct i2c_adapter *adapter, int address, int kind)
name
=
"f75373"
;
}
dev_info
(
&
adapter
->
dev
,
"found %s version: %02X
\n
"
,
name
,
version
);
strlcpy
(
client
->
name
,
name
,
I2C_NAME_SIZE
);
if
((
err
=
i2c_attach_client
(
client
)))
goto
exit_free
;
strlcpy
(
id
.
name
,
name
,
I2C_NAME_SIZE
);
id
.
driver_data
=
kind
;
if
((
err
=
f75375_probe
(
client
,
&
id
))
<
0
)
goto
exit_detach
;
strlcpy
(
info
->
type
,
name
,
I2C_NAME_SIZE
);
return
0
;
exit_detach:
i2c_detach_client
(
client
);
exit_free:
kfree
(
client
);
exit:
return
err
;
}
static
int
__init
sensors_f75375_init
(
void
)
{
int
status
;
status
=
i2c_add_driver
(
&
f75375_driver
);
if
(
status
)
return
status
;
status
=
i2c_add_driver
(
&
f75375_legacy_driver
);
if
(
status
)
i2c_del_driver
(
&
f75375_driver
);
return
status
;
return
i2c_add_driver
(
&
f75375_driver
);
}
static
void
__exit
sensors_f75375_exit
(
void
)
{
i2c_del_driver
(
&
f75375_legacy_driver
);
i2c_del_driver
(
&
f75375_driver
);
}
...
...
drivers/hwmon/fscher.c
浏览文件 @
c43c1be0
...
...
@@ -106,9 +106,11 @@ I2C_CLIENT_INSMOD_1(fscher);
* Functions declaration
*/
static
int
fscher_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
fscher_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
fscher_detach_client
(
struct
i2c_client
*
client
);
static
int
fscher_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
fscher_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
int
fscher_remove
(
struct
i2c_client
*
client
);
static
struct
fscher_data
*
fscher_update_device
(
struct
device
*
dev
);
static
void
fscher_init_client
(
struct
i2c_client
*
client
);
...
...
@@ -119,12 +121,21 @@ static int fscher_write_value(struct i2c_client *client, u8 reg, u8 value);
* Driver data (common to all clients)
*/
static
const
struct
i2c_device_id
fscher_id
[]
=
{
{
"fscher"
,
fscher
},
{
}
};
static
struct
i2c_driver
fscher_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"fscher"
,
},
.
attach_adapter
=
fscher_attach_adapter
,
.
detach_client
=
fscher_detach_client
,
.
probe
=
fscher_probe
,
.
remove
=
fscher_remove
,
.
id_table
=
fscher_id
,
.
detect
=
fscher_detect
,
.
address_data
=
&
addr_data
,
};
/*
...
...
@@ -132,7 +143,6 @@ static struct i2c_driver fscher_driver = {
*/
struct
fscher_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
mutex
update_lock
;
char
valid
;
/* zero until following fields are valid */
...
...
@@ -283,38 +293,14 @@ static const struct attribute_group fscher_group = {
* Real code
*/
static
int
fscher_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
fscher_detect
);
}
static
int
fscher_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
fscher_detect
(
struct
i2c_client
*
new_client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
struct
i2c_client
*
new_client
;
struct
fscher_data
*
data
;
int
err
=
0
;
struct
i2c_adapter
*
adapter
=
new_client
->
adapter
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
))
goto
exit
;
/* OK. For now, we presume we have a valid client. We now create the
* client structure, even though we cannot fill it completely yet.
* But it allows us to access i2c_smbus_read_byte_data. */
if
(
!
(
data
=
kzalloc
(
sizeof
(
struct
fscher_data
),
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
exit
;
}
/* The common I2C client data is placed right before the
* Hermes-specific data. */
new_client
=
&
data
->
client
;
i2c_set_clientdata
(
new_client
,
data
);
new_client
->
addr
=
address
;
new_client
->
adapter
=
adapter
;
new_client
->
driver
=
&
fscher_driver
;
new_client
->
flags
=
0
;
return
-
ENODEV
;
/* Do the remaining detection unless force or force_fscher parameter */
if
(
kind
<
0
)
{
...
...
@@ -324,24 +310,35 @@ static int fscher_detect(struct i2c_adapter *adapter, int address, int kind)
FSCHER_REG_IDENT_1
)
!=
0x45
)
/* 'E' */
||
(
i2c_smbus_read_byte_data
(
new_client
,
FSCHER_REG_IDENT_2
)
!=
0x52
))
/* 'R' */
goto
exit_free
;
return
-
ENODEV
;
}
strlcpy
(
info
->
type
,
"fscher"
,
I2C_NAME_SIZE
);
return
0
;
}
static
int
fscher_probe
(
struct
i2c_client
*
new_client
,
const
struct
i2c_device_id
*
id
)
{
struct
fscher_data
*
data
;
int
err
;
data
=
kzalloc
(
sizeof
(
struct
fscher_data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
ENOMEM
;
goto
exit
;
}
/* Fill in the remaining client fields and put it into the
* global list */
strlcpy
(
new_client
->
name
,
"fscher"
,
I2C_NAME_SIZE
);
i2c_set_clientdata
(
new_client
,
data
);
data
->
valid
=
0
;
mutex_init
(
&
data
->
update_lock
);
/* Tell the I2C layer a new client has arrived */
if
((
err
=
i2c_attach_client
(
new_client
)))
goto
exit_free
;
fscher_init_client
(
new_client
);
/* Register sysfs hooks */
if
((
err
=
sysfs_create_group
(
&
new_client
->
dev
.
kobj
,
&
fscher_group
)))
goto
exit_
detach
;
goto
exit_
free
;
data
->
hwmon_dev
=
hwmon_device_register
(
&
new_client
->
dev
);
if
(
IS_ERR
(
data
->
hwmon_dev
))
{
...
...
@@ -353,25 +350,19 @@ static int fscher_detect(struct i2c_adapter *adapter, int address, int kind)
exit_remove_files:
sysfs_remove_group
(
&
new_client
->
dev
.
kobj
,
&
fscher_group
);
exit_detach:
i2c_detach_client
(
new_client
);
exit_free:
kfree
(
data
);
exit:
return
err
;
}
static
int
fscher_
detach_client
(
struct
i2c_client
*
client
)
static
int
fscher_
remove
(
struct
i2c_client
*
client
)
{
struct
fscher_data
*
data
=
i2c_get_clientdata
(
client
);
int
err
;
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
fscher_group
);
if
((
err
=
i2c_detach_client
(
client
)))
return
err
;
kfree
(
data
);
return
0
;
}
...
...
drivers/hwmon/fschmd.c
浏览文件 @
c43c1be0
...
...
@@ -171,20 +171,37 @@ static const int FSCHMD_NO_TEMP_SENSORS[5] = { 3, 3, 4, 3, 5 };
* Functions declarations
*/
static
int
fschmd_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
fschmd_detach_client
(
struct
i2c_client
*
client
);
static
int
fschmd_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
fschmd_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
int
fschmd_remove
(
struct
i2c_client
*
client
);
static
struct
fschmd_data
*
fschmd_update_device
(
struct
device
*
dev
);
/*
* Driver data (common to all clients)
*/
static
const
struct
i2c_device_id
fschmd_id
[]
=
{
{
"fscpos"
,
fscpos
},
{
"fscher"
,
fscher
},
{
"fscscy"
,
fscscy
},
{
"fschrc"
,
fschrc
},
{
"fschmd"
,
fschmd
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
fschmd_id
);
static
struct
i2c_driver
fschmd_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
FSCHMD_NAME
,
},
.
attach_adapter
=
fschmd_attach_adapter
,
.
detach_client
=
fschmd_detach_client
,
.
probe
=
fschmd_probe
,
.
remove
=
fschmd_remove
,
.
id_table
=
fschmd_id
,
.
detect
=
fschmd_detect
,
.
address_data
=
&
addr_data
,
};
/*
...
...
@@ -192,7 +209,6 @@ static struct i2c_driver fschmd_driver = {
*/
struct
fschmd_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
mutex
update_lock
;
int
kind
;
...
...
@@ -269,7 +285,7 @@ static ssize_t store_temp_max(struct device *dev, struct device_attribute
v
=
SENSORS_LIMIT
(
v
,
-
128
,
127
)
+
128
;
mutex_lock
(
&
data
->
update_lock
);
i2c_smbus_write_byte_data
(
&
data
->
client
,
i2c_smbus_write_byte_data
(
to_i2c_client
(
dev
)
,
FSCHMD_REG_TEMP_LIMIT
[
data
->
kind
][
index
],
v
);
data
->
temp_max
[
index
]
=
v
;
mutex_unlock
(
&
data
->
update_lock
);
...
...
@@ -346,14 +362,14 @@ static ssize_t store_fan_div(struct device *dev, struct device_attribute
mutex_lock
(
&
data
->
update_lock
);
reg
=
i2c_smbus_read_byte_data
(
&
data
->
client
,
reg
=
i2c_smbus_read_byte_data
(
to_i2c_client
(
dev
)
,
FSCHMD_REG_FAN_RIPPLE
[
data
->
kind
][
index
]);
/* bits 2..7 reserved => mask with 0x03 */
reg
&=
~
0x03
;
reg
|=
v
;
i2c_smbus_write_byte_data
(
&
data
->
client
,
i2c_smbus_write_byte_data
(
to_i2c_client
(
dev
)
,
FSCHMD_REG_FAN_RIPPLE
[
data
->
kind
][
index
],
reg
);
data
->
fan_ripple
[
index
]
=
reg
;
...
...
@@ -416,7 +432,7 @@ static ssize_t store_pwm_auto_point1_pwm(struct device *dev,
mutex_lock
(
&
data
->
update_lock
);
i2c_smbus_write_byte_data
(
&
data
->
client
,
i2c_smbus_write_byte_data
(
to_i2c_client
(
dev
)
,
FSCHMD_REG_FAN_MIN
[
data
->
kind
][
index
],
v
);
data
->
fan_min
[
index
]
=
v
;
...
...
@@ -448,14 +464,14 @@ static ssize_t store_alert_led(struct device *dev,
mutex_lock
(
&
data
->
update_lock
);
reg
=
i2c_smbus_read_byte_data
(
&
data
->
client
,
FSCHMD_REG_CONTROL
);
reg
=
i2c_smbus_read_byte_data
(
to_i2c_client
(
dev
)
,
FSCHMD_REG_CONTROL
);
if
(
v
)
reg
|=
FSCHMD_CONTROL_ALERT_LED_MASK
;
else
reg
&=
~
FSCHMD_CONTROL_ALERT_LED_MASK
;
i2c_smbus_write_byte_data
(
&
data
->
client
,
FSCHMD_REG_CONTROL
,
reg
);
i2c_smbus_write_byte_data
(
to_i2c_client
(
dev
)
,
FSCHMD_REG_CONTROL
,
reg
);
data
->
global_control
=
reg
;
...
...
@@ -600,32 +616,15 @@ static void fschmd_dmi_decode(const struct dmi_header *header)
}
}
static
int
fschmd_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
static
int
fschmd_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
struct
i2c_client
*
client
;
struct
fschmd_data
*
data
;
u8
revision
;
const
char
*
const
names
[
5
]
=
{
"Poseidon"
,
"Hermes"
,
"Scylla"
,
"Heracles"
,
"Heimdall"
};
struct
i2c_adapter
*
adapter
=
client
->
adapter
;
const
char
*
const
client_names
[
5
]
=
{
"fscpos"
,
"fscher"
,
"fscscy"
,
"fschrc"
,
"fschmd"
};
int
i
,
err
=
0
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
))
return
0
;
/* OK. For now, we presume we have a valid client. We now create the
* client structure, even though we cannot fill it completely yet.
* But it allows us to access i2c_smbus_read_byte_data. */
if
(
!
(
data
=
kzalloc
(
sizeof
(
struct
fschmd_data
),
GFP_KERNEL
)))
return
-
ENOMEM
;
client
=
&
data
->
client
;
i2c_set_clientdata
(
client
,
data
);
client
->
addr
=
address
;
client
->
adapter
=
adapter
;
client
->
driver
=
&
fschmd_driver
;
mutex_init
(
&
data
->
update_lock
);
return
-
ENODEV
;
/* Detect & Identify the chip */
if
(
kind
<=
0
)
{
...
...
@@ -650,9 +649,31 @@ static int fschmd_detect(struct i2c_adapter *adapter, int address, int kind)
else
if
(
!
strcmp
(
id
,
"HMD"
))
kind
=
fschmd
;
else
goto
exit_free
;
return
-
ENODEV
;
}
strlcpy
(
info
->
type
,
client_names
[
kind
-
1
],
I2C_NAME_SIZE
);
return
0
;
}
static
int
fschmd_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
)
{
struct
fschmd_data
*
data
;
u8
revision
;
const
char
*
const
names
[
5
]
=
{
"Poseidon"
,
"Hermes"
,
"Scylla"
,
"Heracles"
,
"Heimdall"
};
int
i
,
err
;
enum
chips
kind
=
id
->
driver_data
;
data
=
kzalloc
(
sizeof
(
struct
fschmd_data
),
GFP_KERNEL
);
if
(
!
data
)
return
-
ENOMEM
;
i2c_set_clientdata
(
client
,
data
);
mutex_init
(
&
data
->
update_lock
);
if
(
kind
==
fscpos
)
{
/* The Poseidon has hardwired temp limits, fill these
in for the alarm resetting code */
...
...
@@ -674,11 +695,6 @@ static int fschmd_detect(struct i2c_adapter *adapter, int address, int kind)
/* i2c kind goes from 1-5, we want from 0-4 to address arrays */
data
->
kind
=
kind
-
1
;
strlcpy
(
client
->
name
,
client_names
[
data
->
kind
],
I2C_NAME_SIZE
);
/* Tell the I2C layer a new client has arrived */
if
((
err
=
i2c_attach_client
(
client
)))
goto
exit_free
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
fschmd_attr
);
i
++
)
{
err
=
device_create_file
(
&
client
->
dev
,
...
...
@@ -726,25 +742,14 @@ static int fschmd_detect(struct i2c_adapter *adapter, int address, int kind)
return
0
;
exit_detach:
fschmd_detach_client
(
client
);
/* will also free data for us */
return
err
;
exit_free:
kfree
(
data
);
fschmd_remove
(
client
);
/* will also free data for us */
return
err
;
}
static
int
fschmd_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
fschmd_detect
);
}
static
int
fschmd_detach_client
(
struct
i2c_client
*
client
)
static
int
fschmd_remove
(
struct
i2c_client
*
client
)
{
struct
fschmd_data
*
data
=
i2c_get_clientdata
(
client
);
int
i
,
err
;
int
i
;
/* Check if registered in case we're called from fschmd_detect
to cleanup after an error */
...
...
@@ -760,9 +765,6 @@ static int fschmd_detach_client(struct i2c_client *client)
device_remove_file
(
&
client
->
dev
,
&
fschmd_fan_attr
[
i
].
dev_attr
);
if
((
err
=
i2c_detach_client
(
client
)))
return
err
;
kfree
(
data
);
return
0
;
}
...
...
drivers/hwmon/fscpos.c
浏览文件 @
c43c1be0
...
...
@@ -87,9 +87,11 @@ static u8 FSCPOS_REG_TEMP_STATE[] = { 0x71, 0x81, 0x91 };
/*
* Functions declaration
*/
static
int
fscpos_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
fscpos_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
fscpos_detach_client
(
struct
i2c_client
*
client
);
static
int
fscpos_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
fscpos_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
int
fscpos_remove
(
struct
i2c_client
*
client
);
static
int
fscpos_read_value
(
struct
i2c_client
*
client
,
u8
reg
);
static
int
fscpos_write_value
(
struct
i2c_client
*
client
,
u8
reg
,
u8
value
);
...
...
@@ -101,19 +103,27 @@ static void reset_fan_alarm(struct i2c_client *client, int nr);
/*
* Driver data (common to all clients)
*/
static
const
struct
i2c_device_id
fscpos_id
[]
=
{
{
"fscpos"
,
fscpos
},
{
}
};
static
struct
i2c_driver
fscpos_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"fscpos"
,
},
.
attach_adapter
=
fscpos_attach_adapter
,
.
detach_client
=
fscpos_detach_client
,
.
probe
=
fscpos_probe
,
.
remove
=
fscpos_remove
,
.
id_table
=
fscpos_id
,
.
detect
=
fscpos_detect
,
.
address_data
=
&
addr_data
,
};
/*
* Client data (each client gets its own)
*/
struct
fscpos_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
mutex
update_lock
;
char
valid
;
/* 0 until following fields are valid */
...
...
@@ -470,39 +480,14 @@ static const struct attribute_group fscpos_group = {
.
attrs
=
fscpos_attributes
,
};
static
int
fscpos_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
fscpos_detect
);
}
static
int
fscpos_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
fscpos_detect
(
struct
i2c_client
*
new_client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
struct
i2c_client
*
new_client
;
struct
fscpos_data
*
data
;
int
err
=
0
;
struct
i2c_adapter
*
adapter
=
new_client
->
adapter
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
))
goto
exit
;
/*
* OK. For now, we presume we have a valid client. We now create the
* client structure, even though we cannot fill it completely yet.
* But it allows us to access fscpos_{read,write}_value.
*/
if
(
!
(
data
=
kzalloc
(
sizeof
(
struct
fscpos_data
),
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
exit
;
}
new_client
=
&
data
->
client
;
i2c_set_clientdata
(
new_client
,
data
);
new_client
->
addr
=
address
;
new_client
->
adapter
=
adapter
;
new_client
->
driver
=
&
fscpos_driver
;
new_client
->
flags
=
0
;
return
-
ENODEV
;
/* Do the remaining detection unless force or force_fscpos parameter */
if
(
kind
<
0
)
{
...
...
@@ -512,22 +497,30 @@ static int fscpos_detect(struct i2c_adapter *adapter, int address, int kind)
!=
0x45
)
/* 'E' */
||
(
fscpos_read_value
(
new_client
,
FSCPOS_REG_IDENT_2
)
!=
0x47
))
/* 'G' */
{
dev_dbg
(
&
new_client
->
dev
,
"fscpos detection failed
\n
"
);
goto
exit_free
;
}
return
-
ENODEV
;
}
/* Fill in the remaining client fields and put it in the global list */
strlcpy
(
new_client
->
name
,
"fscpos"
,
I2C_NAME_SIZE
);
strlcpy
(
info
->
type
,
"fscpos"
,
I2C_NAME_SIZE
);
return
0
;
}
static
int
fscpos_probe
(
struct
i2c_client
*
new_client
,
const
struct
i2c_device_id
*
id
)
{
struct
fscpos_data
*
data
;
int
err
;
data
=
kzalloc
(
sizeof
(
struct
fscpos_data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
ENOMEM
;
goto
exit
;
}
i2c_set_clientdata
(
new_client
,
data
);
data
->
valid
=
0
;
mutex_init
(
&
data
->
update_lock
);
/* Tell the I2C layer a new client has arrived */
if
((
err
=
i2c_attach_client
(
new_client
)))
goto
exit_free
;
/* Inizialize the fscpos chip */
fscpos_init_client
(
new_client
);
...
...
@@ -536,7 +529,7 @@ static int fscpos_detect(struct i2c_adapter *adapter, int address, int kind)
/* Register sysfs hooks */
if
((
err
=
sysfs_create_group
(
&
new_client
->
dev
.
kobj
,
&
fscpos_group
)))
goto
exit_
detach
;
goto
exit_
free
;
data
->
hwmon_dev
=
hwmon_device_register
(
&
new_client
->
dev
);
if
(
IS_ERR
(
data
->
hwmon_dev
))
{
...
...
@@ -548,24 +541,19 @@ static int fscpos_detect(struct i2c_adapter *adapter, int address, int kind)
exit_remove_files:
sysfs_remove_group
(
&
new_client
->
dev
.
kobj
,
&
fscpos_group
);
exit_detach:
i2c_detach_client
(
new_client
);
exit_free:
kfree
(
data
);
exit:
return
err
;
}
static
int
fscpos_
detach_client
(
struct
i2c_client
*
client
)
static
int
fscpos_
remove
(
struct
i2c_client
*
client
)
{
struct
fscpos_data
*
data
=
i2c_get_clientdata
(
client
);
int
err
;
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
fscpos_group
);
if
((
err
=
i2c_detach_client
(
client
)))
return
err
;
kfree
(
data
);
return
0
;
}
...
...
drivers/hwmon/gl518sm.c
浏览文件 @
c43c1be0
...
...
@@ -114,7 +114,6 @@ static inline u8 FAN_TO_REG(long rpm, int div)
/* Each client has this additional data */
struct
gl518_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
enum
chips
type
;
...
...
@@ -138,21 +137,33 @@ struct gl518_data {
u8
beep_enable
;
/* Boolean */
};
static
int
gl518_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
gl518_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
gl518_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
gl518_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
void
gl518_init_client
(
struct
i2c_client
*
client
);
static
int
gl518_
detach_client
(
struct
i2c_client
*
client
);
static
int
gl518_
remove
(
struct
i2c_client
*
client
);
static
int
gl518_read_value
(
struct
i2c_client
*
client
,
u8
reg
);
static
int
gl518_write_value
(
struct
i2c_client
*
client
,
u8
reg
,
u16
value
);
static
struct
gl518_data
*
gl518_update_device
(
struct
device
*
dev
);
static
const
struct
i2c_device_id
gl518_id
[]
=
{
{
"gl518sm"
,
0
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
gl518_id
);
/* This is the driver that will be inserted */
static
struct
i2c_driver
gl518_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"gl518sm"
,
},
.
attach_adapter
=
gl518_attach_adapter
,
.
detach_client
=
gl518_detach_client
,
.
probe
=
gl518_probe
,
.
remove
=
gl518_remove
,
.
id_table
=
gl518_id
,
.
detect
=
gl518_detect
,
.
address_data
=
&
addr_data
,
};
/*
...
...
@@ -472,46 +483,23 @@ static const struct attribute_group gl518_group_r80 = {
* Real code
*/
static
int
gl518_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
gl518_detect
);
}
static
int
gl518_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
gl518_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
struct
i2c_adapter
*
adapter
=
client
->
adapter
;
int
i
;
struct
i2c_client
*
client
;
struct
gl518_data
*
data
;
int
err
=
0
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
|
I2C_FUNC_SMBUS_WORD_DATA
))
goto
exit
;
/* OK. For now, we presume we have a valid client. We now create the
client structure, even though we cannot fill it completely yet.
But it allows us to access gl518_{read,write}_value. */
if
(
!
(
data
=
kzalloc
(
sizeof
(
struct
gl518_data
),
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
exit
;
}
client
=
&
data
->
client
;
i2c_set_clientdata
(
client
,
data
);
client
->
addr
=
address
;
client
->
adapter
=
adapter
;
client
->
driver
=
&
gl518_driver
;
return
-
ENODEV
;
/* Now, we do the remaining detection. */
if
(
kind
<
0
)
{
if
((
gl518_read_value
(
client
,
GL518_REG_CHIP_ID
)
!=
0x80
)
||
(
gl518_read_value
(
client
,
GL518_REG_CONF
)
&
0x80
))
goto
exit_free
;
return
-
ENODEV
;
}
/* Determine the chip type. */
...
...
@@ -526,19 +514,32 @@ static int gl518_detect(struct i2c_adapter *adapter, int address, int kind)
dev_info
(
&
adapter
->
dev
,
"Ignoring 'force' parameter for unknown "
"chip at adapter %d, address 0x%02x
\n
"
,
i2c_adapter_id
(
adapter
),
address
);
goto
exit_free
;
i2c_adapter_id
(
adapter
),
client
->
addr
);
return
-
ENODEV
;
}
}
/* Fill in the remaining client fields */
strlcpy
(
client
->
name
,
"gl518sm"
,
I2C_NAME_SIZE
);
data
->
type
=
kind
;
mutex_init
(
&
data
->
update_lock
);
strlcpy
(
info
->
type
,
"gl518sm"
,
I2C_NAME_SIZE
);
/* Tell the I2C layer a new client has arrived */
if
((
err
=
i2c_attach_client
(
client
)))
goto
exit_free
;
return
0
;
}
static
int
gl518_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
)
{
struct
gl518_data
*
data
;
int
err
,
revision
;
data
=
kzalloc
(
sizeof
(
struct
gl518_data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
ENOMEM
;
goto
exit
;
}
i2c_set_clientdata
(
client
,
data
);
revision
=
gl518_read_value
(
client
,
GL518_REG_REVISION
);
data
->
type
=
revision
==
0x80
?
gl518sm_r80
:
gl518sm_r00
;
mutex_init
(
&
data
->
update_lock
);
/* Initialize the GL518SM chip */
data
->
alarm_mask
=
0xff
;
...
...
@@ -546,7 +547,7 @@ static int gl518_detect(struct i2c_adapter *adapter, int address, int kind)
/* Register sysfs hooks */
if
((
err
=
sysfs_create_group
(
&
client
->
dev
.
kobj
,
&
gl518_group
)))
goto
exit_
detach
;
goto
exit_
free
;
if
(
data
->
type
==
gl518sm_r80
)
if
((
err
=
sysfs_create_group
(
&
client
->
dev
.
kobj
,
&
gl518_group_r80
)))
...
...
@@ -564,8 +565,6 @@ static int gl518_detect(struct i2c_adapter *adapter, int address, int kind)
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
gl518_group
);
if
(
data
->
type
==
gl518sm_r80
)
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
gl518_group_r80
);
exit_detach:
i2c_detach_client
(
client
);
exit_free:
kfree
(
data
);
exit:
...
...
@@ -591,19 +590,15 @@ static void gl518_init_client(struct i2c_client *client)
gl518_write_value
(
client
,
GL518_REG_CONF
,
0x40
|
regvalue
);
}
static
int
gl518_
detach_client
(
struct
i2c_client
*
client
)
static
int
gl518_
remove
(
struct
i2c_client
*
client
)
{
struct
gl518_data
*
data
=
i2c_get_clientdata
(
client
);
int
err
;
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
gl518_group
);
if
(
data
->
type
==
gl518sm_r80
)
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
gl518_group_r80
);
if
((
err
=
i2c_detach_client
(
client
)))
return
err
;
kfree
(
data
);
return
0
;
}
...
...
drivers/hwmon/gl520sm.c
浏览文件 @
c43c1be0
...
...
@@ -79,26 +79,37 @@ static const u8 GL520_REG_TEMP_MAX_HYST[] = { 0x06, 0x18 };
* Function declarations
*/
static
int
gl520_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
gl520_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
gl520_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
gl520_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
void
gl520_init_client
(
struct
i2c_client
*
client
);
static
int
gl520_
detach_client
(
struct
i2c_client
*
client
);
static
int
gl520_
remove
(
struct
i2c_client
*
client
);
static
int
gl520_read_value
(
struct
i2c_client
*
client
,
u8
reg
);
static
int
gl520_write_value
(
struct
i2c_client
*
client
,
u8
reg
,
u16
value
);
static
struct
gl520_data
*
gl520_update_device
(
struct
device
*
dev
);
/* Driver data */
static
const
struct
i2c_device_id
gl520_id
[]
=
{
{
"gl520sm"
,
gl520sm
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
gl520_id
);
static
struct
i2c_driver
gl520_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"gl520sm"
,
},
.
attach_adapter
=
gl520_attach_adapter
,
.
detach_client
=
gl520_detach_client
,
.
probe
=
gl520_probe
,
.
remove
=
gl520_remove
,
.
id_table
=
gl520_id
,
.
detect
=
gl520_detect
,
.
address_data
=
&
addr_data
,
};
/* Client data */
struct
gl520_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
mutex
update_lock
;
char
valid
;
/* zero until the following fields are valid */
...
...
@@ -669,37 +680,15 @@ static const struct attribute_group gl520_group_opt = {
* Real code
*/
static
int
gl520_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
gl520_detect
);
}
static
int
gl520_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
gl520_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
struct
i2c_client
*
client
;
struct
gl520_data
*
data
;
int
err
=
0
;
struct
i2c_adapter
*
adapter
=
client
->
adapter
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
|
I2C_FUNC_SMBUS_WORD_DATA
))
goto
exit
;
/* OK. For now, we presume we have a valid client. We now create the
client structure, even though we cannot fill it completely yet.
But it allows us to access gl520_{read,write}_value. */
if
(
!
(
data
=
kzalloc
(
sizeof
(
struct
gl520_data
),
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
exit
;
}
client
=
&
data
->
client
;
i2c_set_clientdata
(
client
,
data
);
client
->
addr
=
address
;
client
->
adapter
=
adapter
;
client
->
driver
=
&
gl520_driver
;
return
-
ENODEV
;
/* Determine the chip type. */
if
(
kind
<
0
)
{
...
...
@@ -707,24 +696,36 @@ static int gl520_detect(struct i2c_adapter *adapter, int address, int kind)
((
gl520_read_value
(
client
,
GL520_REG_REVISION
)
&
0x7f
)
!=
0x00
)
||
((
gl520_read_value
(
client
,
GL520_REG_CONF
)
&
0x80
)
!=
0x00
))
{
dev_dbg
(
&
client
->
dev
,
"Unknown chip type, skipping
\n
"
);
goto
exit_free
;
return
-
ENODEV
;
}
}
/* Fill in the remaining client fields */
strlcpy
(
client
->
name
,
"gl520sm"
,
I2C_NAME_SIZE
);
mutex_init
(
&
data
->
update_lock
);
strlcpy
(
info
->
type
,
"gl520sm"
,
I2C_NAME_SIZE
);
/* Tell the I2C layer a new client has arrived */
if
((
err
=
i2c_attach_client
(
client
)))
goto
exit_free
;
return
0
;
}
static
int
gl520_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
)
{
struct
gl520_data
*
data
;
int
err
;
data
=
kzalloc
(
sizeof
(
struct
gl520_data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
ENOMEM
;
goto
exit
;
}
i2c_set_clientdata
(
client
,
data
);
mutex_init
(
&
data
->
update_lock
);
/* Initialize the GL520SM chip */
gl520_init_client
(
client
);
/* Register sysfs hooks */
if
((
err
=
sysfs_create_group
(
&
client
->
dev
.
kobj
,
&
gl520_group
)))
goto
exit_
detach
;
goto
exit_
free
;
if
(
data
->
two_temps
)
{
if
((
err
=
device_create_file
(
&
client
->
dev
,
...
...
@@ -764,8 +765,6 @@ static int gl520_detect(struct i2c_adapter *adapter, int address, int kind)
exit_remove_files:
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
gl520_group
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
gl520_group_opt
);
exit_detach:
i2c_detach_client
(
client
);
exit_free:
kfree
(
data
);
exit:
...
...
@@ -811,18 +810,14 @@ static void gl520_init_client(struct i2c_client *client)
gl520_write_value
(
client
,
GL520_REG_BEEP_MASK
,
data
->
beep_mask
);
}
static
int
gl520_
detach_client
(
struct
i2c_client
*
client
)
static
int
gl520_
remove
(
struct
i2c_client
*
client
)
{
struct
gl520_data
*
data
=
i2c_get_clientdata
(
client
);
int
err
;
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
gl520_group
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
gl520_group_opt
);
if
((
err
=
i2c_detach_client
(
client
)))
return
err
;
kfree
(
data
);
return
0
;
}
...
...
drivers/hwmon/lm63.c
浏览文件 @
c43c1be0
/*
* lm63.c - driver for the National Semiconductor LM63 temperature sensor
* with integrated fan control
* Copyright (C) 2004-200
6
Jean Delvare <khali@linux-fr.org>
* Copyright (C) 2004-200
8
Jean Delvare <khali@linux-fr.org>
* Based on the lm90 driver.
*
* The LM63 is a sensor chip made by National Semiconductor. It measures
...
...
@@ -128,24 +128,36 @@ I2C_CLIENT_INSMOD_1(lm63);
* Functions declaration
*/
static
int
lm63_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
lm63_detach_client
(
struct
i2c_client
*
client
);
static
int
lm63_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
lm63_remove
(
struct
i2c_client
*
client
);
static
struct
lm63_data
*
lm63_update_device
(
struct
device
*
dev
);
static
int
lm63_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
lm63_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
void
lm63_init_client
(
struct
i2c_client
*
client
);
/*
* Driver data (common to all clients)
*/
static
const
struct
i2c_device_id
lm63_id
[]
=
{
{
"lm63"
,
lm63
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
lm63_id
);
static
struct
i2c_driver
lm63_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"lm63"
,
},
.
attach_adapter
=
lm63_attach_adapter
,
.
detach_client
=
lm63_detach_client
,
.
probe
=
lm63_probe
,
.
remove
=
lm63_remove
,
.
id_table
=
lm63_id
,
.
detect
=
lm63_detect
,
.
address_data
=
&
addr_data
,
};
/*
...
...
@@ -153,7 +165,6 @@ static struct i2c_driver lm63_driver = {
*/
struct
lm63_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
mutex
update_lock
;
char
valid
;
/* zero until following fields are valid */
...
...
@@ -411,43 +422,14 @@ static const struct attribute_group lm63_group_fan1 = {
* Real code
*/
static
int
lm63_attach_adapter
(
struct
i2c_adapter
*
adapter
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
lm63_detect
(
struct
i2c_client
*
new_client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
lm63_detect
);
}
/*
* The following function does more than just detection. If detection
* succeeds, it also registers the new chip.
*/
static
int
lm63_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
{
struct
i2c_client
*
new_client
;
struct
lm63_data
*
data
;
int
err
=
0
;
struct
i2c_adapter
*
adapter
=
new_client
->
adapter
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
))
goto
exit
;
if
(
!
(
data
=
kzalloc
(
sizeof
(
struct
lm63_data
),
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
exit
;
}
/* The common I2C client data is placed right before the
LM63-specific data. */
new_client
=
&
data
->
client
;
i2c_set_clientdata
(
new_client
,
data
);
new_client
->
addr
=
address
;
new_client
->
adapter
=
adapter
;
new_client
->
driver
=
&
lm63_driver
;
new_client
->
flags
=
0
;
/* Default to an LM63 if forced */
if
(
kind
==
0
)
kind
=
lm63
;
return
-
ENODEV
;
if
(
kind
<
0
)
{
/* must identify */
u8
man_id
,
chip_id
,
reg_config1
,
reg_config2
;
...
...
@@ -477,25 +459,38 @@ static int lm63_detect(struct i2c_adapter *adapter, int address, int kind)
dev_dbg
(
&
adapter
->
dev
,
"Unsupported chip "
"(man_id=0x%02X, chip_id=0x%02X).
\n
"
,
man_id
,
chip_id
);
goto
exit_free
;
return
-
ENODEV
;
}
}
strlcpy
(
new_client
->
name
,
"lm63"
,
I2C_NAME_SIZE
);
strlcpy
(
info
->
type
,
"lm63"
,
I2C_NAME_SIZE
);
return
0
;
}
static
int
lm63_probe
(
struct
i2c_client
*
new_client
,
const
struct
i2c_device_id
*
id
)
{
struct
lm63_data
*
data
;
int
err
;
data
=
kzalloc
(
sizeof
(
struct
lm63_data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
ENOMEM
;
goto
exit
;
}
i2c_set_clientdata
(
new_client
,
data
);
data
->
valid
=
0
;
mutex_init
(
&
data
->
update_lock
);
/* Tell the I2C layer a new client has arrived */
if
((
err
=
i2c_attach_client
(
new_client
)))
goto
exit_free
;
/* Initialize the LM63 chip */
lm63_init_client
(
new_client
);
/* Register sysfs hooks */
if
((
err
=
sysfs_create_group
(
&
new_client
->
dev
.
kobj
,
&
lm63_group
)))
goto
exit_
detach
;
goto
exit_
free
;
if
(
data
->
config
&
0x04
)
{
/* tachometer enabled */
if
((
err
=
sysfs_create_group
(
&
new_client
->
dev
.
kobj
,
&
lm63_group_fan1
)))
...
...
@@ -513,8 +508,6 @@ static int lm63_detect(struct i2c_adapter *adapter, int address, int kind)
exit_remove_files:
sysfs_remove_group
(
&
new_client
->
dev
.
kobj
,
&
lm63_group
);
sysfs_remove_group
(
&
new_client
->
dev
.
kobj
,
&
lm63_group_fan1
);
exit_detach:
i2c_detach_client
(
new_client
);
exit_free:
kfree
(
data
);
exit:
...
...
@@ -556,18 +549,14 @@ static void lm63_init_client(struct i2c_client *client)
(
data
->
config_fan
&
0x20
)
?
"manual"
:
"auto"
);
}
static
int
lm63_
detach_client
(
struct
i2c_client
*
client
)
static
int
lm63_
remove
(
struct
i2c_client
*
client
)
{
struct
lm63_data
*
data
=
i2c_get_clientdata
(
client
);
int
err
;
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
lm63_group
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
lm63_group_fan1
);
if
((
err
=
i2c_detach_client
(
client
)))
return
err
;
kfree
(
data
);
return
0
;
}
...
...
drivers/hwmon/lm77.c
浏览文件 @
c43c1be0
...
...
@@ -52,7 +52,6 @@ I2C_CLIENT_INSMOD_1(lm77);
/* Each client has this additional data */
struct
lm77_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
mutex
update_lock
;
char
valid
;
...
...
@@ -65,23 +64,35 @@ struct lm77_data {
u8
alarms
;
};
static
int
lm77_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
lm77_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
lm77_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
lm77_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
void
lm77_init_client
(
struct
i2c_client
*
client
);
static
int
lm77_
detach_client
(
struct
i2c_client
*
client
);
static
int
lm77_
remove
(
struct
i2c_client
*
client
);
static
u16
lm77_read_value
(
struct
i2c_client
*
client
,
u8
reg
);
static
int
lm77_write_value
(
struct
i2c_client
*
client
,
u8
reg
,
u16
value
);
static
struct
lm77_data
*
lm77_update_device
(
struct
device
*
dev
);
static
const
struct
i2c_device_id
lm77_id
[]
=
{
{
"lm77"
,
lm77
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
lm77_id
);
/* This is the driver that will be inserted */
static
struct
i2c_driver
lm77_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"lm77"
,
},
.
attach_adapter
=
lm77_attach_adapter
,
.
detach_client
=
lm77_detach_client
,
.
probe
=
lm77_probe
,
.
remove
=
lm77_remove
,
.
id_table
=
lm77_id
,
.
detect
=
lm77_detect
,
.
address_data
=
&
addr_data
,
};
/* straight from the datasheet */
...
...
@@ -215,13 +226,6 @@ static SENSOR_DEVICE_ATTR(temp1_crit_alarm, S_IRUGO, show_alarm, NULL, 2);
static
SENSOR_DEVICE_ATTR
(
temp1_min_alarm
,
S_IRUGO
,
show_alarm
,
NULL
,
0
);
static
SENSOR_DEVICE_ATTR
(
temp1_max_alarm
,
S_IRUGO
,
show_alarm
,
NULL
,
1
);
static
int
lm77_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
lm77_detect
);
}
static
struct
attribute
*
lm77_attributes
[]
=
{
&
dev_attr_temp1_input
.
attr
,
&
dev_attr_temp1_crit
.
attr
,
...
...
@@ -240,32 +244,15 @@ static const struct attribute_group lm77_group = {
.
attrs
=
lm77_attributes
,
};
/* This function is called by i2c_probe */
static
int
lm77_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
lm77_detect
(
struct
i2c_client
*
new_client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
struct
i2c_client
*
new_client
;
struct
lm77_data
*
data
;
int
err
=
0
;
const
char
*
name
=
""
;
struct
i2c_adapter
*
adapter
=
new_client
->
adapter
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
|
I2C_FUNC_SMBUS_WORD_DATA
))
goto
exit
;
/* OK. For now, we presume we have a valid client. We now create the
client structure, even though we cannot fill it completely yet.
But it allows us to access lm77_{read,write}_value. */
if
(
!
(
data
=
kzalloc
(
sizeof
(
struct
lm77_data
),
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
exit
;
}
new_client
=
&
data
->
client
;
i2c_set_clientdata
(
new_client
,
data
);
new_client
->
addr
=
address
;
new_client
->
adapter
=
adapter
;
new_client
->
driver
=
&
lm77_driver
;
new_client
->
flags
=
0
;
return
-
ENODEV
;
/* Here comes the remaining detection. Since the LM77 has no
register dedicated to identification, we have to rely on the
...
...
@@ -294,7 +281,7 @@ static int lm77_detect(struct i2c_adapter *adapter, int address, int kind)
||
i2c_smbus_read_word_data
(
new_client
,
i
+
3
)
!=
crit
||
i2c_smbus_read_word_data
(
new_client
,
i
+
4
)
!=
min
||
i2c_smbus_read_word_data
(
new_client
,
i
+
5
)
!=
max
)
goto
exit_free
;
return
-
ENODEV
;
/* sign bits */
if
(((
cur
&
0x00f0
)
!=
0xf0
&&
(
cur
&
0x00f0
)
!=
0x0
)
...
...
@@ -302,51 +289,55 @@ static int lm77_detect(struct i2c_adapter *adapter, int address, int kind)
||
((
crit
&
0x00f0
)
!=
0xf0
&&
(
crit
&
0x00f0
)
!=
0x0
)
||
((
min
&
0x00f0
)
!=
0xf0
&&
(
min
&
0x00f0
)
!=
0x0
)
||
((
max
&
0x00f0
)
!=
0xf0
&&
(
max
&
0x00f0
)
!=
0x0
))
goto
exit_free
;
return
-
ENODEV
;
/* unused bits */
if
(
conf
&
0xe0
)
goto
exit_free
;
return
-
ENODEV
;
/* 0x06 and 0x07 return the last read value */
cur
=
i2c_smbus_read_word_data
(
new_client
,
0
);
if
(
i2c_smbus_read_word_data
(
new_client
,
6
)
!=
cur
||
i2c_smbus_read_word_data
(
new_client
,
7
)
!=
cur
)
goto
exit_free
;
return
-
ENODEV
;
hyst
=
i2c_smbus_read_word_data
(
new_client
,
2
);
if
(
i2c_smbus_read_word_data
(
new_client
,
6
)
!=
hyst
||
i2c_smbus_read_word_data
(
new_client
,
7
)
!=
hyst
)
goto
exit_free
;
return
-
ENODEV
;
min
=
i2c_smbus_read_word_data
(
new_client
,
4
);
if
(
i2c_smbus_read_word_data
(
new_client
,
6
)
!=
min
||
i2c_smbus_read_word_data
(
new_client
,
7
)
!=
min
)
goto
exit_free
;
return
-
ENODEV
;
}
/* Determine the chip type - only one kind supported! */
if
(
kind
<=
0
)
kind
=
lm77
;
strlcpy
(
info
->
type
,
"lm77"
,
I2C_NAME_SIZE
);
if
(
kind
==
lm77
)
{
name
=
"lm77"
;
return
0
;
}
static
int
lm77_probe
(
struct
i2c_client
*
new_client
,
const
struct
i2c_device_id
*
id
)
{
struct
lm77_data
*
data
;
int
err
;
data
=
kzalloc
(
sizeof
(
struct
lm77_data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
ENOMEM
;
goto
exit
;
}
/* Fill in the remaining client fields and put it into the global list */
strlcpy
(
new_client
->
name
,
name
,
I2C_NAME_SIZE
);
i2c_set_clientdata
(
new_client
,
data
);
data
->
valid
=
0
;
mutex_init
(
&
data
->
update_lock
);
/* Tell the I2C layer a new client has arrived */
if
((
err
=
i2c_attach_client
(
new_client
)))
goto
exit_free
;
/* Initialize the LM77 chip */
lm77_init_client
(
new_client
);
/* Register sysfs hooks */
if
((
err
=
sysfs_create_group
(
&
new_client
->
dev
.
kobj
,
&
lm77_group
)))
goto
exit_
detach
;
goto
exit_
free
;
data
->
hwmon_dev
=
hwmon_device_register
(
&
new_client
->
dev
);
if
(
IS_ERR
(
data
->
hwmon_dev
))
{
...
...
@@ -358,20 +349,17 @@ static int lm77_detect(struct i2c_adapter *adapter, int address, int kind)
exit_remove:
sysfs_remove_group
(
&
new_client
->
dev
.
kobj
,
&
lm77_group
);
exit_detach:
i2c_detach_client
(
new_client
);
exit_free:
kfree
(
data
);
exit:
return
err
;
}
static
int
lm77_
detach_client
(
struct
i2c_client
*
client
)
static
int
lm77_
remove
(
struct
i2c_client
*
client
)
{
struct
lm77_data
*
data
=
i2c_get_clientdata
(
client
);
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
lm77_group
);
i2c_detach_client
(
client
);
kfree
(
data
);
return
0
;
}
...
...
drivers/hwmon/lm80.c
浏览文件 @
c43c1be0
...
...
@@ -108,7 +108,6 @@ static inline long TEMP_FROM_REG(u16 temp)
*/
struct
lm80_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
mutex
update_lock
;
char
valid
;
/* !=0 if following fields are valid */
...
...
@@ -132,10 +131,12 @@ struct lm80_data {
* Functions declaration
*/
static
int
lm80_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
lm80_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
lm80_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
lm80_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
void
lm80_init_client
(
struct
i2c_client
*
client
);
static
int
lm80_
detach_client
(
struct
i2c_client
*
client
);
static
int
lm80_
remove
(
struct
i2c_client
*
client
);
static
struct
lm80_data
*
lm80_update_device
(
struct
device
*
dev
);
static
int
lm80_read_value
(
struct
i2c_client
*
client
,
u8
reg
);
static
int
lm80_write_value
(
struct
i2c_client
*
client
,
u8
reg
,
u8
value
);
...
...
@@ -144,12 +145,22 @@ static int lm80_write_value(struct i2c_client *client, u8 reg, u8 value);
* Driver data (common to all clients)
*/
static
const
struct
i2c_device_id
lm80_id
[]
=
{
{
"lm80"
,
lm80
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
lm80_id
);
static
struct
i2c_driver
lm80_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"lm80"
,
},
.
attach_adapter
=
lm80_attach_adapter
,
.
detach_client
=
lm80_detach_client
,
.
probe
=
lm80_probe
,
.
remove
=
lm80_remove
,
.
id_table
=
lm80_id
,
.
detect
=
lm80_detect
,
.
address_data
=
&
addr_data
,
};
/*
...
...
@@ -383,13 +394,6 @@ static SENSOR_DEVICE_ATTR(temp1_crit_alarm, S_IRUGO, show_alarm, NULL, 13);
* Real code
*/
static
int
lm80_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
lm80_detect
);
}
static
struct
attribute
*
lm80_attributes
[]
=
{
&
sensor_dev_attr_in0_min
.
dev_attr
.
attr
,
&
sensor_dev_attr_in1_min
.
dev_attr
.
attr
,
...
...
@@ -442,53 +446,46 @@ static const struct attribute_group lm80_group = {
.
attrs
=
lm80_attributes
,
};
static
int
lm80_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
lm80_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
struct
i2c_adapter
*
adapter
=
client
->
adapter
;
int
i
,
cur
;
struct
i2c_client
*
client
;
struct
lm80_data
*
data
;
int
err
=
0
;
const
char
*
name
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
))
goto
exit
;
/* OK. For now, we presume we have a valid client. We now create the
client structure, even though we cannot fill it completely yet.
But it allows us to access lm80_{read,write}_value. */
if
(
!
(
data
=
kzalloc
(
sizeof
(
struct
lm80_data
),
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
exit
;
}
client
=
&
data
->
client
;
i2c_set_clientdata
(
client
,
data
);
client
->
addr
=
address
;
client
->
adapter
=
adapter
;
client
->
driver
=
&
lm80_driver
;
return
-
ENODEV
;
/* Now, we do the remaining detection. It is lousy. */
if
(
lm80_read_value
(
client
,
LM80_REG_ALARM2
)
&
0xc0
)
goto
error_free
;
return
-
ENODEV
;
for
(
i
=
0x2a
;
i
<=
0x3d
;
i
++
)
{
cur
=
i2c_smbus_read_byte_data
(
client
,
i
);
if
((
i2c_smbus_read_byte_data
(
client
,
i
+
0x40
)
!=
cur
)
||
(
i2c_smbus_read_byte_data
(
client
,
i
+
0x80
)
!=
cur
)
||
(
i2c_smbus_read_byte_data
(
client
,
i
+
0xc0
)
!=
cur
))
goto
error_free
;
return
-
ENODEV
;
}
/* Determine the chip type - only one kind supported! */
kind
=
lm80
;
name
=
"lm80"
;
strlcpy
(
info
->
type
,
"lm80"
,
I2C_NAME_SIZE
);
/* Fill in the remaining client fields */
strlcpy
(
client
->
name
,
name
,
I2C_NAME_SIZE
);
mutex_init
(
&
data
->
update_lock
);
return
0
;
}
/* Tell the I2C layer a new client has arrived */
if
((
err
=
i2c_attach_client
(
client
)))
goto
error_free
;
static
int
lm80_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
)
{
struct
lm80_data
*
data
;
int
err
;
data
=
kzalloc
(
sizeof
(
struct
lm80_data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
ENOMEM
;
goto
exit
;
}
i2c_set_clientdata
(
client
,
data
);
mutex_init
(
&
data
->
update_lock
);
/* Initialize the LM80 chip */
lm80_init_client
(
client
);
...
...
@@ -499,7 +496,7 @@ static int lm80_detect(struct i2c_adapter *adapter, int address, int kind)
/* Register sysfs hooks */
if
((
err
=
sysfs_create_group
(
&
client
->
dev
.
kobj
,
&
lm80_group
)))
goto
error_
detach
;
goto
error_
free
;
data
->
hwmon_dev
=
hwmon_device_register
(
&
client
->
dev
);
if
(
IS_ERR
(
data
->
hwmon_dev
))
{
...
...
@@ -511,23 +508,18 @@ static int lm80_detect(struct i2c_adapter *adapter, int address, int kind)
error_remove:
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
lm80_group
);
error_detach:
i2c_detach_client
(
client
);
error_free:
kfree
(
data
);
exit:
return
err
;
}
static
int
lm80_
detach_client
(
struct
i2c_client
*
client
)
static
int
lm80_
remove
(
struct
i2c_client
*
client
)
{
struct
lm80_data
*
data
=
i2c_get_clientdata
(
client
);
int
err
;
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
lm80_group
);
if
((
err
=
i2c_detach_client
(
client
)))
return
err
;
kfree
(
data
);
return
0
;
...
...
drivers/hwmon/lm83.c
浏览文件 @
c43c1be0
/*
* lm83.c - Part of lm_sensors, Linux kernel modules for hardware
* monitoring
* Copyright (C) 2003-200
6
Jean Delvare <khali@linux-fr.org>
* Copyright (C) 2003-200
8
Jean Delvare <khali@linux-fr.org>
*
* Heavily inspired from the lm78, lm75 and adm1021 drivers. The LM83 is
* a sensor chip made by National Semiconductor. It reports up to four
...
...
@@ -118,21 +118,34 @@ static const u8 LM83_REG_W_HIGH[] = {
* Functions declaration
*/
static
int
lm83_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
lm83_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
lm83_detach_client
(
struct
i2c_client
*
client
);
static
int
lm83_detect
(
struct
i2c_client
*
new_client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
int
lm83_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
lm83_remove
(
struct
i2c_client
*
client
);
static
struct
lm83_data
*
lm83_update_device
(
struct
device
*
dev
);
/*
* Driver data (common to all clients)
*/
static
const
struct
i2c_device_id
lm83_id
[]
=
{
{
"lm83"
,
lm83
},
{
"lm82"
,
lm82
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
lm83_id
);
static
struct
i2c_driver
lm83_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"lm83"
,
},
.
attach_adapter
=
lm83_attach_adapter
,
.
detach_client
=
lm83_detach_client
,
.
probe
=
lm83_probe
,
.
remove
=
lm83_remove
,
.
id_table
=
lm83_id
,
.
detect
=
lm83_detect
,
.
address_data
=
&
addr_data
,
};
/*
...
...
@@ -140,7 +153,6 @@ static struct i2c_driver lm83_driver = {
*/
struct
lm83_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
mutex
update_lock
;
char
valid
;
/* zero until following fields are valid */
...
...
@@ -278,40 +290,15 @@ static const struct attribute_group lm83_group_opt = {
* Real code
*/
static
int
lm83_attach_adapter
(
struct
i2c_adapter
*
adapter
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
lm83_detect
(
struct
i2c_client
*
new_client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
lm83_detect
);
}
/*
* The following function does more than just detection. If detection
* succeeds, it also registers the new chip.
*/
static
int
lm83_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
{
struct
i2c_client
*
new_client
;
struct
lm83_data
*
data
;
int
err
=
0
;
struct
i2c_adapter
*
adapter
=
new_client
->
adapter
;
const
char
*
name
=
""
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
))
goto
exit
;
if
(
!
(
data
=
kzalloc
(
sizeof
(
struct
lm83_data
),
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
exit
;
}
/* The common I2C client data is placed right after the
* LM83-specific data. */
new_client
=
&
data
->
client
;
i2c_set_clientdata
(
new_client
,
data
);
new_client
->
addr
=
address
;
new_client
->
adapter
=
adapter
;
new_client
->
driver
=
&
lm83_driver
;
new_client
->
flags
=
0
;
return
-
ENODEV
;
/* Now we do the detection and identification. A negative kind
* means that the driver was loaded with no force parameter
...
...
@@ -335,8 +322,9 @@ static int lm83_detect(struct i2c_adapter *adapter, int address, int kind)
((
i2c_smbus_read_byte_data
(
new_client
,
LM83_REG_R_CONFIG
)
&
0x41
)
!=
0x00
))
{
dev_dbg
(
&
adapter
->
dev
,
"LM83 detection failed at 0x%02x.
\n
"
,
address
);
goto
exit_free
;
"LM83 detection failed at 0x%02x.
\n
"
,
new_client
->
addr
);
return
-
ENODEV
;
}
}
...
...
@@ -361,7 +349,7 @@ static int lm83_detect(struct i2c_adapter *adapter, int address, int kind)
dev_info
(
&
adapter
->
dev
,
"Unsupported chip (man_id=0x%02X, "
"chip_id=0x%02X).
\n
"
,
man_id
,
chip_id
);
goto
exit_free
;
return
-
ENODEV
;
}
}
...
...
@@ -372,15 +360,27 @@ static int lm83_detect(struct i2c_adapter *adapter, int address, int kind)
name
=
"lm82"
;
}
/* We can fill in the remaining client fields */
strlcpy
(
new_client
->
name
,
name
,
I2C_NAME_SIZE
);
strlcpy
(
info
->
type
,
name
,
I2C_NAME_SIZE
);
return
0
;
}
static
int
lm83_probe
(
struct
i2c_client
*
new_client
,
const
struct
i2c_device_id
*
id
)
{
struct
lm83_data
*
data
;
int
err
;
data
=
kzalloc
(
sizeof
(
struct
lm83_data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
ENOMEM
;
goto
exit
;
}
i2c_set_clientdata
(
new_client
,
data
);
data
->
valid
=
0
;
mutex_init
(
&
data
->
update_lock
);
/* Tell the I2C layer a new client has arrived */
if
((
err
=
i2c_attach_client
(
new_client
)))
goto
exit_free
;
/*
* Register sysfs hooks
* The LM82 can only monitor one external diode which is
...
...
@@ -389,9 +389,9 @@ static int lm83_detect(struct i2c_adapter *adapter, int address, int kind)
*/
if
((
err
=
sysfs_create_group
(
&
new_client
->
dev
.
kobj
,
&
lm83_group
)))
goto
exit_
detach
;
goto
exit_
free
;
if
(
kind
==
lm83
)
{
if
(
id
->
driver_data
==
lm83
)
{
if
((
err
=
sysfs_create_group
(
&
new_client
->
dev
.
kobj
,
&
lm83_group_opt
)))
goto
exit_remove_files
;
...
...
@@ -408,26 +408,20 @@ static int lm83_detect(struct i2c_adapter *adapter, int address, int kind)
exit_remove_files:
sysfs_remove_group
(
&
new_client
->
dev
.
kobj
,
&
lm83_group
);
sysfs_remove_group
(
&
new_client
->
dev
.
kobj
,
&
lm83_group_opt
);
exit_detach:
i2c_detach_client
(
new_client
);
exit_free:
kfree
(
data
);
exit:
return
err
;
}
static
int
lm83_
detach_client
(
struct
i2c_client
*
client
)
static
int
lm83_
remove
(
struct
i2c_client
*
client
)
{
struct
lm83_data
*
data
=
i2c_get_clientdata
(
client
);
int
err
;
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
lm83_group
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
lm83_group_opt
);
if
((
err
=
i2c_detach_client
(
client
)))
return
err
;
kfree
(
data
);
return
0
;
}
...
...
drivers/hwmon/lm87.c
浏览文件 @
c43c1be0
...
...
@@ -5,7 +5,7 @@
* Philip Edelbrock <phil@netroedge.com>
* Stephen Rousset <stephen.rousset@rocketlogix.com>
* Dan Eaton <dan.eaton@rocketlogix.com>
* Copyright (C) 2004
,2007
Jean Delvare <khali@linux-fr.org>
* Copyright (C) 2004
-2008
Jean Delvare <khali@linux-fr.org>
*
* Original port to Linux 2.6 by Jeff Oliver.
*
...
...
@@ -157,22 +157,35 @@ static u8 LM87_REG_TEMP_LOW[3] = { 0x3A, 0x38, 0x2C };
* Functions declaration
*/
static
int
lm87_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
lm87_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
lm87_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
int
lm87_detect
(
struct
i2c_client
*
new_client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
void
lm87_init_client
(
struct
i2c_client
*
client
);
static
int
lm87_
detach_client
(
struct
i2c_client
*
client
);
static
int
lm87_
remove
(
struct
i2c_client
*
client
);
static
struct
lm87_data
*
lm87_update_device
(
struct
device
*
dev
);
/*
* Driver data (common to all clients)
*/
static
const
struct
i2c_device_id
lm87_id
[]
=
{
{
"lm87"
,
lm87
},
{
"adm1024"
,
adm1024
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
lm87_id
);
static
struct
i2c_driver
lm87_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"lm87"
,
},
.
attach_adapter
=
lm87_attach_adapter
,
.
detach_client
=
lm87_detach_client
,
.
probe
=
lm87_probe
,
.
remove
=
lm87_remove
,
.
id_table
=
lm87_id
,
.
detect
=
lm87_detect
,
.
address_data
=
&
addr_data
,
};
/*
...
...
@@ -180,7 +193,6 @@ static struct i2c_driver lm87_driver = {
*/
struct
lm87_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
mutex
update_lock
;
char
valid
;
/* zero until following fields are valid */
...
...
@@ -562,13 +574,6 @@ static SENSOR_DEVICE_ATTR(temp3_fault, S_IRUGO, show_alarm, NULL, 15);
* Real code
*/
static
int
lm87_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
lm87_detect
);
}
static
struct
attribute
*
lm87_attributes
[]
=
{
&
dev_attr_in1_input
.
attr
,
&
dev_attr_in1_min
.
attr
,
...
...
@@ -656,33 +661,15 @@ static const struct attribute_group lm87_group_opt = {
.
attrs
=
lm87_attributes_opt
,
};
/*
* The following function does more than just detection. If detection
* succeeds, it also registers the new chip.
*/
static
int
lm87_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
lm87_detect
(
struct
i2c_client
*
new_client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
struct
i2c_client
*
new_client
;
struct
lm87_data
*
data
;
int
err
=
0
;
struct
i2c_adapter
*
adapter
=
new_client
->
adapter
;
static
const
char
*
names
[]
=
{
"lm87"
,
"adm1024"
};
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
))
goto
exit
;
if
(
!
(
data
=
kzalloc
(
sizeof
(
struct
lm87_data
),
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
exit
;
}
/* The common I2C client data is placed right before the
LM87-specific data. */
new_client
=
&
data
->
client
;
i2c_set_clientdata
(
new_client
,
data
);
new_client
->
addr
=
address
;
new_client
->
adapter
=
adapter
;
new_client
->
driver
=
&
lm87_driver
;
new_client
->
flags
=
0
;
return
-
ENODEV
;
/* Default to an LM87 if forced */
if
(
kind
==
0
)
...
...
@@ -704,20 +691,32 @@ static int lm87_detect(struct i2c_adapter *adapter, int address, int kind)
||
(
lm87_read_value
(
new_client
,
LM87_REG_CONFIG
)
&
0x80
))
{
dev_dbg
(
&
adapter
->
dev
,
"LM87 detection failed at 0x%02x.
\n
"
,
address
);
goto
exit_free
;
new_client
->
addr
);
return
-
ENODEV
;
}
}
/* We can fill in the remaining client fields */
strlcpy
(
new_client
->
name
,
names
[
kind
-
1
],
I2C_NAME_SIZE
);
strlcpy
(
info
->
type
,
names
[
kind
-
1
],
I2C_NAME_SIZE
);
return
0
;
}
static
int
lm87_probe
(
struct
i2c_client
*
new_client
,
const
struct
i2c_device_id
*
id
)
{
struct
lm87_data
*
data
;
int
err
;
data
=
kzalloc
(
sizeof
(
struct
lm87_data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
ENOMEM
;
goto
exit
;
}
i2c_set_clientdata
(
new_client
,
data
);
data
->
valid
=
0
;
mutex_init
(
&
data
->
update_lock
);
/* Tell the I2C layer a new client has arrived */
if
((
err
=
i2c_attach_client
(
new_client
)))
goto
exit_free
;
/* Initialize the LM87 chip */
lm87_init_client
(
new_client
);
...
...
@@ -732,7 +731,7 @@ static int lm87_detect(struct i2c_adapter *adapter, int address, int kind)
/* Register sysfs hooks */
if
((
err
=
sysfs_create_group
(
&
new_client
->
dev
.
kobj
,
&
lm87_group
)))
goto
exit_
detach
;
goto
exit_
free
;
if
(
data
->
channel
&
CHAN_NO_FAN
(
0
))
{
if
((
err
=
device_create_file
(
&
new_client
->
dev
,
...
...
@@ -832,8 +831,6 @@ static int lm87_detect(struct i2c_adapter *adapter, int address, int kind)
exit_remove:
sysfs_remove_group
(
&
new_client
->
dev
.
kobj
,
&
lm87_group
);
sysfs_remove_group
(
&
new_client
->
dev
.
kobj
,
&
lm87_group_opt
);
exit_detach:
i2c_detach_client
(
new_client
);
exit_free:
kfree
(
data
);
exit:
...
...
@@ -877,18 +874,14 @@ static void lm87_init_client(struct i2c_client *client)
}
}
static
int
lm87_
detach_client
(
struct
i2c_client
*
client
)
static
int
lm87_
remove
(
struct
i2c_client
*
client
)
{
struct
lm87_data
*
data
=
i2c_get_clientdata
(
client
);
int
err
;
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
lm87_group
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
lm87_group_opt
);
if
((
err
=
i2c_detach_client
(
client
)))
return
err
;
kfree
(
data
);
return
0
;
}
...
...
drivers/hwmon/lm90.c
浏览文件 @
c43c1be0
...
...
@@ -187,23 +187,44 @@ I2C_CLIENT_INSMOD_7(lm90, adm1032, lm99, lm86, max6657, adt7461, max6680);
* Functions declaration
*/
static
int
lm90_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
lm90_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
int
lm90_detect
(
struct
i2c_client
*
client
,
int
kind
,
struct
i2c_board_info
*
info
);
static
int
lm90_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
);
static
void
lm90_init_client
(
struct
i2c_client
*
client
);
static
int
lm90_
detach_client
(
struct
i2c_client
*
client
);
static
int
lm90_
remove
(
struct
i2c_client
*
client
);
static
struct
lm90_data
*
lm90_update_device
(
struct
device
*
dev
);
/*
* Driver data (common to all clients)
*/
static
const
struct
i2c_device_id
lm90_id
[]
=
{
{
"adm1032"
,
adm1032
},
{
"adt7461"
,
adt7461
},
{
"lm90"
,
lm90
},
{
"lm86"
,
lm86
},
{
"lm89"
,
lm99
},
{
"lm99"
,
lm99
},
/* Missing temperature offset */
{
"max6657"
,
max6657
},
{
"max6658"
,
max6657
},
{
"max6659"
,
max6657
},
{
"max6680"
,
max6680
},
{
"max6681"
,
max6680
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
lm90_id
);
static
struct
i2c_driver
lm90_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"lm90"
,
},
.
attach_adapter
=
lm90_attach_adapter
,
.
detach_client
=
lm90_detach_client
,
.
probe
=
lm90_probe
,
.
remove
=
lm90_remove
,
.
id_table
=
lm90_id
,
.
detect
=
lm90_detect
,
.
address_data
=
&
addr_data
,
};
/*
...
...
@@ -211,7 +232,6 @@ static struct i2c_driver lm90_driver = {
*/
struct
lm90_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
mutex
update_lock
;
char
valid
;
/* zero until following fields are valid */
...
...
@@ -477,40 +497,16 @@ static int lm90_read_reg(struct i2c_client* client, u8 reg, u8 *value)
return
0
;
}
static
int
lm90_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
lm90_detect
);
}
/*
* The following function does more than just detection. If detection
* succeeds, it also registers the new chip.
*/
static
int
lm90_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
/* Return 0 if detection is successful, -ENODEV otherwise */
static
int
lm90_detect
(
struct
i2c_client
*
new_client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
struct
i2c_client
*
new_client
;
struct
lm90_data
*
data
;
int
err
=
0
;
struct
i2c_adapter
*
adapter
=
new_client
->
adapter
;
int
address
=
new_client
->
addr
;
const
char
*
name
=
""
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
))
goto
exit
;
if
(
!
(
data
=
kzalloc
(
sizeof
(
struct
lm90_data
),
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
exit
;
}
/* The common I2C client data is placed right before the
LM90-specific data. */
new_client
=
&
data
->
client
;
i2c_set_clientdata
(
new_client
,
data
);
new_client
->
addr
=
address
;
new_client
->
adapter
=
adapter
;
new_client
->
driver
=
&
lm90_driver
;
new_client
->
flags
=
0
;
return
-
ENODEV
;
/*
* Now we do the remaining detection. A negative kind means that
...
...
@@ -538,7 +534,7 @@ static int lm90_detect(struct i2c_adapter *adapter, int address, int kind)
LM90_REG_R_CONFIG1
))
<
0
||
(
reg_convrate
=
i2c_smbus_read_byte_data
(
new_client
,
LM90_REG_R_CONVRATE
))
<
0
)
goto
exit_free
;
return
-
ENODEV
;
if
((
address
==
0x4C
||
address
==
0x4D
)
&&
man_id
==
0x01
)
{
/* National Semiconductor */
...
...
@@ -546,7 +542,7 @@ static int lm90_detect(struct i2c_adapter *adapter, int address, int kind)
if
((
reg_config2
=
i2c_smbus_read_byte_data
(
new_client
,
LM90_REG_R_CONFIG2
))
<
0
)
goto
exit_free
;
return
-
ENODEV
;
if
((
reg_config1
&
0x2A
)
==
0x00
&&
(
reg_config2
&
0xF8
)
==
0x00
...
...
@@ -610,10 +606,11 @@ static int lm90_detect(struct i2c_adapter *adapter, int address, int kind)
dev_info
(
&
adapter
->
dev
,
"Unsupported chip (man_id=0x%02X, "
"chip_id=0x%02X).
\n
"
,
man_id
,
chip_id
);
goto
exit_free
;
return
-
ENODEV
;
}
}
/* Fill the i2c board info */
if
(
kind
==
lm90
)
{
name
=
"lm90"
;
}
else
if
(
kind
==
adm1032
)
{
...
...
@@ -621,7 +618,7 @@ static int lm90_detect(struct i2c_adapter *adapter, int address, int kind)
/* The ADM1032 supports PEC, but only if combined
transactions are not used. */
if
(
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE
))
new_client
->
flags
|=
I2C_CLIENT_PEC
;
info
->
flags
|=
I2C_CLIENT_PEC
;
}
else
if
(
kind
==
lm99
)
{
name
=
"lm99"
;
}
else
if
(
kind
==
lm86
)
{
...
...
@@ -633,23 +630,39 @@ static int lm90_detect(struct i2c_adapter *adapter, int address, int kind)
}
else
if
(
kind
==
adt7461
)
{
name
=
"adt7461"
;
}
strlcpy
(
info
->
type
,
name
,
I2C_NAME_SIZE
);
return
0
;
}
static
int
lm90_probe
(
struct
i2c_client
*
new_client
,
const
struct
i2c_device_id
*
id
)
{
struct
i2c_adapter
*
adapter
=
to_i2c_adapter
(
new_client
->
dev
.
parent
);
struct
lm90_data
*
data
;
int
err
;
/* We can fill in the remaining client fields */
strlcpy
(
new_client
->
name
,
name
,
I2C_NAME_SIZE
);
data
->
valid
=
0
;
data
->
kind
=
kind
;
data
=
kzalloc
(
sizeof
(
struct
lm90_data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
ENOMEM
;
goto
exit
;
}
i2c_set_clientdata
(
new_client
,
data
);
mutex_init
(
&
data
->
update_lock
);
/* Tell the I2C layer a new client has arrived */
if
((
err
=
i2c_attach_client
(
new_client
)))
goto
exit_free
;
/* Set the device type */
data
->
kind
=
id
->
driver_data
;
if
(
data
->
kind
==
adm1032
)
{
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE
))
new_client
->
flags
&=
~
I2C_CLIENT_PEC
;
}
/* Initialize the LM90 chip */
lm90_init_client
(
new_client
);
/* Register sysfs hooks */
if
((
err
=
sysfs_create_group
(
&
new_client
->
dev
.
kobj
,
&
lm90_group
)))
goto
exit_
detach
;
goto
exit_
free
;
if
(
new_client
->
flags
&
I2C_CLIENT_PEC
)
{
if
((
err
=
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_pec
)))
...
...
@@ -672,8 +685,6 @@ static int lm90_detect(struct i2c_adapter *adapter, int address, int kind)
exit_remove_files:
sysfs_remove_group
(
&
new_client
->
dev
.
kobj
,
&
lm90_group
);
device_remove_file
(
&
new_client
->
dev
,
&
dev_attr_pec
);
exit_detach:
i2c_detach_client
(
new_client
);
exit_free:
kfree
(
data
);
exit:
...
...
@@ -710,10 +721,9 @@ static void lm90_init_client(struct i2c_client *client)
i2c_smbus_write_byte_data
(
client
,
LM90_REG_W_CONFIG1
,
config
);
}
static
int
lm90_
detach_client
(
struct
i2c_client
*
client
)
static
int
lm90_
remove
(
struct
i2c_client
*
client
)
{
struct
lm90_data
*
data
=
i2c_get_clientdata
(
client
);
int
err
;
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
lm90_group
);
...
...
@@ -722,9 +732,6 @@ static int lm90_detach_client(struct i2c_client *client)
device_remove_file
(
&
client
->
dev
,
&
sensor_dev_attr_temp2_offset
.
dev_attr
);
if
((
err
=
i2c_detach_client
(
client
)))
return
err
;
kfree
(
data
);
return
0
;
}
...
...
drivers/hwmon/lm92.c
浏览文件 @
c43c1be0
/*
* lm92 - Hardware monitoring driver
* Copyright (C) 2005 Jean Delvare <khali@linux-fr.org>
* Copyright (C) 2005
-2008
Jean Delvare <khali@linux-fr.org>
*
* Based on the lm90 driver, with some ideas taken from the lm_sensors
* lm92 driver as well.
...
...
@@ -96,7 +96,6 @@ static struct i2c_driver lm92_driver;
/* Client data (each client gets its own) */
struct
lm92_data
{
struct
i2c_client
client
;
struct
device
*
hwmon_dev
;
struct
mutex
update_lock
;
char
valid
;
/* zero until following fields are valid */
...
...
@@ -319,32 +318,15 @@ static const struct attribute_group lm92_group = {
.
attrs
=
lm92_attributes
,
};
/*
The following function does more than just detection. If detection
succeeds, it also registers the new chip. */
static
int
lm92_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
/*
Return 0 if detection is successful, -ENODEV otherwise */
static
int
lm92_detect
(
struct
i2c_client
*
new_client
,
int
kind
,
struct
i2c_board_info
*
info
)
{
struct
i2c_client
*
new_client
;
struct
lm92_data
*
data
;
int
err
=
0
;
char
*
name
;
struct
i2c_adapter
*
adapter
=
new_client
->
adapter
;
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_BYTE_DATA
|
I2C_FUNC_SMBUS_WORD_DATA
))
goto
exit
;
if
(
!
(
data
=
kzalloc
(
sizeof
(
struct
lm92_data
),
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
exit
;
}
/* Fill in enough client fields so that we can read from the chip,
which is required for identication */
new_client
=
&
data
->
client
;
i2c_set_clientdata
(
new_client
,
data
);
new_client
->
addr
=
address
;
new_client
->
adapter
=
adapter
;
new_client
->
driver
=
&
lm92_driver
;
new_client
->
flags
=
0
;
return
-
ENODEV
;
/* A negative kind means that the driver was loaded with no force
parameter (default), so we must identify the chip. */
...
...
@@ -364,34 +346,36 @@ static int lm92_detect(struct i2c_adapter *adapter, int address, int kind)
kind
=
lm92
;
/* No separate prefix */
}
else
goto
exit_free
;
}
else
if
(
kind
==
0
)
/* Default to an LM92 if forced */
kind
=
lm92
;
/* Give it the proper name */
if
(
kind
==
lm92
)
{
name
=
"lm92"
;
}
else
{
/* Supposedly cannot happen */
dev_dbg
(
&
new_client
->
dev
,
"Kind out of range?
\n
"
);
goto
exit_free
;
return
-
ENODEV
;
}
/* Fill in the remaining client fields */
strlcpy
(
new_client
->
name
,
name
,
I2C_NAME_SIZE
);
strlcpy
(
info
->
type
,
"lm92"
,
I2C_NAME_SIZE
);
return
0
;
}
static
int
lm92_probe
(
struct
i2c_client
*
new_client
,
const
struct
i2c_device_id
*
id
)
{
struct
lm92_data
*
data
;
int
err
;
data
=
kzalloc
(
sizeof
(
struct
lm92_data
),
GFP_KERNEL
);
if
(
!
data
)
{
err
=
-
ENOMEM
;
goto
exit
;
}
i2c_set_clientdata
(
new_client
,
data
);
data
->
valid
=
0
;
mutex_init
(
&
data
->
update_lock
);
/* Tell the i2c subsystem a new client has arrived */
if
((
err
=
i2c_attach_client
(
new_client
)))
goto
exit_free
;
/* Initialize the chipset */
lm92_init_client
(
new_client
);
/* Register sysfs hooks */
if
((
err
=
sysfs_create_group
(
&
new_client
->
dev
.
kobj
,
&
lm92_group
)))
goto
exit_
detach
;
goto
exit_
free
;
data
->
hwmon_dev
=
hwmon_device_register
(
&
new_client
->
dev
);
if
(
IS_ERR
(
data
->
hwmon_dev
))
{
...
...
@@ -403,32 +387,19 @@ static int lm92_detect(struct i2c_adapter *adapter, int address, int kind)
exit_remove:
sysfs_remove_group
(
&
new_client
->
dev
.
kobj
,
&
lm92_group
);
exit_detach:
i2c_detach_client
(
new_client
);
exit_free:
kfree
(
data
);
exit:
return
err
;
}
static
int
lm92_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
if
(
!
(
adapter
->
class
&
I2C_CLASS_HWMON
))
return
0
;
return
i2c_probe
(
adapter
,
&
addr_data
,
lm92_detect
);
}
static
int
lm92_detach_client
(
struct
i2c_client
*
client
)
static
int
lm92_remove
(
struct
i2c_client
*
client
)
{
struct
lm92_data
*
data
=
i2c_get_clientdata
(
client
);
int
err
;
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
client
->
dev
.
kobj
,
&
lm92_group
);
if
((
err
=
i2c_detach_client
(
client
)))
return
err
;
kfree
(
data
);
return
0
;
}
...
...
@@ -438,12 +409,23 @@ static int lm92_detach_client(struct i2c_client *client)
* Module and driver stuff
*/
static
const
struct
i2c_device_id
lm92_id
[]
=
{
{
"lm92"
,
lm92
},
/* max6635 could be added here */
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
lm92_id
);
static
struct
i2c_driver
lm92_driver
=
{
.
class
=
I2C_CLASS_HWMON
,
.
driver
=
{
.
name
=
"lm92"
,
},
.
attach_adapter
=
lm92_attach_adapter
,
.
detach_client
=
lm92_detach_client
,
.
probe
=
lm92_probe
,
.
remove
=
lm92_remove
,
.
id_table
=
lm92_id
,
.
detect
=
lm92_detect
,
.
address_data
=
&
addr_data
,
};
static
int
__init
sensors_lm92_init
(
void
)
...
...
drivers/hwmon/lm93.c
浏览文件 @
c43c1be0
此差异已折叠。
点击以展开。
drivers/hwmon/max1619.c
浏览文件 @
c43c1be0
此差异已折叠。
点击以展开。
drivers/hwmon/max6650.c
浏览文件 @
c43c1be0
此差异已折叠。
点击以展开。
drivers/hwmon/smsc47m192.c
浏览文件 @
c43c1be0
此差异已折叠。
点击以展开。
drivers/hwmon/thmc50.c
浏览文件 @
c43c1be0
此差异已折叠。
点击以展开。
drivers/hwmon/w83791d.c
浏览文件 @
c43c1be0
此差异已折叠。
点击以展开。
drivers/hwmon/w83792d.c
浏览文件 @
c43c1be0
此差异已折叠。
点击以展开。
drivers/hwmon/w83793.c
浏览文件 @
c43c1be0
此差异已折叠。
点击以展开。
drivers/hwmon/w83l785ts.c
浏览文件 @
c43c1be0
此差异已折叠。
点击以展开。
drivers/hwmon/w83l786ng.c
浏览文件 @
c43c1be0
此差异已折叠。
点击以展开。
drivers/i2c/busses/i2c-amd756-s4882.c
浏览文件 @
c43c1be0
...
...
@@ -155,6 +155,16 @@ static int __init amd756_s4882_init(void)
int
i
,
error
;
union
i2c_smbus_data
ioconfig
;
/* Configure the PCA9556 multiplexer */
ioconfig
.
byte
=
0x00
;
/* All I/O to output mode */
error
=
i2c_smbus_xfer
(
&
amd756_smbus
,
0x18
,
0
,
I2C_SMBUS_WRITE
,
0x03
,
I2C_SMBUS_BYTE_DATA
,
&
ioconfig
);
if
(
error
)
{
dev_err
(
&
amd756_smbus
.
dev
,
"PCA9556 configuration failed
\n
"
);
error
=
-
EIO
;
goto
ERROR0
;
}
/* Unregister physical bus */
error
=
i2c_del_adapter
(
&
amd756_smbus
);
if
(
error
)
{
...
...
@@ -198,22 +208,11 @@ static int __init amd756_s4882_init(void)
s4882_algo
[
3
].
smbus_xfer
=
amd756_access_virt3
;
s4882_algo
[
4
].
smbus_xfer
=
amd756_access_virt4
;
/* Configure the PCA9556 multiplexer */
ioconfig
.
byte
=
0x00
;
/* All I/O to output mode */
error
=
amd756_smbus
.
algo
->
smbus_xfer
(
&
amd756_smbus
,
0x18
,
0
,
I2C_SMBUS_WRITE
,
0x03
,
I2C_SMBUS_BYTE_DATA
,
&
ioconfig
);
if
(
error
)
{
dev_err
(
&
amd756_smbus
.
dev
,
"PCA9556 configuration failed
\n
"
);
error
=
-
EIO
;
goto
ERROR3
;
}
/* Register virtual adapters */
for
(
i
=
0
;
i
<
5
;
i
++
)
{
error
=
i2c_add_adapter
(
s4882_adapter
+
i
);
if
(
error
)
{
dev_err
(
&
amd756_smbus
.
dev
,
printk
(
KERN_ERR
"i2c-amd756-s4882: "
"Virtual adapter %d registration "
"failed, module not inserted
\n
"
,
i
);
for
(
i
--
;
i
>=
0
;
i
--
)
...
...
@@ -252,8 +251,8 @@ static void __exit amd756_s4882_exit(void)
/* Restore physical bus */
if
(
i2c_add_adapter
(
&
amd756_smbus
))
dev_err
(
&
amd756_smbus
.
dev
,
"Physical bus restoration
"
"
failed
\n
"
);
printk
(
KERN_ERR
"i2c-amd756-s4882:
"
"Physical bus restoration
failed
\n
"
);
}
MODULE_AUTHOR
(
"Jean Delvare <khali@linux-fr.org>"
);
...
...
drivers/i2c/busses/i2c-nforce2-s4985.c
浏览文件 @
c43c1be0
...
...
@@ -150,6 +150,16 @@ static int __init nforce2_s4985_init(void)
int
i
,
error
;
union
i2c_smbus_data
ioconfig
;
/* Configure the PCA9556 multiplexer */
ioconfig
.
byte
=
0x00
;
/* All I/O to output mode */
error
=
i2c_smbus_xfer
(
nforce2_smbus
,
0x18
,
0
,
I2C_SMBUS_WRITE
,
0x03
,
I2C_SMBUS_BYTE_DATA
,
&
ioconfig
);
if
(
error
)
{
dev_err
(
&
nforce2_smbus
->
dev
,
"PCA9556 configuration failed
\n
"
);
error
=
-
EIO
;
goto
ERROR0
;
}
/* Unregister physical bus */
if
(
!
nforce2_smbus
)
return
-
ENODEV
;
...
...
@@ -191,24 +201,13 @@ static int __init nforce2_s4985_init(void)
s4985_algo
[
3
].
smbus_xfer
=
nforce2_access_virt3
;
s4985_algo
[
4
].
smbus_xfer
=
nforce2_access_virt4
;
/* Configure the PCA9556 multiplexer */
ioconfig
.
byte
=
0x00
;
/* All I/O to output mode */
error
=
nforce2_smbus
->
algo
->
smbus_xfer
(
nforce2_smbus
,
0x18
,
0
,
I2C_SMBUS_WRITE
,
0x03
,
I2C_SMBUS_BYTE_DATA
,
&
ioconfig
);
if
(
error
)
{
dev_err
(
&
nforce2_smbus
->
dev
,
"PCA9556 configuration failed
\n
"
);
error
=
-
EIO
;
goto
ERROR3
;
}
/* Register virtual adapters */
for
(
i
=
0
;
i
<
5
;
i
++
)
{
error
=
i2c_add_adapter
(
s4985_adapter
+
i
);
if
(
error
)
{
dev_err
(
&
nforce2_smbus
->
dev
,
"Virtual adapter %d registration "
"failed, module not inserted
\n
"
,
i
);
printk
(
KERN_ERR
"i2c-nforce2-s4985: "
"Virtual adapter %d registration "
"failed, module not inserted
\n
"
,
i
);
for
(
i
--
;
i
>=
0
;
i
--
)
i2c_del_adapter
(
s4985_adapter
+
i
);
goto
ERROR3
;
...
...
@@ -245,8 +244,8 @@ static void __exit nforce2_s4985_exit(void)
/* Restore physical bus */
if
(
i2c_add_adapter
(
nforce2_smbus
))
dev_err
(
&
nforce2_smbus
->
dev
,
"Physical bus restoration
"
"
failed
\n
"
);
printk
(
KERN_ERR
"i2c-nforce2-s4985:
"
"Physical bus restoration
failed
\n
"
);
}
MODULE_AUTHOR
(
"Jean Delvare <khali@linux-fr.org>"
);
...
...
drivers/i2c/chips/eeprom.c
浏览文件 @
c43c1be0
此差异已折叠。
点击以展开。
drivers/i2c/chips/max6875.c
浏览文件 @
c43c1be0
此差异已折叠。
点击以展开。
drivers/i2c/chips/pca9539.c
浏览文件 @
c43c1be0
此差异已折叠。
点击以展开。
drivers/i2c/chips/pcf8574.c
浏览文件 @
c43c1be0
此差异已折叠。
点击以展开。
drivers/i2c/chips/pcf8575.c
浏览文件 @
c43c1be0
此差异已折叠。
点击以展开。
drivers/i2c/chips/pcf8591.c
浏览文件 @
c43c1be0
此差异已折叠。
点击以展开。
drivers/i2c/i2c-core.c
浏览文件 @
c43c1be0
...
...
@@ -654,6 +654,10 @@ int i2c_del_adapter(struct i2c_adapter *adap)
dev_dbg
(
&
adap
->
dev
,
"adapter [%s] unregistered
\n
"
,
adap
->
name
);
/* Clear the device structure in case this adapter is ever going to be
added again */
memset
(
&
adap
->
dev
,
0
,
sizeof
(
adap
->
dev
));
out_unlock:
mutex_unlock
(
&
core_lock
);
return
res
;
...
...
drivers/w1/masters/ds2482.c
浏览文件 @
c43c1be0
此差异已折叠。
点击以展开。
firmware/.gitignore
0 → 100644
浏览文件 @
c43c1be0
*.gen.S
*.fw
*.bin
*.csp
*.dsp
ihex2fw
firmware/Makefile
浏览文件 @
c43c1be0
...
...
@@ -56,7 +56,7 @@ fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA28X) += keyspan/usa28x.fw
fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA49W)
+=
keyspan/usa49w.fw
fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA49WLC)
+=
keyspan/usa49wlc.fw
else
fw-shipped-
:
=
keyspan/mpr.fw keyspan/usa18x.fw keyspan/usa19.fw
\
fw-shipped-
+
=
keyspan/mpr.fw keyspan/usa18x.fw keyspan/usa19.fw
\
keyspan/usa19qi.fw keyspan/usa19qw.fw keyspan/usa19w.fw
\
keyspan/usa28.fw keyspan/usa28xa.fw keyspan/usa28xb.fw
\
keyspan/usa28x.fw keyspan/usa49w.fw keyspan/usa49wlc.fw
...
...
fs/compat_ioctl.c
浏览文件 @
c43c1be0
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录