0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/mfd/rn5t618.h>
0009 #include <linux/module.h>
0010 #include <linux/of.h>
0011 #include <linux/platform_device.h>
0012 #include <linux/regmap.h>
0013 #include <linux/regulator/driver.h>
0014 #include <linux/regulator/of_regulator.h>
0015
0016 static const struct regulator_ops rn5t618_reg_ops = {
0017 .enable = regulator_enable_regmap,
0018 .disable = regulator_disable_regmap,
0019 .is_enabled = regulator_is_enabled_regmap,
0020 .set_voltage_sel = regulator_set_voltage_sel_regmap,
0021 .get_voltage_sel = regulator_get_voltage_sel_regmap,
0022 .list_voltage = regulator_list_voltage_linear,
0023 };
0024
0025 #define REG(rid, ereg, emask, vreg, vmask, min, max, step) \
0026 { \
0027 .name = #rid, \
0028 .of_match = of_match_ptr(#rid), \
0029 .regulators_node = of_match_ptr("regulators"), \
0030 .id = RN5T618_##rid, \
0031 .type = REGULATOR_VOLTAGE, \
0032 .owner = THIS_MODULE, \
0033 .ops = &rn5t618_reg_ops, \
0034 .n_voltages = ((max) - (min)) / (step) + 1, \
0035 .min_uV = (min), \
0036 .uV_step = (step), \
0037 .enable_reg = RN5T618_##ereg, \
0038 .enable_mask = (emask), \
0039 .vsel_reg = RN5T618_##vreg, \
0040 .vsel_mask = (vmask), \
0041 }
0042
0043 static const struct regulator_desc rn5t567_regulators[] = {
0044
0045 REG(DCDC1, DC1CTL, BIT(0), DC1DAC, 0xff, 600000, 3500000, 12500),
0046 REG(DCDC2, DC2CTL, BIT(0), DC2DAC, 0xff, 600000, 3500000, 12500),
0047 REG(DCDC3, DC3CTL, BIT(0), DC3DAC, 0xff, 600000, 3500000, 12500),
0048 REG(DCDC4, DC4CTL, BIT(0), DC4DAC, 0xff, 600000, 3500000, 12500),
0049
0050 REG(LDO1, LDOEN1, BIT(0), LDO1DAC, 0x7f, 900000, 3500000, 25000),
0051 REG(LDO2, LDOEN1, BIT(1), LDO2DAC, 0x7f, 900000, 3500000, 25000),
0052 REG(LDO3, LDOEN1, BIT(2), LDO3DAC, 0x7f, 600000, 3500000, 25000),
0053 REG(LDO4, LDOEN1, BIT(3), LDO4DAC, 0x7f, 900000, 3500000, 25000),
0054 REG(LDO5, LDOEN1, BIT(4), LDO5DAC, 0x7f, 900000, 3500000, 25000),
0055
0056 REG(LDORTC1, LDOEN2, BIT(4), LDORTCDAC, 0x7f, 1200000, 3500000, 25000),
0057 REG(LDORTC2, LDOEN2, BIT(5), LDORTC2DAC, 0x7f, 900000, 3500000, 25000),
0058 };
0059
0060 static const struct regulator_desc rn5t618_regulators[] = {
0061
0062 REG(DCDC1, DC1CTL, BIT(0), DC1DAC, 0xff, 600000, 3500000, 12500),
0063 REG(DCDC2, DC2CTL, BIT(0), DC2DAC, 0xff, 600000, 3500000, 12500),
0064 REG(DCDC3, DC3CTL, BIT(0), DC3DAC, 0xff, 600000, 3500000, 12500),
0065
0066 REG(LDO1, LDOEN1, BIT(0), LDO1DAC, 0x7f, 900000, 3500000, 25000),
0067 REG(LDO2, LDOEN1, BIT(1), LDO2DAC, 0x7f, 900000, 3500000, 25000),
0068 REG(LDO3, LDOEN1, BIT(2), LDO3DAC, 0x7f, 600000, 3500000, 25000),
0069 REG(LDO4, LDOEN1, BIT(3), LDO4DAC, 0x7f, 900000, 3500000, 25000),
0070 REG(LDO5, LDOEN1, BIT(4), LDO5DAC, 0x7f, 900000, 3500000, 25000),
0071
0072 REG(LDORTC1, LDOEN2, BIT(4), LDORTCDAC, 0x7f, 1700000, 3500000, 25000),
0073 REG(LDORTC2, LDOEN2, BIT(5), LDORTC2DAC, 0x7f, 900000, 3500000, 25000),
0074 };
0075
0076 static const struct regulator_desc rc5t619_regulators[] = {
0077
0078 REG(DCDC1, DC1CTL, BIT(0), DC1DAC, 0xff, 600000, 3500000, 12500),
0079 REG(DCDC2, DC2CTL, BIT(0), DC2DAC, 0xff, 600000, 3500000, 12500),
0080 REG(DCDC3, DC3CTL, BIT(0), DC3DAC, 0xff, 600000, 3500000, 12500),
0081 REG(DCDC4, DC4CTL, BIT(0), DC4DAC, 0xff, 600000, 3500000, 12500),
0082 REG(DCDC5, DC5CTL, BIT(0), DC5DAC, 0xff, 600000, 3500000, 12500),
0083
0084 REG(LDO1, LDOEN1, BIT(0), LDO1DAC, 0x7f, 900000, 3500000, 25000),
0085 REG(LDO2, LDOEN1, BIT(1), LDO2DAC, 0x7f, 900000, 3500000, 25000),
0086 REG(LDO3, LDOEN1, BIT(2), LDO3DAC, 0x7f, 900000, 3500000, 25000),
0087 REG(LDO4, LDOEN1, BIT(3), LDO4DAC, 0x7f, 900000, 3500000, 25000),
0088 REG(LDO5, LDOEN1, BIT(4), LDO5DAC, 0x7f, 600000, 3500000, 25000),
0089 REG(LDO6, LDOEN1, BIT(5), LDO6DAC, 0x7f, 600000, 3500000, 25000),
0090 REG(LDO7, LDOEN1, BIT(6), LDO7DAC, 0x7f, 900000, 3500000, 25000),
0091 REG(LDO8, LDOEN1, BIT(7), LDO8DAC, 0x7f, 900000, 3500000, 25000),
0092 REG(LDO9, LDOEN2, BIT(0), LDO9DAC, 0x7f, 900000, 3500000, 25000),
0093 REG(LDO10, LDOEN2, BIT(1), LDO10DAC, 0x7f, 900000, 3500000, 25000),
0094
0095 REG(LDORTC1, LDOEN2, BIT(4), LDORTCDAC, 0x7f, 1700000, 3500000, 25000),
0096 REG(LDORTC2, LDOEN2, BIT(5), LDORTC2DAC, 0x7f, 900000, 3500000, 25000),
0097 };
0098
0099 static int rn5t618_regulator_probe(struct platform_device *pdev)
0100 {
0101 struct rn5t618 *rn5t618 = dev_get_drvdata(pdev->dev.parent);
0102 struct regulator_config config = { };
0103 struct regulator_dev *rdev;
0104 const struct regulator_desc *regulators;
0105 int i;
0106 int num_regulators = 0;
0107
0108 switch (rn5t618->variant) {
0109 case RN5T567:
0110 regulators = rn5t567_regulators;
0111 num_regulators = ARRAY_SIZE(rn5t567_regulators);
0112 break;
0113 case RN5T618:
0114 regulators = rn5t618_regulators;
0115 num_regulators = ARRAY_SIZE(rn5t618_regulators);
0116 break;
0117 case RC5T619:
0118 regulators = rc5t619_regulators;
0119 num_regulators = ARRAY_SIZE(rc5t619_regulators);
0120 break;
0121 default:
0122 return -EINVAL;
0123 }
0124
0125 config.dev = pdev->dev.parent;
0126 config.regmap = rn5t618->regmap;
0127
0128 for (i = 0; i < num_regulators; i++) {
0129 rdev = devm_regulator_register(&pdev->dev,
0130 ®ulators[i],
0131 &config);
0132 if (IS_ERR(rdev)) {
0133 dev_err(&pdev->dev, "failed to register %s regulator\n",
0134 regulators[i].name);
0135 return PTR_ERR(rdev);
0136 }
0137 }
0138
0139 return 0;
0140 }
0141
0142 static struct platform_driver rn5t618_regulator_driver = {
0143 .probe = rn5t618_regulator_probe,
0144 .driver = {
0145 .name = "rn5t618-regulator",
0146 },
0147 };
0148
0149 module_platform_driver(rn5t618_regulator_driver);
0150
0151 MODULE_ALIAS("platform:rn5t618-regulator");
0152 MODULE_AUTHOR("Beniamino Galvani <b.galvani@gmail.com>");
0153 MODULE_DESCRIPTION("RN5T618 regulator driver");
0154 MODULE_LICENSE("GPL v2");