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 */