::
 
-  int (*read_word_data)(struct i2c_client *client, int page, int reg);
+  int (*read_word_data)(struct i2c_client *client, int page, int phase,
+                        int reg);
 
-Read word from page <page>, register <reg>.
+Read word from page <page>, phase <pase>, register <reg>. If the chip does not
+support multiple phases, the phase parameter can be ignored. If the chip
+supports multiple phases, a phase value of 0xff indicates all phases.
 
 ::
 
 
 ::
 
-  int pmbus_set_page(struct i2c_client *client, u8 page);
+  int pmbus_set_page(struct i2c_client *client, u8 page, u8 phase);
 
-Set PMBus page register to <page> for subsequent commands.
+Set PMBus page register to <page> and <phase> for subsequent commands.
+If the chip does not support multiple phases, the phase parameter is
+ignored. Otherwise, a phase value of 0xff selects all phases.
 
 ::
 
-  int pmbus_read_word_data(struct i2c_client *client, u8 page, u8 reg);
+  int pmbus_read_word_data(struct i2c_client *client, u8 page, u8 phase,
+                           u8 reg);
 
-Read word data from <page>, <reg>. Similar to i2c_smbus_read_word_data(), but
-selects page first.
+Read word data from <page>, <phase>, <reg>. Similar to
+i2c_smbus_read_word_data(), but selects page and phase first. If the chip does
+not support multiple phases, the phase parameter is ignored. Otherwise, a phase
+value of 0xff selects all phases.
 
 ::
 
 
        return ret;
 }
 
-static int adm1275_read_word_data(struct i2c_client *client, int page, int reg)
+static int adm1275_read_word_data(struct i2c_client *client, int page,
+                                 int phase, int reg)
 {
        const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
        const struct adm1275_data *data = to_adm1275_data(info);
        case PMBUS_IOUT_UC_FAULT_LIMIT:
                if (!data->have_uc_fault)
                        return -ENXIO;
-               ret = pmbus_read_word_data(client, 0, ADM1275_IOUT_WARN2_LIMIT);
+               ret = pmbus_read_word_data(client, 0, 0xff,
+                                          ADM1275_IOUT_WARN2_LIMIT);
                break;
        case PMBUS_IOUT_OC_FAULT_LIMIT:
                if (!data->have_oc_fault)
                        return -ENXIO;
-               ret = pmbus_read_word_data(client, 0, ADM1275_IOUT_WARN2_LIMIT);
+               ret = pmbus_read_word_data(client, 0, 0xff,
+                                          ADM1275_IOUT_WARN2_LIMIT);
                break;
        case PMBUS_VOUT_OV_WARN_LIMIT:
                if (data->have_vout)
                        return -ENODATA;
-               ret = pmbus_read_word_data(client, 0,
+               ret = pmbus_read_word_data(client, 0, 0xff,
                                           ADM1075_VAUX_OV_WARN_LIMIT);
                break;
        case PMBUS_VOUT_UV_WARN_LIMIT:
                if (data->have_vout)
                        return -ENODATA;
-               ret = pmbus_read_word_data(client, 0,
+               ret = pmbus_read_word_data(client, 0, 0xff,
                                           ADM1075_VAUX_UV_WARN_LIMIT);
                break;
        case PMBUS_READ_VOUT:
                if (data->have_vout)
                        return -ENODATA;
-               ret = pmbus_read_word_data(client, 0, ADM1075_READ_VAUX);
+               ret = pmbus_read_word_data(client, 0, 0xff,
+                                          ADM1075_READ_VAUX);
                break;
        case PMBUS_VIRT_READ_IOUT_MIN:
                if (!data->have_iout_min)
                        return -ENXIO;
-               ret = pmbus_read_word_data(client, 0, ADM1293_IOUT_MIN);
+               ret = pmbus_read_word_data(client, 0, 0xff,
+                                          ADM1293_IOUT_MIN);
                break;
        case PMBUS_VIRT_READ_IOUT_MAX:
-               ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_IOUT);
+               ret = pmbus_read_word_data(client, 0, 0xff,
+                                          ADM1275_PEAK_IOUT);
                break;
        case PMBUS_VIRT_READ_VOUT_MAX:
-               ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_VOUT);
+               ret = pmbus_read_word_data(client, 0, 0xff,
+                                          ADM1275_PEAK_VOUT);
                break;
        case PMBUS_VIRT_READ_VIN_MAX:
-               ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_VIN);
+               ret = pmbus_read_word_data(client, 0, 0xff,
+                                          ADM1275_PEAK_VIN);
                break;
        case PMBUS_VIRT_READ_PIN_MIN:
                if (!data->have_pin_min)
                        return -ENXIO;
-               ret = pmbus_read_word_data(client, 0, ADM1293_PIN_MIN);
+               ret = pmbus_read_word_data(client, 0, 0xff,
+                                          ADM1293_PIN_MIN);
                break;
        case PMBUS_VIRT_READ_PIN_MAX:
                if (!data->have_pin_max)
                        return -ENXIO;
-               ret = pmbus_read_word_data(client, 0, ADM1276_PEAK_PIN);
+               ret = pmbus_read_word_data(client, 0, 0xff,
+                                          ADM1276_PEAK_PIN);
                break;
        case PMBUS_VIRT_READ_TEMP_MAX:
                if (!data->have_temp_max)
                        return -ENXIO;
-               ret = pmbus_read_word_data(client, 0, ADM1278_PEAK_TEMP);
+               ret = pmbus_read_word_data(client, 0, 0xff,
+                                          ADM1278_PEAK_TEMP);
                break;
        case PMBUS_VIRT_RESET_IOUT_HISTORY:
        case PMBUS_VIRT_RESET_VOUT_HISTORY:
 
        struct ibm_cffps *psu = to_psu(idxp, idx);
        char data[I2C_SMBUS_BLOCK_MAX + 2] = { 0 };
 
-       pmbus_set_page(psu->client, 0);
+       pmbus_set_page(psu->client, 0, 0xff);
 
        switch (idx) {
        case CFFPS_DEBUGFS_INPUT_HISTORY:
 
        switch (idx) {
        case CFFPS_DEBUGFS_ON_OFF_CONFIG:
-               pmbus_set_page(psu->client, 0);
+               pmbus_set_page(psu->client, 0, 0xff);
 
                rc = simple_write_to_buffer(&data, 1, ppos, buf, count);
                if (rc <= 0)
 }
 
 static int ibm_cffps_read_word_data(struct i2c_client *client, int page,
-                                   int reg)
+                                   int phase, int reg)
 {
        int rc, mfr;
 
        switch (reg) {
        case PMBUS_STATUS_WORD:
-               rc = pmbus_read_word_data(client, page, reg);
+               rc = pmbus_read_word_data(client, page, phase, reg);
                if (rc < 0)
                        return rc;
 
                        rc |= PB_STATUS_OFF;
                break;
        case PMBUS_VIRT_READ_VMON:
-               rc = pmbus_read_word_data(client, page, CFFPS_12VCS_VOUT_CMD);
+               rc = pmbus_read_word_data(client, page, phase,
+                                         CFFPS_12VCS_VOUT_CMD);
                break;
        default:
                rc = -ENODATA;
        dev_dbg(&psu->client->dev, "LED brightness set: %d. Command: %d.\n",
                brightness, next_led_state);
 
-       pmbus_set_page(psu->client, 0);
+       pmbus_set_page(psu->client, 0, 0xff);
 
        rc = i2c_smbus_write_byte_data(psu->client, CFFPS_SYS_CONFIG_CMD,
                                       next_led_state);
 
        dev_dbg(&psu->client->dev, "LED blink set.\n");
 
-       pmbus_set_page(psu->client, 0);
+       pmbus_set_page(psu->client, 0, 0xff);
 
        rc = i2c_smbus_write_byte_data(psu->client, CFFPS_SYS_CONFIG_CMD,
                                       CFFPS_LED_BLINK);
 
 #define IR35221_MFR_IOUT_VALLEY                0xcb
 #define IR35221_MFR_TEMP_VALLEY                0xcc
 
-static int ir35221_read_word_data(struct i2c_client *client, int page, int reg)
+static int ir35221_read_word_data(struct i2c_client *client, int page,
+                                 int phase, int reg)
 {
        int ret;
 
        switch (reg) {
        case PMBUS_VIRT_READ_VIN_MAX:
-               ret = pmbus_read_word_data(client, page, IR35221_MFR_VIN_PEAK);
+               ret = pmbus_read_word_data(client, page, phase,
+                                          IR35221_MFR_VIN_PEAK);
                break;
        case PMBUS_VIRT_READ_VOUT_MAX:
-               ret = pmbus_read_word_data(client, page, IR35221_MFR_VOUT_PEAK);
+               ret = pmbus_read_word_data(client, page, phase,
+                                          IR35221_MFR_VOUT_PEAK);
                break;
        case PMBUS_VIRT_READ_IOUT_MAX:
-               ret = pmbus_read_word_data(client, page, IR35221_MFR_IOUT_PEAK);
+               ret = pmbus_read_word_data(client, page, phase,
+                                          IR35221_MFR_IOUT_PEAK);
                break;
        case PMBUS_VIRT_READ_TEMP_MAX:
-               ret = pmbus_read_word_data(client, page, IR35221_MFR_TEMP_PEAK);
+               ret = pmbus_read_word_data(client, page, phase,
+                                          IR35221_MFR_TEMP_PEAK);
                break;
        case PMBUS_VIRT_READ_VIN_MIN:
-               ret = pmbus_read_word_data(client, page,
+               ret = pmbus_read_word_data(client, page, phase,
                                           IR35221_MFR_VIN_VALLEY);
                break;
        case PMBUS_VIRT_READ_VOUT_MIN:
-               ret = pmbus_read_word_data(client, page,
+               ret = pmbus_read_word_data(client, page, phase,
                                           IR35221_MFR_VOUT_VALLEY);
                break;
        case PMBUS_VIRT_READ_IOUT_MIN:
-               ret = pmbus_read_word_data(client, page,
+               ret = pmbus_read_word_data(client, page, phase,
                                           IR35221_MFR_IOUT_VALLEY);
                break;
        case PMBUS_VIRT_READ_TEMP_MIN:
-               ret = pmbus_read_word_data(client, page,
+               ret = pmbus_read_word_data(client, page, phase,
                                           IR35221_MFR_TEMP_VALLEY);
                break;
        default:
 
         * enabling AVS control is the workaround.
         */
        if (op_val == ISL68137_VOUT_AVS) {
-               rc = pmbus_read_word_data(client, page, PMBUS_VOUT_COMMAND);
+               rc = pmbus_read_word_data(client, page, 0xff,
+                                         PMBUS_VOUT_COMMAND);
                if (rc < 0)
                        return rc;
 
 
 
 #define to_lm25066_data(x)  container_of(x, struct lm25066_data, info)
 
-static int lm25066_read_word_data(struct i2c_client *client, int page, int reg)
+static int lm25066_read_word_data(struct i2c_client *client, int page,
+                                 int phase, int reg)
 {
        const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
        const struct lm25066_data *data = to_lm25066_data(info);
 
        switch (reg) {
        case PMBUS_VIRT_READ_VMON:
-               ret = pmbus_read_word_data(client, 0, LM25066_READ_VAUX);
+               ret = pmbus_read_word_data(client, 0, 0xff, LM25066_READ_VAUX);
                if (ret < 0)
                        break;
                /* Adjust returned value to match VIN coefficients */
                }
                break;
        case PMBUS_READ_IIN:
-               ret = pmbus_read_word_data(client, 0, LM25066_MFR_READ_IIN);
+               ret = pmbus_read_word_data(client, 0, 0xff,
+                                          LM25066_MFR_READ_IIN);
                break;
        case PMBUS_READ_PIN:
-               ret = pmbus_read_word_data(client, 0, LM25066_MFR_READ_PIN);
+               ret = pmbus_read_word_data(client, 0, 0xff,
+                                          LM25066_MFR_READ_PIN);
                break;
        case PMBUS_IIN_OC_WARN_LIMIT:
-               ret = pmbus_read_word_data(client, 0,
+               ret = pmbus_read_word_data(client, 0, 0xff,
                                           LM25066_MFR_IIN_OC_WARN_LIMIT);
                break;
        case PMBUS_PIN_OP_WARN_LIMIT:
-               ret = pmbus_read_word_data(client, 0,
+               ret = pmbus_read_word_data(client, 0, 0xff,
                                           LM25066_MFR_PIN_OP_WARN_LIMIT);
                break;
        case PMBUS_VIRT_READ_VIN_AVG:
-               ret = pmbus_read_word_data(client, 0, LM25066_READ_AVG_VIN);
+               ret = pmbus_read_word_data(client, 0, 0xff,
+                                          LM25066_READ_AVG_VIN);
                break;
        case PMBUS_VIRT_READ_VOUT_AVG:
-               ret = pmbus_read_word_data(client, 0, LM25066_READ_AVG_VOUT);
+               ret = pmbus_read_word_data(client, 0, 0xff,
+                                          LM25066_READ_AVG_VOUT);
                break;
        case PMBUS_VIRT_READ_IIN_AVG:
-               ret = pmbus_read_word_data(client, 0, LM25066_READ_AVG_IIN);
+               ret = pmbus_read_word_data(client, 0, 0xff,
+                                          LM25066_READ_AVG_IIN);
                break;
        case PMBUS_VIRT_READ_PIN_AVG:
-               ret = pmbus_read_word_data(client, 0, LM25066_READ_AVG_PIN);
+               ret = pmbus_read_word_data(client, 0, 0xff,
+                                          LM25066_READ_AVG_PIN);
                break;
        case PMBUS_VIRT_READ_PIN_MAX:
-               ret = pmbus_read_word_data(client, 0, LM25066_READ_PIN_PEAK);
+               ret = pmbus_read_word_data(client, 0, 0xff,
+                                          LM25066_READ_PIN_PEAK);
                break;
        case PMBUS_VIRT_RESET_PIN_HISTORY:
                ret = 0;
        return ret;
 }
 
-static int lm25056_read_word_data(struct i2c_client *client, int page, int reg)
+static int lm25056_read_word_data(struct i2c_client *client, int page,
+                                 int phase, int reg)
 {
        int ret;
 
        switch (reg) {
        case PMBUS_VIRT_VMON_UV_WARN_LIMIT:
-               ret = pmbus_read_word_data(client, 0,
+               ret = pmbus_read_word_data(client, 0, 0xff,
                                           LM25056_VAUX_UV_WARN_LIMIT);
                if (ret < 0)
                        break;
                ret = DIV_ROUND_CLOSEST(ret * 293, 6140);
                break;
        case PMBUS_VIRT_VMON_OV_WARN_LIMIT:
-               ret = pmbus_read_word_data(client, 0,
+               ret = pmbus_read_word_data(client, 0, 0xff,
                                           LM25056_VAUX_OV_WARN_LIMIT);
                if (ret < 0)
                        break;
                ret = DIV_ROUND_CLOSEST(ret * 293, 6140);
                break;
        default:
-               ret = lm25066_read_word_data(client, page, reg);
+               ret = lm25066_read_word_data(client, page, phase, reg);
                break;
        }
        return ret;
 
        return -ETIMEDOUT;
 }
 
-static int ltc_read_word_data(struct i2c_client *client, int page, int reg)
+static int ltc_read_word_data(struct i2c_client *client, int page, int phase,
+                             int reg)
 {
        int ret;
 
        if (ret < 0)
                return ret;
 
-       return pmbus_read_word_data(client, page, reg);
+       return pmbus_read_word_data(client, page, 0xff, reg);
 }
 
 static int ltc_read_byte_data(struct i2c_client *client, int page, int reg)
 {
        int ret;
 
-       ret = ltc_read_word_data(client, page, reg);
+       ret = ltc_read_word_data(client, page, 0xff, reg);
        if (ret >= 0) {
                if (lin11_to_val(ret) > lin11_to_val(*pmax))
                        *pmax = ret;
 {
        int ret;
 
-       ret = ltc_read_word_data(client, page, reg);
+       ret = ltc_read_word_data(client, page, 0xff, reg);
        if (ret >= 0) {
                if (lin11_to_val(ret) < lin11_to_val(*pmin))
                        *pmin = ret;
                                  &data->vin_max);
                break;
        case PMBUS_VIRT_READ_VOUT_MAX:
-               ret = ltc_read_word_data(client, page, LTC2978_MFR_VOUT_PEAK);
+               ret = ltc_read_word_data(client, page, 0xff,
+                                        LTC2978_MFR_VOUT_PEAK);
                if (ret >= 0) {
                        /*
                         * VOUT is 16 bit unsigned with fixed exponent,
        return ret;
 }
 
-static int ltc2978_read_word_data(struct i2c_client *client, int page, int reg)
+static int ltc2978_read_word_data(struct i2c_client *client, int page,
+                                 int phase, int reg)
 {
        const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
        struct ltc2978_data *data = to_ltc2978_data(info);
                                  &data->vin_min);
                break;
        case PMBUS_VIRT_READ_VOUT_MIN:
-               ret = ltc_read_word_data(client, page, LTC2978_MFR_VOUT_MIN);
+               ret = ltc_read_word_data(client, page, phase,
+                                        LTC2978_MFR_VOUT_MIN);
                if (ret >= 0) {
                        /*
                         * VOUT_MIN is known to not be supported on some lots
        return ret;
 }
 
-static int ltc2974_read_word_data(struct i2c_client *client, int page, int reg)
+static int ltc2974_read_word_data(struct i2c_client *client, int page,
+                                 int phase, int reg)
 {
        const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
        struct ltc2978_data *data = to_ltc2978_data(info);
                ret = 0;
                break;
        default:
-               ret = ltc2978_read_word_data(client, page, reg);
+               ret = ltc2978_read_word_data(client, page, phase, reg);
                break;
        }
        return ret;
 }
 
-static int ltc2975_read_word_data(struct i2c_client *client, int page, int reg)
+static int ltc2975_read_word_data(struct i2c_client *client, int page,
+                                 int phase, int reg)
 {
        const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
        struct ltc2978_data *data = to_ltc2978_data(info);
                ret = 0;
                break;
        default:
-               ret = ltc2978_read_word_data(client, page, reg);
+               ret = ltc2978_read_word_data(client, page, phase, reg);
                break;
        }
        return ret;
 }
 
-static int ltc3880_read_word_data(struct i2c_client *client, int page, int reg)
+static int ltc3880_read_word_data(struct i2c_client *client, int page,
+                                 int phase, int reg)
 {
        const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
        struct ltc2978_data *data = to_ltc2978_data(info);
        return ret;
 }
 
-static int ltc3883_read_word_data(struct i2c_client *client, int page, int reg)
+static int ltc3883_read_word_data(struct i2c_client *client, int page,
+                                 int phase, int reg)
 {
        const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
        struct ltc2978_data *data = to_ltc2978_data(info);
                ret = 0;
                break;
        default:
-               ret = ltc3880_read_word_data(client, page, reg);
+               ret = ltc3880_read_word_data(client, page, phase, reg);
                break;
        }
        return ret;
 
                 * LTC3815 does not support the CLEAR_FAULTS command.
                 * Emulate it by clearing the status register.
                 */
-               ret = pmbus_read_word_data(client, 0, PMBUS_STATUS_WORD);
+               ret = pmbus_read_word_data(client, 0, 0xff, PMBUS_STATUS_WORD);
                if (ret > 0) {
                        pmbus_write_word_data(client, 0, PMBUS_STATUS_WORD,
                                              ret);
        return ret;
 }
 
-static int ltc3815_read_word_data(struct i2c_client *client, int page, int reg)
+static int ltc3815_read_word_data(struct i2c_client *client, int page,
+                                 int phase, int reg)
 {
        int ret;
 
        switch (reg) {
        case PMBUS_VIRT_READ_VIN_MAX:
-               ret = pmbus_read_word_data(client, page, LTC3815_MFR_VIN_PEAK);
+               ret = pmbus_read_word_data(client, page, phase,
+                                          LTC3815_MFR_VIN_PEAK);
                break;
        case PMBUS_VIRT_READ_VOUT_MAX:
-               ret = pmbus_read_word_data(client, page, LTC3815_MFR_VOUT_PEAK);
+               ret = pmbus_read_word_data(client, page, phase,
+                                          LTC3815_MFR_VOUT_PEAK);
                break;
        case PMBUS_VIRT_READ_TEMP_MAX:
-               ret = pmbus_read_word_data(client, page, LTC3815_MFR_TEMP_PEAK);
+               ret = pmbus_read_word_data(client, page, phase,
+                                          LTC3815_MFR_TEMP_PEAK);
                break;
        case PMBUS_VIRT_READ_IOUT_MAX:
-               ret = pmbus_read_word_data(client, page, LTC3815_MFR_IOUT_PEAK);
+               ret = pmbus_read_word_data(client, page, phase,
+                                          LTC3815_MFR_IOUT_PEAK);
                break;
        case PMBUS_VIRT_READ_IIN_MAX:
-               ret = pmbus_read_word_data(client, page, LTC3815_MFR_IIN_PEAK);
+               ret = pmbus_read_word_data(client, page, phase,
+                                          LTC3815_MFR_IIN_PEAK);
                break;
        case PMBUS_VIRT_RESET_VOUT_HISTORY:
        case PMBUS_VIRT_RESET_VIN_HISTORY:
 
 #define MAX16064_MFR_VOUT_PEAK         0xd4
 #define MAX16064_MFR_TEMPERATURE_PEAK  0xd6
 
-static int max16064_read_word_data(struct i2c_client *client, int page, int reg)
+static int max16064_read_word_data(struct i2c_client *client, int page,
+                                  int phase, int reg)
 {
        int ret;
 
        switch (reg) {
        case PMBUS_VIRT_READ_VOUT_MAX:
-               ret = pmbus_read_word_data(client, page,
+               ret = pmbus_read_word_data(client, page, phase,
                                           MAX16064_MFR_VOUT_PEAK);
                break;
        case PMBUS_VIRT_READ_TEMP_MAX:
-               ret = pmbus_read_word_data(client, page,
+               ret = pmbus_read_word_data(client, page, phase,
                                           MAX16064_MFR_TEMPERATURE_PEAK);
                break;
        case PMBUS_VIRT_RESET_VOUT_HISTORY:
 
        [max20743] = { 18900, 24100, 29200, 34100 },
 };
 
-static int max20730_read_word_data(struct i2c_client *client, int page, int reg)
+static int max20730_read_word_data(struct i2c_client *client, int page,
+                                  int phase, int reg)
 {
        const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
        const struct max20730_data *data = to_max20730_data(info);
 
 
        cmdbuf[0] = reg;
 
-       rc = pmbus_set_page(client, page);
+       rc = pmbus_set_page(client, page, 0xff);
        if (rc < 0)
                return rc;
 
        if (config < 0)
                return config;
 
-       command = pmbus_read_word_data(client, page, PMBUS_FAN_COMMAND_1);
+       command = pmbus_read_word_data(client, page, 0xff, PMBUS_FAN_COMMAND_1);
        if (command < 0)
                return command;
 
 }
 
 static int max31785_read_word_data(struct i2c_client *client, int page,
-                                  int reg)
+                                  int phase, int reg)
 {
        u32 val;
        int rv;
 
 
 #define to_max34440_data(x)  container_of(x, struct max34440_data, info)
 
-static int max34440_read_word_data(struct i2c_client *client, int page, int reg)
+static int max34440_read_word_data(struct i2c_client *client, int page,
+                                  int phase, int reg)
 {
        int ret;
        const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
 
        switch (reg) {
        case PMBUS_VIRT_READ_VOUT_MIN:
-               ret = pmbus_read_word_data(client, page,
+               ret = pmbus_read_word_data(client, page, phase,
                                           MAX34440_MFR_VOUT_MIN);
                break;
        case PMBUS_VIRT_READ_VOUT_MAX:
-               ret = pmbus_read_word_data(client, page,
+               ret = pmbus_read_word_data(client, page, phase,
                                           MAX34440_MFR_VOUT_PEAK);
                break;
        case PMBUS_VIRT_READ_IOUT_AVG:
                if (data->id != max34446 && data->id != max34451)
                        return -ENXIO;
-               ret = pmbus_read_word_data(client, page,
+               ret = pmbus_read_word_data(client, page, phase,
                                           MAX34446_MFR_IOUT_AVG);
                break;
        case PMBUS_VIRT_READ_IOUT_MAX:
-               ret = pmbus_read_word_data(client, page,
+               ret = pmbus_read_word_data(client, page, phase,
                                           MAX34440_MFR_IOUT_PEAK);
                break;
        case PMBUS_VIRT_READ_POUT_AVG:
                if (data->id != max34446)
                        return -ENXIO;
-               ret = pmbus_read_word_data(client, page,
+               ret = pmbus_read_word_data(client, page, phase,
                                           MAX34446_MFR_POUT_AVG);
                break;
        case PMBUS_VIRT_READ_POUT_MAX:
                if (data->id != max34446)
                        return -ENXIO;
-               ret = pmbus_read_word_data(client, page,
+               ret = pmbus_read_word_data(client, page, phase,
                                           MAX34446_MFR_POUT_PEAK);
                break;
        case PMBUS_VIRT_READ_TEMP_AVG:
                if (data->id != max34446 && data->id != max34460 &&
                    data->id != max34461)
                        return -ENXIO;
-               ret = pmbus_read_word_data(client, page,
+               ret = pmbus_read_word_data(client, page, phase,
                                           MAX34446_MFR_TEMPERATURE_AVG);
                break;
        case PMBUS_VIRT_READ_TEMP_MAX:
-               ret = pmbus_read_word_data(client, page,
+               ret = pmbus_read_word_data(client, page, phase,
                                           MAX34440_MFR_TEMPERATURE_PEAK);
                break;
        case PMBUS_VIRT_RESET_POUT_HISTORY:
        int mfg_status;
 
        if (page >= 0) {
-               ret = pmbus_set_page(client, page);
+               ret = pmbus_set_page(client, page, 0xff);
                if (ret < 0)
                        return ret;
        }
 
        switch (reg) {
        case PMBUS_STATUS_IOUT:
-               mfg_status = pmbus_read_word_data(client, 0,
+               mfg_status = pmbus_read_word_data(client, 0, 0xff,
                                                  PMBUS_STATUS_MFR_SPECIFIC);
                if (mfg_status < 0)
                        return mfg_status;
                        ret |= PB_IOUT_OC_FAULT;
                break;
        case PMBUS_STATUS_TEMPERATURE:
-               mfg_status = pmbus_read_word_data(client, 0,
+               mfg_status = pmbus_read_word_data(client, 0, 0xff,
                                                  PMBUS_STATUS_MFR_SPECIFIC);
                if (mfg_status < 0)
                        return mfg_status;
 
 #define MAX8688_STATUS_OT_FAULT                BIT(13)
 #define MAX8688_STATUS_OT_WARNING      BIT(14)
 
-static int max8688_read_word_data(struct i2c_client *client, int page, int reg)
+static int max8688_read_word_data(struct i2c_client *client, int page,
+                                 int phase, int reg)
 {
        int ret;
 
 
        switch (reg) {
        case PMBUS_VIRT_READ_VOUT_MAX:
-               ret = pmbus_read_word_data(client, 0, MAX8688_MFR_VOUT_PEAK);
+               ret = pmbus_read_word_data(client, 0, 0xff,
+                                          MAX8688_MFR_VOUT_PEAK);
                break;
        case PMBUS_VIRT_READ_IOUT_MAX:
-               ret = pmbus_read_word_data(client, 0, MAX8688_MFR_IOUT_PEAK);
+               ret = pmbus_read_word_data(client, 0, 0xff,
+                                          MAX8688_MFR_IOUT_PEAK);
                break;
        case PMBUS_VIRT_READ_TEMP_MAX:
-               ret = pmbus_read_word_data(client, 0,
+               ret = pmbus_read_word_data(client, 0, 0xff,
                                           MAX8688_MFR_TEMPERATURE_PEAK);
                break;
        case PMBUS_VIRT_RESET_VOUT_HISTORY:
 
        switch (reg) {
        case PMBUS_STATUS_VOUT:
-               mfg_status = pmbus_read_word_data(client, 0,
+               mfg_status = pmbus_read_word_data(client, 0, 0xff,
                                                  MAX8688_MFG_STATUS);
                if (mfg_status < 0)
                        return mfg_status;
                        ret |= PB_VOLTAGE_OV_FAULT;
                break;
        case PMBUS_STATUS_IOUT:
-               mfg_status = pmbus_read_word_data(client, 0,
+               mfg_status = pmbus_read_word_data(client, 0, 0xff,
                                                  MAX8688_MFG_STATUS);
                if (mfg_status < 0)
                        return mfg_status;
                        ret |= PB_IOUT_OC_FAULT;
                break;
        case PMBUS_STATUS_TEMPERATURE:
-               mfg_status = pmbus_read_word_data(client, 0,
+               mfg_status = pmbus_read_word_data(client, 0, 0xff,
                                                  MAX8688_MFG_STATUS);
                if (mfg_status < 0)
                        return mfg_status;
 
                        int page;
 
                        for (page = 1; page < PMBUS_PAGES; page++) {
-                               if (pmbus_set_page(client, page) < 0)
+                               if (pmbus_set_page(client, page, 0xff) < 0)
                                        break;
                        }
-                       pmbus_set_page(client, 0);
+                       pmbus_set_page(client, 0, 0xff);
                        info->pages = page;
                } else {
                        info->pages = 1;
 
         * the standard register.
         */
        int (*read_byte_data)(struct i2c_client *client, int page, int reg);
-       int (*read_word_data)(struct i2c_client *client, int page, int reg);
+       int (*read_word_data)(struct i2c_client *client, int page, int phase,
+                             int reg);
        int (*write_word_data)(struct i2c_client *client, int page, int reg,
                               u16 word);
        int (*write_byte)(struct i2c_client *client, int page, u8 value);
 /* Function declarations */
 
 void pmbus_clear_cache(struct i2c_client *client);
-int pmbus_set_page(struct i2c_client *client, int page);
-int pmbus_read_word_data(struct i2c_client *client, int page, u8 reg);
-int pmbus_write_word_data(struct i2c_client *client, int page, u8 reg, u16 word);
+int pmbus_set_page(struct i2c_client *client, int page, int phase);
+int pmbus_read_word_data(struct i2c_client *client, int page, int phase,
+                        u8 reg);
+int pmbus_write_word_data(struct i2c_client *client, int page, u8 reg,
+                         u16 word);
 int pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg);
 int pmbus_write_byte(struct i2c_client *client, int page, u8 value);
 int pmbus_write_byte_data(struct i2c_client *client, int page, u8 reg,
 
 }
 EXPORT_SYMBOL_GPL(pmbus_clear_cache);
 
-int pmbus_set_page(struct i2c_client *client, int page)
+int pmbus_set_page(struct i2c_client *client, int page, int phase)
 {
        struct pmbus_data *data = i2c_get_clientdata(client);
        int rv;
 {
        int rv;
 
-       rv = pmbus_set_page(client, page);
+       rv = pmbus_set_page(client, page, 0xff);
        if (rv < 0)
                return rv;
 
 {
        int rv;
 
-       rv = pmbus_set_page(client, page);
+       rv = pmbus_set_page(client, page, 0xff);
        if (rv < 0)
                return rv;
 
 }
 EXPORT_SYMBOL_GPL(pmbus_update_fan);
 
-int pmbus_read_word_data(struct i2c_client *client, int page, u8 reg)
+int pmbus_read_word_data(struct i2c_client *client, int page, int phase, u8 reg)
 {
        int rv;
 
-       rv = pmbus_set_page(client, page);
+       rv = pmbus_set_page(client, page, phase);
        if (rv < 0)
                return rv;
 
  * _pmbus_read_word_data() is similar to pmbus_read_word_data(), but checks if
  * a device specific mapping function exists and calls it if necessary.
  */
-static int _pmbus_read_word_data(struct i2c_client *client, int page, int reg)
+static int _pmbus_read_word_data(struct i2c_client *client, int page,
+                                int phase, int reg)
 {
        struct pmbus_data *data = i2c_get_clientdata(client);
        const struct pmbus_driver_info *info = data->info;
        int status;
 
        if (info->read_word_data) {
-               status = info->read_word_data(client, page, reg);
+               status = info->read_word_data(client, page, phase, reg);
                if (status != -ENODATA)
                        return status;
        }
        if (reg >= PMBUS_VIRT_BASE)
                return pmbus_read_virt_reg(client, page, reg);
 
-       return pmbus_read_word_data(client, page, reg);
+       return pmbus_read_word_data(client, page, phase, reg);
+}
+
+/* Same as above, but without phase parameter, for use in check functions */
+static int __pmbus_read_word_data(struct i2c_client *client, int page, int reg)
+{
+       return _pmbus_read_word_data(client, page, 0xff, reg);
 }
 
 int pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg)
 {
        int rv;
 
-       rv = pmbus_set_page(client, page);
+       rv = pmbus_set_page(client, page, 0xff);
        if (rv < 0)
                return rv;
 
 {
        int rv;
 
-       rv = pmbus_set_page(client, page);
+       rv = pmbus_set_page(client, page, 0xff);
        if (rv < 0)
                return rv;
 
 
        have_rpm = !!(config & pmbus_fan_rpm_mask[id]);
        if (want_rpm == have_rpm)
-               return pmbus_read_word_data(client, page,
+               return pmbus_read_word_data(client, page, 0xff,
                                            pmbus_fan_command_registers[id]);
 
        /* Can't sensibly map between RPM and PWM, just return zero */
 
 bool pmbus_check_word_register(struct i2c_client *client, int page, int reg)
 {
-       return pmbus_check_register(client, _pmbus_read_word_data, page, reg);
+       return pmbus_check_register(client, __pmbus_read_word_data, page, reg);
 }
 EXPORT_SYMBOL_GPL(pmbus_check_word_register);
 
                                sensor->data
                                    = _pmbus_read_word_data(client,
                                                            sensor->page,
+                                                           0xff,
                                                            sensor->reg);
                }
                pmbus_clear_faults(client);
        struct i2c_client *client = to_i2c_client(dev->parent);
        struct pmbus_samples_reg *reg = to_samples_reg(devattr);
 
-       val = _pmbus_read_word_data(client, reg->page, reg->attr->reg);
+       val = _pmbus_read_word_data(client, reg->page, 0xff, reg->attr->reg);
        if (val < 0)
                return val;
 
 
 static int pmbus_read_status_word(struct i2c_client *client, int page)
 {
-       return _pmbus_read_word_data(client, page, PMBUS_STATUS_WORD);
+       return _pmbus_read_word_data(client, page, 0xff, PMBUS_STATUS_WORD);
 }
 
 static int pmbus_init_common(struct i2c_client *client, struct pmbus_data *data,
 
 #ifdef CONFIG_DEBUG_FS
 static int ucd9000_get_mfr_status(struct i2c_client *client, u8 *buffer)
 {
-       int ret = pmbus_set_page(client, 0);
+       int ret = pmbus_set_page(client, 0, 0xff);
 
        if (ret < 0)
                return ret;
 
 #define XDPE122_AMD_625MV              0x10 /* AMD mode 6.25mV */
 #define XDPE122_PAGE_NUM               2
 
-static int xdpe122_read_word_data(struct i2c_client *client, int page, int reg)
+static int xdpe122_read_word_data(struct i2c_client *client, int page,
+                                 int phase, int reg)
 {
        const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
        long val;
        switch (reg) {
        case PMBUS_VOUT_OV_FAULT_LIMIT:
        case PMBUS_VOUT_UV_FAULT_LIMIT:
-               ret = pmbus_read_word_data(client, page, reg);
+               ret = pmbus_read_word_data(client, page, phase, reg);
                if (ret < 0)
                        return ret;
 
 
        }
 }
 
-static int zl6100_read_word_data(struct i2c_client *client, int page, int reg)
+static int zl6100_read_word_data(struct i2c_client *client, int page,
+                                int phase, int reg)
 {
        const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
        struct zl6100_data *data = to_zl6100_data(info);
        }
 
        zl6100_wait(data);
-       ret = pmbus_read_word_data(client, page, vreg);
+       ret = pmbus_read_word_data(client, page, phase, vreg);
        data->access = ktime_get();
        if (ret < 0)
                return ret;