0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 #include <linux/bits.h>
0027 #include <linux/i2c.h>
0028 #include <linux/init.h>
0029 #include <linux/kernel.h>
0030 #include <linux/module.h>
0031
0032 #include "pmbus.h"
0033
0034 enum chips { max16508, max16601, max16602 };
0035
0036 #define REG_DEFAULT_NUM_POP 0xc4
0037 #define REG_SETPT_DVID 0xd1
0038 #define DAC_10MV_MODE BIT(4)
0039 #define REG_IOUT_AVG_PK 0xee
0040 #define REG_IIN_SENSOR 0xf1
0041 #define REG_TOTAL_INPUT_POWER 0xf2
0042 #define REG_PHASE_ID 0xf3
0043 #define CORE_RAIL_INDICATOR BIT(7)
0044 #define REG_PHASE_REPORTING 0xf4
0045
0046 #define MAX16601_NUM_PHASES 8
0047
0048 struct max16601_data {
0049 enum chips id;
0050 struct pmbus_driver_info info;
0051 struct i2c_client *vsa;
0052 int iout_avg_pkg;
0053 };
0054
0055 #define to_max16601_data(x) container_of(x, struct max16601_data, info)
0056
0057 static int max16601_read_byte(struct i2c_client *client, int page, int reg)
0058 {
0059 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
0060 struct max16601_data *data = to_max16601_data(info);
0061
0062 if (page > 0) {
0063 if (page == 2)
0064 return i2c_smbus_read_byte_data(data->vsa, reg);
0065 return -EOPNOTSUPP;
0066 }
0067 return -ENODATA;
0068 }
0069
0070 static int max16601_read_word(struct i2c_client *client, int page, int phase,
0071 int reg)
0072 {
0073 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
0074 struct max16601_data *data = to_max16601_data(info);
0075 u8 buf[I2C_SMBUS_BLOCK_MAX + 1];
0076 int ret;
0077
0078 switch (page) {
0079 case 0:
0080 if (phase == 0xff)
0081 return -ENODATA;
0082 switch (reg) {
0083 case PMBUS_READ_IIN:
0084 case PMBUS_READ_IOUT:
0085 case PMBUS_READ_TEMPERATURE_1:
0086 ret = i2c_smbus_write_byte_data(client, REG_PHASE_ID,
0087 phase);
0088 if (ret)
0089 return ret;
0090 ret = i2c_smbus_read_block_data(client,
0091 REG_PHASE_REPORTING,
0092 buf);
0093 if (ret < 0)
0094 return ret;
0095 if (ret < 6)
0096 return -EIO;
0097 switch (reg) {
0098 case PMBUS_READ_TEMPERATURE_1:
0099 return buf[1] << 8 | buf[0];
0100 case PMBUS_READ_IOUT:
0101 return buf[3] << 8 | buf[2];
0102 case PMBUS_READ_IIN:
0103 return buf[5] << 8 | buf[4];
0104 default:
0105 break;
0106 }
0107 }
0108 return -EOPNOTSUPP;
0109 case 1:
0110 switch (reg) {
0111 case PMBUS_READ_IIN:
0112 return i2c_smbus_read_word_data(client, REG_IIN_SENSOR);
0113 case PMBUS_READ_PIN:
0114 return i2c_smbus_read_word_data(client,
0115 REG_TOTAL_INPUT_POWER);
0116 default:
0117 break;
0118 }
0119 return -EOPNOTSUPP;
0120 case 2:
0121 switch (reg) {
0122 case PMBUS_VIRT_READ_IOUT_MAX:
0123 ret = i2c_smbus_read_word_data(data->vsa,
0124 REG_IOUT_AVG_PK);
0125 if (ret < 0)
0126 return ret;
0127 if (sign_extend32(ret, 10) >
0128 sign_extend32(data->iout_avg_pkg, 10))
0129 data->iout_avg_pkg = ret;
0130 return data->iout_avg_pkg;
0131 case PMBUS_VIRT_RESET_IOUT_HISTORY:
0132 return 0;
0133 case PMBUS_IOUT_OC_FAULT_LIMIT:
0134 case PMBUS_IOUT_OC_WARN_LIMIT:
0135 case PMBUS_OT_FAULT_LIMIT:
0136 case PMBUS_OT_WARN_LIMIT:
0137 case PMBUS_READ_IIN:
0138 case PMBUS_READ_IOUT:
0139 case PMBUS_READ_TEMPERATURE_1:
0140 case PMBUS_STATUS_WORD:
0141 return i2c_smbus_read_word_data(data->vsa, reg);
0142 default:
0143 return -EOPNOTSUPP;
0144 }
0145 default:
0146 return -EOPNOTSUPP;
0147 }
0148 }
0149
0150 static int max16601_write_byte(struct i2c_client *client, int page, u8 reg)
0151 {
0152 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
0153 struct max16601_data *data = to_max16601_data(info);
0154
0155 if (page == 2) {
0156 if (reg == PMBUS_CLEAR_FAULTS)
0157 return i2c_smbus_write_byte(data->vsa, reg);
0158 return -EOPNOTSUPP;
0159 }
0160 return -ENODATA;
0161 }
0162
0163 static int max16601_write_word(struct i2c_client *client, int page, int reg,
0164 u16 value)
0165 {
0166 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
0167 struct max16601_data *data = to_max16601_data(info);
0168
0169 switch (page) {
0170 case 0:
0171 return -ENODATA;
0172 case 1:
0173 default:
0174 return -EOPNOTSUPP;
0175 case 2:
0176 switch (reg) {
0177 case PMBUS_VIRT_RESET_IOUT_HISTORY:
0178 data->iout_avg_pkg = 0xfc00;
0179 return 0;
0180 case PMBUS_IOUT_OC_FAULT_LIMIT:
0181 case PMBUS_IOUT_OC_WARN_LIMIT:
0182 case PMBUS_OT_FAULT_LIMIT:
0183 case PMBUS_OT_WARN_LIMIT:
0184 return i2c_smbus_write_word_data(data->vsa, reg, value);
0185 default:
0186 return -EOPNOTSUPP;
0187 }
0188 }
0189 }
0190
0191 static int max16601_identify(struct i2c_client *client,
0192 struct pmbus_driver_info *info)
0193 {
0194 struct max16601_data *data = to_max16601_data(info);
0195 int reg;
0196
0197 reg = i2c_smbus_read_byte_data(client, REG_SETPT_DVID);
0198 if (reg < 0)
0199 return reg;
0200 if (reg & DAC_10MV_MODE)
0201 info->vrm_version[0] = vr13;
0202 else
0203 info->vrm_version[0] = vr12;
0204
0205 if (data->id != max16601 && data->id != max16602)
0206 return 0;
0207
0208 reg = i2c_smbus_read_byte_data(client, REG_DEFAULT_NUM_POP);
0209 if (reg < 0)
0210 return reg;
0211
0212
0213
0214
0215
0216 reg &= 0x0f;
0217 if (reg && reg <= MAX16601_NUM_PHASES)
0218 info->phases[0] = reg;
0219
0220 return 0;
0221 }
0222
0223 static struct pmbus_driver_info max16601_info = {
0224 .pages = 3,
0225 .format[PSC_VOLTAGE_IN] = linear,
0226 .format[PSC_VOLTAGE_OUT] = vid,
0227 .format[PSC_CURRENT_IN] = linear,
0228 .format[PSC_CURRENT_OUT] = linear,
0229 .format[PSC_TEMPERATURE] = linear,
0230 .format[PSC_POWER] = linear,
0231 .func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN | PMBUS_HAVE_PIN |
0232 PMBUS_HAVE_STATUS_INPUT |
0233 PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
0234 PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
0235 PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP |
0236 PMBUS_HAVE_POUT | PMBUS_PAGE_VIRTUAL | PMBUS_PHASE_VIRTUAL,
0237 .func[1] = PMBUS_HAVE_IIN | PMBUS_HAVE_PIN | PMBUS_PAGE_VIRTUAL,
0238 .func[2] = PMBUS_HAVE_IIN | PMBUS_HAVE_STATUS_INPUT |
0239 PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
0240 PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP | PMBUS_PAGE_VIRTUAL,
0241 .phases[0] = MAX16601_NUM_PHASES,
0242 .pfunc[0] = PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT | PMBUS_HAVE_TEMP,
0243 .pfunc[1] = PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT,
0244 .pfunc[2] = PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT | PMBUS_HAVE_TEMP,
0245 .pfunc[3] = PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT,
0246 .pfunc[4] = PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT | PMBUS_HAVE_TEMP,
0247 .pfunc[5] = PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT,
0248 .pfunc[6] = PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT | PMBUS_HAVE_TEMP,
0249 .pfunc[7] = PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT,
0250 .identify = max16601_identify,
0251 .read_byte_data = max16601_read_byte,
0252 .read_word_data = max16601_read_word,
0253 .write_byte = max16601_write_byte,
0254 .write_word_data = max16601_write_word,
0255 };
0256
0257 static void max16601_remove(void *_data)
0258 {
0259 struct max16601_data *data = _data;
0260
0261 i2c_unregister_device(data->vsa);
0262 }
0263
0264 static const struct i2c_device_id max16601_id[] = {
0265 {"max16508", max16508},
0266 {"max16601", max16601},
0267 {"max16602", max16602},
0268 {}
0269 };
0270 MODULE_DEVICE_TABLE(i2c, max16601_id);
0271
0272 static int max16601_get_id(struct i2c_client *client)
0273 {
0274 struct device *dev = &client->dev;
0275 u8 buf[I2C_SMBUS_BLOCK_MAX + 1];
0276 enum chips id;
0277 int ret;
0278
0279 ret = i2c_smbus_read_block_data(client, PMBUS_IC_DEVICE_ID, buf);
0280 if (ret < 0 || ret < 11)
0281 return -ENODEV;
0282
0283
0284
0285
0286
0287 if (!strncmp(buf, "MAX16500", 8)) {
0288 id = max16508;
0289 } else if (!strncmp(buf, "MAX16601", 8)) {
0290 id = max16601;
0291 } else if (!strncmp(buf, "MAX16602", 8)) {
0292 id = max16602;
0293 } else {
0294 buf[ret] = '\0';
0295 dev_err(dev, "Unsupported chip '%s'\n", buf);
0296 return -ENODEV;
0297 }
0298 return id;
0299 }
0300
0301 static int max16601_probe(struct i2c_client *client)
0302 {
0303 struct device *dev = &client->dev;
0304 const struct i2c_device_id *id;
0305 struct max16601_data *data;
0306 int ret, chip_id;
0307
0308 if (!i2c_check_functionality(client->adapter,
0309 I2C_FUNC_SMBUS_READ_BYTE_DATA |
0310 I2C_FUNC_SMBUS_READ_BLOCK_DATA))
0311 return -ENODEV;
0312
0313 chip_id = max16601_get_id(client);
0314 if (chip_id < 0)
0315 return chip_id;
0316
0317 id = i2c_match_id(max16601_id, client);
0318 if (chip_id != id->driver_data)
0319 dev_warn(&client->dev,
0320 "Device mismatch: Configured %s (%d), detected %d\n",
0321 id->name, (int) id->driver_data, chip_id);
0322
0323 ret = i2c_smbus_read_byte_data(client, REG_PHASE_ID);
0324 if (ret < 0)
0325 return ret;
0326 if (!(ret & CORE_RAIL_INDICATOR)) {
0327 dev_err(dev,
0328 "Driver must be instantiated on CORE rail I2C address\n");
0329 return -ENODEV;
0330 }
0331
0332 data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
0333 if (!data)
0334 return -ENOMEM;
0335
0336 data->id = chip_id;
0337 data->iout_avg_pkg = 0xfc00;
0338 data->vsa = i2c_new_dummy_device(client->adapter, client->addr + 1);
0339 if (IS_ERR(data->vsa)) {
0340 dev_err(dev, "Failed to register VSA client\n");
0341 return PTR_ERR(data->vsa);
0342 }
0343 ret = devm_add_action_or_reset(dev, max16601_remove, data);
0344 if (ret)
0345 return ret;
0346
0347 data->info = max16601_info;
0348
0349 return pmbus_do_probe(client, &data->info);
0350 }
0351
0352 static struct i2c_driver max16601_driver = {
0353 .driver = {
0354 .name = "max16601",
0355 },
0356 .probe_new = max16601_probe,
0357 .id_table = max16601_id,
0358 };
0359
0360 module_i2c_driver(max16601_driver);
0361
0362 MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");
0363 MODULE_DESCRIPTION("PMBus driver for Maxim MAX16601");
0364 MODULE_LICENSE("GPL v2");
0365 MODULE_IMPORT_NS(PMBUS);