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