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