Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
dcb326a2
Commit
dcb326a2
authored
Feb 23, 2004
by
Greg Kroah-Hartman
Browse files
Options
Browse Files
Download
Plain Diff
Merge kroah.com:/home/greg/linux/BK/bleed-2.6
into kroah.com:/home/greg/linux/BK/i2c-2.6
parents
be758139
37d85919
Changes
28
Hide whitespace changes
Inline
Side-by-side
Showing
28 changed files
with
1368 additions
and
528 deletions
+1368
-528
Documentation/i2c/sysfs-interface
Documentation/i2c/sysfs-interface
+158
-97
drivers/i2c/Kconfig
drivers/i2c/Kconfig
+0
-3
drivers/i2c/busses/Kconfig
drivers/i2c/busses/Kconfig
+11
-0
drivers/i2c/busses/Makefile
drivers/i2c/busses/Makefile
+1
-0
drivers/i2c/busses/i2c-ali1535.c
drivers/i2c/busses/i2c-ali1535.c
+1
-1
drivers/i2c/busses/i2c-i801.c
drivers/i2c/busses/i2c-i801.c
+1
-1
drivers/i2c/busses/i2c-ixp42x.c
drivers/i2c/busses/i2c-ixp42x.c
+180
-0
drivers/i2c/busses/i2c-sis5595.c
drivers/i2c/busses/i2c-sis5595.c
+1
-1
drivers/i2c/busses/i2c-voodoo3.c
drivers/i2c/busses/i2c-voodoo3.c
+2
-0
drivers/i2c/chips/Kconfig
drivers/i2c/chips/Kconfig
+11
-0
drivers/i2c/chips/Makefile
drivers/i2c/chips/Makefile
+1
-0
drivers/i2c/chips/adm1021.c
drivers/i2c/chips/adm1021.c
+13
-13
drivers/i2c/chips/asb100.c
drivers/i2c/chips/asb100.c
+24
-24
drivers/i2c/chips/fscher.c
drivers/i2c/chips/fscher.c
+51
-46
drivers/i2c/chips/gl518sm.c
drivers/i2c/chips/gl518sm.c
+44
-44
drivers/i2c/chips/it87.c
drivers/i2c/chips/it87.c
+68
-71
drivers/i2c/chips/lm75.c
drivers/i2c/chips/lm75.c
+6
-6
drivers/i2c/chips/lm78.c
drivers/i2c/chips/lm78.c
+46
-46
drivers/i2c/chips/lm80.c
drivers/i2c/chips/lm80.c
+567
-0
drivers/i2c/chips/lm83.c
drivers/i2c/chips/lm83.c
+16
-16
drivers/i2c/chips/lm85.c
drivers/i2c/chips/lm85.c
+50
-50
drivers/i2c/chips/lm90.c
drivers/i2c/chips/lm90.c
+20
-20
drivers/i2c/chips/via686a.c
drivers/i2c/chips/via686a.c
+40
-40
drivers/i2c/chips/w83781d.c
drivers/i2c/chips/w83781d.c
+41
-40
drivers/i2c/chips/w83l785ts.c
drivers/i2c/chips/w83l785ts.c
+7
-4
drivers/i2c/i2c-core.c
drivers/i2c/i2c-core.c
+2
-2
drivers/pci/quirks.c
drivers/pci/quirks.c
+5
-3
include/linux/pci_ids.h
include/linux/pci_ids.h
+1
-0
No files found.
Documentation/i2c/sysfs-interface
View file @
dcb326a2
...
...
@@ -3,22 +3,44 @@ Naming and data format standards for sysfs files
The libsensors library offers an interface to the raw sensors data
through the sysfs interface. See libsensors documentation and source for
more further information.
more further information. As of writing this document, libsensors
(from lm_sensors 2.8.3) is heavily chip-dependant. Adding or updating
support for any given chip requires modifying the library's code.
This is because libsensors was written for the procfs interface
older kernel modules were using, which wasn't standardized enough.
Recent versions of libsensors (from lm_sensors 2.8.2 and later) have
support for the sysfs interface, though.
The new sysfs interface was designed to be as chip-independant as
possible.
Note that motherboards vary widely in the connections to sensor chips.
There is no standard that ensures, for example, that the second
temperature sensor is connected to the CPU, or that the second fan is on
the CPU. Also, some values reported by the chips need some computation
before they make full sense. For example, most chips can only measure
voltages between 0 and +4V. Other voltages are scaled back into that
range using external resistors. Since the values of these resistors
can change from motherboard to motherboard, the conversions cannot be
hard coded into the driver and have to be done in user space.
For this reason, even if we aim at a chip-independant libsensors, it will
still require a configuration file (e.g. /etc/sensors.conf) for proper
values conversion, labeling of inputs and hiding of unused inputs.
An alternative method that some programs use is to access the sysfs
files directly. This document briefly describes the standards that the
drivers follow, so that an application program can scan for entries and
access this data in a simple and consistent way.
access this data in a simple and consistent way. That said, such programs
will have to implement conversion, labeling and hiding of inputs. For
this reason, it is still not recommended to bypass the library.
If you are developing a userspace application please send us feedback on
this standard.
Note that motherboards vary widely in the connections to sensor chips.
There is no standard that ensures, for example, that the second
temperature sensor is connected to the CPU, or that the second fan is on
the CPU. Therefore, programs must provide a facility for the user to
label or bind /proc entries for display. Sensor chips often have unused
inputs that should be ignored by user programs.
Note that this standard isn't completely established yet, so it is subject
to changes, even important ones. One more reason to use the library instead
of accessing sysfs files directly.
Each chip gets its own directory in the sysfs /sys/devices tree. To
find all sensor chips, it is easier to follow the symlinks from
...
...
@@ -28,6 +50,15 @@ All sysfs values are fixed point numbers. To get the true value of some
of the values, you should divide by the specified value.
There is only one value per file, unlike the older /proc specification.
The common scheme for files naming is: <type><number>_<item>. Usual
types for sensor chips are "in" (voltage), "temp" (temperature) and
"fan" (fan). Usual items are "input" (measured value), "max" (high
threshold, "min" (low threshold). Numbering usually starts from 1,
except for voltages which start from 0 (because most data sheets use
this). A number is always used for elements that can be present more
than once, even if there is a single element of the given type on the
specific chip. Other files do not refer to a specific element, so
they have a simple name, and no number.
Alarms are direct indications read from the chips. The drivers do NOT
make comparisons of readings to thresholds. This allows violations
...
...
@@ -38,71 +69,21 @@ to cause an alarm) is chip-dependent.
-------------------------------------------------------------------------
sysfs entries are as follows:
Entry Function
----- --------
alarms Alarm bitmask.
Read only.
Integer representation of one to four bytes.
A '1' bit means an alarm.
Chips should be programmed for 'comparator' mode so that
the alarm will 'come back' after you read the register
if it is still valid.
Generally a direct representation of a chip's internal
alarm registers; there is no standard for the position
of individual bits.
Bits are defined in kernel/include/sensors.h.
beep_enable Beep/interrupt enable
0 to disable.
1 to enable.
Read/Write
beep_mask Bitmask for beep.
Same format as 'alarms' with the same bit locations.
Read only.
************
* Voltages *
************
curr_max[1-n] Current max value
Fixed point XXXXX, divide by 1000 to get Amps.
Read/Write.
curr_min[1-n] Current min value.
Fixed point XXXXX, divide by 1000 to get Amps.
Read/Write.
curr_input[1-n] Current input value
Fixed point XXXXX, divide by 1000 to get Amps.
Read only.
eeprom Raw EEPROM data in binary form.
Read only.
fan_min[1-3] Fan minimum value
Integer value indicating RPM
Read/Write.
fan_input[1-3] Fan input value.
Integer value indicating RPM
Read only.
fan_div[1-3] Fan divisor.
Integers in powers of two (1,2,4,8,16,32,64,128).
Some chips only support values 1,2,4,8.
See doc/fan-divisors for details.
in_min[0-8] Voltage min value.
in[0-8]_min Voltage min value.
Fixed point value in form XXXX. Divide by 1000 to get
Volts.
Read/Write
in
_max[0-8]
Voltage max value.
in
[0-8]_max
Voltage max value.
Fixed point value in form XXXX. Divide by 1000 to get
Volts.
Read/Write
in
_input[0-8]
Voltage input value.
in
[0-8]_input
Voltage input value.
Fixed point value in form XXXX. Divide by 1000 to get
Volts.
Read only
...
...
@@ -116,76 +97,156 @@ in_input[0-8] Voltage input value.
These drivers will output the actual voltage.
First two values are read/write and third is read only.
Typical usage:
in_*0 CPU #1 voltage (not scaled)
in_*1 CPU #1 voltage (not scaled)
in_*2 3.3V nominal (not scaled)
in_*3 5.0V nominal (scaled)
in_*4 12.0V nominal (scaled)
in_*5 -12.0V nominal (scaled)
in_*6 -5.0V nominal (scaled)
in_*7 varies
in_*8 varies
pwm[1-3] Pulse width modulation fan control.
in0_* CPU #1 voltage (not scaled)
in1_* CPU #1 voltage (not scaled)
in2_* 3.3V nominal (not scaled)
in3_* 5.0V nominal (scaled)
in4_* 12.0V nominal (scaled)
in5_* -12.0V nominal (scaled)
in6_* -5.0V nominal (scaled)
in7_* varies
in8_* varies
in0_ref CPU core reference voltage.
Read only.
Fixed point value in form XXXX corresponding to CPU core
voltage as told to the sensor chip. Divide by 1000 to
get Volts. Not always correct.
vrm Voltage Regulator Module version number.
Read only.
Two digit number (XX), first is major version, second is
minor version.
Affects the way the driver calculates the core voltage from
the vid pins. See doc/vid for details.
********
* Fans *
********
fan[1-3]_min Fan minimum value
Integer value indicating RPM
Read/Write.
fan[1-3]_input Fan input value.
Integer value indicating RPM
Read only.
fan[1-3]_div Fan divisor.
Integers in powers of two (1,2,4,8,16,32,64,128).
Some chips only support values 1,2,4,8.
See doc/fan-divisors for details.
fan[1-3]_pwm Pulse width modulation fan control.
Integer 0 - 255
Read/Write
255 is max or 100%.
Corresponds to the fans 1-3.
pwm_enable[1-3] pwm enable
not always present even if pwm* is.
fan[1-3]_pwm_enable
Switch PWM on and off.
Not always present even if fan*_pwm is.
0 to turn off
1 to turn on
Read/Write
sensor[1-3] Sensor type selection.
****************
* Temperatures *
****************
temp[1-3]_type Sensor type selection.
Integers 1,2,3, or thermistor Beta value (3435)
Read/Write.
temp
_max[1-4]
Temperature max value.
temp
[1-4]_max
Temperature max value.
Fixed point value in form XXXXX and should be divided by
1000 to get degrees Celsius.
Read/Write value.
temp
_min[1-3]
Temperature min value.
temp
[1-3]_min
Temperature min value.
Fixed point value in form XXXXX and should be divided by
1000 to get degrees Celsius.
Read/Write value.
temp_hyst[1-3] Temperature hysteresis value.
temp[1-3]_max_hyst
Temperature hysteresis value for max limit.
Fixed point value in form XXXXX and should be divided by
1000 to get degrees Celsius. Must be reported as an
absolute temperature, NOT a delta from the max value.
Read/Write value.
temp
_input[1-4]
Temperature input value.
temp
[1-4]_input
Temperature input value.
Fixed point value in form XXXXX and should be divided by
1000 to get degrees Celsius.
Read only value.
temp
_crit Temperature critical value, typically greater than all
temp_max values.
temp
[1-4]_crit Temperature critical value, typically greater than
corresponding
temp_max values.
Fixed point value in form XXXXX and should be divided by
1000 to get degrees Celsius.
Common to all temperature channels.
Read/Write value.
If there are multiple temperature sensors, temp_*1 is
temp[1-2]_crit_hyst
Temperature hysteresis value for critical limit.
Fixed point value in form XXXXX and should be divided by
1000 to get degrees Celsius. Must be reported as an
absolute temperature, NOT a delta from the critical value.
Read/Write value.
If there are multiple temperature sensors, temp1_* is
generally the sensor inside the chip itself, generally
reported as "motherboard temperature". temp
_*2
to
temp
_*4
are generally sensors external to the chip
reported as "motherboard temperature". temp
2_*
to
temp
4_*
are generally sensors external to the chip
itself, for example the thermal diode inside the CPU or
a thermistor nearby.
vid CPU core voltage.
************
* Currents *
************
Note that no known chip provides current measurements as of writing,
so this part is theoretical, so to say.
curr[1-n]_max Current max value
Fixed point XXXXX, divide by 1000 to get Amps.
Read/Write.
curr[1-n]_min Current min value.
Fixed point XXXXX, divide by 1000 to get Amps.
Read/Write.
curr[1-n]_input Current input value
Fixed point XXXXX, divide by 1000 to get Amps.
Read only.
Fixed point value in form XXXX corresponding to CPU core
voltage as told to the sensor chip. Divide by 1000 to
get Volts. Not always correct.
vrm Voltage Regulator Module version number.
*********
* Other *
*********
alarms Alarm bitmask.
Read only.
Integer representation of one to four bytes.
A '1' bit means an alarm.
Chips should be programmed for 'comparator' mode so that
the alarm will 'come back' after you read the register
if it is still valid.
Generally a direct representation of a chip's internal
alarm registers; there is no standard for the position
of individual bits.
Bits are defined in kernel/include/sensors.h.
beep_enable Beep/interrupt enable
0 to disable.
1 to enable.
Read/Write
beep_mask Bitmask for beep.
Same format as 'alarms' with the same bit locations.
Read only.
eeprom Raw EEPROM data in binary form.
Read only.
Two digit number (XX), first is major version, second is
minor version.
Affects the way the driver calculates the core voltage from
the vid pins. See doc/vid for details.
drivers/i2c/Kconfig
View file @
dcb326a2
...
...
@@ -15,9 +15,6 @@ config I2C
Both I2C and SMBus are supported here. You will need this for
hardware sensors support, and also for Video For Linux support.
Specifically, if you want to use a BT848 based frame grabber/overlay
boards under Linux, say Y here and also to "I2C bit-banging
interfaces", below.
If you want I2C support, you should say Y here and also to the
specific driver for your bus adapter(s) below.
...
...
drivers/i2c/busses/Kconfig
View file @
dcb326a2
...
...
@@ -144,6 +144,17 @@ config I2C_ITE
This support is also available as a module. If so, the module
will be called i2c-ite.
config I2C_IXP42X
tristate "IXP42x GPIO-Based I2C Interface"
depends on I2C && ARCH_IXP425
select I2C_ALGOBIT
help
Say Y here if you have an Intel IXP42x(420,421,422,425) based
system and are using GPIO lines for an I2C bus.
This support is also available as a module. If so, the module
will be called i2c-ixp42x.
config I2C_KEYWEST
tristate "Powermac Keywest I2C interface"
depends on I2C && PPC_PMAC
...
...
drivers/i2c/busses/Makefile
View file @
dcb326a2
...
...
@@ -15,6 +15,7 @@ obj-$(CONFIG_I2C_IBM_IIC) += i2c-ibm_iic.o
obj-$(CONFIG_I2C_IOP3XX)
+=
i2c-iop3xx.o
obj-$(CONFIG_I2C_ISA)
+=
i2c-isa.o
obj-$(CONFIG_I2C_ITE)
+=
i2c-ite.o
obj-$(CONFIG_I2C_IXP42X)
+=
i2c-ixp42x.o
obj-$(CONFIG_I2C_KEYWEST)
+=
i2c-keywest.o
obj-$(CONFIG_I2C_NFORCE2)
+=
i2c-nforce2.o
obj-$(CONFIG_I2C_PHILIPSPAR)
+=
i2c-philips-par.o
...
...
drivers/i2c/busses/i2c-ali1535.c
View file @
dcb326a2
...
...
@@ -517,6 +517,7 @@ static int __devinit ali1535_probe(struct pci_dev *dev, const struct pci_device_
static
void
__devexit
ali1535_remove
(
struct
pci_dev
*
dev
)
{
i2c_del_adapter
(
&
ali1535_adapter
);
release_region
(
ali1535_smba
,
ALI1535_SMB_IOSIZE
);
}
static
struct
pci_driver
ali1535_driver
=
{
...
...
@@ -534,7 +535,6 @@ static int __init i2c_ali1535_init(void)
static
void
__exit
i2c_ali1535_exit
(
void
)
{
pci_unregister_driver
(
&
ali1535_driver
);
release_region
(
ali1535_smba
,
ALI1535_SMB_IOSIZE
);
}
MODULE_AUTHOR
(
"Frodo Looijaard <frodol@dds.nl>, "
...
...
drivers/i2c/busses/i2c-i801.c
View file @
dcb326a2
...
...
@@ -608,6 +608,7 @@ static int __devinit i801_probe(struct pci_dev *dev, const struct pci_device_id
static
void
__devexit
i801_remove
(
struct
pci_dev
*
dev
)
{
i2c_del_adapter
(
&
i801_adapter
);
release_region
(
i801_smba
,
(
isich4
?
16
:
8
));
}
static
struct
pci_driver
i801_driver
=
{
...
...
@@ -625,7 +626,6 @@ static int __init i2c_i801_init(void)
static
void
__exit
i2c_i801_exit
(
void
)
{
pci_unregister_driver
(
&
i801_driver
);
release_region
(
i801_smba
,
(
isich4
?
16
:
8
));
}
MODULE_AUTHOR
(
"Frodo Looijaard <frodol@dds.nl>, "
...
...
drivers/i2c/busses/i2c-ixp42x.c
0 → 100644
View file @
dcb326a2
/*
* drivers/i2c/i2c-adap-ixp42x.c
*
* Intel's IXP42x XScale NPU chipsets (IXP420, 421, 422, 425) do not have
* an on board I2C controller but provide 16 GPIO pins that are often
* used to create an I2C bus. This driver provides an i2c_adapter
* interface that plugs in under algo_bit and drives the GPIO pins
* as instructed by the alogorithm driver.
*
* Author: Deepak Saxena <dsaxena@plexity.net>
*
* Copyright (c) 2003-2004 MontaVista Software Inc.
*
* This file is licensed under the terms of the GNU General Public
* License version 2. This program is licensed "as is" without any
* warranty of any kind, whether express or implied.
*
* NOTE: Since different platforms will use different GPIO pins for
* I2C, this driver uses an IXP42x-specific platform_data
* pointer to pass the GPIO numbers to the driver. This
* allows us to support all the different IXP42x platforms
* w/o having to put #ifdefs in this driver.
*
* See arch/arm/mach-ixp42x/ixdp425.c for an example of building a
* device list and filling in the ixp42x_i2c_pins data structure
* that is passed as the platform_data to this driver.
*/
#include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_BUS
#define DEBUG 1
#endif
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/module.h>
#include <linux/i2c.h>
#include <asm/hardware.h>
/* Pick up IXP42x-specific bits */
static
inline
int
ixp42x_scl_pin
(
void
*
data
)
{
return
((
struct
ixp42x_i2c_pins
*
)
data
)
->
scl_pin
;
}
static
inline
int
ixp42x_sda_pin
(
void
*
data
)
{
return
((
struct
ixp42x_i2c_pins
*
)
data
)
->
sda_pin
;
}
static
void
ixp42x_bit_setscl
(
void
*
data
,
int
val
)
{
gpio_line_set
(
ixp42x_scl_pin
(
data
),
0
);
gpio_line_config
(
ixp42x_scl_pin
(
data
),
val
?
IXP425_GPIO_IN
:
IXP425_GPIO_OUT
);
}
static
void
ixp42x_bit_setsda
(
void
*
data
,
int
val
)
{
gpio_line_set
(
ixp42x_sda_pin
(
data
),
0
);
gpio_line_config
(
ixp42x_sda_pin
(
data
),
val
?
IXP425_GPIO_IN
:
IXP425_GPIO_OUT
);
}
static
int
ixp42x_bit_getscl
(
void
*
data
)
{
int
scl
;
gpio_line_config
(
ixp42x_scl_pin
(
data
),
IXP425_GPIO_IN
);
gpio_line_get
(
ixp42x_scl_pin
(
data
),
&
scl
);
return
scl
;
}
static
int
ixp42x_bit_getsda
(
void
*
data
)
{
int
sda
;
gpio_line_config
(
ixp42x_sda_pin
(
data
),
IXP425_GPIO_IN
);
gpio_line_get
(
ixp42x_sda_pin
(
data
),
&
sda
);
return
sda
;
}
struct
ixp42x_i2c_data
{
struct
ixp42x_i2c_pins
*
gpio_pins
;
struct
i2c_adapter
adapter
;
struct
i2c_algo_bit_data
algo_data
;
};
static
int
ixp42x_i2c_remove
(
struct
device
*
dev
)
{
struct
platform_device
*
plat_dev
=
to_platform_device
(
dev
);
struct
ixp42x_i2c_data
*
drv_data
=
dev_get_drvdata
(
&
plat_dev
->
dev
);
dev_set_drvdata
(
&
plat_dev
->
dev
,
NULL
);
i2c_bit_del_bus
(
&
drv_data
->
adapter
);
kfree
(
drv_data
);
return
0
;
}
static
int
ixp42x_i2c_probe
(
struct
device
*
dev
)
{
int
err
;
struct
platform_device
*
plat_dev
=
to_platform_device
(
dev
);
struct
ixp42x_i2c_pins
*
gpio
=
plat_dev
->
dev
.
platform_data
;
struct
ixp42x_i2c_data
*
drv_data
=
kmalloc
(
sizeof
(
struct
ixp42x_i2c_data
),
GFP_KERNEL
);
if
(
!
drv_data
)
return
-
ENOMEM
;
memzero
(
drv_data
,
sizeof
(
struct
ixp42x_i2c_data
));
drv_data
->
gpio_pins
=
gpio
;
/*
* We could make a lot of these structures static, but
* certain platforms may have multiple GPIO-based I2C
* buses for various device domains, so we need per-device
* algo_data->data.
*/
drv_data
->
algo_data
.
data
=
gpio
;
drv_data
->
algo_data
.
setsda
=
ixp42x_bit_setsda
;
drv_data
->
algo_data
.
setscl
=
ixp42x_bit_setscl
;
drv_data
->
algo_data
.
getsda
=
ixp42x_bit_getsda
;
drv_data
->
algo_data
.
getscl
=
ixp42x_bit_getscl
;
drv_data
->
algo_data
.
udelay
=
10
;
drv_data
->
algo_data
.
mdelay
=
10
;
drv_data
->
algo_data
.
timeout
=
100
;
drv_data
->
adapter
.
id
=
I2C_HW_B_IXP425
,
drv_data
->
adapter
.
algo_data
=
&
drv_data
->
algo_data
,
drv_data
->
adapter
.
dev
.
parent
=
&
plat_dev
->
dev
;
gpio_line_config
(
gpio
->
scl_pin
,
IXP425_GPIO_IN
);
gpio_line_config
(
gpio
->
sda_pin
,
IXP425_GPIO_IN
);
gpio_line_set
(
gpio
->
scl_pin
,
0
);
gpio_line_set
(
gpio
->
sda_pin
,
0
);
if
((
err
=
i2c_bit_add_bus
(
&
drv_data
->
adapter
)
!=
0
))
{
printk
(
KERN_ERR
"ERROR: Could not install %s
\n
"
,
dev
->
bus_id
);
kfree
(
drv_data
);
return
err
;
}
dev_set_drvdata
(
&
plat_dev
->
dev
,
drv_data
);
return
0
;
}
static
struct
device_driver
ixp42x_i2c_driver
=
{
.
name
=
"IXP42X-I2C"
,
.
bus
=
&
platform_bus_type
,
.
probe
=
ixp42x_i2c_probe
,
.
remove
=
ixp42x_i2c_remove
,
};
static
int
__init
ixp42x_i2c_init
(
void
)
{
return
driver_register
(
&
ixp42x_i2c_driver
);
}
static
void
__exit
ixp42x_i2c_exit
(
void
)
{
driver_unregister
(
&
ixp42x_i2c_driver
);
}
module_init
(
ixp42x_i2c_init
);
module_exit
(
ixp42x_i2c_exit
);
MODULE_DESCRIPTION
(
"GPIO-based I2C driver for IXP42x systems"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_AUTHOR
(
"Deepak Saxena <dsaxena@plexity.net>"
);
drivers/i2c/busses/i2c-sis5595.c
View file @
dcb326a2
...
...
@@ -391,6 +391,7 @@ static int __devinit sis5595_probe(struct pci_dev *dev, const struct pci_device_
static
void
__devexit
sis5595_remove
(
struct
pci_dev
*
dev
)
{
i2c_del_adapter
(
&
sis5595_adapter
);
release_region
(
sis5595_base
+
SMB_INDEX
,
2
);
}
static
struct
pci_driver
sis5595_driver
=
{
...
...
@@ -408,7 +409,6 @@ static int __init i2c_sis5595_init(void)
static
void
__exit
i2c_sis5595_exit
(
void
)
{
pci_unregister_driver
(
&
sis5595_driver
);
release_region
(
sis5595_base
+
SMB_INDEX
,
2
);
}
MODULE_AUTHOR
(
"Frodo Looijaard <frodol@dds.nl>"
);
...
...
drivers/i2c/busses/i2c-voodoo3.c
View file @
dcb326a2
...
...
@@ -171,6 +171,7 @@ static struct i2c_algo_bit_data voo_i2c_bit_data = {
static
struct
i2c_adapter
voodoo3_i2c_adapter
=
{
.
owner
=
THIS_MODULE
,
.
class
=
I2C_ADAP_CLASS_TV_ANALOG
,
.
name
=
"I2C Voodoo3/Banshee adapter"
,
.
algo_data
=
&
voo_i2c_bit_data
,
};
...
...
@@ -187,6 +188,7 @@ static struct i2c_algo_bit_data voo_ddc_bit_data = {
static
struct
i2c_adapter
voodoo3_ddc_adapter
=
{
.
owner
=
THIS_MODULE
,
.
class
=
I2C_ADAP_CLASS_DDC
,
.
name
=
"DDC Voodoo3/Banshee adapter"
,
.
algo_data
=
&
voo_ddc_bit_data
,
};
...
...
drivers/i2c/chips/Kconfig
View file @
dcb326a2
...
...
@@ -102,6 +102,17 @@ config SENSORS_LM78
This driver can also be built as a module. If so, the module
will be called lm78.
config SENSORS_LM80
tristate "National Semiconductor LM80"
depends on I2C && EXPERIMENTAL
select I2C_SENSOR
help
If you say yes here you get support for National Semiconductor
LM80 sensor chips.
This driver can also be built as a module. If so, the module
will be called lm80.
config SENSORS_LM83
tristate "National Semiconductor LM83"
depends on I2C && EXPERIMENTAL
...
...
drivers/i2c/chips/Makefile
View file @
dcb326a2
...
...
@@ -13,6 +13,7 @@ obj-$(CONFIG_SENSORS_GL518SM) += gl518sm.o
obj-$(CONFIG_SENSORS_IT87)
+=
it87.o
obj-$(CONFIG_SENSORS_LM75)
+=
lm75.o
obj-$(CONFIG_SENSORS_LM78)
+=
lm78.o
obj-$(CONFIG_SENSORS_LM80)
+=
lm80.o
obj-$(CONFIG_SENSORS_LM83)
+=
lm83.o
obj-$(CONFIG_SENSORS_LM85)
+=
lm85.o
obj-$(CONFIG_SENSORS_LM90)
+=
lm90.o
...
...
drivers/i2c/chips/adm1021.c
View file @
dcb326a2
...
...
@@ -148,7 +148,7 @@ static int read_only = 0;
/* This is the driver that will be inserted */
static
struct
i2c_driver
adm1021_driver
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"
ADM1021-MAX1617
"
,
.
name
=
"
adm1021
"
,
.
id
=
I2C_DRIVERID_ADM1021
,
.
flags
=
I2C_DF_NOTIFY
,
.
attach_adapter
=
adm1021_attach_adapter
,
...
...
@@ -206,12 +206,12 @@ set(temp_hyst, ADM1021_REG_THYST_W);
set
(
remote_temp_max
,
ADM1021_REG_REMOTE_TOS_W
);
set
(
remote_temp_hyst
,
ADM1021_REG_REMOTE_THYST_W
);
static
DEVICE_ATTR
(
temp
_max1
,
S_IWUSR
|
S_IRUGO
,
show_temp_max
,
set_temp_max
);
static
DEVICE_ATTR
(
temp
_min1
,
S_IWUSR
|
S_IRUGO
,
show_temp_hyst
,
set_temp_hyst
);
static
DEVICE_ATTR
(
temp
_input1
,
S_IRUGO
,
show_temp_input
,
NULL
);
static
DEVICE_ATTR
(
temp
_max2
,
S_IWUSR
|
S_IRUGO
,
show_remote_temp_max
,
set_remote_temp_max
);
static
DEVICE_ATTR
(
temp
_min2
,
S_IWUSR
|
S_IRUGO
,
show_remote_temp_hyst
,
set_remote_temp_hyst
);
static
DEVICE_ATTR
(
temp
_input2
,
S_IRUGO
,
show_remote_temp_input
,
NULL
);
static
DEVICE_ATTR
(
temp
1_max
,
S_IWUSR
|
S_IRUGO
,
show_temp_max
,
set_temp_max
);
static
DEVICE_ATTR
(
temp
1_min
,
S_IWUSR
|
S_IRUGO
,
show_temp_hyst
,
set_temp_hyst
);
static
DEVICE_ATTR
(
temp
1_input
,
S_IRUGO
,
show_temp_input
,
NULL
);
static
DEVICE_ATTR
(
temp
2_max
,
S_IWUSR
|
S_IRUGO
,
show_remote_temp_max
,
set_remote_temp_max
);
static
DEVICE_ATTR
(
temp
2_min
,
S_IWUSR
|
S_IRUGO
,
show_remote_temp_hyst
,
set_remote_temp_hyst
);
static
DEVICE_ATTR
(
temp
2_input
,
S_IRUGO
,
show_remote_temp_input
,
NULL
);
static
DEVICE_ATTR
(
alarms
,
S_IRUGO
,
show_alarms
,
NULL
);
static
DEVICE_ATTR
(
die_code
,
S_IRUGO
,
show_die_code
,
NULL
);
...
...
@@ -331,12 +331,12 @@ static int adm1021_detect(struct i2c_adapter *adapter, int address, int kind)
adm1021_init_client
(
new_client
);
/* Register sysfs hooks */
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_max1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_min1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_input1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_max2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_min2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_input2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
2_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
2_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
2_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_alarms
);
if
(
data
->
type
==
adm1021
)
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_die_code
);
...
...
drivers/i2c/chips/asb100.c
View file @
dcb326a2
...
...
@@ -274,7 +274,7 @@ static ssize_t \
{ \
return show_in(dev, buf, 0x##offset); \
} \
static DEVICE_ATTR(in
_input##offse
t, S_IRUGO, \
static DEVICE_ATTR(in
##offset##_inpu
t, S_IRUGO, \
show_in##offset, NULL) \
static ssize_t \
show_in##offset##_min (struct device *dev, char *buf) \
...
...
@@ -296,9 +296,9 @@ static ssize_t set_in##offset##_max (struct device *dev, \
{ \
return set_in_max(dev, buf, count, 0x##offset); \
} \
static DEVICE_ATTR(in
_min##offset
, S_IRUGO | S_IWUSR, \
static DEVICE_ATTR(in
##offset##_min
, S_IRUGO | S_IWUSR, \
show_in##offset##_min, set_in##offset##_min) \
static DEVICE_ATTR(in
_max##offset
, S_IRUGO | S_IWUSR, \
static DEVICE_ATTR(in
##offset##_max
, S_IRUGO | S_IWUSR, \
show_in##offset##_max, set_in##offset##_max)
sysfs_in
(
0
)
...
...
@@ -310,9 +310,9 @@ sysfs_in(5)
sysfs_in
(
6
)
#define device_create_file_in(client, offset) do { \
device_create_file(&client->dev, &dev_attr_in
_input##offse
t); \
device_create_file(&client->dev, &dev_attr_in
_min##offset
); \
device_create_file(&client->dev, &dev_attr_in
_max##offset
); \
device_create_file(&client->dev, &dev_attr_in
##offset##_inpu
t); \
device_create_file(&client->dev, &dev_attr_in
##offset##_min
); \
device_create_file(&client->dev, &dev_attr_in
##offset##_max
); \
} while (0)
/* 3 Fans */
...
...
@@ -412,11 +412,11 @@ static ssize_t set_fan##offset##_div(struct device *dev, const char *buf, \
{ \
return set_fan_div(dev, buf, count, offset - 1); \
} \
static DEVICE_ATTR(fan
_input##offse
t, S_IRUGO, \
static DEVICE_ATTR(fan
##offset##_inpu
t, S_IRUGO, \
show_fan##offset, NULL) \
static DEVICE_ATTR(fan
_min##offset
, S_IRUGO | S_IWUSR, \
static DEVICE_ATTR(fan
##offset##_min
, S_IRUGO | S_IWUSR, \
show_fan##offset##_min, set_fan##offset##_min) \
static DEVICE_ATTR(fan
_div##offset
, S_IRUGO | S_IWUSR, \
static DEVICE_ATTR(fan
##offset##_div
, S_IRUGO | S_IWUSR, \
show_fan##offset##_div, set_fan##offset##_div)
sysfs_fan
(
1
)
...
...
@@ -424,9 +424,9 @@ sysfs_fan(2)
sysfs_fan
(
3
)
#define device_create_file_fan(client, offset) do { \
device_create_file(&client->dev, &dev_attr_fan
_input##offse
t); \
device_create_file(&client->dev, &dev_attr_fan
_min##offset
); \
device_create_file(&client->dev, &dev_attr_fan
_div##offset
); \
device_create_file(&client->dev, &dev_attr_fan
##offset##_inpu
t); \
device_create_file(&client->dev, &dev_attr_fan
##offset##_min
); \
device_create_file(&client->dev, &dev_attr_fan
##offset##_div
); \
} while (0)
/* 4 Temp. Sensors */
...
...
@@ -484,7 +484,7 @@ static ssize_t show_temp##num(struct device *dev, char *buf) \
{ \
return show_temp(dev, buf, num-1); \
} \
static DEVICE_ATTR(temp
_input##num
, S_IRUGO, show_temp##num, NULL) \
static DEVICE_ATTR(temp
##num##_input
, S_IRUGO, show_temp##num, NULL) \
static ssize_t show_temp_max##num(struct device *dev, char *buf) \
{ \
return show_temp_max(dev, buf, num-1); \
...
...
@@ -494,7 +494,7 @@ static ssize_t set_temp_max##num(struct device *dev, const char *buf, \
{ \
return set_temp_max(dev, buf, count, num-1); \
} \
static DEVICE_ATTR(temp
_max##num
, S_IRUGO | S_IWUSR, \
static DEVICE_ATTR(temp
##num##_max
, S_IRUGO | S_IWUSR, \
show_temp_max##num, set_temp_max##num) \
static ssize_t show_temp_hyst##num(struct device *dev, char *buf) \
{ \
...
...
@@ -505,7 +505,7 @@ static ssize_t set_temp_hyst##num(struct device *dev, const char *buf, \
{ \
return set_temp_hyst(dev, buf, count, num-1); \
} \
static DEVICE_ATTR(temp
_hyst##num
, S_IRUGO | S_IWUSR, \
static DEVICE_ATTR(temp
##num##_max_hyst
, S_IRUGO | S_IWUSR, \
show_temp_hyst##num, set_temp_hyst##num)
sysfs_temp
(
1
)
...
...
@@ -515,9 +515,9 @@ sysfs_temp(4)
/* VID */
#define device_create_file_temp(client, num) do { \
device_create_file(&client->dev, &dev_attr_temp
_input##num
); \
device_create_file(&client->dev, &dev_attr_temp
_max##num
); \
device_create_file(&client->dev, &dev_attr_temp
_hyst##num
); \
device_create_file(&client->dev, &dev_attr_temp
##num##_input
); \
device_create_file(&client->dev, &dev_attr_temp
##num##_max
); \
device_create_file(&client->dev, &dev_attr_temp
##num##_max_hyst
); \
} while (0)
static
ssize_t
show_vid
(
struct
device
*
dev
,
char
*
buf
)
...
...
@@ -526,9 +526,9 @@ static ssize_t show_vid(struct device *dev, char *buf)
return
sprintf
(
buf
,
"%d
\n
"
,
vid_from_reg
(
data
->
vid
,
data
->
vrm
));
}
static
DEVICE_ATTR
(
vid
,
S_IRUGO
,
show_vid
,
NULL
)
static
DEVICE_ATTR
(
in0_ref
,
S_IRUGO
,
show_vid
,
NULL
)
#define device_create_file_vid(client) \
device_create_file(&client->dev, &dev_attr_
vid
)
device_create_file(&client->dev, &dev_attr_
in0_ref
)
/* VRM */
static
ssize_t
show_vrm
(
struct
device
*
dev
,
char
*
buf
)
...
...
@@ -597,12 +597,12 @@ static ssize_t set_pwm_enable1(struct device *dev, const char *buf,
return
count
;
}
static
DEVICE_ATTR
(
pwm1
,
S_IRUGO
|
S_IWUSR
,
show_pwm1
,
set_pwm1
)
static
DEVICE_ATTR
(
pwm_enable1
,
S_IRUGO
|
S_IWUSR
,
static
DEVICE_ATTR
(
fan1_pwm
,
S_IRUGO
|
S_IWUSR
,
show_pwm1
,
set_pwm1
)
static
DEVICE_ATTR
(
fan1_pwm_enable
,
S_IRUGO
|
S_IWUSR
,
show_pwm_enable1
,
set_pwm_enable1
)
#define device_create_file_pwm1(client) do { \
device_create_file(&new_client->dev, &dev_attr_
pwm1
)
;
\
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
pwm_enable1
);
\
device_create_file(&new_client->dev, &dev_attr_
fan1_pwm
)
;
\
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
fan1_pwm_enable
);
\
}
while
(
0
)
/* This function is called when:
...
...
drivers/i2c/chips/fscher.c
View file @
dcb326a2
...
...
@@ -26,6 +26,11 @@
* and Philip Edelbrock <phil@netroedge.com>
*/
#include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_CHIP
#define DEBUG 1
#endif
#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
...
...
@@ -160,71 +165,71 @@ static int fscher_id = 0;
* Sysfs stuff
*/
#define sysfs_r(kind, offset, reg) \
static ssize_t show_##kind (struct fscher_data *, char *, int); \
static ssize_t show_##kind##offset (struct device *, char *); \
static ssize_t show_##kind##offset (struct device *dev, char *buf) \
#define sysfs_r(kind,
sub,
offset, reg) \
static ssize_t show_##kind
##sub
(struct fscher_data *, char *, int); \
static ssize_t show_##kind##offset
##sub
(struct device *, char *); \
static ssize_t show_##kind##offset
##sub
(struct device *dev, char *buf) \
{ \
struct i2c_client *client = to_i2c_client(dev); \
struct fscher_data *data = i2c_get_clientdata(client); \
fscher_update_client(client); \
return show_##kind(data, buf, (offset)); \
return show_##kind
##sub
(data, buf, (offset)); \
}
#define sysfs_w(kind, offset, reg) \
static ssize_t set_##kind (struct i2c_client *, struct fscher_data *, const char *, size_t, int, int); \
static ssize_t set_##kind##offset (struct device *, const char *, size_t); \
static ssize_t set_##kind##offset (struct device *dev, const char *buf, size_t count) \
#define sysfs_w(kind,
sub,
offset, reg) \
static ssize_t set_##kind
##sub
(struct i2c_client *, struct fscher_data *, const char *, size_t, int, int); \
static ssize_t set_##kind##offset
##sub
(struct device *, const char *, size_t); \
static ssize_t set_##kind##offset
##sub
(struct device *dev, const char *buf, size_t count) \
{ \
struct i2c_client *client = to_i2c_client(dev); \
struct fscher_data *data = i2c_get_clientdata(client); \
return set_##kind(client, data, buf, count, (offset), reg); \
return set_##kind
##sub
(client, data, buf, count, (offset), reg); \
}
#define sysfs_rw_n(kind, offset, reg) \
sysfs_r(kind, offset, reg) \
sysfs_w(kind, offset, reg) \
static DEVICE_ATTR(kind##offset
, S_IRUGO | S_IWUSR, show_##kind##offset, set_##kind##offset
);
#define sysfs_rw_n(kind,
sub,
offset, reg) \
sysfs_r(kind,
sub,
offset, reg) \
sysfs_w(kind,
sub,
offset, reg) \
static DEVICE_ATTR(kind##offset
##sub, S_IRUGO | S_IWUSR, show_##kind##offset##sub, set_##kind##offset##sub
);
#define sysfs_rw(kind, reg) \
sysfs_r(kind, 0, reg) \
sysfs_w(kind, 0, reg) \
static DEVICE_ATTR(kind
, S_IRUGO | S_IWUSR, show_##kind##0, set_##kind##0
);
#define sysfs_rw(kind,
sub,
reg) \
sysfs_r(kind,
sub,
0, reg) \
sysfs_w(kind,
sub,
0, reg) \
static DEVICE_ATTR(kind
##sub, S_IRUGO | S_IWUSR, show_##kind##0##sub, set_##kind##0##sub
);
#define sysfs_ro_n(kind, offset, reg) \
sysfs_r(kind, offset, reg) \
static DEVICE_ATTR(kind##offset
, S_IRUGO, show_##kind##offset
, NULL);
#define sysfs_ro_n(kind,
sub,
offset, reg) \
sysfs_r(kind,
sub,
offset, reg) \
static DEVICE_ATTR(kind##offset
##sub, S_IRUGO, show_##kind##offset##sub
, NULL);
#define sysfs_ro(kind, reg) \
sysfs_r(kind, 0, reg) \
static DEVICE_ATTR(kind, S_IRUGO, show_##kind##0, NULL);
#define sysfs_ro(kind,
sub,
reg) \
sysfs_r(kind,
sub,
0, reg) \
static DEVICE_ATTR(kind, S_IRUGO, show_##kind##0
##sub
, NULL);
#define sysfs_fan(offset, reg_status, reg_min, reg_ripple, reg_act) \
sysfs_rw_n(
pwm
, offset, reg_min) \
sysfs_rw_n(fan_status, offset, reg_status) \
sysfs_rw_n(fan_div , offset, reg_ripple) \
sysfs_ro_n(fan_input , offset, reg_act)
sysfs_rw_n(
fan, _pwm
, offset, reg_min) \
sysfs_rw_n(fan
,
_status, offset, reg_status) \
sysfs_rw_n(fan
,
_div , offset, reg_ripple) \
sysfs_ro_n(fan
,
_input , offset, reg_act)
#define sysfs_temp(offset, reg_status, reg_act) \
sysfs_rw_n(temp_status, offset, reg_status) \
sysfs_ro_n(temp_input , offset, reg_act)
sysfs_rw_n(temp
,
_status, offset, reg_status) \
sysfs_ro_n(temp
,
_input , offset, reg_act)
#define sysfs_in(offset, reg_act) \
sysfs_ro_n(in_input, offset, reg_act)
sysfs_ro_n(in
,
_input, offset, reg_act)
#define sysfs_revision(reg_revision) \
sysfs_ro(revision, reg_revision)
sysfs_ro(revision,
,
reg_revision)
#define sysfs_alarms(reg_events) \
sysfs_ro(alarms, reg_events)
sysfs_ro(alarms,
,
reg_events)
#define sysfs_control(reg_control) \
sysfs_rw(control, reg_control)
sysfs_rw(control,
,
reg_control)
#define sysfs_watchdog(reg_control, reg_status, reg_preset) \
sysfs_rw(watchdog_control, reg_control) \
sysfs_rw(watchdog_status , reg_status) \
sysfs_rw(watchdog_preset , reg_preset)
sysfs_rw(watchdog
,
_control, reg_control) \
sysfs_rw(watchdog
,
_status , reg_status) \
sysfs_rw(watchdog
,
_preset , reg_preset)
sysfs_fan
(
1
,
FSCHER_REG_FAN0_STATE
,
FSCHER_REG_FAN0_MIN
,
FSCHER_REG_FAN0_RIPPLE
,
FSCHER_REG_FAN0_ACT
)
...
...
@@ -248,21 +253,21 @@ sysfs_watchdog(FSCHER_REG_WDOG_CONTROL, FSCHER_REG_WDOG_STATE, FSCHER_REG_WDOG_P
#define device_create_file_fan(client, offset) \
do { \
device_create_file(&client->dev, &dev_attr_fan
_status##offset
); \
device_create_file(&client->dev, &dev_attr_
pwm##offset
); \
device_create_file(&client->dev, &dev_attr_fan
_div##offset
); \
device_create_file(&client->dev, &dev_attr_fan
_input##offse
t); \
device_create_file(&client->dev, &dev_attr_fan
##offset##_status
); \
device_create_file(&client->dev, &dev_attr_
fan##offset##_pwm
); \
device_create_file(&client->dev, &dev_attr_fan
##offset##_div
); \
device_create_file(&client->dev, &dev_attr_fan
##offset##_inpu
t); \
} while (0)
#define device_create_file_temp(client, offset) \
do { \
device_create_file(&client->dev, &dev_attr_temp
_status##offset
); \
device_create_file(&client->dev, &dev_attr_temp
_input##offse
t); \
device_create_file(&client->dev, &dev_attr_temp
##offset##_status
); \
device_create_file(&client->dev, &dev_attr_temp
##offset##_inpu
t); \
} while (0)
#define device_create_file_in(client, offset) \
do { \
device_create_file(&client->dev, &dev_attr_in
_input##offse
t); \
device_create_file(&client->dev, &dev_attr_in
##offset##_inpu
t); \
} while (0)
#define device_create_file_revision(client) \
...
...
@@ -484,7 +489,7 @@ static ssize_t show_fan_status(struct fscher_data *data, char *buf, int nr)
return
sprintf
(
buf
,
"%u
\n
"
,
data
->
fan_status
[
FAN_INDEX_FROM_NUM
(
nr
)]
&
0x04
);
}
static
ssize_t
set_pwm
(
struct
i2c_client
*
client
,
struct
fscher_data
*
data
,
static
ssize_t
set_
fan_
pwm
(
struct
i2c_client
*
client
,
struct
fscher_data
*
data
,
const
char
*
buf
,
size_t
count
,
int
nr
,
int
reg
)
{
data
->
fan_min
[
FAN_INDEX_FROM_NUM
(
nr
)]
=
simple_strtoul
(
buf
,
NULL
,
10
)
&
0xff
;
...
...
@@ -493,7 +498,7 @@ static ssize_t set_pwm(struct i2c_client *client, struct fscher_data *data,
return
count
;
}
static
ssize_t
show_pwm
(
struct
fscher_data
*
data
,
char
*
buf
,
int
nr
)
static
ssize_t
show_
fan_
pwm
(
struct
fscher_data
*
data
,
char
*
buf
,
int
nr
)
{
return
sprintf
(
buf
,
"%u
\n
"
,
data
->
fan_min
[
FAN_INDEX_FROM_NUM
(
nr
)]);
}
...
...
drivers/i2c/chips/gl518sm.c
View file @
dcb326a2
...
...
@@ -307,29 +307,29 @@ static ssize_t set_fan_min2(struct device *dev, const char *buf, size_t count)
return
count
;
}
static
DEVICE_ATTR
(
temp
_input1
,
S_IRUGO
,
show_temp_input1
,
NULL
);
static
DEVICE_ATTR
(
temp
_max1
,
S_IWUSR
|
S_IRUGO
,
show_temp_max1
,
set_temp_max1
);
static
DEVICE_ATTR
(
temp
_hyst1
,
S_IWUSR
|
S_IRUGO
,
static
DEVICE_ATTR
(
temp
1_input
,
S_IRUGO
,
show_temp_input1
,
NULL
);
static
DEVICE_ATTR
(
temp
1_max
,
S_IWUSR
|
S_IRUGO
,
show_temp_max1
,
set_temp_max1
);
static
DEVICE_ATTR
(
temp
1_max_hyst
,
S_IWUSR
|
S_IRUGO
,
show_temp_hyst1
,
set_temp_hyst1
);
static
DEVICE_ATTR
(
fan
_auto1
,
S_IWUSR
|
S_IRUGO
,
show_fan_auto1
,
set_fan_auto1
);
static
DEVICE_ATTR
(
fan
_input1
,
S_IRUGO
,
show_fan_input1
,
NULL
);
static
DEVICE_ATTR
(
fan
_input2
,
S_IRUGO
,
show_fan_input2
,
NULL
);
static
DEVICE_ATTR
(
fan
_min1
,
S_IWUSR
|
S_IRUGO
,
show_fan_min1
,
set_fan_min1
);
static
DEVICE_ATTR
(
fan
_min2
,
S_IWUSR
|
S_IRUGO
,
show_fan_min2
,
set_fan_min2
);
static
DEVICE_ATTR
(
fan
_div1
,
S_IWUSR
|
S_IRUGO
,
show_fan_div1
,
set_fan_div1
);
static
DEVICE_ATTR
(
fan
_div2
,
S_IWUSR
|
S_IRUGO
,
show_fan_div2
,
set_fan_div2
);
static
DEVICE_ATTR
(
in
_input0
,
S_IRUGO
,
show_in_input0
,
NULL
);
static
DEVICE_ATTR
(
in
_input1
,
S_IRUGO
,
show_in_input1
,
NULL
);
static
DEVICE_ATTR
(
in
_input2
,
S_IRUGO
,
show_in_input2
,
NULL
);
static
DEVICE_ATTR
(
in
_input3
,
S_IRUGO
,
show_in_input3
,
NULL
);
static
DEVICE_ATTR
(
in
_min0
,
S_IWUSR
|
S_IRUGO
,
show_in_min0
,
set_in_min0
);
static
DEVICE_ATTR
(
in
_min1
,
S_IWUSR
|
S_IRUGO
,
show_in_min1
,
set_in_min1
);
static
DEVICE_ATTR
(
in
_min2
,
S_IWUSR
|
S_IRUGO
,
show_in_min2
,
set_in_min2
);
static
DEVICE_ATTR
(
in
_min3
,
S_IWUSR
|
S_IRUGO
,
show_in_min3
,
set_in_min3
);
static
DEVICE_ATTR
(
in
_max0
,
S_IWUSR
|
S_IRUGO
,
show_in_max0
,
set_in_max0
);
static
DEVICE_ATTR
(
in
_max1
,
S_IWUSR
|
S_IRUGO
,
show_in_max1
,
set_in_max1
);
static
DEVICE_ATTR
(
in
_max2
,
S_IWUSR
|
S_IRUGO
,
show_in_max2
,
set_in_max2
);
static
DEVICE_ATTR
(
in
_max3
,
S_IWUSR
|
S_IRUGO
,
show_in_max3
,
set_in_max3
);
static
DEVICE_ATTR
(
fan
1_auto
,
S_IWUSR
|
S_IRUGO
,
show_fan_auto1
,
set_fan_auto1
);
static
DEVICE_ATTR
(
fan
1_input
,
S_IRUGO
,
show_fan_input1
,
NULL
);
static
DEVICE_ATTR
(
fan
2_input
,
S_IRUGO
,
show_fan_input2
,
NULL
);
static
DEVICE_ATTR
(
fan
1_min
,
S_IWUSR
|
S_IRUGO
,
show_fan_min1
,
set_fan_min1
);
static
DEVICE_ATTR
(
fan
2_min
,
S_IWUSR
|
S_IRUGO
,
show_fan_min2
,
set_fan_min2
);
static
DEVICE_ATTR
(
fan
1_div
,
S_IWUSR
|
S_IRUGO
,
show_fan_div1
,
set_fan_div1
);
static
DEVICE_ATTR
(
fan
2_div
,
S_IWUSR
|
S_IRUGO
,
show_fan_div2
,
set_fan_div2
);
static
DEVICE_ATTR
(
in
0_input
,
S_IRUGO
,
show_in_input0
,
NULL
);
static
DEVICE_ATTR
(
in
1_input
,
S_IRUGO
,
show_in_input1
,
NULL
);
static
DEVICE_ATTR
(
in
2_input
,
S_IRUGO
,
show_in_input2
,
NULL
);
static
DEVICE_ATTR
(
in
3_input
,
S_IRUGO
,
show_in_input3
,
NULL
);
static
DEVICE_ATTR
(
in
0_min
,
S_IWUSR
|
S_IRUGO
,
show_in_min0
,
set_in_min0
);
static
DEVICE_ATTR
(
in
1_min
,
S_IWUSR
|
S_IRUGO
,
show_in_min1
,
set_in_min1
);
static
DEVICE_ATTR
(
in
2_min
,
S_IWUSR
|
S_IRUGO
,
show_in_min2
,
set_in_min2
);
static
DEVICE_ATTR
(
in
3_min
,
S_IWUSR
|
S_IRUGO
,
show_in_min3
,
set_in_min3
);
static
DEVICE_ATTR
(
in
0_max
,
S_IWUSR
|
S_IRUGO
,
show_in_max0
,
set_in_max0
);
static
DEVICE_ATTR
(
in
1_max
,
S_IWUSR
|
S_IRUGO
,
show_in_max1
,
set_in_max1
);
static
DEVICE_ATTR
(
in
2_max
,
S_IWUSR
|
S_IRUGO
,
show_in_max2
,
set_in_max2
);
static
DEVICE_ATTR
(
in
3_max
,
S_IWUSR
|
S_IRUGO
,
show_in_max3
,
set_in_max3
);
static
DEVICE_ATTR
(
alarms
,
S_IRUGO
,
show_alarms
,
NULL
);
static
DEVICE_ATTR
(
beep_enable
,
S_IWUSR
|
S_IRUGO
,
show_beep_enable
,
set_beep_enable
);
...
...
@@ -424,28 +424,28 @@ static int gl518_detect(struct i2c_adapter *adapter, int address, int kind)
gl518_init_client
((
struct
i2c_client
*
)
new_client
);
/* Register sysfs hooks */
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input0
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min0
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max0
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_auto1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_input1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_input2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_min1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_min2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_div1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_div2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_input1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_max1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_hyst1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
0_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
1_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
2_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
3_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
0_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
1_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
2_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
3_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
0_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
1_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
2_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
3_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
1_auto
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
1_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
2_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
1_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
2_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
1_div
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
2_div
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_max_hyst
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_alarms
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_beep_enable
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_beep_mask
);
...
...
drivers/i2c/chips/it87.c
View file @
dcb326a2
...
...
@@ -6,7 +6,7 @@
IT8712F Super I/O chip w/LPC interface & SMbus
Sis950 A clone of the IT8705F
Copyright (
c
) 2001 Chris Gauthron <chrisg@0-in.com>
Copyright (
C
) 2001 Chris Gauthron <chrisg@0-in.com>
Largely inspired by lm78.c of the same package
This program is free software; you can redistribute it and/or modify
...
...
@@ -57,12 +57,6 @@ SENSORS_INSMOD_4(it87, it8705, it8712, sis950);
/* Update battery voltage after every reading if true */
static
int
update_vbat
=
0
;
/* Enable Temp1 as thermal resistor */
/* Enable Temp2 as thermal diode */
/* Enable Temp3 as thermal resistor */
static
int
temp_type
=
0x2a
;
/* Many IT87 constants specified below */
/* Length of ISA address segment */
...
...
@@ -231,7 +225,7 @@ static void it87_init_client(struct i2c_client *client, struct it87_data *data);
static
struct
i2c_driver
it87_driver
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"
IT87xx
"
,
.
name
=
"
it87
"
,
.
id
=
I2C_DRIVERID_IT87
,
.
flags
=
I2C_DF_NOTIFY
,
.
attach_adapter
=
it87_attach_adapter
,
...
...
@@ -293,7 +287,7 @@ static ssize_t \
{ \
return show_in(dev, buf, 0x##offset); \
} \
static DEVICE_ATTR(in
_input##offse
t, S_IRUGO, show_in##offset, NULL)
static DEVICE_ATTR(in
##offset##_inpu
t, S_IRUGO, show_in##offset, NULL)
#define limit_in_offset(offset) \
static ssize_t \
...
...
@@ -316,9 +310,9 @@ static ssize_t set_in##offset##_max (struct device *dev, \
{ \
return set_in_max(dev, buf, count, 0x##offset); \
} \
static DEVICE_ATTR(in
_min##offset, S_IRUGO | S_IWUSR,
\
static DEVICE_ATTR(in
##offset##_min, S_IRUGO | S_IWUSR,
\
show_in##offset##_min, set_in##offset##_min) \
static DEVICE_ATTR(in
_max##offset, S_IRUGO | S_IWUSR,
\
static DEVICE_ATTR(in
##offset##_max, S_IRUGO | S_IWUSR,
\
show_in##offset##_max, set_in##offset##_max)
show_in_offset
(
0
);
...
...
@@ -406,10 +400,10 @@ static ssize_t set_temp_##offset##_min (struct device *dev, \
{ \
return set_temp_min(dev, buf, count, 0x##offset - 1); \
} \
static DEVICE_ATTR(temp
_input##offse
t, S_IRUGO, show_temp_##offset, NULL) \
static DEVICE_ATTR(temp
_max##offset
, S_IRUGO | S_IWUSR, \
static DEVICE_ATTR(temp
##offset##_inpu
t, S_IRUGO, show_temp_##offset, NULL) \
static DEVICE_ATTR(temp
##offset##_max
, S_IRUGO | S_IWUSR, \
show_temp_##offset##_max, set_temp_##offset##_max) \
static DEVICE_ATTR(temp
_min##offset
, S_IRUGO | S_IWUSR, \
static DEVICE_ATTR(temp
##offset##_min
, S_IRUGO | S_IWUSR, \
show_temp_##offset##_min, set_temp_##offset##_min)
show_temp_offset
(
1
);
...
...
@@ -422,10 +416,10 @@ static ssize_t show_sensor(struct device *dev, char *buf, int nr)
struct
it87_data
*
data
=
i2c_get_clientdata
(
client
);
it87_update_client
(
client
);
if
(
data
->
sensor
&
(
1
<<
nr
))
return
sprintf
(
buf
,
"1
\n
"
);
return
sprintf
(
buf
,
"3
\n
"
);
/* thermal diode */
if
(
data
->
sensor
&
(
8
<<
nr
))
return
sprintf
(
buf
,
"2
\n
"
);
return
sprintf
(
buf
,
"0
\n
"
);
return
sprintf
(
buf
,
"2
\n
"
);
/* thermistor */
return
sprintf
(
buf
,
"0
\n
"
);
/* disabled */
}
static
ssize_t
set_sensor
(
struct
device
*
dev
,
const
char
*
buf
,
size_t
count
,
int
nr
)
...
...
@@ -436,10 +430,13 @@ static ssize_t set_sensor(struct device *dev, const char *buf,
data
->
sensor
&=
~
(
1
<<
nr
);
data
->
sensor
&=
~
(
8
<<
nr
);
if
(
val
==
1
)
/* 3 = thermal diode; 2 = thermistor; 0 = disabled */
if
(
val
==
3
)
data
->
sensor
|=
1
<<
nr
;
else
if
(
val
==
2
)
data
->
sensor
|=
8
<<
nr
;
else
if
(
val
!=
0
)
return
-
1
;
it87_write_value
(
client
,
IT87_REG_TEMP_ENABLE
,
data
->
sensor
);
return
count
;
}
...
...
@@ -453,7 +450,7 @@ static ssize_t set_sensor_##offset (struct device *dev, \
{ \
return set_sensor(dev, buf, count, 0x##offset - 1); \
} \
static DEVICE_ATTR(
sensor##offset
, S_IRUGO | S_IWUSR, \
static DEVICE_ATTR(
temp##offset##_type
, S_IRUGO | S_IWUSR, \
show_sensor_##offset, set_sensor_##offset)
show_sensor_offset
(
1
);
...
...
@@ -554,10 +551,10 @@ static ssize_t set_fan_##offset##_div (struct device *dev, \
{ \
return set_fan_div(dev, buf, count, 0x##offset - 1); \
} \
static DEVICE_ATTR(fan
_input##offse
t, S_IRUGO, show_fan_##offset, NULL) \
static DEVICE_ATTR(fan
_min##offset, S_IRUGO | S_IWUSR,
\
static DEVICE_ATTR(fan
##offset##_inpu
t, S_IRUGO, show_fan_##offset, NULL) \
static DEVICE_ATTR(fan
##offset##_min, S_IRUGO | S_IWUSR,
\
show_fan_##offset##_min, set_fan_##offset##_min) \
static DEVICE_ATTR(fan
_div##offset, S_IRUGO | S_IWUSR,
\
static DEVICE_ATTR(fan
##offset##_div, S_IRUGO | S_IWUSR,
\
show_fan_##offset##_div, set_fan_##offset##_div)
show_fan_offset
(
1
);
...
...
@@ -706,52 +703,52 @@ int it87_detect(struct i2c_adapter *adapter, int address, int kind)
it87_init_client
(
new_client
,
data
);
/* Register sysfs hooks */
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input0
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input4
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input5
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input6
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input7
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input8
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min0
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min4
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min5
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min6
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min7
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max0
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max4
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max5
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max6
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max7
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_input1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_input2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_input3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_max1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_max2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_max3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_min1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_min2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_min3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
sensor1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
sensor2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
sensor3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_input1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_input2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_input3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_min1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_min2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_min3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_div1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_div2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_div3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
0_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
1_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
2_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
3_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
4_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
5_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
6_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
7_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
8_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
0_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
1_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
2_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
3_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
4_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
5_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
6_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
7_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
0_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
1_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
2_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
3_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
4_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
5_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
6_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
7_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
2_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
3_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
2_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
3_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
2_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
3_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
temp1_type
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
temp2_type
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
temp3_type
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
1_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
2_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
3_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
1_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
2_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
3_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
1_div
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
2_div
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
3_div
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_alarms
);
return
0
;
...
...
@@ -888,7 +885,7 @@ static void it87_init_client(struct i2c_client *client, struct it87_data *data)
/* Enable Temp1-Temp3 */
data
->
sensor
=
(
it87_read_value
(
client
,
IT87_REG_TEMP_ENABLE
)
&
0xc0
);
data
->
sensor
|=
temp_type
&
0x3f
;
data
->
sensor
|=
0x2a
;
/* Temp1,Temp3=thermistor; Temp2=thermal diode */
it87_write_value
(
client
,
IT87_REG_TEMP_ENABLE
,
data
->
sensor
);
/* Enable fans */
...
...
@@ -967,6 +964,8 @@ static void it87_update_client(struct i2c_client *client)
(
it87_read_value
(
client
,
IT87_REG_ALARM2
)
<<
8
)
|
(
it87_read_value
(
client
,
IT87_REG_ALARM3
)
<<
16
);
data
->
sensor
=
it87_read_value
(
client
,
IT87_REG_TEMP_ENABLE
);
data
->
last_updated
=
jiffies
;
data
->
valid
=
1
;
}
...
...
@@ -989,8 +988,6 @@ MODULE_AUTHOR("Chris Gauthron <chrisg@0-in.com>");
MODULE_DESCRIPTION
(
"IT8705F, IT8712F, Sis950 driver"
);
MODULE_PARM
(
update_vbat
,
"i"
);
MODULE_PARM_DESC
(
update_vbat
,
"Update vbat if set else return powerup value"
);
MODULE_PARM
(
temp_type
,
"i"
);
MODULE_PARM_DESC
(
temp_type
,
"Temperature sensor type, normally leave unset"
);
MODULE_LICENSE
(
"GPL"
);
module_init
(
sm_it87_init
);
...
...
drivers/i2c/chips/lm75.c
View file @
dcb326a2
...
...
@@ -104,9 +104,9 @@ static ssize_t set_##value(struct device *dev, const char *buf, size_t count) \
set
(
temp_max
,
LM75_REG_TEMP_OS
);
set
(
temp_hyst
,
LM75_REG_TEMP_HYST
);
static
DEVICE_ATTR
(
temp
_max1
,
S_IWUSR
|
S_IRUGO
,
show_temp_max
,
set_temp_max
);
static
DEVICE_ATTR
(
temp
_hyst1
,
S_IWUSR
|
S_IRUGO
,
show_temp_hyst
,
set_temp_hyst
);
static
DEVICE_ATTR
(
temp
_input1
,
S_IRUGO
,
show_temp_input
,
NULL
);
static
DEVICE_ATTR
(
temp
1_max
,
S_IWUSR
|
S_IRUGO
,
show_temp_max
,
set_temp_max
);
static
DEVICE_ATTR
(
temp
1_max_hyst
,
S_IWUSR
|
S_IRUGO
,
show_temp_hyst
,
set_temp_hyst
);
static
DEVICE_ATTR
(
temp
1_input
,
S_IRUGO
,
show_temp_input
,
NULL
);
static
int
lm75_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
...
...
@@ -197,9 +197,9 @@ static int lm75_detect(struct i2c_adapter *adapter, int address, int kind)
lm75_init_client
(
new_client
);
/* Register sysfs hooks */
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_max1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_hyst1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_input1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_max_hyst
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_input
);
return
0
;
...
...
drivers/i2c/chips/lm78.c
View file @
dcb326a2
...
...
@@ -289,7 +289,7 @@ static ssize_t \
{ \
return show_in(dev, buf, 0x##offset); \
} \
static DEVICE_ATTR(in
_input##offset, S_IRUGO,
\
static DEVICE_ATTR(in
##offset##_input, S_IRUGO,
\
show_in##offset, NULL) \
static ssize_t \
show_in##offset##_min (struct device *dev, char *buf) \
...
...
@@ -311,9 +311,9 @@ static ssize_t set_in##offset##_max (struct device *dev, \
{ \
return set_in_max(dev, buf, count, 0x##offset); \
} \
static DEVICE_ATTR(in
_min##offset
, S_IRUGO | S_IWUSR, \
static DEVICE_ATTR(in
##offset##_min
, S_IRUGO | S_IWUSR, \
show_in##offset##_min, set_in##offset##_min) \
static DEVICE_ATTR(in
_max##offset
, S_IRUGO | S_IWUSR, \
static DEVICE_ATTR(in
##offset##_max
, S_IRUGO | S_IWUSR, \
show_in##offset##_max, set_in##offset##_max)
show_in_offset
(
0
);
...
...
@@ -369,10 +369,10 @@ static ssize_t set_temp_hyst(struct device *dev, const char *buf, size_t count)
return
count
;
}
static
DEVICE_ATTR
(
temp
_input1
,
S_IRUGO
,
show_temp
,
NULL
)
static
DEVICE_ATTR
(
temp
_max1
,
S_IRUGO
|
S_IWUSR
,
static
DEVICE_ATTR
(
temp
1_input
,
S_IRUGO
,
show_temp
,
NULL
)
static
DEVICE_ATTR
(
temp
1_max
,
S_IRUGO
|
S_IWUSR
,
show_temp_over
,
set_temp_over
)
static
DEVICE_ATTR
(
temp
_hyst1
,
S_IRUGO
|
S_IWUSR
,
static
DEVICE_ATTR
(
temp
1_max_hyst
,
S_IRUGO
|
S_IWUSR
,
show_temp_hyst
,
set_temp_hyst
)
/* 3 Fans */
...
...
@@ -460,8 +460,8 @@ static ssize_t set_fan_##offset##_min (struct device *dev, \
{ \
return set_fan_min(dev, buf, count, 0x##offset - 1); \
} \
static DEVICE_ATTR(fan
_input##offse
t, S_IRUGO, show_fan_##offset, NULL) \
static DEVICE_ATTR(fan
_min##offset, S_IRUGO | S_IWUSR,
\
static DEVICE_ATTR(fan
##offset##_inpu
t, S_IRUGO, show_fan_##offset, NULL) \
static DEVICE_ATTR(fan
##offset##_min, S_IRUGO | S_IWUSR,
\
show_fan_##offset##_min, set_fan_##offset##_min)
static
ssize_t
set_fan_1_div
(
struct
device
*
dev
,
const
char
*
buf
,
...
...
@@ -481,11 +481,11 @@ show_fan_offset(2);
show_fan_offset
(
3
);
/* Fan 3 divisor is locked in H/W */
static
DEVICE_ATTR
(
fan
_div1
,
S_IRUGO
|
S_IWUSR
,
static
DEVICE_ATTR
(
fan
1_div
,
S_IRUGO
|
S_IWUSR
,
show_fan_1_div
,
set_fan_1_div
)
static
DEVICE_ATTR
(
fan
_div2
,
S_IRUGO
|
S_IWUSR
,
static
DEVICE_ATTR
(
fan
2_div
,
S_IRUGO
|
S_IWUSR
,
show_fan_2_div
,
set_fan_2_div
)
static
DEVICE_ATTR
(
fan
_div3
,
S_IRUGO
,
show_fan_3_div
,
NULL
)
static
DEVICE_ATTR
(
fan
3_div
,
S_IRUGO
,
show_fan_3_div
,
NULL
)
/* VID */
static
ssize_t
show_vid
(
struct
device
*
dev
,
char
*
buf
)
...
...
@@ -495,7 +495,7 @@ static ssize_t show_vid(struct device *dev, char *buf)
lm78_update_client
(
client
);
return
sprintf
(
buf
,
"%d
\n
"
,
VID_FROM_REG
(
data
->
vid
));
}
static
DEVICE_ATTR
(
vid
,
S_IRUGO
,
show_vid
,
NULL
);
static
DEVICE_ATTR
(
in0_ref
,
S_IRUGO
,
show_vid
,
NULL
);
/* Alarms */
static
ssize_t
show_alarms
(
struct
device
*
dev
,
char
*
buf
)
...
...
@@ -657,41 +657,41 @@ int lm78_detect(struct i2c_adapter *adapter, int address, int kind)
lm78_init_client
(
new_client
);
/* Register sysfs hooks */
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input0
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min0
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max0
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input4
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min4
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max4
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input5
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min5
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max5
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input6
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min6
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max6
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_input1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_max1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_hyst1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_input1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_min1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_div1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_input2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_min2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_div2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_input3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_min3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_div3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
0_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
0_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
0_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
1_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
1_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
1_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
2_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
2_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
2_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
3_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
3_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
3_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
4_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
4_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
4_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
5_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
5_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
5_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
6_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
6_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
6_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_max_hyst
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
1_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
1_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
1_div
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
2_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
2_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
2_div
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
3_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
3_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
3_div
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_alarms
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
vid
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
in0_ref
);
return
0
;
...
...
drivers/i2c/chips/lm80.c
0 → 100644
View file @
dcb326a2
/*
* lm80.c - From lm_sensors, Linux kernel modules for hardware
* monitoring
* Copyright (C) 1998, 1999 Frodo Looijaard <frodol@dds.nl>
* and Philip Edelbrock <phil@netroedge.com>
*
* Ported to Linux 2.6 by Tiago Sousa <mirage@kaotik.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <linux/config.h>
#ifdef CONFIG_I2C_DEBUG_CHIP
#define DEBUG 1
#endif
#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/i2c.h>
#include <linux/i2c-sensor.h>
/* Addresses to scan */
static
unsigned
short
normal_i2c
[]
=
{
I2C_CLIENT_END
};
static
unsigned
short
normal_i2c_range
[]
=
{
0x28
,
0x2f
,
I2C_CLIENT_END
};
static
unsigned
int
normal_isa
[]
=
{
I2C_CLIENT_ISA_END
};
static
unsigned
int
normal_isa_range
[]
=
{
I2C_CLIENT_ISA_END
};
/* Insmod parameters */
SENSORS_INSMOD_1
(
lm80
);
/* Many LM80 constants specified below */
/* The LM80 registers */
#define LM80_REG_IN_MAX(nr) (0x2a + (nr) * 2)
#define LM80_REG_IN_MIN(nr) (0x2b + (nr) * 2)
#define LM80_REG_IN(nr) (0x20 + (nr))
#define LM80_REG_FAN1_MIN 0x3c
#define LM80_REG_FAN2_MIN 0x3d
#define LM80_REG_FAN1 0x28
#define LM80_REG_FAN2 0x29
#define LM80_REG_TEMP 0x27
#define LM80_REG_TEMP_HOT_MAX 0x38
#define LM80_REG_TEMP_HOT_HYST 0x39
#define LM80_REG_TEMP_OS_MAX 0x3a
#define LM80_REG_TEMP_OS_HYST 0x3b
#define LM80_REG_CONFIG 0x00
#define LM80_REG_ALARM1 0x01
#define LM80_REG_ALARM2 0x02
#define LM80_REG_MASK1 0x03
#define LM80_REG_MASK2 0x04
#define LM80_REG_FANDIV 0x05
#define LM80_REG_RES 0x06
/* Conversions. Rounding and limit checking is only done on the TO_REG
variants. Note that you should be a bit careful with which arguments
these macros are called: arguments may be evaluated more than once.
Fixing this is just not worth it. */
#define IN_TO_REG(val) (SENSORS_LIMIT((val)/10,0,255))
#define IN_FROM_REG(val) ((val)*10)
static
inline
unsigned
char
FAN_TO_REG
(
unsigned
rpm
,
unsigned
div
)
{
if
(
rpm
==
0
)
return
255
;
rpm
=
SENSORS_LIMIT
(
rpm
,
1
,
1000000
);
return
SENSORS_LIMIT
((
1350000
+
rpm
*
div
/
2
)
/
(
rpm
*
div
),
1
,
254
);
}
#define FAN_FROM_REG(val,div) ((val)==0?-1:\
(val)==255?0:1350000/((div)*(val)))
static
inline
long
TEMP_FROM_REG
(
u16
temp
)
{
long
res
;
temp
>>=
4
;
if
(
temp
<
0x0800
)
res
=
625
*
(
long
)
temp
;
else
res
=
((
long
)
temp
-
0x01000
)
*
625
;
return
res
/
10
;
}
#define TEMP_LIMIT_FROM_REG(val) (((val)>0x80?(val)-0x100:(val))*1000)
#define TEMP_LIMIT_TO_REG(val) SENSORS_LIMIT((val)<0?\
((val)-500)/1000:((val)+500)/1000,0,255)
#define ALARMS_FROM_REG(val) (val)
#define DIV_FROM_REG(val) (1 << (val))
#define DIV_TO_REG(val) ((val)==8?3:(val)==4?2:(val)==1?0:1)
/*
* Client data (each client gets its own)
*/
struct
lm80_data
{
struct
semaphore
update_lock
;
char
valid
;
/* !=0 if following fields are valid */
unsigned
long
last_updated
;
/* In jiffies */
u8
in
[
7
];
/* Register value */
u8
in_max
[
7
];
/* Register value */
u8
in_min
[
7
];
/* Register value */
u8
fan
[
2
];
/* Register value */
u8
fan_min
[
2
];
/* Register value */
u8
fan_div
[
2
];
/* Register encoding, shifted right */
u16
temp
;
/* Register values, shifted right */
u8
temp_hot_max
;
/* Register value */
u8
temp_hot_hyst
;
/* Register value */
u8
temp_os_max
;
/* Register value */
u8
temp_os_hyst
;
/* Register value */
u16
alarms
;
/* Register encoding, combined */
};
/*
* Functions declaration
*/
static
int
lm80_attach_adapter
(
struct
i2c_adapter
*
adapter
);
static
int
lm80_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
);
static
void
lm80_init_client
(
struct
i2c_client
*
client
);
static
int
lm80_detach_client
(
struct
i2c_client
*
client
);
static
void
lm80_update_client
(
struct
i2c_client
*
client
);
static
int
lm80_read_value
(
struct
i2c_client
*
client
,
u8
reg
);
static
int
lm80_write_value
(
struct
i2c_client
*
client
,
u8
reg
,
u8
value
);
/*
* Internal variables
*/
static
int
lm80_id
=
0
;
/*
* Driver data (common to all clients)
*/
static
struct
i2c_driver
lm80_driver
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"lm80"
,
.
id
=
I2C_DRIVERID_LM80
,
.
flags
=
I2C_DF_NOTIFY
,
.
attach_adapter
=
lm80_attach_adapter
,
.
detach_client
=
lm80_detach_client
,
};
/*
* Sysfs stuff
*/
#define show_in(suffix, value) \
static ssize_t show_in_##suffix(struct device *dev, char *buf) \
{ \
struct i2c_client *client = to_i2c_client(dev); \
struct lm80_data *data = i2c_get_clientdata(client); \
lm80_update_client(client); \
return sprintf(buf, "%d\n", IN_FROM_REG(data->value)); \
}
show_in
(
min0
,
in_min
[
0
]);
show_in
(
min1
,
in_min
[
1
]);
show_in
(
min2
,
in_min
[
2
]);
show_in
(
min3
,
in_min
[
3
]);
show_in
(
min4
,
in_min
[
4
]);
show_in
(
min5
,
in_min
[
5
]);
show_in
(
min6
,
in_min
[
6
]);
show_in
(
max0
,
in_max
[
0
]);
show_in
(
max1
,
in_max
[
1
]);
show_in
(
max2
,
in_max
[
2
]);
show_in
(
max3
,
in_max
[
3
]);
show_in
(
max4
,
in_max
[
4
]);
show_in
(
max5
,
in_max
[
5
]);
show_in
(
max6
,
in_max
[
6
]);
show_in
(
input0
,
in
[
0
]);
show_in
(
input1
,
in
[
1
]);
show_in
(
input2
,
in
[
2
]);
show_in
(
input3
,
in
[
3
]);
show_in
(
input4
,
in
[
4
]);
show_in
(
input5
,
in
[
5
]);
show_in
(
input6
,
in
[
6
]);
#define set_in(suffix, value, reg) \
static ssize_t set_in_##suffix(struct device *dev, const char *buf, \
size_t count) \
{ \
struct i2c_client *client = to_i2c_client(dev); \
struct lm80_data *data = i2c_get_clientdata(client); \
long val = simple_strtol(buf, NULL, 10); \
data->value = IN_TO_REG(val); \
lm80_write_value(client, reg, data->value); \
return count; \
}
set_in
(
min0
,
in_min
[
0
],
LM80_REG_IN_MIN
(
0
));
set_in
(
min1
,
in_min
[
1
],
LM80_REG_IN_MIN
(
1
));
set_in
(
min2
,
in_min
[
2
],
LM80_REG_IN_MIN
(
2
));
set_in
(
min3
,
in_min
[
3
],
LM80_REG_IN_MIN
(
3
));
set_in
(
min4
,
in_min
[
4
],
LM80_REG_IN_MIN
(
4
));
set_in
(
min5
,
in_min
[
5
],
LM80_REG_IN_MIN
(
5
));
set_in
(
min6
,
in_min
[
6
],
LM80_REG_IN_MIN
(
6
));
set_in
(
max0
,
in_max
[
0
],
LM80_REG_IN_MAX
(
0
));
set_in
(
max1
,
in_max
[
1
],
LM80_REG_IN_MAX
(
1
));
set_in
(
max2
,
in_max
[
2
],
LM80_REG_IN_MAX
(
2
));
set_in
(
max3
,
in_max
[
3
],
LM80_REG_IN_MAX
(
3
));
set_in
(
max4
,
in_max
[
4
],
LM80_REG_IN_MAX
(
4
));
set_in
(
max5
,
in_max
[
5
],
LM80_REG_IN_MAX
(
5
));
set_in
(
max6
,
in_max
[
6
],
LM80_REG_IN_MAX
(
6
));
#define show_fan(suffix, value, div) \
static ssize_t show_fan_##suffix(struct device *dev, char *buf) \
{ \
struct i2c_client *client = to_i2c_client(dev); \
struct lm80_data *data = i2c_get_clientdata(client); \
lm80_update_client(client); \
return sprintf(buf, "%d\n", FAN_FROM_REG(data->value, \
DIV_FROM_REG(data->div))); \
}
show_fan
(
min1
,
fan_min
[
0
],
fan_div
[
0
]);
show_fan
(
min2
,
fan_min
[
1
],
fan_div
[
1
]);
show_fan
(
input1
,
fan
[
0
],
fan_div
[
0
]);
show_fan
(
input2
,
fan
[
1
],
fan_div
[
1
]);
#define show_fan_div(suffix, value) \
static ssize_t show_fan_div##suffix(struct device *dev, char *buf) \
{ \
struct i2c_client *client = to_i2c_client(dev); \
struct lm80_data *data = i2c_get_clientdata(client); \
lm80_update_client(client); \
return sprintf(buf, "%d\n", DIV_FROM_REG(data->value)); \
}
show_fan_div
(
1
,
fan_div
[
0
]);
show_fan_div
(
2
,
fan_div
[
1
]);
#define set_fan(suffix, value, reg, div) \
static ssize_t set_fan_##suffix(struct device *dev, const char *buf, \
size_t count) \
{ \
struct i2c_client *client = to_i2c_client(dev); \
struct lm80_data *data = i2c_get_clientdata(client); \
long val = simple_strtoul(buf, NULL, 10); \
data->value = FAN_TO_REG(val, DIV_FROM_REG(data->div)); \
lm80_write_value(client, reg, data->value); \
return count; \
}
set_fan
(
min1
,
fan_min
[
0
],
LM80_REG_FAN1_MIN
,
fan_div
[
0
]);
set_fan
(
min2
,
fan_min
[
1
],
LM80_REG_FAN2_MIN
,
fan_div
[
1
]);
static
ssize_t
show_temp_input1
(
struct
device
*
dev
,
char
*
buf
)
{
struct
i2c_client
*
client
=
to_i2c_client
(
dev
);
struct
lm80_data
*
data
=
i2c_get_clientdata
(
client
);
lm80_update_client
(
client
);
return
sprintf
(
buf
,
"%ld
\n
"
,
TEMP_FROM_REG
(
data
->
temp
));
}
#define show_temp(suffix, value) \
static ssize_t show_temp_##suffix(struct device *dev, char *buf) \
{ \
struct i2c_client *client = to_i2c_client(dev); \
struct lm80_data *data = i2c_get_clientdata(client); \
lm80_update_client(client); \
return sprintf(buf, "%d\n", TEMP_LIMIT_FROM_REG(data->value)); \
}
show_temp
(
hot_max
,
temp_hot_max
);
show_temp
(
hot_hyst
,
temp_hot_hyst
);
show_temp
(
os_max
,
temp_os_max
);
show_temp
(
os_hyst
,
temp_os_hyst
);
#define set_temp(suffix, value, reg) \
static ssize_t set_temp_##suffix(struct device *dev, const char *buf, \
size_t count) \
{ \
struct i2c_client *client = to_i2c_client(dev); \
struct lm80_data *data = i2c_get_clientdata(client); \
long val = simple_strtoul(buf, NULL, 10); \
data->value = TEMP_LIMIT_TO_REG(val); \
lm80_write_value(client, reg, data->value); \
return count; \
}
set_temp
(
hot_max
,
temp_hot_max
,
LM80_REG_TEMP_HOT_MAX
);
set_temp
(
hot_hyst
,
temp_hot_hyst
,
LM80_REG_TEMP_HOT_HYST
);
set_temp
(
os_max
,
temp_os_max
,
LM80_REG_TEMP_OS_MAX
);
set_temp
(
os_hyst
,
temp_os_hyst
,
LM80_REG_TEMP_OS_HYST
);
static
ssize_t
show_alarms
(
struct
device
*
dev
,
char
*
buf
)
{
struct
i2c_client
*
client
=
to_i2c_client
(
dev
);
struct
lm80_data
*
data
=
i2c_get_clientdata
(
client
);
lm80_update_client
(
client
);
return
sprintf
(
buf
,
"%d
\n
"
,
ALARMS_FROM_REG
(
data
->
alarms
));
}
static
DEVICE_ATTR
(
in0_min
,
S_IWUSR
|
S_IRUGO
,
show_in_min0
,
set_in_min0
);
static
DEVICE_ATTR
(
in1_min
,
S_IWUSR
|
S_IRUGO
,
show_in_min1
,
set_in_min1
);
static
DEVICE_ATTR
(
in2_min
,
S_IWUSR
|
S_IRUGO
,
show_in_min2
,
set_in_min2
);
static
DEVICE_ATTR
(
in3_min
,
S_IWUSR
|
S_IRUGO
,
show_in_min3
,
set_in_min3
);
static
DEVICE_ATTR
(
in4_min
,
S_IWUSR
|
S_IRUGO
,
show_in_min4
,
set_in_min4
);
static
DEVICE_ATTR
(
in5_min
,
S_IWUSR
|
S_IRUGO
,
show_in_min5
,
set_in_min5
);
static
DEVICE_ATTR
(
in6_min
,
S_IWUSR
|
S_IRUGO
,
show_in_min6
,
set_in_min6
);
static
DEVICE_ATTR
(
in0_max
,
S_IWUSR
|
S_IRUGO
,
show_in_max0
,
set_in_max0
);
static
DEVICE_ATTR
(
in1_max
,
S_IWUSR
|
S_IRUGO
,
show_in_max1
,
set_in_max1
);
static
DEVICE_ATTR
(
in2_max
,
S_IWUSR
|
S_IRUGO
,
show_in_max2
,
set_in_max2
);
static
DEVICE_ATTR
(
in3_max
,
S_IWUSR
|
S_IRUGO
,
show_in_max3
,
set_in_max3
);
static
DEVICE_ATTR
(
in4_max
,
S_IWUSR
|
S_IRUGO
,
show_in_max4
,
set_in_max4
);
static
DEVICE_ATTR
(
in5_max
,
S_IWUSR
|
S_IRUGO
,
show_in_max5
,
set_in_max5
);
static
DEVICE_ATTR
(
in6_max
,
S_IWUSR
|
S_IRUGO
,
show_in_max6
,
set_in_max6
);
static
DEVICE_ATTR
(
in0_input
,
S_IRUGO
,
show_in_input0
,
NULL
);
static
DEVICE_ATTR
(
in1_input
,
S_IRUGO
,
show_in_input1
,
NULL
);
static
DEVICE_ATTR
(
in2_input
,
S_IRUGO
,
show_in_input2
,
NULL
);
static
DEVICE_ATTR
(
in3_input
,
S_IRUGO
,
show_in_input3
,
NULL
);
static
DEVICE_ATTR
(
in4_input
,
S_IRUGO
,
show_in_input4
,
NULL
);
static
DEVICE_ATTR
(
in5_input
,
S_IRUGO
,
show_in_input5
,
NULL
);
static
DEVICE_ATTR
(
in6_input
,
S_IRUGO
,
show_in_input6
,
NULL
);
static
DEVICE_ATTR
(
fan1_min
,
S_IWUSR
|
S_IRUGO
,
show_fan_min1
,
set_fan_min1
);
static
DEVICE_ATTR
(
fan2_min
,
S_IWUSR
|
S_IRUGO
,
show_fan_min2
,
set_fan_min2
);
static
DEVICE_ATTR
(
fan1_input
,
S_IRUGO
,
show_fan_input1
,
NULL
);
static
DEVICE_ATTR
(
fan2_input
,
S_IRUGO
,
show_fan_input2
,
NULL
);
static
DEVICE_ATTR
(
fan1_div
,
S_IRUGO
,
show_fan_div1
,
NULL
);
static
DEVICE_ATTR
(
fan2_div
,
S_IRUGO
,
show_fan_div2
,
NULL
);
static
DEVICE_ATTR
(
temp1_input
,
S_IRUGO
,
show_temp_input1
,
NULL
);
static
DEVICE_ATTR
(
temp1_max
,
S_IWUSR
|
S_IRUGO
,
show_temp_hot_max
,
set_temp_hot_max
);
static
DEVICE_ATTR
(
temp1_max_hyst
,
S_IWUSR
|
S_IRUGO
,
show_temp_hot_hyst
,
set_temp_hot_hyst
);
static
DEVICE_ATTR
(
temp1_crit
,
S_IWUSR
|
S_IRUGO
,
show_temp_os_max
,
set_temp_os_max
);
static
DEVICE_ATTR
(
temp1_crit_hyst
,
S_IWUSR
|
S_IRUGO
,
show_temp_os_hyst
,
set_temp_os_hyst
);
static
DEVICE_ATTR
(
alarms
,
S_IRUGO
,
show_alarms
,
NULL
);
/*
* Real code
*/
static
int
lm80_attach_adapter
(
struct
i2c_adapter
*
adapter
)
{
if
(
!
(
adapter
->
class
&
I2C_ADAP_CLASS_SMBUS
))
return
0
;
return
i2c_detect
(
adapter
,
&
addr_data
,
lm80_detect
);
}
int
lm80_detect
(
struct
i2c_adapter
*
adapter
,
int
address
,
int
kind
)
{
int
i
,
cur
;
struct
i2c_client
*
new_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
(
!
(
new_client
=
kmalloc
(
sizeof
(
struct
i2c_client
)
+
sizeof
(
struct
lm80_data
),
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
exit
;
}
memset
(
new_client
,
0x00
,
sizeof
(
struct
i2c_client
)
+
sizeof
(
struct
lm80_data
));
data
=
(
struct
lm80_data
*
)
(
new_client
+
1
);
i2c_set_clientdata
(
new_client
,
data
);
new_client
->
addr
=
address
;
new_client
->
adapter
=
adapter
;
new_client
->
driver
=
&
lm80_driver
;
new_client
->
flags
=
0
;
/* Now, we do the remaining detection. It is lousy. */
if
(
lm80_read_value
(
new_client
,
LM80_REG_ALARM2
)
&
0xc0
)
goto
error_free
;
for
(
i
=
0x2a
;
i
<=
0x3d
;
i
++
)
{
cur
=
i2c_smbus_read_byte_data
(
new_client
,
i
);
if
((
i2c_smbus_read_byte_data
(
new_client
,
i
+
0x40
)
!=
cur
)
||
(
i2c_smbus_read_byte_data
(
new_client
,
i
+
0x80
)
!=
cur
)
||
(
i2c_smbus_read_byte_data
(
new_client
,
i
+
0xc0
)
!=
cur
))
goto
error_free
;
}
/* Determine the chip type - only one kind supported! */
kind
=
lm80
;
name
=
"lm80"
;
/* Fill in the remaining client fields and put it into the global list */
strlcpy
(
new_client
->
name
,
name
,
I2C_NAME_SIZE
);
new_client
->
id
=
lm80_id
++
;
data
->
valid
=
0
;
init_MUTEX
(
&
data
->
update_lock
);
/* Tell the I2C layer a new client has arrived */
if
((
err
=
i2c_attach_client
(
new_client
)))
goto
error_free
;
/* Initialize the LM80 chip */
lm80_init_client
(
new_client
);
/* Register sysfs hooks */
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in0_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in1_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in2_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in3_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in4_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in5_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in6_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in0_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in1_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in2_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in3_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in4_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in5_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in6_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in0_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in1_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in2_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in3_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in4_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in5_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in6_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan1_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan2_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan1_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan2_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan1_div
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan2_div
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp1_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp1_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp1_max_hyst
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp1_crit
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp1_crit_hyst
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_alarms
);
return
0
;
error_free:
kfree
(
new_client
);
exit:
return
err
;
}
static
int
lm80_detach_client
(
struct
i2c_client
*
client
)
{
int
err
;
if
((
err
=
i2c_detach_client
(
client
)))
{
dev_err
(
&
client
->
dev
,
"Client deregistration failed, "
"client not detached.
\n
"
);
return
err
;
}
kfree
(
client
);
return
0
;
}
static
int
lm80_read_value
(
struct
i2c_client
*
client
,
u8
reg
)
{
return
i2c_smbus_read_byte_data
(
client
,
reg
);
}
static
int
lm80_write_value
(
struct
i2c_client
*
client
,
u8
reg
,
u8
value
)
{
return
i2c_smbus_write_byte_data
(
client
,
reg
,
value
);
}
/* Called when we have found a new LM80. */
static
void
lm80_init_client
(
struct
i2c_client
*
client
)
{
/* Reset all except Watchdog values and last conversion values
This sets fan-divs to 2, among others. This makes most other
initializations unnecessary */
lm80_write_value
(
client
,
LM80_REG_CONFIG
,
0x80
);
/* Set 11-bit temperature resolution */
lm80_write_value
(
client
,
LM80_REG_RES
,
0x08
);
/* Start monitoring */
lm80_write_value
(
client
,
LM80_REG_CONFIG
,
0x01
);
}
static
void
lm80_update_client
(
struct
i2c_client
*
client
)
{
struct
lm80_data
*
data
=
i2c_get_clientdata
(
client
);
int
i
;
down
(
&
data
->
update_lock
);
if
((
jiffies
-
data
->
last_updated
>
2
*
HZ
)
||
(
jiffies
<
data
->
last_updated
)
||
!
data
->
valid
)
{
dev_dbg
(
&
client
->
dev
,
"Starting lm80 update
\n
"
);
for
(
i
=
0
;
i
<=
6
;
i
++
)
{
data
->
in
[
i
]
=
lm80_read_value
(
client
,
LM80_REG_IN
(
i
));
data
->
in_min
[
i
]
=
lm80_read_value
(
client
,
LM80_REG_IN_MIN
(
i
));
data
->
in_max
[
i
]
=
lm80_read_value
(
client
,
LM80_REG_IN_MAX
(
i
));
}
data
->
fan
[
0
]
=
lm80_read_value
(
client
,
LM80_REG_FAN1
);
data
->
fan_min
[
0
]
=
lm80_read_value
(
client
,
LM80_REG_FAN1_MIN
);
data
->
fan
[
1
]
=
lm80_read_value
(
client
,
LM80_REG_FAN2
);
data
->
fan_min
[
1
]
=
lm80_read_value
(
client
,
LM80_REG_FAN2_MIN
);
data
->
temp
=
(
lm80_read_value
(
client
,
LM80_REG_TEMP
)
<<
8
)
|
(
lm80_read_value
(
client
,
LM80_REG_RES
)
&
0xf0
);
data
->
temp_os_max
=
lm80_read_value
(
client
,
LM80_REG_TEMP_OS_MAX
);
data
->
temp_os_hyst
=
lm80_read_value
(
client
,
LM80_REG_TEMP_OS_HYST
);
data
->
temp_hot_max
=
lm80_read_value
(
client
,
LM80_REG_TEMP_HOT_MAX
);
data
->
temp_hot_hyst
=
lm80_read_value
(
client
,
LM80_REG_TEMP_HOT_HYST
);
i
=
lm80_read_value
(
client
,
LM80_REG_FANDIV
);
data
->
fan_div
[
0
]
=
(
i
>>
2
)
&
0x03
;
data
->
fan_div
[
1
]
=
(
i
>>
4
)
&
0x03
;
data
->
alarms
=
lm80_read_value
(
client
,
LM80_REG_ALARM1
)
+
(
lm80_read_value
(
client
,
LM80_REG_ALARM2
)
<<
8
);
data
->
last_updated
=
jiffies
;
data
->
valid
=
1
;
}
up
(
&
data
->
update_lock
);
}
static
int
__init
sensors_lm80_init
(
void
)
{
return
i2c_add_driver
(
&
lm80_driver
);
}
static
void
__exit
sensors_lm80_exit
(
void
)
{
i2c_del_driver
(
&
lm80_driver
);
}
MODULE_AUTHOR
(
"Frodo Looijaard <frodol@dds.nl> and "
"Philip Edelbrock <phil@netroedge.com>"
);
MODULE_DESCRIPTION
(
"LM80 driver"
);
MODULE_LICENSE
(
"GPL"
);
module_init
(
sensors_lm80_init
);
module_exit
(
sensors_lm80_exit
);
drivers/i2c/chips/lm83.c
View file @
dcb326a2
...
...
@@ -201,17 +201,17 @@ static ssize_t show_alarms(struct device *dev, char *buf)
return
sprintf
(
buf
,
"%d
\n
"
,
data
->
alarms
);
}
static
DEVICE_ATTR
(
temp
_input1
,
S_IRUGO
,
show_temp_input1
,
NULL
);
static
DEVICE_ATTR
(
temp
_input2
,
S_IRUGO
,
show_temp_input2
,
NULL
);
static
DEVICE_ATTR
(
temp
_input3
,
S_IRUGO
,
show_temp_input3
,
NULL
);
static
DEVICE_ATTR
(
temp
_input4
,
S_IRUGO
,
show_temp_input4
,
NULL
);
static
DEVICE_ATTR
(
temp
_max1
,
S_IWUSR
|
S_IRUGO
,
show_temp_high1
,
static
DEVICE_ATTR
(
temp
1_input
,
S_IRUGO
,
show_temp_input1
,
NULL
);
static
DEVICE_ATTR
(
temp
2_input
,
S_IRUGO
,
show_temp_input2
,
NULL
);
static
DEVICE_ATTR
(
temp
3_input
,
S_IRUGO
,
show_temp_input3
,
NULL
);
static
DEVICE_ATTR
(
temp
4_input
,
S_IRUGO
,
show_temp_input4
,
NULL
);
static
DEVICE_ATTR
(
temp
1_max
,
S_IWUSR
|
S_IRUGO
,
show_temp_high1
,
set_temp_high1
);
static
DEVICE_ATTR
(
temp
_max2
,
S_IWUSR
|
S_IRUGO
,
show_temp_high2
,
static
DEVICE_ATTR
(
temp
2_max
,
S_IWUSR
|
S_IRUGO
,
show_temp_high2
,
set_temp_high2
);
static
DEVICE_ATTR
(
temp
_max3
,
S_IWUSR
|
S_IRUGO
,
show_temp_high3
,
static
DEVICE_ATTR
(
temp
3_max
,
S_IWUSR
|
S_IRUGO
,
show_temp_high3
,
set_temp_high3
);
static
DEVICE_ATTR
(
temp
_max4
,
S_IWUSR
|
S_IRUGO
,
show_temp_high4
,
static
DEVICE_ATTR
(
temp
4_max
,
S_IWUSR
|
S_IRUGO
,
show_temp_high4
,
set_temp_high4
);
static
DEVICE_ATTR
(
temp_crit
,
S_IWUSR
|
S_IRUGO
,
show_temp_crit
,
set_temp_crit
);
...
...
@@ -320,14 +320,14 @@ static int lm83_detect(struct i2c_adapter *adapter, int address, int kind)
*/
/* Register sysfs hooks */
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_input1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_input2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_input3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_input4
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_max1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_max2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_max3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_max4
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
2_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
3_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
4_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
2_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
3_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
4_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp_crit
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_alarms
);
...
...
drivers/i2c/chips/lm85.c
View file @
dcb326a2
...
...
@@ -460,8 +460,8 @@ static ssize_t set_fan_##offset##_min (struct device *dev, \
{ \
return set_fan_min(dev, buf, count, 0x##offset - 1); \
} \
static DEVICE_ATTR(fan
_input##offse
t, S_IRUGO, show_fan_##offset, NULL) \
static DEVICE_ATTR(fan
_min##offset, S_IRUGO | S_IWUSR,
\
static DEVICE_ATTR(fan
##offset##_inpu
t, S_IRUGO, show_fan_##offset, NULL) \
static DEVICE_ATTR(fan
##offset##_min, S_IRUGO | S_IWUSR,
\
show_fan_##offset##_min, set_fan_##offset##_min)
show_fan_offset
(
1
);
...
...
@@ -480,7 +480,7 @@ static ssize_t show_vid_reg(struct device *dev, char *buf)
return
sprintf
(
buf
,
"%ld
\n
"
,
(
long
)
vid_from_reg
(
data
->
vid
,
data
->
vrm
));
}
static
DEVICE_ATTR
(
vid
,
S_IRUGO
,
show_vid_reg
,
NULL
)
static
DEVICE_ATTR
(
in0_ref
,
S_IRUGO
,
show_vid_reg
,
NULL
)
static
ssize_t
show_vrm_reg
(
struct
device
*
dev
,
char
*
buf
)
{
...
...
@@ -564,9 +564,9 @@ static ssize_t show_pwm_enable##offset (struct device *dev, char *buf) \
{ \
return show_pwm_enable(dev, buf, 0x##offset - 1); \
} \
static DEVICE_ATTR(
pwm##offset
, S_IRUGO | S_IWUSR, \
static DEVICE_ATTR(
fan##offset##_pwm
, S_IRUGO | S_IWUSR, \
show_pwm_##offset, set_pwm_##offset) \
static DEVICE_ATTR(
pwm_enable##offset
, S_IRUGO, show_pwm_enable##offset, NULL)
static DEVICE_ATTR(
fan##offset##_pwm_enable
, S_IRUGO, show_pwm_enable##offset, NULL)
show_pwm_reg
(
1
);
show_pwm_reg
(
2
);
...
...
@@ -649,10 +649,10 @@ static ssize_t set_in_##offset##_max (struct device *dev, \
{ \
return set_in_max(dev, buf, count, 0x##offset); \
} \
static DEVICE_ATTR(in
_input##offse
t, S_IRUGO, show_in_##offset, NULL) \
static DEVICE_ATTR(in
_min##offset, S_IRUGO | S_IWUSR,
\
static DEVICE_ATTR(in
##offset##_inpu
t, S_IRUGO, show_in_##offset, NULL) \
static DEVICE_ATTR(in
##offset##_min, S_IRUGO | S_IWUSR,
\
show_in_##offset##_min, set_in_##offset##_min) \
static DEVICE_ATTR(in
_max##offset, S_IRUGO | S_IWUSR,
\
static DEVICE_ATTR(in
##offset##_max, S_IRUGO | S_IWUSR,
\
show_in_##offset##_max, set_in_##offset##_max)
show_in_reg
(
0
);
...
...
@@ -738,10 +738,10 @@ static ssize_t set_temp_##offset##_max (struct device *dev, \
{ \
return set_temp_max(dev, buf, count, 0x##offset - 1); \
} \
static DEVICE_ATTR(temp
_input##offse
t, S_IRUGO, show_temp_##offset, NULL) \
static DEVICE_ATTR(temp
_min##offset
, S_IRUGO | S_IWUSR, \
static DEVICE_ATTR(temp
##offset##_inpu
t, S_IRUGO, show_temp_##offset, NULL) \
static DEVICE_ATTR(temp
##offset##_min
, S_IRUGO | S_IWUSR, \
show_temp_##offset##_min, set_temp_##offset##_min) \
static DEVICE_ATTR(temp
_max##offset
, S_IRUGO | S_IWUSR, \
static DEVICE_ATTR(temp
##offset##_max
, S_IRUGO | S_IWUSR, \
show_temp_##offset##_max, set_temp_##offset##_max)
show_temp_reg
(
1
);
...
...
@@ -886,46 +886,46 @@ int lm85_detect(struct i2c_adapter *adapter, int address,
lm85_init_client
(
new_client
);
/* Register sysfs hooks */
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_input1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_input2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_input3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_input4
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_min1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_min2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_min3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_min4
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
pwm1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
pwm2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
pwm3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
pwm_enable1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
pwm_enable2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
pwm_enable3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input0
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input4
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min0
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min4
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max0
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max4
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_input1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_input2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_input3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_min1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_min2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_min3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_max1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_max2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_max3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
1_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
2_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
3_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
4_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
1_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
2_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
3_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
4_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
fan1_pwm
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
fan2_pwm
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
fan3_pwm
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
fan1_pwm_enable
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
fan2_pwm_enable
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
fan3_pwm_enable
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
0_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
1_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
2_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
3_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
4_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
0_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
1_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
2_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
3_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
4_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
0_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
1_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
2_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
3_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
4_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
2_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
3_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
2_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
3_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
2_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
3_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_vrm
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
vid
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_
in0_ref
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_alarms
);
return
0
;
...
...
drivers/i2c/chips/lm90.c
View file @
dcb326a2
...
...
@@ -245,23 +245,23 @@ static ssize_t show_alarms(struct device *dev, char *buf)
return
sprintf
(
buf
,
"%d
\n
"
,
data
->
alarms
);
}
static
DEVICE_ATTR
(
temp
_input1
,
S_IRUGO
,
show_temp_input1
,
NULL
);
static
DEVICE_ATTR
(
temp
_input2
,
S_IRUGO
,
show_temp_input2
,
NULL
);
static
DEVICE_ATTR
(
temp
_min1
,
S_IWUSR
|
S_IRUGO
,
show_temp_low1
,
static
DEVICE_ATTR
(
temp
1_input
,
S_IRUGO
,
show_temp_input1
,
NULL
);
static
DEVICE_ATTR
(
temp
2_input
,
S_IRUGO
,
show_temp_input2
,
NULL
);
static
DEVICE_ATTR
(
temp
1_min
,
S_IWUSR
|
S_IRUGO
,
show_temp_low1
,
set_temp_low1
);
static
DEVICE_ATTR
(
temp
_min2
,
S_IWUSR
|
S_IRUGO
,
show_temp_low2
,
static
DEVICE_ATTR
(
temp
2_min
,
S_IWUSR
|
S_IRUGO
,
show_temp_low2
,
set_temp_low2
);
static
DEVICE_ATTR
(
temp
_max1
,
S_IWUSR
|
S_IRUGO
,
show_temp_high1
,
static
DEVICE_ATTR
(
temp
1_max
,
S_IWUSR
|
S_IRUGO
,
show_temp_high1
,
set_temp_high1
);
static
DEVICE_ATTR
(
temp
_max2
,
S_IWUSR
|
S_IRUGO
,
show_temp_high2
,
static
DEVICE_ATTR
(
temp
2_max
,
S_IWUSR
|
S_IRUGO
,
show_temp_high2
,
set_temp_high2
);
static
DEVICE_ATTR
(
temp
_crit1
,
S_IWUSR
|
S_IRUGO
,
show_temp_crit1
,
static
DEVICE_ATTR
(
temp
1_crit
,
S_IWUSR
|
S_IRUGO
,
show_temp_crit1
,
set_temp_crit1
);
static
DEVICE_ATTR
(
temp
_crit2
,
S_IWUSR
|
S_IRUGO
,
show_temp_crit2
,
static
DEVICE_ATTR
(
temp
2_crit
,
S_IWUSR
|
S_IRUGO
,
show_temp_crit2
,
set_temp_crit2
);
static
DEVICE_ATTR
(
temp
_hyst1
,
S_IWUSR
|
S_IRUGO
,
show_temp_hyst1
,
static
DEVICE_ATTR
(
temp
1_crit_hyst
,
S_IWUSR
|
S_IRUGO
,
show_temp_hyst1
,
set_temp_hyst1
);
static
DEVICE_ATTR
(
temp
_hyst2
,
S_IRUGO
,
show_temp_hyst2
,
NULL
);
static
DEVICE_ATTR
(
temp
2_crit_hyst
,
S_IRUGO
,
show_temp_hyst2
,
NULL
);
static
DEVICE_ATTR
(
alarms
,
S_IRUGO
,
show_alarms
,
NULL
);
/*
...
...
@@ -381,16 +381,16 @@ static int lm90_detect(struct i2c_adapter *adapter, int address, int kind)
lm90_init_client
(
new_client
);
/* Register sysfs hooks */
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_input1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_input2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_min1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_min2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_max1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_max2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_crit1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_crit2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_hyst1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_hyst2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
2_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
2_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
2_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_crit
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
2_crit
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_crit_hyst
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
2_crit_hyst
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_alarms
);
return
0
;
...
...
drivers/i2c/chips/via686a.c
View file @
dcb326a2
...
...
@@ -482,10 +482,10 @@ static ssize_t set_in##offset##_max (struct device *dev, \
{ \
return set_in_max(dev, buf, count, 0x##offset); \
} \
static DEVICE_ATTR(in
_input##offse
t, S_IRUGO, show_in##offset, NULL) \
static DEVICE_ATTR(in
_min##offset, S_IRUGO | S_IWUSR,
\
static DEVICE_ATTR(in
##offset##_inpu
t, S_IRUGO, show_in##offset, NULL) \
static DEVICE_ATTR(in
##offset##_min, S_IRUGO | S_IWUSR,
\
show_in##offset##_min, set_in##offset##_min) \
static DEVICE_ATTR(in
_max##offset, S_IRUGO | S_IWUSR,
\
static DEVICE_ATTR(in
##offset##_max, S_IRUGO | S_IWUSR,
\
show_in##offset##_max, set_in##offset##_max)
show_in_offset
(
0
);
...
...
@@ -556,10 +556,10 @@ static ssize_t set_temp_##offset##_hyst (struct device *dev, \
{ \
return set_temp_hyst(dev, buf, count, 0x##offset - 1); \
} \
static DEVICE_ATTR(temp
_input##offse
t, S_IRUGO, show_temp_##offset, NULL) \
static DEVICE_ATTR(temp
_max##offset
, S_IRUGO | S_IWUSR, \
static DEVICE_ATTR(temp
##offset##_inpu
t, S_IRUGO, show_temp_##offset, NULL) \
static DEVICE_ATTR(temp
##offset##_max
, S_IRUGO | S_IWUSR, \
show_temp_##offset##_over, set_temp_##offset##_over) \
static DEVICE_ATTR(temp
_hyst##offse
t, S_IRUGO | S_IWUSR, \
static DEVICE_ATTR(temp
##offset##_max_hys
t, S_IRUGO | S_IWUSR, \
show_temp_##offset##_hyst, set_temp_##offset##_hyst)
show_temp_offset
(
1
);
...
...
@@ -631,10 +631,10 @@ static ssize_t set_fan_##offset##_div (struct device *dev, \
{ \
return set_fan_div(dev, buf, count, 0x##offset - 1); \
} \
static DEVICE_ATTR(fan
_input##offse
t, S_IRUGO, show_fan_##offset, NULL) \
static DEVICE_ATTR(fan
_min##offset, S_IRUGO | S_IWUSR,
\
static DEVICE_ATTR(fan
##offset##_inpu
t, S_IRUGO, show_fan_##offset, NULL) \
static DEVICE_ATTR(fan
##offset##_min, S_IRUGO | S_IWUSR,
\
show_fan_##offset##_min, set_fan_##offset##_min) \
static DEVICE_ATTR(fan
_div##offset, S_IRUGO | S_IWUSR,
\
static DEVICE_ATTR(fan
##offset##_div, S_IRUGO | S_IWUSR,
\
show_fan_##offset##_div, set_fan_##offset##_div)
show_fan_offset
(
1
);
...
...
@@ -653,7 +653,7 @@ static DEVICE_ATTR(alarms, S_IRUGO | S_IWUSR, show_alarms, NULL);
smbus_driver and isa_driver, and clients could be of either kind */
static
struct
i2c_driver
via686a_driver
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"
VIA686A
"
,
.
name
=
"
via686a
"
,
.
id
=
I2C_DRIVERID_VIA686A
,
.
flags
=
I2C_DF_NOTIFY
,
.
attach_adapter
=
via686a_attach_adapter
,
...
...
@@ -742,36 +742,36 @@ static int via686a_detect(struct i2c_adapter *adapter, int address, int kind)
via686a_init_client
(
new_client
);
/* Register sysfs hooks */
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input0
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_input4
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min0
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_min4
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max0
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
_max4
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_input1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_input2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_input3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_max1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_max2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_max3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_hyst1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_hyst2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_hyst3
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_input1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_input2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_min1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_min2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_div1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
_div2
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
0_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
1_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
2_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
3_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
4_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
0_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
1_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
2_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
3_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
4_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
0_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
1_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
2_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
3_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_in
4_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
2_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
3_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
2_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
3_max
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_max_hyst
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
2_max_hyst
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
3_max_hyst
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
1_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
2_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
1_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
2_min
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
1_div
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_fan
2_div
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_alarms
);
return
0
;
...
...
drivers/i2c/chips/w83781d.c
View file @
dcb326a2
...
...
@@ -25,8 +25,7 @@
Chip #vin #fanin #pwm #temp wchipid vendid i2c ISA
as99127f 7 3 1? 3 0x31 0x12c3 yes no
as99127f rev.2 (type_name = 1299127f) 0x31 0x5ca3 yes no
asb100 "bach" (type_name = as99127f) 0x31 0x0694 yes no
as99127f rev.2 (type_name = as99127f) 0x31 0x5ca3 yes no
w83781d 7 3 0 3 0x10-1 0x5ca3 yes yes
w83627hf 9 3 2 3 0x21 0x5ca3 yes yes(LPC)
w83627thf 9 3 2 3 0x90 0x5ca3 no yes(LPC)
...
...
@@ -248,10 +247,10 @@ struct w83781d_data {
u8
fan_min
[
3
];
/* Register value */
u8
temp
;
u8
temp_max
;
/* Register value */
u8
temp_
hyst
;
/* Register value */
u8
temp_
max_hyst
;
/* Register value */
u16
temp_add
[
2
];
/* Register value */
u16
temp_max_add
[
2
];
/* Register value */
u16
temp_hyst_add
[
2
];
/* Register value */
u16
temp_
max_
hyst_add
[
2
];
/* Register value */
u8
fan_div
[
3
];
/* Register encoding, shifted right */
u8
vid
;
/* Register encoding, combined */
u32
alarms
;
/* Register encoding, combined */
...
...
@@ -331,7 +330,7 @@ show_regs_in_##offset (struct device *dev, char *buf) \
{ \
return show_in(dev, buf, 0x##offset); \
} \
static DEVICE_ATTR(in
_input##offse
t, S_IRUGO, show_regs_in_##offset, NULL)
static DEVICE_ATTR(in
##offset##_inpu
t, S_IRUGO, show_regs_in_##offset, NULL)
#define sysfs_in_reg_offset(reg, offset) \
static ssize_t show_regs_in_##reg##offset (struct device *dev, char *buf) \
...
...
@@ -342,7 +341,7 @@ static ssize_t store_regs_in_##reg##offset (struct device *dev, const char *buf,
{ \
return store_in_##reg (dev, buf, count, 0x##offset); \
} \
static DEVICE_ATTR(in
_##reg##offset
, S_IRUGO| S_IWUSR, show_regs_in_##reg##offset, store_regs_in_##reg##offset)
static DEVICE_ATTR(in
##offset##_##reg
, S_IRUGO| S_IWUSR, show_regs_in_##reg##offset, store_regs_in_##reg##offset)
#define sysfs_in_offsets(offset) \
sysfs_in_offset(offset); \
...
...
@@ -361,9 +360,9 @@ sysfs_in_offsets(8);
#define device_create_file_in(client, offset) \
do { \
device_create_file(&client->dev, &dev_attr_in
_input##offse
t); \
device_create_file(&client->dev, &dev_attr_in
_min##offset
); \
device_create_file(&client->dev, &dev_attr_in
_max##offset
); \
device_create_file(&client->dev, &dev_attr_in
##offset##_inpu
t); \
device_create_file(&client->dev, &dev_attr_in
##offset##_min
); \
device_create_file(&client->dev, &dev_attr_in
##offset##_max
); \
} while (0)
#define show_fan_reg(reg) \
...
...
@@ -401,7 +400,7 @@ static ssize_t show_regs_fan_##offset (struct device *dev, char *buf) \
{ \
return show_fan(dev, buf, 0x##offset); \
} \
static DEVICE_ATTR(fan
_input##offse
t, S_IRUGO, show_regs_fan_##offset, NULL)
static DEVICE_ATTR(fan
##offset##_inpu
t, S_IRUGO, show_regs_fan_##offset, NULL)
#define sysfs_fan_min_offset(offset) \
static ssize_t show_regs_fan_min##offset (struct device *dev, char *buf) \
...
...
@@ -412,7 +411,7 @@ static ssize_t store_regs_fan_min##offset (struct device *dev, const char *buf,
{ \
return store_fan_min(dev, buf, count, 0x##offset); \
} \
static DEVICE_ATTR(fan
_min##offset
, S_IRUGO | S_IWUSR, show_regs_fan_min##offset, store_regs_fan_min##offset)
static DEVICE_ATTR(fan
##offset##_min
, S_IRUGO | S_IWUSR, show_regs_fan_min##offset, store_regs_fan_min##offset)
sysfs_fan_offset
(
1
);
sysfs_fan_min_offset
(
1
);
...
...
@@ -423,8 +422,8 @@ sysfs_fan_min_offset(3);
#define device_create_file_fan(client, offset) \
do { \
device_create_file(&client->dev, &dev_attr_fan
_input##offse
t); \
device_create_file(&client->dev, &dev_attr_fan
_min##offset
); \
device_create_file(&client->dev, &dev_attr_fan
##offset##_inpu
t); \
device_create_file(&client->dev, &dev_attr_fan
##offset##_min
); \
} while (0)
#define show_temp_reg(reg) \
...
...
@@ -449,7 +448,7 @@ static ssize_t show_##reg (struct device *dev, char *buf, int nr) \
}
show_temp_reg
(
temp
);
show_temp_reg
(
temp_max
);
show_temp_reg
(
temp_hyst
);
show_temp_reg
(
temp_
max_
hyst
);
#define store_temp_reg(REG, reg) \
static ssize_t store_temp_##reg (struct device *dev, const char *buf, size_t count, int nr) \
...
...
@@ -477,7 +476,7 @@ static ssize_t store_temp_##reg (struct device *dev, const char *buf, size_t cou
return count; \
}
store_temp_reg
(
OVER
,
max
);
store_temp_reg
(
HYST
,
hyst
);
store_temp_reg
(
HYST
,
max_
hyst
);
#define sysfs_temp_offset(offset) \
static ssize_t \
...
...
@@ -485,7 +484,7 @@ show_regs_temp_##offset (struct device *dev, char *buf) \
{ \
return show_temp(dev, buf, 0x##offset); \
} \
static DEVICE_ATTR(temp
_input##offse
t, S_IRUGO, show_regs_temp_##offset, NULL)
static DEVICE_ATTR(temp
##offset##_inpu
t, S_IRUGO, show_regs_temp_##offset, NULL)
#define sysfs_temp_reg_offset(reg, offset) \
static ssize_t show_regs_temp_##reg##offset (struct device *dev, char *buf) \
...
...
@@ -496,12 +495,12 @@ static ssize_t store_regs_temp_##reg##offset (struct device *dev, const char *bu
{ \
return store_temp_##reg (dev, buf, count, 0x##offset); \
} \
static DEVICE_ATTR(temp
_##reg##offset
, S_IRUGO| S_IWUSR, show_regs_temp_##reg##offset, store_regs_temp_##reg##offset)
static DEVICE_ATTR(temp
##offset##_##reg
, S_IRUGO| S_IWUSR, show_regs_temp_##reg##offset, store_regs_temp_##reg##offset)
#define sysfs_temp_offsets(offset) \
sysfs_temp_offset(offset); \
sysfs_temp_reg_offset(max, offset); \
sysfs_temp_reg_offset(hyst, offset);
sysfs_temp_reg_offset(
max_
hyst, offset);
sysfs_temp_offsets
(
1
);
sysfs_temp_offsets
(
2
);
...
...
@@ -509,9 +508,9 @@ sysfs_temp_offsets(3);
#define device_create_file_temp(client, offset) \
do { \
device_create_file(&client->dev, &dev_attr_temp
_input##offse
t); \
device_create_file(&client->dev, &dev_attr_temp
_max##offset
); \
device_create_file(&client->dev, &dev_attr_temp
_hyst##offse
t); \
device_create_file(&client->dev, &dev_attr_temp
##offset##_inpu
t); \
device_create_file(&client->dev, &dev_attr_temp
##offset##_max
); \
device_create_file(&client->dev, &dev_attr_temp
##offset##_max_hys
t); \
} while (0)
static
ssize_t
...
...
@@ -526,9 +525,9 @@ show_vid_reg(struct device *dev, char *buf)
}
static
DEVICE_ATTR
(
vid
,
S_IRUGO
,
show_vid_reg
,
NULL
)
DEVICE_ATTR
(
in0_ref
,
S_IRUGO
,
show_vid_reg
,
NULL
)
#define device_create_file_vid(client) \
device_create_file(&client->dev, &dev_attr_
vid
)
;
device_create_file(&client->dev, &dev_attr_
in0_ref
)
;
static
ssize_t
show_vrm_reg
(
struct
device
*
dev
,
char
*
buf
)
{
...
...
@@ -708,7 +707,7 @@ static ssize_t store_regs_fan_div_##offset (struct device *dev, const char *buf,
{ \
return store_fan_div_reg(dev, buf, count, offset); \
} \
static DEVICE_ATTR(fan
_div##offset
, S_IRUGO | S_IWUSR, show_regs_fan_div_##offset, store_regs_fan_div_##offset)
static DEVICE_ATTR(fan
##offset##_div
, S_IRUGO | S_IWUSR, show_regs_fan_div_##offset, store_regs_fan_div_##offset)
sysfs_fan_div
(
1
);
sysfs_fan_div
(
2
);
...
...
@@ -716,7 +715,7 @@ sysfs_fan_div(3);
#define device_create_file_fan_div(client, offset) \
do { \
device_create_file(&client->dev, &dev_attr_fan
_div##offset
); \
device_create_file(&client->dev, &dev_attr_fan
##offset##_div
); \
} while (0)
/* w83697hf only has two fans */
...
...
@@ -809,7 +808,7 @@ static ssize_t store_regs_pwm_##offset (struct device *dev, const char *buf, siz
{ \
return store_pwm_reg(dev, buf, count, offset); \
} \
static DEVICE_ATTR(
pwm##offset
, S_IRUGO | S_IWUSR, show_regs_pwm_##offset, store_regs_pwm_##offset)
static DEVICE_ATTR(
fan##offset##_pwm
, S_IRUGO | S_IWUSR, show_regs_pwm_##offset, store_regs_pwm_##offset)
#define sysfs_pwmenable(offset) \
static ssize_t show_regs_pwmenable_##offset (struct device *dev, char *buf) \
...
...
@@ -820,7 +819,7 @@ static ssize_t store_regs_pwmenable_##offset (struct device *dev, const char *bu
{ \
return store_pwmenable_reg(dev, buf, count, offset); \
} \
static DEVICE_ATTR(
pwm_enable##offset
, S_IRUGO | S_IWUSR, show_regs_pwmenable_##offset, store_regs_pwmenable_##offset)
static DEVICE_ATTR(
fan##offset##_pwm_enable
, S_IRUGO | S_IWUSR, show_regs_pwmenable_##offset, store_regs_pwmenable_##offset)
sysfs_pwm
(
1
);
sysfs_pwm
(
2
);
...
...
@@ -830,12 +829,12 @@ sysfs_pwm(4);
#define device_create_file_pwm(client, offset) \
do { \
device_create_file(&client->dev, &dev_attr_
pwm##offset
); \
device_create_file(&client->dev, &dev_attr_
fan##offset##_pwm
); \
} while (0)
#define device_create_file_pwmenable(client, offset) \
do { \
device_create_file(&client->dev, &dev_attr_
pwm_enable##offset
); \
device_create_file(&client->dev, &dev_attr_
fan##offset##_pwm_enable
); \
} while (0)
static
ssize_t
...
...
@@ -902,7 +901,7 @@ static ssize_t store_regs_sensor_##offset (struct device *dev, const char *buf,
{ \
return store_sensor_reg(dev, buf, count, offset); \
} \
static DEVICE_ATTR(
sensor##offset
, S_IRUGO | S_IWUSR, show_regs_sensor_##offset, store_regs_sensor_##offset)
static DEVICE_ATTR(
temp##offset##_type
, S_IRUGO | S_IWUSR, show_regs_sensor_##offset, store_regs_sensor_##offset)
sysfs_sensor
(
1
);
sysfs_sensor
(
2
);
...
...
@@ -910,7 +909,7 @@ sysfs_sensor(3);
#define device_create_file_sensor(client, offset) \
do { \
device_create_file(&client->dev, &dev_attr_
sensor##offset
); \
device_create_file(&client->dev, &dev_attr_
temp##offset##_type
); \
} while (0)
#ifdef W83781D_RT
...
...
@@ -1194,10 +1193,8 @@ w83781d_detect(struct i2c_adapter *adapter, int address, int kind)
val2
=
w83781d_read_value
(
new_client
,
W83781D_REG_CHIPMAN
);
/* Check for Winbond or Asus ID if in bank 0 */
if
((
!
(
val1
&
0x07
))
&&
(((
!
(
val1
&
0x80
))
&&
(
val2
!=
0xa3
)
&&
(
val2
!=
0xc3
)
&&
(
val2
!=
0x94
))
||
((
val1
&
0x80
)
&&
(
val2
!=
0x5c
)
&&
(
val2
!=
0x12
)
&&
(
val2
!=
0x06
))))
{
(((
!
(
val1
&
0x80
))
&&
(
val2
!=
0xa3
)
&&
(
val2
!=
0xc3
))
||
((
val1
&
0x80
)
&&
(
val2
!=
0x5c
)
&&
(
val2
!=
0x12
))))
{
err
=
-
ENODEV
;
goto
ERROR2
;
}
...
...
@@ -1226,7 +1223,7 @@ w83781d_detect(struct i2c_adapter *adapter, int address, int kind)
val2
=
w83781d_read_value
(
new_client
,
W83781D_REG_CHIPMAN
);
if
(
val2
==
0x5c
)
vendid
=
winbond
;
else
if
(
(
val2
==
0x12
)
||
(
val2
==
0x06
)
)
else
if
(
val2
==
0x12
)
vendid
=
asus
;
else
{
err
=
-
ENODEV
;
...
...
@@ -1632,7 +1629,11 @@ w83781d_init_client(struct i2c_client *client)
if
(
type
!=
w83781d
)
{
/* enable comparator mode for temp2 and temp3 so
alarm indication will work correctly */
w83781d_write_value
(
client
,
W83781D_REG_IRQ
,
0x41
);
i
=
w83781d_read_value
(
client
,
W83781D_REG_IRQ
);
if
(
!
(
i
&
0x40
))
w83781d_write_value
(
client
,
W83781D_REG_IRQ
,
i
|
0x40
);
for
(
i
=
0
;
i
<
3
;
i
++
)
data
->
pwmenable
[
i
]
=
1
;
}
...
...
@@ -1697,13 +1698,13 @@ w83781d_update_client(struct i2c_client *client)
data
->
temp
=
w83781d_read_value
(
client
,
W83781D_REG_TEMP
(
1
));
data
->
temp_max
=
w83781d_read_value
(
client
,
W83781D_REG_TEMP_OVER
(
1
));
data
->
temp_hyst
=
data
->
temp_
max_
hyst
=
w83781d_read_value
(
client
,
W83781D_REG_TEMP_HYST
(
1
));
data
->
temp_add
[
0
]
=
w83781d_read_value
(
client
,
W83781D_REG_TEMP
(
2
));
data
->
temp_max_add
[
0
]
=
w83781d_read_value
(
client
,
W83781D_REG_TEMP_OVER
(
2
));
data
->
temp_hyst_add
[
0
]
=
data
->
temp_
max_
hyst_add
[
0
]
=
w83781d_read_value
(
client
,
W83781D_REG_TEMP_HYST
(
2
));
if
(
data
->
type
!=
w83783s
&&
data
->
type
!=
w83697hf
)
{
data
->
temp_add
[
1
]
=
...
...
@@ -1711,7 +1712,7 @@ w83781d_update_client(struct i2c_client *client)
data
->
temp_max_add
[
1
]
=
w83781d_read_value
(
client
,
W83781D_REG_TEMP_OVER
(
3
));
data
->
temp_hyst_add
[
1
]
=
data
->
temp_
max_
hyst_add
[
1
]
=
w83781d_read_value
(
client
,
W83781D_REG_TEMP_HYST
(
3
));
}
...
...
drivers/i2c/chips/w83l785ts.c
View file @
dcb326a2
...
...
@@ -12,6 +12,9 @@
* Ported to Linux 2.6 by Wolfgang Ziegler <nuppla@gmx.at> and Jean Delvare
* <khali@linux-fr.org>.
*
* Thanks to James Bolt <james@evilpenguin.com> for benchmarking the read
* error handling mechanism.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
...
...
@@ -141,8 +144,8 @@ static ssize_t show_temp_over(struct device *dev, char *buf)
return
sprintf
(
buf
,
"%d
\n
"
,
TEMP_FROM_REG
(
data
->
temp_over
));
}
static
DEVICE_ATTR
(
temp
_input1
,
S_IRUGO
,
show_temp
,
NULL
)
static
DEVICE_ATTR
(
temp
_max1
,
S_IRUGO
,
show_temp_over
,
NULL
)
static
DEVICE_ATTR
(
temp
1_input
,
S_IRUGO
,
show_temp
,
NULL
)
static
DEVICE_ATTR
(
temp
1_max
,
S_IRUGO
,
show_temp_over
,
NULL
)
/*
* Real code
...
...
@@ -256,8 +259,8 @@ static int w83l785ts_detect(struct i2c_adapter *adapter, int address, int kind)
*/
/* Register sysfs hooks */
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_input1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
_max1
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_input
);
device_create_file
(
&
new_client
->
dev
,
&
dev_attr_temp
1_max
);
return
0
;
...
...
drivers/i2c/i2c-core.c
View file @
dcb326a2
...
...
@@ -175,7 +175,7 @@ int i2c_del_adapter(struct i2c_adapter *adap)
driver
=
list_entry
(
item
,
struct
i2c_driver
,
list
);
if
(
driver
->
detach_adapter
)
if
((
res
=
driver
->
detach_adapter
(
adap
)))
{
dev_warn
(
&
adap
->
dev
,
"can't detach adapter"
dev_warn
(
&
adap
->
dev
,
"can't detach adapter
"
"while detaching driver %s: driver not "
"detached!"
,
driver
->
name
);
goto
out_unlock
;
...
...
@@ -618,7 +618,7 @@ int i2c_control(struct i2c_client *client,
int
ret
=
0
;
struct
i2c_adapter
*
adap
=
client
->
adapter
;
dev_dbg
(
&
client
->
dev
,
"i2c ioctl, cmd: 0x%x, arg: %#lx
\n
"
,
cmd
,
arg
);
dev_dbg
(
&
client
->
adapter
->
dev
,
"i2c ioctl, cmd: 0x%x, arg: %#lx
\n
"
,
cmd
,
arg
);
switch
(
cmd
)
{
case
I2C_RETRIES
:
adap
->
retries
=
arg
;
...
...
drivers/pci/quirks.c
View file @
dcb326a2
...
...
@@ -760,7 +760,7 @@ static int __devinitdata sis_96x_compatible = 0;
#define SIS_DETECT_REGISTER 0x40
static
void
__init
quirk_sis_503
_smbus
(
struct
pci_dev
*
dev
)
static
void
__init
quirk_sis_503
(
struct
pci_dev
*
dev
)
{
u8
reg
;
u16
devid
;
...
...
@@ -768,7 +768,7 @@ static void __init quirk_sis_503_smbus(struct pci_dev *dev)
pci_read_config_byte
(
dev
,
SIS_DETECT_REGISTER
,
&
reg
);
pci_write_config_byte
(
dev
,
SIS_DETECT_REGISTER
,
reg
|
(
1
<<
6
));
pci_read_config_word
(
dev
,
PCI_DEVICE_ID
,
&
devid
);
if
((
devid
&
0xfff0
)
!=
0x0960
)
{
if
((
(
devid
&
0xfff0
)
!=
0x0960
)
&&
(
devid
!=
0x0018
)
)
{
pci_write_config_byte
(
dev
,
SIS_DETECT_REGISTER
,
reg
);
return
;
}
...
...
@@ -880,12 +880,14 @@ static struct pci_fixup pci_fixups[] __devinitdata = {
{
PCI_FIXUP_FINAL
,
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82443BX_2
,
quirk_natoma
},
{
PCI_FIXUP_FINAL
,
PCI_VENDOR_ID_SI
,
PCI_DEVICE_ID_SI_5597
,
quirk_nopcipci
},
{
PCI_FIXUP_FINAL
,
PCI_VENDOR_ID_SI
,
PCI_DEVICE_ID_SI_496
,
quirk_nopcipci
},
{
PCI_FIXUP_HEADER
,
PCI_VENDOR_ID_SI
,
PCI_DEVICE_ID_SI_503
,
quirk_sis_503_smbus
},
{
PCI_FIXUP_HEADER
,
PCI_VENDOR_ID_SI
,
PCI_DEVICE_ID_SI_503
,
quirk_sis_503
},
{
PCI_FIXUP_HEADER
,
PCI_VENDOR_ID_SI
,
PCI_DEVICE_ID_SI_LPC
,
quirk_sis_96x_smbus
},
{
PCI_FIXUP_HEADER
,
PCI_VENDOR_ID_SI
,
PCI_DEVICE_ID_SI_645
,
quirk_sis_96x_compatible
},
{
PCI_FIXUP_HEADER
,
PCI_VENDOR_ID_SI
,
PCI_DEVICE_ID_SI_646
,
quirk_sis_96x_compatible
},
{
PCI_FIXUP_HEADER
,
PCI_VENDOR_ID_SI
,
PCI_DEVICE_ID_SI_648
,
quirk_sis_96x_compatible
},
{
PCI_FIXUP_HEADER
,
PCI_VENDOR_ID_SI
,
PCI_DEVICE_ID_SI_650
,
quirk_sis_96x_compatible
},
{
PCI_FIXUP_HEADER
,
PCI_VENDOR_ID_SI
,
PCI_DEVICE_ID_SI_651
,
quirk_sis_96x_compatible
},
{
PCI_FIXUP_HEADER
,
PCI_VENDOR_ID_SI
,
PCI_DEVICE_ID_SI_735
,
quirk_sis_96x_compatible
},
{
PCI_FIXUP_HEADER
,
PCI_VENDOR_ID_SI
,
PCI_DEVICE_ID_SI_961
,
quirk_sis_96x_smbus
},
{
PCI_FIXUP_HEADER
,
PCI_VENDOR_ID_SI
,
PCI_DEVICE_ID_SI_962
,
quirk_sis_96x_smbus
},
{
PCI_FIXUP_HEADER
,
PCI_VENDOR_ID_SI
,
PCI_DEVICE_ID_SI_963
,
quirk_sis_96x_smbus
},
...
...
include/linux/pci_ids.h
View file @
dcb326a2
...
...
@@ -569,6 +569,7 @@
#define PCI_DEVICE_ID_SI_6202 0x0002
#define PCI_DEVICE_ID_SI_503 0x0008
#define PCI_DEVICE_ID_SI_ACPI 0x0009
#define PCI_DEVICE_ID_SI_LPC 0x0018
#define PCI_DEVICE_ID_SI_5597_VGA 0x0200
#define PCI_DEVICE_ID_SI_6205 0x0205
#define PCI_DEVICE_ID_SI_501 0x0406
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment