0001
0002
0003
0004
0005
0006 #include <linux/bug.h>
0007 #include <linux/err.h>
0008 #include <linux/gpio.h>
0009 #include <linux/slab.h>
0010 #include <linux/module.h>
0011 #include <linux/of.h>
0012 #include <linux/regmap.h>
0013 #include <linux/platform_device.h>
0014 #include <linux/regulator/driver.h>
0015 #include <linux/regulator/machine.h>
0016 #include <linux/regulator/of_regulator.h>
0017 #include <linux/mfd/samsung/core.h>
0018 #include <linux/mfd/samsung/s2mpa01.h>
0019
0020 struct s2mpa01_info {
0021 int ramp_delay24;
0022 int ramp_delay3;
0023 int ramp_delay5;
0024 int ramp_delay16;
0025 int ramp_delay7;
0026 int ramp_delay8910;
0027 };
0028
0029 static int get_ramp_delay(int ramp_delay)
0030 {
0031 unsigned char cnt = 0;
0032
0033 ramp_delay /= 6250;
0034
0035 while (true) {
0036 ramp_delay = ramp_delay >> 1;
0037 if (ramp_delay == 0)
0038 break;
0039 cnt++;
0040 }
0041
0042 if (cnt > 3)
0043 cnt = 3;
0044
0045 return cnt;
0046 }
0047
0048 static int s2mpa01_regulator_set_voltage_time_sel(struct regulator_dev *rdev,
0049 unsigned int old_selector,
0050 unsigned int new_selector)
0051 {
0052 struct s2mpa01_info *s2mpa01 = rdev_get_drvdata(rdev);
0053 unsigned int ramp_delay = 0;
0054 int old_volt, new_volt;
0055
0056 switch (rdev_get_id(rdev)) {
0057 case S2MPA01_BUCK2:
0058 case S2MPA01_BUCK4:
0059 ramp_delay = s2mpa01->ramp_delay24;
0060 break;
0061 case S2MPA01_BUCK3:
0062 ramp_delay = s2mpa01->ramp_delay3;
0063 break;
0064 case S2MPA01_BUCK5:
0065 ramp_delay = s2mpa01->ramp_delay5;
0066 break;
0067 case S2MPA01_BUCK1:
0068 case S2MPA01_BUCK6:
0069 ramp_delay = s2mpa01->ramp_delay16;
0070 break;
0071 case S2MPA01_BUCK7:
0072 ramp_delay = s2mpa01->ramp_delay7;
0073 break;
0074 case S2MPA01_BUCK8:
0075 case S2MPA01_BUCK9:
0076 case S2MPA01_BUCK10:
0077 ramp_delay = s2mpa01->ramp_delay8910;
0078 break;
0079 }
0080
0081 if (ramp_delay == 0)
0082 ramp_delay = rdev->desc->ramp_delay;
0083
0084 old_volt = rdev->desc->min_uV + (rdev->desc->uV_step * old_selector);
0085 new_volt = rdev->desc->min_uV + (rdev->desc->uV_step * new_selector);
0086
0087 return DIV_ROUND_UP(abs(new_volt - old_volt), ramp_delay);
0088 }
0089
0090 static int s2mpa01_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
0091 {
0092 struct s2mpa01_info *s2mpa01 = rdev_get_drvdata(rdev);
0093 unsigned int ramp_val, ramp_shift, ramp_reg = S2MPA01_REG_RAMP2;
0094 unsigned int ramp_enable = 1, enable_shift = 0;
0095 int ret;
0096
0097 switch (rdev_get_id(rdev)) {
0098 case S2MPA01_BUCK1:
0099 enable_shift = S2MPA01_BUCK1_RAMP_EN_SHIFT;
0100 if (!ramp_delay) {
0101 ramp_enable = 0;
0102 break;
0103 }
0104
0105 if (ramp_delay > s2mpa01->ramp_delay16)
0106 s2mpa01->ramp_delay16 = ramp_delay;
0107 else
0108 ramp_delay = s2mpa01->ramp_delay16;
0109
0110 ramp_shift = S2MPA01_BUCK16_RAMP_SHIFT;
0111 break;
0112 case S2MPA01_BUCK2:
0113 enable_shift = S2MPA01_BUCK2_RAMP_EN_SHIFT;
0114 if (!ramp_delay) {
0115 ramp_enable = 0;
0116 break;
0117 }
0118
0119 if (ramp_delay > s2mpa01->ramp_delay24)
0120 s2mpa01->ramp_delay24 = ramp_delay;
0121 else
0122 ramp_delay = s2mpa01->ramp_delay24;
0123
0124 ramp_shift = S2MPA01_BUCK24_RAMP_SHIFT;
0125 ramp_reg = S2MPA01_REG_RAMP1;
0126 break;
0127 case S2MPA01_BUCK3:
0128 enable_shift = S2MPA01_BUCK3_RAMP_EN_SHIFT;
0129 if (!ramp_delay) {
0130 ramp_enable = 0;
0131 break;
0132 }
0133
0134 s2mpa01->ramp_delay3 = ramp_delay;
0135 ramp_shift = S2MPA01_BUCK3_RAMP_SHIFT;
0136 ramp_reg = S2MPA01_REG_RAMP1;
0137 break;
0138 case S2MPA01_BUCK4:
0139 enable_shift = S2MPA01_BUCK4_RAMP_EN_SHIFT;
0140 if (!ramp_delay) {
0141 ramp_enable = 0;
0142 break;
0143 }
0144
0145 if (ramp_delay > s2mpa01->ramp_delay24)
0146 s2mpa01->ramp_delay24 = ramp_delay;
0147 else
0148 ramp_delay = s2mpa01->ramp_delay24;
0149
0150 ramp_shift = S2MPA01_BUCK24_RAMP_SHIFT;
0151 ramp_reg = S2MPA01_REG_RAMP1;
0152 break;
0153 case S2MPA01_BUCK5:
0154 s2mpa01->ramp_delay5 = ramp_delay;
0155 ramp_shift = S2MPA01_BUCK5_RAMP_SHIFT;
0156 break;
0157 case S2MPA01_BUCK6:
0158 if (ramp_delay > s2mpa01->ramp_delay16)
0159 s2mpa01->ramp_delay16 = ramp_delay;
0160 else
0161 ramp_delay = s2mpa01->ramp_delay16;
0162
0163 ramp_shift = S2MPA01_BUCK16_RAMP_SHIFT;
0164 break;
0165 case S2MPA01_BUCK7:
0166 s2mpa01->ramp_delay7 = ramp_delay;
0167 ramp_shift = S2MPA01_BUCK7_RAMP_SHIFT;
0168 break;
0169 case S2MPA01_BUCK8:
0170 case S2MPA01_BUCK9:
0171 case S2MPA01_BUCK10:
0172 if (ramp_delay > s2mpa01->ramp_delay8910)
0173 s2mpa01->ramp_delay8910 = ramp_delay;
0174 else
0175 ramp_delay = s2mpa01->ramp_delay8910;
0176
0177 ramp_shift = S2MPA01_BUCK8910_RAMP_SHIFT;
0178 break;
0179 default:
0180 return 0;
0181 }
0182
0183 if (!ramp_enable)
0184 goto ramp_disable;
0185
0186
0187 if (rdev_get_id(rdev) >= S2MPA01_BUCK1 &&
0188 rdev_get_id(rdev) <= S2MPA01_BUCK4) {
0189 ret = regmap_update_bits(rdev->regmap, S2MPA01_REG_RAMP1,
0190 1 << enable_shift, 1 << enable_shift);
0191 if (ret) {
0192 dev_err(&rdev->dev, "failed to enable ramp rate\n");
0193 return ret;
0194 }
0195 }
0196
0197 ramp_val = get_ramp_delay(ramp_delay);
0198
0199 return regmap_update_bits(rdev->regmap, ramp_reg, 0x3 << ramp_shift,
0200 ramp_val << ramp_shift);
0201
0202 ramp_disable:
0203 return regmap_update_bits(rdev->regmap, S2MPA01_REG_RAMP1,
0204 1 << enable_shift, 0);
0205 }
0206
0207 static const struct regulator_ops s2mpa01_ldo_ops = {
0208 .list_voltage = regulator_list_voltage_linear,
0209 .map_voltage = regulator_map_voltage_linear,
0210 .is_enabled = regulator_is_enabled_regmap,
0211 .enable = regulator_enable_regmap,
0212 .disable = regulator_disable_regmap,
0213 .get_voltage_sel = regulator_get_voltage_sel_regmap,
0214 .set_voltage_sel = regulator_set_voltage_sel_regmap,
0215 .set_voltage_time_sel = regulator_set_voltage_time_sel,
0216 };
0217
0218 static const struct regulator_ops s2mpa01_buck_ops = {
0219 .list_voltage = regulator_list_voltage_linear,
0220 .map_voltage = regulator_map_voltage_linear,
0221 .is_enabled = regulator_is_enabled_regmap,
0222 .enable = regulator_enable_regmap,
0223 .disable = regulator_disable_regmap,
0224 .get_voltage_sel = regulator_get_voltage_sel_regmap,
0225 .set_voltage_sel = regulator_set_voltage_sel_regmap,
0226 .set_voltage_time_sel = s2mpa01_regulator_set_voltage_time_sel,
0227 .set_ramp_delay = s2mpa01_set_ramp_delay,
0228 };
0229
0230 #define regulator_desc_ldo(num, step) { \
0231 .name = "LDO"#num, \
0232 .of_match = of_match_ptr("LDO"#num), \
0233 .regulators_node = of_match_ptr("regulators"), \
0234 .id = S2MPA01_LDO##num, \
0235 .ops = &s2mpa01_ldo_ops, \
0236 .type = REGULATOR_VOLTAGE, \
0237 .owner = THIS_MODULE, \
0238 .min_uV = MIN_800_MV, \
0239 .uV_step = step, \
0240 .n_voltages = S2MPA01_LDO_N_VOLTAGES, \
0241 .vsel_reg = S2MPA01_REG_L1CTRL + num - 1, \
0242 .vsel_mask = S2MPA01_LDO_VSEL_MASK, \
0243 .enable_reg = S2MPA01_REG_L1CTRL + num - 1, \
0244 .enable_mask = S2MPA01_ENABLE_MASK \
0245 }
0246
0247 #define regulator_desc_buck1_4(num) { \
0248 .name = "BUCK"#num, \
0249 .of_match = of_match_ptr("BUCK"#num), \
0250 .regulators_node = of_match_ptr("regulators"), \
0251 .id = S2MPA01_BUCK##num, \
0252 .ops = &s2mpa01_buck_ops, \
0253 .type = REGULATOR_VOLTAGE, \
0254 .owner = THIS_MODULE, \
0255 .min_uV = MIN_600_MV, \
0256 .uV_step = STEP_6_25_MV, \
0257 .n_voltages = S2MPA01_BUCK_N_VOLTAGES, \
0258 .ramp_delay = S2MPA01_RAMP_DELAY, \
0259 .vsel_reg = S2MPA01_REG_B1CTRL2 + (num - 1) * 2, \
0260 .vsel_mask = S2MPA01_BUCK_VSEL_MASK, \
0261 .enable_reg = S2MPA01_REG_B1CTRL1 + (num - 1) * 2, \
0262 .enable_mask = S2MPA01_ENABLE_MASK \
0263 }
0264
0265 #define regulator_desc_buck5 { \
0266 .name = "BUCK5", \
0267 .of_match = of_match_ptr("BUCK5"), \
0268 .regulators_node = of_match_ptr("regulators"), \
0269 .id = S2MPA01_BUCK5, \
0270 .ops = &s2mpa01_buck_ops, \
0271 .type = REGULATOR_VOLTAGE, \
0272 .owner = THIS_MODULE, \
0273 .min_uV = MIN_800_MV, \
0274 .uV_step = STEP_6_25_MV, \
0275 .n_voltages = S2MPA01_BUCK_N_VOLTAGES, \
0276 .ramp_delay = S2MPA01_RAMP_DELAY, \
0277 .vsel_reg = S2MPA01_REG_B5CTRL2, \
0278 .vsel_mask = S2MPA01_BUCK_VSEL_MASK, \
0279 .enable_reg = S2MPA01_REG_B5CTRL1, \
0280 .enable_mask = S2MPA01_ENABLE_MASK \
0281 }
0282
0283 #define regulator_desc_buck6_10(num, min, step) { \
0284 .name = "BUCK"#num, \
0285 .of_match = of_match_ptr("BUCK"#num), \
0286 .regulators_node = of_match_ptr("regulators"), \
0287 .id = S2MPA01_BUCK##num, \
0288 .ops = &s2mpa01_buck_ops, \
0289 .type = REGULATOR_VOLTAGE, \
0290 .owner = THIS_MODULE, \
0291 .min_uV = min, \
0292 .uV_step = step, \
0293 .n_voltages = S2MPA01_BUCK_N_VOLTAGES, \
0294 .ramp_delay = S2MPA01_RAMP_DELAY, \
0295 .vsel_reg = S2MPA01_REG_B6CTRL2 + (num - 6) * 2, \
0296 .vsel_mask = S2MPA01_BUCK_VSEL_MASK, \
0297 .enable_reg = S2MPA01_REG_B6CTRL1 + (num - 6) * 2, \
0298 .enable_mask = S2MPA01_ENABLE_MASK \
0299 }
0300
0301 static const struct regulator_desc regulators[] = {
0302 regulator_desc_ldo(1, STEP_25_MV),
0303 regulator_desc_ldo(2, STEP_50_MV),
0304 regulator_desc_ldo(3, STEP_50_MV),
0305 regulator_desc_ldo(4, STEP_50_MV),
0306 regulator_desc_ldo(5, STEP_25_MV),
0307 regulator_desc_ldo(6, STEP_25_MV),
0308 regulator_desc_ldo(7, STEP_50_MV),
0309 regulator_desc_ldo(8, STEP_50_MV),
0310 regulator_desc_ldo(9, STEP_50_MV),
0311 regulator_desc_ldo(10, STEP_50_MV),
0312 regulator_desc_ldo(11, STEP_50_MV),
0313 regulator_desc_ldo(12, STEP_50_MV),
0314 regulator_desc_ldo(13, STEP_50_MV),
0315 regulator_desc_ldo(14, STEP_50_MV),
0316 regulator_desc_ldo(15, STEP_50_MV),
0317 regulator_desc_ldo(16, STEP_50_MV),
0318 regulator_desc_ldo(17, STEP_50_MV),
0319 regulator_desc_ldo(18, STEP_50_MV),
0320 regulator_desc_ldo(19, STEP_50_MV),
0321 regulator_desc_ldo(20, STEP_50_MV),
0322 regulator_desc_ldo(21, STEP_50_MV),
0323 regulator_desc_ldo(22, STEP_50_MV),
0324 regulator_desc_ldo(23, STEP_50_MV),
0325 regulator_desc_ldo(24, STEP_50_MV),
0326 regulator_desc_ldo(25, STEP_50_MV),
0327 regulator_desc_ldo(26, STEP_25_MV),
0328 regulator_desc_buck1_4(1),
0329 regulator_desc_buck1_4(2),
0330 regulator_desc_buck1_4(3),
0331 regulator_desc_buck1_4(4),
0332 regulator_desc_buck5,
0333 regulator_desc_buck6_10(6, MIN_600_MV, STEP_6_25_MV),
0334 regulator_desc_buck6_10(7, MIN_600_MV, STEP_6_25_MV),
0335 regulator_desc_buck6_10(8, MIN_800_MV, STEP_12_5_MV),
0336 regulator_desc_buck6_10(9, MIN_1500_MV, STEP_12_5_MV),
0337 regulator_desc_buck6_10(10, MIN_1000_MV, STEP_12_5_MV),
0338 };
0339
0340 static int s2mpa01_pmic_probe(struct platform_device *pdev)
0341 {
0342 struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent);
0343 struct regulator_config config = { };
0344 struct s2mpa01_info *s2mpa01;
0345 int i;
0346
0347 s2mpa01 = devm_kzalloc(&pdev->dev, sizeof(*s2mpa01), GFP_KERNEL);
0348 if (!s2mpa01)
0349 return -ENOMEM;
0350
0351 config.dev = iodev->dev;
0352 config.regmap = iodev->regmap_pmic;
0353 config.driver_data = s2mpa01;
0354
0355 for (i = 0; i < S2MPA01_REGULATOR_MAX; i++) {
0356 struct regulator_dev *rdev;
0357
0358 rdev = devm_regulator_register(&pdev->dev,
0359 ®ulators[i], &config);
0360 if (IS_ERR(rdev)) {
0361 dev_err(&pdev->dev, "regulator init failed for %d\n",
0362 i);
0363 return PTR_ERR(rdev);
0364 }
0365 }
0366
0367 return 0;
0368 }
0369
0370 static const struct platform_device_id s2mpa01_pmic_id[] = {
0371 { "s2mpa01-pmic", 0},
0372 { },
0373 };
0374 MODULE_DEVICE_TABLE(platform, s2mpa01_pmic_id);
0375
0376 static struct platform_driver s2mpa01_pmic_driver = {
0377 .driver = {
0378 .name = "s2mpa01-pmic",
0379 },
0380 .probe = s2mpa01_pmic_probe,
0381 .id_table = s2mpa01_pmic_id,
0382 };
0383
0384 module_platform_driver(s2mpa01_pmic_driver);
0385
0386
0387 MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
0388 MODULE_AUTHOR("Sachin Kamat <sachin.kamat@samsung.com>");
0389 MODULE_DESCRIPTION("Samsung S2MPA01 Regulator Driver");
0390 MODULE_LICENSE("GPL");