xref: /onnv-gate/usr/src/uts/sun4u/montecarlo/sys/pcf8591_nct.h (revision 1708:ea74d8598a3a)
1*1708Sstevel /*
2*1708Sstevel  * CDDL HEADER START
3*1708Sstevel  *
4*1708Sstevel  * The contents of this file are subject to the terms of the
5*1708Sstevel  * Common Development and Distribution License, Version 1.0 only
6*1708Sstevel  * (the "License").  You may not use this file except in compliance
7*1708Sstevel  * with the License.
8*1708Sstevel  *
9*1708Sstevel  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*1708Sstevel  * or http://www.opensolaris.org/os/licensing.
11*1708Sstevel  * See the License for the specific language governing permissions
12*1708Sstevel  * and limitations under the License.
13*1708Sstevel  *
14*1708Sstevel  * When distributing Covered Code, include this CDDL HEADER in each
15*1708Sstevel  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*1708Sstevel  * If applicable, add the following below this CDDL HEADER, with the
17*1708Sstevel  * fields enclosed by brackets "[]" replaced with your own identifying
18*1708Sstevel  * information: Portions Copyright [yyyy] [name of copyright owner]
19*1708Sstevel  *
20*1708Sstevel  * CDDL HEADER END
21*1708Sstevel  */
22*1708Sstevel /*
23*1708Sstevel  * Copyright (c) 1999-2000 by Sun Microsystems, Inc.
24*1708Sstevel  * All rights reserved.
25*1708Sstevel  */
26*1708Sstevel 
27*1708Sstevel #ifndef	_PCF8591_H
28*1708Sstevel #define	_PCF8591_H
29*1708Sstevel 
30*1708Sstevel #pragma ident	"%Z%%M%	%I%	%E% SMI"
31*1708Sstevel 
32*1708Sstevel #ifdef	__cplusplus
33*1708Sstevel extern "C" {
34*1708Sstevel #endif
35*1708Sstevel 
36*1708Sstevel /*
37*1708Sstevel  * PCF8591 Chip Used for temperature sensors
38*1708Sstevel  *
39*1708Sstevel  * Addressing Register definition.
40*1708Sstevel  * A0-A2 valid range is 0-7
41*1708Sstevel  *
42*1708Sstevel  * ------------------------------------------------
43*1708Sstevel  * | 1 | 0 | 0 | 1 | A2 | A1 | A0 | R/W |
44*1708Sstevel  * ------------------------------------------------
45*1708Sstevel  */
46*1708Sstevel 
47*1708Sstevel #define	PCF8591_MAX_DEVS	0x08
48*1708Sstevel #define	PCF8591_MAX_CHANS	0x04
49*1708Sstevel #define	PCF8591_BUSY		0x01
50*1708Sstevel #define	PCF8591_NAMELEN		12
51*1708Sstevel 
52*1708Sstevel #define	PCF8591_MINOR_TO_DEVINST(x) (((x) & 0x700) >> 8)
53*1708Sstevel #define	PCF8591_MINOR_TO_CHANNEL(x) ((x) & 0x3)
54*1708Sstevel 
55*1708Sstevel #define	PCF8591_CHANNEL_TO_MINOR(x) ((x) & 0x3)
56*1708Sstevel #define	PCF8591_DEVINST_TO_MINOR(x) ((x) << 8)
57*1708Sstevel #define	PCF8591_MINOR_NUM(i, c) (((i) << 8)|((c) & 0x3))
58*1708Sstevel 
59*1708Sstevel #define	PCF8591_NODE_TYPE "ddi_i2c:adc"
60*1708Sstevel 
61*1708Sstevel #define	PCF8591_TRAN_SIZE 1
62*1708Sstevel #define	I2C_PCF8591_NAME "adc-dac"
63*1708Sstevel #define	I2C_KSTAT_CPUTEMP "adc_temp"
64*1708Sstevel #define	I2C_TYPE_PCF8591 0
65*1708Sstevel 
66*1708Sstevel #define	ENVC_NETRACT_CPU_SENSOR 0
67*1708Sstevel 
68*1708Sstevel #define	I2C_DEV0	0x00
69*1708Sstevel #define	I2C_DEV1	0x02
70*1708Sstevel #define	I2C_DEV2	0x04
71*1708Sstevel #define	I2C_DEV3	0x06
72*1708Sstevel #define	I2C_DEV4	0x08
73*1708Sstevel #define	I2C_DEV5	0x0A
74*1708Sstevel #define	I2C_DEV6    0x0C
75*1708Sstevel #define	I2C_DEV7	0x0E
76*1708Sstevel 
77*1708Sstevel #define	MAX_WLEN	64
78*1708Sstevel #define	MAX_RLEN	64
79*1708Sstevel 
80*1708Sstevel #ifndef	I2CDEV_TRAN
81*1708Sstevel #define	I2CDEV_TRAN 1
82*1708Sstevel #endif
83*1708Sstevel #define	I2CDEV_GETTEMP		82
84*1708Sstevel #define	I2CDEV_GETTABLES	256
85*1708Sstevel 
86*1708Sstevel #define	ENVC_IOC_GETTEMP	0x10
87*1708Sstevel /*
88*1708Sstevel  * These are now defined in sys/netract_gen.h
89*1708Sstevel  *
90*1708Sstevel  * #define	ENVC_IOC_GETMODE	0x1C
91*1708Sstevel  * #define	ENVC_IOC_SETMODE	0x1D
92*1708Sstevel  */
93*1708Sstevel 
94*1708Sstevel /*
95*1708Sstevel  * 		CONTROL OF CHIP
96*1708Sstevel  * PCF8591 Temp sensing control register definitions
97*1708Sstevel  *
98*1708Sstevel  * ---------------------------------------------
99*1708Sstevel  * | 0 | AOE | X | X | 0 | AIF | X | X |
100*1708Sstevel  * ---------------------------------------------
101*1708Sstevel  * AOE = Analog out enable.. not used on out implementation
102*1708Sstevel  * 5 & 4 = Analog Input Programming.. see data sheet for bits..
103*1708Sstevel  *
104*1708Sstevel  * AIF = Auto increment flag
105*1708Sstevel  * bits 1 & 0 are for the Channel number.
106*1708Sstevel  */
107*1708Sstevel 
108*1708Sstevel /*
109*1708Sstevel  * We should be able to select the alalog input
110*1708Sstevel  * programming of our choice. By default, the
111*1708Sstevel  * alanog input programming is set to Single
112*1708Sstevel  * ended. The programmer can issue an ioctl to
113*1708Sstevel  * set the input programming mode. We will set
114*1708Sstevel  * the auto increment flag set to off, so the lower
115*1708Sstevel  * nibble in the control byte will be set to the
116*1708Sstevel  * channel number.
117*1708Sstevel  */
118*1708Sstevel 
119*1708Sstevel #define	PCF8591_4SINGLE		0x00	/* 4 single ended inputs */
120*1708Sstevel #define	PCF8591_3DIFF		0x10	/* 3 differential inputs */
121*1708Sstevel #define	PCF8591_MIXED		0x20	/* single ended and diff mixed */
122*1708Sstevel #define	PCF8591_2DIFF		0x30	/* 2 differential inputs */
123*1708Sstevel 
124*1708Sstevel #define	PCF8591_WARNING_TEMP 0x0
125*1708Sstevel #define	PCF8591_SHUTDOWN_TEMP 0x3
126*1708Sstevel 
127*1708Sstevel #define	PCF8591_ANALOG_OUTPUT_EN	0x40
128*1708Sstevel #define	PCF8591_ANALOG_INPUT_EN		0x00
129*1708Sstevel #define	PCF8591_READ_BIT			0x01
130*1708Sstevel 
131*1708Sstevel 
132*1708Sstevel #define	PCF8591_AUTO_INCR 0x04
133*1708Sstevel #define	PCF8591_OSCILATOR 0x40
134*1708Sstevel 
135*1708Sstevel #define	PCF8591_CH_0	0x00
136*1708Sstevel #define	PCF8591_CH_1	0x01
137*1708Sstevel #define	PCF8591_CH_2	0x02
138*1708Sstevel #define	PCF8591_CH_3	0x03
139*1708Sstevel 
140*1708Sstevel /*
141*1708Sstevel  * Stage of attachment.
142*1708Sstevel  */
143*1708Sstevel #define	PCF8591_SOFT_STATE_ALLOC 0x0001
144*1708Sstevel #define	PCF8591_PROPS_READ		0x0002
145*1708Sstevel #define	PCF8591_MINORS_CREATED	0x0004
146*1708Sstevel #define	PCF8591_ALLOC_TRANSFER	0x0008
147*1708Sstevel #define	PCF8591_REGISTER_CLIENT	0x0010
148*1708Sstevel #define	PCF8591_LOCK_INIT		0x0020
149*1708Sstevel #define	PCF8591_KSTAT_INIT		0x0040
150*1708Sstevel 
151*1708Sstevel #define	MAX_REGS_8591		2
152*1708Sstevel 
153*1708Sstevel struct	pcf8591	{
154*1708Sstevel 	unsigned int	reg_num;
155*1708Sstevel 	unsigned int	reg_value;
156*1708Sstevel };
157*1708Sstevel 
158*1708Sstevel /*
159*1708Sstevel  * Following property information taken from the
160*1708Sstevel  * "SPARCengine ASM Reference Manual"
161*1708Sstevel  * Property pointers are to DDI allocated space
162*1708Sstevel  * which must be freed in the detach() routine.
163*1708Sstevel  */
164*1708Sstevel 
165*1708Sstevel /*
166*1708Sstevel  * for pcf8591_properties_t.channels_in_use->io_dir
167*1708Sstevel  */
168*1708Sstevel #define	I2C_PROP_IODIR_IN		0
169*1708Sstevel #define	I2C_PROP_IODIR_OUT		1
170*1708Sstevel #define	I2C_PROP_IODIR_INOUT	2
171*1708Sstevel 
172*1708Sstevel /*
173*1708Sstevel  * for pcf8591_properties_t.channels_in_use->type
174*1708Sstevel  */
175*1708Sstevel #define	I2C_PROP_TYPE_NOCARE	0
176*1708Sstevel #define	I2C_PROP_TYPE_TEMP		1
177*1708Sstevel #define	I2C_PROP_TYPE_VOLT		2
178*1708Sstevel #define	I2C_PROP_TYPE_FANSTATS	3
179*1708Sstevel #define	I2C_PROP_TYPE_FANSPEED	4
180*1708Sstevel 
181*1708Sstevel typedef struct {
182*1708Sstevel 	uint8_t		port;
183*1708Sstevel 	uint8_t		io_dir;
184*1708Sstevel 	uint8_t		type;
185*1708Sstevel 	uint8_t		last_data;
186*1708Sstevel } pcf8591_channel_t;
187*1708Sstevel 
188*1708Sstevel typedef struct {
189*1708Sstevel 	char		*name;
190*1708Sstevel 	uint16_t	i2c_bus;
191*1708Sstevel 	uint16_t	slave_address;
192*1708Sstevel 	uint_t		num_chans_used;
193*1708Sstevel 	char		**channels_description;
194*1708Sstevel 	pcf8591_channel_t		*channels_in_use;
195*1708Sstevel } pcf8591_properties_t;
196*1708Sstevel 
197*1708Sstevel struct pcf8591_unit {
198*1708Sstevel 	int					instance;
199*1708Sstevel 	kmutex_t			umutex;
200*1708Sstevel 	dev_info_t			*dip;
201*1708Sstevel 	kcondvar_t			pcf8591_cv;
202*1708Sstevel 	uint8_t				pcf8591_flags;
203*1708Sstevel 	uint8_t				pcf8591_inprog;
204*1708Sstevel 	struct envctrl_temp temp_kstats;
205*1708Sstevel 	kstat_t 			*tempksp;
206*1708Sstevel 	uint_t				attach_flag;
207*1708Sstevel 	int				pcf8591_oflag[PCF8591_MAX_CHANS];
208*1708Sstevel 	i2c_transfer_t		*i2c_tran;
209*1708Sstevel 	i2c_client_hdl_t    pcf8591_hdl;
210*1708Sstevel 	char				pcf8591_name[PCF8591_NAMELEN];
211*1708Sstevel 	uint8_t				current_mode;
212*1708Sstevel 	uint8_t				readmask;
213*1708Sstevel 	pcf8591_properties_t props;		/* device properties */
214*1708Sstevel };
215*1708Sstevel 
216*1708Sstevel #ifdef	__cplusplus
217*1708Sstevel }
218*1708Sstevel #endif
219*1708Sstevel 
220*1708Sstevel #endif	/* _PCF8591_H */
221