Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Regulator driver for Ricoh RN5T618 PMIC
0004  *
0005  * Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com>
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     /* DCDC */
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     /* LDO */
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     /* LDO RTC */
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     /* DCDC */
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     /* LDO */
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     /* LDO RTC */
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     /* DCDC */
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     /* LDO */
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     /* LDO RTC */
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                            &regulators[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");