/* 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 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 address space filled fails. probe: insmod parameter. Initialize this list with I2C_CLIENT_END values. A list of pairs. The first value is a bus number (ANY_I2C_BUS 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_END. A list of I2C addresses which should normally be examined. probe: insmod parameter. Initialize this list with I2C_CLIENT_END values. A list of pairs. The first value is a bus number (ANY_I2C_BUS 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_END values. A list of pairs. The first value is a bus number (ANY_I2C_BUS 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 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, \ .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). */ 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 */