forked from mirrors/linux
		
	 1da177e4c3
			
		
	
	
		1da177e4c3
		
	
	
	
	
		
			
			Initial git repository build. I'm not bothering with the full history, even though we have it. We can create a separate "historical" git archive of that later if we want to, and in the meantime it's about 3.2GB when imported into git - space that would just make the early git days unnecessarily complicated, when we don't have a lot of good infrastructure for it. Let it rip!
		
			
				
	
	
		
			263 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			263 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|     i2c-sensor.h - Part of the i2c package
 | |
|     was originally sensors.h - Part of lm_sensors, Linux kernel modules
 | |
|                                for hardware monitoring
 | |
|     Copyright (c) 1998, 1999  Frodo Looijaard <frodol@dds.nl>
 | |
| 
 | |
|     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.
 | |
| */
 | |
| 
 | |
| #ifndef _LINUX_I2C_SENSOR_H
 | |
| #define _LINUX_I2C_SENSOR_H
 | |
| 
 | |
| /* A structure containing detect information.
 | |
|    Force variables overrule all other variables; they force a detection on
 | |
|    that place. If a specific chip is given, the module blindly assumes this
 | |
|    chip type is present; if a general force (kind == 0) is given, the module
 | |
|    will still try to figure out what type of chip is present. This is useful
 | |
|    if for some reasons the detect for SMBus or ISA address space filled
 | |
|    fails.
 | |
|    probe: insmod parameter. Initialize this list with I2C_CLIENT_ISA_END values.
 | |
|      A list of pairs. The first value is a bus number (ANY_I2C_ISA_BUS for
 | |
|      the ISA bus, -1 for any I2C bus), the second is the address. 
 | |
|    kind: The kind of chip. 0 equals any chip.
 | |
| */
 | |
| struct i2c_force_data {
 | |
| 	unsigned short *force;
 | |
| 	unsigned short kind;
 | |
| };
 | |
| 
 | |
| /* A structure containing the detect information.
 | |
|    normal_i2c: filled in by the module writer. Terminated by I2C_CLIENT_ISA_END.
 | |
|      A list of I2C addresses which should normally be examined.
 | |
|    normal_isa: filled in by the module writer. Terminated by SENSORS_ISA_END.
 | |
|      A list of ISA addresses which should normally be examined.
 | |
|    probe: insmod parameter. Initialize this list with I2C_CLIENT_ISA_END values.
 | |
|      A list of pairs. The first value is a bus number (ANY_I2C_ISA_BUS for
 | |
|      the ISA bus, -1 for any I2C bus), the second is the address. These
 | |
|      addresses are also probed, as if they were in the 'normal' list.
 | |
|    ignore: insmod parameter. Initialize this list with I2C_CLIENT_ISA_END values.
 | |
|      A list of pairs. The first value is a bus number (ANY_I2C_ISA_BUS for
 | |
|      the ISA bus, -1 for any I2C bus), the second is the I2C address. These
 | |
|      addresses are never probed. This parameter overrules 'normal' and 
 | |
|      'probe', but not the 'force' lists.
 | |
|    force_data: insmod parameters. A list, ending with an element of which
 | |
|      the force field is NULL.
 | |
| */
 | |
| struct i2c_address_data {
 | |
| 	unsigned short *normal_i2c;
 | |
| 	unsigned int *normal_isa;
 | |
| 	unsigned short *probe;
 | |
| 	unsigned short *ignore;
 | |
| 	struct i2c_force_data *forces;
 | |
| };
 | |
| 
 | |
| #define SENSORS_MODULE_PARM_FORCE(name) \
 | |
