/* * Identify chip parameters. */ static int pmbus_identify(struct i2c_client *client, struct pmbus_driver_info *info) { int ret = 0; if (!info->pages) { /* * Check if the PAGE command is supported. If it is, * keep setting the page number until it fails or until the * maximum number of pages has been reached. Assume that * this is the number of pages supported by the chip. */ if (pmbus_check_byte_register(client, 0, PMBUS_PAGE)) { int page; for (page = 1; page < PMBUS_PAGES; page++) { if (pmbus_set_page(client, page) < 0) break; } pmbus_set_page(client, 0); info->pages = page; } else { info->pages = 1; } pmbus_clear_faults(client); } if (pmbus_check_byte_register(client, 0, PMBUS_VOUT_MODE)) { int vout_mode; vout_mode = pmbus_read_byte_data(client, 0, PMBUS_VOUT_MODE); if (vout_mode >= 0 && vout_mode != 0xff) { switch (vout_mode >> 5) { case 0: break; case 1: info->format[PSC_VOLTAGE_OUT] = vid; info->vrm_version = vr11; break; case 2: info->format[PSC_VOLTAGE_OUT] = direct; break; default: ret = -ENODEV; goto abort; } } }
static int max34440_read_byte_data(struct i2c_client *client, int page, int reg) { int ret = 0; int mfg_status; if (page >= 0) { ret = pmbus_set_page(client, page); if (ret < 0) return ret; } switch (reg) { case PMBUS_STATUS_IOUT: mfg_status = pmbus_read_word_data(client, 0, PMBUS_STATUS_MFR_SPECIFIC); if (mfg_status < 0) return mfg_status; if (mfg_status & MAX34440_STATUS_OC_WARN) ret |= PB_IOUT_OC_WARNING; if (mfg_status & MAX34440_STATUS_OC_FAULT) ret |= PB_IOUT_OC_FAULT; break; case PMBUS_STATUS_TEMPERATURE: mfg_status = pmbus_read_word_data(client, 0, PMBUS_STATUS_MFR_SPECIFIC); if (mfg_status < 0) return mfg_status; if (mfg_status & MAX34440_STATUS_OT_WARN) ret |= PB_TEMP_OT_WARNING; if (mfg_status & MAX34440_STATUS_OT_FAULT) ret |= PB_TEMP_OT_FAULT; break; default: ret = -ENODATA; break; } return ret; }