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