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 2005 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _ADM1031_IMPL_H 28 #define _ADM1031_IMPL_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 #ifdef __cplusplus 33 extern "C" { 34 #endif 35 36 37 #define ADM1031_PIL 4 38 #define ADM1031_MAX_XFER 4 39 40 #define ADM1031_WRITE_COMMAND_BASE 30 41 42 43 /* This register has the value of fan speeds */ 44 #define ADM1031_FAN_SPEED_INST_REG_1 0x08 45 #define ADM1031_FAN_SPEED_INST_REG_2 0x09 46 47 /* This register has the value of temperatures */ 48 49 #define ADM1031_LOCAL_TEMP_INST_REG 0x0A 50 #define ADM1031_REMOTE_TEMP_INST_REG_1 0x0B 51 #define ADM1031_REMOTE_TEMP_INST_REG_2 0x0C 52 53 54 #define ADM1031_STAT_1_REG 0x02 55 #define ADM1031_STAT_2_REG 0x03 56 #define ADM1031_DEVICE_ID_REG 0x3D 57 #define ADM1031_CONFIG_REG_1 0x00 58 #define ADM1031_CONFIG_REG_2 0x01 59 #define ADM1031_FAN_CHAR_1_REG 0x20 60 #define ADM1031_FAN_CHAR_2_REG 0x21 61 #define ADM1031_FAN_SPEED_CONFIG_REG 0x22 62 #define ADM1031_FAN_HIGH_LIMIT_1_REG 0x10 63 #define ADM1031_FAN_HIGH_LIMIT_2_REG 0x11 64 #define ADM1031_LOCAL_TEMP_RANGE_REG 0x24 65 #define ADM1031_REMOTE_TEMP_RANGE_1_REG 0x25 66 #define ADM1031_REMOTE_TEMP_RANGE_2_REG 0x26 67 #define ADM1031_EXTD_TEMP_RESL_REG 0x06 68 #define ADM1031_LOCAL_TEMP_OFFSET_REG 0x0D 69 #define ADM1031_REMOTE_TEMP_OFFSET_1_REG 0x0E 70 #define ADM1031_REMOTE_TEMP_OFFSET_2_REG 0x0F 71 #define ADM1031_LOCAL_TEMP_HIGH_LIMIT_REG 0x14 72 #define ADM1031_REMOTE_TEMP_HIGH_LIMIT_1_REG 0x18 73 #define ADM1031_REMOTE_TEMP_HIGH_LIMIT_2_REG 0x1C 74 #define ADM1031_LOCAL_TEMP_LOW_LIMIT_REG 0x15 75 #define ADM1031_REMOTE_TEMP_LOW_LIMIT_1_REG 0x19 76 #define ADM1031_REMOTE_TEMP_LOW_LIMIT_2_REG 0x1D 77 #define ADM1031_LOCAL_TEMP_THERM_LIMIT_REG 0x16 78 #define ADM1031_REMOTE_TEMP_THERM_LIMIT_1_REG 0x1A 79 #define ADM1031_REMOTE_TEMP_THERM_LIMIT_2_REG 0x1E 80 81 82 83 #define ADM1031_TEMP_CHANS 3 84 #define ADM1031_FAN_SPEED_CHANS 2 85 86 #define ADM1031_TEMPERATURES 0 87 #define ADM1031_FANS 1 88 #define ADM1031_CONTROL 2 89 90 91 #define ADM1031_INST_TO_MINOR(x) ((x << 8) & 0xF00) 92 #define ADM1031_FCN_TO_MINOR(x) ((x << 4) & 0x0F0) 93 #define ADM1031_FCNINST_TO_MINOR(x) (x & 0x00F) 94 #define ADM1031_MINOR_TO_FCNINST(x) (0x00F & x) 95 #define ADM1031_MINOR_TO_FCN(x) ((0x0F0 & x) >> 4) 96 #define ADM1031_MINOR_TO_INST(x) ((x & 0xF00) >> 8) 97 98 #define ADM1031_CHECK_FOR_WRITES(x) (x > 26) 99 100 /* 101 * Maximum speed for a fan is 0xf(100% PWM duty cycle) and minimum is 102 * 0x0(0% PWM duty cycle). 103 */ 104 #define ADM1031_CHECK_INVALID_SPEED(x) ((x) > 0x0F) 105 106 /* 107 * Check if the minor node corresponds with the correct function. 108 */ 109 #define ADM1031_CHECK_FAN_CMD(x) \ 110 (((x >= 6) && (x < 11)) || ((x >= 36) && (x < 41))) 111 112 #define ADM1031_CHECK_TEMPERATURE_CMD(x) \ 113 (((x >= 11) && (x < 27)) || ((x >= 41) && (x < 57))) 114 115 #define ADM1031_CHECK_CONTROL_CMD(x) \ 116 (((x >= 1) && (x < 6)) || ((x >= 34) && (x < 36))) 117 118 119 #define MLSN(x) (x & 0xf0) 120 #define MMSN(x) (x & 0x0f) 121 122 #define ADM1031_BUSYFLAG 0x1 123 #define ADM1031_TBUFFLAG 0x2 124 #define ADM1031_REGFLAG 0x4 125 #define ADM1031_MUTEXFLAG 0x8 126 #define ADM1031_INTRFLAG 0x10 127 #define ADM1031_AUTOFLAG 0x80 128 129 #define ADM1031_NODE_TYPE "ddi_i2c:hardware_monitor" 130 131 typedef struct adm1031_cpr_state { 132 uint8_t config_reg_1; 133 uint8_t config_reg_2; 134 uint8_t fan_speed_reg; 135 } adm1031_cpr_state_t; 136 137 typedef struct adm1031_unit { 138 dev_info_t *adm1031_dip; 139 i2c_transfer_t *adm1031_transfer; 140 ddi_iblock_cookie_t adm1031_icookie; 141 kmutex_t adm1031_mutex; 142 kcondvar_t adm1031_cv; 143 kmutex_t adm1031_imutex; 144 kcondvar_t adm1031_icv; 145 int adm1031_cvwaiting; 146 int adm1031_flags; 147 i2c_client_hdl_t adm1031_hdl; 148 char adm1031_name[12]; 149 int adm1031_oflag; 150 adm1031_cpr_state_t adm1031_cpr_state; 151 } adm1031_unit_t; 152 153 typedef struct minor_info { 154 char *minor_name; 155 uchar_t reg; 156 } minor_info; 157 158 #ifdef __cplusplus 159 } 160 #endif 161 162 #endif /* _ADM1031_IMPL_H */ 163