|   I2C_CLIENT_MODULE_PARM(force_ ## name, \
 | |
|                       "List of adapter,address pairs which are unquestionably" \
 | |
|                       " assumed to contain a `" # name "' chip")
 | |
| 
 | |
| 
 | |
| /* This defines several insmod variables, and the addr_data structure */
 | |
| #define SENSORS_INSMOD \
 | |
|   I2C_CLIENT_MODULE_PARM(probe, \
 | |
|                       "List of adapter,address pairs to scan additionally"); \
 | |
|   I2C_CLIENT_MODULE_PARM(ignore, \
 | |
|                       "List of adapter,address pairs not to scan"); \
 | |
| 	static struct i2c_address_data addr_data = {			\
 | |
| 			.normal_i2c =		normal_i2c,		\
 | |
| 			.normal_isa =		normal_isa,		\
 | |
| 			.probe =		probe,			\
 | |
| 			.ignore =		ignore,			\
 | |
| 			.forces =		forces,			\
 | |
| 		}
 | |
| 
 | |
| /* The following functions create an enum with the chip names as elements. 
 | |
|    The first element of the enum is any_chip. These are the only macros
 | |
|    a module will want to use. */
 | |
| 
 | |
| #define SENSORS_INSMOD_0 \
 | |
|   enum chips { any_chip }; \
 | |
|   I2C_CLIENT_MODULE_PARM(force, \
 | |
|                       "List of adapter,address pairs to boldly assume " \
 | |
|                       "to be present"); \
 | |
|   static struct i2c_force_data forces[] = {{force,any_chip},{NULL}}; \
 | |
|   SENSORS_INSMOD
 | |
| 
 | |
| #define SENSORS_INSMOD_1(chip1) \
 | |
|   enum chips { any_chip, chip1 }; \
 | |
|   I2C_CLIENT_MODULE_PARM(force, \
 | |
|                       "List of adapter,address pairs to boldly assume " \
 | |
|                       "to be present"); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip1); \
 | |
|   static struct i2c_force_data forces[] = {{force,any_chip},\
 | |
|                                                  {force_ ## chip1,chip1}, \
 | |
|                                                  {NULL}}; \
 | |
|   SENSORS_INSMOD
 | |
| 
 | |
| #define SENSORS_INSMOD_2(chip1,chip2) \
 | |
|   enum chips { any_chip, chip1, chip2 }; \
 | |
|   I2C_CLIENT_MODULE_PARM(force, \
 | |
|                       "List of adapter,address pairs to boldly assume " \
 | |
|                       "to be present"); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip1); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip2); \
 | |
|   static struct i2c_force_data forces[] = {{force,any_chip}, \
 | |
|                                                  {force_ ## chip1,chip1}, \
 | |
|                                                  {force_ ## chip2,chip2}, \
 | |
|                                                  {NULL}}; \
 | |
|   SENSORS_INSMOD
 | |
| 
 | |
| #define SENSORS_INSMOD_3(chip1,chip2,chip3) \
 | |
|   enum chips { any_chip, chip1, chip2, chip3 }; \
 | |
|   I2C_CLIENT_MODULE_PARM(force, \
 | |
|                       "List of adapter,address pairs to boldly assume " \
 | |
|                       "to be present"); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip1); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip2); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip3); \
 | |
|   static struct i2c_force_data forces[] = {{force,any_chip}, \
 | |
|                                                  {force_ ## chip1,chip1}, \
 | |
|                                                  {force_ ## chip2,chip2}, \
 | |
|                                                  {force_ ## chip3,chip3}, \
 | |
|                                                  {NULL}}; \
 | |
|   SENSORS_INSMOD
 | |
| 
 | |
| #define SENSORS_INSMOD_4(chip1,chip2,chip3,chip4) \
 | |
|   enum chips { any_chip, chip1, chip2, chip3, chip4 }; \
 | |
|   I2C_CLIENT_MODULE_PARM(force, \
 | |
|                       "List of adapter,address pairs to boldly assume " \
 | |
|                       "to be present"); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip1); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip2); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip3); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip4); \
 | |
|   static struct i2c_force_data forces[] = {{force,any_chip}, \
 | |
|                                                  {force_ ## chip1,chip1}, \
 | |
|                                                  {force_ ## chip2,chip2}, \
 | |
|                                                  {force_ ## chip3,chip3}, \
 | |
|                                                  {force_ ## chip4,chip4}, \
 | |
|                                                  {NULL}}; \
 | |
|   SENSORS_INSMOD
 | |
| 
 | |
| #define SENSORS_INSMOD_5(chip1,chip2,chip3,chip4,chip5) \
 | |
|   enum chips { any_chip, chip1, chip2, chip3, chip4, chip5 }; \
 | |
|   I2C_CLIENT_MODULE_PARM(force, \
 | |
|                       "List of adapter,address pairs to boldly assume " \
 | |
|                       "to be present"); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip1); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip2); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip3); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip4); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip5); \
 | |
|   static struct i2c_force_data forces[] = {{force,any_chip}, \
 | |
|                                                  {force_ ## chip1,chip1}, \
 | |
|                                                  {force_ ## chip2,chip2}, \
 | |
|                                                  {force_ ## chip3,chip3}, \
 | |
|                                                  {force_ ## chip4,chip4}, \
 | |
|                                                  {force_ ## chip5,chip5}, \
 | |
|                                                  {NULL}}; \
 | |
|   SENSORS_INSMOD
 | |
| 
 | |
| #define SENSORS_INSMOD_6(chip1,chip2,chip3,chip4,chip5,chip6) \
 | |
|   enum chips { any_chip, chip1, chip2, chip3, chip4, chip5, chip6 }; \
 | |
|   I2C_CLIENT_MODULE_PARM(force, \
 | |
|                       "List of adapter,address pairs to boldly assume " \
 | |
|                       "to be present"); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip1); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip2); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip3); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip4); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip5); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip6); \
 | |
