Parent repository is bk://kernel.bkbits.net/gregkh/linux/i2c-2.6 ======== ChangeSet 1.1591 ======== D 1.1591 04/02/25 11:50:11-08:00 akpm@mnm.(none) 37529 37445 2/0/1 P ChangeSet C Merge mnm.(none):/usr/src/bk25 into mnm.(none):/usr/src/bk-i2c ------------------------------------------------ diff -Nru a/Documentation/i2c/sysfs-interface b/Documentation/i2c/sysfs-interface --- a/Documentation/i2c/sysfs-interface Wed Feb 25 11:51:44 2004 +++ b/Documentation/i2c/sysfs-interface Wed Feb 25 11:51:44 2004 @@ -3,22 +3,44 @@ 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 @@ 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: _. 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 @@ ------------------------------------------------------------------------- -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. - -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. +************ +* Voltages * +************ -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 @@ 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 + 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. -pwm[1-3] Pulse width modulation fan control. +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". temp2_* to + temp4_* 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. diff -Nru a/drivers/i2c/Kconfig b/drivers/i2c/Kconfig --- a/drivers/i2c/Kconfig Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/Kconfig Wed Feb 25 11:51:44 2004 @@ -15,9 +15,6 @@ 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. diff -Nru a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig --- a/drivers/i2c/busses/Kconfig Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/busses/Kconfig Wed Feb 25 11:51:44 2004 @@ -144,6 +144,17 @@ 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 diff -Nru a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile --- a/drivers/i2c/busses/Makefile Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/busses/Makefile Wed Feb 25 11:51:44 2004 @@ -15,6 +15,7 @@ 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 diff -Nru a/drivers/i2c/busses/i2c-ali1535.c b/drivers/i2c/busses/i2c-ali1535.c --- a/drivers/i2c/busses/i2c-ali1535.c Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/busses/i2c-ali1535.c Wed Feb 25 11:51:44 2004 @@ -517,6 +517,7 @@ 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 void __exit i2c_ali1535_exit(void) { pci_unregister_driver(&ali1535_driver); - release_region(ali1535_smba, ALI1535_SMB_IOSIZE); } MODULE_AUTHOR("Frodo Looijaard , " diff -Nru a/drivers/i2c/busses/i2c-elv.c b/drivers/i2c/busses/i2c-elv.c --- a/drivers/i2c/busses/i2c-elv.c Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/busses/i2c-elv.c Wed Feb 25 11:51:44 2004 @@ -152,7 +152,7 @@ return -ENODEV; } } - pr_debug("i2c-elv: found device at %#x.\n",base); + pr_debug("i2c-elv: found device at %p.\n", (void *)base); return 0; } diff -Nru a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c --- a/drivers/i2c/busses/i2c-i801.c Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/busses/i2c-i801.c Wed Feb 25 11:51:44 2004 @@ -608,6 +608,7 @@ 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 void __exit i2c_i801_exit(void) { pci_unregister_driver(&i801_driver); - release_region(i801_smba, (isich4 ? 16 : 8)); } MODULE_AUTHOR ("Frodo Looijaard , " diff -Nru a/drivers/i2c/busses/i2c-ixp42x.c b/drivers/i2c/busses/i2c-ixp42x.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/i2c/busses/i2c-ixp42x.c Wed Feb 25 11:51:44 2004 @@ -0,0 +1,180 @@ +/* + * 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 + * + * 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 +#ifdef CONFIG_I2C_DEBUG_BUS +#define DEBUG 1 +#endif + +#include +#include +#include +#include +#include + +#include /* 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 "); + diff -Nru a/drivers/i2c/busses/i2c-sis5595.c b/drivers/i2c/busses/i2c-sis5595.c --- a/drivers/i2c/busses/i2c-sis5595.c Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/busses/i2c-sis5595.c Wed Feb 25 11:51:44 2004 @@ -391,6 +391,7 @@ 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 void __exit i2c_sis5595_exit(void) { pci_unregister_driver(&sis5595_driver); - release_region(sis5595_base + SMB_INDEX, 2); } MODULE_AUTHOR("Frodo Looijaard "); diff -Nru a/drivers/i2c/busses/i2c-velleman.c b/drivers/i2c/busses/i2c-velleman.c --- a/drivers/i2c/busses/i2c-velleman.c Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/busses/i2c-velleman.c Wed Feb 25 11:51:44 2004 @@ -138,7 +138,7 @@ return -ENODEV; } } - pr_debug("i2c-velleman: found device at %#x.\n",base); + pr_debug("i2c-velleman: found device at %p.\n",(void *)base); return 0; } diff -Nru a/drivers/i2c/busses/i2c-voodoo3.c b/drivers/i2c/busses/i2c-voodoo3.c --- a/drivers/i2c/busses/i2c-voodoo3.c Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/busses/i2c-voodoo3.c Wed Feb 25 11:51:44 2004 @@ -171,6 +171,7 @@ 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_adapter voodoo3_ddc_adapter = { .owner = THIS_MODULE, + .class = I2C_ADAP_CLASS_DDC, .name = "DDC Voodoo3/Banshee adapter", .algo_data = &voo_ddc_bit_data, }; diff -Nru a/drivers/i2c/chips/Kconfig b/drivers/i2c/chips/Kconfig --- a/drivers/i2c/chips/Kconfig Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/chips/Kconfig Wed Feb 25 11:51:44 2004 @@ -102,6 +102,17 @@ 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 diff -Nru a/drivers/i2c/chips/Makefile b/drivers/i2c/chips/Makefile --- a/drivers/i2c/chips/Makefile Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/chips/Makefile Wed Feb 25 11:51:44 2004 @@ -13,6 +13,7 @@ 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 diff -Nru a/drivers/i2c/chips/adm1021.c b/drivers/i2c/chips/adm1021.c --- a/drivers/i2c/chips/adm1021.c Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/chips/adm1021.c Wed Feb 25 11:51:44 2004 @@ -148,7 +148,7 @@ /* 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(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(temp1_max, S_IWUSR | S_IRUGO, show_temp_max, set_temp_max); +static DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, show_temp_hyst, set_temp_hyst); +static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp_input, NULL); +static DEVICE_ATTR(temp2_max, S_IWUSR | S_IRUGO, show_remote_temp_max, set_remote_temp_max); +static DEVICE_ATTR(temp2_min, S_IWUSR | S_IRUGO, show_remote_temp_hyst, set_remote_temp_hyst); +static DEVICE_ATTR(temp2_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 @@ 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_temp1_max); + device_create_file(&new_client->dev, &dev_attr_temp1_min); + device_create_file(&new_client->dev, &dev_attr_temp1_input); + device_create_file(&new_client->dev, &dev_attr_temp2_max); + device_create_file(&new_client->dev, &dev_attr_temp2_min); + device_create_file(&new_client->dev, &dev_attr_temp2_input); device_create_file(&new_client->dev, &dev_attr_alarms); if (data->type == adm1021) device_create_file(&new_client->dev, &dev_attr_die_code); diff -Nru a/drivers/i2c/chips/asb100.c b/drivers/i2c/chips/asb100.c --- a/drivers/i2c/chips/asb100.c Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/chips/asb100.c Wed Feb 25 11:51:44 2004 @@ -274,7 +274,7 @@ { \ 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) \ @@ -296,9 +296,9 @@ { \ 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(6) #define device_create_file_in(client, offset) do { \ - device_create_file(&client->dev, &dev_attr_in_input##offset); \ - 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##_input); \ + 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 @@ { \ return set_fan_div(dev, buf, count, offset - 1); \ } \ -static DEVICE_ATTR(fan_input##offset, S_IRUGO, \ +static DEVICE_ATTR(fan##offset##_input, 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(3) #define device_create_file_fan(client, offset) do { \ - device_create_file(&client->dev, &dev_attr_fan_input##offset); \ - 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##_input); \ + 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 @@ { \ 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 @@ { \ 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 @@ { \ 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 @@ /* 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 @@ 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 @@ 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: diff -Nru a/drivers/i2c/chips/fscher.c b/drivers/i2c/chips/fscher.c --- a/drivers/i2c/chips/fscher.c Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/chips/fscher.c Wed Feb 25 11:51:44 2004 @@ -26,6 +26,11 @@ * and Philip Edelbrock */ +#include +#ifdef CONFIG_I2C_DEBUG_CHIP +#define DEBUG 1 +#endif + #include #include #include @@ -160,71 +165,71 @@ * 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(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_ro_n(kind, offset, reg) \ -sysfs_r(kind, offset, reg) \ -static DEVICE_ATTR(kind##offset, S_IRUGO, show_##kind##offset, NULL); - -#define sysfs_ro(kind, reg) \ -sysfs_r(kind, 0, reg) \ -static DEVICE_ATTR(kind, S_IRUGO, show_##kind##0, NULL); +#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, 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, 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, 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 @@ #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##offset); \ + 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##_input); \ } 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##offset); \ + device_create_file(&client->dev, &dev_attr_temp##offset##_status); \ + device_create_file(&client->dev, &dev_attr_temp##offset##_input); \ } while (0) #define device_create_file_in(client, offset) \ do { \ - device_create_file(&client->dev, &dev_attr_in_input##offset); \ + device_create_file(&client->dev, &dev_attr_in##offset##_input); \ } while (0) #define device_create_file_revision(client) \ @@ -484,7 +489,7 @@ 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 @@ 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)]); } diff -Nru a/drivers/i2c/chips/gl518sm.c b/drivers/i2c/chips/gl518sm.c --- a/drivers/i2c/chips/gl518sm.c Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/chips/gl518sm.c Wed Feb 25 11:51:44 2004 @@ -307,29 +307,29 @@ 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(temp1_input, S_IRUGO, show_temp_input1, NULL); +static DEVICE_ATTR(temp1_max, S_IWUSR|S_IRUGO, show_temp_max1, set_temp_max1); +static DEVICE_ATTR(temp1_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(fan1_auto, S_IWUSR|S_IRUGO, show_fan_auto1, set_fan_auto1); +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_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_div, S_IWUSR|S_IRUGO, show_fan_div1, set_fan_div1); +static DEVICE_ATTR(fan2_div, S_IWUSR|S_IRUGO, show_fan_div2, set_fan_div2); +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(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(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(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 @@ 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_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_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_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_fan1_auto); + 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_min); + device_create_file(&new_client->dev, &dev_attr_fan2_min); + 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_alarms); device_create_file(&new_client->dev, &dev_attr_beep_enable); device_create_file(&new_client->dev, &dev_attr_beep_mask); diff -Nru a/drivers/i2c/chips/it87.c b/drivers/i2c/chips/it87.c --- a/drivers/i2c/chips/it87.c Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/chips/it87.c Wed Feb 25 11:51:44 2004 @@ -6,7 +6,7 @@ IT8712F Super I/O chip w/LPC interface & SMbus Sis950 A clone of the IT8705F - Copyright (c) 2001 Chris Gauthron + Copyright (C) 2001 Chris Gauthron 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 @@ /* 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 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 @@ { \ return show_in(dev, buf, 0x##offset); \ } \ -static DEVICE_ATTR(in_input##offset, S_IRUGO, show_in##offset, NULL) +static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_in##offset, NULL) #define limit_in_offset(offset) \ static ssize_t \ @@ -316,9 +310,9 @@ { \ 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 @@ { \ return set_temp_min(dev, buf, count, 0x##offset - 1); \ } \ -static DEVICE_ATTR(temp_input##offset, S_IRUGO, show_temp_##offset, NULL) \ -static DEVICE_ATTR(temp_max##offset, S_IRUGO | S_IWUSR, \ +static DEVICE_ATTR(temp##offset##_input, 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 @@ 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 @@ 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 @@ { \ 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 @@ { \ return set_fan_div(dev, buf, count, 0x##offset - 1); \ } \ -static DEVICE_ATTR(fan_input##offset, S_IRUGO, show_fan_##offset, NULL) \ -static DEVICE_ATTR(fan_min##offset, S_IRUGO | S_IWUSR, \ +static DEVICE_ATTR(fan##offset##_input, 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 @@ 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_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_in7_input); + device_create_file(&new_client->dev, &dev_attr_in8_input); + 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_in7_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_in7_max); + device_create_file(&new_client->dev, &dev_attr_temp1_input); + device_create_file(&new_client->dev, &dev_attr_temp2_input); + device_create_file(&new_client->dev, &dev_attr_temp3_input); + device_create_file(&new_client->dev, &dev_attr_temp1_max); + device_create_file(&new_client->dev, &dev_attr_temp2_max); + device_create_file(&new_client->dev, &dev_attr_temp3_max); + device_create_file(&new_client->dev, &dev_attr_temp1_min); + device_create_file(&new_client->dev, &dev_attr_temp2_min); + device_create_file(&new_client->dev, &dev_attr_temp3_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_fan1_input); + device_create_file(&new_client->dev, &dev_attr_fan2_input); + device_create_file(&new_client->dev, &dev_attr_fan3_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_fan3_min); + 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_fan3_div); device_create_file(&new_client->dev, &dev_attr_alarms); return 0; @@ -888,7 +885,7 @@ /* 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 @@ (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_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); diff -Nru a/drivers/i2c/chips/lm75.c b/drivers/i2c/chips/lm75.c --- a/drivers/i2c/chips/lm75.c Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/chips/lm75.c Wed Feb 25 11:51:44 2004 @@ -104,9 +104,9 @@ 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(temp1_max, S_IWUSR | S_IRUGO, show_temp_max, set_temp_max); +static DEVICE_ATTR(temp1_max_hyst, S_IWUSR | S_IRUGO, show_temp_hyst, set_temp_hyst); +static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp_input, NULL); static int lm75_attach_adapter(struct i2c_adapter *adapter) { @@ -197,9 +197,9 @@ 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_temp1_max); + device_create_file(&new_client->dev, &dev_attr_temp1_max_hyst); + device_create_file(&new_client->dev, &dev_attr_temp1_input); return 0; diff -Nru a/drivers/i2c/chips/lm78.c b/drivers/i2c/chips/lm78.c --- a/drivers/i2c/chips/lm78.c Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/chips/lm78.c Wed Feb 25 11:51:44 2004 @@ -289,7 +289,7 @@ { \ 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 @@ { \ 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 @@ return count; } -static DEVICE_ATTR(temp_input1, S_IRUGO, show_temp, NULL) -static DEVICE_ATTR(temp_max1, S_IRUGO | S_IWUSR, +static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL) +static DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR, show_temp_over, set_temp_over) -static DEVICE_ATTR(temp_hyst1, S_IRUGO | S_IWUSR, +static DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR, show_temp_hyst, set_temp_hyst) /* 3 Fans */ @@ -460,8 +460,8 @@ { \ return set_fan_min(dev, buf, count, 0x##offset - 1); \ } \ -static DEVICE_ATTR(fan_input##offset, S_IRUGO, show_fan_##offset, NULL) \ -static DEVICE_ATTR(fan_min##offset, S_IRUGO | S_IWUSR, \ +static DEVICE_ATTR(fan##offset##_input, 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(3); /* Fan 3 divisor is locked in H/W */ -static DEVICE_ATTR(fan_div1, S_IRUGO | S_IWUSR, +static DEVICE_ATTR(fan1_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(fan2_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(fan3_div, S_IRUGO, show_fan_3_div, NULL) /* VID */ static ssize_t show_vid(struct device *dev, char *buf) @@ -495,7 +495,7 @@ 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 @@ 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_in0_input); + device_create_file(&new_client->dev, &dev_attr_in0_min); + device_create_file(&new_client->dev, &dev_attr_in0_max); + device_create_file(&new_client->dev, &dev_attr_in1_input); + device_create_file(&new_client->dev, &dev_attr_in1_min); + device_create_file(&new_client->dev, &dev_attr_in1_max); + device_create_file(&new_client->dev, &dev_attr_in2_input); + device_create_file(&new_client->dev, &dev_attr_in2_min); + device_create_file(&new_client->dev, &dev_attr_in2_max); + device_create_file(&new_client->dev, &dev_attr_in3_input); + device_create_file(&new_client->dev, &dev_attr_in3_min); + device_create_file(&new_client->dev, &dev_attr_in3_max); + device_create_file(&new_client->dev, &dev_attr_in4_input); + device_create_file(&new_client->dev, &dev_attr_in4_min); + device_create_file(&new_client->dev, &dev_attr_in4_max); + device_create_file(&new_client->dev, &dev_attr_in5_input); + device_create_file(&new_client->dev, &dev_attr_in5_min); + device_create_file(&new_client->dev, &dev_attr_in5_max); + device_create_file(&new_client->dev, &dev_attr_in6_input); + device_create_file(&new_client->dev, &dev_attr_in6_min); + device_create_file(&new_client->dev, &dev_attr_in6_max); + 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_fan1_input); + device_create_file(&new_client->dev, &dev_attr_fan1_min); + device_create_file(&new_client->dev, &dev_attr_fan1_div); + device_create_file(&new_client->dev, &dev_attr_fan2_input); + device_create_file(&new_client->dev, &dev_attr_fan2_min); + device_create_file(&new_client->dev, &dev_attr_fan2_div); + device_create_file(&new_client->dev, &dev_attr_fan3_input); + device_create_file(&new_client->dev, &dev_attr_fan3_min); + device_create_file(&new_client->dev, &dev_attr_fan3_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; diff -Nru a/drivers/i2c/chips/lm80.c b/drivers/i2c/chips/lm80.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/i2c/chips/lm80.c Wed Feb 25 11:51:44 2004 @@ -0,0 +1,567 @@ +/* + * lm80.c - From lm_sensors, Linux kernel modules for hardware + * monitoring + * Copyright (C) 1998, 1999 Frodo Looijaard + * and Philip Edelbrock + * + * Ported to Linux 2.6 by Tiago Sousa + * + * 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 +#ifdef CONFIG_I2C_DEBUG_CHIP +#define DEBUG 1 +#endif + +#include +#include +#include +#include +#include + +/* 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 and " + "Philip Edelbrock "); +MODULE_DESCRIPTION("LM80 driver"); +MODULE_LICENSE("GPL"); + +module_init(sensors_lm80_init); +module_exit(sensors_lm80_exit); diff -Nru a/drivers/i2c/chips/lm83.c b/drivers/i2c/chips/lm83.c --- a/drivers/i2c/chips/lm83.c Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/chips/lm83.c Wed Feb 25 11:51:44 2004 @@ -201,17 +201,17 @@ 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(temp1_input, S_IRUGO, show_temp_input1, NULL); +static DEVICE_ATTR(temp2_input, S_IRUGO, show_temp_input2, NULL); +static DEVICE_ATTR(temp3_input, S_IRUGO, show_temp_input3, NULL); +static DEVICE_ATTR(temp4_input, S_IRUGO, show_temp_input4, NULL); +static DEVICE_ATTR(temp1_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(temp2_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(temp3_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(temp4_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 @@ */ /* 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_temp1_input); + device_create_file(&new_client->dev, &dev_attr_temp2_input); + device_create_file(&new_client->dev, &dev_attr_temp3_input); + device_create_file(&new_client->dev, &dev_attr_temp4_input); + device_create_file(&new_client->dev, &dev_attr_temp1_max); + device_create_file(&new_client->dev, &dev_attr_temp2_max); + device_create_file(&new_client->dev, &dev_attr_temp3_max); + device_create_file(&new_client->dev, &dev_attr_temp4_max); device_create_file(&new_client->dev, &dev_attr_temp_crit); device_create_file(&new_client->dev, &dev_attr_alarms); diff -Nru a/drivers/i2c/chips/lm85.c b/drivers/i2c/chips/lm85.c --- a/drivers/i2c/chips/lm85.c Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/chips/lm85.c Wed Feb 25 11:51:44 2004 @@ -460,8 +460,8 @@ { \ return set_fan_min(dev, buf, count, 0x##offset - 1); \ } \ -static DEVICE_ATTR(fan_input##offset, S_IRUGO, show_fan_##offset, NULL) \ -static DEVICE_ATTR(fan_min##offset, S_IRUGO | S_IWUSR, \ +static DEVICE_ATTR(fan##offset##_input, 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 @@ 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 @@ { \ 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 @@ { \ return set_in_max(dev, buf, count, 0x##offset); \ } \ -static DEVICE_ATTR(in_input##offset, S_IRUGO, show_in_##offset, NULL) \ -static DEVICE_ATTR(in_min##offset, S_IRUGO | S_IWUSR, \ +static DEVICE_ATTR(in##offset##_input, 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 @@ { \ return set_temp_max(dev, buf, count, 0x##offset - 1); \ } \ -static DEVICE_ATTR(temp_input##offset, S_IRUGO, show_temp_##offset, NULL) \ -static DEVICE_ATTR(temp_min##offset, S_IRUGO | S_IWUSR, \ +static DEVICE_ATTR(temp##offset##_input, 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 @@ 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_fan1_input); + device_create_file(&new_client->dev, &dev_attr_fan2_input); + device_create_file(&new_client->dev, &dev_attr_fan3_input); + device_create_file(&new_client->dev, &dev_attr_fan4_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_fan3_min); + device_create_file(&new_client->dev, &dev_attr_fan4_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_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_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_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_temp1_input); + device_create_file(&new_client->dev, &dev_attr_temp2_input); + device_create_file(&new_client->dev, &dev_attr_temp3_input); + device_create_file(&new_client->dev, &dev_attr_temp1_min); + device_create_file(&new_client->dev, &dev_attr_temp2_min); + device_create_file(&new_client->dev, &dev_attr_temp3_min); + device_create_file(&new_client->dev, &dev_attr_temp1_max); + device_create_file(&new_client->dev, &dev_attr_temp2_max); + device_create_file(&new_client->dev, &dev_attr_temp3_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; diff -Nru a/drivers/i2c/chips/lm90.c b/drivers/i2c/chips/lm90.c --- a/drivers/i2c/chips/lm90.c Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/chips/lm90.c Wed Feb 25 11:51:44 2004 @@ -245,23 +245,23 @@ 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(temp1_input, S_IRUGO, show_temp_input1, NULL); +static DEVICE_ATTR(temp2_input, S_IRUGO, show_temp_input2, NULL); +static DEVICE_ATTR(temp1_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(temp2_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(temp1_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(temp2_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(temp1_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(temp2_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(temp1_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(temp2_crit_hyst, S_IRUGO, show_temp_hyst2, NULL); static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); /* @@ -381,16 +381,16 @@ 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_temp1_input); + device_create_file(&new_client->dev, &dev_attr_temp2_input); + device_create_file(&new_client->dev, &dev_attr_temp1_min); + device_create_file(&new_client->dev, &dev_attr_temp2_min); + device_create_file(&new_client->dev, &dev_attr_temp1_max); + device_create_file(&new_client->dev, &dev_attr_temp2_max); + device_create_file(&new_client->dev, &dev_attr_temp1_crit); + device_create_file(&new_client->dev, &dev_attr_temp2_crit); + device_create_file(&new_client->dev, &dev_attr_temp1_crit_hyst); + device_create_file(&new_client->dev, &dev_attr_temp2_crit_hyst); device_create_file(&new_client->dev, &dev_attr_alarms); return 0; diff -Nru a/drivers/i2c/chips/via686a.c b/drivers/i2c/chips/via686a.c --- a/drivers/i2c/chips/via686a.c Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/chips/via686a.c Wed Feb 25 11:51:44 2004 @@ -482,10 +482,10 @@ { \ return set_in_max(dev, buf, count, 0x##offset); \ } \ -static DEVICE_ATTR(in_input##offset, S_IRUGO, show_in##offset, NULL) \ -static DEVICE_ATTR(in_min##offset, S_IRUGO | S_IWUSR, \ +static DEVICE_ATTR(in##offset##_input, 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 @@ { \ return set_temp_hyst(dev, buf, count, 0x##offset - 1); \ } \ -static DEVICE_ATTR(temp_input##offset, S_IRUGO, show_temp_##offset, NULL) \ -static DEVICE_ATTR(temp_max##offset, S_IRUGO | S_IWUSR, \ +static DEVICE_ATTR(temp##offset##_input, 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##offset, S_IRUGO | S_IWUSR, \ +static DEVICE_ATTR(temp##offset##_max_hyst, S_IRUGO | S_IWUSR, \ show_temp_##offset##_hyst, set_temp_##offset##_hyst) show_temp_offset(1); @@ -631,10 +631,10 @@ { \ return set_fan_div(dev, buf, count, 0x##offset - 1); \ } \ -static DEVICE_ATTR(fan_input##offset, S_IRUGO, show_fan_##offset, NULL) \ -static DEVICE_ATTR(fan_min##offset, S_IRUGO | S_IWUSR, \ +static DEVICE_ATTR(fan##offset##_input, 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 @@ 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 @@ 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_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_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_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_temp1_input); + device_create_file(&new_client->dev, &dev_attr_temp2_input); + device_create_file(&new_client->dev, &dev_attr_temp3_input); + device_create_file(&new_client->dev, &dev_attr_temp1_max); + device_create_file(&new_client->dev, &dev_attr_temp2_max); + device_create_file(&new_client->dev, &dev_attr_temp3_max); + device_create_file(&new_client->dev, &dev_attr_temp1_max_hyst); + device_create_file(&new_client->dev, &dev_attr_temp2_max_hyst); + device_create_file(&new_client->dev, &dev_attr_temp3_max_hyst); + 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_min); + device_create_file(&new_client->dev, &dev_attr_fan2_min); + 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_alarms); return 0; diff -Nru a/drivers/i2c/chips/w83781d.c b/drivers/i2c/chips/w83781d.c --- a/drivers/i2c/chips/w83781d.c Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/chips/w83781d.c Wed Feb 25 11:51:44 2004 @@ -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 @@ 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 @@ { \ return show_in(dev, buf, 0x##offset); \ } \ -static DEVICE_ATTR(in_input##offset, S_IRUGO, show_regs_in_##offset, NULL) +static DEVICE_ATTR(in##offset##_input, 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 @@ { \ 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 @@ #define device_create_file_in(client, offset) \ do { \ -device_create_file(&client->dev, &dev_attr_in_input##offset); \ -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##_input); \ +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 @@ { \ return show_fan(dev, buf, 0x##offset); \ } \ -static DEVICE_ATTR(fan_input##offset, S_IRUGO, show_regs_fan_##offset, NULL) +static DEVICE_ATTR(fan##offset##_input, 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 @@ { \ 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 @@ #define device_create_file_fan(client, offset) \ do { \ -device_create_file(&client->dev, &dev_attr_fan_input##offset); \ -device_create_file(&client->dev, &dev_attr_fan_min##offset); \ +device_create_file(&client->dev, &dev_attr_fan##offset##_input); \ +device_create_file(&client->dev, &dev_attr_fan##offset##_min); \ } while (0) #define show_temp_reg(reg) \ @@ -449,7 +448,7 @@ } 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 @@ 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 @@ { \ return show_temp(dev, buf, 0x##offset); \ } \ -static DEVICE_ATTR(temp_input##offset, S_IRUGO, show_regs_temp_##offset, NULL) +static DEVICE_ATTR(temp##offset##_input, 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 @@ { \ 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 @@ #define device_create_file_temp(client, offset) \ do { \ -device_create_file(&client->dev, &dev_attr_temp_input##offset); \ -device_create_file(&client->dev, &dev_attr_temp_max##offset); \ -device_create_file(&client->dev, &dev_attr_temp_hyst##offset); \ +device_create_file(&client->dev, &dev_attr_temp##offset##_input); \ +device_create_file(&client->dev, &dev_attr_temp##offset##_max); \ +device_create_file(&client->dev, &dev_attr_temp##offset##_max_hyst); \ } while (0) static ssize_t @@ -526,9 +525,9 @@ } 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 @@ { \ 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 @@ #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 @@ { \ 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 @@ { \ 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 @@ #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 @@ { \ 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 @@ #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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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)); } diff -Nru a/drivers/i2c/chips/w83l785ts.c b/drivers/i2c/chips/w83l785ts.c --- a/drivers/i2c/chips/w83l785ts.c Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/chips/w83l785ts.c Wed Feb 25 11:51:44 2004 @@ -12,6 +12,9 @@ * Ported to Linux 2.6 by Wolfgang Ziegler and Jean Delvare * . * + * Thanks to James Bolt 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 @@ 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(temp1_input, S_IRUGO, show_temp, NULL) +static DEVICE_ATTR(temp1_max, S_IRUGO, show_temp_over, NULL) /* * Real code @@ -256,8 +259,8 @@ */ /* 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_temp1_input); + device_create_file(&new_client->dev, &dev_attr_temp1_max); return 0; diff -Nru a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c --- a/drivers/i2c/i2c-core.c Wed Feb 25 11:51:44 2004 +++ b/drivers/i2c/i2c-core.c Wed Feb 25 11:51:44 2004 @@ -175,7 +175,7 @@ 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 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; diff -Nru a/drivers/pci/quirks.c b/drivers/pci/quirks.c --- a/drivers/pci/quirks.c Wed Feb 25 11:51:44 2004 +++ b/drivers/pci/quirks.c Wed Feb 25 11:51:44 2004 @@ -760,7 +760,7 @@ #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 @@ pci_read_config_byte(dev, SIS_DETECT_REGISTER, ®); 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; } @@ -903,12 +903,14 @@ { 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 }, diff -Nru a/include/linux/pci_ids.h b/include/linux/pci_ids.h --- a/include/linux/pci_ids.h Wed Feb 25 11:51:44 2004 +++ b/include/linux/pci_ids.h Wed Feb 25 11:51:44 2004 @@ -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