Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge remote-tracking branch 'regulator/topic/sec' into regulator-next

+212 -46
+201 -46
drivers/regulator/s2mps11.c
··· 16 16 #include <linux/gpio.h> 17 17 #include <linux/slab.h> 18 18 #include <linux/module.h> 19 + #include <linux/of.h> 20 + #include <linux/regmap.h> 19 21 #include <linux/platform_device.h> 20 22 #include <linux/regulator/driver.h> 21 23 #include <linux/regulator/machine.h> 24 + #include <linux/regulator/of_regulator.h> 22 25 #include <linux/mfd/samsung/core.h> 23 26 #include <linux/mfd/samsung/s2mps11.h> 27 + 28 + #define S2MPS11_REGULATOR_CNT ARRAY_SIZE(regulators) 24 29 25 30 struct s2mps11_info { 26 31 struct regulator_dev *rdev[S2MPS11_REGULATOR_MAX]; ··· 36 31 int ramp_delay16; 37 32 int ramp_delay7810; 38 33 int ramp_delay9; 39 - 40 - bool buck6_ramp; 41 - bool buck2_ramp; 42 - bool buck3_ramp; 43 - bool buck4_ramp; 44 34 }; 45 35 46 36 static int get_ramp_delay(int ramp_delay) ··· 50 50 break; 51 51 cnt++; 52 52 } 53 + 54 + if (cnt > 3) 55 + cnt = 3; 56 + 53 57 return cnt; 58 + } 59 + 60 + static int s2mps11_regulator_set_voltage_time_sel(struct regulator_dev *rdev, 61 + unsigned int old_selector, 62 + unsigned int new_selector) 63 + { 64 + struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev); 65 + unsigned int ramp_delay = 0; 66 + int old_volt, new_volt; 67 + 68 + switch (rdev->desc->id) { 69 + case S2MPS11_BUCK2: 70 + ramp_delay = s2mps11->ramp_delay2; 71 + break; 72 + case S2MPS11_BUCK3: 73 + ramp_delay = s2mps11->ramp_delay34; 74 + break; 75 + case S2MPS11_BUCK4: 76 + ramp_delay = s2mps11->ramp_delay34; 77 + break; 78 + case S2MPS11_BUCK5: 79 + ramp_delay = s2mps11->ramp_delay5; 80 + break; 81 + case S2MPS11_BUCK6: 82 + case S2MPS11_BUCK1: 83 + ramp_delay = s2mps11->ramp_delay16; 84 + break; 85 + case S2MPS11_BUCK7: 86 + case S2MPS11_BUCK8: 87 + case S2MPS11_BUCK10: 88 + ramp_delay = s2mps11->ramp_delay7810; 89 + break; 90 + case S2MPS11_BUCK9: 91 + ramp_delay = s2mps11->ramp_delay9; 92 + } 93 + 94 + if (ramp_delay == 0) 95 + ramp_delay = rdev->desc->ramp_delay; 96 + 97 + old_volt = rdev->desc->min_uV + (rdev->desc->uV_step * old_selector); 98 + new_volt = rdev->desc->min_uV + (rdev->desc->uV_step * new_selector); 99 + 100 + return DIV_ROUND_UP(abs(new_volt - old_volt), ramp_delay); 101 + } 102 + 103 + static int s2mps11_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay) 104 + { 105 + struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev); 106 + unsigned int ramp_val, ramp_shift, ramp_reg = S2MPS11_REG_RAMP_BUCK; 107 + unsigned int ramp_enable = 1, enable_shift = 0; 108 + int ret; 109 + 110 + switch (rdev->desc->id) { 111 + case S2MPS11_BUCK1: 112 + if (ramp_delay > s2mps11->ramp_delay16) 113 + s2mps11->ramp_delay16 = ramp_delay; 114 + else 115 + ramp_delay = s2mps11->ramp_delay16; 116 + 117 + ramp_shift = S2MPS11_BUCK16_RAMP_SHIFT; 118 + break; 119 + case S2MPS11_BUCK2: 120 + enable_shift = S2MPS11_BUCK2_RAMP_EN_SHIFT; 121 + if (!ramp_delay) { 122 + ramp_enable = 0; 123 + break; 124 + } 125 + 126 + s2mps11->ramp_delay2 = ramp_delay; 127 + ramp_shift = S2MPS11_BUCK2_RAMP_SHIFT; 128 + ramp_reg = S2MPS11_REG_RAMP; 129 + break; 130 + case S2MPS11_BUCK3: 131 + enable_shift = S2MPS11_BUCK3_RAMP_EN_SHIFT; 132 + if (!ramp_delay) { 133 + ramp_enable = 0; 134 + break; 135 + } 136 + 137 + if (ramp_delay > s2mps11->ramp_delay34) 138 + s2mps11->ramp_delay34 = ramp_delay; 139 + else 140 + ramp_delay = s2mps11->ramp_delay34; 141 + 142 + ramp_shift = S2MPS11_BUCK34_RAMP_SHIFT; 143 + ramp_reg = S2MPS11_REG_RAMP; 144 + break; 145 + case S2MPS11_BUCK4: 146 + enable_shift = S2MPS11_BUCK4_RAMP_EN_SHIFT; 147 + if (!ramp_delay) { 148 + ramp_enable = 0; 149 + break; 150 + } 151 + 152 + if (ramp_delay > s2mps11->ramp_delay34) 153 + s2mps11->ramp_delay34 = ramp_delay; 154 + else 155 + ramp_delay = s2mps11->ramp_delay34; 156 + 157 + ramp_shift = S2MPS11_BUCK34_RAMP_SHIFT; 158 + ramp_reg = S2MPS11_REG_RAMP; 159 + break; 160 + case S2MPS11_BUCK5: 161 + s2mps11->ramp_delay5 = ramp_delay; 162 + ramp_shift = S2MPS11_BUCK5_RAMP_SHIFT; 163 + break; 164 + case S2MPS11_BUCK6: 165 + enable_shift = S2MPS11_BUCK6_RAMP_EN_SHIFT; 166 + if (!ramp_delay) { 167 + ramp_enable = 0; 168 + break; 169 + } 170 + 171 + if (ramp_delay > s2mps11->ramp_delay16) 172 + s2mps11->ramp_delay16 = ramp_delay; 173 + else 174 + ramp_delay = s2mps11->ramp_delay16; 175 + 176 + ramp_shift = S2MPS11_BUCK16_RAMP_SHIFT; 177 + break; 178 + case S2MPS11_BUCK7: 179 + case S2MPS11_BUCK8: 180 + case S2MPS11_BUCK10: 181 + if (ramp_delay > s2mps11->ramp_delay7810) 182 + s2mps11->ramp_delay7810 = ramp_delay; 183 + else 184 + ramp_delay = s2mps11->ramp_delay7810; 185 + 186 + ramp_shift = S2MPS11_BUCK7810_RAMP_SHIFT; 187 + break; 188 + case S2MPS11_BUCK9: 189 + s2mps11->ramp_delay9 = ramp_delay; 190 + ramp_shift = S2MPS11_BUCK9_RAMP_SHIFT; 191 + break; 192 + default: 193 + return 0; 194 + } 195 + 196 + if (!ramp_enable) 197 + goto ramp_disable; 198 + 199 + if (enable_shift) { 200 + ret = regmap_update_bits(rdev->regmap, S2MPS11_REG_RAMP, 201 + 1 << enable_shift, 1 << enable_shift); 202 + if (ret) { 203 + dev_err(&rdev->dev, "failed to enable ramp rate\n"); 204 + return ret; 205 + } 206 + } 207 + 208 + ramp_val = get_ramp_delay(ramp_delay); 209 + 210 + return regmap_update_bits(rdev->regmap, ramp_reg, 0x3 << ramp_shift, 211 + ramp_val << ramp_shift); 212 + 213 + ramp_disable: 214 + return regmap_update_bits(rdev->regmap, S2MPS11_REG_RAMP, 215 + 1 << enable_shift, 0); 54 216 } 55 217 56 218 static struct regulator_ops s2mps11_ldo_ops = { ··· 234 72 .disable = regulator_disable_regmap, 235 73 .get_voltage_sel = regulator_get_voltage_sel_regmap, 236 74 .set_voltage_sel = regulator_set_voltage_sel_regmap, 237 - .set_voltage_time_sel = regulator_set_voltage_time_sel, 75 + .set_voltage_time_sel = s2mps11_regulator_set_voltage_time_sel, 76 + .set_ramp_delay = s2mps11_set_ramp_delay, 238 77 }; 239 78 240 79 #define regulator_desc_ldo1(num) { \ ··· 402 239 { 403 240 struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent); 404 241 struct sec_platform_data *pdata = dev_get_platdata(iodev->dev); 242 + struct of_regulator_match rdata[S2MPS11_REGULATOR_MAX]; 243 + struct device_node *reg_np = NULL; 405 244 struct regulator_config config = { }; 406 245 struct s2mps11_info *s2mps11; 407 246 int i, ret; 408 - unsigned char ramp_enable, ramp_reg = 0; 409 - 410 - if (!pdata) { 411 - dev_err(pdev->dev.parent, "Platform data not supplied\n"); 412 - return -ENODEV; 413 - } 414 247 415 248 s2mps11 = devm_kzalloc(&pdev->dev, sizeof(struct s2mps11_info), 416 249 GFP_KERNEL); 417 250 if (!s2mps11) 418 251 return -ENOMEM; 419 252 420 - platform_set_drvdata(pdev, s2mps11); 421 - 422 - s2mps11->ramp_delay2 = pdata->buck2_ramp_delay; 423 - s2mps11->ramp_delay34 = pdata->buck34_ramp_delay; 424 - s2mps11->ramp_delay5 = pdata->buck5_ramp_delay; 425 - s2mps11->ramp_delay16 = pdata->buck16_ramp_delay; 426 - s2mps11->ramp_delay7810 = pdata->buck7810_ramp_delay; 427 - s2mps11->ramp_delay9 = pdata->buck9_ramp_delay; 428 - 429 - s2mps11->buck6_ramp = pdata->buck6_ramp_enable; 430 - s2mps11->buck2_ramp = pdata->buck2_ramp_enable; 431 - s2mps11->buck3_ramp = pdata->buck3_ramp_enable; 432 - s2mps11->buck4_ramp = pdata->buck4_ramp_enable; 433 - 434 - ramp_enable = (s2mps11->buck2_ramp << 3) | (s2mps11->buck3_ramp << 2) | 435 - (s2mps11->buck4_ramp << 1) | s2mps11->buck6_ramp ; 436 - 437 - if (ramp_enable) { 438 - if (s2mps11->buck2_ramp) 439 - ramp_reg |= get_ramp_delay(s2mps11->ramp_delay2) << 6; 440 - if (s2mps11->buck3_ramp || s2mps11->buck4_ramp) 441 - ramp_reg |= get_ramp_delay(s2mps11->ramp_delay34) << 4; 442 - sec_reg_write(iodev, S2MPS11_REG_RAMP, ramp_reg | ramp_enable); 253 + if (!iodev->dev->of_node) { 254 + if (pdata) { 255 + goto common_reg; 256 + } else { 257 + dev_err(pdev->dev.parent, 258 + "Platform data or DT node not supplied\n"); 259 + return -ENODEV; 260 + } 443 261 } 444 262 445 - ramp_reg &= 0x00; 446 - ramp_reg |= get_ramp_delay(s2mps11->ramp_delay5) << 6; 447 - ramp_reg |= get_ramp_delay(s2mps11->ramp_delay16) << 4; 448 - ramp_reg |= get_ramp_delay(s2mps11->ramp_delay7810) << 2; 449 - ramp_reg |= get_ramp_delay(s2mps11->ramp_delay9); 450 - sec_reg_write(iodev, S2MPS11_REG_RAMP_BUCK, ramp_reg); 263 + for (i = 0; i < S2MPS11_REGULATOR_CNT; i++) 264 + rdata[i].name = regulators[i].name; 451 265 266 + reg_np = of_find_node_by_name(iodev->dev->of_node, "regulators"); 267 + if (!reg_np) { 268 + dev_err(&pdev->dev, "could not find regulators sub-node\n"); 269 + return -EINVAL; 270 + } 271 + 272 + of_regulator_match(&pdev->dev, reg_np, rdata, S2MPS11_REGULATOR_MAX); 273 + 274 + common_reg: 275 + platform_set_drvdata(pdev, s2mps11); 276 + 277 + config.dev = &pdev->dev; 278 + config.regmap = iodev->regmap; 279 + config.driver_data = s2mps11; 452 280 for (i = 0; i < S2MPS11_REGULATOR_MAX; i++) { 453 - 454 - config.dev = &pdev->dev; 455 - config.regmap = iodev->regmap; 456 - config.init_data = pdata->regulators[i].initdata; 457 - config.driver_data = s2mps11; 281 + if (!reg_np) { 282 + config.init_data = pdata->regulators[i].initdata; 283 + } else { 284 + config.init_data = rdata[i].init_data; 285 + config.of_node = rdata[i].of_node; 286 + } 458 287 459 288 s2mps11->rdev[i] = regulator_register(&regulators[i], &config); 460 289 if (IS_ERR(s2mps11->rdev[i])) {
+11
include/linux/mfd/samsung/s2mps11.h
··· 191 191 #define S2MPS11_BUCK_N_VOLTAGES (S2MPS11_BUCK_VSEL_MASK + 1) 192 192 #define S2MPS11_RAMP_DELAY 25000 /* uV/us */ 193 193 194 + 195 + #define S2MPS11_BUCK2_RAMP_SHIFT 6 196 + #define S2MPS11_BUCK34_RAMP_SHIFT 4 197 + #define S2MPS11_BUCK5_RAMP_SHIFT 6 198 + #define S2MPS11_BUCK16_RAMP_SHIFT 4 199 + #define S2MPS11_BUCK7810_RAMP_SHIFT 2 200 + #define S2MPS11_BUCK9_RAMP_SHIFT 0 201 + #define S2MPS11_BUCK2_RAMP_EN_SHIFT 3 202 + #define S2MPS11_BUCK3_RAMP_EN_SHIFT 2 203 + #define S2MPS11_BUCK4_RAMP_EN_SHIFT 1 204 + #define S2MPS11_BUCK6_RAMP_EN_SHIFT 0 194 205 #define S2MPS11_PMIC_EN_SHIFT 6 195 206 #define S2MPS11_REGULATOR_MAX (S2MPS11_REG_MAX - 3) 196 207