1/* 2 sensors.h - Part of lm_sensors, Linux kernel modules for hardware 3 monitoring 4 Copyright (c) 1998, 1999 Frodo Looijaard <frodol@dds.nl> 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software 18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19*/ 20 21#ifndef SENSORS_SENSORS_H 22#define SENSORS_SENSORS_H 23 24#ifdef __KERNEL__ 25 26/* Next two must be included before sysctl.h can be included, in 2.0 kernels */ 27#include <linux/types.h> 28#include <linux/fs.h> 29#include <linux/sysctl.h> 30 31/* The type of callback functions used in sensors_{proc,sysctl}_real */ 32typedef void (*i2c_real_callback) (struct i2c_client * client, 33 int operation, int ctl_name, 34 int *nrels_mag, long *results); 35 36/* Values for the operation field in the above function type */ 37#define SENSORS_PROC_REAL_INFO 1 38#define SENSORS_PROC_REAL_READ 2 39#define SENSORS_PROC_REAL_WRITE 3 40 41/* These funcion reads or writes a 'real' value (encoded by the combination 42 of an integer and a magnitude, the last is the power of ten the value 43 should be divided with) to a /proc/sys directory. To use these functions, 44 you must (before registering the ctl_table) set the extra2 field to the 45 client, and the extra1 field to a function of the form: 46 void func(struct i2c_client *client, int operation, int ctl_name, 47 int *nrels_mag, long *results) 48 This last function can be called for three values of operation. If 49 operation equals SENSORS_PROC_REAL_INFO, the magnitude should be returned 50 in nrels_mag. If operation equals SENSORS_PROC_REAL_READ, values should 51 be read into results. nrels_mag should return the number of elements 52 read; the maximum number is put in it on entry. Finally, if operation 53 equals SENSORS_PROC_REAL_WRITE, the values in results should be 54 written to the chip. nrels_mag contains on entry the number of elements 55 found. 56 In all cases, client points to the client we wish to interact with, 57 and ctl_name is the SYSCTL id of the file we are accessing. */ 58extern int i2c_sysctl_real(ctl_table * table, int *name, int nlen, 59 void *oldval, size_t * oldlenp, 60 void *newval, size_t newlen, 61 void **context); 62extern int i2c_proc_real(ctl_table * ctl, int write, struct file *filp, 63 void *buffer, size_t * lenp); 64 65 66 67/* These rather complex functions must be called when you want to add or 68 delete an entry in /proc/sys/dev/sensors/chips (not yet implemented). It 69 also creates a new directory within /proc/sys/dev/sensors/. 70 ctl_template should be a template of the newly created directory. It is 71 copied in memory. The extra2 field of each file is set to point to client. 72 If any driver wants subdirectories within the newly created directory, 73 these functions must be updated! */ 74extern int i2c_register_entry(struct i2c_client *client, 75 const char *prefix, 76 ctl_table * ctl_template, 77 struct module *controlling_mod); 78 79extern void i2c_deregister_entry(int id); 80 81 82/* A structure containing detect information. 83 Force variables overrule all other variables; they force a detection on 84 that place. If a specific chip is given, the module blindly assumes this 85 chip type is present; if a general force (kind == 0) is given, the module 86 will still try to figure out what type of chip is present. This is useful 87 if for some reasons the detect for SMBus or ISA address space filled 88 fails. 89 probe: insmod parameter. Initialize this list with SENSORS_I2C_END values. 90 A list of pairs. The first value is a bus number (SENSORS_ISA_BUS for 91 the ISA bus, -1 for any I2C bus), the second is the address. 92 kind: The kind of chip. 0 equals any chip. 93*/ 94struct i2c_force_data { 95 unsigned short *force; 96 unsigned short kind; 97}; 98 99/* A structure containing the detect information. 100 normal_i2c: filled in by the module writer. Terminated by SENSORS_I2C_END. 101 A list of I2C addresses which should normally be examined. 102 normal_i2c_range: filled in by the module writer. Terminated by 103 SENSORS_I2C_END 104 A list of pairs of I2C addresses, each pair being an inclusive range of 105 addresses which should normally be examined. 106 normal_isa: filled in by the module writer. Terminated by SENSORS_ISA_END. 107 A list of ISA addresses which should normally be examined. 108 normal_isa_range: filled in by the module writer. Terminated by 109 SENSORS_ISA_END 110 A list of triples. The first two elements are ISA addresses, being an 111 range of addresses which should normally be examined. The third is the 112 modulo parameter: only addresses which are 0 module this value relative 113 to the first address of the range are actually considered. 114 probe: insmod parameter. Initialize this list with SENSORS_I2C_END values. 115 A list of pairs. The first value is a bus number (SENSORS_ISA_BUS for 116 the ISA bus, -1 for any I2C bus), the second is the address. These 117 addresses are also probed, as if they were in the 'normal' list. 118 probe_range: insmod parameter. Initialize this list with SENSORS_I2C_END 119 values. 120 A list of triples. The first value is a bus number (SENSORS_ISA_BUS for 121 the ISA bus, -1 for any I2C bus), the second and third are addresses. 122 These form an inclusive range of addresses that are also probed, as 123 if they were in the 'normal' list. 124 ignore: insmod parameter. Initialize this list with SENSORS_I2C_END values. 125 A list of pairs. The first value is a bus number (SENSORS_ISA_BUS for 126 the ISA bus, -1 for any I2C bus), the second is the I2C address. These 127 addresses are never probed. This parameter overrules 'normal' and 128 'probe', but not the 'force' lists. 129 ignore_range: insmod parameter. Initialize this list with SENSORS_I2C_END 130 values. 131 A list of triples. The first value is a bus number (SENSORS_ISA_BUS for 132 the ISA bus, -1 for any I2C bus), the second and third are addresses. 133 These form an inclusive range of I2C addresses that are never probed. 134 This parameter overrules 'normal' and 'probe', but not the 'force' lists. 135 force_data: insmod parameters. A list, ending with an element of which 136 the force field is NULL. 137*/ 138struct i2c_address_data { 139 unsigned short *normal_i2c; 140 unsigned short *normal_i2c_range; 141 unsigned int *normal_isa; 142 unsigned int *normal_isa_range; 143 unsigned short *probe; 144 unsigned short *probe_range; 145 unsigned short *ignore; 146 unsigned short *ignore_range; 147 struct i2c_force_data *forces; 148}; 149 150/* Internal numbers to terminate lists */ 151#define SENSORS_I2C_END 0xfffe 152#define SENSORS_ISA_END 0xfffefffe 153 154/* The numbers to use to set an ISA or I2C bus address */ 155#define SENSORS_ISA_BUS 9191 156#define SENSORS_ANY_I2C_BUS 0xffff 157 158/* The length of the option lists */ 159#define SENSORS_MAX_OPTS 48 160 161/* Default fill of many variables */ 162#define SENSORS_DEFAULTS {SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END, \ 163 SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END, \ 164 SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END, \ 165 SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END, \ 166 SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END, \ 167 SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END, \ 168 SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END, \ 169 SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END, \ 170 SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END, \ 171 SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END, \ 172 SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END, \ 173 SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END, \ 174 SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END, \ 175 SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END, \ 176 SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END, \ 177 SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END} 178 179/* This is ugly. We need to evaluate SENSORS_MAX_OPTS before it is 180 stringified */ 181#define SENSORS_MODPARM_AUX1(x) "1-" #x "h" 182#define SENSORS_MODPARM_AUX(x) SENSORS_MODPARM_AUX1(x) 183#define SENSORS_MODPARM SENSORS_MODPARM_AUX(SENSORS_MAX_OPTS) 184 185/* SENSORS_MODULE_PARM creates a module parameter, and puts it in the 186 module header */ 187#define SENSORS_MODULE_PARM(var,desc) \ 188 static unsigned short var[SENSORS_MAX_OPTS] = SENSORS_DEFAULTS; \ 189 MODULE_PARM(var,SENSORS_MODPARM); \ 190 MODULE_PARM_DESC(var,desc) 191 192/* SENSORS_MODULE_PARM creates a 'force_*' module parameter, and puts it in 193 the module header */ 194#define SENSORS_MODULE_PARM_FORCE(name) \ 195 SENSORS_MODULE_PARM(force_ ## name, \ 196 "List of adapter,address pairs which are unquestionably" \ 197 " assumed to contain a `" # name "' chip") 198 199 200/* This defines several insmod variables, and the addr_data structure */ 201#define SENSORS_INSMOD \ 202 SENSORS_MODULE_PARM(probe, \ 203 "List of adapter,address pairs to scan additionally"); \ 204 SENSORS_MODULE_PARM(probe_range, \ 205 "List of adapter,start-addr,end-addr triples to scan " \ 206 "additionally"); \ 207 SENSORS_MODULE_PARM(ignore, \ 208 "List of adapter,address pairs not to scan"); \ 209 SENSORS_MODULE_PARM(ignore_range, \ 210 "List of adapter,start-addr,end-addr triples not to " \ 211 "scan"); \ 212 static struct i2c_address_data addr_data = \ 213 {normal_i2c, normal_i2c_range, \ 214 normal_isa, normal_isa_range, \ 215 probe, probe_range, \ 216 ignore, ignore_range, \ 217 forces} 218 219/* The following functions create an enum with the chip names as elements. 220 The first element of the enum is any_chip. These are the only macros 221 a module will want to use. */ 222 223#define SENSORS_INSMOD_0 \ 224 enum chips { any_chip }; \ 225 SENSORS_MODULE_PARM(force, \ 226 "List of adapter,address pairs to boldly assume " \ 227 "to be present"); \ 228 static struct i2c_force_data forces[] = {{force,any_chip},{NULL}}; \ 229 SENSORS_INSMOD 230 231#define SENSORS_INSMOD_1(chip1) \ 232 enum chips { any_chip, chip1 }; \ 233 SENSORS_MODULE_PARM(force, \ 234 "List of adapter,address pairs to boldly assume " \ 235 "to be present"); \ 236 SENSORS_MODULE_PARM_FORCE(chip1); \ 237 static struct i2c_force_data forces[] = {{force,any_chip},\ 238 {force_ ## chip1,chip1}, \ 239 {NULL}}; \ 240 SENSORS_INSMOD 241 242#define SENSORS_INSMOD_2(chip1,chip2) \ 243 enum chips { any_chip, chip1, chip2 }; \ 244 SENSORS_MODULE_PARM(force, \ 245 "List of adapter,address pairs to boldly assume " \ 246 "to be present"); \ 247 SENSORS_MODULE_PARM_FORCE(chip1); \ 248 SENSORS_MODULE_PARM_FORCE(chip2); \ 249 static struct i2c_force_data forces[] = {{force,any_chip}, \ 250 {force_ ## chip1,chip1}, \ 251 {force_ ## chip2,chip2}, \ 252 {NULL}}; \ 253 SENSORS_INSMOD 254 255#define SENSORS_INSMOD_3(chip1,chip2,chip3) \ 256 enum chips { any_chip, chip1, chip2, chip3 }; \ 257 SENSORS_MODULE_PARM(force, \ 258 "List of adapter,address pairs to boldly assume " \ 259 "to be present"); \ 260 SENSORS_MODULE_PARM_FORCE(chip1); \ 261 SENSORS_MODULE_PARM_FORCE(chip2); \ 262 SENSORS_MODULE_PARM_FORCE(chip3); \ 263 static struct i2c_force_data forces[] = {{force,any_chip}, \ 264 {force_ ## chip1,chip1}, \ 265 {force_ ## chip2,chip2}, \ 266 {force_ ## chip3,chip3}, \ 267 {NULL}}; \ 268 SENSORS_INSMOD 269 270#define SENSORS_INSMOD_4(chip1,chip2,chip3,chip4) \ 271 enum chips { any_chip, chip1, chip2, chip3, chip4 }; \ 272 SENSORS_MODULE_PARM(force, \ 273 "List of adapter,address pairs to boldly assume " \ 274 "to be present"); \ 275 SENSORS_MODULE_PARM_FORCE(chip1); \ 276 SENSORS_MODULE_PARM_FORCE(chip2); \ 277 SENSORS_MODULE_PARM_FORCE(chip3); \ 278 SENSORS_MODULE_PARM_FORCE(chip4); \ 279 static struct i2c_force_data forces[] = {{force,any_chip}, \ 280 {force_ ## chip1,chip1}, \ 281 {force_ ## chip2,chip2}, \ 282 {force_ ## chip3,chip3}, \ 283 {force_ ## chip4,chip4}, \ 284 {NULL}}; \ 285 SENSORS_INSMOD 286 287#define SENSORS_INSMOD_5(chip1,chip2,chip3,chip4,chip5) \ 288 enum chips { any_chip, chip1, chip2, chip3, chip4, chip5 }; \ 289 SENSORS_MODULE_PARM(force, \ 290 "List of adapter,address pairs to boldly assume " \ 291 "to be present"); \ 292 SENSORS_MODULE_PARM_FORCE(chip1); \ 293 SENSORS_MODULE_PARM_FORCE(chip2); \ 294 SENSORS_MODULE_PARM_FORCE(chip3); \ 295 SENSORS_MODULE_PARM_FORCE(chip4); \ 296 SENSORS_MODULE_PARM_FORCE(chip5); \ 297 static struct i2c_force_data forces[] = {{force,any_chip}, \ 298 {force_ ## chip1,chip1}, \ 299 {force_ ## chip2,chip2}, \ 300 {force_ ## chip3,chip3}, \ 301 {force_ ## chip4,chip4}, \ 302 {force_ ## chip5,chip5}, \ 303 {NULL}}; \ 304 SENSORS_INSMOD 305 306#define SENSORS_INSMOD_6(chip1,chip2,chip3,chip4,chip5,chip6) \ 307 enum chips { any_chip, chip1, chip2, chip3, chip4, chip5, chip6 }; \ 308 SENSORS_MODULE_PARM(force, \ 309 "List of adapter,address pairs to boldly assume " \ 310 "to be present"); \ 311 SENSORS_MODULE_PARM_FORCE(chip1); \ 312 SENSORS_MODULE_PARM_FORCE(chip2); \ 313 SENSORS_MODULE_PARM_FORCE(chip3); \ 314 SENSORS_MODULE_PARM_FORCE(chip4); \ 315 SENSORS_MODULE_PARM_FORCE(chip5); \ 316 SENSORS_MODULE_PARM_FORCE(chip6); \ 317 static struct i2c_force_data forces[] = {{force,any_chip}, \ 318 {force_ ## chip1,chip1}, \ 319 {force_ ## chip2,chip2}, \ 320 {force_ ## chip3,chip3}, \ 321 {force_ ## chip4,chip4}, \ 322 {force_ ## chip5,chip5}, \ 323 {force_ ## chip6,chip6}, \ 324 {NULL}}; \ 325 SENSORS_INSMOD 326 327#define SENSORS_INSMOD_7(chip1,chip2,chip3,chip4,chip5,chip6,chip7) \ 328 enum chips { any_chip, chip1, chip2, chip3, chip4, chip5, chip6, chip7 }; \ 329 SENSORS_MODULE_PARM(force, \ 330 "List of adapter,address pairs to boldly assume " \ 331 "to be present"); \ 332 SENSORS_MODULE_PARM_FORCE(chip1); \ 333 SENSORS_MODULE_PARM_FORCE(chip2); \ 334 SENSORS_MODULE_PARM_FORCE(chip3); \ 335 SENSORS_MODULE_PARM_FORCE(chip4); \ 336 SENSORS_MODULE_PARM_FORCE(chip5); \ 337 SENSORS_MODULE_PARM_FORCE(chip6); \ 338 SENSORS_MODULE_PARM_FORCE(chip7); \ 339 static struct i2c_force_data forces[] = {{force,any_chip}, \ 340 {force_ ## chip1,chip1}, \ 341 {force_ ## chip2,chip2}, \ 342 {force_ ## chip3,chip3}, \ 343 {force_ ## chip4,chip4}, \ 344 {force_ ## chip5,chip5}, \ 345 {force_ ## chip6,chip6}, \ 346 {force_ ## chip7,chip7}, \ 347 {NULL}}; \ 348 SENSORS_INSMOD 349 350typedef int i2c_found_addr_proc(struct i2c_adapter *adapter, 351 int addr, unsigned short flags, 352 int kind); 353 354/* Detect function. It iterates over all possible addresses itself. For 355 SMBus addresses, it will only call found_proc if some client is connected 356 to the SMBus (unless a 'force' matched); for ISA detections, this is not 357 done. */ 358extern int i2c_detect(struct i2c_adapter *adapter, 359 struct i2c_address_data *address_data, 360 i2c_found_addr_proc * found_proc); 361 362 363/* This macro is used to scale user-input to sensible values in almost all 364 chip drivers. */ 365extern inline int SENSORS_LIMIT(long value, long low, long high) 366{ 367 if (value < low) 368 return low; 369 else if (value > high) 370 return high; 371 else 372 return value; 373} 374 375#endif /* def __KERNEL__ */ 376 377 378/* The maximum length of the prefix */ 379#define SENSORS_PREFIX_MAX 20 380 381/* Sysctl IDs */ 382#ifdef DEV_HWMON 383#define DEV_SENSORS DEV_HWMON 384#else /* ndef DEV_HWMOM */ 385#define DEV_SENSORS 2 /* The id of the lm_sensors directory within the 386 dev table */ 387#endif /* def DEV_HWMON */ 388 389#define SENSORS_CHIPS 1 390struct i2c_chips_data { 391 int sysctl_id; 392 char name[SENSORS_PREFIX_MAX + 13]; 393}; 394 395#endif /* def SENSORS_SENSORS_H */ 396 397