summaryrefslogtreecommitdiff
path: root/usr/src/uts/sun4u/montecarlo/sys/pcf8591_nct.h
blob: da67a5368dcc4eccef527c66813e8e5ceca82c5c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright (c) 1999-2000 by Sun Microsystems, Inc.
 * All rights reserved.
 */

#ifndef	_PCF8591_H
#define	_PCF8591_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#ifdef	__cplusplus
extern "C" {
#endif

/*
 * PCF8591 Chip Used for temperature sensors
 *
 * Addressing Register definition.
 * A0-A2 valid range is 0-7
 *
 * ------------------------------------------------
 * | 1 | 0 | 0 | 1 | A2 | A1 | A0 | R/W |
 * ------------------------------------------------
 */

#define	PCF8591_MAX_DEVS	0x08
#define	PCF8591_MAX_CHANS	0x04
#define	PCF8591_BUSY		0x01
#define	PCF8591_NAMELEN		12

#define	PCF8591_MINOR_TO_DEVINST(x) (((x) & 0x700) >> 8)
#define	PCF8591_MINOR_TO_CHANNEL(x) ((x) & 0x3)

#define	PCF8591_CHANNEL_TO_MINOR(x) ((x) & 0x3)
#define	PCF8591_DEVINST_TO_MINOR(x) ((x) << 8)
#define	PCF8591_MINOR_NUM(i, c) (((i) << 8)|((c) & 0x3))

#define	PCF8591_NODE_TYPE "ddi_i2c:adc"

#define	PCF8591_TRAN_SIZE 1
#define	I2C_PCF8591_NAME "adc-dac"
#define	I2C_KSTAT_CPUTEMP "adc_temp"
#define	I2C_TYPE_PCF8591 0

#define	ENVC_NETRACT_CPU_SENSOR 0

#define	I2C_DEV0	0x00
#define	I2C_DEV1	0x02
#define	I2C_DEV2	0x04
#define	I2C_DEV3	0x06
#define	I2C_DEV4	0x08
#define	I2C_DEV5	0x0A
#define	I2C_DEV6    0x0C
#define	I2C_DEV7	0x0E

#define	MAX_WLEN	64
#define	MAX_RLEN	64

#ifndef	I2CDEV_TRAN
#define	I2CDEV_TRAN 1
#endif
#define	I2CDEV_GETTEMP		82
#define	I2CDEV_GETTABLES	256

#define	ENVC_IOC_GETTEMP	0x10
/*
 * These are now defined in sys/netract_gen.h
 *
 * #define	ENVC_IOC_GETMODE	0x1C
 * #define	ENVC_IOC_SETMODE	0x1D
 */

/*
 * 		CONTROL OF CHIP
 * PCF8591 Temp sensing control register definitions
 *
 * ---------------------------------------------
 * | 0 | AOE | X | X | 0 | AIF | X | X |
 * ---------------------------------------------
 * AOE = Analog out enable.. not used on out implementation
 * 5 & 4 = Analog Input Programming.. see data sheet for bits..
 *
 * AIF = Auto increment flag
 * bits 1 & 0 are for the Channel number.
 */

/*
 * We should be able to select the alalog input
 * programming of our choice. By default, the
 * alanog input programming is set to Single
 * ended. The programmer can issue an ioctl to
 * set the input programming mode. We will set
 * the auto increment flag set to off, so the lower
 * nibble in the control byte will be set to the
 * channel number.
 */

#define	PCF8591_4SINGLE		0x00	/* 4 single ended inputs */
#define	PCF8591_3DIFF		0x10	/* 3 differential inputs */
#define	PCF8591_MIXED		0x20	/* single ended and diff mixed */
#define	PCF8591_2DIFF		0x30	/* 2 differential inputs */

#define	PCF8591_WARNING_TEMP 0x0
#define	PCF8591_SHUTDOWN_TEMP 0x3

#define	PCF8591_ANALOG_OUTPUT_EN	0x40
#define	PCF8591_ANALOG_INPUT_EN		0x00
#define	PCF8591_READ_BIT			0x01


#define	PCF8591_AUTO_INCR 0x04
#define	PCF8591_OSCILATOR 0x40

#define	PCF8591_CH_0	0x00
#define	PCF8591_CH_1	0x01
#define	PCF8591_CH_2	0x02
#define	PCF8591_CH_3	0x03

/*
 * Stage of attachment.
 */
#define	PCF8591_SOFT_STATE_ALLOC 0x0001
#define	PCF8591_PROPS_READ		0x0002
#define	PCF8591_MINORS_CREATED	0x0004
#define	PCF8591_ALLOC_TRANSFER	0x0008
#define	PCF8591_REGISTER_CLIENT	0x0010
#define	PCF8591_LOCK_INIT		0x0020
#define	PCF8591_KSTAT_INIT		0x0040

#define	MAX_REGS_8591		2

struct	pcf8591	{
	unsigned int	reg_num;
	unsigned int	reg_value;
};

/*
 * Following property information taken from the
 * "SPARCengine ASM Reference Manual"
 * Property pointers are to DDI allocated space
 * which must be freed in the detach() routine.
 */

/*
 * for pcf8591_properties_t.channels_in_use->io_dir
 */
#define	I2C_PROP_IODIR_IN		0
#define	I2C_PROP_IODIR_OUT		1
#define	I2C_PROP_IODIR_INOUT	2

/*
 * for pcf8591_properties_t.channels_in_use->type
 */
#define	I2C_PROP_TYPE_NOCARE	0
#define	I2C_PROP_TYPE_TEMP		1
#define	I2C_PROP_TYPE_VOLT		2
#define	I2C_PROP_TYPE_FANSTATS	3
#define	I2C_PROP_TYPE_FANSPEED	4

typedef struct {
	uint8_t		port;
	uint8_t		io_dir;
	uint8_t		type;
	uint8_t		last_data;
} pcf8591_channel_t;

typedef struct {
	char		*name;
	uint16_t	i2c_bus;
	uint16_t	slave_address;
	uint_t		num_chans_used;
	char		**channels_description;
	pcf8591_channel_t		*channels_in_use;
} pcf8591_properties_t;

struct pcf8591_unit {
	int					instance;
	kmutex_t			umutex;
	dev_info_t			*dip;
	kcondvar_t			pcf8591_cv;
	uint8_t				pcf8591_flags;
	uint8_t				pcf8591_inprog;
	struct envctrl_temp temp_kstats;
	kstat_t 			*tempksp;
	uint_t				attach_flag;
	int				pcf8591_oflag[PCF8591_MAX_CHANS];
	i2c_transfer_t		*i2c_tran;
	i2c_client_hdl_t    pcf8591_hdl;
	char				pcf8591_name[PCF8591_NAMELEN];
	uint8_t				current_mode;
	uint8_t				readmask;
	pcf8591_properties_t props;		/* device properties */
};

#ifdef	__cplusplus
}
#endif

#endif	/* _PCF8591_H */