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

regulator: fan53555: Add support for FAN53526

The FAN53526 differs from the FAN53555 only in that the mode bit in
VSEL0/VSEL1 is moved to the CONTROL register, the voltage selector mask
is extended by 1 bit and the step is different.

So extend the existing fan53555 driver to support FAN53526 as well.

Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Bjorn Andersson and committed by
Mark Brown
f2a9eb97 606640bb

+93 -11
+2 -1
Documentation/devicetree/bindings/regulator/fan53555.txt
··· 1 1 Binding for Fairchild FAN53555 regulators 2 2 3 3 Required properties: 4 - - compatible: one of "fcs,fan53555", "silergy,syr827", "silergy,syr828" 4 + - compatible: one of "fcs,fan53555", "fcs,fan53526", "silergy,syr827" or 5 + "silergy,syr828" 5 6 - reg: I2C address 6 7 7 8 Optional properties:
+91 -10
drivers/regulator/fan53555.c
··· 40 40 /* VSEL bit definitions */ 41 41 #define VSEL_BUCK_EN (1 << 7) 42 42 #define VSEL_MODE (1 << 6) 43 - #define VSEL_NSEL_MASK 0x3F 44 43 /* Chip ID and Verison */ 45 44 #define DIE_ID 0x0F /* ID1 */ 46 45 #define DIE_REV 0x0F /* ID2 */ ··· 48 49 #define CTL_SLEW_MASK (0x7 << 4) 49 50 #define CTL_SLEW_SHIFT 4 50 51 #define CTL_RESET (1 << 2) 52 + #define CTL_MODE_VSEL0_MODE BIT(0) 53 + #define CTL_MODE_VSEL1_MODE BIT(1) 51 54 52 55 #define FAN53555_NVOLTAGES 64 /* Numbers of voltages */ 56 + #define FAN53526_NVOLTAGES 128 53 57 54 58 enum fan53555_vendor { 55 - FAN53555_VENDOR_FAIRCHILD = 0, 59 + FAN53526_VENDOR_FAIRCHILD = 0, 60 + FAN53555_VENDOR_FAIRCHILD, 56 61 FAN53555_VENDOR_SILERGY, 62 + }; 63 + 64 + enum { 65 + FAN53526_CHIP_ID_01 = 1, 66 + }; 67 + 68 + enum { 69 + FAN53526_CHIP_REV_08 = 8, 57 70 }; 58 71 59 72 /* IC Type */ ··· 105 94 /* Voltage range and step(linear) */ 106 95 unsigned int vsel_min; 107 96 unsigned int vsel_step; 97 + unsigned int vsel_count; 108 98 /* Voltage slew rate limiting */ 109 99 unsigned int slew_rate; 100 + /* Mode */ 101 + unsigned int mode_reg; 102 + unsigned int mode_mask; 110 103 /* Sleep voltage cache */ 111 104 unsigned int sleep_vol_cache; 112 105 }; ··· 126 111 if (ret < 0) 127 112 return ret; 128 113 ret = regmap_update_bits(di->regmap, di->sleep_reg, 129 - VSEL_NSEL_MASK, ret); 114 + di->desc.vsel_mask, ret); 130 115 if (ret < 0) 131 116 return ret; 132 117 /* Cache the sleep voltage setting. ··· 158 143 159 144 switch (mode) { 160 145 case REGULATOR_MODE_FAST: 161 - regmap_update_bits(di->regmap, di->vol_reg, 162 - VSEL_MODE, VSEL_MODE); 146 + regmap_update_bits(di->regmap, di->mode_reg, 147 + di->mode_mask, di->mode_mask); 163 148 break; 164 149 case REGULATOR_MODE_NORMAL: 165 - regmap_update_bits(di->regmap, di->vol_reg, VSEL_MODE, 0); 150 + regmap_update_bits(di->regmap, di->vol_reg, di->mode_mask, 0); 166 151 break; 167 152 default: 168 153 return -EINVAL; ··· 176 161 unsigned int val; 177 162 int ret = 0; 178 163 179 - ret = regmap_read(di->regmap, di->vol_reg, &val); 164 + ret = regmap_read(di->regmap, di->mode_reg, &val); 180 165 if (ret < 0) 181 166 return ret; 182 - if (val & VSEL_MODE) 167 + if (val & di->mode_mask) 183 168 return REGULATOR_MODE_FAST; 184 169 else 185 170 return REGULATOR_MODE_NORMAL; ··· 234 219 .set_suspend_disable = fan53555_set_suspend_disable, 235 220 }; 236 221 222 + static int fan53526_voltages_setup_fairchild(struct fan53555_device_info *di) 223 + { 224 + /* Init voltage range and step */ 225 + switch (di->chip_id) { 226 + case FAN53526_CHIP_ID_01: 227 + switch (di->chip_rev) { 228 + case FAN53526_CHIP_REV_08: 229 + di->vsel_min = 600000; 230 + di->vsel_step = 6250; 231 + break; 232 + default: 233 + dev_err(di->dev, 234 + "Chip ID %d with rev %d not supported!\n", 235 + di->chip_id, di->chip_rev); 236 + return -EINVAL; 237 + } 238 + break; 239 + default: 240 + dev_err(di->dev, 241 + "Chip ID %d not supported!\n", di->chip_id); 242 + return -EINVAL; 243 + } 244 + 245 + di->vsel_count = FAN53526_NVOLTAGES; 246 + 247 + return 0; 248 + } 249 + 237 250 static int fan53555_voltages_setup_fairchild(struct fan53555_device_info *di) 238 251 { 239 252 /* Init voltage range and step */ ··· 300 257 return -EINVAL; 301 258 } 302 259 260 + di->vsel_count = FAN53555_NVOLTAGES; 261 + 303 262 return 0; 304 263 } 305 264 ··· 318 273 "Chip ID %d not supported!\n", di->chip_id); 319 274 return -EINVAL; 320 275 } 276 + 277 + di->vsel_count = FAN53555_NVOLTAGES; 321 278 322 279 return 0; 323 280 } ··· 349 302 return -EINVAL; 350 303 } 351 304 305 + /* Setup mode control register */ 352 306 switch (di->vendor) { 307 + case FAN53526_VENDOR_FAIRCHILD: 308 + di->mode_reg = FAN53555_CONTROL; 309 + 310 + switch (pdata->sleep_vsel_id) { 311 + case FAN53555_VSEL_ID_0: 312 + di->mode_mask = CTL_MODE_VSEL1_MODE; 313 + break; 314 + case FAN53555_VSEL_ID_1: 315 + di->mode_mask = CTL_MODE_VSEL0_MODE; 316 + break; 317 + } 318 + break; 319 + case FAN53555_VENDOR_FAIRCHILD: 320 + case FAN53555_VENDOR_SILERGY: 321 + di->mode_reg = di->vol_reg; 322 + di->mode_mask = VSEL_MODE; 323 + break; 324 + default: 325 + dev_err(di->dev, "vendor %d not supported!\n", di->vendor); 326 + return -EINVAL; 327 + } 328 + 329 + /* Setup voltage range */ 330 + switch (di->vendor) { 331 + case FAN53526_VENDOR_FAIRCHILD: 332 + ret = fan53526_voltages_setup_fairchild(di); 333 + break; 353 334 case FAN53555_VENDOR_FAIRCHILD: 354 335 ret = fan53555_voltages_setup_fairchild(di); 355 336 break; ··· 401 326 rdesc->supply_name = "vin"; 402 327 rdesc->ops = &fan53555_regulator_ops; 403 328 rdesc->type = REGULATOR_VOLTAGE; 404 - rdesc->n_voltages = FAN53555_NVOLTAGES; 329 + rdesc->n_voltages = di->vsel_count; 405 330 rdesc->enable_reg = di->vol_reg; 406 331 rdesc->enable_mask = VSEL_BUCK_EN; 407 332 rdesc->min_uV = di->vsel_min; 408 333 rdesc->uV_step = di->vsel_step; 409 334 rdesc->vsel_reg = di->vol_reg; 410 - rdesc->vsel_mask = VSEL_NSEL_MASK; 335 + rdesc->vsel_mask = di->vsel_count - 1; 411 336 rdesc->owner = THIS_MODULE; 412 337 413 338 di->rdev = devm_regulator_register(di->dev, &di->desc, config); ··· 443 368 444 369 static const struct of_device_id fan53555_dt_ids[] = { 445 370 { 371 + .compatible = "fcs,fan53526", 372 + .data = (void *)FAN53526_VENDOR_FAIRCHILD, 373 + }, { 446 374 .compatible = "fcs,fan53555", 447 375 .data = (void *)FAN53555_VENDOR_FAIRCHILD 448 376 }, { ··· 545 467 546 468 static const struct i2c_device_id fan53555_id[] = { 547 469 { 470 + .name = "fan53526", 471 + .driver_data = FAN53526_VENDOR_FAIRCHILD 472 + }, { 548 473 .name = "fan53555", 549 474 .driver_data = FAN53555_VENDOR_FAIRCHILD 550 475 }, {