static int adm1275_probe(struct i2c_client *client, const struct i2c_device_id *id) { int config; int ret; struct pmbus_driver_info *info; if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BYTE_DATA)) return -ENODEV; info = kzalloc(sizeof(struct pmbus_driver_info), GFP_KERNEL); if (!info) return -ENOMEM; config = i2c_smbus_read_byte_data(client, ADM1275_PMON_CONFIG); if (config < 0) { ret = config; goto err_mem; } info->pages = 1; info->direct[PSC_VOLTAGE_IN] = true; info->direct[PSC_VOLTAGE_OUT] = true; info->direct[PSC_CURRENT_OUT] = true; info->m[PSC_CURRENT_OUT] = 800; info->b[PSC_CURRENT_OUT] = 20475; info->R[PSC_CURRENT_OUT] = -1; info->func[0] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT; if (config & ADM1275_VRANGE) { info->m[PSC_VOLTAGE_IN] = 19045; info->b[PSC_VOLTAGE_IN] = 0; info->R[PSC_VOLTAGE_IN] = -2; info->m[PSC_VOLTAGE_OUT] = 19045; info->b[PSC_VOLTAGE_OUT] = 0; info->R[PSC_VOLTAGE_OUT] = -2; } else { info->m[PSC_VOLTAGE_IN] = 6666; info->b[PSC_VOLTAGE_IN] = 0; info->R[PSC_VOLTAGE_IN] = -1; info->m[PSC_VOLTAGE_OUT] = 6666; info->b[PSC_VOLTAGE_OUT] = 0; info->R[PSC_VOLTAGE_OUT] = -1; } if (config & ADM1275_VIN_VOUT_SELECT) info->func[0] |= PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT; else info->func[0] |= PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT; ret = pmbus_do_probe(client, id, info); if (ret) goto err_mem; return 0; err_mem: kfree(info); return ret; }
static int ir35221_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct pmbus_driver_info *info; u8 buf[I2C_SMBUS_BLOCK_MAX]; int ret; if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BYTE_DATA | I2C_FUNC_SMBUS_READ_WORD_DATA | I2C_FUNC_SMBUS_READ_BLOCK_DATA)) return -ENODEV; ret = i2c_smbus_read_block_data(client, PMBUS_MFR_ID, buf); if (ret < 0) { dev_err(&client->dev, "Failed to read PMBUS_MFR_ID\n"); return ret; } if (ret != 2 || strncmp(buf, "RI", strlen("RI"))) { dev_err(&client->dev, "MFR_ID unrecognised\n"); return -ENODEV; } ret = i2c_smbus_read_block_data(client, PMBUS_MFR_MODEL, buf); if (ret < 0) { dev_err(&client->dev, "Failed to read PMBUS_MFR_MODEL\n"); return ret; } if (ret != 2 || !(buf[0] == 0x6c && buf[1] == 0x00)) { dev_err(&client->dev, "MFR_MODEL unrecognised\n"); return -ENODEV; } info = devm_kzalloc(&client->dev, sizeof(struct pmbus_driver_info), GFP_KERNEL); if (!info) return -ENOMEM; info->read_word_data = ir35221_read_word_data; info->pages = 2; info->format[PSC_VOLTAGE_IN] = linear; info->format[PSC_VOLTAGE_OUT] = linear; info->format[PSC_CURRENT_IN] = linear; info->format[PSC_CURRENT_OUT] = linear; info->format[PSC_POWER] = linear; info->format[PSC_TEMPERATURE] = linear; info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT | PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT | PMBUS_HAVE_PIN | PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_STATUS_INPUT | PMBUS_HAVE_STATUS_TEMP; info->func[1] = info->func[0]; return pmbus_do_probe(client, id, info); }
static int max34440_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct max34440_data *data; data = devm_kzalloc(&client->dev, sizeof(struct max34440_data), GFP_KERNEL); if (!data) return -ENOMEM; data->id = id->driver_data; data->info = max34440_info[id->driver_data]; return pmbus_do_probe(client, id, &data->info); }
static int ltc3815_probe(struct i2c_client *client, const struct i2c_device_id *id) { int chip_id; if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_WORD_DATA)) return -ENODEV; chip_id = i2c_smbus_read_word_data(client, LTC3815_MFR_SPECIAL_ID); if (chip_id < 0) return chip_id; if ((chip_id & LTC3815_ID_MASK) != LTC3815_ID) return -ENODEV; return pmbus_do_probe(client, id, <c3815_info); }
static int bmr46x_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct bmr46x_data *data; struct pmbus_driver_info *info; if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_WORD_DATA)) return -ENODEV; data = devm_kzalloc(&client->dev, sizeof(struct bmr46x_data),GFP_KERNEL); if (!data) return -ENOMEM; data->id = id->driver_data; /* * According to information from the chip vendor, all currently * supported chips are known to require a wait time between I2C * accesses. */ data->delay = delay; /* * Since there was a direct I2C device access above, wait before * accessing the chip again. */ data->access = ktime_get(); bmr46x_wait(data); info = &data->info; info->pages = 1; info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP; data->access = ktime_get(); bmr46x_wait(data); info->read_word_data = bmr46x_read_word_data; info->read_byte_data = bmr46x_read_byte_data; info->write_word_data = bmr46x_write_word_data; info->write_byte = bmr46x_write_byte; return pmbus_do_probe(client, id, info); }
static int zl6100_probe(struct i2c_client *client, const struct i2c_device_id *id) { int ret; struct zl6100_data *data; struct pmbus_driver_info *info; u8 device_id[I2C_SMBUS_BLOCK_MAX + 1]; const struct i2c_device_id *mid; if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_WORD_DATA | I2C_FUNC_SMBUS_READ_BLOCK_DATA)) return -ENODEV; ret = i2c_smbus_read_block_data(client, ZL6100_DEVICE_ID, device_id); if (ret < 0) { dev_err(&client->dev, "Failed to read device ID\n"); return ret; } device_id[ret] = '\0'; dev_info(&client->dev, "Device ID %s\n", device_id); mid = NULL; for (mid = zl6100_id; mid->name[0]; mid++) { if (!strncasecmp(mid->name, device_id, strlen(mid->name))) break; } if (!mid->name[0]) { dev_err(&client->dev, "Unsupported device\n"); return -ENODEV; } if (id->driver_data != mid->driver_data) dev_notice(&client->dev, "Device mismatch: Configured %s, detected %s\n", id->name, mid->name); data = devm_kzalloc(&client->dev, sizeof(struct zl6100_data), GFP_KERNEL); if (!data) return -ENOMEM; data->id = mid->driver_data; /* * According to information from the chip vendor, all currently * supported chips are known to require a wait time between I2C * accesses. */ data->delay = delay; /* * Since there was a direct I2C device access above, wait before * accessing the chip again. */ data->access = ktime_get(); zl6100_wait(data); info = &data->info; info->pages = 1; info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP; /* * ZL2004, ZL9101M, and ZL9117M support monitoring an extra voltage * (VMON for ZL2004, VDRV for ZL9101M and ZL9117M). Report it as vmon. */ if (data->id == zl2004 || data->id == zl9101 || data->id == zl9117) info->func[0] |= PMBUS_HAVE_VMON | PMBUS_HAVE_STATUS_VMON; ret = i2c_smbus_read_word_data(client, ZL6100_MFR_CONFIG); if (ret < 0) return ret; if (ret & ZL6100_MFR_XTEMP_ENABLE) info->func[0] |= PMBUS_HAVE_TEMP2; data->access = ktime_get(); zl6100_wait(data); info->read_word_data = zl6100_read_word_data; info->read_byte_data = zl6100_read_byte_data; info->write_word_data = zl6100_write_word_data; info->write_byte = zl6100_write_byte; return pmbus_do_probe(client, mid, info); }
static int adm1275_probe(struct i2c_client *client, const struct i2c_device_id *id) { u8 block_buffer[I2C_SMBUS_BLOCK_MAX + 1]; int config, device_config; int ret; struct pmbus_driver_info *info; struct adm1275_data *data; const struct i2c_device_id *mid; if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BYTE_DATA | I2C_FUNC_SMBUS_BLOCK_DATA)) return -ENODEV; ret = i2c_smbus_read_block_data(client, PMBUS_MFR_ID, block_buffer); if (ret < 0) { dev_err(&client->dev, "Failed to read Manufacturer ID\n"); return ret; } if (ret != 3 || strncmp(block_buffer, "ADI", 3)) { dev_err(&client->dev, "Unsupported Manufacturer ID\n"); return -ENODEV; } ret = i2c_smbus_read_block_data(client, PMBUS_MFR_MODEL, block_buffer); if (ret < 0) { dev_err(&client->dev, "Failed to read Manufacturer Model\n"); return ret; } for (mid = adm1275_id; mid->name[0]; mid++) { if (!strncasecmp(mid->name, block_buffer, strlen(mid->name))) break; } if (!mid->name[0]) { dev_err(&client->dev, "Unsupported device\n"); return -ENODEV; } if (id->driver_data != mid->driver_data) dev_notice(&client->dev, "Device mismatch: Configured %s, detected %s\n", id->name, mid->name); config = i2c_smbus_read_byte_data(client, ADM1275_PMON_CONFIG); if (config < 0) return config; device_config = i2c_smbus_read_byte_data(client, ADM1275_DEVICE_CONFIG); if (device_config < 0) return device_config; data = devm_kzalloc(&client->dev, sizeof(struct adm1275_data), GFP_KERNEL); if (!data) return -ENOMEM; data->id = mid->driver_data; info = &data->info; info->pages = 1; info->format[PSC_VOLTAGE_IN] = direct; info->format[PSC_VOLTAGE_OUT] = direct; info->format[PSC_CURRENT_OUT] = direct; info->m[PSC_CURRENT_OUT] = 807; info->b[PSC_CURRENT_OUT] = 20475; info->R[PSC_CURRENT_OUT] = -1; info->func[0] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT; info->read_word_data = adm1275_read_word_data; info->read_byte_data = adm1275_read_byte_data; info->write_word_data = adm1275_write_word_data; if (data->id == adm1075) { info->m[PSC_VOLTAGE_IN] = 27169; info->b[PSC_VOLTAGE_IN] = 0; info->R[PSC_VOLTAGE_IN] = -1; info->m[PSC_VOLTAGE_OUT] = 27169; info->b[PSC_VOLTAGE_OUT] = 0; info->R[PSC_VOLTAGE_OUT] = -1; } else if (config & ADM1275_VRANGE) { info->m[PSC_VOLTAGE_IN] = 19199; info->b[PSC_VOLTAGE_IN] = 0; info->R[PSC_VOLTAGE_IN] = -2; info->m[PSC_VOLTAGE_OUT] = 19199; info->b[PSC_VOLTAGE_OUT] = 0; info->R[PSC_VOLTAGE_OUT] = -2; } else { info->m[PSC_VOLTAGE_IN] = 6720; info->b[PSC_VOLTAGE_IN] = 0; info->R[PSC_VOLTAGE_IN] = -1; info->m[PSC_VOLTAGE_OUT] = 6720; info->b[PSC_VOLTAGE_OUT] = 0; info->R[PSC_VOLTAGE_OUT] = -1; } if (device_config & ADM1275_IOUT_WARN2_SELECT) data->have_oc_fault = true; switch (data->id) { case adm1075: info->format[PSC_POWER] = direct; info->b[PSC_POWER] = 0; info->R[PSC_POWER] = -1; switch (config & ADM1075_IRANGE_MASK) { case ADM1075_IRANGE_25: info->m[PSC_POWER] = 8549; info->m[PSC_CURRENT_OUT] = 806; break; case ADM1075_IRANGE_50: info->m[PSC_POWER] = 4279; info->m[PSC_CURRENT_OUT] = 404; break; default: dev_err(&client->dev, "Invalid input current range"); info->m[PSC_POWER] = 0; info->m[PSC_CURRENT_OUT] = 0; break; } info->func[0] |= PMBUS_HAVE_VIN | PMBUS_HAVE_PIN | PMBUS_HAVE_STATUS_INPUT; if (config & ADM1275_VIN_VOUT_SELECT) info->func[0] |= PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT; break; case adm1275: if (config & ADM1275_VIN_VOUT_SELECT) info->func[0] |= PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT; else info->func[0] |= PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT; break; case adm1276: info->format[PSC_POWER] = direct; info->func[0] |= PMBUS_HAVE_VIN | PMBUS_HAVE_PIN | PMBUS_HAVE_STATUS_INPUT; if (config & ADM1275_VIN_VOUT_SELECT) info->func[0] |= PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT; if (config & ADM1275_VRANGE) { info->m[PSC_POWER] = 6043; info->b[PSC_POWER] = 0; info->R[PSC_POWER] = -2; } else { info->m[PSC_POWER] = 2115; info->b[PSC_POWER] = 0; info->R[PSC_POWER] = -1; } break; } return pmbus_do_probe(client, id, info); }
static int lm25066_probe(struct i2c_client *client, const struct i2c_device_id *id) { int config; struct lm25066_data *data; struct pmbus_driver_info *info; if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BYTE_DATA)) return -ENODEV; data = devm_kzalloc(&client->dev, sizeof(struct lm25066_data), GFP_KERNEL); if (!data) return -ENOMEM; config = i2c_smbus_read_byte_data(client, LM25066_DEVICE_SETUP); if (config < 0) return config; data->id = id->driver_data; info = &data->info; info->pages = 2; info->format[PSC_VOLTAGE_IN] = direct; info->format[PSC_VOLTAGE_OUT] = direct; info->format[PSC_CURRENT_IN] = direct; info->format[PSC_TEMPERATURE] = direct; info->format[PSC_POWER] = direct; info->m[PSC_TEMPERATURE] = 16; info->b[PSC_TEMPERATURE] = 0; info->R[PSC_TEMPERATURE] = 0; info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_PIN | PMBUS_HAVE_IIN | PMBUS_HAVE_STATUS_INPUT | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP; info->func[1] = PMBUS_HAVE_VOUT; info->read_word_data = lm25066_read_word_data; info->write_word_data = lm25066_write_word_data; info->write_byte = lm25066_write_byte; switch (id->driver_data) { case lm25066: info->m[PSC_VOLTAGE_IN] = 22070; info->b[PSC_VOLTAGE_IN] = 0; info->R[PSC_VOLTAGE_IN] = -2; info->m[PSC_VOLTAGE_OUT] = 22070; info->b[PSC_VOLTAGE_OUT] = 0; info->R[PSC_VOLTAGE_OUT] = -2; if (config & LM25066_DEV_SETUP_CL) { info->m[PSC_CURRENT_IN] = 6852; info->b[PSC_CURRENT_IN] = 0; info->R[PSC_CURRENT_IN] = -2; info->m[PSC_POWER] = 369; info->b[PSC_POWER] = 0; info->R[PSC_POWER] = -2; } else { info->m[PSC_CURRENT_IN] = 13661; info->b[PSC_CURRENT_IN] = 0; info->R[PSC_CURRENT_IN] = -2; info->m[PSC_POWER] = 736; info->b[PSC_POWER] = 0; info->R[PSC_POWER] = -2; } break; case lm5064: info->m[PSC_VOLTAGE_IN] = 22075; info->b[PSC_VOLTAGE_IN] = 0; info->R[PSC_VOLTAGE_IN] = -2; info->m[PSC_VOLTAGE_OUT] = 22075; info->b[PSC_VOLTAGE_OUT] = 0; info->R[PSC_VOLTAGE_OUT] = -2; if (config & LM25066_DEV_SETUP_CL) { info->m[PSC_CURRENT_IN] = 6713; info->b[PSC_CURRENT_IN] = 0; info->R[PSC_CURRENT_IN] = -2; info->m[PSC_POWER] = 3619; info->b[PSC_POWER] = 0; info->R[PSC_POWER] = -3; } else { info->m[PSC_CURRENT_IN] = 13426; info->b[PSC_CURRENT_IN] = 0; info->R[PSC_CURRENT_IN] = -2; info->m[PSC_POWER] = 7238; info->b[PSC_POWER] = 0; info->R[PSC_POWER] = -3; } break; case lm5066: info->m[PSC_VOLTAGE_IN] = 4587; info->b[PSC_VOLTAGE_IN] = 0; info->R[PSC_VOLTAGE_IN] = -2; info->m[PSC_VOLTAGE_OUT] = 4587; info->b[PSC_VOLTAGE_OUT] = 0; info->R[PSC_VOLTAGE_OUT] = -2; if (config & LM25066_DEV_SETUP_CL) { info->m[PSC_CURRENT_IN] = 10753; info->b[PSC_CURRENT_IN] = 0; info->R[PSC_CURRENT_IN] = -2; info->m[PSC_POWER] = 1204; info->b[PSC_POWER] = 0; info->R[PSC_POWER] = -3; } else { info->m[PSC_CURRENT_IN] = 5405; info->b[PSC_CURRENT_IN] = 0; info->R[PSC_CURRENT_IN] = -2; info->m[PSC_POWER] = 605; info->b[PSC_POWER] = 0; info->R[PSC_POWER] = -3; } break; default: return -ENODEV; } return pmbus_do_probe(client, id, info); }
static int ucd9200_probe(struct i2c_client *client, const struct i2c_device_id *id) { u8 block_buffer[I2C_SMBUS_BLOCK_MAX + 1]; struct pmbus_driver_info *info; const struct i2c_device_id *mid; int i, j, ret; if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_BLOCK_DATA)) return -ENODEV; ret = i2c_smbus_read_block_data(client, UCD9200_DEVICE_ID, block_buffer); if (ret < 0) { dev_err(&client->dev, "Failed to read device ID\n"); return ret; } block_buffer[ret] = '\0'; dev_info(&client->dev, "Device ID %s\n", block_buffer); mid = NULL; for (i = 0; i < ARRAY_SIZE(ucd9200_id); i++) { mid = &ucd9200_id[i]; if (!strncasecmp(mid->name, block_buffer, strlen(mid->name))) break; } if (!mid || !strlen(mid->name)) { dev_err(&client->dev, "Unsupported device\n"); return -ENODEV; } if (id->driver_data != ucd9200 && id->driver_data != mid->driver_data) dev_notice(&client->dev, "Device mismatch: Configured %s, detected %s\n", id->name, mid->name); info = kzalloc(sizeof(struct pmbus_driver_info), GFP_KERNEL); if (!info) return -ENOMEM; ret = i2c_smbus_read_block_data(client, UCD9200_PHASE_INFO, block_buffer); if (ret < 0) { dev_err(&client->dev, "Failed to read phase information\n"); goto out; } /* * Calculate number of configured pages (rails) from PHASE_INFO * register. * Rails have to be sequential, so we can abort after finding * the first unconfigured rail. */ info->pages = 0; for (i = 0; i < ret; i++) { if (!block_buffer[i]) break; info->pages++; } if (!info->pages) { dev_err(&client->dev, "No rails configured\n"); ret = -ENODEV; goto out; } dev_info(&client->dev, "%d rails configured\n", info->pages); /* * Set PHASE registers on all pages to 0xff to ensure that phase * specific commands will apply to all phases of a given page (rail). * This only affects the READ_IOUT and READ_TEMPERATURE2 registers. * READ_IOUT will return the sum of currents of all phases of a rail, * and READ_TEMPERATURE2 will return the maximum temperature detected * for the the phases of the rail. */ for (i = 0; i < info->pages; i++) { /* * Setting PAGE & PHASE fails once in a while for no obvious * reason, so we need to retry a couple of times. */ for (j = 0; j < 3; j++) { ret = i2c_smbus_write_byte_data(client, PMBUS_PAGE, i); if (ret < 0) continue; ret = i2c_smbus_write_byte_data(client, PMBUS_PHASE, 0xff); if (ret < 0) continue; break; } if (ret < 0) { dev_err(&client->dev, "Failed to initialize PHASE registers\n"); goto out; } } if (info->pages > 1) i2c_smbus_write_byte_data(client, PMBUS_PAGE, 0); info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT | PMBUS_HAVE_IIN | PMBUS_HAVE_PIN | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP; for (i = 1; i < info->pages; i++) info->func[i] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP; /* ucd9240 supports a single fan */ if (mid->driver_data == ucd9240) info->func[0] |= PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12; ret = pmbus_do_probe(client, mid, info); if (ret < 0) goto out; return 0; out: kfree(info); return ret; }
static int max16064_probe(struct i2c_client *client, const struct i2c_device_id *id) { return pmbus_do_probe(client, id, &max16064_info); }
static int max34440_probe(struct i2c_client *client, const struct i2c_device_id *id) { return pmbus_do_probe(client, id, &max34440_info[id->driver_data]); }