|   static struct i2c_force_data forces[] = {{force,any_chip}, \
 | |
|                                                  {force_ ## chip1,chip1}, \
 | |
|                                                  {force_ ## chip2,chip2}, \
 | |
|                                                  {force_ ## chip3,chip3}, \
 | |
|                                                  {force_ ## chip4,chip4}, \
 | |
|                                                  {force_ ## chip5,chip5}, \
 | |
|                                                  {force_ ## chip6,chip6}, \
 | |
|                                                  {NULL}}; \
 | |
|   SENSORS_INSMOD
 | |
| 
 | |
| #define SENSORS_INSMOD_7(chip1,chip2,chip3,chip4,chip5,chip6,chip7) \
 | |
|   enum chips { any_chip, chip1, chip2, chip3, chip4, chip5, chip6, chip7 }; \
 | |
|   I2C_CLIENT_MODULE_PARM(force, \
 | |
|                       "List of adapter,address pairs to boldly assume " \
 | |
|                       "to be present"); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip1); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip2); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip3); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip4); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip5); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip6); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip7); \
 | |
|   static struct i2c_force_data forces[] = {{force,any_chip}, \
 | |
|                                                  {force_ ## chip1,chip1}, \
 | |
|                                                  {force_ ## chip2,chip2}, \
 | |
|                                                  {force_ ## chip3,chip3}, \
 | |
|                                                  {force_ ## chip4,chip4}, \
 | |
|                                                  {force_ ## chip5,chip5}, \
 | |
|                                                  {force_ ## chip6,chip6}, \
 | |
|                                                  {force_ ## chip7,chip7}, \
 | |
|                                                  {NULL}}; \
 | |
|   SENSORS_INSMOD
 | |
| 
 | |
| #define SENSORS_INSMOD_8(chip1,chip2,chip3,chip4,chip5,chip6,chip7,chip8) \
 | |
|   enum chips { any_chip, chip1, chip2, chip3, chip4, chip5, chip6, chip7, chip8 }; \
 | |
|   I2C_CLIENT_MODULE_PARM(force, \
 | |
|                       "List of adapter,address pairs to boldly assume " \
 | |
|                       "to be present"); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip1); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip2); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip3); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip4); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip5); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip6); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip7); \
 | |
|   SENSORS_MODULE_PARM_FORCE(chip8); \
 | |
|   static struct i2c_force_data forces[] = {{force,any_chip}, \
 | |
|                                                  {force_ ## chip1,chip1}, \
 | |
|                                                  {force_ ## chip2,chip2}, \
 | |
|                                                  {force_ ## chip3,chip3}, \
 | |
|                                                  {force_ ## chip4,chip4}, \
 | |
|                                                  {force_ ## chip5,chip5}, \
 | |
|                                                  {force_ ## chip6,chip6}, \
 | |
|                                                  {force_ ## chip7,chip7}, \
 | |
|                                                  {force_ ## chip8,chip8}, \
 | |
|                                                  {NULL}}; \
 | |
|   SENSORS_INSMOD
 | |
| 
 | |
| /* Detect function. It iterates over all possible addresses itself. For
 | |
|    SMBus addresses, it will only call found_proc if some client is connected
 | |
|    to the SMBus (unless a 'force' matched); for ISA detections, this is not
 | |
|    done. */
 | |
| extern int i2c_detect(struct i2c_adapter *adapter,
 | |
| 		      struct i2c_address_data *address_data,
 | |
| 		      int (*found_proc) (struct i2c_adapter *, int, int));
 | |
| 
 | |
| 
 | |
| /* This macro is used to scale user-input to sensible values in almost all
 | |
|    chip drivers. */
 | |
| static inline int SENSORS_LIMIT(long value, long low, long high)
 | |
| {
 | |
| 	if (value < low)
 | |
| 		return low;
 | |
| 	else if (value > high)
 | |
| 		return high;
 | |
| 	else
 | |
| 		return value;
 | |
| }
 | |
| #endif				/* def _LINUX_I2C_SENSOR_H */
 |