i2c-proc.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:18k
- /*
- 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 SENSORS_SENSORS_H
- #define SENSORS_SENSORS_H
- #ifdef __KERNEL__
- /* Next two must be included before sysctl.h can be included, in 2.0 kernels */
- #include <linux/types.h>
- #include <linux/fs.h>
- #include <linux/sysctl.h>
- /* The type of callback functions used in sensors_{proc,sysctl}_real */
- typedef void (*i2c_real_callback) (struct i2c_client * client,
- int operation, int ctl_name,
- int *nrels_mag, long *results);
- /* Values for the operation field in the above function type */
- #define SENSORS_PROC_REAL_INFO 1
- #define SENSORS_PROC_REAL_READ 2
- #define SENSORS_PROC_REAL_WRITE 3
- /* These funcion reads or writes a 'real' value (encoded by the combination
- of an integer and a magnitude, the last is the power of ten the value
- should be divided with) to a /proc/sys directory. To use these functions,
- you must (before registering the ctl_table) set the extra2 field to the
- client, and the extra1 field to a function of the form:
- void func(struct i2c_client *client, int operation, int ctl_name,
- int *nrels_mag, long *results)
- This last function can be called for three values of operation. If
- operation equals SENSORS_PROC_REAL_INFO, the magnitude should be returned
- in nrels_mag. If operation equals SENSORS_PROC_REAL_READ, values should
- be read into results. nrels_mag should return the number of elements
- read; the maximum number is put in it on entry. Finally, if operation
- equals SENSORS_PROC_REAL_WRITE, the values in results should be
- written to the chip. nrels_mag contains on entry the number of elements
- found.
- In all cases, client points to the client we wish to interact with,
- and ctl_name is the SYSCTL id of the file we are accessing. */
- extern int i2c_sysctl_real(ctl_table * table, int *name, int nlen,
- void *oldval, size_t * oldlenp,
- void *newval, size_t newlen,
- void **context);
- extern int i2c_proc_real(ctl_table * ctl, int write, struct file *filp,
- void *buffer, size_t * lenp);
- /* These rather complex functions must be called when you want to add or
- delete an entry in /proc/sys/dev/sensors/chips (not yet implemented). It
- also creates a new directory within /proc/sys/dev/sensors/.
- ctl_template should be a template of the newly created directory. It is
- copied in memory. The extra2 field of each file is set to point to client.
- If any driver wants subdirectories within the newly created directory,
- these functions must be updated! */
- extern int i2c_register_entry(struct i2c_client *client,
- const char *prefix,
- ctl_table * ctl_template,
- struct module *controlling_mod);
- extern void i2c_deregister_entry(int id);
- /* 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 SENSORS_I2C_END values.
- A list of pairs. The first value is a bus number (SENSORS_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 SENSORS_I2C_END.
- A list of I2C addresses which should normally be examined.
- normal_i2c_range: filled in by the module writer. Terminated by
- SENSORS_I2C_END
- A list of pairs of I2C addresses, each pair being an inclusive range of
- 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.
- normal_isa_range: filled in by the module writer. Terminated by
- SENSORS_ISA_END
- A list of triples. The first two elements are ISA addresses, being an
- range of addresses which should normally be examined. The third is the
- modulo parameter: only addresses which are 0 module this value relative
- to the first address of the range are actually considered.
- probe: insmod parameter. Initialize this list with SENSORS_I2C_END values.
- A list of pairs. The first value is a bus number (SENSORS_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.
- probe_range: insmod parameter. Initialize this list with SENSORS_I2C_END
- values.
- A list of triples. The first value is a bus number (SENSORS_ISA_BUS for
- the ISA bus, -1 for any I2C bus), the second and third are addresses.
- These form an inclusive range of addresses that are also probed, as
- if they were in the 'normal' list.
- ignore: insmod parameter. Initialize this list with SENSORS_I2C_END values.
- A list of pairs. The first value is a bus number (SENSORS_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.
- ignore_range: insmod parameter. Initialize this list with SENSORS_I2C_END
- values.
- A list of triples. The first value is a bus number (SENSORS_ISA_BUS for
- the ISA bus, -1 for any I2C bus), the second and third are addresses.
- These form an inclusive range of I2C addresses that 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 *normal_i2c_range;
- unsigned int *normal_isa;
- unsigned int *normal_isa_range;
- unsigned short *probe;
- unsigned short *probe_range;
- unsigned short *ignore;
- unsigned short *ignore_range;
- struct i2c_force_data *forces;
- };
- /* Internal numbers to terminate lists */
- #define SENSORS_I2C_END 0xfffe
- #define SENSORS_ISA_END 0xfffefffe
- /* The numbers to use to set an ISA or I2C bus address */
- #define SENSORS_ISA_BUS 9191
- #define SENSORS_ANY_I2C_BUS 0xffff
- /* The length of the option lists */
- #define SENSORS_MAX_OPTS 48
- /* Default fill of many variables */
- #define SENSORS_DEFAULTS {SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END,
- SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END,
- SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END,
- SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END,
- SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END,
- SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END,
- SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END,
- SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END,
- SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END,
- SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END,
- SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END,
- SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END,
- SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END,
- SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END,
- SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END,
- SENSORS_I2C_END, SENSORS_I2C_END, SENSORS_I2C_END}
- /* This is ugly. We need to evaluate SENSORS_MAX_OPTS before it is
- stringified */
- #define SENSORS_MODPARM_AUX1(x) "1-" #x "h"
- #define SENSORS_MODPARM_AUX(x) SENSORS_MODPARM_AUX1(x)
- #define SENSORS_MODPARM SENSORS_MODPARM_AUX(SENSORS_MAX_OPTS)
- /* SENSORS_MODULE_PARM creates a module parameter, and puts it in the
- module header */
- #define SENSORS_MODULE_PARM(var,desc)
- static unsigned short var[SENSORS_MAX_OPTS] = SENSORS_DEFAULTS;
- MODULE_PARM(var,SENSORS_MODPARM);
- MODULE_PARM_DESC(var,desc)
- /* SENSORS_MODULE_PARM creates a 'force_*' module parameter, and puts it in
- the module header */
- #define SENSORS_MODULE_PARM_FORCE(name)
- SENSORS_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
- SENSORS_MODULE_PARM(probe,
- "List of adapter,address pairs to scan additionally");
- SENSORS_MODULE_PARM(probe_range,
- "List of adapter,start-addr,end-addr triples to scan "
- "additionally");
- SENSORS_MODULE_PARM(ignore,
- "List of adapter,address pairs not to scan");
- SENSORS_MODULE_PARM(ignore_range,
- "List of adapter,start-addr,end-addr triples not to "
- "scan");
- static struct i2c_address_data addr_data =
- {normal_i2c, normal_i2c_range,
- normal_isa, normal_isa_range,
- probe, probe_range,
- ignore, ignore_range,
- 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 };
- SENSORS_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 };
- SENSORS_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 };
- SENSORS_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 };
- SENSORS_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 };
- SENSORS_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 };
- SENSORS_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 };
- SENSORS_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 };
- SENSORS_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
- typedef int i2c_found_addr_proc(struct i2c_adapter *adapter,
- int addr, unsigned short flags,
- int kind);
- /* 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,
- i2c_found_addr_proc * found_proc);
- /* This macro is used to scale user-input to sensible values in almost all
- chip drivers. */
- extern 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 __KERNEL__ */
- /* The maximum length of the prefix */
- #define SENSORS_PREFIX_MAX 20
- /* Sysctl IDs */
- #ifdef DEV_HWMON
- #define DEV_SENSORS DEV_HWMON
- #else /* ndef DEV_HWMOM */
- #define DEV_SENSORS 2 /* The id of the lm_sensors directory within the
- dev table */
- #endif /* def DEV_HWMON */
- #define SENSORS_CHIPS 1
- struct i2c_chips_data {
- int sysctl_id;
- char name[SENSORS_PREFIX_MAX + 13];
- };
- #endif /* def SENSORS_SENSORS_H */