Commit c4e0d344 authored by Elaine Zhang's avatar Elaine Zhang Committed by Lee Jones

regulator: rk808: Add regulator driver for RK805

Add support for the rk805 regulator. The regulator module consists
of 4 DCDCs, 3 LDOs.

The output voltages are configurable and are meant to supply power
to the main processor and other components.
Signed-off-by: default avatarElaine Zhang <zhangqing@rock-chips.com>
Signed-off-by: default avatarJoseph Chen <chenjh@rock-chips.com>
Acked-by: default avatarMark Brown <broonie@kernel.org>
Signed-off-by: default avatarHeiko Stuebner <heiko@sntech.de>
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
parent a5247ca6
...@@ -687,11 +687,11 @@ config REGULATOR_RC5T583 ...@@ -687,11 +687,11 @@ config REGULATOR_RC5T583
outputs which can be controlled by i2c communication. outputs which can be controlled by i2c communication.
config REGULATOR_RK808 config REGULATOR_RK808
tristate "Rockchip RK808/RK818 Power regulators" tristate "Rockchip RK805/RK808/RK818 Power regulators"
depends on MFD_RK808 depends on MFD_RK808
help help
Select this option to enable the power regulator of ROCKCHIP Select this option to enable the power regulator of ROCKCHIP
PMIC RK808 and RK818. PMIC RK805,RK808 and RK818.
This driver supports the control of different power rails of device This driver supports the control of different power rails of device
through regulator interface. The device supports multiple DCDC/LDO through regulator interface. The device supports multiple DCDC/LDO
outputs which can be controlled by i2c communication. outputs which can be controlled by i2c communication.
......
...@@ -65,6 +65,27 @@ ...@@ -65,6 +65,27 @@
/* max steps for increase voltage of Buck1/2, equal 100mv*/ /* max steps for increase voltage of Buck1/2, equal 100mv*/
#define MAX_STEPS_ONE_TIME 8 #define MAX_STEPS_ONE_TIME 8
#define RK805_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \
_vmask, _ereg, _emask, _etime) \
[_id] = { \
.name = (_match), \
.supply_name = (_supply), \
.of_match = of_match_ptr(_match), \
.regulators_node = of_match_ptr("regulators"), \
.type = REGULATOR_VOLTAGE, \
.id = (_id), \
.n_voltages = (((_max) - (_min)) / (_step) + 1), \
.owner = THIS_MODULE, \
.min_uV = (_min) * 1000, \
.uV_step = (_step) * 1000, \
.vsel_reg = (_vreg), \
.vsel_mask = (_vmask), \
.enable_reg = (_ereg), \
.enable_mask = (_emask), \
.enable_time = (_etime), \
.ops = &rk805_reg_ops, \
}
#define RK8XX_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \ #define RK8XX_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \
_vmask, _ereg, _emask, _etime) \ _vmask, _ereg, _emask, _etime) \
[_id] = { \ [_id] = { \
...@@ -298,6 +319,28 @@ static int rk808_set_suspend_voltage_range(struct regulator_dev *rdev, int uv) ...@@ -298,6 +319,28 @@ static int rk808_set_suspend_voltage_range(struct regulator_dev *rdev, int uv)
sel); sel);
} }
static int rk805_set_suspend_enable(struct regulator_dev *rdev)
{
unsigned int reg;
reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
return regmap_update_bits(rdev->regmap, reg,
rdev->desc->enable_mask,
rdev->desc->enable_mask);
}
static int rk805_set_suspend_disable(struct regulator_dev *rdev)
{
unsigned int reg;
reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
return regmap_update_bits(rdev->regmap, reg,
rdev->desc->enable_mask,
0);
}
static int rk808_set_suspend_enable(struct regulator_dev *rdev) static int rk808_set_suspend_enable(struct regulator_dev *rdev)
{ {
unsigned int reg; unsigned int reg;
...@@ -320,6 +363,27 @@ static int rk808_set_suspend_disable(struct regulator_dev *rdev) ...@@ -320,6 +363,27 @@ static int rk808_set_suspend_disable(struct regulator_dev *rdev)
rdev->desc->enable_mask); rdev->desc->enable_mask);
} }
static struct regulator_ops rk805_reg_ops = {
.list_voltage = regulator_list_voltage_linear,
.map_voltage = regulator_map_voltage_linear,
.get_voltage_sel = regulator_get_voltage_sel_regmap,
.set_voltage_sel = regulator_set_voltage_sel_regmap,
.enable = regulator_enable_regmap,
.disable = regulator_disable_regmap,
.is_enabled = regulator_is_enabled_regmap,
.set_suspend_voltage = rk808_set_suspend_voltage,
.set_suspend_enable = rk805_set_suspend_enable,
.set_suspend_disable = rk805_set_suspend_disable,
};
static struct regulator_ops rk805_switch_ops = {
.enable = regulator_enable_regmap,
.disable = regulator_disable_regmap,
.is_enabled = regulator_is_enabled_regmap,
.set_suspend_enable = rk805_set_suspend_enable,
.set_suspend_disable = rk805_set_suspend_disable,
};
static struct regulator_ops rk808_buck1_2_ops = { static struct regulator_ops rk808_buck1_2_ops = {
.list_voltage = regulator_list_voltage_linear, .list_voltage = regulator_list_voltage_linear,
.map_voltage = regulator_map_voltage_linear, .map_voltage = regulator_map_voltage_linear,
...@@ -369,6 +433,68 @@ static struct regulator_ops rk808_switch_ops = { ...@@ -369,6 +433,68 @@ static struct regulator_ops rk808_switch_ops = {
.set_suspend_disable = rk808_set_suspend_disable, .set_suspend_disable = rk808_set_suspend_disable,
}; };
static const struct regulator_desc rk805_reg[] = {
{
.name = "DCDC_REG1",
.supply_name = "vcc1",
.of_match = of_match_ptr("DCDC_REG1"),
.regulators_node = of_match_ptr("regulators"),
.id = RK805_ID_DCDC1,
.ops = &rk805_reg_ops,
.type = REGULATOR_VOLTAGE,
.min_uV = 712500,
.uV_step = 12500,
.n_voltages = 64,
.vsel_reg = RK805_BUCK1_ON_VSEL_REG,
.vsel_mask = RK818_BUCK_VSEL_MASK,
.enable_reg = RK805_DCDC_EN_REG,
.enable_mask = BIT(0),
.owner = THIS_MODULE,
}, {
.name = "DCDC_REG2",
.supply_name = "vcc2",
.of_match = of_match_ptr("DCDC_REG2"),
.regulators_node = of_match_ptr("regulators"),
.id = RK805_ID_DCDC2,
.ops = &rk805_reg_ops,
.type = REGULATOR_VOLTAGE,
.min_uV = 712500,
.uV_step = 12500,
.n_voltages = 64,
.vsel_reg = RK805_BUCK2_ON_VSEL_REG,
.vsel_mask = RK818_BUCK_VSEL_MASK,
.enable_reg = RK805_DCDC_EN_REG,
.enable_mask = BIT(1),
.owner = THIS_MODULE,
}, {
.name = "DCDC_REG3",
.supply_name = "vcc3",
.of_match = of_match_ptr("DCDC_REG3"),
.regulators_node = of_match_ptr("regulators"),
.id = RK805_ID_DCDC3,
.ops = &rk805_switch_ops,
.type = REGULATOR_VOLTAGE,
.n_voltages = 1,
.enable_reg = RK805_DCDC_EN_REG,
.enable_mask = BIT(2),
.owner = THIS_MODULE,
},
RK805_DESC(RK805_ID_DCDC4, "DCDC_REG4", "vcc4", 800, 3400, 100,
RK805_BUCK4_ON_VSEL_REG, RK818_BUCK4_VSEL_MASK,
RK805_DCDC_EN_REG, BIT(3), 0),
RK805_DESC(RK805_ID_LDO1, "LDO_REG1", "vcc5", 800, 3400, 100,
RK805_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG,
BIT(0), 400),
RK805_DESC(RK805_ID_LDO2, "LDO_REG2", "vcc5", 800, 3400, 100,
RK805_LDO2_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG,
BIT(1), 400),
RK805_DESC(RK805_ID_LDO3, "LDO_REG3", "vcc6", 800, 3400, 100,
RK805_LDO3_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG,
BIT(2), 400),
};
static const struct regulator_desc rk808_reg[] = { static const struct regulator_desc rk808_reg[] = {
{ {
.name = "DCDC_REG1", .name = "DCDC_REG1",
...@@ -625,6 +751,10 @@ static int rk808_regulator_probe(struct platform_device *pdev) ...@@ -625,6 +751,10 @@ static int rk808_regulator_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, pdata); platform_set_drvdata(pdev, pdata);
switch (rk808->variant) { switch (rk808->variant) {
case RK805_ID:
regulators = rk805_reg;
nregulators = RK805_NUM_REGULATORS;
break;
case RK808_ID: case RK808_ID:
regulators = rk808_reg; regulators = rk808_reg;
nregulators = RK808_NUM_REGULATORS; nregulators = RK808_NUM_REGULATORS;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment