char name[PMBUS_NAME_SIZE];     /* sysfs sensor name */
        struct device_attribute attribute;
        u8 page;                /* page number */
+       u8 phase;               /* phase number, 0xff for all phases */
        u16 reg;                /* register */
        enum pmbus_sensor_classes class;        /* sensor class */
        bool update;            /* runtime sensor update needed */
        int (*read_status)(struct i2c_client *client, int page);
 
        u8 currpage;
+       u8 currphase;   /* current phase, 0xff for all */
 };
 
 struct pmbus_debugfs_entry {
        struct pmbus_data *data = i2c_get_clientdata(client);
        int rv;
 
-       if (page < 0 || page == data->currpage)
+       if (page < 0)
                return 0;
 
-       if (!(data->info->func[page] & PMBUS_PAGE_VIRTUAL)) {
+       if (!(data->info->func[page] & PMBUS_PAGE_VIRTUAL) &&
+           data->info->pages > 1 && page != data->currpage) {
                rv = i2c_smbus_write_byte_data(client, PMBUS_PAGE, page);
                if (rv < 0)
                        return rv;
                if (rv != page)
                        return -EIO;
        }
-
        data->currpage = page;
 
+       if (data->info->phases[page] && data->currphase != phase &&
+           !(data->info->func[page] & PMBUS_PHASE_VIRTUAL)) {
+               rv = i2c_smbus_write_byte_data(client, PMBUS_PHASE,
+                                              phase);
+               if (rv)
+                       return rv;
+       }
+       data->currphase = phase;
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(pmbus_set_page);
                                sensor->data
                                    = _pmbus_read_word_data(client,
                                                            sensor->page,
-                                                           0xff,
+                                                           sensor->phase,
                                                            sensor->reg);
                }
                pmbus_clear_faults(client);
 
 static struct pmbus_sensor *pmbus_add_sensor(struct pmbus_data *data,
                                             const char *name, const char *type,
-                                            int seq, int page, int reg,
+                                            int seq, int page, int phase,
+                                            int reg,
                                             enum pmbus_sensor_classes class,
                                             bool update, bool readonly,
                                             bool convert)
                readonly = true;
 
        sensor->page = page;
+       sensor->phase = phase;
        sensor->reg = reg;
        sensor->class = class;
        sensor->update = update;
 
 static int pmbus_add_label(struct pmbus_data *data,
                           const char *name, int seq,
-                          const char *lstring, int index)
+                          const char *lstring, int index, int phase)
 {
        struct pmbus_label *label;
        struct device_attribute *a;
        a = &label->attribute;
 
        snprintf(label->name, sizeof(label->name), "%s%d_label", name, seq);
-       if (!index)
-               strncpy(label->label, lstring, sizeof(label->label) - 1);
-       else
-               snprintf(label->label, sizeof(label->label), "%s%d", lstring,
-                        index);
+       if (!index) {
+               if (phase == 0xff)
+                       strncpy(label->label, lstring,
+                               sizeof(label->label) - 1);
+               else
+                       snprintf(label->label, sizeof(label->label), "%s.%d",
+                                lstring, phase);
+       } else {
+               if (phase == 0xff)
+                       snprintf(label->label, sizeof(label->label), "%s%d",
+                                lstring, index);
+               else
+                       snprintf(label->label, sizeof(label->label), "%s%d.%d",
+                                lstring, index, phase);
+       }
 
        pmbus_dev_attr_init(a, label->name, 0444, pmbus_show_label, NULL);
        return pmbus_add_attribute(data, &a->attr);
        for (i = 0; i < nlimit; i++) {
                if (pmbus_check_word_register(client, page, l->reg)) {
                        curr = pmbus_add_sensor(data, name, l->attr, index,
-                                               page, l->reg, attr->class,
+                                               page, 0xff, l->reg, attr->class,
                                                attr->update || l->update,
                                                false, true);
                        if (!curr)
                                      struct pmbus_data *data,
                                      const struct pmbus_driver_info *info,
                                      const char *name,
-                                     int index, int page,
+                                     int index, int page, int phase,
                                      const struct pmbus_sensor_attr *attr,
                                      bool paged)
 {
 
        if (attr->label) {
                ret = pmbus_add_label(data, name, index, attr->label,
-                                     paged ? page + 1 : 0);
+                                     paged ? page + 1 : 0, phase);
                if (ret)
                        return ret;
        }
-       base = pmbus_add_sensor(data, name, "input", index, page, attr->reg,
-                               attr->class, true, true, true);
+       base = pmbus_add_sensor(data, name, "input", index, page, phase,
+                               attr->reg, attr->class, true, true, true);
        if (!base)
                return -ENOMEM;
-       if (attr->sfunc) {
+       /* No limit and alarm attributes for phase specific sensors */
+       if (attr->sfunc && phase == 0xff) {
                ret = pmbus_add_limit_attrs(client, data, info, name,
                                            index, page, base, attr);
                if (ret < 0)
                                continue;
                        ret = pmbus_add_sensor_attrs_one(client, data, info,
                                                         name, index, page,
-                                                        attrs, paged);
+                                                        0xff, attrs, paged);
                        if (ret)
                                return ret;
                        index++;
+                       if (info->phases[page]) {
+                               int phase;
+
+                               for (phase = 0; phase < info->phases[page];
+                                    phase++) {
+                                       if (!(info->pfunc[phase] & attrs->func))
+                                               continue;
+                                       ret = pmbus_add_sensor_attrs_one(client,
+                                               data, info, name, index, page,
+                                               phase, attrs, paged);
+                                       if (ret)
+                                               return ret;
+                                       index++;
+                               }
+                       }
                }
                attrs++;
        }
        struct pmbus_sensor *sensor;
 
        sensor = pmbus_add_sensor(data, "fan", "target", index, page,
-                                 PMBUS_VIRT_FAN_TARGET_1 + id, PSC_FAN,
+                                 PMBUS_VIRT_FAN_TARGET_1 + id, 0xff, PSC_FAN,
                                  false, false, true);
 
        if (!sensor)
                return 0;
 
        sensor = pmbus_add_sensor(data, "pwm", NULL, index, page,
-                                 PMBUS_VIRT_PWM_1 + id, PSC_PWM,
+                                 PMBUS_VIRT_PWM_1 + id, 0xff, PSC_PWM,
                                  false, false, true);
 
        if (!sensor)
                return -ENOMEM;
 
        sensor = pmbus_add_sensor(data, "pwm", "enable", index, page,
-                                 PMBUS_VIRT_PWM_ENABLE_1 + id, PSC_PWM,
+                                 PMBUS_VIRT_PWM_ENABLE_1 + id, 0xff, PSC_PWM,
                                  true, false, false);
 
        if (!sensor)
                                continue;
 
                        if (pmbus_add_sensor(data, "fan", "input", index,
-                                            page, pmbus_fan_registers[f],
+                                            page, pmbus_fan_registers[f], 0xff,
                                             PSC_FAN, true, true, true) == NULL)
                                return -ENOMEM;
 
        if (pdata)
                data->flags = pdata->flags;
        data->info = info;
+       data->currpage = 0xff;
+       data->currphase = 0xfe;
 
        ret = pmbus_init_common(client, data, info);
        if (ret < 0)