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
0027 #include <linux/module.h>
0028 #include <linux/err.h>
0029 #include <linux/i2c.h>
0030 #include <linux/platform_device.h>
0031 #include <linux/regulator/driver.h>
0032 #include <linux/slab.h>
0033 #include <linux/regulator/max8660.h>
0034 #include <linux/of.h>
0035 #include <linux/of_device.h>
0036 #include <linux/regulator/of_regulator.h>
0037
0038 #define MAX8660_DCDC_MIN_UV 725000
0039 #define MAX8660_DCDC_MAX_UV 1800000
0040 #define MAX8660_DCDC_STEP 25000
0041 #define MAX8660_DCDC_MAX_SEL 0x2b
0042
0043 #define MAX8660_LDO5_MIN_UV 1700000
0044 #define MAX8660_LDO5_MAX_UV 2000000
0045 #define MAX8660_LDO5_STEP 25000
0046 #define MAX8660_LDO5_MAX_SEL 0x0c
0047
0048 #define MAX8660_LDO67_MIN_UV 1800000
0049 #define MAX8660_LDO67_MAX_UV 3300000
0050 #define MAX8660_LDO67_STEP 100000
0051 #define MAX8660_LDO67_MAX_SEL 0x0f
0052
0053 enum {
0054 MAX8660_OVER1,
0055 MAX8660_OVER2,
0056 MAX8660_VCC1,
0057 MAX8660_ADTV1,
0058 MAX8660_ADTV2,
0059 MAX8660_SDTV1,
0060 MAX8660_SDTV2,
0061 MAX8660_MDTV1,
0062 MAX8660_MDTV2,
0063 MAX8660_L12VCR,
0064 MAX8660_FPWM,
0065 MAX8660_N_REGS,
0066 };
0067
0068 struct max8660 {
0069 struct i2c_client *client;
0070 u8 shadow_regs[MAX8660_N_REGS];
0071 };
0072
0073 static int max8660_write(struct max8660 *max8660, u8 reg, u8 mask, u8 val)
0074 {
0075 static const u8 max8660_addresses[MAX8660_N_REGS] = {
0076 0x10, 0x12, 0x20, 0x23, 0x24, 0x29, 0x2a, 0x32, 0x33, 0x39, 0x80
0077 };
0078
0079 int ret;
0080 u8 reg_val = (max8660->shadow_regs[reg] & mask) | val;
0081
0082 dev_vdbg(&max8660->client->dev, "Writing reg %02x with %02x\n",
0083 max8660_addresses[reg], reg_val);
0084
0085 ret = i2c_smbus_write_byte_data(max8660->client,
0086 max8660_addresses[reg], reg_val);
0087 if (ret == 0)
0088 max8660->shadow_regs[reg] = reg_val;
0089
0090 return ret;
0091 }
0092
0093
0094
0095
0096
0097
0098 static int max8660_dcdc_is_enabled(struct regulator_dev *rdev)
0099 {
0100 struct max8660 *max8660 = rdev_get_drvdata(rdev);
0101 u8 val = max8660->shadow_regs[MAX8660_OVER1];
0102 u8 mask = (rdev_get_id(rdev) == MAX8660_V3) ? 1 : 4;
0103
0104 return !!(val & mask);
0105 }
0106
0107 static int max8660_dcdc_enable(struct regulator_dev *rdev)
0108 {
0109 struct max8660 *max8660 = rdev_get_drvdata(rdev);
0110 u8 bit = (rdev_get_id(rdev) == MAX8660_V3) ? 1 : 4;
0111
0112 return max8660_write(max8660, MAX8660_OVER1, 0xff, bit);
0113 }
0114
0115 static int max8660_dcdc_disable(struct regulator_dev *rdev)
0116 {
0117 struct max8660 *max8660 = rdev_get_drvdata(rdev);
0118 u8 mask = (rdev_get_id(rdev) == MAX8660_V3) ? ~1 : ~4;
0119
0120 return max8660_write(max8660, MAX8660_OVER1, mask, 0);
0121 }
0122
0123 static int max8660_dcdc_get_voltage_sel(struct regulator_dev *rdev)
0124 {
0125 struct max8660 *max8660 = rdev_get_drvdata(rdev);
0126 u8 reg = (rdev_get_id(rdev) == MAX8660_V3) ? MAX8660_ADTV2 : MAX8660_SDTV2;
0127 u8 selector = max8660->shadow_regs[reg];
0128
0129 return selector;
0130 }
0131
0132 static int max8660_dcdc_set_voltage_sel(struct regulator_dev *rdev,
0133 unsigned int selector)
0134 {
0135 struct max8660 *max8660 = rdev_get_drvdata(rdev);
0136 u8 reg, bits;
0137 int ret;
0138
0139 reg = (rdev_get_id(rdev) == MAX8660_V3) ? MAX8660_ADTV2 : MAX8660_SDTV2;
0140 ret = max8660_write(max8660, reg, 0, selector);
0141 if (ret)
0142 return ret;
0143
0144
0145 bits = (rdev_get_id(rdev) == MAX8660_V3) ? 0x03 : 0x30;
0146 return max8660_write(max8660, MAX8660_VCC1, 0xff, bits);
0147 }
0148
0149 static struct regulator_ops max8660_dcdc_ops = {
0150 .is_enabled = max8660_dcdc_is_enabled,
0151 .list_voltage = regulator_list_voltage_linear,
0152 .map_voltage = regulator_map_voltage_linear,
0153 .set_voltage_sel = max8660_dcdc_set_voltage_sel,
0154 .get_voltage_sel = max8660_dcdc_get_voltage_sel,
0155 };
0156
0157
0158
0159
0160
0161
0162 static int max8660_ldo5_get_voltage_sel(struct regulator_dev *rdev)
0163 {
0164 struct max8660 *max8660 = rdev_get_drvdata(rdev);
0165
0166 u8 selector = max8660->shadow_regs[MAX8660_MDTV2];
0167 return selector;
0168 }
0169
0170 static int max8660_ldo5_set_voltage_sel(struct regulator_dev *rdev,
0171 unsigned int selector)
0172 {
0173 struct max8660 *max8660 = rdev_get_drvdata(rdev);
0174 int ret;
0175
0176 ret = max8660_write(max8660, MAX8660_MDTV2, 0, selector);
0177 if (ret)
0178 return ret;
0179
0180
0181 return max8660_write(max8660, MAX8660_VCC1, 0xff, 0xc0);
0182 }
0183
0184 static const struct regulator_ops max8660_ldo5_ops = {
0185 .list_voltage = regulator_list_voltage_linear,
0186 .map_voltage = regulator_map_voltage_linear,
0187 .set_voltage_sel = max8660_ldo5_set_voltage_sel,
0188 .get_voltage_sel = max8660_ldo5_get_voltage_sel,
0189 };
0190
0191
0192
0193
0194
0195
0196 static int max8660_ldo67_is_enabled(struct regulator_dev *rdev)
0197 {
0198 struct max8660 *max8660 = rdev_get_drvdata(rdev);
0199 u8 val = max8660->shadow_regs[MAX8660_OVER2];
0200 u8 mask = (rdev_get_id(rdev) == MAX8660_V6) ? 2 : 4;
0201
0202 return !!(val & mask);
0203 }
0204
0205 static int max8660_ldo67_enable(struct regulator_dev *rdev)
0206 {
0207 struct max8660 *max8660 = rdev_get_drvdata(rdev);
0208 u8 bit = (rdev_get_id(rdev) == MAX8660_V6) ? 2 : 4;
0209
0210 return max8660_write(max8660, MAX8660_OVER2, 0xff, bit);
0211 }
0212
0213 static int max8660_ldo67_disable(struct regulator_dev *rdev)
0214 {
0215 struct max8660 *max8660 = rdev_get_drvdata(rdev);
0216 u8 mask = (rdev_get_id(rdev) == MAX8660_V6) ? ~2 : ~4;
0217
0218 return max8660_write(max8660, MAX8660_OVER2, mask, 0);
0219 }
0220
0221 static int max8660_ldo67_get_voltage_sel(struct regulator_dev *rdev)
0222 {
0223 struct max8660 *max8660 = rdev_get_drvdata(rdev);
0224 u8 shift = (rdev_get_id(rdev) == MAX8660_V6) ? 0 : 4;
0225 u8 selector = (max8660->shadow_regs[MAX8660_L12VCR] >> shift) & 0xf;
0226
0227 return selector;
0228 }
0229
0230 static int max8660_ldo67_set_voltage_sel(struct regulator_dev *rdev,
0231 unsigned int selector)
0232 {
0233 struct max8660 *max8660 = rdev_get_drvdata(rdev);
0234
0235 if (rdev_get_id(rdev) == MAX8660_V6)
0236 return max8660_write(max8660, MAX8660_L12VCR, 0xf0, selector);
0237 else
0238 return max8660_write(max8660, MAX8660_L12VCR, 0x0f,
0239 selector << 4);
0240 }
0241
0242 static const struct regulator_ops max8660_ldo67_ops = {
0243 .is_enabled = max8660_ldo67_is_enabled,
0244 .enable = max8660_ldo67_enable,
0245 .disable = max8660_ldo67_disable,
0246 .list_voltage = regulator_list_voltage_linear,
0247 .map_voltage = regulator_map_voltage_linear,
0248 .get_voltage_sel = max8660_ldo67_get_voltage_sel,
0249 .set_voltage_sel = max8660_ldo67_set_voltage_sel,
0250 };
0251
0252 static const struct regulator_desc max8660_reg[] = {
0253 {
0254 .name = "V3(DCDC)",
0255 .id = MAX8660_V3,
0256 .ops = &max8660_dcdc_ops,
0257 .type = REGULATOR_VOLTAGE,
0258 .n_voltages = MAX8660_DCDC_MAX_SEL + 1,
0259 .owner = THIS_MODULE,
0260 .min_uV = MAX8660_DCDC_MIN_UV,
0261 .uV_step = MAX8660_DCDC_STEP,
0262 },
0263 {
0264 .name = "V4(DCDC)",
0265 .id = MAX8660_V4,
0266 .ops = &max8660_dcdc_ops,
0267 .type = REGULATOR_VOLTAGE,
0268 .n_voltages = MAX8660_DCDC_MAX_SEL + 1,
0269 .owner = THIS_MODULE,
0270 .min_uV = MAX8660_DCDC_MIN_UV,
0271 .uV_step = MAX8660_DCDC_STEP,
0272 },
0273 {
0274 .name = "V5(LDO)",
0275 .id = MAX8660_V5,
0276 .ops = &max8660_ldo5_ops,
0277 .type = REGULATOR_VOLTAGE,
0278 .n_voltages = MAX8660_LDO5_MAX_SEL + 1,
0279 .owner = THIS_MODULE,
0280 .min_uV = MAX8660_LDO5_MIN_UV,
0281 .uV_step = MAX8660_LDO5_STEP,
0282 },
0283 {
0284 .name = "V6(LDO)",
0285 .id = MAX8660_V6,
0286 .ops = &max8660_ldo67_ops,
0287 .type = REGULATOR_VOLTAGE,
0288 .n_voltages = MAX8660_LDO67_MAX_SEL + 1,
0289 .owner = THIS_MODULE,
0290 .min_uV = MAX8660_LDO67_MIN_UV,
0291 .uV_step = MAX8660_LDO67_STEP,
0292 },
0293 {
0294 .name = "V7(LDO)",
0295 .id = MAX8660_V7,
0296 .ops = &max8660_ldo67_ops,
0297 .type = REGULATOR_VOLTAGE,
0298 .n_voltages = MAX8660_LDO67_MAX_SEL + 1,
0299 .owner = THIS_MODULE,
0300 .min_uV = MAX8660_LDO67_MIN_UV,
0301 .uV_step = MAX8660_LDO67_STEP,
0302 },
0303 };
0304
0305 enum {
0306 MAX8660 = 0,
0307 MAX8661 = 1,
0308 };
0309
0310 #ifdef CONFIG_OF
0311 static const struct of_device_id max8660_dt_ids[] = {
0312 { .compatible = "maxim,max8660", .data = (void *) MAX8660 },
0313 { .compatible = "maxim,max8661", .data = (void *) MAX8661 },
0314 { }
0315 };
0316 MODULE_DEVICE_TABLE(of, max8660_dt_ids);
0317
0318 static int max8660_pdata_from_dt(struct device *dev,
0319 struct device_node **of_node,
0320 struct max8660_platform_data *pdata)
0321 {
0322 int matched, i;
0323 struct device_node *np;
0324 struct max8660_subdev_data *sub;
0325 struct of_regulator_match rmatch[ARRAY_SIZE(max8660_reg)] = { };
0326
0327 np = of_get_child_by_name(dev->of_node, "regulators");
0328 if (!np) {
0329 dev_err(dev, "missing 'regulators' subnode in DT\n");
0330 return -EINVAL;
0331 }
0332
0333 for (i = 0; i < ARRAY_SIZE(rmatch); i++)
0334 rmatch[i].name = max8660_reg[i].name;
0335
0336 matched = of_regulator_match(dev, np, rmatch, ARRAY_SIZE(rmatch));
0337 of_node_put(np);
0338 if (matched <= 0)
0339 return matched;
0340
0341 pdata->subdevs = devm_kcalloc(dev,
0342 matched,
0343 sizeof(struct max8660_subdev_data),
0344 GFP_KERNEL);
0345 if (!pdata->subdevs)
0346 return -ENOMEM;
0347
0348 pdata->num_subdevs = matched;
0349 sub = pdata->subdevs;
0350
0351 for (i = 0; i < matched; i++) {
0352 sub->id = i;
0353 sub->name = rmatch[i].name;
0354 sub->platform_data = rmatch[i].init_data;
0355 of_node[i] = rmatch[i].of_node;
0356 sub++;
0357 }
0358
0359 return 0;
0360 }
0361 #else
0362 static inline int max8660_pdata_from_dt(struct device *dev,
0363 struct device_node **of_node,
0364 struct max8660_platform_data *pdata)
0365 {
0366 return 0;
0367 }
0368 #endif
0369
0370 static int max8660_probe(struct i2c_client *client,
0371 const struct i2c_device_id *i2c_id)
0372 {
0373 struct device *dev = &client->dev;
0374 struct max8660_platform_data pdata_of, *pdata = dev_get_platdata(dev);
0375 struct regulator_config config = { };
0376 struct max8660 *max8660;
0377 int boot_on, i, id, ret = -EINVAL;
0378 struct device_node *of_node[MAX8660_V_END];
0379 unsigned long type;
0380
0381 if (dev->of_node && !pdata) {
0382 const struct of_device_id *id;
0383
0384 id = of_match_device(of_match_ptr(max8660_dt_ids), dev);
0385 if (!id)
0386 return -ENODEV;
0387
0388 ret = max8660_pdata_from_dt(dev, of_node, &pdata_of);
0389 if (ret < 0)
0390 return ret;
0391
0392 pdata = &pdata_of;
0393 type = (unsigned long) id->data;
0394 } else {
0395 type = i2c_id->driver_data;
0396 memset(of_node, 0, sizeof(of_node));
0397 }
0398
0399 if (pdata->num_subdevs > MAX8660_V_END) {
0400 dev_err(dev, "Too many regulators found!\n");
0401 return -EINVAL;
0402 }
0403
0404 max8660 = devm_kzalloc(dev, sizeof(struct max8660), GFP_KERNEL);
0405 if (!max8660)
0406 return -ENOMEM;
0407
0408 max8660->client = client;
0409
0410 if (pdata->en34_is_high) {
0411
0412 max8660->shadow_regs[MAX8660_OVER1] = 5;
0413 } else {
0414
0415 max8660_dcdc_ops.enable = max8660_dcdc_enable;
0416 max8660_dcdc_ops.disable = max8660_dcdc_disable;
0417 }
0418
0419
0420
0421
0422
0423
0424 max8660->shadow_regs[MAX8660_ADTV1] =
0425 max8660->shadow_regs[MAX8660_ADTV2] =
0426 max8660->shadow_regs[MAX8660_SDTV1] =
0427 max8660->shadow_regs[MAX8660_SDTV2] = 0x1b;
0428 max8660->shadow_regs[MAX8660_MDTV1] =
0429 max8660->shadow_regs[MAX8660_MDTV2] = 0x04;
0430
0431 for (i = 0; i < pdata->num_subdevs; i++) {
0432
0433 if (!pdata->subdevs[i].platform_data)
0434 boot_on = false;
0435 else
0436 boot_on = pdata->subdevs[i].platform_data->constraints.boot_on;
0437
0438 switch (pdata->subdevs[i].id) {
0439 case MAX8660_V3:
0440 if (boot_on)
0441 max8660->shadow_regs[MAX8660_OVER1] |= 1;
0442 break;
0443
0444 case MAX8660_V4:
0445 if (boot_on)
0446 max8660->shadow_regs[MAX8660_OVER1] |= 4;
0447 break;
0448
0449 case MAX8660_V5:
0450 break;
0451
0452 case MAX8660_V6:
0453 if (boot_on)
0454 max8660->shadow_regs[MAX8660_OVER2] |= 2;
0455 break;
0456
0457 case MAX8660_V7:
0458 if (type == MAX8661) {
0459 dev_err(dev, "Regulator not on this chip!\n");
0460 return -EINVAL;
0461 }
0462
0463 if (boot_on)
0464 max8660->shadow_regs[MAX8660_OVER2] |= 4;
0465 break;
0466
0467 default:
0468 dev_err(dev, "invalid regulator %s\n",
0469 pdata->subdevs[i].name);
0470 return ret;
0471 }
0472 }
0473
0474
0475 for (i = 0; i < pdata->num_subdevs; i++) {
0476 struct regulator_dev *rdev;
0477
0478 id = pdata->subdevs[i].id;
0479
0480 config.dev = dev;
0481 config.init_data = pdata->subdevs[i].platform_data;
0482 config.of_node = of_node[i];
0483 config.driver_data = max8660;
0484
0485 rdev = devm_regulator_register(&client->dev,
0486 &max8660_reg[id], &config);
0487 if (IS_ERR(rdev)) {
0488 dev_err(&client->dev, "failed to register %s\n",
0489 max8660_reg[id].name);
0490 return PTR_ERR(rdev);
0491 }
0492 }
0493
0494 i2c_set_clientdata(client, max8660);
0495 return 0;
0496 }
0497
0498 static const struct i2c_device_id max8660_id[] = {
0499 { .name = "max8660", .driver_data = MAX8660 },
0500 { .name = "max8661", .driver_data = MAX8661 },
0501 { }
0502 };
0503 MODULE_DEVICE_TABLE(i2c, max8660_id);
0504
0505 static struct i2c_driver max8660_driver = {
0506 .probe = max8660_probe,
0507 .driver = {
0508 .name = "max8660",
0509 },
0510 .id_table = max8660_id,
0511 };
0512
0513 static int __init max8660_init(void)
0514 {
0515 return i2c_add_driver(&max8660_driver);
0516 }
0517 subsys_initcall(max8660_init);
0518
0519 static void __exit max8660_exit(void)
0520 {
0521 i2c_del_driver(&max8660_driver);
0522 }
0523 module_exit(max8660_exit);
0524
0525
0526 MODULE_DESCRIPTION("MAXIM 8660/8661 voltage regulator driver");
0527 MODULE_AUTHOR("Wolfram Sang");
0528 MODULE_LICENSE("GPL v2");