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