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