1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * pmbus.h - Common defines and structures for PMBus devices 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 2010, 2011 Ericsson AB. 6*4882a593Smuzhiyun * Copyright (c) 2012 Guenter Roeck 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef PMBUS_H 10*4882a593Smuzhiyun #define PMBUS_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <linux/bitops.h> 13*4882a593Smuzhiyun #include <linux/regulator/driver.h> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun /* 16*4882a593Smuzhiyun * Registers 17*4882a593Smuzhiyun */ 18*4882a593Smuzhiyun enum pmbus_regs { 19*4882a593Smuzhiyun PMBUS_PAGE = 0x00, 20*4882a593Smuzhiyun PMBUS_OPERATION = 0x01, 21*4882a593Smuzhiyun PMBUS_ON_OFF_CONFIG = 0x02, 22*4882a593Smuzhiyun PMBUS_CLEAR_FAULTS = 0x03, 23*4882a593Smuzhiyun PMBUS_PHASE = 0x04, 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun PMBUS_WRITE_PROTECT = 0x10, 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun PMBUS_CAPABILITY = 0x19, 28*4882a593Smuzhiyun PMBUS_QUERY = 0x1A, 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun PMBUS_VOUT_MODE = 0x20, 31*4882a593Smuzhiyun PMBUS_VOUT_COMMAND = 0x21, 32*4882a593Smuzhiyun PMBUS_VOUT_TRIM = 0x22, 33*4882a593Smuzhiyun PMBUS_VOUT_CAL_OFFSET = 0x23, 34*4882a593Smuzhiyun PMBUS_VOUT_MAX = 0x24, 35*4882a593Smuzhiyun PMBUS_VOUT_MARGIN_HIGH = 0x25, 36*4882a593Smuzhiyun PMBUS_VOUT_MARGIN_LOW = 0x26, 37*4882a593Smuzhiyun PMBUS_VOUT_TRANSITION_RATE = 0x27, 38*4882a593Smuzhiyun PMBUS_VOUT_DROOP = 0x28, 39*4882a593Smuzhiyun PMBUS_VOUT_SCALE_LOOP = 0x29, 40*4882a593Smuzhiyun PMBUS_VOUT_SCALE_MONITOR = 0x2A, 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun PMBUS_COEFFICIENTS = 0x30, 43*4882a593Smuzhiyun PMBUS_POUT_MAX = 0x31, 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun PMBUS_FAN_CONFIG_12 = 0x3A, 46*4882a593Smuzhiyun PMBUS_FAN_COMMAND_1 = 0x3B, 47*4882a593Smuzhiyun PMBUS_FAN_COMMAND_2 = 0x3C, 48*4882a593Smuzhiyun PMBUS_FAN_CONFIG_34 = 0x3D, 49*4882a593Smuzhiyun PMBUS_FAN_COMMAND_3 = 0x3E, 50*4882a593Smuzhiyun PMBUS_FAN_COMMAND_4 = 0x3F, 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun PMBUS_VOUT_OV_FAULT_LIMIT = 0x40, 53*4882a593Smuzhiyun PMBUS_VOUT_OV_FAULT_RESPONSE = 0x41, 54*4882a593Smuzhiyun PMBUS_VOUT_OV_WARN_LIMIT = 0x42, 55*4882a593Smuzhiyun PMBUS_VOUT_UV_WARN_LIMIT = 0x43, 56*4882a593Smuzhiyun PMBUS_VOUT_UV_FAULT_LIMIT = 0x44, 57*4882a593Smuzhiyun PMBUS_VOUT_UV_FAULT_RESPONSE = 0x45, 58*4882a593Smuzhiyun PMBUS_IOUT_OC_FAULT_LIMIT = 0x46, 59*4882a593Smuzhiyun PMBUS_IOUT_OC_FAULT_RESPONSE = 0x47, 60*4882a593Smuzhiyun PMBUS_IOUT_OC_LV_FAULT_LIMIT = 0x48, 61*4882a593Smuzhiyun PMBUS_IOUT_OC_LV_FAULT_RESPONSE = 0x49, 62*4882a593Smuzhiyun PMBUS_IOUT_OC_WARN_LIMIT = 0x4A, 63*4882a593Smuzhiyun PMBUS_IOUT_UC_FAULT_LIMIT = 0x4B, 64*4882a593Smuzhiyun PMBUS_IOUT_UC_FAULT_RESPONSE = 0x4C, 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun PMBUS_OT_FAULT_LIMIT = 0x4F, 67*4882a593Smuzhiyun PMBUS_OT_FAULT_RESPONSE = 0x50, 68*4882a593Smuzhiyun PMBUS_OT_WARN_LIMIT = 0x51, 69*4882a593Smuzhiyun PMBUS_UT_WARN_LIMIT = 0x52, 70*4882a593Smuzhiyun PMBUS_UT_FAULT_LIMIT = 0x53, 71*4882a593Smuzhiyun PMBUS_UT_FAULT_RESPONSE = 0x54, 72*4882a593Smuzhiyun PMBUS_VIN_OV_FAULT_LIMIT = 0x55, 73*4882a593Smuzhiyun PMBUS_VIN_OV_FAULT_RESPONSE = 0x56, 74*4882a593Smuzhiyun PMBUS_VIN_OV_WARN_LIMIT = 0x57, 75*4882a593Smuzhiyun PMBUS_VIN_UV_WARN_LIMIT = 0x58, 76*4882a593Smuzhiyun PMBUS_VIN_UV_FAULT_LIMIT = 0x59, 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun PMBUS_IIN_OC_FAULT_LIMIT = 0x5B, 79*4882a593Smuzhiyun PMBUS_IIN_OC_WARN_LIMIT = 0x5D, 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun PMBUS_POUT_OP_FAULT_LIMIT = 0x68, 82*4882a593Smuzhiyun PMBUS_POUT_OP_WARN_LIMIT = 0x6A, 83*4882a593Smuzhiyun PMBUS_PIN_OP_WARN_LIMIT = 0x6B, 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun PMBUS_STATUS_BYTE = 0x78, 86*4882a593Smuzhiyun PMBUS_STATUS_WORD = 0x79, 87*4882a593Smuzhiyun PMBUS_STATUS_VOUT = 0x7A, 88*4882a593Smuzhiyun PMBUS_STATUS_IOUT = 0x7B, 89*4882a593Smuzhiyun PMBUS_STATUS_INPUT = 0x7C, 90*4882a593Smuzhiyun PMBUS_STATUS_TEMPERATURE = 0x7D, 91*4882a593Smuzhiyun PMBUS_STATUS_CML = 0x7E, 92*4882a593Smuzhiyun PMBUS_STATUS_OTHER = 0x7F, 93*4882a593Smuzhiyun PMBUS_STATUS_MFR_SPECIFIC = 0x80, 94*4882a593Smuzhiyun PMBUS_STATUS_FAN_12 = 0x81, 95*4882a593Smuzhiyun PMBUS_STATUS_FAN_34 = 0x82, 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun PMBUS_READ_VIN = 0x88, 98*4882a593Smuzhiyun PMBUS_READ_IIN = 0x89, 99*4882a593Smuzhiyun PMBUS_READ_VCAP = 0x8A, 100*4882a593Smuzhiyun PMBUS_READ_VOUT = 0x8B, 101*4882a593Smuzhiyun PMBUS_READ_IOUT = 0x8C, 102*4882a593Smuzhiyun PMBUS_READ_TEMPERATURE_1 = 0x8D, 103*4882a593Smuzhiyun PMBUS_READ_TEMPERATURE_2 = 0x8E, 104*4882a593Smuzhiyun PMBUS_READ_TEMPERATURE_3 = 0x8F, 105*4882a593Smuzhiyun PMBUS_READ_FAN_SPEED_1 = 0x90, 106*4882a593Smuzhiyun PMBUS_READ_FAN_SPEED_2 = 0x91, 107*4882a593Smuzhiyun PMBUS_READ_FAN_SPEED_3 = 0x92, 108*4882a593Smuzhiyun PMBUS_READ_FAN_SPEED_4 = 0x93, 109*4882a593Smuzhiyun PMBUS_READ_DUTY_CYCLE = 0x94, 110*4882a593Smuzhiyun PMBUS_READ_FREQUENCY = 0x95, 111*4882a593Smuzhiyun PMBUS_READ_POUT = 0x96, 112*4882a593Smuzhiyun PMBUS_READ_PIN = 0x97, 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun PMBUS_REVISION = 0x98, 115*4882a593Smuzhiyun PMBUS_MFR_ID = 0x99, 116*4882a593Smuzhiyun PMBUS_MFR_MODEL = 0x9A, 117*4882a593Smuzhiyun PMBUS_MFR_REVISION = 0x9B, 118*4882a593Smuzhiyun PMBUS_MFR_LOCATION = 0x9C, 119*4882a593Smuzhiyun PMBUS_MFR_DATE = 0x9D, 120*4882a593Smuzhiyun PMBUS_MFR_SERIAL = 0x9E, 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun PMBUS_MFR_VIN_MIN = 0xA0, 123*4882a593Smuzhiyun PMBUS_MFR_VIN_MAX = 0xA1, 124*4882a593Smuzhiyun PMBUS_MFR_IIN_MAX = 0xA2, 125*4882a593Smuzhiyun PMBUS_MFR_PIN_MAX = 0xA3, 126*4882a593Smuzhiyun PMBUS_MFR_VOUT_MIN = 0xA4, 127*4882a593Smuzhiyun PMBUS_MFR_VOUT_MAX = 0xA5, 128*4882a593Smuzhiyun PMBUS_MFR_IOUT_MAX = 0xA6, 129*4882a593Smuzhiyun PMBUS_MFR_POUT_MAX = 0xA7, 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun PMBUS_IC_DEVICE_ID = 0xAD, 132*4882a593Smuzhiyun PMBUS_IC_DEVICE_REV = 0xAE, 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun PMBUS_MFR_MAX_TEMP_1 = 0xC0, 135*4882a593Smuzhiyun PMBUS_MFR_MAX_TEMP_2 = 0xC1, 136*4882a593Smuzhiyun PMBUS_MFR_MAX_TEMP_3 = 0xC2, 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun /* 139*4882a593Smuzhiyun * Virtual registers. 140*4882a593Smuzhiyun * Useful to support attributes which are not supported by standard PMBus 141*4882a593Smuzhiyun * registers but exist as manufacturer specific registers on individual chips. 142*4882a593Smuzhiyun * Must be mapped to real registers in device specific code. 143*4882a593Smuzhiyun * 144*4882a593Smuzhiyun * Semantics: 145*4882a593Smuzhiyun * Virtual registers are all word size. 146*4882a593Smuzhiyun * READ registers are read-only; writes are either ignored or return an error. 147*4882a593Smuzhiyun * RESET registers are read/write. Reading reset registers returns zero 148*4882a593Smuzhiyun * (used for detection), writing any value causes the associated history to be 149*4882a593Smuzhiyun * reset. 150*4882a593Smuzhiyun * Virtual registers have to be handled in device specific driver code. Chip 151*4882a593Smuzhiyun * driver code returns non-negative register values if a virtual register is 152*4882a593Smuzhiyun * supported, or a negative error code if not. The chip driver may return 153*4882a593Smuzhiyun * -ENODATA or any other error code in this case, though an error code other 154*4882a593Smuzhiyun * than -ENODATA is handled more efficiently and thus preferred. Either case, 155*4882a593Smuzhiyun * the calling PMBus core code will abort if the chip driver returns an error 156*4882a593Smuzhiyun * code when reading or writing virtual registers. 157*4882a593Smuzhiyun */ 158*4882a593Smuzhiyun PMBUS_VIRT_BASE = 0x100, 159*4882a593Smuzhiyun PMBUS_VIRT_READ_TEMP_AVG, 160*4882a593Smuzhiyun PMBUS_VIRT_READ_TEMP_MIN, 161*4882a593Smuzhiyun PMBUS_VIRT_READ_TEMP_MAX, 162*4882a593Smuzhiyun PMBUS_VIRT_RESET_TEMP_HISTORY, 163*4882a593Smuzhiyun PMBUS_VIRT_READ_VIN_AVG, 164*4882a593Smuzhiyun PMBUS_VIRT_READ_VIN_MIN, 165*4882a593Smuzhiyun PMBUS_VIRT_READ_VIN_MAX, 166*4882a593Smuzhiyun PMBUS_VIRT_RESET_VIN_HISTORY, 167*4882a593Smuzhiyun PMBUS_VIRT_READ_IIN_AVG, 168*4882a593Smuzhiyun PMBUS_VIRT_READ_IIN_MIN, 169*4882a593Smuzhiyun PMBUS_VIRT_READ_IIN_MAX, 170*4882a593Smuzhiyun PMBUS_VIRT_RESET_IIN_HISTORY, 171*4882a593Smuzhiyun PMBUS_VIRT_READ_PIN_AVG, 172*4882a593Smuzhiyun PMBUS_VIRT_READ_PIN_MIN, 173*4882a593Smuzhiyun PMBUS_VIRT_READ_PIN_MAX, 174*4882a593Smuzhiyun PMBUS_VIRT_RESET_PIN_HISTORY, 175*4882a593Smuzhiyun PMBUS_VIRT_READ_POUT_AVG, 176*4882a593Smuzhiyun PMBUS_VIRT_READ_POUT_MIN, 177*4882a593Smuzhiyun PMBUS_VIRT_READ_POUT_MAX, 178*4882a593Smuzhiyun PMBUS_VIRT_RESET_POUT_HISTORY, 179*4882a593Smuzhiyun PMBUS_VIRT_READ_VOUT_AVG, 180*4882a593Smuzhiyun PMBUS_VIRT_READ_VOUT_MIN, 181*4882a593Smuzhiyun PMBUS_VIRT_READ_VOUT_MAX, 182*4882a593Smuzhiyun PMBUS_VIRT_RESET_VOUT_HISTORY, 183*4882a593Smuzhiyun PMBUS_VIRT_READ_IOUT_AVG, 184*4882a593Smuzhiyun PMBUS_VIRT_READ_IOUT_MIN, 185*4882a593Smuzhiyun PMBUS_VIRT_READ_IOUT_MAX, 186*4882a593Smuzhiyun PMBUS_VIRT_RESET_IOUT_HISTORY, 187*4882a593Smuzhiyun PMBUS_VIRT_READ_TEMP2_AVG, 188*4882a593Smuzhiyun PMBUS_VIRT_READ_TEMP2_MIN, 189*4882a593Smuzhiyun PMBUS_VIRT_READ_TEMP2_MAX, 190*4882a593Smuzhiyun PMBUS_VIRT_RESET_TEMP2_HISTORY, 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun PMBUS_VIRT_READ_VMON, 193*4882a593Smuzhiyun PMBUS_VIRT_VMON_UV_WARN_LIMIT, 194*4882a593Smuzhiyun PMBUS_VIRT_VMON_OV_WARN_LIMIT, 195*4882a593Smuzhiyun PMBUS_VIRT_VMON_UV_FAULT_LIMIT, 196*4882a593Smuzhiyun PMBUS_VIRT_VMON_OV_FAULT_LIMIT, 197*4882a593Smuzhiyun PMBUS_VIRT_STATUS_VMON, 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun /* 200*4882a593Smuzhiyun * RPM and PWM Fan control 201*4882a593Smuzhiyun * 202*4882a593Smuzhiyun * Drivers wanting to expose PWM control must define the behaviour of 203*4882a593Smuzhiyun * PMBUS_VIRT_PWM_[1-4] and PMBUS_VIRT_PWM_ENABLE_[1-4] in the 204*4882a593Smuzhiyun * {read,write}_word_data callback. 205*4882a593Smuzhiyun * 206*4882a593Smuzhiyun * pmbus core provides a default implementation for 207*4882a593Smuzhiyun * PMBUS_VIRT_FAN_TARGET_[1-4]. 208*4882a593Smuzhiyun * 209*4882a593Smuzhiyun * TARGET, PWM and PWM_ENABLE members must be defined sequentially; 210*4882a593Smuzhiyun * pmbus core uses the difference between the provided register and 211*4882a593Smuzhiyun * it's _1 counterpart to calculate the FAN/PWM ID. 212*4882a593Smuzhiyun */ 213*4882a593Smuzhiyun PMBUS_VIRT_FAN_TARGET_1, 214*4882a593Smuzhiyun PMBUS_VIRT_FAN_TARGET_2, 215*4882a593Smuzhiyun PMBUS_VIRT_FAN_TARGET_3, 216*4882a593Smuzhiyun PMBUS_VIRT_FAN_TARGET_4, 217*4882a593Smuzhiyun PMBUS_VIRT_PWM_1, 218*4882a593Smuzhiyun PMBUS_VIRT_PWM_2, 219*4882a593Smuzhiyun PMBUS_VIRT_PWM_3, 220*4882a593Smuzhiyun PMBUS_VIRT_PWM_4, 221*4882a593Smuzhiyun PMBUS_VIRT_PWM_ENABLE_1, 222*4882a593Smuzhiyun PMBUS_VIRT_PWM_ENABLE_2, 223*4882a593Smuzhiyun PMBUS_VIRT_PWM_ENABLE_3, 224*4882a593Smuzhiyun PMBUS_VIRT_PWM_ENABLE_4, 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun /* Samples for average 227*4882a593Smuzhiyun * 228*4882a593Smuzhiyun * Drivers wanting to expose functionality for changing the number of 229*4882a593Smuzhiyun * samples used for average values should implement support in 230*4882a593Smuzhiyun * {read,write}_word_data callback for either PMBUS_VIRT_SAMPLES if it 231*4882a593Smuzhiyun * applies to all types of measurements, or any number of specific 232*4882a593Smuzhiyun * PMBUS_VIRT_*_SAMPLES registers to allow for individual control. 233*4882a593Smuzhiyun */ 234*4882a593Smuzhiyun PMBUS_VIRT_SAMPLES, 235*4882a593Smuzhiyun PMBUS_VIRT_IN_SAMPLES, 236*4882a593Smuzhiyun PMBUS_VIRT_CURR_SAMPLES, 237*4882a593Smuzhiyun PMBUS_VIRT_POWER_SAMPLES, 238*4882a593Smuzhiyun PMBUS_VIRT_TEMP_SAMPLES, 239*4882a593Smuzhiyun }; 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun /* 242*4882a593Smuzhiyun * OPERATION 243*4882a593Smuzhiyun */ 244*4882a593Smuzhiyun #define PB_OPERATION_CONTROL_ON BIT(7) 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun /* 247*4882a593Smuzhiyun * WRITE_PROTECT 248*4882a593Smuzhiyun */ 249*4882a593Smuzhiyun #define PB_WP_ALL BIT(7) /* all but WRITE_PROTECT */ 250*4882a593Smuzhiyun #define PB_WP_OP BIT(6) /* all but WP, OPERATION, PAGE */ 251*4882a593Smuzhiyun #define PB_WP_VOUT BIT(5) /* all but WP, OPERATION, PAGE, VOUT, ON_OFF */ 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun #define PB_WP_ANY (PB_WP_ALL | PB_WP_OP | PB_WP_VOUT) 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun /* 256*4882a593Smuzhiyun * CAPABILITY 257*4882a593Smuzhiyun */ 258*4882a593Smuzhiyun #define PB_CAPABILITY_SMBALERT BIT(4) 259*4882a593Smuzhiyun #define PB_CAPABILITY_ERROR_CHECK BIT(7) 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun /* 262*4882a593Smuzhiyun * VOUT_MODE 263*4882a593Smuzhiyun */ 264*4882a593Smuzhiyun #define PB_VOUT_MODE_MODE_MASK 0xe0 265*4882a593Smuzhiyun #define PB_VOUT_MODE_PARAM_MASK 0x1f 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun #define PB_VOUT_MODE_LINEAR 0x00 268*4882a593Smuzhiyun #define PB_VOUT_MODE_VID 0x20 269*4882a593Smuzhiyun #define PB_VOUT_MODE_DIRECT 0x40 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun /* 272*4882a593Smuzhiyun * Fan configuration 273*4882a593Smuzhiyun */ 274*4882a593Smuzhiyun #define PB_FAN_2_PULSE_MASK (BIT(0) | BIT(1)) 275*4882a593Smuzhiyun #define PB_FAN_2_RPM BIT(2) 276*4882a593Smuzhiyun #define PB_FAN_2_INSTALLED BIT(3) 277*4882a593Smuzhiyun #define PB_FAN_1_PULSE_MASK (BIT(4) | BIT(5)) 278*4882a593Smuzhiyun #define PB_FAN_1_RPM BIT(6) 279*4882a593Smuzhiyun #define PB_FAN_1_INSTALLED BIT(7) 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun enum pmbus_fan_mode { percent = 0, rpm }; 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun /* 284*4882a593Smuzhiyun * STATUS_BYTE, STATUS_WORD (lower) 285*4882a593Smuzhiyun */ 286*4882a593Smuzhiyun #define PB_STATUS_NONE_ABOVE BIT(0) 287*4882a593Smuzhiyun #define PB_STATUS_CML BIT(1) 288*4882a593Smuzhiyun #define PB_STATUS_TEMPERATURE BIT(2) 289*4882a593Smuzhiyun #define PB_STATUS_VIN_UV BIT(3) 290*4882a593Smuzhiyun #define PB_STATUS_IOUT_OC BIT(4) 291*4882a593Smuzhiyun #define PB_STATUS_VOUT_OV BIT(5) 292*4882a593Smuzhiyun #define PB_STATUS_OFF BIT(6) 293*4882a593Smuzhiyun #define PB_STATUS_BUSY BIT(7) 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun /* 296*4882a593Smuzhiyun * STATUS_WORD (upper) 297*4882a593Smuzhiyun */ 298*4882a593Smuzhiyun #define PB_STATUS_UNKNOWN BIT(8) 299*4882a593Smuzhiyun #define PB_STATUS_OTHER BIT(9) 300*4882a593Smuzhiyun #define PB_STATUS_FANS BIT(10) 301*4882a593Smuzhiyun #define PB_STATUS_POWER_GOOD_N BIT(11) 302*4882a593Smuzhiyun #define PB_STATUS_WORD_MFR BIT(12) 303*4882a593Smuzhiyun #define PB_STATUS_INPUT BIT(13) 304*4882a593Smuzhiyun #define PB_STATUS_IOUT_POUT BIT(14) 305*4882a593Smuzhiyun #define PB_STATUS_VOUT BIT(15) 306*4882a593Smuzhiyun 307*4882a593Smuzhiyun /* 308*4882a593Smuzhiyun * STATUS_IOUT 309*4882a593Smuzhiyun */ 310*4882a593Smuzhiyun #define PB_POUT_OP_WARNING BIT(0) 311*4882a593Smuzhiyun #define PB_POUT_OP_FAULT BIT(1) 312*4882a593Smuzhiyun #define PB_POWER_LIMITING BIT(2) 313*4882a593Smuzhiyun #define PB_CURRENT_SHARE_FAULT BIT(3) 314*4882a593Smuzhiyun #define PB_IOUT_UC_FAULT BIT(4) 315*4882a593Smuzhiyun #define PB_IOUT_OC_WARNING BIT(5) 316*4882a593Smuzhiyun #define PB_IOUT_OC_LV_FAULT BIT(6) 317*4882a593Smuzhiyun #define PB_IOUT_OC_FAULT BIT(7) 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun /* 320*4882a593Smuzhiyun * STATUS_VOUT, STATUS_INPUT 321*4882a593Smuzhiyun */ 322*4882a593Smuzhiyun #define PB_VOLTAGE_VIN_OFF BIT(3) 323*4882a593Smuzhiyun #define PB_VOLTAGE_UV_FAULT BIT(4) 324*4882a593Smuzhiyun #define PB_VOLTAGE_UV_WARNING BIT(5) 325*4882a593Smuzhiyun #define PB_VOLTAGE_OV_WARNING BIT(6) 326*4882a593Smuzhiyun #define PB_VOLTAGE_OV_FAULT BIT(7) 327*4882a593Smuzhiyun 328*4882a593Smuzhiyun /* 329*4882a593Smuzhiyun * STATUS_INPUT 330*4882a593Smuzhiyun */ 331*4882a593Smuzhiyun #define PB_PIN_OP_WARNING BIT(0) 332*4882a593Smuzhiyun #define PB_IIN_OC_WARNING BIT(1) 333*4882a593Smuzhiyun #define PB_IIN_OC_FAULT BIT(2) 334*4882a593Smuzhiyun 335*4882a593Smuzhiyun /* 336*4882a593Smuzhiyun * STATUS_TEMPERATURE 337*4882a593Smuzhiyun */ 338*4882a593Smuzhiyun #define PB_TEMP_UT_FAULT BIT(4) 339*4882a593Smuzhiyun #define PB_TEMP_UT_WARNING BIT(5) 340*4882a593Smuzhiyun #define PB_TEMP_OT_WARNING BIT(6) 341*4882a593Smuzhiyun #define PB_TEMP_OT_FAULT BIT(7) 342*4882a593Smuzhiyun 343*4882a593Smuzhiyun /* 344*4882a593Smuzhiyun * STATUS_FAN 345*4882a593Smuzhiyun */ 346*4882a593Smuzhiyun #define PB_FAN_AIRFLOW_WARNING BIT(0) 347*4882a593Smuzhiyun #define PB_FAN_AIRFLOW_FAULT BIT(1) 348*4882a593Smuzhiyun #define PB_FAN_FAN2_SPEED_OVERRIDE BIT(2) 349*4882a593Smuzhiyun #define PB_FAN_FAN1_SPEED_OVERRIDE BIT(3) 350*4882a593Smuzhiyun #define PB_FAN_FAN2_WARNING BIT(4) 351*4882a593Smuzhiyun #define PB_FAN_FAN1_WARNING BIT(5) 352*4882a593Smuzhiyun #define PB_FAN_FAN2_FAULT BIT(6) 353*4882a593Smuzhiyun #define PB_FAN_FAN1_FAULT BIT(7) 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun /* 356*4882a593Smuzhiyun * CML_FAULT_STATUS 357*4882a593Smuzhiyun */ 358*4882a593Smuzhiyun #define PB_CML_FAULT_OTHER_MEM_LOGIC BIT(0) 359*4882a593Smuzhiyun #define PB_CML_FAULT_OTHER_COMM BIT(1) 360*4882a593Smuzhiyun #define PB_CML_FAULT_PROCESSOR BIT(3) 361*4882a593Smuzhiyun #define PB_CML_FAULT_MEMORY BIT(4) 362*4882a593Smuzhiyun #define PB_CML_FAULT_PACKET_ERROR BIT(5) 363*4882a593Smuzhiyun #define PB_CML_FAULT_INVALID_DATA BIT(6) 364*4882a593Smuzhiyun #define PB_CML_FAULT_INVALID_COMMAND BIT(7) 365*4882a593Smuzhiyun 366*4882a593Smuzhiyun enum pmbus_sensor_classes { 367*4882a593Smuzhiyun PSC_VOLTAGE_IN = 0, 368*4882a593Smuzhiyun PSC_VOLTAGE_OUT, 369*4882a593Smuzhiyun PSC_CURRENT_IN, 370*4882a593Smuzhiyun PSC_CURRENT_OUT, 371*4882a593Smuzhiyun PSC_POWER, 372*4882a593Smuzhiyun PSC_TEMPERATURE, 373*4882a593Smuzhiyun PSC_FAN, 374*4882a593Smuzhiyun PSC_PWM, 375*4882a593Smuzhiyun PSC_NUM_CLASSES /* Number of power sensor classes */ 376*4882a593Smuzhiyun }; 377*4882a593Smuzhiyun 378*4882a593Smuzhiyun #define PMBUS_PAGES 32 /* Per PMBus specification */ 379*4882a593Smuzhiyun #define PMBUS_PHASES 8 /* Maximum number of phases per page */ 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun /* Functionality bit mask */ 382*4882a593Smuzhiyun #define PMBUS_HAVE_VIN BIT(0) 383*4882a593Smuzhiyun #define PMBUS_HAVE_VCAP BIT(1) 384*4882a593Smuzhiyun #define PMBUS_HAVE_VOUT BIT(2) 385*4882a593Smuzhiyun #define PMBUS_HAVE_IIN BIT(3) 386*4882a593Smuzhiyun #define PMBUS_HAVE_IOUT BIT(4) 387*4882a593Smuzhiyun #define PMBUS_HAVE_PIN BIT(5) 388*4882a593Smuzhiyun #define PMBUS_HAVE_POUT BIT(6) 389*4882a593Smuzhiyun #define PMBUS_HAVE_FAN12 BIT(7) 390*4882a593Smuzhiyun #define PMBUS_HAVE_FAN34 BIT(8) 391*4882a593Smuzhiyun #define PMBUS_HAVE_TEMP BIT(9) 392*4882a593Smuzhiyun #define PMBUS_HAVE_TEMP2 BIT(10) 393*4882a593Smuzhiyun #define PMBUS_HAVE_TEMP3 BIT(11) 394*4882a593Smuzhiyun #define PMBUS_HAVE_STATUS_VOUT BIT(12) 395*4882a593Smuzhiyun #define PMBUS_HAVE_STATUS_IOUT BIT(13) 396*4882a593Smuzhiyun #define PMBUS_HAVE_STATUS_INPUT BIT(14) 397*4882a593Smuzhiyun #define PMBUS_HAVE_STATUS_TEMP BIT(15) 398*4882a593Smuzhiyun #define PMBUS_HAVE_STATUS_FAN12 BIT(16) 399*4882a593Smuzhiyun #define PMBUS_HAVE_STATUS_FAN34 BIT(17) 400*4882a593Smuzhiyun #define PMBUS_HAVE_VMON BIT(18) 401*4882a593Smuzhiyun #define PMBUS_HAVE_STATUS_VMON BIT(19) 402*4882a593Smuzhiyun #define PMBUS_HAVE_PWM12 BIT(20) 403*4882a593Smuzhiyun #define PMBUS_HAVE_PWM34 BIT(21) 404*4882a593Smuzhiyun #define PMBUS_HAVE_SAMPLES BIT(22) 405*4882a593Smuzhiyun 406*4882a593Smuzhiyun #define PMBUS_PHASE_VIRTUAL BIT(30) /* Phases on this page are virtual */ 407*4882a593Smuzhiyun #define PMBUS_PAGE_VIRTUAL BIT(31) /* Page is virtual */ 408*4882a593Smuzhiyun 409*4882a593Smuzhiyun enum pmbus_data_format { linear = 0, direct, vid }; 410*4882a593Smuzhiyun enum vrm_version { vr11 = 0, vr12, vr13, imvp9, amd625mv }; 411*4882a593Smuzhiyun 412*4882a593Smuzhiyun struct pmbus_driver_info { 413*4882a593Smuzhiyun int pages; /* Total number of pages */ 414*4882a593Smuzhiyun u8 phases[PMBUS_PAGES]; /* Number of phases per page */ 415*4882a593Smuzhiyun enum pmbus_data_format format[PSC_NUM_CLASSES]; 416*4882a593Smuzhiyun enum vrm_version vrm_version[PMBUS_PAGES]; /* vrm version per page */ 417*4882a593Smuzhiyun /* 418*4882a593Smuzhiyun * Support one set of coefficients for each sensor type 419*4882a593Smuzhiyun * Used for chips providing data in direct mode. 420*4882a593Smuzhiyun */ 421*4882a593Smuzhiyun int m[PSC_NUM_CLASSES]; /* mantissa for direct data format */ 422*4882a593Smuzhiyun int b[PSC_NUM_CLASSES]; /* offset */ 423*4882a593Smuzhiyun int R[PSC_NUM_CLASSES]; /* exponent */ 424*4882a593Smuzhiyun 425*4882a593Smuzhiyun u32 func[PMBUS_PAGES]; /* Functionality, per page */ 426*4882a593Smuzhiyun u32 pfunc[PMBUS_PHASES];/* Functionality, per phase */ 427*4882a593Smuzhiyun /* 428*4882a593Smuzhiyun * The following functions map manufacturing specific register values 429*4882a593Smuzhiyun * to PMBus standard register values. Specify only if mapping is 430*4882a593Smuzhiyun * necessary. 431*4882a593Smuzhiyun * Functions return the register value (read) or zero (write) if 432*4882a593Smuzhiyun * successful. A return value of -ENODATA indicates that there is no 433*4882a593Smuzhiyun * manufacturer specific register, but that a standard PMBus register 434*4882a593Smuzhiyun * may exist. Any other negative return value indicates that the 435*4882a593Smuzhiyun * register does not exist, and that no attempt should be made to read 436*4882a593Smuzhiyun * the standard register. 437*4882a593Smuzhiyun */ 438*4882a593Smuzhiyun int (*read_byte_data)(struct i2c_client *client, int page, int reg); 439*4882a593Smuzhiyun int (*read_word_data)(struct i2c_client *client, int page, int phase, 440*4882a593Smuzhiyun int reg); 441*4882a593Smuzhiyun int (*write_word_data)(struct i2c_client *client, int page, int reg, 442*4882a593Smuzhiyun u16 word); 443*4882a593Smuzhiyun int (*write_byte)(struct i2c_client *client, int page, u8 value); 444*4882a593Smuzhiyun /* 445*4882a593Smuzhiyun * The identify function determines supported PMBus functionality. 446*4882a593Smuzhiyun * This function is only necessary if a chip driver supports multiple 447*4882a593Smuzhiyun * chips, and the chip functionality is not pre-determined. 448*4882a593Smuzhiyun */ 449*4882a593Smuzhiyun int (*identify)(struct i2c_client *client, 450*4882a593Smuzhiyun struct pmbus_driver_info *info); 451*4882a593Smuzhiyun 452*4882a593Smuzhiyun /* Regulator functionality, if supported by this chip driver. */ 453*4882a593Smuzhiyun int num_regulators; 454*4882a593Smuzhiyun const struct regulator_desc *reg_desc; 455*4882a593Smuzhiyun 456*4882a593Smuzhiyun /* custom attributes */ 457*4882a593Smuzhiyun const struct attribute_group **groups; 458*4882a593Smuzhiyun }; 459*4882a593Smuzhiyun 460*4882a593Smuzhiyun /* Regulator ops */ 461*4882a593Smuzhiyun 462*4882a593Smuzhiyun extern const struct regulator_ops pmbus_regulator_ops; 463*4882a593Smuzhiyun 464*4882a593Smuzhiyun /* Macro for filling in array of struct regulator_desc */ 465*4882a593Smuzhiyun #define PMBUS_REGULATOR(_name, _id) \ 466*4882a593Smuzhiyun [_id] = { \ 467*4882a593Smuzhiyun .name = (_name # _id), \ 468*4882a593Smuzhiyun .id = (_id), \ 469*4882a593Smuzhiyun .of_match = of_match_ptr(_name # _id), \ 470*4882a593Smuzhiyun .regulators_node = of_match_ptr("regulators"), \ 471*4882a593Smuzhiyun .ops = &pmbus_regulator_ops, \ 472*4882a593Smuzhiyun .type = REGULATOR_VOLTAGE, \ 473*4882a593Smuzhiyun .owner = THIS_MODULE, \ 474*4882a593Smuzhiyun } 475*4882a593Smuzhiyun 476*4882a593Smuzhiyun /* Function declarations */ 477*4882a593Smuzhiyun 478*4882a593Smuzhiyun void pmbus_clear_cache(struct i2c_client *client); 479*4882a593Smuzhiyun int pmbus_set_page(struct i2c_client *client, int page, int phase); 480*4882a593Smuzhiyun int pmbus_read_word_data(struct i2c_client *client, int page, int phase, 481*4882a593Smuzhiyun u8 reg); 482*4882a593Smuzhiyun int pmbus_write_word_data(struct i2c_client *client, int page, u8 reg, 483*4882a593Smuzhiyun u16 word); 484*4882a593Smuzhiyun int pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg); 485*4882a593Smuzhiyun int pmbus_write_byte(struct i2c_client *client, int page, u8 value); 486*4882a593Smuzhiyun int pmbus_write_byte_data(struct i2c_client *client, int page, u8 reg, 487*4882a593Smuzhiyun u8 value); 488*4882a593Smuzhiyun int pmbus_update_byte_data(struct i2c_client *client, int page, u8 reg, 489*4882a593Smuzhiyun u8 mask, u8 value); 490*4882a593Smuzhiyun void pmbus_clear_faults(struct i2c_client *client); 491*4882a593Smuzhiyun bool pmbus_check_byte_register(struct i2c_client *client, int page, int reg); 492*4882a593Smuzhiyun bool pmbus_check_word_register(struct i2c_client *client, int page, int reg); 493*4882a593Smuzhiyun int pmbus_do_probe(struct i2c_client *client, struct pmbus_driver_info *info); 494*4882a593Smuzhiyun int pmbus_do_remove(struct i2c_client *client); 495*4882a593Smuzhiyun const struct pmbus_driver_info *pmbus_get_driver_info(struct i2c_client 496*4882a593Smuzhiyun *client); 497*4882a593Smuzhiyun int pmbus_get_fan_rate_device(struct i2c_client *client, int page, int id, 498*4882a593Smuzhiyun enum pmbus_fan_mode mode); 499*4882a593Smuzhiyun int pmbus_get_fan_rate_cached(struct i2c_client *client, int page, int id, 500*4882a593Smuzhiyun enum pmbus_fan_mode mode); 501*4882a593Smuzhiyun int pmbus_update_fan(struct i2c_client *client, int page, int id, 502*4882a593Smuzhiyun u8 config, u8 mask, u16 command); 503*4882a593Smuzhiyun struct dentry *pmbus_get_debugfs_dir(struct i2c_client *client); 504*4882a593Smuzhiyun 505*4882a593Smuzhiyun #endif /* PMBUS_H */ 506