0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/module.h>
0012 #include <linux/param.h>
0013 #include <linux/err.h>
0014 #include <linux/platform_device.h>
0015 #include <linux/regulator/driver.h>
0016 #include <linux/regulator/machine.h>
0017 #include <linux/regulator/of_regulator.h>
0018 #include <linux/of_device.h>
0019 #include <linux/i2c.h>
0020 #include <linux/slab.h>
0021 #include <linux/regmap.h>
0022 #include <linux/regulator/fan53555.h>
0023
0024
0025 #define FAN53555_VSEL0 0x00
0026 #define FAN53555_VSEL1 0x01
0027
0028 #define TCS4525_VSEL0 0x11
0029 #define TCS4525_VSEL1 0x10
0030 #define TCS4525_TIME 0x13
0031 #define TCS4525_COMMAND 0x14
0032
0033
0034 #define FAN53555_CONTROL 0x02
0035
0036 #define FAN53555_ID1 0x03
0037
0038 #define FAN53555_ID2 0x04
0039
0040 #define FAN53555_MONITOR 0x05
0041
0042
0043 #define VSEL_BUCK_EN (1 << 7)
0044 #define VSEL_MODE (1 << 6)
0045
0046 #define DIE_ID 0x0F
0047 #define DIE_REV 0x0F
0048
0049 #define CTL_OUTPUT_DISCHG (1 << 7)
0050 #define CTL_SLEW_MASK (0x7 << 4)
0051 #define CTL_SLEW_SHIFT 4
0052 #define CTL_RESET (1 << 2)
0053 #define CTL_MODE_VSEL0_MODE BIT(0)
0054 #define CTL_MODE_VSEL1_MODE BIT(1)
0055
0056 #define FAN53555_NVOLTAGES 64
0057 #define FAN53526_NVOLTAGES 128
0058
0059 #define TCS_VSEL0_MODE (1 << 7)
0060 #define TCS_VSEL1_MODE (1 << 6)
0061
0062 #define TCS_SLEW_SHIFT 3
0063 #define TCS_SLEW_MASK (0x3 < 3)
0064
0065 enum fan53555_vendor {
0066 FAN53526_VENDOR_FAIRCHILD = 0,
0067 FAN53555_VENDOR_FAIRCHILD,
0068 FAN53555_VENDOR_SILERGY,
0069 FAN53526_VENDOR_TCS,
0070 };
0071
0072 enum {
0073 FAN53526_CHIP_ID_01 = 1,
0074 };
0075
0076 enum {
0077 FAN53526_CHIP_REV_08 = 8,
0078 };
0079
0080
0081 enum {
0082 FAN53555_CHIP_ID_00 = 0,
0083 FAN53555_CHIP_ID_01,
0084 FAN53555_CHIP_ID_02,
0085 FAN53555_CHIP_ID_03,
0086 FAN53555_CHIP_ID_04,
0087 FAN53555_CHIP_ID_05,
0088 FAN53555_CHIP_ID_08 = 8,
0089 };
0090
0091 enum {
0092 TCS4525_CHIP_ID_12 = 12,
0093 };
0094
0095 enum {
0096 TCS4526_CHIP_ID_00 = 0,
0097 };
0098
0099
0100 enum {
0101 FAN53555_CHIP_REV_00 = 0x3,
0102 FAN53555_CHIP_REV_13 = 0xf,
0103 };
0104
0105 enum {
0106 SILERGY_SYR82X = 8,
0107 SILERGY_SYR83X = 9,
0108 };
0109
0110 struct fan53555_device_info {
0111 enum fan53555_vendor vendor;
0112 struct device *dev;
0113 struct regulator_desc desc;
0114 struct regulator_init_data *regulator;
0115
0116 int chip_id;
0117 int chip_rev;
0118
0119 unsigned int vol_reg;
0120 unsigned int sleep_reg;
0121
0122 unsigned int vsel_min;
0123 unsigned int vsel_step;
0124 unsigned int vsel_count;
0125
0126 unsigned int mode_reg;
0127 unsigned int mode_mask;
0128
0129 unsigned int sleep_vol_cache;
0130
0131 unsigned int slew_reg;
0132 unsigned int slew_mask;
0133 const unsigned int *ramp_delay_table;
0134 unsigned int n_ramp_values;
0135 unsigned int slew_rate;
0136 };
0137
0138 static int fan53555_set_suspend_voltage(struct regulator_dev *rdev, int uV)
0139 {
0140 struct fan53555_device_info *di = rdev_get_drvdata(rdev);
0141 int ret;
0142
0143 if (di->sleep_vol_cache == uV)
0144 return 0;
0145 ret = regulator_map_voltage_linear(rdev, uV, uV);
0146 if (ret < 0)
0147 return ret;
0148 ret = regmap_update_bits(rdev->regmap, di->sleep_reg,
0149 di->desc.vsel_mask, ret);
0150 if (ret < 0)
0151 return ret;
0152
0153
0154 di->sleep_vol_cache = uV;
0155
0156 return 0;
0157 }
0158
0159 static int fan53555_set_suspend_enable(struct regulator_dev *rdev)
0160 {
0161 struct fan53555_device_info *di = rdev_get_drvdata(rdev);
0162
0163 return regmap_update_bits(rdev->regmap, di->sleep_reg,
0164 VSEL_BUCK_EN, VSEL_BUCK_EN);
0165 }
0166
0167 static int fan53555_set_suspend_disable(struct regulator_dev *rdev)
0168 {
0169 struct fan53555_device_info *di = rdev_get_drvdata(rdev);
0170
0171 return regmap_update_bits(rdev->regmap, di->sleep_reg,
0172 VSEL_BUCK_EN, 0);
0173 }
0174
0175 static int fan53555_set_mode(struct regulator_dev *rdev, unsigned int mode)
0176 {
0177 struct fan53555_device_info *di = rdev_get_drvdata(rdev);
0178
0179 switch (mode) {
0180 case REGULATOR_MODE_FAST:
0181 regmap_update_bits(rdev->regmap, di->mode_reg,
0182 di->mode_mask, di->mode_mask);
0183 break;
0184 case REGULATOR_MODE_NORMAL:
0185 regmap_update_bits(rdev->regmap, di->vol_reg, di->mode_mask, 0);
0186 break;
0187 default:
0188 return -EINVAL;
0189 }
0190 return 0;
0191 }
0192
0193 static unsigned int fan53555_get_mode(struct regulator_dev *rdev)
0194 {
0195 struct fan53555_device_info *di = rdev_get_drvdata(rdev);
0196 unsigned int val;
0197 int ret = 0;
0198
0199 ret = regmap_read(rdev->regmap, di->mode_reg, &val);
0200 if (ret < 0)
0201 return ret;
0202 if (val & di->mode_mask)
0203 return REGULATOR_MODE_FAST;
0204 else
0205 return REGULATOR_MODE_NORMAL;
0206 }
0207
0208 static const unsigned int slew_rates[] = {
0209 64000,
0210 32000,
0211 16000,
0212 8000,
0213 4000,
0214 2000,
0215 1000,
0216 500,
0217 };
0218
0219 static const unsigned int tcs_slew_rates[] = {
0220 18700,
0221 9300,
0222 4600,
0223 2300,
0224 };
0225
0226 static const struct regulator_ops fan53555_regulator_ops = {
0227 .set_voltage_sel = regulator_set_voltage_sel_regmap,
0228 .get_voltage_sel = regulator_get_voltage_sel_regmap,
0229 .set_voltage_time_sel = regulator_set_voltage_time_sel,
0230 .map_voltage = regulator_map_voltage_linear,
0231 .list_voltage = regulator_list_voltage_linear,
0232 .set_suspend_voltage = fan53555_set_suspend_voltage,
0233 .enable = regulator_enable_regmap,
0234 .disable = regulator_disable_regmap,
0235 .is_enabled = regulator_is_enabled_regmap,
0236 .set_mode = fan53555_set_mode,
0237 .get_mode = fan53555_get_mode,
0238 .set_ramp_delay = regulator_set_ramp_delay_regmap,
0239 .set_suspend_enable = fan53555_set_suspend_enable,
0240 .set_suspend_disable = fan53555_set_suspend_disable,
0241 };
0242
0243 static int fan53526_voltages_setup_fairchild(struct fan53555_device_info *di)
0244 {
0245
0246 switch (di->chip_id) {
0247 case FAN53526_CHIP_ID_01:
0248 switch (di->chip_rev) {
0249 case FAN53526_CHIP_REV_08:
0250 di->vsel_min = 600000;
0251 di->vsel_step = 6250;
0252 break;
0253 default:
0254 dev_err(di->dev,
0255 "Chip ID %d with rev %d not supported!\n",
0256 di->chip_id, di->chip_rev);
0257 return -EINVAL;
0258 }
0259 break;
0260 default:
0261 dev_err(di->dev,
0262 "Chip ID %d not supported!\n", di->chip_id);
0263 return -EINVAL;
0264 }
0265
0266 di->slew_reg = FAN53555_CONTROL;
0267 di->slew_mask = CTL_SLEW_MASK;
0268 di->ramp_delay_table = slew_rates;
0269 di->n_ramp_values = ARRAY_SIZE(slew_rates);
0270 di->vsel_count = FAN53526_NVOLTAGES;
0271
0272 return 0;
0273 }
0274
0275 static int fan53555_voltages_setup_fairchild(struct fan53555_device_info *di)
0276 {
0277
0278 switch (di->chip_id) {
0279 case FAN53555_CHIP_ID_00:
0280 switch (di->chip_rev) {
0281 case FAN53555_CHIP_REV_00:
0282 di->vsel_min = 600000;
0283 di->vsel_step = 10000;
0284 break;
0285 case FAN53555_CHIP_REV_13:
0286 di->vsel_min = 800000;
0287 di->vsel_step = 10000;
0288 break;
0289 default:
0290 dev_err(di->dev,
0291 "Chip ID %d with rev %d not supported!\n",
0292 di->chip_id, di->chip_rev);
0293 return -EINVAL;
0294 }
0295 break;
0296 case FAN53555_CHIP_ID_01:
0297 case FAN53555_CHIP_ID_03:
0298 case FAN53555_CHIP_ID_05:
0299 case FAN53555_CHIP_ID_08:
0300 di->vsel_min = 600000;
0301 di->vsel_step = 10000;
0302 break;
0303 case FAN53555_CHIP_ID_04:
0304 di->vsel_min = 603000;
0305 di->vsel_step = 12826;
0306 break;
0307 default:
0308 dev_err(di->dev,
0309 "Chip ID %d not supported!\n", di->chip_id);
0310 return -EINVAL;
0311 }
0312 di->slew_reg = FAN53555_CONTROL;
0313 di->slew_mask = CTL_SLEW_MASK;
0314 di->ramp_delay_table = slew_rates;
0315 di->n_ramp_values = ARRAY_SIZE(slew_rates);
0316 di->vsel_count = FAN53555_NVOLTAGES;
0317
0318 return 0;
0319 }
0320
0321 static int fan53555_voltages_setup_silergy(struct fan53555_device_info *di)
0322 {
0323
0324 switch (di->chip_id) {
0325 case SILERGY_SYR82X:
0326 case SILERGY_SYR83X:
0327 di->vsel_min = 712500;
0328 di->vsel_step = 12500;
0329 break;
0330 default:
0331 dev_err(di->dev,
0332 "Chip ID %d not supported!\n", di->chip_id);
0333 return -EINVAL;
0334 }
0335 di->slew_reg = FAN53555_CONTROL;
0336 di->slew_mask = CTL_SLEW_MASK;
0337 di->ramp_delay_table = slew_rates;
0338 di->n_ramp_values = ARRAY_SIZE(slew_rates);
0339 di->vsel_count = FAN53555_NVOLTAGES;
0340
0341 return 0;
0342 }
0343
0344 static int fan53526_voltages_setup_tcs(struct fan53555_device_info *di)
0345 {
0346 switch (di->chip_id) {
0347 case TCS4525_CHIP_ID_12:
0348 case TCS4526_CHIP_ID_00:
0349 di->slew_reg = TCS4525_TIME;
0350 di->slew_mask = TCS_SLEW_MASK;
0351 di->ramp_delay_table = tcs_slew_rates;
0352 di->n_ramp_values = ARRAY_SIZE(tcs_slew_rates);
0353
0354
0355 di->vsel_min = 600000;
0356 di->vsel_step = 6250;
0357 di->vsel_count = FAN53526_NVOLTAGES;
0358 break;
0359 default:
0360 dev_err(di->dev, "Chip ID %d not supported!\n", di->chip_id);
0361 return -EINVAL;
0362 }
0363
0364 return 0;
0365 }
0366
0367
0368
0369
0370
0371
0372 static int fan53555_device_setup(struct fan53555_device_info *di,
0373 struct fan53555_platform_data *pdata)
0374 {
0375 int ret = 0;
0376
0377
0378 switch (di->vendor) {
0379 case FAN53526_VENDOR_FAIRCHILD:
0380 case FAN53555_VENDOR_FAIRCHILD:
0381 case FAN53555_VENDOR_SILERGY:
0382 switch (pdata->sleep_vsel_id) {
0383 case FAN53555_VSEL_ID_0:
0384 di->sleep_reg = FAN53555_VSEL0;
0385 di->vol_reg = FAN53555_VSEL1;
0386 break;
0387 case FAN53555_VSEL_ID_1:
0388 di->sleep_reg = FAN53555_VSEL1;
0389 di->vol_reg = FAN53555_VSEL0;
0390 break;
0391 default:
0392 dev_err(di->dev, "Invalid VSEL ID!\n");
0393 return -EINVAL;
0394 }
0395 break;
0396 case FAN53526_VENDOR_TCS:
0397 switch (pdata->sleep_vsel_id) {
0398 case FAN53555_VSEL_ID_0:
0399 di->sleep_reg = TCS4525_VSEL0;
0400 di->vol_reg = TCS4525_VSEL1;
0401 break;
0402 case FAN53555_VSEL_ID_1:
0403 di->sleep_reg = TCS4525_VSEL1;
0404 di->vol_reg = TCS4525_VSEL0;
0405 break;
0406 default:
0407 dev_err(di->dev, "Invalid VSEL ID!\n");
0408 return -EINVAL;
0409 }
0410 break;
0411 default:
0412 dev_err(di->dev, "vendor %d not supported!\n", di->vendor);
0413 return -EINVAL;
0414 }
0415
0416
0417 switch (di->vendor) {
0418 case FAN53526_VENDOR_FAIRCHILD:
0419 di->mode_reg = FAN53555_CONTROL;
0420
0421 switch (pdata->sleep_vsel_id) {
0422 case FAN53555_VSEL_ID_0:
0423 di->mode_mask = CTL_MODE_VSEL1_MODE;
0424 break;
0425 case FAN53555_VSEL_ID_1:
0426 di->mode_mask = CTL_MODE_VSEL0_MODE;
0427 break;
0428 }
0429 break;
0430 case FAN53555_VENDOR_FAIRCHILD:
0431 case FAN53555_VENDOR_SILERGY:
0432 di->mode_reg = di->vol_reg;
0433 di->mode_mask = VSEL_MODE;
0434 break;
0435 case FAN53526_VENDOR_TCS:
0436 di->mode_reg = TCS4525_COMMAND;
0437
0438 switch (pdata->sleep_vsel_id) {
0439 case FAN53555_VSEL_ID_0:
0440 di->mode_mask = TCS_VSEL1_MODE;
0441 break;
0442 case FAN53555_VSEL_ID_1:
0443 di->mode_mask = TCS_VSEL0_MODE;
0444 break;
0445 }
0446 break;
0447 default:
0448 dev_err(di->dev, "vendor %d not supported!\n", di->vendor);
0449 return -EINVAL;
0450 }
0451
0452
0453 switch (di->vendor) {
0454 case FAN53526_VENDOR_FAIRCHILD:
0455 ret = fan53526_voltages_setup_fairchild(di);
0456 break;
0457 case FAN53555_VENDOR_FAIRCHILD:
0458 ret = fan53555_voltages_setup_fairchild(di);
0459 break;
0460 case FAN53555_VENDOR_SILERGY:
0461 ret = fan53555_voltages_setup_silergy(di);
0462 break;
0463 case FAN53526_VENDOR_TCS:
0464 ret = fan53526_voltages_setup_tcs(di);
0465 break;
0466 default:
0467 dev_err(di->dev, "vendor %d not supported!\n", di->vendor);
0468 return -EINVAL;
0469 }
0470
0471 return ret;
0472 }
0473
0474 static int fan53555_regulator_register(struct fan53555_device_info *di,
0475 struct regulator_config *config)
0476 {
0477 struct regulator_desc *rdesc = &di->desc;
0478 struct regulator_dev *rdev;
0479
0480 rdesc->name = "fan53555-reg";
0481 rdesc->supply_name = "vin";
0482 rdesc->ops = &fan53555_regulator_ops;
0483 rdesc->type = REGULATOR_VOLTAGE;
0484 rdesc->n_voltages = di->vsel_count;
0485 rdesc->enable_reg = di->vol_reg;
0486 rdesc->enable_mask = VSEL_BUCK_EN;
0487 rdesc->min_uV = di->vsel_min;
0488 rdesc->uV_step = di->vsel_step;
0489 rdesc->vsel_reg = di->vol_reg;
0490 rdesc->vsel_mask = di->vsel_count - 1;
0491 rdesc->ramp_reg = di->slew_reg;
0492 rdesc->ramp_mask = di->slew_mask;
0493 rdesc->ramp_delay_table = di->ramp_delay_table;
0494 rdesc->n_ramp_values = di->n_ramp_values;
0495 rdesc->owner = THIS_MODULE;
0496
0497 rdev = devm_regulator_register(di->dev, &di->desc, config);
0498 return PTR_ERR_OR_ZERO(rdev);
0499 }
0500
0501 static const struct regmap_config fan53555_regmap_config = {
0502 .reg_bits = 8,
0503 .val_bits = 8,
0504 };
0505
0506 static struct fan53555_platform_data *fan53555_parse_dt(struct device *dev,
0507 struct device_node *np,
0508 const struct regulator_desc *desc)
0509 {
0510 struct fan53555_platform_data *pdata;
0511 int ret;
0512 u32 tmp;
0513
0514 pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
0515 if (!pdata)
0516 return NULL;
0517
0518 pdata->regulator = of_get_regulator_init_data(dev, np, desc);
0519
0520 ret = of_property_read_u32(np, "fcs,suspend-voltage-selector",
0521 &tmp);
0522 if (!ret)
0523 pdata->sleep_vsel_id = tmp;
0524
0525 return pdata;
0526 }
0527
0528 static const struct of_device_id __maybe_unused fan53555_dt_ids[] = {
0529 {
0530 .compatible = "fcs,fan53526",
0531 .data = (void *)FAN53526_VENDOR_FAIRCHILD,
0532 }, {
0533 .compatible = "fcs,fan53555",
0534 .data = (void *)FAN53555_VENDOR_FAIRCHILD
0535 }, {
0536 .compatible = "silergy,syr827",
0537 .data = (void *)FAN53555_VENDOR_SILERGY,
0538 }, {
0539 .compatible = "silergy,syr828",
0540 .data = (void *)FAN53555_VENDOR_SILERGY,
0541 }, {
0542 .compatible = "tcs,tcs4525",
0543 .data = (void *)FAN53526_VENDOR_TCS
0544 }, {
0545 .compatible = "tcs,tcs4526",
0546 .data = (void *)FAN53526_VENDOR_TCS
0547 },
0548 { }
0549 };
0550 MODULE_DEVICE_TABLE(of, fan53555_dt_ids);
0551
0552 static int fan53555_regulator_probe(struct i2c_client *client,
0553 const struct i2c_device_id *id)
0554 {
0555 struct device_node *np = client->dev.of_node;
0556 struct fan53555_device_info *di;
0557 struct fan53555_platform_data *pdata;
0558 struct regulator_config config = { };
0559 struct regmap *regmap;
0560 unsigned int val;
0561 int ret;
0562
0563 di = devm_kzalloc(&client->dev, sizeof(struct fan53555_device_info),
0564 GFP_KERNEL);
0565 if (!di)
0566 return -ENOMEM;
0567
0568 pdata = dev_get_platdata(&client->dev);
0569 if (!pdata)
0570 pdata = fan53555_parse_dt(&client->dev, np, &di->desc);
0571
0572 if (!pdata || !pdata->regulator) {
0573 dev_err(&client->dev, "Platform data not found!\n");
0574 return -ENODEV;
0575 }
0576
0577 di->regulator = pdata->regulator;
0578 if (client->dev.of_node) {
0579 di->vendor =
0580 (unsigned long)of_device_get_match_data(&client->dev);
0581 } else {
0582
0583 if (!di->regulator->constraints.ramp_delay) {
0584 if (pdata->slew_rate >= ARRAY_SIZE(slew_rates)) {
0585 dev_err(&client->dev, "Invalid slew_rate\n");
0586 return -EINVAL;
0587 }
0588
0589 di->regulator->constraints.ramp_delay
0590 = slew_rates[pdata->slew_rate];
0591 }
0592
0593 di->vendor = id->driver_data;
0594 }
0595
0596 regmap = devm_regmap_init_i2c(client, &fan53555_regmap_config);
0597 if (IS_ERR(regmap)) {
0598 dev_err(&client->dev, "Failed to allocate regmap!\n");
0599 return PTR_ERR(regmap);
0600 }
0601 di->dev = &client->dev;
0602 i2c_set_clientdata(client, di);
0603
0604 ret = regmap_read(regmap, FAN53555_ID1, &val);
0605 if (ret < 0) {
0606 dev_err(&client->dev, "Failed to get chip ID!\n");
0607 return ret;
0608 }
0609 di->chip_id = val & DIE_ID;
0610
0611 ret = regmap_read(regmap, FAN53555_ID2, &val);
0612 if (ret < 0) {
0613 dev_err(&client->dev, "Failed to get chip Rev!\n");
0614 return ret;
0615 }
0616 di->chip_rev = val & DIE_REV;
0617 dev_info(&client->dev, "FAN53555 Option[%d] Rev[%d] Detected!\n",
0618 di->chip_id, di->chip_rev);
0619
0620 ret = fan53555_device_setup(di, pdata);
0621 if (ret < 0) {
0622 dev_err(&client->dev, "Failed to setup device!\n");
0623 return ret;
0624 }
0625
0626 config.dev = di->dev;
0627 config.init_data = di->regulator;
0628 config.regmap = regmap;
0629 config.driver_data = di;
0630 config.of_node = np;
0631
0632 ret = fan53555_regulator_register(di, &config);
0633 if (ret < 0)
0634 dev_err(&client->dev, "Failed to register regulator!\n");
0635 return ret;
0636
0637 }
0638
0639 static const struct i2c_device_id fan53555_id[] = {
0640 {
0641 .name = "fan53526",
0642 .driver_data = FAN53526_VENDOR_FAIRCHILD
0643 }, {
0644 .name = "fan53555",
0645 .driver_data = FAN53555_VENDOR_FAIRCHILD
0646 }, {
0647 .name = "syr827",
0648 .driver_data = FAN53555_VENDOR_SILERGY
0649 }, {
0650 .name = "syr828",
0651 .driver_data = FAN53555_VENDOR_SILERGY
0652 }, {
0653 .name = "tcs4525",
0654 .driver_data = FAN53526_VENDOR_TCS
0655 }, {
0656 .name = "tcs4526",
0657 .driver_data = FAN53526_VENDOR_TCS
0658 },
0659 { },
0660 };
0661 MODULE_DEVICE_TABLE(i2c, fan53555_id);
0662
0663 static struct i2c_driver fan53555_regulator_driver = {
0664 .driver = {
0665 .name = "fan53555-regulator",
0666 .of_match_table = of_match_ptr(fan53555_dt_ids),
0667 },
0668 .probe = fan53555_regulator_probe,
0669 .id_table = fan53555_id,
0670 };
0671
0672 module_i2c_driver(fan53555_regulator_driver);
0673
0674 MODULE_AUTHOR("Yunfan Zhang <yfzhang@marvell.com>");
0675 MODULE_DESCRIPTION("FAN53555 regulator driver");
0676 MODULE_LICENSE("GPL v2");