0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/mfd/mc13783.h>
0010 #include <linux/regulator/machine.h>
0011 #include <linux/regulator/driver.h>
0012 #include <linux/platform_device.h>
0013 #include <linux/kernel.h>
0014 #include <linux/slab.h>
0015 #include <linux/init.h>
0016 #include <linux/err.h>
0017 #include <linux/module.h>
0018 #include "mc13xxx.h"
0019
0020 #define MC13783_REG_SWITCHERS0 24
0021
0022 #define MC13783_REG_SWITCHERS0_SW1AEN 0
0023 #define MC13783_REG_SWITCHERS0_SW1AVSEL 0
0024 #define MC13783_REG_SWITCHERS0_SW1AVSEL_M (63 << 0)
0025
0026 #define MC13783_REG_SWITCHERS1 25
0027
0028 #define MC13783_REG_SWITCHERS1_SW1BEN 0
0029 #define MC13783_REG_SWITCHERS1_SW1BVSEL 0
0030 #define MC13783_REG_SWITCHERS1_SW1BVSEL_M (63 << 0)
0031
0032 #define MC13783_REG_SWITCHERS2 26
0033
0034 #define MC13783_REG_SWITCHERS2_SW2AEN 0
0035 #define MC13783_REG_SWITCHERS2_SW2AVSEL 0
0036 #define MC13783_REG_SWITCHERS2_SW2AVSEL_M (63 << 0)
0037
0038 #define MC13783_REG_SWITCHERS3 27
0039
0040 #define MC13783_REG_SWITCHERS3_SW2BEN 0
0041 #define MC13783_REG_SWITCHERS3_SW2BVSEL 0
0042 #define MC13783_REG_SWITCHERS3_SW2BVSEL_M (63 << 0)
0043
0044 #define MC13783_REG_SWITCHERS5 29
0045 #define MC13783_REG_SWITCHERS5_SW3EN (1 << 20)
0046 #define MC13783_REG_SWITCHERS5_SW3VSEL 18
0047 #define MC13783_REG_SWITCHERS5_SW3VSEL_M (3 << 18)
0048
0049 #define MC13783_REG_REGULATORSETTING0 30
0050 #define MC13783_REG_REGULATORSETTING0_VIOLOVSEL 2
0051 #define MC13783_REG_REGULATORSETTING0_VDIGVSEL 4
0052 #define MC13783_REG_REGULATORSETTING0_VGENVSEL 6
0053 #define MC13783_REG_REGULATORSETTING0_VRFDIGVSEL 9
0054 #define MC13783_REG_REGULATORSETTING0_VRFREFVSEL 11
0055 #define MC13783_REG_REGULATORSETTING0_VRFCPVSEL 13
0056 #define MC13783_REG_REGULATORSETTING0_VSIMVSEL 14
0057 #define MC13783_REG_REGULATORSETTING0_VESIMVSEL 15
0058 #define MC13783_REG_REGULATORSETTING0_VCAMVSEL 16
0059
0060 #define MC13783_REG_REGULATORSETTING0_VIOLOVSEL_M (3 << 2)
0061 #define MC13783_REG_REGULATORSETTING0_VDIGVSEL_M (3 << 4)
0062 #define MC13783_REG_REGULATORSETTING0_VGENVSEL_M (7 << 6)
0063 #define MC13783_REG_REGULATORSETTING0_VRFDIGVSEL_M (3 << 9)
0064 #define MC13783_REG_REGULATORSETTING0_VRFREFVSEL_M (3 << 11)
0065 #define MC13783_REG_REGULATORSETTING0_VRFCPVSEL_M (1 << 13)
0066 #define MC13783_REG_REGULATORSETTING0_VSIMVSEL_M (1 << 14)
0067 #define MC13783_REG_REGULATORSETTING0_VESIMVSEL_M (1 << 15)
0068 #define MC13783_REG_REGULATORSETTING0_VCAMVSEL_M (7 << 16)
0069
0070 #define MC13783_REG_REGULATORSETTING1 31
0071 #define MC13783_REG_REGULATORSETTING1_VVIBVSEL 0
0072 #define MC13783_REG_REGULATORSETTING1_VRF1VSEL 2
0073 #define MC13783_REG_REGULATORSETTING1_VRF2VSEL 4
0074 #define MC13783_REG_REGULATORSETTING1_VMMC1VSEL 6
0075 #define MC13783_REG_REGULATORSETTING1_VMMC2VSEL 9
0076
0077 #define MC13783_REG_REGULATORSETTING1_VVIBVSEL_M (3 << 0)
0078 #define MC13783_REG_REGULATORSETTING1_VRF1VSEL_M (3 << 2)
0079 #define MC13783_REG_REGULATORSETTING1_VRF2VSEL_M (3 << 4)
0080 #define MC13783_REG_REGULATORSETTING1_VMMC1VSEL_M (7 << 6)
0081 #define MC13783_REG_REGULATORSETTING1_VMMC2VSEL_M (7 << 9)
0082
0083 #define MC13783_REG_REGULATORMODE0 32
0084 #define MC13783_REG_REGULATORMODE0_VAUDIOEN (1 << 0)
0085 #define MC13783_REG_REGULATORMODE0_VIOHIEN (1 << 3)
0086 #define MC13783_REG_REGULATORMODE0_VIOLOEN (1 << 6)
0087 #define MC13783_REG_REGULATORMODE0_VDIGEN (1 << 9)
0088 #define MC13783_REG_REGULATORMODE0_VGENEN (1 << 12)
0089 #define MC13783_REG_REGULATORMODE0_VRFDIGEN (1 << 15)
0090 #define MC13783_REG_REGULATORMODE0_VRFREFEN (1 << 18)
0091 #define MC13783_REG_REGULATORMODE0_VRFCPEN (1 << 21)
0092
0093 #define MC13783_REG_REGULATORMODE1 33
0094 #define MC13783_REG_REGULATORMODE1_VSIMEN (1 << 0)
0095 #define MC13783_REG_REGULATORMODE1_VESIMEN (1 << 3)
0096 #define MC13783_REG_REGULATORMODE1_VCAMEN (1 << 6)
0097 #define MC13783_REG_REGULATORMODE1_VRFBGEN (1 << 9)
0098 #define MC13783_REG_REGULATORMODE1_VVIBEN (1 << 11)
0099 #define MC13783_REG_REGULATORMODE1_VRF1EN (1 << 12)
0100 #define MC13783_REG_REGULATORMODE1_VRF2EN (1 << 15)
0101 #define MC13783_REG_REGULATORMODE1_VMMC1EN (1 << 18)
0102 #define MC13783_REG_REGULATORMODE1_VMMC2EN (1 << 21)
0103
0104 #define MC13783_REG_POWERMISC 34
0105 #define MC13783_REG_POWERMISC_GPO1EN (1 << 6)
0106 #define MC13783_REG_POWERMISC_GPO2EN (1 << 8)
0107 #define MC13783_REG_POWERMISC_GPO3EN (1 << 10)
0108 #define MC13783_REG_POWERMISC_GPO4EN (1 << 12)
0109 #define MC13783_REG_POWERMISC_PWGT1SPIEN (1 << 15)
0110 #define MC13783_REG_POWERMISC_PWGT2SPIEN (1 << 16)
0111
0112 #define MC13783_REG_POWERMISC_PWGTSPI_M (3 << 15)
0113
0114
0115
0116 static const int mc13783_sw1x_val[] = {
0117 900000, 925000, 950000, 975000,
0118 1000000, 1025000, 1050000, 1075000,
0119 1100000, 1125000, 1150000, 1175000,
0120 1200000, 1225000, 1250000, 1275000,
0121 1300000, 1325000, 1350000, 1375000,
0122 1400000, 1425000, 1450000, 1475000,
0123 1500000, 1525000, 1550000, 1575000,
0124 1600000, 1625000, 1650000, 1675000,
0125 1700000, 1700000, 1700000, 1700000,
0126 1800000, 1800000, 1800000, 1800000,
0127 1850000, 1850000, 1850000, 1850000,
0128 2000000, 2000000, 2000000, 2000000,
0129 2100000, 2100000, 2100000, 2100000,
0130 2200000, 2200000, 2200000, 2200000,
0131 2200000, 2200000, 2200000, 2200000,
0132 2200000, 2200000, 2200000, 2200000,
0133 };
0134
0135 static const int mc13783_sw2x_val[] = {
0136 900000, 925000, 950000, 975000,
0137 1000000, 1025000, 1050000, 1075000,
0138 1100000, 1125000, 1150000, 1175000,
0139 1200000, 1225000, 1250000, 1275000,
0140 1300000, 1325000, 1350000, 1375000,
0141 1400000, 1425000, 1450000, 1475000,
0142 1500000, 1525000, 1550000, 1575000,
0143 1600000, 1625000, 1650000, 1675000,
0144 1700000, 1700000, 1700000, 1700000,
0145 1800000, 1800000, 1800000, 1800000,
0146 1900000, 1900000, 1900000, 1900000,
0147 2000000, 2000000, 2000000, 2000000,
0148 2100000, 2100000, 2100000, 2100000,
0149 2200000, 2200000, 2200000, 2200000,
0150 2200000, 2200000, 2200000, 2200000,
0151 2200000, 2200000, 2200000, 2200000,
0152 };
0153
0154 static const unsigned int mc13783_sw3_val[] = {
0155 5000000, 5000000, 5000000, 5500000,
0156 };
0157
0158 static const unsigned int mc13783_vaudio_val[] = {
0159 2775000,
0160 };
0161
0162 static const unsigned int mc13783_viohi_val[] = {
0163 2775000,
0164 };
0165
0166 static const unsigned int mc13783_violo_val[] = {
0167 1200000, 1300000, 1500000, 1800000,
0168 };
0169
0170 static const unsigned int mc13783_vdig_val[] = {
0171 1200000, 1300000, 1500000, 1800000,
0172 };
0173
0174 static const unsigned int mc13783_vgen_val[] = {
0175 1200000, 1300000, 1500000, 1800000,
0176 1100000, 2000000, 2775000, 2400000,
0177 };
0178
0179 static const unsigned int mc13783_vrfdig_val[] = {
0180 1200000, 1500000, 1800000, 1875000,
0181 };
0182
0183 static const unsigned int mc13783_vrfref_val[] = {
0184 2475000, 2600000, 2700000, 2775000,
0185 };
0186
0187 static const unsigned int mc13783_vrfcp_val[] = {
0188 2700000, 2775000,
0189 };
0190
0191 static const unsigned int mc13783_vsim_val[] = {
0192 1800000, 2900000, 3000000,
0193 };
0194
0195 static const unsigned int mc13783_vesim_val[] = {
0196 1800000, 2900000,
0197 };
0198
0199 static const unsigned int mc13783_vcam_val[] = {
0200 1500000, 1800000, 2500000, 2550000,
0201 2600000, 2750000, 2800000, 3000000,
0202 };
0203
0204 static const unsigned int mc13783_vrfbg_val[] = {
0205 1250000,
0206 };
0207
0208 static const unsigned int mc13783_vvib_val[] = {
0209 1300000, 1800000, 2000000, 3000000,
0210 };
0211
0212 static const unsigned int mc13783_vmmc_val[] = {
0213 1600000, 1800000, 2000000, 2600000,
0214 2700000, 2800000, 2900000, 3000000,
0215 };
0216
0217 static const unsigned int mc13783_vrf_val[] = {
0218 1500000, 1875000, 2700000, 2775000,
0219 };
0220
0221 static const unsigned int mc13783_gpo_val[] = {
0222 3100000,
0223 };
0224
0225 static const unsigned int mc13783_pwgtdrv_val[] = {
0226 5500000,
0227 };
0228
0229 static const struct regulator_ops mc13783_gpo_regulator_ops;
0230
0231 #define MC13783_DEFINE(prefix, name, node, reg, vsel_reg, voltages) \
0232 MC13xxx_DEFINE(MC13783_REG_, name, node, reg, vsel_reg, voltages, \
0233 mc13xxx_regulator_ops)
0234
0235 #define MC13783_FIXED_DEFINE(prefix, name, node, reg, voltages) \
0236 MC13xxx_FIXED_DEFINE(MC13783_REG_, name, node, reg, voltages, \
0237 mc13xxx_fixed_regulator_ops)
0238
0239 #define MC13783_GPO_DEFINE(prefix, name, node, reg, voltages) \
0240 MC13xxx_GPO_DEFINE(MC13783_REG_, name, node, reg, voltages, \
0241 mc13783_gpo_regulator_ops)
0242
0243 #define MC13783_DEFINE_SW(_name, _node, _reg, _vsel_reg, _voltages) \
0244 MC13783_DEFINE(REG, _name, _node, _reg, _vsel_reg, _voltages)
0245 #define MC13783_DEFINE_REGU(_name, _node, _reg, _vsel_reg, _voltages) \
0246 MC13783_DEFINE(REG, _name, _node, _reg, _vsel_reg, _voltages)
0247
0248 static struct mc13xxx_regulator mc13783_regulators[] = {
0249 MC13783_DEFINE_SW(SW1A, sw1a, SWITCHERS0, SWITCHERS0, mc13783_sw1x_val),
0250 MC13783_DEFINE_SW(SW1B, sw1b, SWITCHERS1, SWITCHERS1, mc13783_sw1x_val),
0251 MC13783_DEFINE_SW(SW2A, sw2a, SWITCHERS2, SWITCHERS2, mc13783_sw2x_val),
0252 MC13783_DEFINE_SW(SW2B, sw2b, SWITCHERS3, SWITCHERS3, mc13783_sw2x_val),
0253 MC13783_DEFINE_SW(SW3, sw3, SWITCHERS5, SWITCHERS5, mc13783_sw3_val),
0254
0255 MC13783_FIXED_DEFINE(REG, VAUDIO, vaudio, REGULATORMODE0, mc13783_vaudio_val),
0256 MC13783_FIXED_DEFINE(REG, VIOHI, viohi, REGULATORMODE0, mc13783_viohi_val),
0257 MC13783_DEFINE_REGU(VIOLO, violo, REGULATORMODE0, REGULATORSETTING0,
0258 mc13783_violo_val),
0259 MC13783_DEFINE_REGU(VDIG, vdig, REGULATORMODE0, REGULATORSETTING0,
0260 mc13783_vdig_val),
0261 MC13783_DEFINE_REGU(VGEN, vgen, REGULATORMODE0, REGULATORSETTING0,
0262 mc13783_vgen_val),
0263 MC13783_DEFINE_REGU(VRFDIG, vrfdig, REGULATORMODE0, REGULATORSETTING0,
0264 mc13783_vrfdig_val),
0265 MC13783_DEFINE_REGU(VRFREF, vrfref, REGULATORMODE0, REGULATORSETTING0,
0266 mc13783_vrfref_val),
0267 MC13783_DEFINE_REGU(VRFCP, vrfcp, REGULATORMODE0, REGULATORSETTING0,
0268 mc13783_vrfcp_val),
0269 MC13783_DEFINE_REGU(VSIM, vsim, REGULATORMODE1, REGULATORSETTING0,
0270 mc13783_vsim_val),
0271 MC13783_DEFINE_REGU(VESIM, vesim, REGULATORMODE1, REGULATORSETTING0,
0272 mc13783_vesim_val),
0273 MC13783_DEFINE_REGU(VCAM, vcam, REGULATORMODE1, REGULATORSETTING0,
0274 mc13783_vcam_val),
0275 MC13783_FIXED_DEFINE(REG, VRFBG, vrfbg, REGULATORMODE1, mc13783_vrfbg_val),
0276 MC13783_DEFINE_REGU(VVIB, vvib, REGULATORMODE1, REGULATORSETTING1,
0277 mc13783_vvib_val),
0278 MC13783_DEFINE_REGU(VRF1, vrf1, REGULATORMODE1, REGULATORSETTING1,
0279 mc13783_vrf_val),
0280 MC13783_DEFINE_REGU(VRF2, vrf2, REGULATORMODE1, REGULATORSETTING1,
0281 mc13783_vrf_val),
0282 MC13783_DEFINE_REGU(VMMC1, vmmc1, REGULATORMODE1, REGULATORSETTING1,
0283 mc13783_vmmc_val),
0284 MC13783_DEFINE_REGU(VMMC2, vmmc2, REGULATORMODE1, REGULATORSETTING1,
0285 mc13783_vmmc_val),
0286 MC13783_GPO_DEFINE(REG, GPO1, gpo1, POWERMISC, mc13783_gpo_val),
0287 MC13783_GPO_DEFINE(REG, GPO2, gpo1, POWERMISC, mc13783_gpo_val),
0288 MC13783_GPO_DEFINE(REG, GPO3, gpo1, POWERMISC, mc13783_gpo_val),
0289 MC13783_GPO_DEFINE(REG, GPO4, gpo1, POWERMISC, mc13783_gpo_val),
0290 MC13783_GPO_DEFINE(REG, PWGT1SPI, pwgt1spi, POWERMISC, mc13783_pwgtdrv_val),
0291 MC13783_GPO_DEFINE(REG, PWGT2SPI, pwgt2spi, POWERMISC, mc13783_pwgtdrv_val),
0292 };
0293
0294 static int mc13783_powermisc_rmw(struct mc13xxx_regulator_priv *priv, u32 mask,
0295 u32 val)
0296 {
0297 struct mc13xxx *mc13783 = priv->mc13xxx;
0298 int ret;
0299 u32 valread;
0300
0301 BUG_ON(val & ~mask);
0302
0303 mc13xxx_lock(priv->mc13xxx);
0304 ret = mc13xxx_reg_read(mc13783, MC13783_REG_POWERMISC, &valread);
0305 if (ret)
0306 goto out;
0307
0308
0309 priv->powermisc_pwgt_state =
0310 (priv->powermisc_pwgt_state & ~mask) | val;
0311 priv->powermisc_pwgt_state &= MC13783_REG_POWERMISC_PWGTSPI_M;
0312
0313
0314 valread = (valread & ~mask) | val;
0315
0316 valread = (valread & ~MC13783_REG_POWERMISC_PWGTSPI_M) |
0317 priv->powermisc_pwgt_state;
0318
0319 ret = mc13xxx_reg_write(mc13783, MC13783_REG_POWERMISC, valread);
0320 out:
0321 mc13xxx_unlock(priv->mc13xxx);
0322 return ret;
0323 }
0324
0325 static int mc13783_gpo_regulator_enable(struct regulator_dev *rdev)
0326 {
0327 struct mc13xxx_regulator_priv *priv = rdev_get_drvdata(rdev);
0328 struct mc13xxx_regulator *mc13xxx_regulators = priv->mc13xxx_regulators;
0329 int id = rdev_get_id(rdev);
0330 u32 en_val = mc13xxx_regulators[id].enable_bit;
0331
0332 dev_dbg(rdev_get_dev(rdev), "%s id: %d\n", __func__, id);
0333
0334
0335 if (id == MC13783_REG_PWGT1SPI ||
0336 id == MC13783_REG_PWGT2SPI)
0337 en_val = 0;
0338
0339 return mc13783_powermisc_rmw(priv, mc13xxx_regulators[id].enable_bit,
0340 en_val);
0341 }
0342
0343 static int mc13783_gpo_regulator_disable(struct regulator_dev *rdev)
0344 {
0345 struct mc13xxx_regulator_priv *priv = rdev_get_drvdata(rdev);
0346 struct mc13xxx_regulator *mc13xxx_regulators = priv->mc13xxx_regulators;
0347 int id = rdev_get_id(rdev);
0348 u32 dis_val = 0;
0349
0350 dev_dbg(rdev_get_dev(rdev), "%s id: %d\n", __func__, id);
0351
0352
0353 if (id == MC13783_REG_PWGT1SPI ||
0354 id == MC13783_REG_PWGT2SPI)
0355 dis_val = mc13xxx_regulators[id].enable_bit;
0356
0357 return mc13783_powermisc_rmw(priv, mc13xxx_regulators[id].enable_bit,
0358 dis_val);
0359 }
0360
0361 static int mc13783_gpo_regulator_is_enabled(struct regulator_dev *rdev)
0362 {
0363 struct mc13xxx_regulator_priv *priv = rdev_get_drvdata(rdev);
0364 struct mc13xxx_regulator *mc13xxx_regulators = priv->mc13xxx_regulators;
0365 int ret, id = rdev_get_id(rdev);
0366 unsigned int val;
0367
0368 mc13xxx_lock(priv->mc13xxx);
0369 ret = mc13xxx_reg_read(priv->mc13xxx, mc13xxx_regulators[id].reg, &val);
0370 mc13xxx_unlock(priv->mc13xxx);
0371
0372 if (ret)
0373 return ret;
0374
0375
0376
0377 val = (val & ~MC13783_REG_POWERMISC_PWGTSPI_M) |
0378 (priv->powermisc_pwgt_state ^ MC13783_REG_POWERMISC_PWGTSPI_M);
0379
0380 return (val & mc13xxx_regulators[id].enable_bit) != 0;
0381 }
0382
0383 static const struct regulator_ops mc13783_gpo_regulator_ops = {
0384 .enable = mc13783_gpo_regulator_enable,
0385 .disable = mc13783_gpo_regulator_disable,
0386 .is_enabled = mc13783_gpo_regulator_is_enabled,
0387 .list_voltage = regulator_list_voltage_table,
0388 .set_voltage = mc13xxx_fixed_regulator_set_voltage,
0389 };
0390
0391 static int mc13783_regulator_probe(struct platform_device *pdev)
0392 {
0393 struct mc13xxx_regulator_priv *priv;
0394 struct mc13xxx *mc13783 = dev_get_drvdata(pdev->dev.parent);
0395 struct mc13xxx_regulator_platform_data *pdata =
0396 dev_get_platdata(&pdev->dev);
0397 struct mc13xxx_regulator_init_data *mc13xxx_data;
0398 struct regulator_config config = { };
0399 int i, num_regulators;
0400
0401 num_regulators = mc13xxx_get_num_regulators_dt(pdev);
0402
0403 if (num_regulators <= 0 && pdata)
0404 num_regulators = pdata->num_regulators;
0405 if (num_regulators <= 0)
0406 return -EINVAL;
0407
0408 priv = devm_kzalloc(&pdev->dev,
0409 struct_size(priv, regulators, num_regulators),
0410 GFP_KERNEL);
0411 if (!priv)
0412 return -ENOMEM;
0413
0414 priv->num_regulators = num_regulators;
0415 priv->mc13xxx_regulators = mc13783_regulators;
0416 priv->mc13xxx = mc13783;
0417 platform_set_drvdata(pdev, priv);
0418
0419 mc13xxx_data = mc13xxx_parse_regulators_dt(pdev, mc13783_regulators,
0420 ARRAY_SIZE(mc13783_regulators));
0421
0422 for (i = 0; i < priv->num_regulators; i++) {
0423 struct regulator_init_data *init_data;
0424 struct regulator_desc *desc;
0425 struct device_node *node = NULL;
0426 int id;
0427
0428 if (mc13xxx_data) {
0429 id = mc13xxx_data[i].id;
0430 init_data = mc13xxx_data[i].init_data;
0431 node = mc13xxx_data[i].node;
0432 } else {
0433 id = pdata->regulators[i].id;
0434 init_data = pdata->regulators[i].init_data;
0435 }
0436 desc = &mc13783_regulators[id].desc;
0437
0438 config.dev = &pdev->dev;
0439 config.init_data = init_data;
0440 config.driver_data = priv;
0441 config.of_node = node;
0442
0443 priv->regulators[i] = devm_regulator_register(&pdev->dev, desc,
0444 &config);
0445 if (IS_ERR(priv->regulators[i])) {
0446 dev_err(&pdev->dev, "failed to register regulator %s\n",
0447 mc13783_regulators[i].desc.name);
0448 return PTR_ERR(priv->regulators[i]);
0449 }
0450 }
0451
0452 return 0;
0453 }
0454
0455 static struct platform_driver mc13783_regulator_driver = {
0456 .driver = {
0457 .name = "mc13783-regulator",
0458 },
0459 .probe = mc13783_regulator_probe,
0460 };
0461
0462 static int __init mc13783_regulator_init(void)
0463 {
0464 return platform_driver_register(&mc13783_regulator_driver);
0465 }
0466 subsys_initcall(mc13783_regulator_init);
0467
0468 static void __exit mc13783_regulator_exit(void)
0469 {
0470 platform_driver_unregister(&mc13783_regulator_driver);
0471 }
0472 module_exit(mc13783_regulator_exit);
0473
0474 MODULE_LICENSE("GPL v2");
0475 MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>");
0476 MODULE_DESCRIPTION("Regulator Driver for Freescale MC13783 PMIC");
0477 MODULE_ALIAS("platform:mc13783-regulator");