linux/drivers/hwmon/pmbus/pmbus.h
<<
>>
Prefs
   1/*
   2 * pmbus.h - Common defines and structures for PMBus devices
   3 *
   4 * Copyright (c) 2010, 2011 Ericsson AB.
   5 * Copyright (c) 2012 Guenter Roeck
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License as published by
   9 * the Free Software Foundation; either version 2 of the License, or
  10 * (at your option) any later version.
  11 *
  12 * This program is distributed in the hope that it will be useful,
  13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15 * GNU General Public License for more details.
  16 *
  17 * You should have received a copy of the GNU General Public License
  18 * along with this program; if not, write to the Free Software
  19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20 */
  21
  22#include <linux/regulator/driver.h>
  23
  24#ifndef PMBUS_H
  25#define PMBUS_H
  26
  27/*
  28 * Registers
  29 */
  30#define PMBUS_PAGE                      0x00
  31#define PMBUS_OPERATION                 0x01
  32#define PMBUS_ON_OFF_CONFIG             0x02
  33#define PMBUS_CLEAR_FAULTS              0x03
  34#define PMBUS_PHASE                     0x04
  35
  36#define PMBUS_CAPABILITY                0x19
  37#define PMBUS_QUERY                     0x1A
  38
  39#define PMBUS_VOUT_MODE                 0x20
  40#define PMBUS_VOUT_COMMAND              0x21
  41#define PMBUS_VOUT_TRIM                 0x22
  42#define PMBUS_VOUT_CAL_OFFSET           0x23
  43#define PMBUS_VOUT_MAX                  0x24
  44#define PMBUS_VOUT_MARGIN_HIGH          0x25
  45#define PMBUS_VOUT_MARGIN_LOW           0x26
  46#define PMBUS_VOUT_TRANSITION_RATE      0x27
  47#define PMBUS_VOUT_DROOP                0x28
  48#define PMBUS_VOUT_SCALE_LOOP           0x29
  49#define PMBUS_VOUT_SCALE_MONITOR        0x2A
  50
  51#define PMBUS_COEFFICIENTS              0x30
  52#define PMBUS_POUT_MAX                  0x31
  53
  54#define PMBUS_FAN_CONFIG_12             0x3A
  55#define PMBUS_FAN_COMMAND_1             0x3B
  56#define PMBUS_FAN_COMMAND_2             0x3C
  57#define PMBUS_FAN_CONFIG_34             0x3D
  58#define PMBUS_FAN_COMMAND_3             0x3E
  59#define PMBUS_FAN_COMMAND_4             0x3F
  60
  61#define PMBUS_VOUT_OV_FAULT_LIMIT       0x40
  62#define PMBUS_VOUT_OV_FAULT_RESPONSE    0x41
  63#define PMBUS_VOUT_OV_WARN_LIMIT        0x42
  64#define PMBUS_VOUT_UV_WARN_LIMIT        0x43
  65#define PMBUS_VOUT_UV_FAULT_LIMIT       0x44
  66#define PMBUS_VOUT_UV_FAULT_RESPONSE    0x45
  67#define PMBUS_IOUT_OC_FAULT_LIMIT       0x46
  68#define PMBUS_IOUT_OC_FAULT_RESPONSE    0x47
  69#define PMBUS_IOUT_OC_LV_FAULT_LIMIT    0x48
  70#define PMBUS_IOUT_OC_LV_FAULT_RESPONSE 0x49
  71#define PMBUS_IOUT_OC_WARN_LIMIT        0x4A
  72#define PMBUS_IOUT_UC_FAULT_LIMIT       0x4B
  73#define PMBUS_IOUT_UC_FAULT_RESPONSE    0x4C
  74
  75#define PMBUS_OT_FAULT_LIMIT            0x4F
  76#define PMBUS_OT_FAULT_RESPONSE         0x50
  77#define PMBUS_OT_WARN_LIMIT             0x51
  78#define PMBUS_UT_WARN_LIMIT             0x52
  79#define PMBUS_UT_FAULT_LIMIT            0x53
  80#define PMBUS_UT_FAULT_RESPONSE         0x54
  81#define PMBUS_VIN_OV_FAULT_LIMIT        0x55
  82#define PMBUS_VIN_OV_FAULT_RESPONSE     0x56
  83#define PMBUS_VIN_OV_WARN_LIMIT         0x57
  84#define PMBUS_VIN_UV_WARN_LIMIT         0x58
  85#define PMBUS_VIN_UV_FAULT_LIMIT        0x59
  86
  87#define PMBUS_IIN_OC_FAULT_LIMIT        0x5B
  88#define PMBUS_IIN_OC_WARN_LIMIT         0x5D
  89
  90#define PMBUS_POUT_OP_FAULT_LIMIT       0x68
  91#define PMBUS_POUT_OP_WARN_LIMIT        0x6A
  92#define PMBUS_PIN_OP_WARN_LIMIT         0x6B
  93
  94#define PMBUS_STATUS_BYTE               0x78
  95#define PMBUS_STATUS_WORD               0x79
  96#define PMBUS_STATUS_VOUT               0x7A
  97#define PMBUS_STATUS_IOUT               0x7B
  98#define PMBUS_STATUS_INPUT              0x7C
  99#define PMBUS_STATUS_TEMPERATURE        0x7D
 100#define PMBUS_STATUS_CML                0x7E
 101#define PMBUS_STATUS_OTHER              0x7F
 102#define PMBUS_STATUS_MFR_SPECIFIC       0x80
 103#define PMBUS_STATUS_FAN_12             0x81
 104#define PMBUS_STATUS_FAN_34             0x82
 105
 106#define PMBUS_READ_VIN                  0x88
 107#define PMBUS_READ_IIN                  0x89
 108#define PMBUS_READ_VCAP                 0x8A
 109#define PMBUS_READ_VOUT                 0x8B
 110#define PMBUS_READ_IOUT                 0x8C
 111#define PMBUS_READ_TEMPERATURE_1        0x8D
 112#define PMBUS_READ_TEMPERATURE_2        0x8E
 113#define PMBUS_READ_TEMPERATURE_3        0x8F
 114#define PMBUS_READ_FAN_SPEED_1          0x90
 115#define PMBUS_READ_FAN_SPEED_2          0x91
 116#define PMBUS_READ_FAN_SPEED_3          0x92
 117#define PMBUS_READ_FAN_SPEED_4          0x93
 118#define PMBUS_READ_DUTY_CYCLE           0x94
 119#define PMBUS_READ_FREQUENCY            0x95
 120#define PMBUS_READ_POUT                 0x96
 121#define PMBUS_READ_PIN                  0x97
 122
 123#define PMBUS_REVISION                  0x98
 124#define PMBUS_MFR_ID                    0x99
 125#define PMBUS_MFR_MODEL                 0x9A
 126#define PMBUS_MFR_REVISION              0x9B
 127#define PMBUS_MFR_LOCATION              0x9C
 128#define PMBUS_MFR_DATE                  0x9D
 129#define PMBUS_MFR_SERIAL                0x9E
 130
 131/*
 132 * Virtual registers.
 133 * Useful to support attributes which are not supported by standard PMBus
 134 * registers but exist as manufacturer specific registers on individual chips.
 135 * Must be mapped to real registers in device specific code.
 136 *
 137 * Semantics:
 138 * Virtual registers are all word size.
 139 * READ registers are read-only; writes are either ignored or return an error.
 140 * RESET registers are read/write. Reading reset registers returns zero
 141 * (used for detection), writing any value causes the associated history to be
 142 * reset.
 143 * Virtual registers have to be handled in device specific driver code. Chip
 144 * driver code returns non-negative register values if a virtual register is
 145 * supported, or a negative error code if not. The chip driver may return
 146 * -ENODATA or any other error code in this case, though an error code other
 147 * than -ENODATA is handled more efficiently and thus preferred. Either case,
 148 * the calling PMBus core code will abort if the chip driver returns an error
 149 * code when reading or writing virtual registers.
 150 */
 151#define PMBUS_VIRT_BASE                 0x100
 152#define PMBUS_VIRT_READ_TEMP_AVG        (PMBUS_VIRT_BASE + 0)
 153#define PMBUS_VIRT_READ_TEMP_MIN        (PMBUS_VIRT_BASE + 1)
 154#define PMBUS_VIRT_READ_TEMP_MAX        (PMBUS_VIRT_BASE + 2)
 155#define PMBUS_VIRT_RESET_TEMP_HISTORY   (PMBUS_VIRT_BASE + 3)
 156#define PMBUS_VIRT_READ_VIN_AVG         (PMBUS_VIRT_BASE + 4)
 157#define PMBUS_VIRT_READ_VIN_MIN         (PMBUS_VIRT_BASE + 5)
 158#define PMBUS_VIRT_READ_VIN_MAX         (PMBUS_VIRT_BASE + 6)
 159#define PMBUS_VIRT_RESET_VIN_HISTORY    (PMBUS_VIRT_BASE + 7)
 160#define PMBUS_VIRT_READ_IIN_AVG         (PMBUS_VIRT_BASE + 8)
 161#define PMBUS_VIRT_READ_IIN_MIN         (PMBUS_VIRT_BASE + 9)
 162#define PMBUS_VIRT_READ_IIN_MAX         (PMBUS_VIRT_BASE + 10)
 163#define PMBUS_VIRT_RESET_IIN_HISTORY    (PMBUS_VIRT_BASE + 11)
 164#define PMBUS_VIRT_READ_PIN_AVG         (PMBUS_VIRT_BASE + 12)
 165#define PMBUS_VIRT_READ_PIN_MAX         (PMBUS_VIRT_BASE + 13)
 166#define PMBUS_VIRT_RESET_PIN_HISTORY    (PMBUS_VIRT_BASE + 14)
 167#define PMBUS_VIRT_READ_POUT_AVG        (PMBUS_VIRT_BASE + 15)
 168#define PMBUS_VIRT_READ_POUT_MAX        (PMBUS_VIRT_BASE + 16)
 169#define PMBUS_VIRT_RESET_POUT_HISTORY   (PMBUS_VIRT_BASE + 17)
 170#define PMBUS_VIRT_READ_VOUT_AVG        (PMBUS_VIRT_BASE + 18)
 171#define PMBUS_VIRT_READ_VOUT_MIN        (PMBUS_VIRT_BASE + 19)
 172#define PMBUS_VIRT_READ_VOUT_MAX        (PMBUS_VIRT_BASE + 20)
 173#define PMBUS_VIRT_RESET_VOUT_HISTORY   (PMBUS_VIRT_BASE + 21)
 174#define PMBUS_VIRT_READ_IOUT_AVG        (PMBUS_VIRT_BASE + 22)
 175#define PMBUS_VIRT_READ_IOUT_MIN        (PMBUS_VIRT_BASE + 23)
 176#define PMBUS_VIRT_READ_IOUT_MAX        (PMBUS_VIRT_BASE + 24)
 177#define PMBUS_VIRT_RESET_IOUT_HISTORY   (PMBUS_VIRT_BASE + 25)
 178#define PMBUS_VIRT_READ_TEMP2_AVG       (PMBUS_VIRT_BASE + 26)
 179#define PMBUS_VIRT_READ_TEMP2_MIN       (PMBUS_VIRT_BASE + 27)
 180#define PMBUS_VIRT_READ_TEMP2_MAX       (PMBUS_VIRT_BASE + 28)
 181#define PMBUS_VIRT_RESET_TEMP2_HISTORY  (PMBUS_VIRT_BASE + 29)
 182
 183#define PMBUS_VIRT_READ_VMON            (PMBUS_VIRT_BASE + 30)
 184#define PMBUS_VIRT_VMON_UV_WARN_LIMIT   (PMBUS_VIRT_BASE + 31)
 185#define PMBUS_VIRT_VMON_OV_WARN_LIMIT   (PMBUS_VIRT_BASE + 32)
 186#define PMBUS_VIRT_VMON_UV_FAULT_LIMIT  (PMBUS_VIRT_BASE + 33)
 187#define PMBUS_VIRT_VMON_OV_FAULT_LIMIT  (PMBUS_VIRT_BASE + 34)
 188#define PMBUS_VIRT_STATUS_VMON          (PMBUS_VIRT_BASE + 35)
 189
 190/*
 191 * OPERATION
 192 */
 193#define PB_OPERATION_CONTROL_ON         (1<<7)
 194
 195/*
 196 * CAPABILITY
 197 */
 198#define PB_CAPABILITY_SMBALERT          (1<<4)
 199#define PB_CAPABILITY_ERROR_CHECK       (1<<7)
 200
 201/*
 202 * VOUT_MODE
 203 */
 204#define PB_VOUT_MODE_MODE_MASK          0xe0
 205#define PB_VOUT_MODE_PARAM_MASK         0x1f
 206
 207#define PB_VOUT_MODE_LINEAR             0x00
 208#define PB_VOUT_MODE_VID                0x20
 209#define PB_VOUT_MODE_DIRECT             0x40
 210
 211/*
 212 * Fan configuration
 213 */
 214#define PB_FAN_2_PULSE_MASK             ((1 << 0) | (1 << 1))
 215#define PB_FAN_2_RPM                    (1 << 2)
 216#define PB_FAN_2_INSTALLED              (1 << 3)
 217#define PB_FAN_1_PULSE_MASK             ((1 << 4) | (1 << 5))
 218#define PB_FAN_1_RPM                    (1 << 6)
 219#define PB_FAN_1_INSTALLED              (1 << 7)
 220
 221/*
 222 * STATUS_BYTE, STATUS_WORD (lower)
 223 */
 224#define PB_STATUS_NONE_ABOVE            (1<<0)
 225#define PB_STATUS_CML                   (1<<1)
 226#define PB_STATUS_TEMPERATURE           (1<<2)
 227#define PB_STATUS_VIN_UV                (1<<3)
 228#define PB_STATUS_IOUT_OC               (1<<4)
 229#define PB_STATUS_VOUT_OV               (1<<5)
 230#define PB_STATUS_OFF                   (1<<6)
 231#define PB_STATUS_BUSY                  (1<<7)
 232
 233/*
 234 * STATUS_WORD (upper)
 235 */
 236#define PB_STATUS_UNKNOWN               (1<<8)
 237#define PB_STATUS_OTHER                 (1<<9)
 238#define PB_STATUS_FANS                  (1<<10)
 239#define PB_STATUS_POWER_GOOD_N          (1<<11)
 240#define PB_STATUS_WORD_MFR              (1<<12)
 241#define PB_STATUS_INPUT                 (1<<13)
 242#define PB_STATUS_IOUT_POUT             (1<<14)
 243#define PB_STATUS_VOUT                  (1<<15)
 244
 245/*
 246 * STATUS_IOUT
 247 */
 248#define PB_POUT_OP_WARNING              (1<<0)
 249#define PB_POUT_OP_FAULT                (1<<1)
 250#define PB_POWER_LIMITING               (1<<2)
 251#define PB_CURRENT_SHARE_FAULT          (1<<3)
 252#define PB_IOUT_UC_FAULT                (1<<4)
 253#define PB_IOUT_OC_WARNING              (1<<5)
 254#define PB_IOUT_OC_LV_FAULT             (1<<6)
 255#define PB_IOUT_OC_FAULT                (1<<7)
 256
 257/*
 258 * STATUS_VOUT, STATUS_INPUT
 259 */
 260#define PB_VOLTAGE_UV_FAULT             (1<<4)
 261#define PB_VOLTAGE_UV_WARNING           (1<<5)
 262#define PB_VOLTAGE_OV_WARNING           (1<<6)
 263#define PB_VOLTAGE_OV_FAULT             (1<<7)
 264
 265/*
 266 * STATUS_INPUT
 267 */
 268#define PB_PIN_OP_WARNING               (1<<0)
 269#define PB_IIN_OC_WARNING               (1<<1)
 270#define PB_IIN_OC_FAULT                 (1<<2)
 271
 272/*
 273 * STATUS_TEMPERATURE
 274 */
 275#define PB_TEMP_UT_FAULT                (1<<4)
 276#define PB_TEMP_UT_WARNING              (1<<5)
 277#define PB_TEMP_OT_WARNING              (1<<6)
 278#define PB_TEMP_OT_FAULT                (1<<7)
 279
 280/*
 281 * STATUS_FAN
 282 */
 283#define PB_FAN_AIRFLOW_WARNING          (1<<0)
 284#define PB_FAN_AIRFLOW_FAULT            (1<<1)
 285#define PB_FAN_FAN2_SPEED_OVERRIDE      (1<<2)
 286#define PB_FAN_FAN1_SPEED_OVERRIDE      (1<<3)
 287#define PB_FAN_FAN2_WARNING             (1<<4)
 288#define PB_FAN_FAN1_WARNING             (1<<5)
 289#define PB_FAN_FAN2_FAULT               (1<<6)
 290#define PB_FAN_FAN1_FAULT               (1<<7)
 291
 292/*
 293 * CML_FAULT_STATUS
 294 */
 295#define PB_CML_FAULT_OTHER_MEM_LOGIC    (1<<0)
 296#define PB_CML_FAULT_OTHER_COMM         (1<<1)
 297#define PB_CML_FAULT_PROCESSOR          (1<<3)
 298#define PB_CML_FAULT_MEMORY             (1<<4)
 299#define PB_CML_FAULT_PACKET_ERROR       (1<<5)
 300#define PB_CML_FAULT_INVALID_DATA       (1<<6)
 301#define PB_CML_FAULT_INVALID_COMMAND    (1<<7)
 302
 303enum pmbus_sensor_classes {
 304        PSC_VOLTAGE_IN = 0,
 305        PSC_VOLTAGE_OUT,
 306        PSC_CURRENT_IN,
 307        PSC_CURRENT_OUT,
 308        PSC_POWER,
 309        PSC_TEMPERATURE,
 310        PSC_FAN,
 311        PSC_NUM_CLASSES         /* Number of power sensor classes */
 312};
 313
 314#define PMBUS_PAGES     32      /* Per PMBus specification */
 315
 316/* Functionality bit mask */
 317#define PMBUS_HAVE_VIN          (1 << 0)
 318#define PMBUS_HAVE_VCAP         (1 << 1)
 319#define PMBUS_HAVE_VOUT         (1 << 2)
 320#define PMBUS_HAVE_IIN          (1 << 3)
 321#define PMBUS_HAVE_IOUT         (1 << 4)
 322#define PMBUS_HAVE_PIN          (1 << 5)
 323#define PMBUS_HAVE_POUT         (1 << 6)
 324#define PMBUS_HAVE_FAN12        (1 << 7)
 325#define PMBUS_HAVE_FAN34        (1 << 8)
 326#define PMBUS_HAVE_TEMP         (1 << 9)
 327#define PMBUS_HAVE_TEMP2        (1 << 10)
 328#define PMBUS_HAVE_TEMP3        (1 << 11)
 329#define PMBUS_HAVE_STATUS_VOUT  (1 << 12)
 330#define PMBUS_HAVE_STATUS_IOUT  (1 << 13)
 331#define PMBUS_HAVE_STATUS_INPUT (1 << 14)
 332#define PMBUS_HAVE_STATUS_TEMP  (1 << 15)
 333#define PMBUS_HAVE_STATUS_FAN12 (1 << 16)
 334#define PMBUS_HAVE_STATUS_FAN34 (1 << 17)
 335#define PMBUS_HAVE_VMON         (1 << 18)
 336#define PMBUS_HAVE_STATUS_VMON  (1 << 19)
 337
 338enum pmbus_data_format { linear = 0, direct, vid };
 339
 340struct pmbus_driver_info {
 341        int pages;              /* Total number of pages */
 342        enum pmbus_data_format format[PSC_NUM_CLASSES];
 343        /*
 344         * Support one set of coefficients for each sensor type
 345         * Used for chips providing data in direct mode.
 346         */
 347        int m[PSC_NUM_CLASSES]; /* mantissa for direct data format */
 348        int b[PSC_NUM_CLASSES]; /* offset */
 349        int R[PSC_NUM_CLASSES]; /* exponent */
 350
 351        u32 func[PMBUS_PAGES];  /* Functionality, per page */
 352        /*
 353         * The following functions map manufacturing specific register values
 354         * to PMBus standard register values. Specify only if mapping is
 355         * necessary.
 356         * Functions return the register value (read) or zero (write) if
 357         * successful. A return value of -ENODATA indicates that there is no
 358         * manufacturer specific register, but that a standard PMBus register
 359         * may exist. Any other negative return value indicates that the
 360         * register does not exist, and that no attempt should be made to read
 361         * the standard register.
 362         */
 363        int (*read_byte_data)(struct i2c_client *client, int page, int reg);
 364        int (*read_word_data)(struct i2c_client *client, int page, int reg);
 365        int (*write_word_data)(struct i2c_client *client, int page, int reg,
 366                               u16 word);
 367        int (*write_byte)(struct i2c_client *client, int page, u8 value);
 368        /*
 369         * The identify function determines supported PMBus functionality.
 370         * This function is only necessary if a chip driver supports multiple
 371         * chips, and the chip functionality is not pre-determined.
 372         */
 373        int (*identify)(struct i2c_client *client,
 374                        struct pmbus_driver_info *info);
 375
 376        /* Regulator functionality, if supported by this chip driver. */
 377        int num_regulators;
 378        const struct regulator_desc *reg_desc;
 379};
 380
 381/* Regulator ops */
 382
 383extern struct regulator_ops pmbus_regulator_ops;
 384
 385/* Macro for filling in array of struct regulator_desc */
 386#define PMBUS_REGULATOR(_name, _id)                             \
 387        [_id] = {                                               \
 388                .name = (_name # _id),                          \
 389                .id = (_id),                                    \
 390                .of_match = of_match_ptr(_name # _id),          \
 391                .regulators_node = of_match_ptr("regulators"),  \
 392                .ops = &pmbus_regulator_ops,                    \
 393                .owner = THIS_MODULE,                           \
 394        }
 395
 396/* Function declarations */
 397
 398void pmbus_clear_cache(struct i2c_client *client);
 399int pmbus_set_page(struct i2c_client *client, u8 page);
 400int pmbus_read_word_data(struct i2c_client *client, u8 page, u8 reg);
 401int pmbus_write_word_data(struct i2c_client *client, u8 page, u8 reg, u16 word);
 402int pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg);
 403int pmbus_write_byte(struct i2c_client *client, int page, u8 value);
 404int pmbus_write_byte_data(struct i2c_client *client, int page, u8 reg,
 405                          u8 value);
 406int pmbus_update_byte_data(struct i2c_client *client, int page, u8 reg,
 407                           u8 mask, u8 value);
 408void pmbus_clear_faults(struct i2c_client *client);
 409bool pmbus_check_byte_register(struct i2c_client *client, int page, int reg);
 410bool pmbus_check_word_register(struct i2c_client *client, int page, int reg);
 411int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
 412                   struct pmbus_driver_info *info);
 413int pmbus_do_remove(struct i2c_client *client);
 414const struct pmbus_driver_info *pmbus_get_driver_info(struct i2c_client
 415                                                      *client);
 416
 417#endif /* PMBUS_H */
 418