* [PATCH v4 0/7] Add support for rk818
@ 2016-04-26 14:54 ` Wadim Egorov
0 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-04-26 14:54 UTC (permalink / raw)
To: linux-kernel, linux-clk, rtc-linux, devicetree, linux-rockchip,
lee.jones
Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak,
mturquette, sboyd, lgirdwood, broonie, a.zummo,
alexandre.belloni, dianders, zyw
Hello,
I dropped the patch which renamed the rk808 struct.
The regulator patches are based on top of
commit 4a5ed8c1adc3 ("regulator: rk808: remove unused rk808_reg_ops_ranges")
Changes since v3:
- dropped rename patch
- rebased patch 4: renamed rk8xx struct back to rk808
- File comment description shows now RK808/RK818
- Module descriptions show now RK808/RK818
Wadim Egorov (7):
regulator: rk808: Add rk808_reg_ops_ranges for LDO3
regulator: rk808: Migrate to regulator core's simplified DT parsing
code
mfd: RK808: Add RK818 support
regulator: rk808: Add regulator driver for RK818
mfd: dt-bindings: Add RK818 device tree bindings document
clk: Kconfig: Name RK818 in Kconfig for COMMON_CLK_RK808
rtc: Kconfig: Name RK818 in Kconfig for RTC_DRV_RK808
Documentation/devicetree/bindings/mfd/rk808.txt | 37 ++-
drivers/clk/Kconfig | 4 +-
drivers/mfd/Kconfig | 4 +-
drivers/mfd/rk808.c | 229 +++++++++++---
drivers/regulator/Kconfig | 4 +-
drivers/regulator/rk808-regulator.c | 393 ++++++++++++++----------
drivers/rtc/Kconfig | 4 +-
include/linux/mfd/rk808.h | 162 +++++++++-
8 files changed, 618 insertions(+), 219 deletions(-)
--
1.9.1
^ permalink raw reply [flat|nested] 34+ messages in thread
* [rtc-linux] [PATCH v4 0/7] Add support for rk818
@ 2016-04-26 14:54 ` Wadim Egorov
0 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-04-26 14:54 UTC (permalink / raw)
To: linux-kernel, linux-clk, rtc-linux, devicetree, linux-rockchip,
lee.jones
Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak,
mturquette, sboyd, lgirdwood, broonie, a.zummo,
alexandre.belloni, dianders, zyw
Hello,
I dropped the patch which renamed the rk808 struct.
The regulator patches are based on top of
commit 4a5ed8c1adc3 ("regulator: rk808: remove unused rk808_reg_ops_ranges")
Changes since v3:
- dropped rename patch
- rebased patch 4: renamed rk8xx struct back to rk808
- File comment description shows now RK808/RK818
- Module descriptions show now RK808/RK818
Wadim Egorov (7):
regulator: rk808: Add rk808_reg_ops_ranges for LDO3
regulator: rk808: Migrate to regulator core's simplified DT parsing
code
mfd: RK808: Add RK818 support
regulator: rk808: Add regulator driver for RK818
mfd: dt-bindings: Add RK818 device tree bindings document
clk: Kconfig: Name RK818 in Kconfig for COMMON_CLK_RK808
rtc: Kconfig: Name RK818 in Kconfig for RTC_DRV_RK808
Documentation/devicetree/bindings/mfd/rk808.txt | 37 ++-
drivers/clk/Kconfig | 4 +-
drivers/mfd/Kconfig | 4 +-
drivers/mfd/rk808.c | 229 +++++++++++---
drivers/regulator/Kconfig | 4 +-
drivers/regulator/rk808-regulator.c | 393 ++++++++++++++----------
drivers/rtc/Kconfig | 4 +-
include/linux/mfd/rk808.h | 162 +++++++++-
8 files changed, 618 insertions(+), 219 deletions(-)
--
1.9.1
--
--
You received this message because you are subscribed to "rtc-linux".
Membership options at http://groups.google.com/group/rtc-linux .
Please read http://groups.google.com/group/rtc-linux/web/checklist
before submitting a driver.
---
You received this message because you are subscribed to the Google Groups "rtc-linux" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v4 0/7] Add support for rk818
@ 2016-04-26 14:54 ` Wadim Egorov
0 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-04-26 14:54 UTC (permalink / raw)
To: linux-kernel-u79uwXL29TY76Z2rM5mHXA,
linux-clk-u79uwXL29TY76Z2rM5mHXA,
rtc-linux-/JYPxA39Uh5TLH3MbocFFw,
devicetree-u79uwXL29TY76Z2rM5mHXA,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
lee.jones-QSEj5FYQhm4dnm+yROfE0A
Cc: mark.rutland-5wv7dgnIgG8, a.zummo-BfzFCNDTiLLj+vYz1yj4TQ,
pawel.moll-5wv7dgnIgG8, ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg,
mturquette-rdvid1DuHRBWk0Htik3J/w, sboyd-sgV2jX0FEOL9JmXXK+q4OQ,
lgirdwood-Re5JQEeQqe8AvxtiuMwx3w,
dianders-F7+t8E8rja9g9hUCZPvPmw, robh+dt-DgEjT+Ai2ygdnm+yROfE0A,
alexandre.belloni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
broonie-DgEjT+Ai2ygdnm+yROfE0A, galak-sgV2jX0FEOL9JmXXK+q4OQ,
zyw-TNX95d0MmH7DzftRWevZcw
Hello,
I dropped the patch which renamed the rk808 struct.
The regulator patches are based on top of
commit 4a5ed8c1adc3 ("regulator: rk808: remove unused rk808_reg_ops_ranges")
Changes since v3:
- dropped rename patch
- rebased patch 4: renamed rk8xx struct back to rk808
- File comment description shows now RK808/RK818
- Module descriptions show now RK808/RK818
Wadim Egorov (7):
regulator: rk808: Add rk808_reg_ops_ranges for LDO3
regulator: rk808: Migrate to regulator core's simplified DT parsing
code
mfd: RK808: Add RK818 support
regulator: rk808: Add regulator driver for RK818
mfd: dt-bindings: Add RK818 device tree bindings document
clk: Kconfig: Name RK818 in Kconfig for COMMON_CLK_RK808
rtc: Kconfig: Name RK818 in Kconfig for RTC_DRV_RK808
Documentation/devicetree/bindings/mfd/rk808.txt | 37 ++-
drivers/clk/Kconfig | 4 +-
drivers/mfd/Kconfig | 4 +-
drivers/mfd/rk808.c | 229 +++++++++++---
drivers/regulator/Kconfig | 4 +-
drivers/regulator/rk808-regulator.c | 393 ++++++++++++++----------
drivers/rtc/Kconfig | 4 +-
include/linux/mfd/rk808.h | 162 +++++++++-
8 files changed, 618 insertions(+), 219 deletions(-)
--
1.9.1
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v4 1/7] regulator: rk808: Add rk808_reg_ops_ranges for LDO3
2016-04-26 14:54 ` [rtc-linux] " Wadim Egorov
@ 2016-04-26 14:54 ` Wadim Egorov
-1 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-04-26 14:54 UTC (permalink / raw)
To: linux-kernel, linux-clk, rtc-linux, devicetree, linux-rockchip,
lee.jones
Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak,
mturquette, sboyd, lgirdwood, broonie, a.zummo,
alexandre.belloni, dianders, zyw
LDO_REG3 descriptor is using linear_ranges.
Add and use proper ops for LDO_REG3.
Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
---
drivers/regulator/rk808-regulator.c | 30 +++++++++++++++++++++++++++++-
1 file changed, 29 insertions(+), 1 deletion(-)
diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c
index 67f72fe..6601ab5 100644
--- a/drivers/regulator/rk808-regulator.c
+++ b/drivers/regulator/rk808-regulator.c
@@ -238,6 +238,21 @@ static int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv)
sel);
}
+static int rk808_set_suspend_voltage_range(struct regulator_dev *rdev, int uv)
+{
+ unsigned int reg;
+ int sel = regulator_map_voltage_linear_range(rdev, uv, uv);
+
+ if (sel < 0)
+ return -EINVAL;
+
+ reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
+
+ return regmap_update_bits(rdev->regmap, reg,
+ rdev->desc->vsel_mask,
+ sel);
+}
+
static int rk808_set_suspend_enable(struct regulator_dev *rdev)
{
unsigned int reg;
@@ -288,6 +303,19 @@ static struct regulator_ops rk808_reg_ops = {
.set_suspend_disable = rk808_set_suspend_disable,
};
+static struct regulator_ops rk808_reg_ops_ranges = {
+ .list_voltage = regulator_list_voltage_linear_range,
+ .map_voltage = regulator_map_voltage_linear_range,
+ .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_range,
+ .set_suspend_enable = rk808_set_suspend_enable,
+ .set_suspend_disable = rk808_set_suspend_disable,
+};
+
static struct regulator_ops rk808_switch_ops = {
.enable = regulator_enable_regmap,
.disable = regulator_disable_regmap,
@@ -383,7 +411,7 @@ static const struct regulator_desc rk808_reg[] = {
.name = "LDO_REG3",
.supply_name = "vcc7",
.id = RK808_ID_LDO3,
- .ops = &rk808_reg_ops,
+ .ops = &rk808_reg_ops_ranges,
.type = REGULATOR_VOLTAGE,
.n_voltages = 16,
.linear_ranges = rk808_ldo3_voltage_ranges,
--
1.9.1
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [rtc-linux] [PATCH v4 1/7] regulator: rk808: Add rk808_reg_ops_ranges for LDO3
@ 2016-04-26 14:54 ` Wadim Egorov
0 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-04-26 14:54 UTC (permalink / raw)
To: linux-kernel, linux-clk, rtc-linux, devicetree, linux-rockchip,
lee.jones
Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak,
mturquette, sboyd, lgirdwood, broonie, a.zummo,
alexandre.belloni, dianders, zyw
LDO_REG3 descriptor is using linear_ranges.
Add and use proper ops for LDO_REG3.
Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
---
drivers/regulator/rk808-regulator.c | 30 +++++++++++++++++++++++++++++-
1 file changed, 29 insertions(+), 1 deletion(-)
diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c
index 67f72fe..6601ab5 100644
--- a/drivers/regulator/rk808-regulator.c
+++ b/drivers/regulator/rk808-regulator.c
@@ -238,6 +238,21 @@ static int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv)
sel);
}
+static int rk808_set_suspend_voltage_range(struct regulator_dev *rdev, int uv)
+{
+ unsigned int reg;
+ int sel = regulator_map_voltage_linear_range(rdev, uv, uv);
+
+ if (sel < 0)
+ return -EINVAL;
+
+ reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
+
+ return regmap_update_bits(rdev->regmap, reg,
+ rdev->desc->vsel_mask,
+ sel);
+}
+
static int rk808_set_suspend_enable(struct regulator_dev *rdev)
{
unsigned int reg;
@@ -288,6 +303,19 @@ static struct regulator_ops rk808_reg_ops = {
.set_suspend_disable = rk808_set_suspend_disable,
};
+static struct regulator_ops rk808_reg_ops_ranges = {
+ .list_voltage = regulator_list_voltage_linear_range,
+ .map_voltage = regulator_map_voltage_linear_range,
+ .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_range,
+ .set_suspend_enable = rk808_set_suspend_enable,
+ .set_suspend_disable = rk808_set_suspend_disable,
+};
+
static struct regulator_ops rk808_switch_ops = {
.enable = regulator_enable_regmap,
.disable = regulator_disable_regmap,
@@ -383,7 +411,7 @@ static const struct regulator_desc rk808_reg[] = {
.name = "LDO_REG3",
.supply_name = "vcc7",
.id = RK808_ID_LDO3,
- .ops = &rk808_reg_ops,
+ .ops = &rk808_reg_ops_ranges,
.type = REGULATOR_VOLTAGE,
.n_voltages = 16,
.linear_ranges = rk808_ldo3_voltage_ranges,
--
1.9.1
--
--
You received this message because you are subscribed to "rtc-linux".
Membership options at http://groups.google.com/group/rtc-linux .
Please read http://groups.google.com/group/rtc-linux/web/checklist
before submitting a driver.
---
You received this message because you are subscribed to the Google Groups "rtc-linux" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [PATCH v4 2/7] regulator: rk808: Migrate to regulator core's simplified DT parsing code
2016-04-26 14:54 ` [rtc-linux] " Wadim Egorov
(?)
@ 2016-04-26 14:54 ` Wadim Egorov
-1 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-04-26 14:54 UTC (permalink / raw)
To: linux-kernel, linux-clk, rtc-linux, devicetree, linux-rockchip,
lee.jones
Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak,
mturquette, sboyd, lgirdwood, broonie, a.zummo,
alexandre.belloni, dianders, zyw
A common simplified DT parsing code for regulators was introduced in
commit a0c7b164ad11 ("regulator: of: Provide simplified DT parsing
method")
While at it also added RK8XX_DESC and RK8XX_DESC_SWITCH macros for the
regulator_desc struct initialization. This just makes the driver more compact.
Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
---
drivers/regulator/rk808-regulator.c | 250 ++++++++++++------------------------
1 file changed, 79 insertions(+), 171 deletions(-)
diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c
index 6601ab5..40d07ba 100644
--- a/drivers/regulator/rk808-regulator.c
+++ b/drivers/regulator/rk808-regulator.c
@@ -55,6 +55,42 @@
/* max steps for increase voltage of Buck1/2, equal 100mv*/
#define MAX_STEPS_ONE_TIME 8
+#define RK8XX_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 = &rk808_reg_ops, \
+ }
+
+#define RK8XX_DESC_SWITCH(_id, _match, _supply, _ereg, _emask) \
+ [_id] = { \
+ .name = (_match), \
+ .supply_name = (_supply), \
+ .of_match = of_match_ptr(_match), \
+ .regulators_node = of_match_ptr("regulators"), \
+ .type = REGULATOR_VOLTAGE, \
+ .id = (_id), \
+ .enable_reg = (_ereg), \
+ .enable_mask = (_emask), \
+ .owner = THIS_MODULE, \
+ .ops = &rk808_switch_ops \
+ }
+
+
struct rk808_regulator_data {
struct gpio_desc *dvs_gpio[2];
};
@@ -328,6 +364,8 @@ static const struct regulator_desc rk808_reg[] = {
{
.name = "DCDC_REG1",
.supply_name = "vcc1",
+ .of_match = of_match_ptr("DCDC_REG1"),
+ .regulators_node = of_match_ptr("regulators"),
.id = RK808_ID_DCDC1,
.ops = &rk808_buck1_2_ops,
.type = REGULATOR_VOLTAGE,
@@ -342,6 +380,8 @@ static const struct regulator_desc rk808_reg[] = {
}, {
.name = "DCDC_REG2",
.supply_name = "vcc2",
+ .of_match = of_match_ptr("DCDC_REG2"),
+ .regulators_node = of_match_ptr("regulators"),
.id = RK808_ID_DCDC2,
.ops = &rk808_buck1_2_ops,
.type = REGULATOR_VOLTAGE,
@@ -356,6 +396,8 @@ static const struct regulator_desc rk808_reg[] = {
}, {
.name = "DCDC_REG3",
.supply_name = "vcc3",
+ .of_match = of_match_ptr("DCDC_REG3"),
+ .regulators_node = of_match_ptr("regulators"),
.id = RK808_ID_DCDC3,
.ops = &rk808_switch_ops,
.type = REGULATOR_VOLTAGE,
@@ -363,53 +405,21 @@ static const struct regulator_desc rk808_reg[] = {
.enable_reg = RK808_DCDC_EN_REG,
.enable_mask = BIT(2),
.owner = THIS_MODULE,
- }, {
- .name = "DCDC_REG4",
- .supply_name = "vcc4",
- .id = RK808_ID_DCDC4,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 1800000,
- .uV_step = 100000,
- .n_voltages = 16,
- .vsel_reg = RK808_BUCK4_ON_VSEL_REG,
- .vsel_mask = RK808_BUCK4_VSEL_MASK,
- .enable_reg = RK808_DCDC_EN_REG,
- .enable_mask = BIT(3),
- .owner = THIS_MODULE,
- }, {
- .name = "LDO_REG1",
- .supply_name = "vcc6",
- .id = RK808_ID_LDO1,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 1800000,
- .uV_step = 100000,
- .n_voltages = 17,
- .vsel_reg = RK808_LDO1_ON_VSEL_REG,
- .vsel_mask = RK808_LDO_VSEL_MASK,
- .enable_reg = RK808_LDO_EN_REG,
- .enable_mask = BIT(0),
- .enable_time = 400,
- .owner = THIS_MODULE,
- }, {
- .name = "LDO_REG2",
- .supply_name = "vcc6",
- .id = RK808_ID_LDO2,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 1800000,
- .uV_step = 100000,
- .n_voltages = 17,
- .vsel_reg = RK808_LDO2_ON_VSEL_REG,
- .vsel_mask = RK808_LDO_VSEL_MASK,
- .enable_reg = RK808_LDO_EN_REG,
- .enable_mask = BIT(1),
- .enable_time = 400,
- .owner = THIS_MODULE,
- }, {
+ },
+ RK8XX_DESC(RK808_ID_DCDC4, "DCDC_REG4", "vcc4", 1800, 3300, 100,
+ RK808_BUCK4_ON_VSEL_REG, RK808_BUCK4_VSEL_MASK,
+ RK808_DCDC_EN_REG, BIT(3), 0),
+ RK8XX_DESC(RK808_ID_LDO1, "LDO_REG1", "vcc6", 1800, 3400, 100,
+ RK808_LDO1_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+ BIT(0), 400),
+ RK8XX_DESC(RK808_ID_LDO2, "LDO_REG2", "vcc6", 1800, 3400, 100,
+ RK808_LDO2_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+ BIT(1), 400),
+ {
.name = "LDO_REG3",
.supply_name = "vcc7",
+ .of_match = of_match_ptr("LDO_REG3"),
+ .regulators_node = of_match_ptr("regulators"),
.id = RK808_ID_LDO3,
.ops = &rk808_reg_ops_ranges,
.type = REGULATOR_VOLTAGE,
@@ -422,117 +432,26 @@ static const struct regulator_desc rk808_reg[] = {
.enable_mask = BIT(2),
.enable_time = 400,
.owner = THIS_MODULE,
- }, {
- .name = "LDO_REG4",
- .supply_name = "vcc9",
- .id = RK808_ID_LDO4,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 1800000,
- .uV_step = 100000,
- .n_voltages = 17,
- .vsel_reg = RK808_LDO4_ON_VSEL_REG,
- .vsel_mask = RK808_LDO_VSEL_MASK,
- .enable_reg = RK808_LDO_EN_REG,
- .enable_mask = BIT(3),
- .enable_time = 400,
- .owner = THIS_MODULE,
- }, {
- .name = "LDO_REG5",
- .supply_name = "vcc9",
- .id = RK808_ID_LDO5,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 1800000,
- .uV_step = 100000,
- .n_voltages = 17,
- .vsel_reg = RK808_LDO5_ON_VSEL_REG,
- .vsel_mask = RK808_LDO_VSEL_MASK,
- .enable_reg = RK808_LDO_EN_REG,
- .enable_mask = BIT(4),
- .enable_time = 400,
- .owner = THIS_MODULE,
- }, {
- .name = "LDO_REG6",
- .supply_name = "vcc10",
- .id = RK808_ID_LDO6,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 800000,
- .uV_step = 100000,
- .n_voltages = 18,
- .vsel_reg = RK808_LDO6_ON_VSEL_REG,
- .vsel_mask = RK808_LDO_VSEL_MASK,
- .enable_reg = RK808_LDO_EN_REG,
- .enable_mask = BIT(5),
- .enable_time = 400,
- .owner = THIS_MODULE,
- }, {
- .name = "LDO_REG7",
- .supply_name = "vcc7",
- .id = RK808_ID_LDO7,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 800000,
- .uV_step = 100000,
- .n_voltages = 18,
- .vsel_reg = RK808_LDO7_ON_VSEL_REG,
- .vsel_mask = RK808_LDO_VSEL_MASK,
- .enable_reg = RK808_LDO_EN_REG,
- .enable_mask = BIT(6),
- .enable_time = 400,
- .owner = THIS_MODULE,
- }, {
- .name = "LDO_REG8",
- .supply_name = "vcc11",
- .id = RK808_ID_LDO8,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 1800000,
- .uV_step = 100000,
- .n_voltages = 17,
- .vsel_reg = RK808_LDO8_ON_VSEL_REG,
- .vsel_mask = RK808_LDO_VSEL_MASK,
- .enable_reg = RK808_LDO_EN_REG,
- .enable_mask = BIT(7),
- .enable_time = 400,
- .owner = THIS_MODULE,
- }, {
- .name = "SWITCH_REG1",
- .supply_name = "vcc8",
- .id = RK808_ID_SWITCH1,
- .ops = &rk808_switch_ops,
- .type = REGULATOR_VOLTAGE,
- .enable_reg = RK808_DCDC_EN_REG,
- .enable_mask = BIT(5),
- .owner = THIS_MODULE,
- }, {
- .name = "SWITCH_REG2",
- .supply_name = "vcc12",
- .id = RK808_ID_SWITCH2,
- .ops = &rk808_switch_ops,
- .type = REGULATOR_VOLTAGE,
- .enable_reg = RK808_DCDC_EN_REG,
- .enable_mask = BIT(6),
- .owner = THIS_MODULE,
},
-};
-
-static struct of_regulator_match rk808_reg_matches[] = {
- [RK808_ID_DCDC1] = { .name = "DCDC_REG1" },
- [RK808_ID_DCDC2] = { .name = "DCDC_REG2" },
- [RK808_ID_DCDC3] = { .name = "DCDC_REG3" },
- [RK808_ID_DCDC4] = { .name = "DCDC_REG4" },
- [RK808_ID_LDO1] = { .name = "LDO_REG1" },
- [RK808_ID_LDO2] = { .name = "LDO_REG2" },
- [RK808_ID_LDO3] = { .name = "LDO_REG3" },
- [RK808_ID_LDO4] = { .name = "LDO_REG4" },
- [RK808_ID_LDO5] = { .name = "LDO_REG5" },
- [RK808_ID_LDO6] = { .name = "LDO_REG6" },
- [RK808_ID_LDO7] = { .name = "LDO_REG7" },
- [RK808_ID_LDO8] = { .name = "LDO_REG8" },
- [RK808_ID_SWITCH1] = { .name = "SWITCH_REG1" },
- [RK808_ID_SWITCH2] = { .name = "SWITCH_REG2" },
+ RK8XX_DESC(RK808_ID_LDO4, "LDO_REG4", "vcc9", 1800, 3400, 100,
+ RK808_LDO4_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+ BIT(3), 400),
+ RK8XX_DESC(RK808_ID_LDO5, "LDO_REG5", "vcc9", 1800, 3400, 100,
+ RK808_LDO5_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+ BIT(4), 400),
+ RK8XX_DESC(RK808_ID_LDO6, "LDO_REG6", "vcc10", 800, 2500, 100,
+ RK808_LDO6_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+ BIT(5), 400),
+ RK8XX_DESC(RK808_ID_LDO7, "LDO_REG7", "vcc7", 800, 2500, 100,
+ RK808_LDO7_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+ BIT(6), 400),
+ RK8XX_DESC(RK808_ID_LDO8, "LDO_REG8", "vcc11", 1800, 3400, 100,
+ RK808_LDO8_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+ BIT(7), 400),
+ RK8XX_DESC_SWITCH(RK808_ID_SWITCH1, "SWITCH_REG1", "vcc8",
+ RK808_DCDC_EN_REG, BIT(5)),
+ RK8XX_DESC_SWITCH(RK808_ID_SWITCH2, "SWITCH_REG2", "vcc12",
+ RK808_DCDC_EN_REG, BIT(6)),
};
static int rk808_regulator_dt_parse_pdata(struct device *dev,
@@ -541,17 +460,12 @@ static int rk808_regulator_dt_parse_pdata(struct device *dev,
struct rk808_regulator_data *pdata)
{
struct device_node *np;
- int tmp, ret, i;
+ int tmp, ret = 0, i;
np = of_get_child_by_name(client_dev->of_node, "regulators");
if (!np)
return -ENXIO;
- ret = of_regulator_match(dev, np, rk808_reg_matches,
- RK808_NUM_REGULATORS);
- if (ret < 0)
- goto dt_parse_end;
-
for (i = 0; i < ARRAY_SIZE(pdata->dvs_gpio); i++) {
pdata->dvs_gpio[i] =
devm_gpiod_get_index_optional(client_dev, "dvs", i,
@@ -598,18 +512,12 @@ static int rk808_regulator_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, pdata);
+ config.dev = &client->dev;
+ config.driver_data = pdata;
+ config.regmap = rk808->regmap;
+
/* Instantiate the regulators */
for (i = 0; i < RK808_NUM_REGULATORS; i++) {
- if (!rk808_reg_matches[i].init_data ||
- !rk808_reg_matches[i].of_node)
- continue;
-
- config.dev = &client->dev;
- config.driver_data = pdata;
- config.regmap = rk808->regmap;
- config.of_node = rk808_reg_matches[i].of_node;
- config.init_data = rk808_reg_matches[i].init_data;
-
rk808_rdev = devm_regulator_register(&pdev->dev,
&rk808_reg[i], &config);
if (IS_ERR(rk808_rdev)) {
--
1.9.1
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [rtc-linux] [PATCH v4 2/7] regulator: rk808: Migrate to regulator core's simplified DT parsing code
@ 2016-04-26 14:54 ` Wadim Egorov
0 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-04-26 14:54 UTC (permalink / raw)
To: linux-kernel, linux-clk, rtc-linux, devicetree, linux-rockchip,
lee.jones
Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak,
mturquette, sboyd, lgirdwood, broonie, a.zummo,
alexandre.belloni, dianders, zyw
A common simplified DT parsing code for regulators was introduced in
commit a0c7b164ad11 ("regulator: of: Provide simplified DT parsing
method")
While at it also added RK8XX_DESC and RK8XX_DESC_SWITCH macros for the
regulator_desc struct initialization. This just makes the driver more compact.
Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
---
drivers/regulator/rk808-regulator.c | 250 ++++++++++++------------------------
1 file changed, 79 insertions(+), 171 deletions(-)
diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c
index 6601ab5..40d07ba 100644
--- a/drivers/regulator/rk808-regulator.c
+++ b/drivers/regulator/rk808-regulator.c
@@ -55,6 +55,42 @@
/* max steps for increase voltage of Buck1/2, equal 100mv*/
#define MAX_STEPS_ONE_TIME 8
+#define RK8XX_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 = &rk808_reg_ops, \
+ }
+
+#define RK8XX_DESC_SWITCH(_id, _match, _supply, _ereg, _emask) \
+ [_id] = { \
+ .name = (_match), \
+ .supply_name = (_supply), \
+ .of_match = of_match_ptr(_match), \
+ .regulators_node = of_match_ptr("regulators"), \
+ .type = REGULATOR_VOLTAGE, \
+ .id = (_id), \
+ .enable_reg = (_ereg), \
+ .enable_mask = (_emask), \
+ .owner = THIS_MODULE, \
+ .ops = &rk808_switch_ops \
+ }
+
+
struct rk808_regulator_data {
struct gpio_desc *dvs_gpio[2];
};
@@ -328,6 +364,8 @@ static const struct regulator_desc rk808_reg[] = {
{
.name = "DCDC_REG1",
.supply_name = "vcc1",
+ .of_match = of_match_ptr("DCDC_REG1"),
+ .regulators_node = of_match_ptr("regulators"),
.id = RK808_ID_DCDC1,
.ops = &rk808_buck1_2_ops,
.type = REGULATOR_VOLTAGE,
@@ -342,6 +380,8 @@ static const struct regulator_desc rk808_reg[] = {
}, {
.name = "DCDC_REG2",
.supply_name = "vcc2",
+ .of_match = of_match_ptr("DCDC_REG2"),
+ .regulators_node = of_match_ptr("regulators"),
.id = RK808_ID_DCDC2,
.ops = &rk808_buck1_2_ops,
.type = REGULATOR_VOLTAGE,
@@ -356,6 +396,8 @@ static const struct regulator_desc rk808_reg[] = {
}, {
.name = "DCDC_REG3",
.supply_name = "vcc3",
+ .of_match = of_match_ptr("DCDC_REG3"),
+ .regulators_node = of_match_ptr("regulators"),
.id = RK808_ID_DCDC3,
.ops = &rk808_switch_ops,
.type = REGULATOR_VOLTAGE,
@@ -363,53 +405,21 @@ static const struct regulator_desc rk808_reg[] = {
.enable_reg = RK808_DCDC_EN_REG,
.enable_mask = BIT(2),
.owner = THIS_MODULE,
- }, {
- .name = "DCDC_REG4",
- .supply_name = "vcc4",
- .id = RK808_ID_DCDC4,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 1800000,
- .uV_step = 100000,
- .n_voltages = 16,
- .vsel_reg = RK808_BUCK4_ON_VSEL_REG,
- .vsel_mask = RK808_BUCK4_VSEL_MASK,
- .enable_reg = RK808_DCDC_EN_REG,
- .enable_mask = BIT(3),
- .owner = THIS_MODULE,
- }, {
- .name = "LDO_REG1",
- .supply_name = "vcc6",
- .id = RK808_ID_LDO1,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 1800000,
- .uV_step = 100000,
- .n_voltages = 17,
- .vsel_reg = RK808_LDO1_ON_VSEL_REG,
- .vsel_mask = RK808_LDO_VSEL_MASK,
- .enable_reg = RK808_LDO_EN_REG,
- .enable_mask = BIT(0),
- .enable_time = 400,
- .owner = THIS_MODULE,
- }, {
- .name = "LDO_REG2",
- .supply_name = "vcc6",
- .id = RK808_ID_LDO2,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 1800000,
- .uV_step = 100000,
- .n_voltages = 17,
- .vsel_reg = RK808_LDO2_ON_VSEL_REG,
- .vsel_mask = RK808_LDO_VSEL_MASK,
- .enable_reg = RK808_LDO_EN_REG,
- .enable_mask = BIT(1),
- .enable_time = 400,
- .owner = THIS_MODULE,
- }, {
+ },
+ RK8XX_DESC(RK808_ID_DCDC4, "DCDC_REG4", "vcc4", 1800, 3300, 100,
+ RK808_BUCK4_ON_VSEL_REG, RK808_BUCK4_VSEL_MASK,
+ RK808_DCDC_EN_REG, BIT(3), 0),
+ RK8XX_DESC(RK808_ID_LDO1, "LDO_REG1", "vcc6", 1800, 3400, 100,
+ RK808_LDO1_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+ BIT(0), 400),
+ RK8XX_DESC(RK808_ID_LDO2, "LDO_REG2", "vcc6", 1800, 3400, 100,
+ RK808_LDO2_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+ BIT(1), 400),
+ {
.name = "LDO_REG3",
.supply_name = "vcc7",
+ .of_match = of_match_ptr("LDO_REG3"),
+ .regulators_node = of_match_ptr("regulators"),
.id = RK808_ID_LDO3,
.ops = &rk808_reg_ops_ranges,
.type = REGULATOR_VOLTAGE,
@@ -422,117 +432,26 @@ static const struct regulator_desc rk808_reg[] = {
.enable_mask = BIT(2),
.enable_time = 400,
.owner = THIS_MODULE,
- }, {
- .name = "LDO_REG4",
- .supply_name = "vcc9",
- .id = RK808_ID_LDO4,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 1800000,
- .uV_step = 100000,
- .n_voltages = 17,
- .vsel_reg = RK808_LDO4_ON_VSEL_REG,
- .vsel_mask = RK808_LDO_VSEL_MASK,
- .enable_reg = RK808_LDO_EN_REG,
- .enable_mask = BIT(3),
- .enable_time = 400,
- .owner = THIS_MODULE,
- }, {
- .name = "LDO_REG5",
- .supply_name = "vcc9",
- .id = RK808_ID_LDO5,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 1800000,
- .uV_step = 100000,
- .n_voltages = 17,
- .vsel_reg = RK808_LDO5_ON_VSEL_REG,
- .vsel_mask = RK808_LDO_VSEL_MASK,
- .enable_reg = RK808_LDO_EN_REG,
- .enable_mask = BIT(4),
- .enable_time = 400,
- .owner = THIS_MODULE,
- }, {
- .name = "LDO_REG6",
- .supply_name = "vcc10",
- .id = RK808_ID_LDO6,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 800000,
- .uV_step = 100000,
- .n_voltages = 18,
- .vsel_reg = RK808_LDO6_ON_VSEL_REG,
- .vsel_mask = RK808_LDO_VSEL_MASK,
- .enable_reg = RK808_LDO_EN_REG,
- .enable_mask = BIT(5),
- .enable_time = 400,
- .owner = THIS_MODULE,
- }, {
- .name = "LDO_REG7",
- .supply_name = "vcc7",
- .id = RK808_ID_LDO7,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 800000,
- .uV_step = 100000,
- .n_voltages = 18,
- .vsel_reg = RK808_LDO7_ON_VSEL_REG,
- .vsel_mask = RK808_LDO_VSEL_MASK,
- .enable_reg = RK808_LDO_EN_REG,
- .enable_mask = BIT(6),
- .enable_time = 400,
- .owner = THIS_MODULE,
- }, {
- .name = "LDO_REG8",
- .supply_name = "vcc11",
- .id = RK808_ID_LDO8,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 1800000,
- .uV_step = 100000,
- .n_voltages = 17,
- .vsel_reg = RK808_LDO8_ON_VSEL_REG,
- .vsel_mask = RK808_LDO_VSEL_MASK,
- .enable_reg = RK808_LDO_EN_REG,
- .enable_mask = BIT(7),
- .enable_time = 400,
- .owner = THIS_MODULE,
- }, {
- .name = "SWITCH_REG1",
- .supply_name = "vcc8",
- .id = RK808_ID_SWITCH1,
- .ops = &rk808_switch_ops,
- .type = REGULATOR_VOLTAGE,
- .enable_reg = RK808_DCDC_EN_REG,
- .enable_mask = BIT(5),
- .owner = THIS_MODULE,
- }, {
- .name = "SWITCH_REG2",
- .supply_name = "vcc12",
- .id = RK808_ID_SWITCH2,
- .ops = &rk808_switch_ops,
- .type = REGULATOR_VOLTAGE,
- .enable_reg = RK808_DCDC_EN_REG,
- .enable_mask = BIT(6),
- .owner = THIS_MODULE,
},
-};
-
-static struct of_regulator_match rk808_reg_matches[] = {
- [RK808_ID_DCDC1] = { .name = "DCDC_REG1" },
- [RK808_ID_DCDC2] = { .name = "DCDC_REG2" },
- [RK808_ID_DCDC3] = { .name = "DCDC_REG3" },
- [RK808_ID_DCDC4] = { .name = "DCDC_REG4" },
- [RK808_ID_LDO1] = { .name = "LDO_REG1" },
- [RK808_ID_LDO2] = { .name = "LDO_REG2" },
- [RK808_ID_LDO3] = { .name = "LDO_REG3" },
- [RK808_ID_LDO4] = { .name = "LDO_REG4" },
- [RK808_ID_LDO5] = { .name = "LDO_REG5" },
- [RK808_ID_LDO6] = { .name = "LDO_REG6" },
- [RK808_ID_LDO7] = { .name = "LDO_REG7" },
- [RK808_ID_LDO8] = { .name = "LDO_REG8" },
- [RK808_ID_SWITCH1] = { .name = "SWITCH_REG1" },
- [RK808_ID_SWITCH2] = { .name = "SWITCH_REG2" },
+ RK8XX_DESC(RK808_ID_LDO4, "LDO_REG4", "vcc9", 1800, 3400, 100,
+ RK808_LDO4_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+ BIT(3), 400),
+ RK8XX_DESC(RK808_ID_LDO5, "LDO_REG5", "vcc9", 1800, 3400, 100,
+ RK808_LDO5_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+ BIT(4), 400),
+ RK8XX_DESC(RK808_ID_LDO6, "LDO_REG6", "vcc10", 800, 2500, 100,
+ RK808_LDO6_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+ BIT(5), 400),
+ RK8XX_DESC(RK808_ID_LDO7, "LDO_REG7", "vcc7", 800, 2500, 100,
+ RK808_LDO7_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+ BIT(6), 400),
+ RK8XX_DESC(RK808_ID_LDO8, "LDO_REG8", "vcc11", 1800, 3400, 100,
+ RK808_LDO8_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+ BIT(7), 400),
+ RK8XX_DESC_SWITCH(RK808_ID_SWITCH1, "SWITCH_REG1", "vcc8",
+ RK808_DCDC_EN_REG, BIT(5)),
+ RK8XX_DESC_SWITCH(RK808_ID_SWITCH2, "SWITCH_REG2", "vcc12",
+ RK808_DCDC_EN_REG, BIT(6)),
};
static int rk808_regulator_dt_parse_pdata(struct device *dev,
@@ -541,17 +460,12 @@ static int rk808_regulator_dt_parse_pdata(struct device *dev,
struct rk808_regulator_data *pdata)
{
struct device_node *np;
- int tmp, ret, i;
+ int tmp, ret = 0, i;
np = of_get_child_by_name(client_dev->of_node, "regulators");
if (!np)
return -ENXIO;
- ret = of_regulator_match(dev, np, rk808_reg_matches,
- RK808_NUM_REGULATORS);
- if (ret < 0)
- goto dt_parse_end;
-
for (i = 0; i < ARRAY_SIZE(pdata->dvs_gpio); i++) {
pdata->dvs_gpio[i] =
devm_gpiod_get_index_optional(client_dev, "dvs", i,
@@ -598,18 +512,12 @@ static int rk808_regulator_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, pdata);
+ config.dev = &client->dev;
+ config.driver_data = pdata;
+ config.regmap = rk808->regmap;
+
/* Instantiate the regulators */
for (i = 0; i < RK808_NUM_REGULATORS; i++) {
- if (!rk808_reg_matches[i].init_data ||
- !rk808_reg_matches[i].of_node)
- continue;
-
- config.dev = &client->dev;
- config.driver_data = pdata;
- config.regmap = rk808->regmap;
- config.of_node = rk808_reg_matches[i].of_node;
- config.init_data = rk808_reg_matches[i].init_data;
-
rk808_rdev = devm_regulator_register(&pdev->dev,
&rk808_reg[i], &config);
if (IS_ERR(rk808_rdev)) {
--
1.9.1
--
--
You received this message because you are subscribed to "rtc-linux".
Membership options at http://groups.google.com/group/rtc-linux .
Please read http://groups.google.com/group/rtc-linux/web/checklist
before submitting a driver.
---
You received this message because you are subscribed to the Google Groups "rtc-linux" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [PATCH v4 2/7] regulator: rk808: Migrate to regulator core's simplified DT parsing code
@ 2016-04-26 14:54 ` Wadim Egorov
0 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-04-26 14:54 UTC (permalink / raw)
To: linux-kernel-u79uwXL29TY76Z2rM5mHXA,
linux-clk-u79uwXL29TY76Z2rM5mHXA,
rtc-linux-/JYPxA39Uh5TLH3MbocFFw,
devicetree-u79uwXL29TY76Z2rM5mHXA,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
lee.jones-QSEj5FYQhm4dnm+yROfE0A
Cc: mark.rutland-5wv7dgnIgG8, a.zummo-BfzFCNDTiLLj+vYz1yj4TQ,
pawel.moll-5wv7dgnIgG8, ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg,
mturquette-rdvid1DuHRBWk0Htik3J/w, sboyd-sgV2jX0FEOL9JmXXK+q4OQ,
lgirdwood-Re5JQEeQqe8AvxtiuMwx3w,
dianders-F7+t8E8rja9g9hUCZPvPmw, robh+dt-DgEjT+Ai2ygdnm+yROfE0A,
alexandre.belloni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
broonie-DgEjT+Ai2ygdnm+yROfE0A, galak-sgV2jX0FEOL9JmXXK+q4OQ,
zyw-TNX95d0MmH7DzftRWevZcw
A common simplified DT parsing code for regulators was introduced in
commit a0c7b164ad11 ("regulator: of: Provide simplified DT parsing
method")
While at it also added RK8XX_DESC and RK8XX_DESC_SWITCH macros for the
regulator_desc struct initialization. This just makes the driver more compact.
Signed-off-by: Wadim Egorov <w.egorov-guT5V/WYfQezQB+pC5nmwQ@public.gmane.org>
---
drivers/regulator/rk808-regulator.c | 250 ++++++++++++------------------------
1 file changed, 79 insertions(+), 171 deletions(-)
diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c
index 6601ab5..40d07ba 100644
--- a/drivers/regulator/rk808-regulator.c
+++ b/drivers/regulator/rk808-regulator.c
@@ -55,6 +55,42 @@
/* max steps for increase voltage of Buck1/2, equal 100mv*/
#define MAX_STEPS_ONE_TIME 8
+#define RK8XX_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 = &rk808_reg_ops, \
+ }
+
+#define RK8XX_DESC_SWITCH(_id, _match, _supply, _ereg, _emask) \
+ [_id] = { \
+ .name = (_match), \
+ .supply_name = (_supply), \
+ .of_match = of_match_ptr(_match), \
+ .regulators_node = of_match_ptr("regulators"), \
+ .type = REGULATOR_VOLTAGE, \
+ .id = (_id), \
+ .enable_reg = (_ereg), \
+ .enable_mask = (_emask), \
+ .owner = THIS_MODULE, \
+ .ops = &rk808_switch_ops \
+ }
+
+
struct rk808_regulator_data {
struct gpio_desc *dvs_gpio[2];
};
@@ -328,6 +364,8 @@ static const struct regulator_desc rk808_reg[] = {
{
.name = "DCDC_REG1",
.supply_name = "vcc1",
+ .of_match = of_match_ptr("DCDC_REG1"),
+ .regulators_node = of_match_ptr("regulators"),
.id = RK808_ID_DCDC1,
.ops = &rk808_buck1_2_ops,
.type = REGULATOR_VOLTAGE,
@@ -342,6 +380,8 @@ static const struct regulator_desc rk808_reg[] = {
}, {
.name = "DCDC_REG2",
.supply_name = "vcc2",
+ .of_match = of_match_ptr("DCDC_REG2"),
+ .regulators_node = of_match_ptr("regulators"),
.id = RK808_ID_DCDC2,
.ops = &rk808_buck1_2_ops,
.type = REGULATOR_VOLTAGE,
@@ -356,6 +396,8 @@ static const struct regulator_desc rk808_reg[] = {
}, {
.name = "DCDC_REG3",
.supply_name = "vcc3",
+ .of_match = of_match_ptr("DCDC_REG3"),
+ .regulators_node = of_match_ptr("regulators"),
.id = RK808_ID_DCDC3,
.ops = &rk808_switch_ops,
.type = REGULATOR_VOLTAGE,
@@ -363,53 +405,21 @@ static const struct regulator_desc rk808_reg[] = {
.enable_reg = RK808_DCDC_EN_REG,
.enable_mask = BIT(2),
.owner = THIS_MODULE,
- }, {
- .name = "DCDC_REG4",
- .supply_name = "vcc4",
- .id = RK808_ID_DCDC4,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 1800000,
- .uV_step = 100000,
- .n_voltages = 16,
- .vsel_reg = RK808_BUCK4_ON_VSEL_REG,
- .vsel_mask = RK808_BUCK4_VSEL_MASK,
- .enable_reg = RK808_DCDC_EN_REG,
- .enable_mask = BIT(3),
- .owner = THIS_MODULE,
- }, {
- .name = "LDO_REG1",
- .supply_name = "vcc6",
- .id = RK808_ID_LDO1,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 1800000,
- .uV_step = 100000,
- .n_voltages = 17,
- .vsel_reg = RK808_LDO1_ON_VSEL_REG,
- .vsel_mask = RK808_LDO_VSEL_MASK,
- .enable_reg = RK808_LDO_EN_REG,
- .enable_mask = BIT(0),
- .enable_time = 400,
- .owner = THIS_MODULE,
- }, {
- .name = "LDO_REG2",
- .supply_name = "vcc6",
- .id = RK808_ID_LDO2,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 1800000,
- .uV_step = 100000,
- .n_voltages = 17,
- .vsel_reg = RK808_LDO2_ON_VSEL_REG,
- .vsel_mask = RK808_LDO_VSEL_MASK,
- .enable_reg = RK808_LDO_EN_REG,
- .enable_mask = BIT(1),
- .enable_time = 400,
- .owner = THIS_MODULE,
- }, {
+ },
+ RK8XX_DESC(RK808_ID_DCDC4, "DCDC_REG4", "vcc4", 1800, 3300, 100,
+ RK808_BUCK4_ON_VSEL_REG, RK808_BUCK4_VSEL_MASK,
+ RK808_DCDC_EN_REG, BIT(3), 0),
+ RK8XX_DESC(RK808_ID_LDO1, "LDO_REG1", "vcc6", 1800, 3400, 100,
+ RK808_LDO1_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+ BIT(0), 400),
+ RK8XX_DESC(RK808_ID_LDO2, "LDO_REG2", "vcc6", 1800, 3400, 100,
+ RK808_LDO2_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+ BIT(1), 400),
+ {
.name = "LDO_REG3",
.supply_name = "vcc7",
+ .of_match = of_match_ptr("LDO_REG3"),
+ .regulators_node = of_match_ptr("regulators"),
.id = RK808_ID_LDO3,
.ops = &rk808_reg_ops_ranges,
.type = REGULATOR_VOLTAGE,
@@ -422,117 +432,26 @@ static const struct regulator_desc rk808_reg[] = {
.enable_mask = BIT(2),
.enable_time = 400,
.owner = THIS_MODULE,
- }, {
- .name = "LDO_REG4",
- .supply_name = "vcc9",
- .id = RK808_ID_LDO4,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 1800000,
- .uV_step = 100000,
- .n_voltages = 17,
- .vsel_reg = RK808_LDO4_ON_VSEL_REG,
- .vsel_mask = RK808_LDO_VSEL_MASK,
- .enable_reg = RK808_LDO_EN_REG,
- .enable_mask = BIT(3),
- .enable_time = 400,
- .owner = THIS_MODULE,
- }, {
- .name = "LDO_REG5",
- .supply_name = "vcc9",
- .id = RK808_ID_LDO5,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 1800000,
- .uV_step = 100000,
- .n_voltages = 17,
- .vsel_reg = RK808_LDO5_ON_VSEL_REG,
- .vsel_mask = RK808_LDO_VSEL_MASK,
- .enable_reg = RK808_LDO_EN_REG,
- .enable_mask = BIT(4),
- .enable_time = 400,
- .owner = THIS_MODULE,
- }, {
- .name = "LDO_REG6",
- .supply_name = "vcc10",
- .id = RK808_ID_LDO6,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 800000,
- .uV_step = 100000,
- .n_voltages = 18,
- .vsel_reg = RK808_LDO6_ON_VSEL_REG,
- .vsel_mask = RK808_LDO_VSEL_MASK,
- .enable_reg = RK808_LDO_EN_REG,
- .enable_mask = BIT(5),
- .enable_time = 400,
- .owner = THIS_MODULE,
- }, {
- .name = "LDO_REG7",
- .supply_name = "vcc7",
- .id = RK808_ID_LDO7,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 800000,
- .uV_step = 100000,
- .n_voltages = 18,
- .vsel_reg = RK808_LDO7_ON_VSEL_REG,
- .vsel_mask = RK808_LDO_VSEL_MASK,
- .enable_reg = RK808_LDO_EN_REG,
- .enable_mask = BIT(6),
- .enable_time = 400,
- .owner = THIS_MODULE,
- }, {
- .name = "LDO_REG8",
- .supply_name = "vcc11",
- .id = RK808_ID_LDO8,
- .ops = &rk808_reg_ops,
- .type = REGULATOR_VOLTAGE,
- .min_uV = 1800000,
- .uV_step = 100000,
- .n_voltages = 17,
- .vsel_reg = RK808_LDO8_ON_VSEL_REG,
- .vsel_mask = RK808_LDO_VSEL_MASK,
- .enable_reg = RK808_LDO_EN_REG,
- .enable_mask = BIT(7),
- .enable_time = 400,
- .owner = THIS_MODULE,
- }, {
- .name = "SWITCH_REG1",
- .supply_name = "vcc8",
- .id = RK808_ID_SWITCH1,
- .ops = &rk808_switch_ops,
- .type = REGULATOR_VOLTAGE,
- .enable_reg = RK808_DCDC_EN_REG,
- .enable_mask = BIT(5),
- .owner = THIS_MODULE,
- }, {
- .name = "SWITCH_REG2",
- .supply_name = "vcc12",
- .id = RK808_ID_SWITCH2,
- .ops = &rk808_switch_ops,
- .type = REGULATOR_VOLTAGE,
- .enable_reg = RK808_DCDC_EN_REG,
- .enable_mask = BIT(6),
- .owner = THIS_MODULE,
},
-};
-
-static struct of_regulator_match rk808_reg_matches[] = {
- [RK808_ID_DCDC1] = { .name = "DCDC_REG1" },
- [RK808_ID_DCDC2] = { .name = "DCDC_REG2" },
- [RK808_ID_DCDC3] = { .name = "DCDC_REG3" },
- [RK808_ID_DCDC4] = { .name = "DCDC_REG4" },
- [RK808_ID_LDO1] = { .name = "LDO_REG1" },
- [RK808_ID_LDO2] = { .name = "LDO_REG2" },
- [RK808_ID_LDO3] = { .name = "LDO_REG3" },
- [RK808_ID_LDO4] = { .name = "LDO_REG4" },
- [RK808_ID_LDO5] = { .name = "LDO_REG5" },
- [RK808_ID_LDO6] = { .name = "LDO_REG6" },
- [RK808_ID_LDO7] = { .name = "LDO_REG7" },
- [RK808_ID_LDO8] = { .name = "LDO_REG8" },
- [RK808_ID_SWITCH1] = { .name = "SWITCH_REG1" },
- [RK808_ID_SWITCH2] = { .name = "SWITCH_REG2" },
+ RK8XX_DESC(RK808_ID_LDO4, "LDO_REG4", "vcc9", 1800, 3400, 100,
+ RK808_LDO4_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+ BIT(3), 400),
+ RK8XX_DESC(RK808_ID_LDO5, "LDO_REG5", "vcc9", 1800, 3400, 100,
+ RK808_LDO5_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+ BIT(4), 400),
+ RK8XX_DESC(RK808_ID_LDO6, "LDO_REG6", "vcc10", 800, 2500, 100,
+ RK808_LDO6_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+ BIT(5), 400),
+ RK8XX_DESC(RK808_ID_LDO7, "LDO_REG7", "vcc7", 800, 2500, 100,
+ RK808_LDO7_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+ BIT(6), 400),
+ RK8XX_DESC(RK808_ID_LDO8, "LDO_REG8", "vcc11", 1800, 3400, 100,
+ RK808_LDO8_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+ BIT(7), 400),
+ RK8XX_DESC_SWITCH(RK808_ID_SWITCH1, "SWITCH_REG1", "vcc8",
+ RK808_DCDC_EN_REG, BIT(5)),
+ RK8XX_DESC_SWITCH(RK808_ID_SWITCH2, "SWITCH_REG2", "vcc12",
+ RK808_DCDC_EN_REG, BIT(6)),
};
static int rk808_regulator_dt_parse_pdata(struct device *dev,
@@ -541,17 +460,12 @@ static int rk808_regulator_dt_parse_pdata(struct device *dev,
struct rk808_regulator_data *pdata)
{
struct device_node *np;
- int tmp, ret, i;
+ int tmp, ret = 0, i;
np = of_get_child_by_name(client_dev->of_node, "regulators");
if (!np)
return -ENXIO;
- ret = of_regulator_match(dev, np, rk808_reg_matches,
- RK808_NUM_REGULATORS);
- if (ret < 0)
- goto dt_parse_end;
-
for (i = 0; i < ARRAY_SIZE(pdata->dvs_gpio); i++) {
pdata->dvs_gpio[i] =
devm_gpiod_get_index_optional(client_dev, "dvs", i,
@@ -598,18 +512,12 @@ static int rk808_regulator_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, pdata);
+ config.dev = &client->dev;
+ config.driver_data = pdata;
+ config.regmap = rk808->regmap;
+
/* Instantiate the regulators */
for (i = 0; i < RK808_NUM_REGULATORS; i++) {
- if (!rk808_reg_matches[i].init_data ||
- !rk808_reg_matches[i].of_node)
- continue;
-
- config.dev = &client->dev;
- config.driver_data = pdata;
- config.regmap = rk808->regmap;
- config.of_node = rk808_reg_matches[i].of_node;
- config.init_data = rk808_reg_matches[i].init_data;
-
rk808_rdev = devm_regulator_register(&pdev->dev,
&rk808_reg[i], &config);
if (IS_ERR(rk808_rdev)) {
--
1.9.1
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [PATCH v4 3/7] mfd: RK808: Add RK818 support
2016-04-26 14:54 ` [rtc-linux] " Wadim Egorov
@ 2016-04-26 14:54 ` Wadim Egorov
-1 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-04-26 14:54 UTC (permalink / raw)
To: linux-kernel, linux-clk, rtc-linux, devicetree, linux-rockchip,
lee.jones
Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak,
mturquette, sboyd, lgirdwood, broonie, a.zummo,
alexandre.belloni, dianders, zyw
The RK818 chip is a power management IC for multimedia and handheld
devices. It contains the following components:
- Regulators
- RTC
- Clkout
- battery support
Both chips RK808 and RK818 are using a similar register map.
So we can reuse the RTC and Clkout functionality.
Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
---
Changes since v3:
- fixed file and module descriptions
---
drivers/mfd/Kconfig | 4 +-
drivers/mfd/rk808.c | 229 +++++++++++++++++++++++++++++++++++++++-------
include/linux/mfd/rk808.h | 162 ++++++++++++++++++++++++++++++--
3 files changed, 349 insertions(+), 46 deletions(-)
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index eea61e3..0a5b1c0 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -814,13 +814,13 @@ config MFD_RC5T583
different functionality of the device.
config MFD_RK808
- tristate "Rockchip RK808 Power Management chip"
+ tristate "Rockchip RK808/RK818 Power Management chip"
depends on I2C && OF
select MFD_CORE
select REGMAP_I2C
select REGMAP_IRQ
help
- If you say yes here you get support for the RK808
+ If you say yes here you get support for the RK808 and RK818
Power Management chips.
This driver provides common support for accessing the device
through I2C interface. The device supports multiple sub-devices
diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c
index 4b1e439..9bb7e8c 100644
--- a/drivers/mfd/rk808.c
+++ b/drivers/mfd/rk808.c
@@ -1,11 +1,15 @@
/*
- * MFD core driver for Rockchip RK808
+ * MFD core driver for Rockchip RK808/RK818
*
* Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
*
* Author: Chris Zhong <zyw@rock-chips.com>
* Author: Zhang Qing <zhangqing@rock-chips.com>
*
+ * Copyright (C) 2016 PHYTEC Messtechnik GmbH
+ *
+ * Author: Wadim Egorov <w.egorov@phytec.de>
+ *
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
@@ -22,12 +26,7 @@
#include <linux/mfd/core.h>
#include <linux/module.h>
#include <linux/regmap.h>
-
-struct rk808_reg_data {
- int addr;
- int mask;
- int value;
-};
+#include <linux/of_device.h>
static bool rk808_is_volatile_reg(struct device *dev, unsigned int reg)
{
@@ -57,6 +56,14 @@ static bool rk808_is_volatile_reg(struct device *dev, unsigned int reg)
return false;
}
+static const struct regmap_config rk818_regmap_config = {
+ .reg_bits = 8,
+ .val_bits = 8,
+ .max_register = RK818_USB_CTRL_REG,
+ .cache_type = REGCACHE_RBTREE,
+ .volatile_reg = rk808_is_volatile_reg,
+};
+
static const struct regmap_config rk808_regmap_config = {
.reg_bits = 8,
.val_bits = 8,
@@ -83,7 +90,17 @@ static const struct mfd_cell rk808s[] = {
},
};
-static const struct rk808_reg_data pre_init_reg[] = {
+static const struct mfd_cell rk818s[] = {
+ { .name = "rk808-clkout", },
+ { .name = "rk808-regulator", },
+ {
+ .name = "rk808-rtc",
+ .num_resources = ARRAY_SIZE(rtc_resources),
+ .resources = &rtc_resources[0],
+ },
+};
+
+static const struct rk8xx_reg_data rk808_pre_init_reg[] = {
{ RK808_BUCK3_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_150MA },
{ RK808_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_200MA },
{ RK808_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, BOOST_ILMIN_100MA },
@@ -94,6 +111,22 @@ static const struct rk808_reg_data pre_init_reg[] = {
VB_LO_SEL_3500MV },
};
+static const struct rk8xx_reg_data rk818_pre_init_reg[] = {
+ { RK818_USB_CTRL_REG, RK818_USB_ILIM_SEL_MASK,
+ RK818_USB_ILMIN_2000MA },
+ /* close charger when usb lower then 3.4V */
+ { RK818_USB_CTRL_REG, RK818_USB_CHG_SD_VSEL_MASK, (0x7 << 4) },
+ /* no action when vref */
+ { RK818_H5V_EN_REG, BIT(1), RK818_REF_RDY_CTRL },
+ /* enable HDMI 5V */
+ { RK818_H5V_EN_REG, BIT(0), RK818_H5V_EN },
+ /* improve efficiency */
+ { RK818_BUCK2_CONFIG_REG, BUCK2_RATE_MASK, BUCK_ILMIN_250MA },
+ { RK818_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_250MA },
+ { RK818_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, BOOST_ILMIN_100MA },
+ { RK808_VB_MON_REG, MASK_ALL, VB_LO_ACT | VB_LO_SEL_3500MV },
+};
+
static const struct regmap_irq rk808_irqs[] = {
/* INT_STS */
[RK808_IRQ_VOUT_LO] = {
@@ -136,6 +169,76 @@ static const struct regmap_irq rk808_irqs[] = {
},
};
+static const struct regmap_irq rk818_irqs[] = {
+ /* INT_STS */
+ [RK818_IRQ_VOUT_LO] = {
+ .mask = RK818_IRQ_VOUT_LO_MSK,
+ .reg_offset = 0,
+ },
+ [RK818_IRQ_VB_LO] = {
+ .mask = RK818_IRQ_VB_LO_MSK,
+ .reg_offset = 0,
+ },
+ [RK818_IRQ_PWRON] = {
+ .mask = RK818_IRQ_PWRON_MSK,
+ .reg_offset = 0,
+ },
+ [RK818_IRQ_PWRON_LP] = {
+ .mask = RK818_IRQ_PWRON_LP_MSK,
+ .reg_offset = 0,
+ },
+ [RK818_IRQ_HOTDIE] = {
+ .mask = RK818_IRQ_HOTDIE_MSK,
+ .reg_offset = 0,
+ },
+ [RK818_IRQ_RTC_ALARM] = {
+ .mask = RK818_IRQ_RTC_ALARM_MSK,
+ .reg_offset = 0,
+ },
+ [RK818_IRQ_RTC_PERIOD] = {
+ .mask = RK818_IRQ_RTC_PERIOD_MSK,
+ .reg_offset = 0,
+ },
+ [RK818_IRQ_USB_OV] = {
+ .mask = RK818_IRQ_USB_OV_MSK,
+ .reg_offset = 0,
+ },
+
+ /* INT_STS2 */
+ [RK818_IRQ_PLUG_IN] = {
+ .mask = RK818_IRQ_PLUG_IN_MSK,
+ .reg_offset = 1,
+ },
+ [RK818_IRQ_PLUG_OUT] = {
+ .mask = RK818_IRQ_PLUG_OUT_MSK,
+ .reg_offset = 1,
+ },
+ [RK818_IRQ_CHG_OK] = {
+ .mask = RK818_IRQ_CHG_OK_MSK,
+ .reg_offset = 1,
+ },
+ [RK818_IRQ_CHG_TE] = {
+ .mask = RK818_IRQ_CHG_TE_MSK,
+ .reg_offset = 1,
+ },
+ [RK818_IRQ_CHG_TS1] = {
+ .mask = RK818_IRQ_CHG_TS1_MSK,
+ .reg_offset = 1,
+ },
+ [RK818_IRQ_TS2] = {
+ .mask = RK818_IRQ_TS2_MSK,
+ .reg_offset = 1,
+ },
+ [RK818_IRQ_CHG_CVTLIM] = {
+ .mask = RK818_IRQ_CHG_CVTLIM_MSK,
+ .reg_offset = 1,
+ },
+ [RK818_IRQ_DISCHG_ILIM] = {
+ .mask = RK818_IRQ_DISCHG_ILIM_MSK,
+ .reg_offset = 1,
+ },
+};
+
static struct regmap_irq_chip rk808_irq_chip = {
.name = "rk808",
.irqs = rk808_irqs,
@@ -148,6 +251,18 @@ static struct regmap_irq_chip rk808_irq_chip = {
.init_ack_masked = true,
};
+static struct regmap_irq_chip rk818_irq_chip = {
+ .name = "rk818",
+ .irqs = rk818_irqs,
+ .num_irqs = ARRAY_SIZE(rk818_irqs),
+ .num_regs = 2,
+ .irq_reg_stride = 2,
+ .status_base = RK818_INT_STS_REG1,
+ .mask_base = RK818_INT_STS_MSK_REG1,
+ .ack_base = RK818_INT_STS_REG1,
+ .init_ack_masked = true,
+};
+
static struct i2c_client *rk808_i2c_client;
static void rk808_device_shutdown(void)
{
@@ -167,6 +282,48 @@ static void rk808_device_shutdown(void)
dev_err(&rk808_i2c_client->dev, "power off error!\n");
}
+static const struct of_device_id rk808_of_match[] = {
+ { .compatible = "rockchip,rk808", .data = (void *) RK808_ID },
+ { .compatible = "rockchip,rk818", .data = (void *) RK818_ID },
+ { },
+};
+MODULE_DEVICE_TABLE(of, rk808_of_match);
+
+static int rk8xx_match_device(struct rk808 *rk808, struct device *dev)
+{
+ const struct of_device_id *of_id;
+
+ of_id = of_match_device(rk808_of_match, dev);
+ if (!of_id) {
+ dev_err(dev, "Unable to match OF ID\n");
+ return -ENODEV;
+ }
+ rk808->variant = (long) of_id->data;
+
+ switch (rk808->variant) {
+ case RK808_ID:
+ rk808->nr_cells = ARRAY_SIZE(rk808s);
+ rk808->cells = rk808s;
+ rk808->regmap_cfg = &rk808_regmap_config;
+ rk808->regmap_irq_chip = &rk808_irq_chip;
+ rk808->pre_init_reg = rk808_pre_init_reg;
+ rk808->nr_pre_init_regs = ARRAY_SIZE(rk808_pre_init_reg);
+ break;
+ case RK818_ID:
+ rk808->nr_cells = ARRAY_SIZE(rk818s);
+ rk808->cells = rk818s;
+ rk808->regmap_cfg = &rk818_regmap_config;
+ rk808->regmap_irq_chip = &rk818_irq_chip;
+ rk808->pre_init_reg = rk818_pre_init_reg;
+ rk808->nr_pre_init_regs = ARRAY_SIZE(rk818_pre_init_reg);
+ break;
+ default:
+ dev_err(dev, "unsupported RK8XX ID %lu\n", rk808->variant);
+ return -EINVAL;
+ }
+
+ return 0;
+}
static int rk808_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
@@ -176,45 +333,51 @@ static int rk808_probe(struct i2c_client *client,
int ret;
int i;
- if (!client->irq) {
- dev_err(&client->dev, "No interrupt support, no core IRQ\n");
- return -EINVAL;
- }
-
rk808 = devm_kzalloc(&client->dev, sizeof(*rk808), GFP_KERNEL);
if (!rk808)
return -ENOMEM;
- rk808->regmap = devm_regmap_init_i2c(client, &rk808_regmap_config);
+ ret = rk8xx_match_device(rk808, &client->dev);
+ if (ret)
+ return ret;
+
+ rk808->i2c = client;
+ i2c_set_clientdata(client, rk808);
+
+ rk808->regmap = devm_regmap_init_i2c(client, rk808->regmap_cfg);
if (IS_ERR(rk808->regmap)) {
dev_err(&client->dev, "regmap initialization failed\n");
return PTR_ERR(rk808->regmap);
}
- for (i = 0; i < ARRAY_SIZE(pre_init_reg); i++) {
- ret = regmap_update_bits(rk808->regmap, pre_init_reg[i].addr,
- pre_init_reg[i].mask,
- pre_init_reg[i].value);
- if (ret) {
- dev_err(&client->dev,
- "0x%x write err\n", pre_init_reg[i].addr);
- return ret;
- }
+ if (!client->irq) {
+ dev_err(&client->dev, "No interrupt support, no core IRQ\n");
+ return -EINVAL;
}
ret = regmap_add_irq_chip(rk808->regmap, client->irq,
IRQF_ONESHOT, -1,
- &rk808_irq_chip, &rk808->irq_data);
+ rk808->regmap_irq_chip, &rk808->irq_data);
if (ret) {
dev_err(&client->dev, "Failed to add irq_chip %d\n", ret);
return ret;
}
- rk808->i2c = client;
- i2c_set_clientdata(client, rk808);
+ for (i = 0; i < rk808->nr_pre_init_regs; i++) {
+ ret = regmap_update_bits(rk808->regmap,
+ rk808->pre_init_reg[i].addr,
+ rk808->pre_init_reg[i].mask,
+ rk808->pre_init_reg[i].value);
+ if (ret) {
+ dev_err(&client->dev,
+ "0x%x write err\n",
+ rk808->pre_init_reg[i].addr);
+ return ret;
+ }
+ }
- ret = mfd_add_devices(&client->dev, -1,
- rk808s, ARRAY_SIZE(rk808s),
+ ret = mfd_add_devices(&client->dev, PLATFORM_DEVID_NONE,
+ rk808->cells, rk808->nr_cells,
NULL, 0, regmap_irq_get_domain(rk808->irq_data));
if (ret) {
dev_err(&client->dev, "failed to add MFD devices %d\n", ret);
@@ -246,14 +409,9 @@ static int rk808_remove(struct i2c_client *client)
return 0;
}
-static const struct of_device_id rk808_of_match[] = {
- { .compatible = "rockchip,rk808" },
- { },
-};
-MODULE_DEVICE_TABLE(of, rk808_of_match);
-
static const struct i2c_device_id rk808_ids[] = {
{ "rk808" },
+ { "rk818" },
{ },
};
MODULE_DEVICE_TABLE(i2c, rk808_ids);
@@ -273,4 +431,5 @@ module_i2c_driver(rk808_i2c_driver);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Chris Zhong <zyw@rock-chips.com>");
MODULE_AUTHOR("Zhang Qing <zhangqing@rock-chips.com>");
-MODULE_DESCRIPTION("RK808 PMIC driver");
+MODULE_AUTHOR("Wadim Egorov <w.egorov@phytec.de>");
+MODULE_DESCRIPTION("RK808/RK818 PMIC driver");
diff --git a/include/linux/mfd/rk808.h b/include/linux/mfd/rk808.h
index 441b6ee..5ce810c 100644
--- a/include/linux/mfd/rk808.h
+++ b/include/linux/mfd/rk808.h
@@ -1,11 +1,15 @@
/*
- * rk808.h for Rockchip RK808
+ * Register definitions for Rockchip's RK808/RK818 PMIC
*
* Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
*
* Author: Chris Zhong <zyw@rock-chips.com>
* Author: Zhang Qing <zhangqing@rock-chips.com>
*
+ * Copyright (C) 2016 PHYTEC Messtechnik GmbH
+ *
+ * Author: Wadim Egorov <w.egorov@phytec.de>
+ *
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
@@ -16,8 +20,8 @@
* more details.
*/
-#ifndef __LINUX_REGULATOR_rk808_H
-#define __LINUX_REGULATOR_rk808_H
+#ifndef __LINUX_REGULATOR_RK808_H
+#define __LINUX_REGULATOR_RK808_H
#include <linux/regulator/machine.h>
#include <linux/regmap.h>
@@ -28,7 +32,7 @@
#define RK808_DCDC1 0 /* (0+RK808_START) */
#define RK808_LDO1 4 /* (4+RK808_START) */
-#define RK808_NUM_REGULATORS 14
+#define RK808_NUM_REGULATORS 14
enum rk808_reg {
RK808_ID_DCDC1,
@@ -115,7 +119,92 @@ enum rk808_reg {
#define RK808_INT_STS_MSK_REG2 0x4f
#define RK808_IO_POL_REG 0x50
-/* IRQ Definitions */
+/* RK818 */
+#define RK818_DCDC1 0
+#define RK818_LDO1 4
+#define RK818_NUM_REGULATORS 17
+
+enum rk818_reg {
+ RK818_ID_DCDC1,
+ RK818_ID_DCDC2,
+ RK818_ID_DCDC3,
+ RK818_ID_DCDC4,
+ RK818_ID_BOOST,
+ RK818_ID_LDO1,
+ RK818_ID_LDO2,
+ RK818_ID_LDO3,
+ RK818_ID_LDO4,
+ RK818_ID_LDO5,
+ RK818_ID_LDO6,
+ RK818_ID_LDO7,
+ RK818_ID_LDO8,
+ RK818_ID_LDO9,
+ RK818_ID_SWITCH,
+ RK818_ID_HDMI_SWITCH,
+ RK818_ID_OTG_SWITCH,
+};
+
+#define RK818_DCDC_EN_REG 0x23
+#define RK818_LDO_EN_REG 0x24
+#define RK818_SLEEP_SET_OFF_REG1 0x25
+#define RK818_SLEEP_SET_OFF_REG2 0x26
+#define RK818_DCDC_UV_STS_REG 0x27
+#define RK818_DCDC_UV_ACT_REG 0x28
+#define RK818_LDO_UV_STS_REG 0x29
+#define RK818_LDO_UV_ACT_REG 0x2a
+#define RK818_DCDC_PG_REG 0x2b
+#define RK818_LDO_PG_REG 0x2c
+#define RK818_VOUT_MON_TDB_REG 0x2d
+#define RK818_BUCK1_CONFIG_REG 0x2e
+#define RK818_BUCK1_ON_VSEL_REG 0x2f
+#define RK818_BUCK1_SLP_VSEL_REG 0x30
+#define RK818_BUCK2_CONFIG_REG 0x32
+#define RK818_BUCK2_ON_VSEL_REG 0x33
+#define RK818_BUCK2_SLP_VSEL_REG 0x34
+#define RK818_BUCK3_CONFIG_REG 0x36
+#define RK818_BUCK4_CONFIG_REG 0x37
+#define RK818_BUCK4_ON_VSEL_REG 0x38
+#define RK818_BUCK4_SLP_VSEL_REG 0x39
+#define RK818_BOOST_CONFIG_REG 0x3a
+#define RK818_LDO1_ON_VSEL_REG 0x3b
+#define RK818_LDO1_SLP_VSEL_REG 0x3c
+#define RK818_LDO2_ON_VSEL_REG 0x3d
+#define RK818_LDO2_SLP_VSEL_REG 0x3e
+#define RK818_LDO3_ON_VSEL_REG 0x3f
+#define RK818_LDO3_SLP_VSEL_REG 0x40
+#define RK818_LDO4_ON_VSEL_REG 0x41
+#define RK818_LDO4_SLP_VSEL_REG 0x42
+#define RK818_LDO5_ON_VSEL_REG 0x43
+#define RK818_LDO5_SLP_VSEL_REG 0x44
+#define RK818_LDO6_ON_VSEL_REG 0x45
+#define RK818_LDO6_SLP_VSEL_REG 0x46
+#define RK818_LDO7_ON_VSEL_REG 0x47
+#define RK818_LDO7_SLP_VSEL_REG 0x48
+#define RK818_LDO8_ON_VSEL_REG 0x49
+#define RK818_LDO8_SLP_VSEL_REG 0x4a
+#define RK818_BOOST_LDO9_ON_VSEL_REG 0x54
+#define RK818_BOOST_LDO9_SLP_VSEL_REG 0x55
+#define RK818_DEVCTRL_REG 0x4b
+#define RK818_INT_STS_REG1 0X4c
+#define RK818_INT_STS_MSK_REG1 0x4d
+#define RK818_INT_STS_REG2 0x4e
+#define RK818_INT_STS_MSK_REG2 0x4f
+#define RK818_IO_POL_REG 0x50
+#define RK818_H5V_EN_REG 0x52
+#define RK818_SLEEP_SET_OFF_REG3 0x53
+#define RK818_BOOST_LDO9_ON_VSEL_REG 0x54
+#define RK818_BOOST_LDO9_SLP_VSEL_REG 0x55
+#define RK818_BOOST_CTRL_REG 0x56
+#define RK818_DCDC_ILMAX 0x90
+#define RK818_USB_CTRL_REG 0xa1
+
+#define RK818_H5V_EN BIT(0)
+#define RK818_REF_RDY_CTRL BIT(1)
+#define RK818_USB_ILIM_SEL_MASK 0xf
+#define RK818_USB_ILMIN_2000MA 0x7
+#define RK818_USB_CHG_SD_VSEL_MASK 0x70
+
+/* RK808 IRQ Definitions */
#define RK808_IRQ_VOUT_LO 0
#define RK808_IRQ_VB_LO 1
#define RK808_IRQ_PWRON 2
@@ -137,6 +226,43 @@ enum rk808_reg {
#define RK808_IRQ_PLUG_IN_INT_MSK BIT(0)
#define RK808_IRQ_PLUG_OUT_INT_MSK BIT(1)
+/* RK818 IRQ Definitions */
+#define RK818_IRQ_VOUT_LO 0
+#define RK818_IRQ_VB_LO 1
+#define RK818_IRQ_PWRON 2
+#define RK818_IRQ_PWRON_LP 3
+#define RK818_IRQ_HOTDIE 4
+#define RK818_IRQ_RTC_ALARM 5
+#define RK818_IRQ_RTC_PERIOD 6
+#define RK818_IRQ_USB_OV 7
+#define RK818_IRQ_PLUG_IN 8
+#define RK818_IRQ_PLUG_OUT 9
+#define RK818_IRQ_CHG_OK 10
+#define RK818_IRQ_CHG_TE 11
+#define RK818_IRQ_CHG_TS1 12
+#define RK818_IRQ_TS2 13
+#define RK818_IRQ_CHG_CVTLIM 14
+#define RK818_IRQ_DISCHG_ILIM 7
+
+#define RK818_IRQ_VOUT_LO_MSK BIT(0)
+#define RK818_IRQ_VB_LO_MSK BIT(1)
+#define RK818_IRQ_PWRON_MSK BIT(2)
+#define RK818_IRQ_PWRON_LP_MSK BIT(3)
+#define RK818_IRQ_HOTDIE_MSK BIT(4)
+#define RK818_IRQ_RTC_ALARM_MSK BIT(5)
+#define RK818_IRQ_RTC_PERIOD_MSK BIT(6)
+#define RK818_IRQ_USB_OV_MSK BIT(7)
+#define RK818_IRQ_PLUG_IN_MSK BIT(0)
+#define RK818_IRQ_PLUG_OUT_MSK BIT(1)
+#define RK818_IRQ_CHG_OK_MSK BIT(2)
+#define RK818_IRQ_CHG_TE_MSK BIT(3)
+#define RK818_IRQ_CHG_TS1_MSK BIT(4)
+#define RK818_IRQ_TS2_MSK BIT(5)
+#define RK818_IRQ_CHG_CVTLIM_MSK BIT(6)
+#define RK818_IRQ_DISCHG_ILIM_MSK BIT(7)
+
+#define RK818_NUM_IRQ 16
+
#define RK808_VBAT_LOW_2V8 0x00
#define RK808_VBAT_LOW_2V9 0x01
#define RK808_VBAT_LOW_3V0 0x02
@@ -191,9 +317,27 @@ enum {
BOOST_ILMIN_250MA,
};
+enum {
+ RK808_ID,
+ RK818_ID,
+};
+
+struct rk8xx_reg_data {
+ int addr;
+ int mask;
+ int value;
+};
+
struct rk808 {
- struct i2c_client *i2c;
- struct regmap_irq_chip_data *irq_data;
- struct regmap *regmap;
+ struct i2c_client *i2c;
+ struct regmap_irq_chip_data *irq_data;
+ struct regmap *regmap;
+ long variant;
+ int nr_cells;
+ const struct mfd_cell *cells;
+ const struct regmap_config *regmap_cfg;
+ const struct regmap_irq_chip *regmap_irq_chip;
+ const struct rk8xx_reg_data *pre_init_reg;
+ int nr_pre_init_regs;
};
-#endif /* __LINUX_REGULATOR_rk808_H */
+#endif /* __LINUX_REGULATOR_RK808_H */
--
1.9.1
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [rtc-linux] [PATCH v4 3/7] mfd: RK808: Add RK818 support
@ 2016-04-26 14:54 ` Wadim Egorov
0 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-04-26 14:54 UTC (permalink / raw)
To: linux-kernel, linux-clk, rtc-linux, devicetree, linux-rockchip,
lee.jones
Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak,
mturquette, sboyd, lgirdwood, broonie, a.zummo,
alexandre.belloni, dianders, zyw
The RK818 chip is a power management IC for multimedia and handheld
devices. It contains the following components:
- Regulators
- RTC
- Clkout
- battery support
Both chips RK808 and RK818 are using a similar register map.
So we can reuse the RTC and Clkout functionality.
Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
---
Changes since v3:
- fixed file and module descriptions
---
drivers/mfd/Kconfig | 4 +-
drivers/mfd/rk808.c | 229 +++++++++++++++++++++++++++++++++++++++-------
include/linux/mfd/rk808.h | 162 ++++++++++++++++++++++++++++++--
3 files changed, 349 insertions(+), 46 deletions(-)
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index eea61e3..0a5b1c0 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -814,13 +814,13 @@ config MFD_RC5T583
different functionality of the device.
config MFD_RK808
- tristate "Rockchip RK808 Power Management chip"
+ tristate "Rockchip RK808/RK818 Power Management chip"
depends on I2C && OF
select MFD_CORE
select REGMAP_I2C
select REGMAP_IRQ
help
- If you say yes here you get support for the RK808
+ If you say yes here you get support for the RK808 and RK818
Power Management chips.
This driver provides common support for accessing the device
through I2C interface. The device supports multiple sub-devices
diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c
index 4b1e439..9bb7e8c 100644
--- a/drivers/mfd/rk808.c
+++ b/drivers/mfd/rk808.c
@@ -1,11 +1,15 @@
/*
- * MFD core driver for Rockchip RK808
+ * MFD core driver for Rockchip RK808/RK818
*
* Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
*
* Author: Chris Zhong <zyw@rock-chips.com>
* Author: Zhang Qing <zhangqing@rock-chips.com>
*
+ * Copyright (C) 2016 PHYTEC Messtechnik GmbH
+ *
+ * Author: Wadim Egorov <w.egorov@phytec.de>
+ *
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
@@ -22,12 +26,7 @@
#include <linux/mfd/core.h>
#include <linux/module.h>
#include <linux/regmap.h>
-
-struct rk808_reg_data {
- int addr;
- int mask;
- int value;
-};
+#include <linux/of_device.h>
static bool rk808_is_volatile_reg(struct device *dev, unsigned int reg)
{
@@ -57,6 +56,14 @@ static bool rk808_is_volatile_reg(struct device *dev, unsigned int reg)
return false;
}
+static const struct regmap_config rk818_regmap_config = {
+ .reg_bits = 8,
+ .val_bits = 8,
+ .max_register = RK818_USB_CTRL_REG,
+ .cache_type = REGCACHE_RBTREE,
+ .volatile_reg = rk808_is_volatile_reg,
+};
+
static const struct regmap_config rk808_regmap_config = {
.reg_bits = 8,
.val_bits = 8,
@@ -83,7 +90,17 @@ static const struct mfd_cell rk808s[] = {
},
};
-static const struct rk808_reg_data pre_init_reg[] = {
+static const struct mfd_cell rk818s[] = {
+ { .name = "rk808-clkout", },
+ { .name = "rk808-regulator", },
+ {
+ .name = "rk808-rtc",
+ .num_resources = ARRAY_SIZE(rtc_resources),
+ .resources = &rtc_resources[0],
+ },
+};
+
+static const struct rk8xx_reg_data rk808_pre_init_reg[] = {
{ RK808_BUCK3_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_150MA },
{ RK808_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_200MA },
{ RK808_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, BOOST_ILMIN_100MA },
@@ -94,6 +111,22 @@ static const struct rk808_reg_data pre_init_reg[] = {
VB_LO_SEL_3500MV },
};
+static const struct rk8xx_reg_data rk818_pre_init_reg[] = {
+ { RK818_USB_CTRL_REG, RK818_USB_ILIM_SEL_MASK,
+ RK818_USB_ILMIN_2000MA },
+ /* close charger when usb lower then 3.4V */
+ { RK818_USB_CTRL_REG, RK818_USB_CHG_SD_VSEL_MASK, (0x7 << 4) },
+ /* no action when vref */
+ { RK818_H5V_EN_REG, BIT(1), RK818_REF_RDY_CTRL },
+ /* enable HDMI 5V */
+ { RK818_H5V_EN_REG, BIT(0), RK818_H5V_EN },
+ /* improve efficiency */
+ { RK818_BUCK2_CONFIG_REG, BUCK2_RATE_MASK, BUCK_ILMIN_250MA },
+ { RK818_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_250MA },
+ { RK818_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, BOOST_ILMIN_100MA },
+ { RK808_VB_MON_REG, MASK_ALL, VB_LO_ACT | VB_LO_SEL_3500MV },
+};
+
static const struct regmap_irq rk808_irqs[] = {
/* INT_STS */
[RK808_IRQ_VOUT_LO] = {
@@ -136,6 +169,76 @@ static const struct regmap_irq rk808_irqs[] = {
},
};
+static const struct regmap_irq rk818_irqs[] = {
+ /* INT_STS */
+ [RK818_IRQ_VOUT_LO] = {
+ .mask = RK818_IRQ_VOUT_LO_MSK,
+ .reg_offset = 0,
+ },
+ [RK818_IRQ_VB_LO] = {
+ .mask = RK818_IRQ_VB_LO_MSK,
+ .reg_offset = 0,
+ },
+ [RK818_IRQ_PWRON] = {
+ .mask = RK818_IRQ_PWRON_MSK,
+ .reg_offset = 0,
+ },
+ [RK818_IRQ_PWRON_LP] = {
+ .mask = RK818_IRQ_PWRON_LP_MSK,
+ .reg_offset = 0,
+ },
+ [RK818_IRQ_HOTDIE] = {
+ .mask = RK818_IRQ_HOTDIE_MSK,
+ .reg_offset = 0,
+ },
+ [RK818_IRQ_RTC_ALARM] = {
+ .mask = RK818_IRQ_RTC_ALARM_MSK,
+ .reg_offset = 0,
+ },
+ [RK818_IRQ_RTC_PERIOD] = {
+ .mask = RK818_IRQ_RTC_PERIOD_MSK,
+ .reg_offset = 0,
+ },
+ [RK818_IRQ_USB_OV] = {
+ .mask = RK818_IRQ_USB_OV_MSK,
+ .reg_offset = 0,
+ },
+
+ /* INT_STS2 */
+ [RK818_IRQ_PLUG_IN] = {
+ .mask = RK818_IRQ_PLUG_IN_MSK,
+ .reg_offset = 1,
+ },
+ [RK818_IRQ_PLUG_OUT] = {
+ .mask = RK818_IRQ_PLUG_OUT_MSK,
+ .reg_offset = 1,
+ },
+ [RK818_IRQ_CHG_OK] = {
+ .mask = RK818_IRQ_CHG_OK_MSK,
+ .reg_offset = 1,
+ },
+ [RK818_IRQ_CHG_TE] = {
+ .mask = RK818_IRQ_CHG_TE_MSK,
+ .reg_offset = 1,
+ },
+ [RK818_IRQ_CHG_TS1] = {
+ .mask = RK818_IRQ_CHG_TS1_MSK,
+ .reg_offset = 1,
+ },
+ [RK818_IRQ_TS2] = {
+ .mask = RK818_IRQ_TS2_MSK,
+ .reg_offset = 1,
+ },
+ [RK818_IRQ_CHG_CVTLIM] = {
+ .mask = RK818_IRQ_CHG_CVTLIM_MSK,
+ .reg_offset = 1,
+ },
+ [RK818_IRQ_DISCHG_ILIM] = {
+ .mask = RK818_IRQ_DISCHG_ILIM_MSK,
+ .reg_offset = 1,
+ },
+};
+
static struct regmap_irq_chip rk808_irq_chip = {
.name = "rk808",
.irqs = rk808_irqs,
@@ -148,6 +251,18 @@ static struct regmap_irq_chip rk808_irq_chip = {
.init_ack_masked = true,
};
+static struct regmap_irq_chip rk818_irq_chip = {
+ .name = "rk818",
+ .irqs = rk818_irqs,
+ .num_irqs = ARRAY_SIZE(rk818_irqs),
+ .num_regs = 2,
+ .irq_reg_stride = 2,
+ .status_base = RK818_INT_STS_REG1,
+ .mask_base = RK818_INT_STS_MSK_REG1,
+ .ack_base = RK818_INT_STS_REG1,
+ .init_ack_masked = true,
+};
+
static struct i2c_client *rk808_i2c_client;
static void rk808_device_shutdown(void)
{
@@ -167,6 +282,48 @@ static void rk808_device_shutdown(void)
dev_err(&rk808_i2c_client->dev, "power off error!\n");
}
+static const struct of_device_id rk808_of_match[] = {
+ { .compatible = "rockchip,rk808", .data = (void *) RK808_ID },
+ { .compatible = "rockchip,rk818", .data = (void *) RK818_ID },
+ { },
+};
+MODULE_DEVICE_TABLE(of, rk808_of_match);
+
+static int rk8xx_match_device(struct rk808 *rk808, struct device *dev)
+{
+ const struct of_device_id *of_id;
+
+ of_id = of_match_device(rk808_of_match, dev);
+ if (!of_id) {
+ dev_err(dev, "Unable to match OF ID\n");
+ return -ENODEV;
+ }
+ rk808->variant = (long) of_id->data;
+
+ switch (rk808->variant) {
+ case RK808_ID:
+ rk808->nr_cells = ARRAY_SIZE(rk808s);
+ rk808->cells = rk808s;
+ rk808->regmap_cfg = &rk808_regmap_config;
+ rk808->regmap_irq_chip = &rk808_irq_chip;
+ rk808->pre_init_reg = rk808_pre_init_reg;
+ rk808->nr_pre_init_regs = ARRAY_SIZE(rk808_pre_init_reg);
+ break;
+ case RK818_ID:
+ rk808->nr_cells = ARRAY_SIZE(rk818s);
+ rk808->cells = rk818s;
+ rk808->regmap_cfg = &rk818_regmap_config;
+ rk808->regmap_irq_chip = &rk818_irq_chip;
+ rk808->pre_init_reg = rk818_pre_init_reg;
+ rk808->nr_pre_init_regs = ARRAY_SIZE(rk818_pre_init_reg);
+ break;
+ default:
+ dev_err(dev, "unsupported RK8XX ID %lu\n", rk808->variant);
+ return -EINVAL;
+ }
+
+ return 0;
+}
static int rk808_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
@@ -176,45 +333,51 @@ static int rk808_probe(struct i2c_client *client,
int ret;
int i;
- if (!client->irq) {
- dev_err(&client->dev, "No interrupt support, no core IRQ\n");
- return -EINVAL;
- }
-
rk808 = devm_kzalloc(&client->dev, sizeof(*rk808), GFP_KERNEL);
if (!rk808)
return -ENOMEM;
- rk808->regmap = devm_regmap_init_i2c(client, &rk808_regmap_config);
+ ret = rk8xx_match_device(rk808, &client->dev);
+ if (ret)
+ return ret;
+
+ rk808->i2c = client;
+ i2c_set_clientdata(client, rk808);
+
+ rk808->regmap = devm_regmap_init_i2c(client, rk808->regmap_cfg);
if (IS_ERR(rk808->regmap)) {
dev_err(&client->dev, "regmap initialization failed\n");
return PTR_ERR(rk808->regmap);
}
- for (i = 0; i < ARRAY_SIZE(pre_init_reg); i++) {
- ret = regmap_update_bits(rk808->regmap, pre_init_reg[i].addr,
- pre_init_reg[i].mask,
- pre_init_reg[i].value);
- if (ret) {
- dev_err(&client->dev,
- "0x%x write err\n", pre_init_reg[i].addr);
- return ret;
- }
+ if (!client->irq) {
+ dev_err(&client->dev, "No interrupt support, no core IRQ\n");
+ return -EINVAL;
}
ret = regmap_add_irq_chip(rk808->regmap, client->irq,
IRQF_ONESHOT, -1,
- &rk808_irq_chip, &rk808->irq_data);
+ rk808->regmap_irq_chip, &rk808->irq_data);
if (ret) {
dev_err(&client->dev, "Failed to add irq_chip %d\n", ret);
return ret;
}
- rk808->i2c = client;
- i2c_set_clientdata(client, rk808);
+ for (i = 0; i < rk808->nr_pre_init_regs; i++) {
+ ret = regmap_update_bits(rk808->regmap,
+ rk808->pre_init_reg[i].addr,
+ rk808->pre_init_reg[i].mask,
+ rk808->pre_init_reg[i].value);
+ if (ret) {
+ dev_err(&client->dev,
+ "0x%x write err\n",
+ rk808->pre_init_reg[i].addr);
+ return ret;
+ }
+ }
- ret = mfd_add_devices(&client->dev, -1,
- rk808s, ARRAY_SIZE(rk808s),
+ ret = mfd_add_devices(&client->dev, PLATFORM_DEVID_NONE,
+ rk808->cells, rk808->nr_cells,
NULL, 0, regmap_irq_get_domain(rk808->irq_data));
if (ret) {
dev_err(&client->dev, "failed to add MFD devices %d\n", ret);
@@ -246,14 +409,9 @@ static int rk808_remove(struct i2c_client *client)
return 0;
}
-static const struct of_device_id rk808_of_match[] = {
- { .compatible = "rockchip,rk808" },
- { },
-};
-MODULE_DEVICE_TABLE(of, rk808_of_match);
-
static const struct i2c_device_id rk808_ids[] = {
{ "rk808" },
+ { "rk818" },
{ },
};
MODULE_DEVICE_TABLE(i2c, rk808_ids);
@@ -273,4 +431,5 @@ module_i2c_driver(rk808_i2c_driver);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Chris Zhong <zyw@rock-chips.com>");
MODULE_AUTHOR("Zhang Qing <zhangqing@rock-chips.com>");
-MODULE_DESCRIPTION("RK808 PMIC driver");
+MODULE_AUTHOR("Wadim Egorov <w.egorov@phytec.de>");
+MODULE_DESCRIPTION("RK808/RK818 PMIC driver");
diff --git a/include/linux/mfd/rk808.h b/include/linux/mfd/rk808.h
index 441b6ee..5ce810c 100644
--- a/include/linux/mfd/rk808.h
+++ b/include/linux/mfd/rk808.h
@@ -1,11 +1,15 @@
/*
- * rk808.h for Rockchip RK808
+ * Register definitions for Rockchip's RK808/RK818 PMIC
*
* Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
*
* Author: Chris Zhong <zyw@rock-chips.com>
* Author: Zhang Qing <zhangqing@rock-chips.com>
*
+ * Copyright (C) 2016 PHYTEC Messtechnik GmbH
+ *
+ * Author: Wadim Egorov <w.egorov@phytec.de>
+ *
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
@@ -16,8 +20,8 @@
* more details.
*/
-#ifndef __LINUX_REGULATOR_rk808_H
-#define __LINUX_REGULATOR_rk808_H
+#ifndef __LINUX_REGULATOR_RK808_H
+#define __LINUX_REGULATOR_RK808_H
#include <linux/regulator/machine.h>
#include <linux/regmap.h>
@@ -28,7 +32,7 @@
#define RK808_DCDC1 0 /* (0+RK808_START) */
#define RK808_LDO1 4 /* (4+RK808_START) */
-#define RK808_NUM_REGULATORS 14
+#define RK808_NUM_REGULATORS 14
enum rk808_reg {
RK808_ID_DCDC1,
@@ -115,7 +119,92 @@ enum rk808_reg {
#define RK808_INT_STS_MSK_REG2 0x4f
#define RK808_IO_POL_REG 0x50
-/* IRQ Definitions */
+/* RK818 */
+#define RK818_DCDC1 0
+#define RK818_LDO1 4
+#define RK818_NUM_REGULATORS 17
+
+enum rk818_reg {
+ RK818_ID_DCDC1,
+ RK818_ID_DCDC2,
+ RK818_ID_DCDC3,
+ RK818_ID_DCDC4,
+ RK818_ID_BOOST,
+ RK818_ID_LDO1,
+ RK818_ID_LDO2,
+ RK818_ID_LDO3,
+ RK818_ID_LDO4,
+ RK818_ID_LDO5,
+ RK818_ID_LDO6,
+ RK818_ID_LDO7,
+ RK818_ID_LDO8,
+ RK818_ID_LDO9,
+ RK818_ID_SWITCH,
+ RK818_ID_HDMI_SWITCH,
+ RK818_ID_OTG_SWITCH,
+};
+
+#define RK818_DCDC_EN_REG 0x23
+#define RK818_LDO_EN_REG 0x24
+#define RK818_SLEEP_SET_OFF_REG1 0x25
+#define RK818_SLEEP_SET_OFF_REG2 0x26
+#define RK818_DCDC_UV_STS_REG 0x27
+#define RK818_DCDC_UV_ACT_REG 0x28
+#define RK818_LDO_UV_STS_REG 0x29
+#define RK818_LDO_UV_ACT_REG 0x2a
+#define RK818_DCDC_PG_REG 0x2b
+#define RK818_LDO_PG_REG 0x2c
+#define RK818_VOUT_MON_TDB_REG 0x2d
+#define RK818_BUCK1_CONFIG_REG 0x2e
+#define RK818_BUCK1_ON_VSEL_REG 0x2f
+#define RK818_BUCK1_SLP_VSEL_REG 0x30
+#define RK818_BUCK2_CONFIG_REG 0x32
+#define RK818_BUCK2_ON_VSEL_REG 0x33
+#define RK818_BUCK2_SLP_VSEL_REG 0x34
+#define RK818_BUCK3_CONFIG_REG 0x36
+#define RK818_BUCK4_CONFIG_REG 0x37
+#define RK818_BUCK4_ON_VSEL_REG 0x38
+#define RK818_BUCK4_SLP_VSEL_REG 0x39
+#define RK818_BOOST_CONFIG_REG 0x3a
+#define RK818_LDO1_ON_VSEL_REG 0x3b
+#define RK818_LDO1_SLP_VSEL_REG 0x3c
+#define RK818_LDO2_ON_VSEL_REG 0x3d
+#define RK818_LDO2_SLP_VSEL_REG 0x3e
+#define RK818_LDO3_ON_VSEL_REG 0x3f
+#define RK818_LDO3_SLP_VSEL_REG 0x40
+#define RK818_LDO4_ON_VSEL_REG 0x41
+#define RK818_LDO4_SLP_VSEL_REG 0x42
+#define RK818_LDO5_ON_VSEL_REG 0x43
+#define RK818_LDO5_SLP_VSEL_REG 0x44
+#define RK818_LDO6_ON_VSEL_REG 0x45
+#define RK818_LDO6_SLP_VSEL_REG 0x46
+#define RK818_LDO7_ON_VSEL_REG 0x47
+#define RK818_LDO7_SLP_VSEL_REG 0x48
+#define RK818_LDO8_ON_VSEL_REG 0x49
+#define RK818_LDO8_SLP_VSEL_REG 0x4a
+#define RK818_BOOST_LDO9_ON_VSEL_REG 0x54
+#define RK818_BOOST_LDO9_SLP_VSEL_REG 0x55
+#define RK818_DEVCTRL_REG 0x4b
+#define RK818_INT_STS_REG1 0X4c
+#define RK818_INT_STS_MSK_REG1 0x4d
+#define RK818_INT_STS_REG2 0x4e
+#define RK818_INT_STS_MSK_REG2 0x4f
+#define RK818_IO_POL_REG 0x50
+#define RK818_H5V_EN_REG 0x52
+#define RK818_SLEEP_SET_OFF_REG3 0x53
+#define RK818_BOOST_LDO9_ON_VSEL_REG 0x54
+#define RK818_BOOST_LDO9_SLP_VSEL_REG 0x55
+#define RK818_BOOST_CTRL_REG 0x56
+#define RK818_DCDC_ILMAX 0x90
+#define RK818_USB_CTRL_REG 0xa1
+
+#define RK818_H5V_EN BIT(0)
+#define RK818_REF_RDY_CTRL BIT(1)
+#define RK818_USB_ILIM_SEL_MASK 0xf
+#define RK818_USB_ILMIN_2000MA 0x7
+#define RK818_USB_CHG_SD_VSEL_MASK 0x70
+
+/* RK808 IRQ Definitions */
#define RK808_IRQ_VOUT_LO 0
#define RK808_IRQ_VB_LO 1
#define RK808_IRQ_PWRON 2
@@ -137,6 +226,43 @@ enum rk808_reg {
#define RK808_IRQ_PLUG_IN_INT_MSK BIT(0)
#define RK808_IRQ_PLUG_OUT_INT_MSK BIT(1)
+/* RK818 IRQ Definitions */
+#define RK818_IRQ_VOUT_LO 0
+#define RK818_IRQ_VB_LO 1
+#define RK818_IRQ_PWRON 2
+#define RK818_IRQ_PWRON_LP 3
+#define RK818_IRQ_HOTDIE 4
+#define RK818_IRQ_RTC_ALARM 5
+#define RK818_IRQ_RTC_PERIOD 6
+#define RK818_IRQ_USB_OV 7
+#define RK818_IRQ_PLUG_IN 8
+#define RK818_IRQ_PLUG_OUT 9
+#define RK818_IRQ_CHG_OK 10
+#define RK818_IRQ_CHG_TE 11
+#define RK818_IRQ_CHG_TS1 12
+#define RK818_IRQ_TS2 13
+#define RK818_IRQ_CHG_CVTLIM 14
+#define RK818_IRQ_DISCHG_ILIM 7
+
+#define RK818_IRQ_VOUT_LO_MSK BIT(0)
+#define RK818_IRQ_VB_LO_MSK BIT(1)
+#define RK818_IRQ_PWRON_MSK BIT(2)
+#define RK818_IRQ_PWRON_LP_MSK BIT(3)
+#define RK818_IRQ_HOTDIE_MSK BIT(4)
+#define RK818_IRQ_RTC_ALARM_MSK BIT(5)
+#define RK818_IRQ_RTC_PERIOD_MSK BIT(6)
+#define RK818_IRQ_USB_OV_MSK BIT(7)
+#define RK818_IRQ_PLUG_IN_MSK BIT(0)
+#define RK818_IRQ_PLUG_OUT_MSK BIT(1)
+#define RK818_IRQ_CHG_OK_MSK BIT(2)
+#define RK818_IRQ_CHG_TE_MSK BIT(3)
+#define RK818_IRQ_CHG_TS1_MSK BIT(4)
+#define RK818_IRQ_TS2_MSK BIT(5)
+#define RK818_IRQ_CHG_CVTLIM_MSK BIT(6)
+#define RK818_IRQ_DISCHG_ILIM_MSK BIT(7)
+
+#define RK818_NUM_IRQ 16
+
#define RK808_VBAT_LOW_2V8 0x00
#define RK808_VBAT_LOW_2V9 0x01
#define RK808_VBAT_LOW_3V0 0x02
@@ -191,9 +317,27 @@ enum {
BOOST_ILMIN_250MA,
};
+enum {
+ RK808_ID,
+ RK818_ID,
+};
+
+struct rk8xx_reg_data {
+ int addr;
+ int mask;
+ int value;
+};
+
struct rk808 {
- struct i2c_client *i2c;
- struct regmap_irq_chip_data *irq_data;
- struct regmap *regmap;
+ struct i2c_client *i2c;
+ struct regmap_irq_chip_data *irq_data;
+ struct regmap *regmap;
+ long variant;
+ int nr_cells;
+ const struct mfd_cell *cells;
+ const struct regmap_config *regmap_cfg;
+ const struct regmap_irq_chip *regmap_irq_chip;
+ const struct rk8xx_reg_data *pre_init_reg;
+ int nr_pre_init_regs;
};
-#endif /* __LINUX_REGULATOR_rk808_H */
+#endif /* __LINUX_REGULATOR_RK808_H */
--
1.9.1
--
--
You received this message because you are subscribed to "rtc-linux".
Membership options at http://groups.google.com/group/rtc-linux .
Please read http://groups.google.com/group/rtc-linux/web/checklist
before submitting a driver.
---
You received this message because you are subscribed to the Google Groups "rtc-linux" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [PATCH v4 4/7] regulator: rk808: Add regulator driver for RK818
2016-04-26 14:54 ` [rtc-linux] " Wadim Egorov
@ 2016-04-26 14:54 ` Wadim Egorov
-1 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-04-26 14:54 UTC (permalink / raw)
To: linux-kernel, linux-clk, rtc-linux, devicetree, linux-rockchip,
lee.jones
Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak,
mturquette, sboyd, lgirdwood, broonie, a.zummo,
alexandre.belloni, dianders, zyw
Add support for the rk818 regulator. The regulator module consists
of 4 DCDCs, 9 LDOs, 1 switch and 1 BOOST converter which is used to
power OTG and HDMI5V.
The output voltages are configurable and are meant to supply power
to the main processor and other components.
Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
---
Changes since v3:
- renamed rk8xx struct back to rk808
- fixed file and module descriptions
---
drivers/regulator/Kconfig | 4 +-
drivers/regulator/rk808-regulator.c | 143 ++++++++++++++++++++++++++++++++++--
2 files changed, 138 insertions(+), 9 deletions(-)
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index c77dc08..0efbcbf 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -609,11 +609,11 @@ config REGULATOR_RC5T583
outputs which can be controlled by i2c communication.
config REGULATOR_RK808
- tristate "Rockchip RK808 Power regulators"
+ tristate "Rockchip RK808/RK818 Power regulators"
depends on MFD_RK808
help
Select this option to enable the power regulator of ROCKCHIP
- PMIC RK808.
+ PMIC RK808 and RK818.
This driver supports the control of different power rails of device
through regulator interface. The device supports multiple DCDC/LDO
outputs which can be controlled by i2c communication.
diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c
index 40d07ba..5f412a5 100644
--- a/drivers/regulator/rk808-regulator.c
+++ b/drivers/regulator/rk808-regulator.c
@@ -1,11 +1,15 @@
/*
- * Regulator driver for Rockchip RK808
+ * Regulator driver for Rockchip RK808/RK818
*
* Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
*
* Author: Chris Zhong <zyw@rock-chips.com>
* Author: Zhang Qing <zhangqing@rock-chips.com>
*
+ * Copyright (C) 2016 PHYTEC Messtechnik GmbH
+ *
+ * Author: Wadim Egorov <w.egorov@phytec.de>
+ *
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
@@ -32,6 +36,12 @@
#define RK808_BUCK4_VSEL_MASK 0xf
#define RK808_LDO_VSEL_MASK 0x1f
+#define RK818_BUCK_VSEL_MASK 0x3f
+#define RK818_BUCK4_VSEL_MASK 0x1f
+#define RK818_LDO_VSEL_MASK 0x1f
+#define RK818_LDO3_ON_VSEL_MASK 0xf
+#define RK818_BOOST_ON_VSEL_MASK 0xe0
+
/* Ramp rate definitions for buck1 / buck2 only */
#define RK808_RAMP_RATE_OFFSET 3
#define RK808_RAMP_RATE_MASK (3 << RK808_RAMP_RATE_OFFSET)
@@ -454,6 +464,108 @@ static const struct regulator_desc rk808_reg[] = {
RK808_DCDC_EN_REG, BIT(6)),
};
+static const struct regulator_desc rk818_reg[] = {
+ {
+ .name = "DCDC_REG1",
+ .supply_name = "vcc1",
+ .of_match = of_match_ptr("DCDC_REG1"),
+ .regulators_node = of_match_ptr("regulators"),
+ .id = RK818_ID_DCDC1,
+ .ops = &rk808_reg_ops,
+ .type = REGULATOR_VOLTAGE,
+ .min_uV = 712500,
+ .uV_step = 12500,
+ .n_voltages = 64,
+ .vsel_reg = RK818_BUCK1_ON_VSEL_REG,
+ .vsel_mask = RK818_BUCK_VSEL_MASK,
+ .enable_reg = RK818_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 = RK818_ID_DCDC2,
+ .ops = &rk808_reg_ops,
+ .type = REGULATOR_VOLTAGE,
+ .min_uV = 712500,
+ .uV_step = 12500,
+ .n_voltages = 64,
+ .vsel_reg = RK818_BUCK2_ON_VSEL_REG,
+ .vsel_mask = RK818_BUCK_VSEL_MASK,
+ .enable_reg = RK818_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 = RK818_ID_DCDC3,
+ .ops = &rk808_switch_ops,
+ .type = REGULATOR_VOLTAGE,
+ .n_voltages = 1,
+ .enable_reg = RK818_DCDC_EN_REG,
+ .enable_mask = BIT(2),
+ .owner = THIS_MODULE,
+ },
+ RK8XX_DESC(RK818_ID_DCDC4, "DCDC_REG4", "vcc4", 1800, 3600, 100,
+ RK818_BUCK4_ON_VSEL_REG, RK818_BUCK4_VSEL_MASK,
+ RK818_DCDC_EN_REG, BIT(3), 0),
+ RK8XX_DESC(RK818_ID_BOOST, "DCDC_BOOST", "boost", 4700, 5400, 100,
+ RK818_BOOST_LDO9_ON_VSEL_REG, RK818_BOOST_ON_VSEL_MASK,
+ RK818_DCDC_EN_REG, BIT(4), 0),
+ RK8XX_DESC(RK818_ID_LDO1, "LDO_REG1", "vcc6", 1800, 3400, 100,
+ RK818_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
+ BIT(0), 400),
+ RK8XX_DESC(RK818_ID_LDO2, "LDO_REG2", "vcc6", 1800, 3400, 100,
+ RK818_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
+ BIT(1), 400),
+ {
+ .name = "LDO_REG3",
+ .supply_name = "vcc7",
+ .of_match = of_match_ptr("LDO_REG3"),
+ .regulators_node = of_match_ptr("regulators"),
+ .id = RK818_ID_LDO3,
+ .ops = &rk808_reg_ops_ranges,
+ .type = REGULATOR_VOLTAGE,
+ .n_voltages = 16,
+ .linear_ranges = rk808_ldo3_voltage_ranges,
+ .n_linear_ranges = ARRAY_SIZE(rk808_ldo3_voltage_ranges),
+ .vsel_reg = RK818_LDO3_ON_VSEL_REG,
+ .vsel_mask = RK818_LDO3_ON_VSEL_MASK,
+ .enable_reg = RK818_LDO_EN_REG,
+ .enable_mask = BIT(2),
+ .enable_time = 400,
+ .owner = THIS_MODULE,
+ },
+ RK8XX_DESC(RK818_ID_LDO4, "LDO_REG4", "vcc8", 1800, 3400, 100,
+ RK818_LDO4_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
+ BIT(3), 400),
+ RK8XX_DESC(RK818_ID_LDO5, "LDO_REG5", "vcc7", 1800, 3400, 100,
+ RK818_LDO5_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
+ BIT(4), 400),
+ RK8XX_DESC(RK818_ID_LDO6, "LDO_REG6", "vcc8", 800, 2500, 100,
+ RK818_LDO6_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
+ BIT(5), 400),
+ RK8XX_DESC(RK818_ID_LDO7, "LDO_REG7", "vcc7", 800, 2500, 100,
+ RK818_LDO7_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
+ BIT(6), 400),
+ RK8XX_DESC(RK818_ID_LDO8, "LDO_REG8", "vcc8", 1800, 3400, 100,
+ RK818_LDO8_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
+ BIT(7), 400),
+ RK8XX_DESC(RK818_ID_LDO9, "LDO_REG9", "vcc9", 1800, 3400, 100,
+ RK818_BOOST_LDO9_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
+ RK818_DCDC_EN_REG, BIT(5), 400),
+ RK8XX_DESC_SWITCH(RK818_ID_SWITCH, "SWITCH_REG", "vcc9",
+ RK818_DCDC_EN_REG, BIT(6)),
+ RK8XX_DESC_SWITCH(RK818_ID_HDMI_SWITCH, "HDMI_SWITCH", "h_5v",
+ RK818_H5V_EN_REG, BIT(0)),
+ RK8XX_DESC_SWITCH(RK818_ID_OTG_SWITCH, "OTG_SWITCH", "usb",
+ RK818_DCDC_EN_REG, BIT(7)),
+};
+
static int rk808_regulator_dt_parse_pdata(struct device *dev,
struct device *client_dev,
struct regmap *map,
@@ -499,7 +611,8 @@ static int rk808_regulator_probe(struct platform_device *pdev)
struct regulator_config config = {};
struct regulator_dev *rk808_rdev;
struct rk808_regulator_data *pdata;
- int ret, i;
+ const struct regulator_desc *regulators;
+ int ret, i, nregulators;
pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
if (!pdata)
@@ -512,14 +625,29 @@ static int rk808_regulator_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, pdata);
+ switch (rk808->variant) {
+ case RK808_ID:
+ regulators = rk808_reg;
+ nregulators = RK808_NUM_REGULATORS;
+ break;
+ case RK818_ID:
+ regulators = rk818_reg;
+ nregulators = RK818_NUM_REGULATORS;
+ break;
+ default:
+ dev_err(&client->dev, "unsupported RK8XX ID %lu\n",
+ rk808->variant);
+ return -EINVAL;
+ }
+
config.dev = &client->dev;
config.driver_data = pdata;
config.regmap = rk808->regmap;
/* Instantiate the regulators */
- for (i = 0; i < RK808_NUM_REGULATORS; i++) {
+ for (i = 0; i < nregulators; i++) {
rk808_rdev = devm_regulator_register(&pdev->dev,
- &rk808_reg[i], &config);
+ ®ulators[i], &config);
if (IS_ERR(rk808_rdev)) {
dev_err(&client->dev,
"failed to register %d regulator\n", i);
@@ -540,8 +668,9 @@ static struct platform_driver rk808_regulator_driver = {
module_platform_driver(rk808_regulator_driver);
-MODULE_DESCRIPTION("regulator driver for the rk808 series PMICs");
-MODULE_AUTHOR("Chris Zhong<zyw@rock-chips.com>");
-MODULE_AUTHOR("Zhang Qing<zhangqing@rock-chips.com>");
+MODULE_DESCRIPTION("regulator driver for the RK808/RK818 series PMICs");
+MODULE_AUTHOR("Chris Zhong <zyw@rock-chips.com>");
+MODULE_AUTHOR("Zhang Qing <zhangqing@rock-chips.com>");
+MODULE_AUTHOR("Wadim Egorov <w.egorov@phytec.de>");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:rk808-regulator");
--
1.9.1
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [rtc-linux] [PATCH v4 4/7] regulator: rk808: Add regulator driver for RK818
@ 2016-04-26 14:54 ` Wadim Egorov
0 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-04-26 14:54 UTC (permalink / raw)
To: linux-kernel, linux-clk, rtc-linux, devicetree, linux-rockchip,
lee.jones
Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak,
mturquette, sboyd, lgirdwood, broonie, a.zummo,
alexandre.belloni, dianders, zyw
Add support for the rk818 regulator. The regulator module consists
of 4 DCDCs, 9 LDOs, 1 switch and 1 BOOST converter which is used to
power OTG and HDMI5V.
The output voltages are configurable and are meant to supply power
to the main processor and other components.
Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
---
Changes since v3:
- renamed rk8xx struct back to rk808
- fixed file and module descriptions
---
drivers/regulator/Kconfig | 4 +-
drivers/regulator/rk808-regulator.c | 143 ++++++++++++++++++++++++++++++++++--
2 files changed, 138 insertions(+), 9 deletions(-)
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index c77dc08..0efbcbf 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -609,11 +609,11 @@ config REGULATOR_RC5T583
outputs which can be controlled by i2c communication.
config REGULATOR_RK808
- tristate "Rockchip RK808 Power regulators"
+ tristate "Rockchip RK808/RK818 Power regulators"
depends on MFD_RK808
help
Select this option to enable the power regulator of ROCKCHIP
- PMIC RK808.
+ PMIC RK808 and RK818.
This driver supports the control of different power rails of device
through regulator interface. The device supports multiple DCDC/LDO
outputs which can be controlled by i2c communication.
diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c
index 40d07ba..5f412a5 100644
--- a/drivers/regulator/rk808-regulator.c
+++ b/drivers/regulator/rk808-regulator.c
@@ -1,11 +1,15 @@
/*
- * Regulator driver for Rockchip RK808
+ * Regulator driver for Rockchip RK808/RK818
*
* Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
*
* Author: Chris Zhong <zyw@rock-chips.com>
* Author: Zhang Qing <zhangqing@rock-chips.com>
*
+ * Copyright (C) 2016 PHYTEC Messtechnik GmbH
+ *
+ * Author: Wadim Egorov <w.egorov@phytec.de>
+ *
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
@@ -32,6 +36,12 @@
#define RK808_BUCK4_VSEL_MASK 0xf
#define RK808_LDO_VSEL_MASK 0x1f
+#define RK818_BUCK_VSEL_MASK 0x3f
+#define RK818_BUCK4_VSEL_MASK 0x1f
+#define RK818_LDO_VSEL_MASK 0x1f
+#define RK818_LDO3_ON_VSEL_MASK 0xf
+#define RK818_BOOST_ON_VSEL_MASK 0xe0
+
/* Ramp rate definitions for buck1 / buck2 only */
#define RK808_RAMP_RATE_OFFSET 3
#define RK808_RAMP_RATE_MASK (3 << RK808_RAMP_RATE_OFFSET)
@@ -454,6 +464,108 @@ static const struct regulator_desc rk808_reg[] = {
RK808_DCDC_EN_REG, BIT(6)),
};
+static const struct regulator_desc rk818_reg[] = {
+ {
+ .name = "DCDC_REG1",
+ .supply_name = "vcc1",
+ .of_match = of_match_ptr("DCDC_REG1"),
+ .regulators_node = of_match_ptr("regulators"),
+ .id = RK818_ID_DCDC1,
+ .ops = &rk808_reg_ops,
+ .type = REGULATOR_VOLTAGE,
+ .min_uV = 712500,
+ .uV_step = 12500,
+ .n_voltages = 64,
+ .vsel_reg = RK818_BUCK1_ON_VSEL_REG,
+ .vsel_mask = RK818_BUCK_VSEL_MASK,
+ .enable_reg = RK818_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 = RK818_ID_DCDC2,
+ .ops = &rk808_reg_ops,
+ .type = REGULATOR_VOLTAGE,
+ .min_uV = 712500,
+ .uV_step = 12500,
+ .n_voltages = 64,
+ .vsel_reg = RK818_BUCK2_ON_VSEL_REG,
+ .vsel_mask = RK818_BUCK_VSEL_MASK,
+ .enable_reg = RK818_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 = RK818_ID_DCDC3,
+ .ops = &rk808_switch_ops,
+ .type = REGULATOR_VOLTAGE,
+ .n_voltages = 1,
+ .enable_reg = RK818_DCDC_EN_REG,
+ .enable_mask = BIT(2),
+ .owner = THIS_MODULE,
+ },
+ RK8XX_DESC(RK818_ID_DCDC4, "DCDC_REG4", "vcc4", 1800, 3600, 100,
+ RK818_BUCK4_ON_VSEL_REG, RK818_BUCK4_VSEL_MASK,
+ RK818_DCDC_EN_REG, BIT(3), 0),
+ RK8XX_DESC(RK818_ID_BOOST, "DCDC_BOOST", "boost", 4700, 5400, 100,
+ RK818_BOOST_LDO9_ON_VSEL_REG, RK818_BOOST_ON_VSEL_MASK,
+ RK818_DCDC_EN_REG, BIT(4), 0),
+ RK8XX_DESC(RK818_ID_LDO1, "LDO_REG1", "vcc6", 1800, 3400, 100,
+ RK818_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
+ BIT(0), 400),
+ RK8XX_DESC(RK818_ID_LDO2, "LDO_REG2", "vcc6", 1800, 3400, 100,
+ RK818_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
+ BIT(1), 400),
+ {
+ .name = "LDO_REG3",
+ .supply_name = "vcc7",
+ .of_match = of_match_ptr("LDO_REG3"),
+ .regulators_node = of_match_ptr("regulators"),
+ .id = RK818_ID_LDO3,
+ .ops = &rk808_reg_ops_ranges,
+ .type = REGULATOR_VOLTAGE,
+ .n_voltages = 16,
+ .linear_ranges = rk808_ldo3_voltage_ranges,
+ .n_linear_ranges = ARRAY_SIZE(rk808_ldo3_voltage_ranges),
+ .vsel_reg = RK818_LDO3_ON_VSEL_REG,
+ .vsel_mask = RK818_LDO3_ON_VSEL_MASK,
+ .enable_reg = RK818_LDO_EN_REG,
+ .enable_mask = BIT(2),
+ .enable_time = 400,
+ .owner = THIS_MODULE,
+ },
+ RK8XX_DESC(RK818_ID_LDO4, "LDO_REG4", "vcc8", 1800, 3400, 100,
+ RK818_LDO4_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
+ BIT(3), 400),
+ RK8XX_DESC(RK818_ID_LDO5, "LDO_REG5", "vcc7", 1800, 3400, 100,
+ RK818_LDO5_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
+ BIT(4), 400),
+ RK8XX_DESC(RK818_ID_LDO6, "LDO_REG6", "vcc8", 800, 2500, 100,
+ RK818_LDO6_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
+ BIT(5), 400),
+ RK8XX_DESC(RK818_ID_LDO7, "LDO_REG7", "vcc7", 800, 2500, 100,
+ RK818_LDO7_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
+ BIT(6), 400),
+ RK8XX_DESC(RK818_ID_LDO8, "LDO_REG8", "vcc8", 1800, 3400, 100,
+ RK818_LDO8_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
+ BIT(7), 400),
+ RK8XX_DESC(RK818_ID_LDO9, "LDO_REG9", "vcc9", 1800, 3400, 100,
+ RK818_BOOST_LDO9_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
+ RK818_DCDC_EN_REG, BIT(5), 400),
+ RK8XX_DESC_SWITCH(RK818_ID_SWITCH, "SWITCH_REG", "vcc9",
+ RK818_DCDC_EN_REG, BIT(6)),
+ RK8XX_DESC_SWITCH(RK818_ID_HDMI_SWITCH, "HDMI_SWITCH", "h_5v",
+ RK818_H5V_EN_REG, BIT(0)),
+ RK8XX_DESC_SWITCH(RK818_ID_OTG_SWITCH, "OTG_SWITCH", "usb",
+ RK818_DCDC_EN_REG, BIT(7)),
+};
+
static int rk808_regulator_dt_parse_pdata(struct device *dev,
struct device *client_dev,
struct regmap *map,
@@ -499,7 +611,8 @@ static int rk808_regulator_probe(struct platform_device *pdev)
struct regulator_config config = {};
struct regulator_dev *rk808_rdev;
struct rk808_regulator_data *pdata;
- int ret, i;
+ const struct regulator_desc *regulators;
+ int ret, i, nregulators;
pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
if (!pdata)
@@ -512,14 +625,29 @@ static int rk808_regulator_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, pdata);
+ switch (rk808->variant) {
+ case RK808_ID:
+ regulators = rk808_reg;
+ nregulators = RK808_NUM_REGULATORS;
+ break;
+ case RK818_ID:
+ regulators = rk818_reg;
+ nregulators = RK818_NUM_REGULATORS;
+ break;
+ default:
+ dev_err(&client->dev, "unsupported RK8XX ID %lu\n",
+ rk808->variant);
+ return -EINVAL;
+ }
+
config.dev = &client->dev;
config.driver_data = pdata;
config.regmap = rk808->regmap;
/* Instantiate the regulators */
- for (i = 0; i < RK808_NUM_REGULATORS; i++) {
+ for (i = 0; i < nregulators; i++) {
rk808_rdev = devm_regulator_register(&pdev->dev,
- &rk808_reg[i], &config);
+ ®ulators[i], &config);
if (IS_ERR(rk808_rdev)) {
dev_err(&client->dev,
"failed to register %d regulator\n", i);
@@ -540,8 +668,9 @@ static struct platform_driver rk808_regulator_driver = {
module_platform_driver(rk808_regulator_driver);
-MODULE_DESCRIPTION("regulator driver for the rk808 series PMICs");
-MODULE_AUTHOR("Chris Zhong<zyw@rock-chips.com>");
-MODULE_AUTHOR("Zhang Qing<zhangqing@rock-chips.com>");
+MODULE_DESCRIPTION("regulator driver for the RK808/RK818 series PMICs");
+MODULE_AUTHOR("Chris Zhong <zyw@rock-chips.com>");
+MODULE_AUTHOR("Zhang Qing <zhangqing@rock-chips.com>");
+MODULE_AUTHOR("Wadim Egorov <w.egorov@phytec.de>");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:rk808-regulator");
--
1.9.1
--
--
You received this message because you are subscribed to "rtc-linux".
Membership options at http://groups.google.com/group/rtc-linux .
Please read http://groups.google.com/group/rtc-linux/web/checklist
before submitting a driver.
---
You received this message because you are subscribed to the Google Groups "rtc-linux" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [PATCH v4 5/7] mfd: dt-bindings: Add RK818 device tree bindings document
2016-04-26 14:54 ` [rtc-linux] " Wadim Egorov
(?)
@ 2016-04-26 14:54 ` Wadim Egorov
-1 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-04-26 14:54 UTC (permalink / raw)
To: linux-kernel, linux-clk, rtc-linux, devicetree, linux-rockchip,
lee.jones
Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak,
mturquette, sboyd, lgirdwood, broonie, a.zummo,
alexandre.belloni, dianders, zyw
Add device tree bindings documentation for Rockchip's RK818 PMIC.
Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
Acked-by: Rob Herring <robh@kernel.org>
---
Documentation/devicetree/bindings/mfd/rk808.txt | 37 +++++++++++++++++++++++--
1 file changed, 34 insertions(+), 3 deletions(-)
diff --git a/Documentation/devicetree/bindings/mfd/rk808.txt b/Documentation/devicetree/bindings/mfd/rk808.txt
index 4ca6aab..9636ae8 100644
--- a/Documentation/devicetree/bindings/mfd/rk808.txt
+++ b/Documentation/devicetree/bindings/mfd/rk808.txt
@@ -1,7 +1,11 @@
-RK808 Power Management Integrated Circuit
+RK8XX Power Management Integrated Circuit
+
+The rk8xx family current members:
+rk808
+rk818
Required properties:
-- compatible: "rockchip,rk808"
+- compatible: "rockchip,rk808", "rockchip,rk818"
- reg: I2C slave address
- interrupt-parent: The parent interrupt controller.
- interrupts: the interrupt outputs of the controller.
@@ -13,6 +17,8 @@ Optional properties:
default output clock name
- rockchip,system-power-controller: Telling whether or not this pmic is controlling
the system power.
+
+Optional RK808 properties:
- vcc1-supply: The input supply for DCDC_REG1
- vcc2-supply: The input supply for DCDC_REG2
- vcc3-supply: The input supply for DCDC_REG3
@@ -29,7 +35,20 @@ Optional properties:
the gpio controller. If DVS GPIOs aren't present, voltage changes will happen
very quickly with no slow ramp time.
-Regulators: All the regulators of RK808 to be instantiated shall be
+Optional RK818 properties:
+- vcc1-supply: The input supply for DCDC_REG1
+- vcc2-supply: The input supply for DCDC_REG2
+- vcc3-supply: The input supply for DCDC_REG3
+- vcc4-supply: The input supply for DCDC_REG4
+- boost-supply: The input supply for DCDC_BOOST
+- vcc6-supply: The input supply for LDO_REG1 and LDO_REG2
+- vcc7-supply: The input supply for LDO_REG3, LDO_REG5 and LDO_REG7
+- vcc8-supply: The input supply for LDO_REG4, LDO_REG6 and LDO_REG8
+- vcc9-supply: The input supply for LDO_REG9 and SWITCH_REG
+- h_5v-supply: The input supply for HDMI_SWITCH
+- usb-supply: The input supply for OTG_SWITCH
+
+Regulators: All the regulators of RK8XX to be instantiated shall be
listed in a child node named 'regulators'. Each regulator is represented
by a child node of the 'regulators' node.
@@ -48,6 +67,18 @@ number as described in RK808 datasheet.
- SWITCH_REGn
- valid values for n are 1 to 2
+Following regulators of the RK818 PMIC block are supported. Note that
+the 'n' in regulator name, as in DCDC_REGn or LDOn, represents the DCDC or LDO
+number as described in RK818 datasheet.
+
+ - DCDC_REGn
+ - valid values for n are 1 to 4.
+ - LDO_REGn
+ - valid values for n are 1 to 9.
+ - SWITCH_REG
+ - HDMI_SWITCH
+ - OTG_SWITCH
+
Standard regulator bindings are used inside regulator subnodes. Check
Documentation/devicetree/bindings/regulator/regulator.txt
for more details
--
1.9.1
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [rtc-linux] [PATCH v4 5/7] mfd: dt-bindings: Add RK818 device tree bindings document
@ 2016-04-26 14:54 ` Wadim Egorov
0 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-04-26 14:54 UTC (permalink / raw)
To: linux-kernel, linux-clk, rtc-linux, devicetree, linux-rockchip,
lee.jones
Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak,
mturquette, sboyd, lgirdwood, broonie, a.zummo,
alexandre.belloni, dianders, zyw
Add device tree bindings documentation for Rockchip's RK818 PMIC.
Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
Acked-by: Rob Herring <robh@kernel.org>
---
Documentation/devicetree/bindings/mfd/rk808.txt | 37 +++++++++++++++++++++++--
1 file changed, 34 insertions(+), 3 deletions(-)
diff --git a/Documentation/devicetree/bindings/mfd/rk808.txt b/Documentation/devicetree/bindings/mfd/rk808.txt
index 4ca6aab..9636ae8 100644
--- a/Documentation/devicetree/bindings/mfd/rk808.txt
+++ b/Documentation/devicetree/bindings/mfd/rk808.txt
@@ -1,7 +1,11 @@
-RK808 Power Management Integrated Circuit
+RK8XX Power Management Integrated Circuit
+
+The rk8xx family current members:
+rk808
+rk818
Required properties:
-- compatible: "rockchip,rk808"
+- compatible: "rockchip,rk808", "rockchip,rk818"
- reg: I2C slave address
- interrupt-parent: The parent interrupt controller.
- interrupts: the interrupt outputs of the controller.
@@ -13,6 +17,8 @@ Optional properties:
default output clock name
- rockchip,system-power-controller: Telling whether or not this pmic is controlling
the system power.
+
+Optional RK808 properties:
- vcc1-supply: The input supply for DCDC_REG1
- vcc2-supply: The input supply for DCDC_REG2
- vcc3-supply: The input supply for DCDC_REG3
@@ -29,7 +35,20 @@ Optional properties:
the gpio controller. If DVS GPIOs aren't present, voltage changes will happen
very quickly with no slow ramp time.
-Regulators: All the regulators of RK808 to be instantiated shall be
+Optional RK818 properties:
+- vcc1-supply: The input supply for DCDC_REG1
+- vcc2-supply: The input supply for DCDC_REG2
+- vcc3-supply: The input supply for DCDC_REG3
+- vcc4-supply: The input supply for DCDC_REG4
+- boost-supply: The input supply for DCDC_BOOST
+- vcc6-supply: The input supply for LDO_REG1 and LDO_REG2
+- vcc7-supply: The input supply for LDO_REG3, LDO_REG5 and LDO_REG7
+- vcc8-supply: The input supply for LDO_REG4, LDO_REG6 and LDO_REG8
+- vcc9-supply: The input supply for LDO_REG9 and SWITCH_REG
+- h_5v-supply: The input supply for HDMI_SWITCH
+- usb-supply: The input supply for OTG_SWITCH
+
+Regulators: All the regulators of RK8XX to be instantiated shall be
listed in a child node named 'regulators'. Each regulator is represented
by a child node of the 'regulators' node.
@@ -48,6 +67,18 @@ number as described in RK808 datasheet.
- SWITCH_REGn
- valid values for n are 1 to 2
+Following regulators of the RK818 PMIC block are supported. Note that
+the 'n' in regulator name, as in DCDC_REGn or LDOn, represents the DCDC or LDO
+number as described in RK818 datasheet.
+
+ - DCDC_REGn
+ - valid values for n are 1 to 4.
+ - LDO_REGn
+ - valid values for n are 1 to 9.
+ - SWITCH_REG
+ - HDMI_SWITCH
+ - OTG_SWITCH
+
Standard regulator bindings are used inside regulator subnodes. Check
Documentation/devicetree/bindings/regulator/regulator.txt
for more details
--
1.9.1
--
--
You received this message because you are subscribed to "rtc-linux".
Membership options at http://groups.google.com/group/rtc-linux .
Please read http://groups.google.com/group/rtc-linux/web/checklist
before submitting a driver.
---
You received this message because you are subscribed to the Google Groups "rtc-linux" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [PATCH v4 5/7] mfd: dt-bindings: Add RK818 device tree bindings document
@ 2016-04-26 14:54 ` Wadim Egorov
0 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-04-26 14:54 UTC (permalink / raw)
To: linux-kernel-u79uwXL29TY76Z2rM5mHXA,
linux-clk-u79uwXL29TY76Z2rM5mHXA,
rtc-linux-/JYPxA39Uh5TLH3MbocFFw,
devicetree-u79uwXL29TY76Z2rM5mHXA,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
lee.jones-QSEj5FYQhm4dnm+yROfE0A
Cc: mark.rutland-5wv7dgnIgG8, a.zummo-BfzFCNDTiLLj+vYz1yj4TQ,
pawel.moll-5wv7dgnIgG8, ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg,
mturquette-rdvid1DuHRBWk0Htik3J/w, sboyd-sgV2jX0FEOL9JmXXK+q4OQ,
lgirdwood-Re5JQEeQqe8AvxtiuMwx3w,
dianders-F7+t8E8rja9g9hUCZPvPmw, robh+dt-DgEjT+Ai2ygdnm+yROfE0A,
alexandre.belloni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
broonie-DgEjT+Ai2ygdnm+yROfE0A, galak-sgV2jX0FEOL9JmXXK+q4OQ,
zyw-TNX95d0MmH7DzftRWevZcw
Add device tree bindings documentation for Rockchip's RK818 PMIC.
Signed-off-by: Wadim Egorov <w.egorov-guT5V/WYfQezQB+pC5nmwQ@public.gmane.org>
Acked-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
---
Documentation/devicetree/bindings/mfd/rk808.txt | 37 +++++++++++++++++++++++--
1 file changed, 34 insertions(+), 3 deletions(-)
diff --git a/Documentation/devicetree/bindings/mfd/rk808.txt b/Documentation/devicetree/bindings/mfd/rk808.txt
index 4ca6aab..9636ae8 100644
--- a/Documentation/devicetree/bindings/mfd/rk808.txt
+++ b/Documentation/devicetree/bindings/mfd/rk808.txt
@@ -1,7 +1,11 @@
-RK808 Power Management Integrated Circuit
+RK8XX Power Management Integrated Circuit
+
+The rk8xx family current members:
+rk808
+rk818
Required properties:
-- compatible: "rockchip,rk808"
+- compatible: "rockchip,rk808", "rockchip,rk818"
- reg: I2C slave address
- interrupt-parent: The parent interrupt controller.
- interrupts: the interrupt outputs of the controller.
@@ -13,6 +17,8 @@ Optional properties:
default output clock name
- rockchip,system-power-controller: Telling whether or not this pmic is controlling
the system power.
+
+Optional RK808 properties:
- vcc1-supply: The input supply for DCDC_REG1
- vcc2-supply: The input supply for DCDC_REG2
- vcc3-supply: The input supply for DCDC_REG3
@@ -29,7 +35,20 @@ Optional properties:
the gpio controller. If DVS GPIOs aren't present, voltage changes will happen
very quickly with no slow ramp time.
-Regulators: All the regulators of RK808 to be instantiated shall be
+Optional RK818 properties:
+- vcc1-supply: The input supply for DCDC_REG1
+- vcc2-supply: The input supply for DCDC_REG2
+- vcc3-supply: The input supply for DCDC_REG3
+- vcc4-supply: The input supply for DCDC_REG4
+- boost-supply: The input supply for DCDC_BOOST
+- vcc6-supply: The input supply for LDO_REG1 and LDO_REG2
+- vcc7-supply: The input supply for LDO_REG3, LDO_REG5 and LDO_REG7
+- vcc8-supply: The input supply for LDO_REG4, LDO_REG6 and LDO_REG8
+- vcc9-supply: The input supply for LDO_REG9 and SWITCH_REG
+- h_5v-supply: The input supply for HDMI_SWITCH
+- usb-supply: The input supply for OTG_SWITCH
+
+Regulators: All the regulators of RK8XX to be instantiated shall be
listed in a child node named 'regulators'. Each regulator is represented
by a child node of the 'regulators' node.
@@ -48,6 +67,18 @@ number as described in RK808 datasheet.
- SWITCH_REGn
- valid values for n are 1 to 2
+Following regulators of the RK818 PMIC block are supported. Note that
+the 'n' in regulator name, as in DCDC_REGn or LDOn, represents the DCDC or LDO
+number as described in RK818 datasheet.
+
+ - DCDC_REGn
+ - valid values for n are 1 to 4.
+ - LDO_REGn
+ - valid values for n are 1 to 9.
+ - SWITCH_REG
+ - HDMI_SWITCH
+ - OTG_SWITCH
+
Standard regulator bindings are used inside regulator subnodes. Check
Documentation/devicetree/bindings/regulator/regulator.txt
for more details
--
1.9.1
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [PATCH v4 6/7] clk: Kconfig: Name RK818 in Kconfig for COMMON_CLK_RK808
2016-04-26 14:54 ` [rtc-linux] " Wadim Egorov
(?)
@ 2016-04-26 14:54 ` Wadim Egorov
-1 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-04-26 14:54 UTC (permalink / raw)
To: linux-kernel, linux-clk, rtc-linux, devicetree, linux-rockchip,
lee.jones
Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak,
mturquette, sboyd, lgirdwood, broonie, a.zummo,
alexandre.belloni, dianders, zyw
The RK808 and RK818 PMICs are using a similar register map.
We can reuse the clk driver for the RK818 PMIC. So let's add
the RK818 in the Kconfig description.
Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
Acked-by: Stephen Boyd <sboyd@codeaurora.org>
---
drivers/clk/Kconfig | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
index 16f7d33..64b4daa 100644
--- a/drivers/clk/Kconfig
+++ b/drivers/clk/Kconfig
@@ -49,10 +49,10 @@ config COMMON_CLK_MAX77802
This driver supports Maxim 77802 crystal oscillator clock.
config COMMON_CLK_RK808
- tristate "Clock driver for RK808"
+ tristate "Clock driver for RK808/RK818"
depends on MFD_RK808
---help---
- This driver supports RK808 crystal oscillator clock. These
+ This driver supports RK808 and RK818 crystal oscillator clock. These
multi-function devices have two fixed-rate oscillators,
clocked at 32KHz each. Clkout1 is always on, Clkout2 can off
by control register.
--
1.9.1
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [rtc-linux] [PATCH v4 6/7] clk: Kconfig: Name RK818 in Kconfig for COMMON_CLK_RK808
@ 2016-04-26 14:54 ` Wadim Egorov
0 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-04-26 14:54 UTC (permalink / raw)
To: linux-kernel, linux-clk, rtc-linux, devicetree, linux-rockchip,
lee.jones
Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak,
mturquette, sboyd, lgirdwood, broonie, a.zummo,
alexandre.belloni, dianders, zyw
The RK808 and RK818 PMICs are using a similar register map.
We can reuse the clk driver for the RK818 PMIC. So let's add
the RK818 in the Kconfig description.
Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
Acked-by: Stephen Boyd <sboyd@codeaurora.org>
---
drivers/clk/Kconfig | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
index 16f7d33..64b4daa 100644
--- a/drivers/clk/Kconfig
+++ b/drivers/clk/Kconfig
@@ -49,10 +49,10 @@ config COMMON_CLK_MAX77802
This driver supports Maxim 77802 crystal oscillator clock.
config COMMON_CLK_RK808
- tristate "Clock driver for RK808"
+ tristate "Clock driver for RK808/RK818"
depends on MFD_RK808
---help---
- This driver supports RK808 crystal oscillator clock. These
+ This driver supports RK808 and RK818 crystal oscillator clock. These
multi-function devices have two fixed-rate oscillators,
clocked at 32KHz each. Clkout1 is always on, Clkout2 can off
by control register.
--
1.9.1
--
--
You received this message because you are subscribed to "rtc-linux".
Membership options at http://groups.google.com/group/rtc-linux .
Please read http://groups.google.com/group/rtc-linux/web/checklist
before submitting a driver.
---
You received this message because you are subscribed to the Google Groups "rtc-linux" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [PATCH v4 6/7] clk: Kconfig: Name RK818 in Kconfig for COMMON_CLK_RK808
@ 2016-04-26 14:54 ` Wadim Egorov
0 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-04-26 14:54 UTC (permalink / raw)
To: linux-kernel-u79uwXL29TY76Z2rM5mHXA,
linux-clk-u79uwXL29TY76Z2rM5mHXA,
rtc-linux-/JYPxA39Uh5TLH3MbocFFw,
devicetree-u79uwXL29TY76Z2rM5mHXA,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
lee.jones-QSEj5FYQhm4dnm+yROfE0A
Cc: mark.rutland-5wv7dgnIgG8, a.zummo-BfzFCNDTiLLj+vYz1yj4TQ,
pawel.moll-5wv7dgnIgG8, ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg,
mturquette-rdvid1DuHRBWk0Htik3J/w, sboyd-sgV2jX0FEOL9JmXXK+q4OQ,
lgirdwood-Re5JQEeQqe8AvxtiuMwx3w,
dianders-F7+t8E8rja9g9hUCZPvPmw, robh+dt-DgEjT+Ai2ygdnm+yROfE0A,
alexandre.belloni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
broonie-DgEjT+Ai2ygdnm+yROfE0A, galak-sgV2jX0FEOL9JmXXK+q4OQ,
zyw-TNX95d0MmH7DzftRWevZcw
The RK808 and RK818 PMICs are using a similar register map.
We can reuse the clk driver for the RK818 PMIC. So let's add
the RK818 in the Kconfig description.
Signed-off-by: Wadim Egorov <w.egorov-guT5V/WYfQezQB+pC5nmwQ@public.gmane.org>
Acked-by: Stephen Boyd <sboyd-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
---
drivers/clk/Kconfig | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
index 16f7d33..64b4daa 100644
--- a/drivers/clk/Kconfig
+++ b/drivers/clk/Kconfig
@@ -49,10 +49,10 @@ config COMMON_CLK_MAX77802
This driver supports Maxim 77802 crystal oscillator clock.
config COMMON_CLK_RK808
- tristate "Clock driver for RK808"
+ tristate "Clock driver for RK808/RK818"
depends on MFD_RK808
---help---
- This driver supports RK808 crystal oscillator clock. These
+ This driver supports RK808 and RK818 crystal oscillator clock. These
multi-function devices have two fixed-rate oscillators,
clocked at 32KHz each. Clkout1 is always on, Clkout2 can off
by control register.
--
1.9.1
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [PATCH v4 7/7] rtc: Kconfig: Name RK818 in Kconfig for RTC_DRV_RK808
2016-04-26 14:54 ` [rtc-linux] " Wadim Egorov
(?)
@ 2016-04-26 14:54 ` Wadim Egorov
-1 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-04-26 14:54 UTC (permalink / raw)
To: linux-kernel, linux-clk, rtc-linux, devicetree, linux-rockchip,
lee.jones
Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak,
mturquette, sboyd, lgirdwood, broonie, a.zummo,
alexandre.belloni, dianders, zyw
The RK808 and RK818 PMICs are using a similar register map.
We can reuse the rtc driver for the RK818 PMIC. So let's add
the RK818 in the Kconfig description.
Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
Acked-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
---
drivers/rtc/Kconfig | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index 3e84315..acc2651 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -324,11 +324,11 @@ config RTC_DRV_MAX77686
will be called rtc-max77686.
config RTC_DRV_RK808
- tristate "Rockchip RK808 RTC"
+ tristate "Rockchip RK808/RK818 RTC"
depends on MFD_RK808
help
If you say yes here you will get support for the
- RTC of RK808 PMIC.
+ RTC of RK808 and RK818 PMIC.
This driver can also be built as a module. If so, the module
will be called rk808-rtc.
--
1.9.1
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [rtc-linux] [PATCH v4 7/7] rtc: Kconfig: Name RK818 in Kconfig for RTC_DRV_RK808
@ 2016-04-26 14:54 ` Wadim Egorov
0 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-04-26 14:54 UTC (permalink / raw)
To: linux-kernel, linux-clk, rtc-linux, devicetree, linux-rockchip,
lee.jones
Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak,
mturquette, sboyd, lgirdwood, broonie, a.zummo,
alexandre.belloni, dianders, zyw
The RK808 and RK818 PMICs are using a similar register map.
We can reuse the rtc driver for the RK818 PMIC. So let's add
the RK818 in the Kconfig description.
Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
Acked-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
---
drivers/rtc/Kconfig | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index 3e84315..acc2651 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -324,11 +324,11 @@ config RTC_DRV_MAX77686
will be called rtc-max77686.
config RTC_DRV_RK808
- tristate "Rockchip RK808 RTC"
+ tristate "Rockchip RK808/RK818 RTC"
depends on MFD_RK808
help
If you say yes here you will get support for the
- RTC of RK808 PMIC.
+ RTC of RK808 and RK818 PMIC.
This driver can also be built as a module. If so, the module
will be called rk808-rtc.
--
1.9.1
--
--
You received this message because you are subscribed to "rtc-linux".
Membership options at http://groups.google.com/group/rtc-linux .
Please read http://groups.google.com/group/rtc-linux/web/checklist
before submitting a driver.
---
You received this message because you are subscribed to the Google Groups "rtc-linux" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [PATCH v4 7/7] rtc: Kconfig: Name RK818 in Kconfig for RTC_DRV_RK808
@ 2016-04-26 14:54 ` Wadim Egorov
0 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-04-26 14:54 UTC (permalink / raw)
To: linux-kernel-u79uwXL29TY76Z2rM5mHXA,
linux-clk-u79uwXL29TY76Z2rM5mHXA,
rtc-linux-/JYPxA39Uh5TLH3MbocFFw,
devicetree-u79uwXL29TY76Z2rM5mHXA,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
lee.jones-QSEj5FYQhm4dnm+yROfE0A
Cc: mark.rutland-5wv7dgnIgG8, a.zummo-BfzFCNDTiLLj+vYz1yj4TQ,
pawel.moll-5wv7dgnIgG8, ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg,
mturquette-rdvid1DuHRBWk0Htik3J/w, sboyd-sgV2jX0FEOL9JmXXK+q4OQ,
lgirdwood-Re5JQEeQqe8AvxtiuMwx3w,
dianders-F7+t8E8rja9g9hUCZPvPmw, robh+dt-DgEjT+Ai2ygdnm+yROfE0A,
alexandre.belloni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
broonie-DgEjT+Ai2ygdnm+yROfE0A, galak-sgV2jX0FEOL9JmXXK+q4OQ,
zyw-TNX95d0MmH7DzftRWevZcw
The RK808 and RK818 PMICs are using a similar register map.
We can reuse the rtc driver for the RK818 PMIC. So let's add
the RK818 in the Kconfig description.
Signed-off-by: Wadim Egorov <w.egorov-guT5V/WYfQezQB+pC5nmwQ@public.gmane.org>
Acked-by: Alexandre Belloni <alexandre.belloni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
---
drivers/rtc/Kconfig | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index 3e84315..acc2651 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -324,11 +324,11 @@ config RTC_DRV_MAX77686
will be called rtc-max77686.
config RTC_DRV_RK808
- tristate "Rockchip RK808 RTC"
+ tristate "Rockchip RK808/RK818 RTC"
depends on MFD_RK808
help
If you say yes here you will get support for the
- RTC of RK808 PMIC.
+ RTC of RK808 and RK818 PMIC.
This driver can also be built as a module. If so, the module
will be called rk808-rtc.
--
1.9.1
^ permalink raw reply related [flat|nested] 34+ messages in thread
* Applied "regulator: rk808: Add rk808_reg_ops_ranges for LDO3" to the regulator tree
2016-04-26 14:54 ` [rtc-linux] " Wadim Egorov
(?)
(?)
@ 2016-04-27 16:35 ` Mark Brown
-1 siblings, 0 replies; 34+ messages in thread
From: Mark Brown @ 2016-04-27 16:35 UTC (permalink / raw)
To: Wadim Egorov
Cc: Mark Brown, linux-kernel, linux-clk, rtc-linux, devicetree,
linux-rockchip, lee.jones, robh+dt, pawel.moll, mark.rutland,
ijc+devicetree, galak, mturquette, sboyd, lgirdwood, broonie,
a.zummo, alexandre.belloni, dianders, zyw
The patch
regulator: rk808: Add rk808_reg_ops_ranges for LDO3
has been applied to the regulator tree at
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git
All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying
to this mail.
Thanks,
Mark
>From 129d7cf98f5c739014ae5aa0311e48f6a64b0758 Mon Sep 17 00:00:00 2001
From: Wadim Egorov <w.egorov@phytec.de>
Date: Tue, 26 Apr 2016 16:54:04 +0200
Subject: [PATCH] regulator: rk808: Add rk808_reg_ops_ranges for LDO3
LDO_REG3 descriptor is using linear_ranges.
Add and use proper ops for LDO_REG3.
Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
drivers/regulator/rk808-regulator.c | 30 +++++++++++++++++++++++++++++-
1 file changed, 29 insertions(+), 1 deletion(-)
diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c
index 67f72feed815..6601ab5fcc2d 100644
--- a/drivers/regulator/rk808-regulator.c
+++ b/drivers/regulator/rk808-regulator.c
@@ -238,6 +238,21 @@ static int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv)
sel);
}
+static int rk808_set_suspend_voltage_range(struct regulator_dev *rdev, int uv)
+{
+ unsigned int reg;
+ int sel = regulator_map_voltage_linear_range(rdev, uv, uv);
+
+ if (sel < 0)
+ return -EINVAL;
+
+ reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
+
+ return regmap_update_bits(rdev->regmap, reg,
+ rdev->desc->vsel_mask,
+ sel);
+}
+
static int rk808_set_suspend_enable(struct regulator_dev *rdev)
{
unsigned int reg;
@@ -288,6 +303,19 @@ static struct regulator_ops rk808_reg_ops = {
.set_suspend_disable = rk808_set_suspend_disable,
};
+static struct regulator_ops rk808_reg_ops_ranges = {
+ .list_voltage = regulator_list_voltage_linear_range,
+ .map_voltage = regulator_map_voltage_linear_range,
+ .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_range,
+ .set_suspend_enable = rk808_set_suspend_enable,
+ .set_suspend_disable = rk808_set_suspend_disable,
+};
+
static struct regulator_ops rk808_switch_ops = {
.enable = regulator_enable_regmap,
.disable = regulator_disable_regmap,
@@ -383,7 +411,7 @@ static const struct regulator_desc rk808_reg[] = {
.name = "LDO_REG3",
.supply_name = "vcc7",
.id = RK808_ID_LDO3,
- .ops = &rk808_reg_ops,
+ .ops = &rk808_reg_ops_ranges,
.type = REGULATOR_VOLTAGE,
.n_voltages = 16,
.linear_ranges = rk808_ldo3_voltage_ranges,
--
2.8.0.rc3
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [rtc-linux] Applied "regulator: rk808: Add rk808_reg_ops_ranges for LDO3" to the regulator tree
@ 2016-04-27 16:35 ` Mark Brown
0 siblings, 0 replies; 34+ messages in thread
From: Mark Brown @ 2016-04-27 16:35 UTC (permalink / raw)
To: Wadim Egorov
Cc: Mark Brown, linux-kernel, linux-clk, rtc-linux, devicetree,
linux-rockchip, lee.jones, robh+dt, pawel.moll, mark.rutland,
ijc+devicetree, galak, mturquette, sboyd, lgirdwood, broonie,
a.zummo, alexandre.belloni, dianders, zyw
The patch
regulator: rk808: Add rk808_reg_ops_ranges for LDO3
has been applied to the regulator tree at
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git
All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying
to this mail.
Thanks,
Mark
>From 129d7cf98f5c739014ae5aa0311e48f6a64b0758 Mon Sep 17 00:00:00 2001
From: Wadim Egorov <w.egorov@phytec.de>
Date: Tue, 26 Apr 2016 16:54:04 +0200
Subject: [PATCH] regulator: rk808: Add rk808_reg_ops_ranges for LDO3
LDO_REG3 descriptor is using linear_ranges.
Add and use proper ops for LDO_REG3.
Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
drivers/regulator/rk808-regulator.c | 30 +++++++++++++++++++++++++++++-
1 file changed, 29 insertions(+), 1 deletion(-)
diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c
index 67f72feed815..6601ab5fcc2d 100644
--- a/drivers/regulator/rk808-regulator.c
+++ b/drivers/regulator/rk808-regulator.c
@@ -238,6 +238,21 @@ static int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv)
sel);
}
+static int rk808_set_suspend_voltage_range(struct regulator_dev *rdev, int uv)
+{
+ unsigned int reg;
+ int sel = regulator_map_voltage_linear_range(rdev, uv, uv);
+
+ if (sel < 0)
+ return -EINVAL;
+
+ reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
+
+ return regmap_update_bits(rdev->regmap, reg,
+ rdev->desc->vsel_mask,
+ sel);
+}
+
static int rk808_set_suspend_enable(struct regulator_dev *rdev)
{
unsigned int reg;
@@ -288,6 +303,19 @@ static struct regulator_ops rk808_reg_ops = {
.set_suspend_disable = rk808_set_suspend_disable,
};
+static struct regulator_ops rk808_reg_ops_ranges = {
+ .list_voltage = regulator_list_voltage_linear_range,
+ .map_voltage = regulator_map_voltage_linear_range,
+ .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_range,
+ .set_suspend_enable = rk808_set_suspend_enable,
+ .set_suspend_disable = rk808_set_suspend_disable,
+};
+
static struct regulator_ops rk808_switch_ops = {
.enable = regulator_enable_regmap,
.disable = regulator_disable_regmap,
@@ -383,7 +411,7 @@ static const struct regulator_desc rk808_reg[] = {
.name = "LDO_REG3",
.supply_name = "vcc7",
.id = RK808_ID_LDO3,
- .ops = &rk808_reg_ops,
+ .ops = &rk808_reg_ops_ranges,
.type = REGULATOR_VOLTAGE,
.n_voltages = 16,
.linear_ranges = rk808_ldo3_voltage_ranges,
--
2.8.0.rc3
--
--
You received this message because you are subscribed to "rtc-linux".
Membership options at http://groups.google.com/group/rtc-linux .
Please read http://groups.google.com/group/rtc-linux/web/checklist
before submitting a driver.
---
You received this message because you are subscribed to the Google Groups "rtc-linux" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
^ permalink raw reply related [flat|nested] 34+ messages in thread
* Applied "regulator: rk808: Add rk808_reg_ops_ranges for LDO3" to the regulator tree
@ 2016-04-27 16:35 ` Mark Brown
0 siblings, 0 replies; 34+ messages in thread
From: Mark Brown @ 2016-04-27 16:35 UTC (permalink / raw)
To: Wadim Egorov
Cc: Mark Brown, linux-kernel, linux-clk, rtc-linux, devicetree,
linux-rockchip, lee.jones, robh+dt, pawel.moll, mark.rutland,
ijc+devicetree, galak, mturquette, sboyd, lgirdwood
The patch
regulator: rk808: Add rk808_reg_ops_ranges for LDO3
has been applied to the regulator tree at
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git
All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying
to this mail.
Thanks,
Mark
>From 129d7cf98f5c739014ae5aa0311e48f6a64b0758 Mon Sep 17 00:00:00 2001
From: Wadim Egorov <w.egorov@phytec.de>
Date: Tue, 26 Apr 2016 16:54:04 +0200
Subject: [PATCH] regulator: rk808: Add rk808_reg_ops_ranges for LDO3
LDO_REG3 descriptor is using linear_ranges.
Add and use proper ops for LDO_REG3.
Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
drivers/regulator/rk808-regulator.c | 30 +++++++++++++++++++++++++++++-
1 file changed, 29 insertions(+), 1 deletion(-)
diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c
index 67f72feed815..6601ab5fcc2d 100644
--- a/drivers/regulator/rk808-regulator.c
+++ b/drivers/regulator/rk808-regulator.c
@@ -238,6 +238,21 @@ static int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv)
sel);
}
+static int rk808_set_suspend_voltage_range(struct regulator_dev *rdev, int uv)
+{
+ unsigned int reg;
+ int sel = regulator_map_voltage_linear_range(rdev, uv, uv);
+
+ if (sel < 0)
+ return -EINVAL;
+
+ reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
+
+ return regmap_update_bits(rdev->regmap, reg,
+ rdev->desc->vsel_mask,
+ sel);
+}
+
static int rk808_set_suspend_enable(struct regulator_dev *rdev)
{
unsigned int reg;
@@ -288,6 +303,19 @@ static struct regulator_ops rk808_reg_ops = {
.set_suspend_disable = rk808_set_suspend_disable,
};
+static struct regulator_ops rk808_reg_ops_ranges = {
+ .list_voltage = regulator_list_voltage_linear_range,
+ .map_voltage = regulator_map_voltage_linear_range,
+ .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_range,
+ .set_suspend_enable = rk808_set_suspend_enable,
+ .set_suspend_disable = rk808_set_suspend_disable,
+};
+
static struct regulator_ops rk808_switch_ops = {
.enable = regulator_enable_regmap,
.disable = regulator_disable_regmap,
@@ -383,7 +411,7 @@ static const struct regulator_desc rk808_reg[] = {
.name = "LDO_REG3",
.supply_name = "vcc7",
.id = RK808_ID_LDO3,
- .ops = &rk808_reg_ops,
+ .ops = &rk808_reg_ops_ranges,
.type = REGULATOR_VOLTAGE,
.n_voltages = 16,
.linear_ranges = rk808_ldo3_voltage_ranges,
--
2.8.0.rc3
^ permalink raw reply related [flat|nested] 34+ messages in thread
* Applied "regulator: rk808: Add rk808_reg_ops_ranges for LDO3" to the regulator tree
@ 2016-04-27 16:35 ` Mark Brown
0 siblings, 0 replies; 34+ messages in thread
From: Mark Brown @ 2016-04-27 16:35 UTC (permalink / raw)
To: Wadim Egorov
Cc: Mark Brown, linux-kernel, linux-clk, rtc-linux, devicetree,
linux-rockchip, lee.jones, robh+dt, pawel.moll, mark.rutland,
ijc+devicetree, galak, mturquette, sboyd, lgirdwood
The patch
regulator: rk808: Add rk808_reg_ops_ranges for LDO3
has been applied to the regulator tree at
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git
All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying
to this mail.
Thanks,
Mark
From 129d7cf98f5c739014ae5aa0311e48f6a64b0758 Mon Sep 17 00:00:00 2001
From: Wadim Egorov <w.egorov@phytec.de>
Date: Tue, 26 Apr 2016 16:54:04 +0200
Subject: [PATCH] regulator: rk808: Add rk808_reg_ops_ranges for LDO3
LDO_REG3 descriptor is using linear_ranges.
Add and use proper ops for LDO_REG3.
Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
drivers/regulator/rk808-regulator.c | 30 +++++++++++++++++++++++++++++-
1 file changed, 29 insertions(+), 1 deletion(-)
diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c
index 67f72feed815..6601ab5fcc2d 100644
--- a/drivers/regulator/rk808-regulator.c
+++ b/drivers/regulator/rk808-regulator.c
@@ -238,6 +238,21 @@ static int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv)
sel);
}
+static int rk808_set_suspend_voltage_range(struct regulator_dev *rdev, int uv)
+{
+ unsigned int reg;
+ int sel = regulator_map_voltage_linear_range(rdev, uv, uv);
+
+ if (sel < 0)
+ return -EINVAL;
+
+ reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
+
+ return regmap_update_bits(rdev->regmap, reg,
+ rdev->desc->vsel_mask,
+ sel);
+}
+
static int rk808_set_suspend_enable(struct regulator_dev *rdev)
{
unsigned int reg;
@@ -288,6 +303,19 @@ static struct regulator_ops rk808_reg_ops = {
.set_suspend_disable = rk808_set_suspend_disable,
};
+static struct regulator_ops rk808_reg_ops_ranges = {
+ .list_voltage = regulator_list_voltage_linear_range,
+ .map_voltage = regulator_map_voltage_linear_range,
+ .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_range,
+ .set_suspend_enable = rk808_set_suspend_enable,
+ .set_suspend_disable = rk808_set_suspend_disable,
+};
+
static struct regulator_ops rk808_switch_ops = {
.enable = regulator_enable_regmap,
.disable = regulator_disable_regmap,
@@ -383,7 +411,7 @@ static const struct regulator_desc rk808_reg[] = {
.name = "LDO_REG3",
.supply_name = "vcc7",
.id = RK808_ID_LDO3,
- .ops = &rk808_reg_ops,
+ .ops = &rk808_reg_ops_ranges,
.type = REGULATOR_VOLTAGE,
.n_voltages = 16,
.linear_ranges = rk808_ldo3_voltage_ranges,
--
2.8.0.rc3
^ permalink raw reply related [flat|nested] 34+ messages in thread
* Re: [PATCH v4 2/7] regulator: rk808: Migrate to regulator core's simplified DT parsing code
2016-04-26 14:54 ` [rtc-linux] " Wadim Egorov
(?)
@ 2016-04-27 16:57 ` Mark Brown
-1 siblings, 0 replies; 34+ messages in thread
From: Mark Brown @ 2016-04-27 16:57 UTC (permalink / raw)
To: Wadim Egorov
Cc: linux-kernel, linux-clk, rtc-linux, devicetree, linux-rockchip,
lee.jones, robh+dt, pawel.moll, mark.rutland, ijc+devicetree,
galak, mturquette, sboyd, lgirdwood, a.zummo, alexandre.belloni,
dianders, zyw
[-- Attachment #1: Type: text/plain, Size: 257 bytes --]
On Tue, Apr 26, 2016 at 04:54:05PM +0200, Wadim Egorov wrote:
> A common simplified DT parsing code for regulators was introduced in
> commit a0c7b164ad11 ("regulator: of: Provide simplified DT parsing
> method")
Acked-by: Mark Brown <broonie@kernel.org>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]
^ permalink raw reply [flat|nested] 34+ messages in thread
* [rtc-linux] Re: [PATCH v4 2/7] regulator: rk808: Migrate to regulator core's simplified DT parsing code
@ 2016-04-27 16:57 ` Mark Brown
0 siblings, 0 replies; 34+ messages in thread
From: Mark Brown @ 2016-04-27 16:57 UTC (permalink / raw)
To: Wadim Egorov
Cc: linux-kernel, linux-clk, rtc-linux, devicetree, linux-rockchip,
lee.jones, robh+dt, pawel.moll, mark.rutland, ijc+devicetree,
galak, mturquette, sboyd, lgirdwood, a.zummo, alexandre.belloni,
dianders, zyw
[-- Attachment #1: Type: text/plain, Size: 775 bytes --]
On Tue, Apr 26, 2016 at 04:54:05PM +0200, Wadim Egorov wrote:
> A common simplified DT parsing code for regulators was introduced in
> commit a0c7b164ad11 ("regulator: of: Provide simplified DT parsing
> method")
Acked-by: Mark Brown <broonie@kernel.org>
--
--
You received this message because you are subscribed to "rtc-linux".
Membership options at http://groups.google.com/group/rtc-linux .
Please read http://groups.google.com/group/rtc-linux/web/checklist
before submitting a driver.
---
You received this message because you are subscribed to the Google Groups "rtc-linux" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH v4 2/7] regulator: rk808: Migrate to regulator core's simplified DT parsing code
@ 2016-04-27 16:57 ` Mark Brown
0 siblings, 0 replies; 34+ messages in thread
From: Mark Brown @ 2016-04-27 16:57 UTC (permalink / raw)
To: Wadim Egorov
Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA,
linux-clk-u79uwXL29TY76Z2rM5mHXA,
rtc-linux-/JYPxA39Uh5TLH3MbocFFw,
devicetree-u79uwXL29TY76Z2rM5mHXA,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
lee.jones-QSEj5FYQhm4dnm+yROfE0A, robh+dt-DgEjT+Ai2ygdnm+yROfE0A,
pawel.moll-5wv7dgnIgG8, mark.rutland-5wv7dgnIgG8,
ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg,
galak-sgV2jX0FEOL9JmXXK+q4OQ, mturquette-rdvid1DuHRBWk0Htik3J/w,
sboyd-sgV2jX0FEOL9JmXXK+q4OQ, lgirdwood-Re5JQEeQqe8AvxtiuMwx3w,
a.zummo-BfzFCNDTiLLj+vYz1yj4TQ,
alexandre.belloni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
dianders-F7+t8E8rja9g9hUCZPvPmw, zyw-TNX95d0MmH7DzftRWevZcw
[-- Attachment #1: Type: text/plain, Size: 286 bytes --]
On Tue, Apr 26, 2016 at 04:54:05PM +0200, Wadim Egorov wrote:
> A common simplified DT parsing code for regulators was introduced in
> commit a0c7b164ad11 ("regulator: of: Provide simplified DT parsing
> method")
Acked-by: Mark Brown <broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH v4 1/7] regulator: rk808: Add rk808_reg_ops_ranges for LDO3
2016-04-26 14:54 ` [rtc-linux] " Wadim Egorov
@ 2016-04-27 21:54 ` Heiko Stübner
-1 siblings, 0 replies; 34+ messages in thread
From: Heiko Stübner @ 2016-04-27 21:54 UTC (permalink / raw)
To: linux-rockchip
Cc: Wadim Egorov, linux-kernel, linux-clk, rtc-linux, devicetree,
lee.jones, mark.rutland, a.zummo, pawel.moll, ijc+devicetree,
mturquette, sboyd, lgirdwood, dianders, robh+dt,
alexandre.belloni, broonie, galak, zyw
Am Dienstag, 26. April 2016, 16:54:04 schrieb Wadim Egorov:
> LDO_REG3 descriptor is using linear_ranges.
> Add and use proper ops for LDO_REG3.
>
> Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
I'm to late to the party judging by Mark's "Aplied" message, but just to
confirm, this patch sucessfully fixes the issue on veyron-devices reported
yesterday.
Heiko
^ permalink raw reply [flat|nested] 34+ messages in thread
* [rtc-linux] Re: [PATCH v4 1/7] regulator: rk808: Add rk808_reg_ops_ranges for LDO3
@ 2016-04-27 21:54 ` Heiko Stübner
0 siblings, 0 replies; 34+ messages in thread
From: Heiko Stübner @ 2016-04-27 21:54 UTC (permalink / raw)
To: linux-rockchip
Cc: Wadim Egorov, linux-kernel, linux-clk, rtc-linux, devicetree,
lee.jones, mark.rutland, a.zummo, pawel.moll, ijc+devicetree,
mturquette, sboyd, lgirdwood, dianders, robh+dt,
alexandre.belloni, broonie, galak, zyw
Am Dienstag, 26. April 2016, 16:54:04 schrieb Wadim Egorov:
> LDO_REG3 descriptor is using linear_ranges.
> Add and use proper ops for LDO_REG3.
>
> Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
I'm to late to the party judging by Mark's "Aplied" message, but just to
confirm, this patch sucessfully fixes the issue on veyron-devices reported
yesterday.
Heiko
--
--
You received this message because you are subscribed to "rtc-linux".
Membership options at http://groups.google.com/group/rtc-linux .
Please read http://groups.google.com/group/rtc-linux/web/checklist
before submitting a driver.
---
You received this message because you are subscribed to the Google Groups "rtc-linux" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH v4 3/7] mfd: RK808: Add RK818 support
2016-04-26 14:54 ` [rtc-linux] " Wadim Egorov
@ 2016-05-10 6:51 ` Wadim Egorov
-1 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-05-10 6:51 UTC (permalink / raw)
To: linux-kernel, linux-clk, rtc-linux, devicetree, linux-rockchip,
lee.jones
Cc: mark.rutland, a.zummo, pawel.moll, ijc+devicetree, mturquette,
sboyd, lgirdwood, dianders, robh+dt, alexandre.belloni, broonie,
galak, zyw
Ping.
Do you have any more comments?
On 26.04.2016 16:54, Wadim Egorov wrote:
> The RK818 chip is a power management IC for multimedia and handheld
> devices. It contains the following components:
>
> - Regulators
> - RTC
> - Clkout
> - battery support
>
> Both chips RK808 and RK818 are using a similar register map.
> So we can reuse the RTC and Clkout functionality.
>
> Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
> ---
> Changes since v3:
> - fixed file and module descriptions
> ---
> drivers/mfd/Kconfig | 4 +-
> drivers/mfd/rk808.c | 229 +++++++++++++++++++++++++++++++++++++++-------
> include/linux/mfd/rk808.h | 162 ++++++++++++++++++++++++++++++--
> 3 files changed, 349 insertions(+), 46 deletions(-)
>
> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> index eea61e3..0a5b1c0 100644
> --- a/drivers/mfd/Kconfig
> +++ b/drivers/mfd/Kconfig
> @@ -814,13 +814,13 @@ config MFD_RC5T583
> different functionality of the device.
>
> config MFD_RK808
> - tristate "Rockchip RK808 Power Management chip"
> + tristate "Rockchip RK808/RK818 Power Management chip"
> depends on I2C && OF
> select MFD_CORE
> select REGMAP_I2C
> select REGMAP_IRQ
> help
> - If you say yes here you get support for the RK808
> + If you say yes here you get support for the RK808 and RK818
> Power Management chips.
> This driver provides common support for accessing the device
> through I2C interface. The device supports multiple sub-devices
> diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c
> index 4b1e439..9bb7e8c 100644
> --- a/drivers/mfd/rk808.c
> +++ b/drivers/mfd/rk808.c
> @@ -1,11 +1,15 @@
> /*
> - * MFD core driver for Rockchip RK808
> + * MFD core driver for Rockchip RK808/RK818
> *
> * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
> *
> * Author: Chris Zhong <zyw@rock-chips.com>
> * Author: Zhang Qing <zhangqing@rock-chips.com>
> *
> + * Copyright (C) 2016 PHYTEC Messtechnik GmbH
> + *
> + * Author: Wadim Egorov <w.egorov@phytec.de>
> + *
> * This program is free software; you can redistribute it and/or modify it
> * under the terms and conditions of the GNU General Public License,
> * version 2, as published by the Free Software Foundation.
> @@ -22,12 +26,7 @@
> #include <linux/mfd/core.h>
> #include <linux/module.h>
> #include <linux/regmap.h>
> -
> -struct rk808_reg_data {
> - int addr;
> - int mask;
> - int value;
> -};
> +#include <linux/of_device.h>
>
> static bool rk808_is_volatile_reg(struct device *dev, unsigned int reg)
> {
> @@ -57,6 +56,14 @@ static bool rk808_is_volatile_reg(struct device *dev, unsigned int reg)
> return false;
> }
>
> +static const struct regmap_config rk818_regmap_config = {
> + .reg_bits = 8,
> + .val_bits = 8,
> + .max_register = RK818_USB_CTRL_REG,
> + .cache_type = REGCACHE_RBTREE,
> + .volatile_reg = rk808_is_volatile_reg,
> +};
> +
> static const struct regmap_config rk808_regmap_config = {
> .reg_bits = 8,
> .val_bits = 8,
> @@ -83,7 +90,17 @@ static const struct mfd_cell rk808s[] = {
> },
> };
>
> -static const struct rk808_reg_data pre_init_reg[] = {
> +static const struct mfd_cell rk818s[] = {
> + { .name = "rk808-clkout", },
> + { .name = "rk808-regulator", },
> + {
> + .name = "rk808-rtc",
> + .num_resources = ARRAY_SIZE(rtc_resources),
> + .resources = &rtc_resources[0],
> + },
> +};
> +
> +static const struct rk8xx_reg_data rk808_pre_init_reg[] = {
> { RK808_BUCK3_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_150MA },
> { RK808_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_200MA },
> { RK808_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, BOOST_ILMIN_100MA },
> @@ -94,6 +111,22 @@ static const struct rk808_reg_data pre_init_reg[] = {
> VB_LO_SEL_3500MV },
> };
>
> +static const struct rk8xx_reg_data rk818_pre_init_reg[] = {
> + { RK818_USB_CTRL_REG, RK818_USB_ILIM_SEL_MASK,
> + RK818_USB_ILMIN_2000MA },
> + /* close charger when usb lower then 3.4V */
> + { RK818_USB_CTRL_REG, RK818_USB_CHG_SD_VSEL_MASK, (0x7 << 4) },
> + /* no action when vref */
> + { RK818_H5V_EN_REG, BIT(1), RK818_REF_RDY_CTRL },
> + /* enable HDMI 5V */
> + { RK818_H5V_EN_REG, BIT(0), RK818_H5V_EN },
> + /* improve efficiency */
> + { RK818_BUCK2_CONFIG_REG, BUCK2_RATE_MASK, BUCK_ILMIN_250MA },
> + { RK818_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_250MA },
> + { RK818_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, BOOST_ILMIN_100MA },
> + { RK808_VB_MON_REG, MASK_ALL, VB_LO_ACT | VB_LO_SEL_3500MV },
> +};
> +
> static const struct regmap_irq rk808_irqs[] = {
> /* INT_STS */
> [RK808_IRQ_VOUT_LO] = {
> @@ -136,6 +169,76 @@ static const struct regmap_irq rk808_irqs[] = {
> },
> };
>
> +static const struct regmap_irq rk818_irqs[] = {
> + /* INT_STS */
> + [RK818_IRQ_VOUT_LO] = {
> + .mask = RK818_IRQ_VOUT_LO_MSK,
> + .reg_offset = 0,
> + },
> + [RK818_IRQ_VB_LO] = {
> + .mask = RK818_IRQ_VB_LO_MSK,
> + .reg_offset = 0,
> + },
> + [RK818_IRQ_PWRON] = {
> + .mask = RK818_IRQ_PWRON_MSK,
> + .reg_offset = 0,
> + },
> + [RK818_IRQ_PWRON_LP] = {
> + .mask = RK818_IRQ_PWRON_LP_MSK,
> + .reg_offset = 0,
> + },
> + [RK818_IRQ_HOTDIE] = {
> + .mask = RK818_IRQ_HOTDIE_MSK,
> + .reg_offset = 0,
> + },
> + [RK818_IRQ_RTC_ALARM] = {
> + .mask = RK818_IRQ_RTC_ALARM_MSK,
> + .reg_offset = 0,
> + },
> + [RK818_IRQ_RTC_PERIOD] = {
> + .mask = RK818_IRQ_RTC_PERIOD_MSK,
> + .reg_offset = 0,
> + },
> + [RK818_IRQ_USB_OV] = {
> + .mask = RK818_IRQ_USB_OV_MSK,
> + .reg_offset = 0,
> + },
> +
> + /* INT_STS2 */
> + [RK818_IRQ_PLUG_IN] = {
> + .mask = RK818_IRQ_PLUG_IN_MSK,
> + .reg_offset = 1,
> + },
> + [RK818_IRQ_PLUG_OUT] = {
> + .mask = RK818_IRQ_PLUG_OUT_MSK,
> + .reg_offset = 1,
> + },
> + [RK818_IRQ_CHG_OK] = {
> + .mask = RK818_IRQ_CHG_OK_MSK,
> + .reg_offset = 1,
> + },
> + [RK818_IRQ_CHG_TE] = {
> + .mask = RK818_IRQ_CHG_TE_MSK,
> + .reg_offset = 1,
> + },
> + [RK818_IRQ_CHG_TS1] = {
> + .mask = RK818_IRQ_CHG_TS1_MSK,
> + .reg_offset = 1,
> + },
> + [RK818_IRQ_TS2] = {
> + .mask = RK818_IRQ_TS2_MSK,
> + .reg_offset = 1,
> + },
> + [RK818_IRQ_CHG_CVTLIM] = {
> + .mask = RK818_IRQ_CHG_CVTLIM_MSK,
> + .reg_offset = 1,
> + },
> + [RK818_IRQ_DISCHG_ILIM] = {
> + .mask = RK818_IRQ_DISCHG_ILIM_MSK,
> + .reg_offset = 1,
> + },
> +};
> +
> static struct regmap_irq_chip rk808_irq_chip = {
> .name = "rk808",
> .irqs = rk808_irqs,
> @@ -148,6 +251,18 @@ static struct regmap_irq_chip rk808_irq_chip = {
> .init_ack_masked = true,
> };
>
> +static struct regmap_irq_chip rk818_irq_chip = {
> + .name = "rk818",
> + .irqs = rk818_irqs,
> + .num_irqs = ARRAY_SIZE(rk818_irqs),
> + .num_regs = 2,
> + .irq_reg_stride = 2,
> + .status_base = RK818_INT_STS_REG1,
> + .mask_base = RK818_INT_STS_MSK_REG1,
> + .ack_base = RK818_INT_STS_REG1,
> + .init_ack_masked = true,
> +};
> +
> static struct i2c_client *rk808_i2c_client;
> static void rk808_device_shutdown(void)
> {
> @@ -167,6 +282,48 @@ static void rk808_device_shutdown(void)
> dev_err(&rk808_i2c_client->dev, "power off error!\n");
> }
>
> +static const struct of_device_id rk808_of_match[] = {
> + { .compatible = "rockchip,rk808", .data = (void *) RK808_ID },
> + { .compatible = "rockchip,rk818", .data = (void *) RK818_ID },
> + { },
> +};
> +MODULE_DEVICE_TABLE(of, rk808_of_match);
> +
> +static int rk8xx_match_device(struct rk808 *rk808, struct device *dev)
> +{
> + const struct of_device_id *of_id;
> +
> + of_id = of_match_device(rk808_of_match, dev);
> + if (!of_id) {
> + dev_err(dev, "Unable to match OF ID\n");
> + return -ENODEV;
> + }
> + rk808->variant = (long) of_id->data;
> +
> + switch (rk808->variant) {
> + case RK808_ID:
> + rk808->nr_cells = ARRAY_SIZE(rk808s);
> + rk808->cells = rk808s;
> + rk808->regmap_cfg = &rk808_regmap_config;
> + rk808->regmap_irq_chip = &rk808_irq_chip;
> + rk808->pre_init_reg = rk808_pre_init_reg;
> + rk808->nr_pre_init_regs = ARRAY_SIZE(rk808_pre_init_reg);
> + break;
> + case RK818_ID:
> + rk808->nr_cells = ARRAY_SIZE(rk818s);
> + rk808->cells = rk818s;
> + rk808->regmap_cfg = &rk818_regmap_config;
> + rk808->regmap_irq_chip = &rk818_irq_chip;
> + rk808->pre_init_reg = rk818_pre_init_reg;
> + rk808->nr_pre_init_regs = ARRAY_SIZE(rk818_pre_init_reg);
> + break;
> + default:
> + dev_err(dev, "unsupported RK8XX ID %lu\n", rk808->variant);
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> static int rk808_probe(struct i2c_client *client,
> const struct i2c_device_id *id)
> {
> @@ -176,45 +333,51 @@ static int rk808_probe(struct i2c_client *client,
> int ret;
> int i;
>
> - if (!client->irq) {
> - dev_err(&client->dev, "No interrupt support, no core IRQ\n");
> - return -EINVAL;
> - }
> -
> rk808 = devm_kzalloc(&client->dev, sizeof(*rk808), GFP_KERNEL);
> if (!rk808)
> return -ENOMEM;
>
> - rk808->regmap = devm_regmap_init_i2c(client, &rk808_regmap_config);
> + ret = rk8xx_match_device(rk808, &client->dev);
> + if (ret)
> + return ret;
> +
> + rk808->i2c = client;
> + i2c_set_clientdata(client, rk808);
> +
> + rk808->regmap = devm_regmap_init_i2c(client, rk808->regmap_cfg);
> if (IS_ERR(rk808->regmap)) {
> dev_err(&client->dev, "regmap initialization failed\n");
> return PTR_ERR(rk808->regmap);
> }
>
> - for (i = 0; i < ARRAY_SIZE(pre_init_reg); i++) {
> - ret = regmap_update_bits(rk808->regmap, pre_init_reg[i].addr,
> - pre_init_reg[i].mask,
> - pre_init_reg[i].value);
> - if (ret) {
> - dev_err(&client->dev,
> - "0x%x write err\n", pre_init_reg[i].addr);
> - return ret;
> - }
> + if (!client->irq) {
> + dev_err(&client->dev, "No interrupt support, no core IRQ\n");
> + return -EINVAL;
> }
>
> ret = regmap_add_irq_chip(rk808->regmap, client->irq,
> IRQF_ONESHOT, -1,
> - &rk808_irq_chip, &rk808->irq_data);
> + rk808->regmap_irq_chip, &rk808->irq_data);
> if (ret) {
> dev_err(&client->dev, "Failed to add irq_chip %d\n", ret);
> return ret;
> }
>
> - rk808->i2c = client;
> - i2c_set_clientdata(client, rk808);
> + for (i = 0; i < rk808->nr_pre_init_regs; i++) {
> + ret = regmap_update_bits(rk808->regmap,
> + rk808->pre_init_reg[i].addr,
> + rk808->pre_init_reg[i].mask,
> + rk808->pre_init_reg[i].value);
> + if (ret) {
> + dev_err(&client->dev,
> + "0x%x write err\n",
> + rk808->pre_init_reg[i].addr);
> + return ret;
> + }
> + }
>
> - ret = mfd_add_devices(&client->dev, -1,
> - rk808s, ARRAY_SIZE(rk808s),
> + ret = mfd_add_devices(&client->dev, PLATFORM_DEVID_NONE,
> + rk808->cells, rk808->nr_cells,
> NULL, 0, regmap_irq_get_domain(rk808->irq_data));
> if (ret) {
> dev_err(&client->dev, "failed to add MFD devices %d\n", ret);
> @@ -246,14 +409,9 @@ static int rk808_remove(struct i2c_client *client)
> return 0;
> }
>
> -static const struct of_device_id rk808_of_match[] = {
> - { .compatible = "rockchip,rk808" },
> - { },
> -};
> -MODULE_DEVICE_TABLE(of, rk808_of_match);
> -
> static const struct i2c_device_id rk808_ids[] = {
> { "rk808" },
> + { "rk818" },
> { },
> };
> MODULE_DEVICE_TABLE(i2c, rk808_ids);
> @@ -273,4 +431,5 @@ module_i2c_driver(rk808_i2c_driver);
> MODULE_LICENSE("GPL");
> MODULE_AUTHOR("Chris Zhong <zyw@rock-chips.com>");
> MODULE_AUTHOR("Zhang Qing <zhangqing@rock-chips.com>");
> -MODULE_DESCRIPTION("RK808 PMIC driver");
> +MODULE_AUTHOR("Wadim Egorov <w.egorov@phytec.de>");
> +MODULE_DESCRIPTION("RK808/RK818 PMIC driver");
> diff --git a/include/linux/mfd/rk808.h b/include/linux/mfd/rk808.h
> index 441b6ee..5ce810c 100644
> --- a/include/linux/mfd/rk808.h
> +++ b/include/linux/mfd/rk808.h
> @@ -1,11 +1,15 @@
> /*
> - * rk808.h for Rockchip RK808
> + * Register definitions for Rockchip's RK808/RK818 PMIC
> *
> * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
> *
> * Author: Chris Zhong <zyw@rock-chips.com>
> * Author: Zhang Qing <zhangqing@rock-chips.com>
> *
> + * Copyright (C) 2016 PHYTEC Messtechnik GmbH
> + *
> + * Author: Wadim Egorov <w.egorov@phytec.de>
> + *
> * This program is free software; you can redistribute it and/or modify it
> * under the terms and conditions of the GNU General Public License,
> * version 2, as published by the Free Software Foundation.
> @@ -16,8 +20,8 @@
> * more details.
> */
>
> -#ifndef __LINUX_REGULATOR_rk808_H
> -#define __LINUX_REGULATOR_rk808_H
> +#ifndef __LINUX_REGULATOR_RK808_H
> +#define __LINUX_REGULATOR_RK808_H
>
> #include <linux/regulator/machine.h>
> #include <linux/regmap.h>
> @@ -28,7 +32,7 @@
>
> #define RK808_DCDC1 0 /* (0+RK808_START) */
> #define RK808_LDO1 4 /* (4+RK808_START) */
> -#define RK808_NUM_REGULATORS 14
> +#define RK808_NUM_REGULATORS 14
>
> enum rk808_reg {
> RK808_ID_DCDC1,
> @@ -115,7 +119,92 @@ enum rk808_reg {
> #define RK808_INT_STS_MSK_REG2 0x4f
> #define RK808_IO_POL_REG 0x50
>
> -/* IRQ Definitions */
> +/* RK818 */
> +#define RK818_DCDC1 0
> +#define RK818_LDO1 4
> +#define RK818_NUM_REGULATORS 17
> +
> +enum rk818_reg {
> + RK818_ID_DCDC1,
> + RK818_ID_DCDC2,
> + RK818_ID_DCDC3,
> + RK818_ID_DCDC4,
> + RK818_ID_BOOST,
> + RK818_ID_LDO1,
> + RK818_ID_LDO2,
> + RK818_ID_LDO3,
> + RK818_ID_LDO4,
> + RK818_ID_LDO5,
> + RK818_ID_LDO6,
> + RK818_ID_LDO7,
> + RK818_ID_LDO8,
> + RK818_ID_LDO9,
> + RK818_ID_SWITCH,
> + RK818_ID_HDMI_SWITCH,
> + RK818_ID_OTG_SWITCH,
> +};
> +
> +#define RK818_DCDC_EN_REG 0x23
> +#define RK818_LDO_EN_REG 0x24
> +#define RK818_SLEEP_SET_OFF_REG1 0x25
> +#define RK818_SLEEP_SET_OFF_REG2 0x26
> +#define RK818_DCDC_UV_STS_REG 0x27
> +#define RK818_DCDC_UV_ACT_REG 0x28
> +#define RK818_LDO_UV_STS_REG 0x29
> +#define RK818_LDO_UV_ACT_REG 0x2a
> +#define RK818_DCDC_PG_REG 0x2b
> +#define RK818_LDO_PG_REG 0x2c
> +#define RK818_VOUT_MON_TDB_REG 0x2d
> +#define RK818_BUCK1_CONFIG_REG 0x2e
> +#define RK818_BUCK1_ON_VSEL_REG 0x2f
> +#define RK818_BUCK1_SLP_VSEL_REG 0x30
> +#define RK818_BUCK2_CONFIG_REG 0x32
> +#define RK818_BUCK2_ON_VSEL_REG 0x33
> +#define RK818_BUCK2_SLP_VSEL_REG 0x34
> +#define RK818_BUCK3_CONFIG_REG 0x36
> +#define RK818_BUCK4_CONFIG_REG 0x37
> +#define RK818_BUCK4_ON_VSEL_REG 0x38
> +#define RK818_BUCK4_SLP_VSEL_REG 0x39
> +#define RK818_BOOST_CONFIG_REG 0x3a
> +#define RK818_LDO1_ON_VSEL_REG 0x3b
> +#define RK818_LDO1_SLP_VSEL_REG 0x3c
> +#define RK818_LDO2_ON_VSEL_REG 0x3d
> +#define RK818_LDO2_SLP_VSEL_REG 0x3e
> +#define RK818_LDO3_ON_VSEL_REG 0x3f
> +#define RK818_LDO3_SLP_VSEL_REG 0x40
> +#define RK818_LDO4_ON_VSEL_REG 0x41
> +#define RK818_LDO4_SLP_VSEL_REG 0x42
> +#define RK818_LDO5_ON_VSEL_REG 0x43
> +#define RK818_LDO5_SLP_VSEL_REG 0x44
> +#define RK818_LDO6_ON_VSEL_REG 0x45
> +#define RK818_LDO6_SLP_VSEL_REG 0x46
> +#define RK818_LDO7_ON_VSEL_REG 0x47
> +#define RK818_LDO7_SLP_VSEL_REG 0x48
> +#define RK818_LDO8_ON_VSEL_REG 0x49
> +#define RK818_LDO8_SLP_VSEL_REG 0x4a
> +#define RK818_BOOST_LDO9_ON_VSEL_REG 0x54
> +#define RK818_BOOST_LDO9_SLP_VSEL_REG 0x55
> +#define RK818_DEVCTRL_REG 0x4b
> +#define RK818_INT_STS_REG1 0X4c
> +#define RK818_INT_STS_MSK_REG1 0x4d
> +#define RK818_INT_STS_REG2 0x4e
> +#define RK818_INT_STS_MSK_REG2 0x4f
> +#define RK818_IO_POL_REG 0x50
> +#define RK818_H5V_EN_REG 0x52
> +#define RK818_SLEEP_SET_OFF_REG3 0x53
> +#define RK818_BOOST_LDO9_ON_VSEL_REG 0x54
> +#define RK818_BOOST_LDO9_SLP_VSEL_REG 0x55
> +#define RK818_BOOST_CTRL_REG 0x56
> +#define RK818_DCDC_ILMAX 0x90
> +#define RK818_USB_CTRL_REG 0xa1
> +
> +#define RK818_H5V_EN BIT(0)
> +#define RK818_REF_RDY_CTRL BIT(1)
> +#define RK818_USB_ILIM_SEL_MASK 0xf
> +#define RK818_USB_ILMIN_2000MA 0x7
> +#define RK818_USB_CHG_SD_VSEL_MASK 0x70
> +
> +/* RK808 IRQ Definitions */
> #define RK808_IRQ_VOUT_LO 0
> #define RK808_IRQ_VB_LO 1
> #define RK808_IRQ_PWRON 2
> @@ -137,6 +226,43 @@ enum rk808_reg {
> #define RK808_IRQ_PLUG_IN_INT_MSK BIT(0)
> #define RK808_IRQ_PLUG_OUT_INT_MSK BIT(1)
>
> +/* RK818 IRQ Definitions */
> +#define RK818_IRQ_VOUT_LO 0
> +#define RK818_IRQ_VB_LO 1
> +#define RK818_IRQ_PWRON 2
> +#define RK818_IRQ_PWRON_LP 3
> +#define RK818_IRQ_HOTDIE 4
> +#define RK818_IRQ_RTC_ALARM 5
> +#define RK818_IRQ_RTC_PERIOD 6
> +#define RK818_IRQ_USB_OV 7
> +#define RK818_IRQ_PLUG_IN 8
> +#define RK818_IRQ_PLUG_OUT 9
> +#define RK818_IRQ_CHG_OK 10
> +#define RK818_IRQ_CHG_TE 11
> +#define RK818_IRQ_CHG_TS1 12
> +#define RK818_IRQ_TS2 13
> +#define RK818_IRQ_CHG_CVTLIM 14
> +#define RK818_IRQ_DISCHG_ILIM 7
> +
> +#define RK818_IRQ_VOUT_LO_MSK BIT(0)
> +#define RK818_IRQ_VB_LO_MSK BIT(1)
> +#define RK818_IRQ_PWRON_MSK BIT(2)
> +#define RK818_IRQ_PWRON_LP_MSK BIT(3)
> +#define RK818_IRQ_HOTDIE_MSK BIT(4)
> +#define RK818_IRQ_RTC_ALARM_MSK BIT(5)
> +#define RK818_IRQ_RTC_PERIOD_MSK BIT(6)
> +#define RK818_IRQ_USB_OV_MSK BIT(7)
> +#define RK818_IRQ_PLUG_IN_MSK BIT(0)
> +#define RK818_IRQ_PLUG_OUT_MSK BIT(1)
> +#define RK818_IRQ_CHG_OK_MSK BIT(2)
> +#define RK818_IRQ_CHG_TE_MSK BIT(3)
> +#define RK818_IRQ_CHG_TS1_MSK BIT(4)
> +#define RK818_IRQ_TS2_MSK BIT(5)
> +#define RK818_IRQ_CHG_CVTLIM_MSK BIT(6)
> +#define RK818_IRQ_DISCHG_ILIM_MSK BIT(7)
> +
> +#define RK818_NUM_IRQ 16
> +
> #define RK808_VBAT_LOW_2V8 0x00
> #define RK808_VBAT_LOW_2V9 0x01
> #define RK808_VBAT_LOW_3V0 0x02
> @@ -191,9 +317,27 @@ enum {
> BOOST_ILMIN_250MA,
> };
>
> +enum {
> + RK808_ID,
> + RK818_ID,
> +};
> +
> +struct rk8xx_reg_data {
> + int addr;
> + int mask;
> + int value;
> +};
> +
> struct rk808 {
> - struct i2c_client *i2c;
> - struct regmap_irq_chip_data *irq_data;
> - struct regmap *regmap;
> + struct i2c_client *i2c;
> + struct regmap_irq_chip_data *irq_data;
> + struct regmap *regmap;
> + long variant;
> + int nr_cells;
> + const struct mfd_cell *cells;
> + const struct regmap_config *regmap_cfg;
> + const struct regmap_irq_chip *regmap_irq_chip;
> + const struct rk8xx_reg_data *pre_init_reg;
> + int nr_pre_init_regs;
> };
> -#endif /* __LINUX_REGULATOR_rk808_H */
> +#endif /* __LINUX_REGULATOR_RK808_H */
^ permalink raw reply [flat|nested] 34+ messages in thread
* [rtc-linux] Re: [PATCH v4 3/7] mfd: RK808: Add RK818 support
@ 2016-05-10 6:51 ` Wadim Egorov
0 siblings, 0 replies; 34+ messages in thread
From: Wadim Egorov @ 2016-05-10 6:51 UTC (permalink / raw)
To: linux-kernel, linux-clk, rtc-linux, devicetree, linux-rockchip,
lee.jones
Cc: mark.rutland, a.zummo, pawel.moll, ijc+devicetree, mturquette,
sboyd, lgirdwood, dianders, robh+dt, alexandre.belloni, broonie,
galak, zyw
Ping.
Do you have any more comments?
On 26.04.2016 16:54, Wadim Egorov wrote:
> The RK818 chip is a power management IC for multimedia and handheld
> devices. It contains the following components:
>
> - Regulators
> - RTC
> - Clkout
> - battery support
>
> Both chips RK808 and RK818 are using a similar register map.
> So we can reuse the RTC and Clkout functionality.
>
> Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
> ---
> Changes since v3:
> - fixed file and module descriptions
> ---
> drivers/mfd/Kconfig | 4 +-
> drivers/mfd/rk808.c | 229 +++++++++++++++++++++++++++++++++++++++-------
> include/linux/mfd/rk808.h | 162 ++++++++++++++++++++++++++++++--
> 3 files changed, 349 insertions(+), 46 deletions(-)
>
> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> index eea61e3..0a5b1c0 100644
> --- a/drivers/mfd/Kconfig
> +++ b/drivers/mfd/Kconfig
> @@ -814,13 +814,13 @@ config MFD_RC5T583
> different functionality of the device.
>
> config MFD_RK808
> - tristate "Rockchip RK808 Power Management chip"
> + tristate "Rockchip RK808/RK818 Power Management chip"
> depends on I2C && OF
> select MFD_CORE
> select REGMAP_I2C
> select REGMAP_IRQ
> help
> - If you say yes here you get support for the RK808
> + If you say yes here you get support for the RK808 and RK818
> Power Management chips.
> This driver provides common support for accessing the device
> through I2C interface. The device supports multiple sub-devices
> diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c
> index 4b1e439..9bb7e8c 100644
> --- a/drivers/mfd/rk808.c
> +++ b/drivers/mfd/rk808.c
> @@ -1,11 +1,15 @@
> /*
> - * MFD core driver for Rockchip RK808
> + * MFD core driver for Rockchip RK808/RK818
> *
> * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
> *
> * Author: Chris Zhong <zyw@rock-chips.com>
> * Author: Zhang Qing <zhangqing@rock-chips.com>
> *
> + * Copyright (C) 2016 PHYTEC Messtechnik GmbH
> + *
> + * Author: Wadim Egorov <w.egorov@phytec.de>
> + *
> * This program is free software; you can redistribute it and/or modify it
> * under the terms and conditions of the GNU General Public License,
> * version 2, as published by the Free Software Foundation.
> @@ -22,12 +26,7 @@
> #include <linux/mfd/core.h>
> #include <linux/module.h>
> #include <linux/regmap.h>
> -
> -struct rk808_reg_data {
> - int addr;
> - int mask;
> - int value;
> -};
> +#include <linux/of_device.h>
>
> static bool rk808_is_volatile_reg(struct device *dev, unsigned int reg)
> {
> @@ -57,6 +56,14 @@ static bool rk808_is_volatile_reg(struct device *dev, unsigned int reg)
> return false;
> }
>
> +static const struct regmap_config rk818_regmap_config = {
> + .reg_bits = 8,
> + .val_bits = 8,
> + .max_register = RK818_USB_CTRL_REG,
> + .cache_type = REGCACHE_RBTREE,
> + .volatile_reg = rk808_is_volatile_reg,
> +};
> +
> static const struct regmap_config rk808_regmap_config = {
> .reg_bits = 8,
> .val_bits = 8,
> @@ -83,7 +90,17 @@ static const struct mfd_cell rk808s[] = {
> },
> };
>
> -static const struct rk808_reg_data pre_init_reg[] = {
> +static const struct mfd_cell rk818s[] = {
> + { .name = "rk808-clkout", },
> + { .name = "rk808-regulator", },
> + {
> + .name = "rk808-rtc",
> + .num_resources = ARRAY_SIZE(rtc_resources),
> + .resources = &rtc_resources[0],
> + },
> +};
> +
> +static const struct rk8xx_reg_data rk808_pre_init_reg[] = {
> { RK808_BUCK3_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_150MA },
> { RK808_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_200MA },
> { RK808_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, BOOST_ILMIN_100MA },
> @@ -94,6 +111,22 @@ static const struct rk808_reg_data pre_init_reg[] = {
> VB_LO_SEL_3500MV },
> };
>
> +static const struct rk8xx_reg_data rk818_pre_init_reg[] = {
> + { RK818_USB_CTRL_REG, RK818_USB_ILIM_SEL_MASK,
> + RK818_USB_ILMIN_2000MA },
> + /* close charger when usb lower then 3.4V */
> + { RK818_USB_CTRL_REG, RK818_USB_CHG_SD_VSEL_MASK, (0x7 << 4) },
> + /* no action when vref */
> + { RK818_H5V_EN_REG, BIT(1), RK818_REF_RDY_CTRL },
> + /* enable HDMI 5V */
> + { RK818_H5V_EN_REG, BIT(0), RK818_H5V_EN },
> + /* improve efficiency */
> + { RK818_BUCK2_CONFIG_REG, BUCK2_RATE_MASK, BUCK_ILMIN_250MA },
> + { RK818_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_250MA },
> + { RK818_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, BOOST_ILMIN_100MA },
> + { RK808_VB_MON_REG, MASK_ALL, VB_LO_ACT | VB_LO_SEL_3500MV },
> +};
> +
> static const struct regmap_irq rk808_irqs[] = {
> /* INT_STS */
> [RK808_IRQ_VOUT_LO] = {
> @@ -136,6 +169,76 @@ static const struct regmap_irq rk808_irqs[] = {
> },
> };
>
> +static const struct regmap_irq rk818_irqs[] = {
> + /* INT_STS */
> + [RK818_IRQ_VOUT_LO] = {
> + .mask = RK818_IRQ_VOUT_LO_MSK,
> + .reg_offset = 0,
> + },
> + [RK818_IRQ_VB_LO] = {
> + .mask = RK818_IRQ_VB_LO_MSK,
> + .reg_offset = 0,
> + },
> + [RK818_IRQ_PWRON] = {
> + .mask = RK818_IRQ_PWRON_MSK,
> + .reg_offset = 0,
> + },
> + [RK818_IRQ_PWRON_LP] = {
> + .mask = RK818_IRQ_PWRON_LP_MSK,
> + .reg_offset = 0,
> + },
> + [RK818_IRQ_HOTDIE] = {
> + .mask = RK818_IRQ_HOTDIE_MSK,
> + .reg_offset = 0,
> + },
> + [RK818_IRQ_RTC_ALARM] = {
> + .mask = RK818_IRQ_RTC_ALARM_MSK,
> + .reg_offset = 0,
> + },
> + [RK818_IRQ_RTC_PERIOD] = {
> + .mask = RK818_IRQ_RTC_PERIOD_MSK,
> + .reg_offset = 0,
> + },
> + [RK818_IRQ_USB_OV] = {
> + .mask = RK818_IRQ_USB_OV_MSK,
> + .reg_offset = 0,
> + },
> +
> + /* INT_STS2 */
> + [RK818_IRQ_PLUG_IN] = {
> + .mask = RK818_IRQ_PLUG_IN_MSK,
> + .reg_offset = 1,
> + },
> + [RK818_IRQ_PLUG_OUT] = {
> + .mask = RK818_IRQ_PLUG_OUT_MSK,
> + .reg_offset = 1,
> + },
> + [RK818_IRQ_CHG_OK] = {
> + .mask = RK818_IRQ_CHG_OK_MSK,
> + .reg_offset = 1,
> + },
> + [RK818_IRQ_CHG_TE] = {
> + .mask = RK818_IRQ_CHG_TE_MSK,
> + .reg_offset = 1,
> + },
> + [RK818_IRQ_CHG_TS1] = {
> + .mask = RK818_IRQ_CHG_TS1_MSK,
> + .reg_offset = 1,
> + },
> + [RK818_IRQ_TS2] = {
> + .mask = RK818_IRQ_TS2_MSK,
> + .reg_offset = 1,
> + },
> + [RK818_IRQ_CHG_CVTLIM] = {
> + .mask = RK818_IRQ_CHG_CVTLIM_MSK,
> + .reg_offset = 1,
> + },
> + [RK818_IRQ_DISCHG_ILIM] = {
> + .mask = RK818_IRQ_DISCHG_ILIM_MSK,
> + .reg_offset = 1,
> + },
> +};
> +
> static struct regmap_irq_chip rk808_irq_chip = {
> .name = "rk808",
> .irqs = rk808_irqs,
> @@ -148,6 +251,18 @@ static struct regmap_irq_chip rk808_irq_chip = {
> .init_ack_masked = true,
> };
>
> +static struct regmap_irq_chip rk818_irq_chip = {
> + .name = "rk818",
> + .irqs = rk818_irqs,
> + .num_irqs = ARRAY_SIZE(rk818_irqs),
> + .num_regs = 2,
> + .irq_reg_stride = 2,
> + .status_base = RK818_INT_STS_REG1,
> + .mask_base = RK818_INT_STS_MSK_REG1,
> + .ack_base = RK818_INT_STS_REG1,
> + .init_ack_masked = true,
> +};
> +
> static struct i2c_client *rk808_i2c_client;
> static void rk808_device_shutdown(void)
> {
> @@ -167,6 +282,48 @@ static void rk808_device_shutdown(void)
> dev_err(&rk808_i2c_client->dev, "power off error!\n");
> }
>
> +static const struct of_device_id rk808_of_match[] = {
> + { .compatible = "rockchip,rk808", .data = (void *) RK808_ID },
> + { .compatible = "rockchip,rk818", .data = (void *) RK818_ID },
> + { },
> +};
> +MODULE_DEVICE_TABLE(of, rk808_of_match);
> +
> +static int rk8xx_match_device(struct rk808 *rk808, struct device *dev)
> +{
> + const struct of_device_id *of_id;
> +
> + of_id = of_match_device(rk808_of_match, dev);
> + if (!of_id) {
> + dev_err(dev, "Unable to match OF ID\n");
> + return -ENODEV;
> + }
> + rk808->variant = (long) of_id->data;
> +
> + switch (rk808->variant) {
> + case RK808_ID:
> + rk808->nr_cells = ARRAY_SIZE(rk808s);
> + rk808->cells = rk808s;
> + rk808->regmap_cfg = &rk808_regmap_config;
> + rk808->regmap_irq_chip = &rk808_irq_chip;
> + rk808->pre_init_reg = rk808_pre_init_reg;
> + rk808->nr_pre_init_regs = ARRAY_SIZE(rk808_pre_init_reg);
> + break;
> + case RK818_ID:
> + rk808->nr_cells = ARRAY_SIZE(rk818s);
> + rk808->cells = rk818s;
> + rk808->regmap_cfg = &rk818_regmap_config;
> + rk808->regmap_irq_chip = &rk818_irq_chip;
> + rk808->pre_init_reg = rk818_pre_init_reg;
> + rk808->nr_pre_init_regs = ARRAY_SIZE(rk818_pre_init_reg);
> + break;
> + default:
> + dev_err(dev, "unsupported RK8XX ID %lu\n", rk808->variant);
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> static int rk808_probe(struct i2c_client *client,
> const struct i2c_device_id *id)
> {
> @@ -176,45 +333,51 @@ static int rk808_probe(struct i2c_client *client,
> int ret;
> int i;
>
> - if (!client->irq) {
> - dev_err(&client->dev, "No interrupt support, no core IRQ\n");
> - return -EINVAL;
> - }
> -
> rk808 = devm_kzalloc(&client->dev, sizeof(*rk808), GFP_KERNEL);
> if (!rk808)
> return -ENOMEM;
>
> - rk808->regmap = devm_regmap_init_i2c(client, &rk808_regmap_config);
> + ret = rk8xx_match_device(rk808, &client->dev);
> + if (ret)
> + return ret;
> +
> + rk808->i2c = client;
> + i2c_set_clientdata(client, rk808);
> +
> + rk808->regmap = devm_regmap_init_i2c(client, rk808->regmap_cfg);
> if (IS_ERR(rk808->regmap)) {
> dev_err(&client->dev, "regmap initialization failed\n");
> return PTR_ERR(rk808->regmap);
> }
>
> - for (i = 0; i < ARRAY_SIZE(pre_init_reg); i++) {
> - ret = regmap_update_bits(rk808->regmap, pre_init_reg[i].addr,
> - pre_init_reg[i].mask,
> - pre_init_reg[i].value);
> - if (ret) {
> - dev_err(&client->dev,
> - "0x%x write err\n", pre_init_reg[i].addr);
> - return ret;
> - }
> + if (!client->irq) {
> + dev_err(&client->dev, "No interrupt support, no core IRQ\n");
> + return -EINVAL;
> }
>
> ret = regmap_add_irq_chip(rk808->regmap, client->irq,
> IRQF_ONESHOT, -1,
> - &rk808_irq_chip, &rk808->irq_data);
> + rk808->regmap_irq_chip, &rk808->irq_data);
> if (ret) {
> dev_err(&client->dev, "Failed to add irq_chip %d\n", ret);
> return ret;
> }
>
> - rk808->i2c = client;
> - i2c_set_clientdata(client, rk808);
> + for (i = 0; i < rk808->nr_pre_init_regs; i++) {
> + ret = regmap_update_bits(rk808->regmap,
> + rk808->pre_init_reg[i].addr,
> + rk808->pre_init_reg[i].mask,
> + rk808->pre_init_reg[i].value);
> + if (ret) {
> + dev_err(&client->dev,
> + "0x%x write err\n",
> + rk808->pre_init_reg[i].addr);
> + return ret;
> + }
> + }
>
> - ret = mfd_add_devices(&client->dev, -1,
> - rk808s, ARRAY_SIZE(rk808s),
> + ret = mfd_add_devices(&client->dev, PLATFORM_DEVID_NONE,
> + rk808->cells, rk808->nr_cells,
> NULL, 0, regmap_irq_get_domain(rk808->irq_data));
> if (ret) {
> dev_err(&client->dev, "failed to add MFD devices %d\n", ret);
> @@ -246,14 +409,9 @@ static int rk808_remove(struct i2c_client *client)
> return 0;
> }
>
> -static const struct of_device_id rk808_of_match[] = {
> - { .compatible = "rockchip,rk808" },
> - { },
> -};
> -MODULE_DEVICE_TABLE(of, rk808_of_match);
> -
> static const struct i2c_device_id rk808_ids[] = {
> { "rk808" },
> + { "rk818" },
> { },
> };
> MODULE_DEVICE_TABLE(i2c, rk808_ids);
> @@ -273,4 +431,5 @@ module_i2c_driver(rk808_i2c_driver);
> MODULE_LICENSE("GPL");
> MODULE_AUTHOR("Chris Zhong <zyw@rock-chips.com>");
> MODULE_AUTHOR("Zhang Qing <zhangqing@rock-chips.com>");
> -MODULE_DESCRIPTION("RK808 PMIC driver");
> +MODULE_AUTHOR("Wadim Egorov <w.egorov@phytec.de>");
> +MODULE_DESCRIPTION("RK808/RK818 PMIC driver");
> diff --git a/include/linux/mfd/rk808.h b/include/linux/mfd/rk808.h
> index 441b6ee..5ce810c 100644
> --- a/include/linux/mfd/rk808.h
> +++ b/include/linux/mfd/rk808.h
> @@ -1,11 +1,15 @@
> /*
> - * rk808.h for Rockchip RK808
> + * Register definitions for Rockchip's RK808/RK818 PMIC
> *
> * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
> *
> * Author: Chris Zhong <zyw@rock-chips.com>
> * Author: Zhang Qing <zhangqing@rock-chips.com>
> *
> + * Copyright (C) 2016 PHYTEC Messtechnik GmbH
> + *
> + * Author: Wadim Egorov <w.egorov@phytec.de>
> + *
> * This program is free software; you can redistribute it and/or modify it
> * under the terms and conditions of the GNU General Public License,
> * version 2, as published by the Free Software Foundation.
> @@ -16,8 +20,8 @@
> * more details.
> */
>
> -#ifndef __LINUX_REGULATOR_rk808_H
> -#define __LINUX_REGULATOR_rk808_H
> +#ifndef __LINUX_REGULATOR_RK808_H
> +#define __LINUX_REGULATOR_RK808_H
>
> #include <linux/regulator/machine.h>
> #include <linux/regmap.h>
> @@ -28,7 +32,7 @@
>
> #define RK808_DCDC1 0 /* (0+RK808_START) */
> #define RK808_LDO1 4 /* (4+RK808_START) */
> -#define RK808_NUM_REGULATORS 14
> +#define RK808_NUM_REGULATORS 14
>
> enum rk808_reg {
> RK808_ID_DCDC1,
> @@ -115,7 +119,92 @@ enum rk808_reg {
> #define RK808_INT_STS_MSK_REG2 0x4f
> #define RK808_IO_POL_REG 0x50
>
> -/* IRQ Definitions */
> +/* RK818 */
> +#define RK818_DCDC1 0
> +#define RK818_LDO1 4
> +#define RK818_NUM_REGULATORS 17
> +
> +enum rk818_reg {
> + RK818_ID_DCDC1,
> + RK818_ID_DCDC2,
> + RK818_ID_DCDC3,
> + RK818_ID_DCDC4,
> + RK818_ID_BOOST,
> + RK818_ID_LDO1,
> + RK818_ID_LDO2,
> + RK818_ID_LDO3,
> + RK818_ID_LDO4,
> + RK818_ID_LDO5,
> + RK818_ID_LDO6,
> + RK818_ID_LDO7,
> + RK818_ID_LDO8,
> + RK818_ID_LDO9,
> + RK818_ID_SWITCH,
> + RK818_ID_HDMI_SWITCH,
> + RK818_ID_OTG_SWITCH,
> +};
> +
> +#define RK818_DCDC_EN_REG 0x23
> +#define RK818_LDO_EN_REG 0x24
> +#define RK818_SLEEP_SET_OFF_REG1 0x25
> +#define RK818_SLEEP_SET_OFF_REG2 0x26
> +#define RK818_DCDC_UV_STS_REG 0x27
> +#define RK818_DCDC_UV_ACT_REG 0x28
> +#define RK818_LDO_UV_STS_REG 0x29
> +#define RK818_LDO_UV_ACT_REG 0x2a
> +#define RK818_DCDC_PG_REG 0x2b
> +#define RK818_LDO_PG_REG 0x2c
> +#define RK818_VOUT_MON_TDB_REG 0x2d
> +#define RK818_BUCK1_CONFIG_REG 0x2e
> +#define RK818_BUCK1_ON_VSEL_REG 0x2f
> +#define RK818_BUCK1_SLP_VSEL_REG 0x30
> +#define RK818_BUCK2_CONFIG_REG 0x32
> +#define RK818_BUCK2_ON_VSEL_REG 0x33
> +#define RK818_BUCK2_SLP_VSEL_REG 0x34
> +#define RK818_BUCK3_CONFIG_REG 0x36
> +#define RK818_BUCK4_CONFIG_REG 0x37
> +#define RK818_BUCK4_ON_VSEL_REG 0x38
> +#define RK818_BUCK4_SLP_VSEL_REG 0x39
> +#define RK818_BOOST_CONFIG_REG 0x3a
> +#define RK818_LDO1_ON_VSEL_REG 0x3b
> +#define RK818_LDO1_SLP_VSEL_REG 0x3c
> +#define RK818_LDO2_ON_VSEL_REG 0x3d
> +#define RK818_LDO2_SLP_VSEL_REG 0x3e
> +#define RK818_LDO3_ON_VSEL_REG 0x3f
> +#define RK818_LDO3_SLP_VSEL_REG 0x40
> +#define RK818_LDO4_ON_VSEL_REG 0x41
> +#define RK818_LDO4_SLP_VSEL_REG 0x42
> +#define RK818_LDO5_ON_VSEL_REG 0x43
> +#define RK818_LDO5_SLP_VSEL_REG 0x44
> +#define RK818_LDO6_ON_VSEL_REG 0x45
> +#define RK818_LDO6_SLP_VSEL_REG 0x46
> +#define RK818_LDO7_ON_VSEL_REG 0x47
> +#define RK818_LDO7_SLP_VSEL_REG 0x48
> +#define RK818_LDO8_ON_VSEL_REG 0x49
> +#define RK818_LDO8_SLP_VSEL_REG 0x4a
> +#define RK818_BOOST_LDO9_ON_VSEL_REG 0x54
> +#define RK818_BOOST_LDO9_SLP_VSEL_REG 0x55
> +#define RK818_DEVCTRL_REG 0x4b
> +#define RK818_INT_STS_REG1 0X4c
> +#define RK818_INT_STS_MSK_REG1 0x4d
> +#define RK818_INT_STS_REG2 0x4e
> +#define RK818_INT_STS_MSK_REG2 0x4f
> +#define RK818_IO_POL_REG 0x50
> +#define RK818_H5V_EN_REG 0x52
> +#define RK818_SLEEP_SET_OFF_REG3 0x53
> +#define RK818_BOOST_LDO9_ON_VSEL_REG 0x54
> +#define RK818_BOOST_LDO9_SLP_VSEL_REG 0x55
> +#define RK818_BOOST_CTRL_REG 0x56
> +#define RK818_DCDC_ILMAX 0x90
> +#define RK818_USB_CTRL_REG 0xa1
> +
> +#define RK818_H5V_EN BIT(0)
> +#define RK818_REF_RDY_CTRL BIT(1)
> +#define RK818_USB_ILIM_SEL_MASK 0xf
> +#define RK818_USB_ILMIN_2000MA 0x7
> +#define RK818_USB_CHG_SD_VSEL_MASK 0x70
> +
> +/* RK808 IRQ Definitions */
> #define RK808_IRQ_VOUT_LO 0
> #define RK808_IRQ_VB_LO 1
> #define RK808_IRQ_PWRON 2
> @@ -137,6 +226,43 @@ enum rk808_reg {
> #define RK808_IRQ_PLUG_IN_INT_MSK BIT(0)
> #define RK808_IRQ_PLUG_OUT_INT_MSK BIT(1)
>
> +/* RK818 IRQ Definitions */
> +#define RK818_IRQ_VOUT_LO 0
> +#define RK818_IRQ_VB_LO 1
> +#define RK818_IRQ_PWRON 2
> +#define RK818_IRQ_PWRON_LP 3
> +#define RK818_IRQ_HOTDIE 4
> +#define RK818_IRQ_RTC_ALARM 5
> +#define RK818_IRQ_RTC_PERIOD 6
> +#define RK818_IRQ_USB_OV 7
> +#define RK818_IRQ_PLUG_IN 8
> +#define RK818_IRQ_PLUG_OUT 9
> +#define RK818_IRQ_CHG_OK 10
> +#define RK818_IRQ_CHG_TE 11
> +#define RK818_IRQ_CHG_TS1 12
> +#define RK818_IRQ_TS2 13
> +#define RK818_IRQ_CHG_CVTLIM 14
> +#define RK818_IRQ_DISCHG_ILIM 7
> +
> +#define RK818_IRQ_VOUT_LO_MSK BIT(0)
> +#define RK818_IRQ_VB_LO_MSK BIT(1)
> +#define RK818_IRQ_PWRON_MSK BIT(2)
> +#define RK818_IRQ_PWRON_LP_MSK BIT(3)
> +#define RK818_IRQ_HOTDIE_MSK BIT(4)
> +#define RK818_IRQ_RTC_ALARM_MSK BIT(5)
> +#define RK818_IRQ_RTC_PERIOD_MSK BIT(6)
> +#define RK818_IRQ_USB_OV_MSK BIT(7)
> +#define RK818_IRQ_PLUG_IN_MSK BIT(0)
> +#define RK818_IRQ_PLUG_OUT_MSK BIT(1)
> +#define RK818_IRQ_CHG_OK_MSK BIT(2)
> +#define RK818_IRQ_CHG_TE_MSK BIT(3)
> +#define RK818_IRQ_CHG_TS1_MSK BIT(4)
> +#define RK818_IRQ_TS2_MSK BIT(5)
> +#define RK818_IRQ_CHG_CVTLIM_MSK BIT(6)
> +#define RK818_IRQ_DISCHG_ILIM_MSK BIT(7)
> +
> +#define RK818_NUM_IRQ 16
> +
> #define RK808_VBAT_LOW_2V8 0x00
> #define RK808_VBAT_LOW_2V9 0x01
> #define RK808_VBAT_LOW_3V0 0x02
> @@ -191,9 +317,27 @@ enum {
> BOOST_ILMIN_250MA,
> };
>
> +enum {
> + RK808_ID,
> + RK818_ID,
> +};
> +
> +struct rk8xx_reg_data {
> + int addr;
> + int mask;
> + int value;
> +};
> +
> struct rk808 {
> - struct i2c_client *i2c;
> - struct regmap_irq_chip_data *irq_data;
> - struct regmap *regmap;
> + struct i2c_client *i2c;
> + struct regmap_irq_chip_data *irq_data;
> + struct regmap *regmap;
> + long variant;
> + int nr_cells;
> + const struct mfd_cell *cells;
> + const struct regmap_config *regmap_cfg;
> + const struct regmap_irq_chip *regmap_irq_chip;
> + const struct rk8xx_reg_data *pre_init_reg;
> + int nr_pre_init_regs;
> };
> -#endif /* __LINUX_REGULATOR_rk808_H */
> +#endif /* __LINUX_REGULATOR_RK808_H */
--
--
You received this message because you are subscribed to "rtc-linux".
Membership options at http://groups.google.com/group/rtc-linux .
Please read http://groups.google.com/group/rtc-linux/web/checklist
before submitting a driver.
---
You received this message because you are subscribed to the Google Groups "rtc-linux" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [PATCH v4 3/7] mfd: RK808: Add RK818 support
2016-05-10 6:51 ` [rtc-linux] " Wadim Egorov
@ 2016-05-10 7:54 ` Lee Jones
-1 siblings, 0 replies; 34+ messages in thread
From: Lee Jones @ 2016-05-10 7:54 UTC (permalink / raw)
To: Wadim Egorov
Cc: linux-kernel, linux-clk, rtc-linux, devicetree, linux-rockchip,
mark.rutland, a.zummo, pawel.moll, ijc+devicetree, mturquette,
sboyd, lgirdwood, dianders, robh+dt, alexandre.belloni, broonie,
galak, zyw
On Tue, 10 May 2016, Wadim Egorov wrote:
> Ping.
Don't ping. It only serves to annoy!
> Do you have any more comments?
Just re-submit the set with the Acks you've collected.
> On 26.04.2016 16:54, Wadim Egorov wrote:
> > The RK818 chip is a power management IC for multimedia and handheld
> > devices. It contains the following components:
> >
> > - Regulators
> > - RTC
> > - Clkout
> > - battery support
> >
> > Both chips RK808 and RK818 are using a similar register map.
> > So we can reuse the RTC and Clkout functionality.
> >
> > Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
> > ---
> > Changes since v3:
> > - fixed file and module descriptions
> > ---
> > drivers/mfd/Kconfig | 4 +-
> > drivers/mfd/rk808.c | 229 +++++++++++++++++++++++++++++++++++++++-------
> > include/linux/mfd/rk808.h | 162 ++++++++++++++++++++++++++++++--
> > 3 files changed, 349 insertions(+), 46 deletions(-)
> >
> > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> > index eea61e3..0a5b1c0 100644
> > --- a/drivers/mfd/Kconfig
> > +++ b/drivers/mfd/Kconfig
> > @@ -814,13 +814,13 @@ config MFD_RC5T583
> > different functionality of the device.
> >
> > config MFD_RK808
> > - tristate "Rockchip RK808 Power Management chip"
> > + tristate "Rockchip RK808/RK818 Power Management chip"
> > depends on I2C && OF
> > select MFD_CORE
> > select REGMAP_I2C
> > select REGMAP_IRQ
> > help
> > - If you say yes here you get support for the RK808
> > + If you say yes here you get support for the RK808 and RK818
> > Power Management chips.
> > This driver provides common support for accessing the device
> > through I2C interface. The device supports multiple sub-devices
> > diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c
> > index 4b1e439..9bb7e8c 100644
> > --- a/drivers/mfd/rk808.c
> > +++ b/drivers/mfd/rk808.c
> > @@ -1,11 +1,15 @@
> > /*
> > - * MFD core driver for Rockchip RK808
> > + * MFD core driver for Rockchip RK808/RK818
> > *
> > * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
> > *
> > * Author: Chris Zhong <zyw@rock-chips.com>
> > * Author: Zhang Qing <zhangqing@rock-chips.com>
> > *
> > + * Copyright (C) 2016 PHYTEC Messtechnik GmbH
> > + *
> > + * Author: Wadim Egorov <w.egorov@phytec.de>
> > + *
> > * This program is free software; you can redistribute it and/or modify it
> > * under the terms and conditions of the GNU General Public License,
> > * version 2, as published by the Free Software Foundation.
> > @@ -22,12 +26,7 @@
> > #include <linux/mfd/core.h>
> > #include <linux/module.h>
> > #include <linux/regmap.h>
> > -
> > -struct rk808_reg_data {
> > - int addr;
> > - int mask;
> > - int value;
> > -};
> > +#include <linux/of_device.h>
> >
> > static bool rk808_is_volatile_reg(struct device *dev, unsigned int reg)
> > {
> > @@ -57,6 +56,14 @@ static bool rk808_is_volatile_reg(struct device *dev, unsigned int reg)
> > return false;
> > }
> >
> > +static const struct regmap_config rk818_regmap_config = {
> > + .reg_bits = 8,
> > + .val_bits = 8,
> > + .max_register = RK818_USB_CTRL_REG,
> > + .cache_type = REGCACHE_RBTREE,
> > + .volatile_reg = rk808_is_volatile_reg,
> > +};
> > +
> > static const struct regmap_config rk808_regmap_config = {
> > .reg_bits = 8,
> > .val_bits = 8,
> > @@ -83,7 +90,17 @@ static const struct mfd_cell rk808s[] = {
> > },
> > };
> >
> > -static const struct rk808_reg_data pre_init_reg[] = {
> > +static const struct mfd_cell rk818s[] = {
> > + { .name = "rk808-clkout", },
> > + { .name = "rk808-regulator", },
> > + {
> > + .name = "rk808-rtc",
> > + .num_resources = ARRAY_SIZE(rtc_resources),
> > + .resources = &rtc_resources[0],
> > + },
> > +};
> > +
> > +static const struct rk8xx_reg_data rk808_pre_init_reg[] = {
> > { RK808_BUCK3_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_150MA },
> > { RK808_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_200MA },
> > { RK808_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, BOOST_ILMIN_100MA },
> > @@ -94,6 +111,22 @@ static const struct rk808_reg_data pre_init_reg[] = {
> > VB_LO_SEL_3500MV },
> > };
> >
> > +static const struct rk8xx_reg_data rk818_pre_init_reg[] = {
> > + { RK818_USB_CTRL_REG, RK818_USB_ILIM_SEL_MASK,
> > + RK818_USB_ILMIN_2000MA },
> > + /* close charger when usb lower then 3.4V */
> > + { RK818_USB_CTRL_REG, RK818_USB_CHG_SD_VSEL_MASK, (0x7 << 4) },
> > + /* no action when vref */
> > + { RK818_H5V_EN_REG, BIT(1), RK818_REF_RDY_CTRL },
> > + /* enable HDMI 5V */
> > + { RK818_H5V_EN_REG, BIT(0), RK818_H5V_EN },
> > + /* improve efficiency */
> > + { RK818_BUCK2_CONFIG_REG, BUCK2_RATE_MASK, BUCK_ILMIN_250MA },
> > + { RK818_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_250MA },
> > + { RK818_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, BOOST_ILMIN_100MA },
> > + { RK808_VB_MON_REG, MASK_ALL, VB_LO_ACT | VB_LO_SEL_3500MV },
> > +};
> > +
> > static const struct regmap_irq rk808_irqs[] = {
> > /* INT_STS */
> > [RK808_IRQ_VOUT_LO] = {
> > @@ -136,6 +169,76 @@ static const struct regmap_irq rk808_irqs[] = {
> > },
> > };
> >
> > +static const struct regmap_irq rk818_irqs[] = {
> > + /* INT_STS */
> > + [RK818_IRQ_VOUT_LO] = {
> > + .mask = RK818_IRQ_VOUT_LO_MSK,
> > + .reg_offset = 0,
> > + },
> > + [RK818_IRQ_VB_LO] = {
> > + .mask = RK818_IRQ_VB_LO_MSK,
> > + .reg_offset = 0,
> > + },
> > + [RK818_IRQ_PWRON] = {
> > + .mask = RK818_IRQ_PWRON_MSK,
> > + .reg_offset = 0,
> > + },
> > + [RK818_IRQ_PWRON_LP] = {
> > + .mask = RK818_IRQ_PWRON_LP_MSK,
> > + .reg_offset = 0,
> > + },
> > + [RK818_IRQ_HOTDIE] = {
> > + .mask = RK818_IRQ_HOTDIE_MSK,
> > + .reg_offset = 0,
> > + },
> > + [RK818_IRQ_RTC_ALARM] = {
> > + .mask = RK818_IRQ_RTC_ALARM_MSK,
> > + .reg_offset = 0,
> > + },
> > + [RK818_IRQ_RTC_PERIOD] = {
> > + .mask = RK818_IRQ_RTC_PERIOD_MSK,
> > + .reg_offset = 0,
> > + },
> > + [RK818_IRQ_USB_OV] = {
> > + .mask = RK818_IRQ_USB_OV_MSK,
> > + .reg_offset = 0,
> > + },
> > +
> > + /* INT_STS2 */
> > + [RK818_IRQ_PLUG_IN] = {
> > + .mask = RK818_IRQ_PLUG_IN_MSK,
> > + .reg_offset = 1,
> > + },
> > + [RK818_IRQ_PLUG_OUT] = {
> > + .mask = RK818_IRQ_PLUG_OUT_MSK,
> > + .reg_offset = 1,
> > + },
> > + [RK818_IRQ_CHG_OK] = {
> > + .mask = RK818_IRQ_CHG_OK_MSK,
> > + .reg_offset = 1,
> > + },
> > + [RK818_IRQ_CHG_TE] = {
> > + .mask = RK818_IRQ_CHG_TE_MSK,
> > + .reg_offset = 1,
> > + },
> > + [RK818_IRQ_CHG_TS1] = {
> > + .mask = RK818_IRQ_CHG_TS1_MSK,
> > + .reg_offset = 1,
> > + },
> > + [RK818_IRQ_TS2] = {
> > + .mask = RK818_IRQ_TS2_MSK,
> > + .reg_offset = 1,
> > + },
> > + [RK818_IRQ_CHG_CVTLIM] = {
> > + .mask = RK818_IRQ_CHG_CVTLIM_MSK,
> > + .reg_offset = 1,
> > + },
> > + [RK818_IRQ_DISCHG_ILIM] = {
> > + .mask = RK818_IRQ_DISCHG_ILIM_MSK,
> > + .reg_offset = 1,
> > + },
> > +};
> > +
> > static struct regmap_irq_chip rk808_irq_chip = {
> > .name = "rk808",
> > .irqs = rk808_irqs,
> > @@ -148,6 +251,18 @@ static struct regmap_irq_chip rk808_irq_chip = {
> > .init_ack_masked = true,
> > };
> >
> > +static struct regmap_irq_chip rk818_irq_chip = {
> > + .name = "rk818",
> > + .irqs = rk818_irqs,
> > + .num_irqs = ARRAY_SIZE(rk818_irqs),
> > + .num_regs = 2,
> > + .irq_reg_stride = 2,
> > + .status_base = RK818_INT_STS_REG1,
> > + .mask_base = RK818_INT_STS_MSK_REG1,
> > + .ack_base = RK818_INT_STS_REG1,
> > + .init_ack_masked = true,
> > +};
> > +
> > static struct i2c_client *rk808_i2c_client;
> > static void rk808_device_shutdown(void)
> > {
> > @@ -167,6 +282,48 @@ static void rk808_device_shutdown(void)
> > dev_err(&rk808_i2c_client->dev, "power off error!\n");
> > }
> >
> > +static const struct of_device_id rk808_of_match[] = {
> > + { .compatible = "rockchip,rk808", .data = (void *) RK808_ID },
> > + { .compatible = "rockchip,rk818", .data = (void *) RK818_ID },
> > + { },
> > +};
> > +MODULE_DEVICE_TABLE(of, rk808_of_match);
> > +
> > +static int rk8xx_match_device(struct rk808 *rk808, struct device *dev)
> > +{
> > + const struct of_device_id *of_id;
> > +
> > + of_id = of_match_device(rk808_of_match, dev);
> > + if (!of_id) {
> > + dev_err(dev, "Unable to match OF ID\n");
> > + return -ENODEV;
> > + }
> > + rk808->variant = (long) of_id->data;
> > +
> > + switch (rk808->variant) {
> > + case RK808_ID:
> > + rk808->nr_cells = ARRAY_SIZE(rk808s);
> > + rk808->cells = rk808s;
> > + rk808->regmap_cfg = &rk808_regmap_config;
> > + rk808->regmap_irq_chip = &rk808_irq_chip;
> > + rk808->pre_init_reg = rk808_pre_init_reg;
> > + rk808->nr_pre_init_regs = ARRAY_SIZE(rk808_pre_init_reg);
> > + break;
> > + case RK818_ID:
> > + rk808->nr_cells = ARRAY_SIZE(rk818s);
> > + rk808->cells = rk818s;
> > + rk808->regmap_cfg = &rk818_regmap_config;
> > + rk808->regmap_irq_chip = &rk818_irq_chip;
> > + rk808->pre_init_reg = rk818_pre_init_reg;
> > + rk808->nr_pre_init_regs = ARRAY_SIZE(rk818_pre_init_reg);
> > + break;
> > + default:
> > + dev_err(dev, "unsupported RK8XX ID %lu\n", rk808->variant);
> > + return -EINVAL;
> > + }
> > +
> > + return 0;
> > +}
> > static int rk808_probe(struct i2c_client *client,
> > const struct i2c_device_id *id)
> > {
> > @@ -176,45 +333,51 @@ static int rk808_probe(struct i2c_client *client,
> > int ret;
> > int i;
> >
> > - if (!client->irq) {
> > - dev_err(&client->dev, "No interrupt support, no core IRQ\n");
> > - return -EINVAL;
> > - }
> > -
> > rk808 = devm_kzalloc(&client->dev, sizeof(*rk808), GFP_KERNEL);
> > if (!rk808)
> > return -ENOMEM;
> >
> > - rk808->regmap = devm_regmap_init_i2c(client, &rk808_regmap_config);
> > + ret = rk8xx_match_device(rk808, &client->dev);
> > + if (ret)
> > + return ret;
> > +
> > + rk808->i2c = client;
> > + i2c_set_clientdata(client, rk808);
> > +
> > + rk808->regmap = devm_regmap_init_i2c(client, rk808->regmap_cfg);
> > if (IS_ERR(rk808->regmap)) {
> > dev_err(&client->dev, "regmap initialization failed\n");
> > return PTR_ERR(rk808->regmap);
> > }
> >
> > - for (i = 0; i < ARRAY_SIZE(pre_init_reg); i++) {
> > - ret = regmap_update_bits(rk808->regmap, pre_init_reg[i].addr,
> > - pre_init_reg[i].mask,
> > - pre_init_reg[i].value);
> > - if (ret) {
> > - dev_err(&client->dev,
> > - "0x%x write err\n", pre_init_reg[i].addr);
> > - return ret;
> > - }
> > + if (!client->irq) {
> > + dev_err(&client->dev, "No interrupt support, no core IRQ\n");
> > + return -EINVAL;
> > }
> >
> > ret = regmap_add_irq_chip(rk808->regmap, client->irq,
> > IRQF_ONESHOT, -1,
> > - &rk808_irq_chip, &rk808->irq_data);
> > + rk808->regmap_irq_chip, &rk808->irq_data);
> > if (ret) {
> > dev_err(&client->dev, "Failed to add irq_chip %d\n", ret);
> > return ret;
> > }
> >
> > - rk808->i2c = client;
> > - i2c_set_clientdata(client, rk808);
> > + for (i = 0; i < rk808->nr_pre_init_regs; i++) {
> > + ret = regmap_update_bits(rk808->regmap,
> > + rk808->pre_init_reg[i].addr,
> > + rk808->pre_init_reg[i].mask,
> > + rk808->pre_init_reg[i].value);
> > + if (ret) {
> > + dev_err(&client->dev,
> > + "0x%x write err\n",
> > + rk808->pre_init_reg[i].addr);
> > + return ret;
> > + }
> > + }
> >
> > - ret = mfd_add_devices(&client->dev, -1,
> > - rk808s, ARRAY_SIZE(rk808s),
> > + ret = mfd_add_devices(&client->dev, PLATFORM_DEVID_NONE,
> > + rk808->cells, rk808->nr_cells,
> > NULL, 0, regmap_irq_get_domain(rk808->irq_data));
> > if (ret) {
> > dev_err(&client->dev, "failed to add MFD devices %d\n", ret);
> > @@ -246,14 +409,9 @@ static int rk808_remove(struct i2c_client *client)
> > return 0;
> > }
> >
> > -static const struct of_device_id rk808_of_match[] = {
> > - { .compatible = "rockchip,rk808" },
> > - { },
> > -};
> > -MODULE_DEVICE_TABLE(of, rk808_of_match);
> > -
> > static const struct i2c_device_id rk808_ids[] = {
> > { "rk808" },
> > + { "rk818" },
> > { },
> > };
> > MODULE_DEVICE_TABLE(i2c, rk808_ids);
> > @@ -273,4 +431,5 @@ module_i2c_driver(rk808_i2c_driver);
> > MODULE_LICENSE("GPL");
> > MODULE_AUTHOR("Chris Zhong <zyw@rock-chips.com>");
> > MODULE_AUTHOR("Zhang Qing <zhangqing@rock-chips.com>");
> > -MODULE_DESCRIPTION("RK808 PMIC driver");
> > +MODULE_AUTHOR("Wadim Egorov <w.egorov@phytec.de>");
> > +MODULE_DESCRIPTION("RK808/RK818 PMIC driver");
> > diff --git a/include/linux/mfd/rk808.h b/include/linux/mfd/rk808.h
> > index 441b6ee..5ce810c 100644
> > --- a/include/linux/mfd/rk808.h
> > +++ b/include/linux/mfd/rk808.h
> > @@ -1,11 +1,15 @@
> > /*
> > - * rk808.h for Rockchip RK808
> > + * Register definitions for Rockchip's RK808/RK818 PMIC
> > *
> > * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
> > *
> > * Author: Chris Zhong <zyw@rock-chips.com>
> > * Author: Zhang Qing <zhangqing@rock-chips.com>
> > *
> > + * Copyright (C) 2016 PHYTEC Messtechnik GmbH
> > + *
> > + * Author: Wadim Egorov <w.egorov@phytec.de>
> > + *
> > * This program is free software; you can redistribute it and/or modify it
> > * under the terms and conditions of the GNU General Public License,
> > * version 2, as published by the Free Software Foundation.
> > @@ -16,8 +20,8 @@
> > * more details.
> > */
> >
> > -#ifndef __LINUX_REGULATOR_rk808_H
> > -#define __LINUX_REGULATOR_rk808_H
> > +#ifndef __LINUX_REGULATOR_RK808_H
> > +#define __LINUX_REGULATOR_RK808_H
> >
> > #include <linux/regulator/machine.h>
> > #include <linux/regmap.h>
> > @@ -28,7 +32,7 @@
> >
> > #define RK808_DCDC1 0 /* (0+RK808_START) */
> > #define RK808_LDO1 4 /* (4+RK808_START) */
> > -#define RK808_NUM_REGULATORS 14
> > +#define RK808_NUM_REGULATORS 14
> >
> > enum rk808_reg {
> > RK808_ID_DCDC1,
> > @@ -115,7 +119,92 @@ enum rk808_reg {
> > #define RK808_INT_STS_MSK_REG2 0x4f
> > #define RK808_IO_POL_REG 0x50
> >
> > -/* IRQ Definitions */
> > +/* RK818 */
> > +#define RK818_DCDC1 0
> > +#define RK818_LDO1 4
> > +#define RK818_NUM_REGULATORS 17
> > +
> > +enum rk818_reg {
> > + RK818_ID_DCDC1,
> > + RK818_ID_DCDC2,
> > + RK818_ID_DCDC3,
> > + RK818_ID_DCDC4,
> > + RK818_ID_BOOST,
> > + RK818_ID_LDO1,
> > + RK818_ID_LDO2,
> > + RK818_ID_LDO3,
> > + RK818_ID_LDO4,
> > + RK818_ID_LDO5,
> > + RK818_ID_LDO6,
> > + RK818_ID_LDO7,
> > + RK818_ID_LDO8,
> > + RK818_ID_LDO9,
> > + RK818_ID_SWITCH,
> > + RK818_ID_HDMI_SWITCH,
> > + RK818_ID_OTG_SWITCH,
> > +};
> > +
> > +#define RK818_DCDC_EN_REG 0x23
> > +#define RK818_LDO_EN_REG 0x24
> > +#define RK818_SLEEP_SET_OFF_REG1 0x25
> > +#define RK818_SLEEP_SET_OFF_REG2 0x26
> > +#define RK818_DCDC_UV_STS_REG 0x27
> > +#define RK818_DCDC_UV_ACT_REG 0x28
> > +#define RK818_LDO_UV_STS_REG 0x29
> > +#define RK818_LDO_UV_ACT_REG 0x2a
> > +#define RK818_DCDC_PG_REG 0x2b
> > +#define RK818_LDO_PG_REG 0x2c
> > +#define RK818_VOUT_MON_TDB_REG 0x2d
> > +#define RK818_BUCK1_CONFIG_REG 0x2e
> > +#define RK818_BUCK1_ON_VSEL_REG 0x2f
> > +#define RK818_BUCK1_SLP_VSEL_REG 0x30
> > +#define RK818_BUCK2_CONFIG_REG 0x32
> > +#define RK818_BUCK2_ON_VSEL_REG 0x33
> > +#define RK818_BUCK2_SLP_VSEL_REG 0x34
> > +#define RK818_BUCK3_CONFIG_REG 0x36
> > +#define RK818_BUCK4_CONFIG_REG 0x37
> > +#define RK818_BUCK4_ON_VSEL_REG 0x38
> > +#define RK818_BUCK4_SLP_VSEL_REG 0x39
> > +#define RK818_BOOST_CONFIG_REG 0x3a
> > +#define RK818_LDO1_ON_VSEL_REG 0x3b
> > +#define RK818_LDO1_SLP_VSEL_REG 0x3c
> > +#define RK818_LDO2_ON_VSEL_REG 0x3d
> > +#define RK818_LDO2_SLP_VSEL_REG 0x3e
> > +#define RK818_LDO3_ON_VSEL_REG 0x3f
> > +#define RK818_LDO3_SLP_VSEL_REG 0x40
> > +#define RK818_LDO4_ON_VSEL_REG 0x41
> > +#define RK818_LDO4_SLP_VSEL_REG 0x42
> > +#define RK818_LDO5_ON_VSEL_REG 0x43
> > +#define RK818_LDO5_SLP_VSEL_REG 0x44
> > +#define RK818_LDO6_ON_VSEL_REG 0x45
> > +#define RK818_LDO6_SLP_VSEL_REG 0x46
> > +#define RK818_LDO7_ON_VSEL_REG 0x47
> > +#define RK818_LDO7_SLP_VSEL_REG 0x48
> > +#define RK818_LDO8_ON_VSEL_REG 0x49
> > +#define RK818_LDO8_SLP_VSEL_REG 0x4a
> > +#define RK818_BOOST_LDO9_ON_VSEL_REG 0x54
> > +#define RK818_BOOST_LDO9_SLP_VSEL_REG 0x55
> > +#define RK818_DEVCTRL_REG 0x4b
> > +#define RK818_INT_STS_REG1 0X4c
> > +#define RK818_INT_STS_MSK_REG1 0x4d
> > +#define RK818_INT_STS_REG2 0x4e
> > +#define RK818_INT_STS_MSK_REG2 0x4f
> > +#define RK818_IO_POL_REG 0x50
> > +#define RK818_H5V_EN_REG 0x52
> > +#define RK818_SLEEP_SET_OFF_REG3 0x53
> > +#define RK818_BOOST_LDO9_ON_VSEL_REG 0x54
> > +#define RK818_BOOST_LDO9_SLP_VSEL_REG 0x55
> > +#define RK818_BOOST_CTRL_REG 0x56
> > +#define RK818_DCDC_ILMAX 0x90
> > +#define RK818_USB_CTRL_REG 0xa1
> > +
> > +#define RK818_H5V_EN BIT(0)
> > +#define RK818_REF_RDY_CTRL BIT(1)
> > +#define RK818_USB_ILIM_SEL_MASK 0xf
> > +#define RK818_USB_ILMIN_2000MA 0x7
> > +#define RK818_USB_CHG_SD_VSEL_MASK 0x70
> > +
> > +/* RK808 IRQ Definitions */
> > #define RK808_IRQ_VOUT_LO 0
> > #define RK808_IRQ_VB_LO 1
> > #define RK808_IRQ_PWRON 2
> > @@ -137,6 +226,43 @@ enum rk808_reg {
> > #define RK808_IRQ_PLUG_IN_INT_MSK BIT(0)
> > #define RK808_IRQ_PLUG_OUT_INT_MSK BIT(1)
> >
> > +/* RK818 IRQ Definitions */
> > +#define RK818_IRQ_VOUT_LO 0
> > +#define RK818_IRQ_VB_LO 1
> > +#define RK818_IRQ_PWRON 2
> > +#define RK818_IRQ_PWRON_LP 3
> > +#define RK818_IRQ_HOTDIE 4
> > +#define RK818_IRQ_RTC_ALARM 5
> > +#define RK818_IRQ_RTC_PERIOD 6
> > +#define RK818_IRQ_USB_OV 7
> > +#define RK818_IRQ_PLUG_IN 8
> > +#define RK818_IRQ_PLUG_OUT 9
> > +#define RK818_IRQ_CHG_OK 10
> > +#define RK818_IRQ_CHG_TE 11
> > +#define RK818_IRQ_CHG_TS1 12
> > +#define RK818_IRQ_TS2 13
> > +#define RK818_IRQ_CHG_CVTLIM 14
> > +#define RK818_IRQ_DISCHG_ILIM 7
> > +
> > +#define RK818_IRQ_VOUT_LO_MSK BIT(0)
> > +#define RK818_IRQ_VB_LO_MSK BIT(1)
> > +#define RK818_IRQ_PWRON_MSK BIT(2)
> > +#define RK818_IRQ_PWRON_LP_MSK BIT(3)
> > +#define RK818_IRQ_HOTDIE_MSK BIT(4)
> > +#define RK818_IRQ_RTC_ALARM_MSK BIT(5)
> > +#define RK818_IRQ_RTC_PERIOD_MSK BIT(6)
> > +#define RK818_IRQ_USB_OV_MSK BIT(7)
> > +#define RK818_IRQ_PLUG_IN_MSK BIT(0)
> > +#define RK818_IRQ_PLUG_OUT_MSK BIT(1)
> > +#define RK818_IRQ_CHG_OK_MSK BIT(2)
> > +#define RK818_IRQ_CHG_TE_MSK BIT(3)
> > +#define RK818_IRQ_CHG_TS1_MSK BIT(4)
> > +#define RK818_IRQ_TS2_MSK BIT(5)
> > +#define RK818_IRQ_CHG_CVTLIM_MSK BIT(6)
> > +#define RK818_IRQ_DISCHG_ILIM_MSK BIT(7)
> > +
> > +#define RK818_NUM_IRQ 16
> > +
> > #define RK808_VBAT_LOW_2V8 0x00
> > #define RK808_VBAT_LOW_2V9 0x01
> > #define RK808_VBAT_LOW_3V0 0x02
> > @@ -191,9 +317,27 @@ enum {
> > BOOST_ILMIN_250MA,
> > };
> >
> > +enum {
> > + RK808_ID,
> > + RK818_ID,
> > +};
> > +
> > +struct rk8xx_reg_data {
> > + int addr;
> > + int mask;
> > + int value;
> > +};
> > +
> > struct rk808 {
> > - struct i2c_client *i2c;
> > - struct regmap_irq_chip_data *irq_data;
> > - struct regmap *regmap;
> > + struct i2c_client *i2c;
> > + struct regmap_irq_chip_data *irq_data;
> > + struct regmap *regmap;
> > + long variant;
> > + int nr_cells;
> > + const struct mfd_cell *cells;
> > + const struct regmap_config *regmap_cfg;
> > + const struct regmap_irq_chip *regmap_irq_chip;
> > + const struct rk8xx_reg_data *pre_init_reg;
> > + int nr_pre_init_regs;
> > };
> > -#endif /* __LINUX_REGULATOR_rk808_H */
> > +#endif /* __LINUX_REGULATOR_RK808_H */
>
--
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
^ permalink raw reply [flat|nested] 34+ messages in thread
* [rtc-linux] Re: [PATCH v4 3/7] mfd: RK808: Add RK818 support
@ 2016-05-10 7:54 ` Lee Jones
0 siblings, 0 replies; 34+ messages in thread
From: Lee Jones @ 2016-05-10 7:54 UTC (permalink / raw)
To: Wadim Egorov
Cc: linux-kernel, linux-clk, rtc-linux, devicetree, linux-rockchip,
mark.rutland, a.zummo, pawel.moll, ijc+devicetree, mturquette,
sboyd, lgirdwood, dianders, robh+dt, alexandre.belloni, broonie,
galak, zyw
On Tue, 10 May 2016, Wadim Egorov wrote:
> Ping.
Don't ping. It only serves to annoy!
> Do you have any more comments?
Just re-submit the set with the Acks you've collected.
> On 26.04.2016 16:54, Wadim Egorov wrote:
> > The RK818 chip is a power management IC for multimedia and handheld
> > devices. It contains the following components:
> >
> > - Regulators
> > - RTC
> > - Clkout
> > - battery support
> >
> > Both chips RK808 and RK818 are using a similar register map.
> > So we can reuse the RTC and Clkout functionality.
> >
> > Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
> > ---
> > Changes since v3:
> > - fixed file and module descriptions
> > ---
> > drivers/mfd/Kconfig | 4 +-
> > drivers/mfd/rk808.c | 229 ++++++++++++++++++++++++++++++++++++++=
+-------
> > include/linux/mfd/rk808.h | 162 ++++++++++++++++++++++++++++++--
> > 3 files changed, 349 insertions(+), 46 deletions(-)
> >
> > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> > index eea61e3..0a5b1c0 100644
> > --- a/drivers/mfd/Kconfig
> > +++ b/drivers/mfd/Kconfig
> > @@ -814,13 +814,13 @@ config MFD_RC5T583
> > different functionality of the device.
> > =20
> > config MFD_RK808
> > - tristate "Rockchip RK808 Power Management chip"
> > + tristate "Rockchip RK808/RK818 Power Management chip"
> > depends on I2C && OF
> > select MFD_CORE
> > select REGMAP_I2C
> > select REGMAP_IRQ
> > help
> > - If you say yes here you get support for the RK808
> > + If you say yes here you get support for the RK808 and RK818
> > Power Management chips.
> > This driver provides common support for accessing the device
> > through I2C interface. The device supports multiple sub-devices
> > diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c
> > index 4b1e439..9bb7e8c 100644
> > --- a/drivers/mfd/rk808.c
> > +++ b/drivers/mfd/rk808.c
> > @@ -1,11 +1,15 @@
> > /*
> > - * MFD core driver for Rockchip RK808
> > + * MFD core driver for Rockchip RK808/RK818
> > *
> > * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
> > *
> > * Author: Chris Zhong <zyw@rock-chips.com>
> > * Author: Zhang Qing <zhangqing@rock-chips.com>
> > *
> > + * Copyright (C) 2016 PHYTEC Messtechnik GmbH
> > + *
> > + * Author: Wadim Egorov <w.egorov@phytec.de>
> > + *
> > * This program is free software; you can redistribute it and/or modif=
y it
> > * under the terms and conditions of the GNU General Public License,
> > * version 2, as published by the Free Software Foundation.
> > @@ -22,12 +26,7 @@
> > #include <linux/mfd/core.h>
> > #include <linux/module.h>
> > #include <linux/regmap.h>
> > -
> > -struct rk808_reg_data {
> > - int addr;
> > - int mask;
> > - int value;
> > -};
> > +#include <linux/of_device.h>
> > =20
> > static bool rk808_is_volatile_reg(struct device *dev, unsigned int reg=
)
> > {
> > @@ -57,6 +56,14 @@ static bool rk808_is_volatile_reg(struct device *dev=
, unsigned int reg)
> > return false;
> > }
> > =20
> > +static const struct regmap_config rk818_regmap_config =3D {
> > + .reg_bits =3D 8,
> > + .val_bits =3D 8,
> > + .max_register =3D RK818_USB_CTRL_REG,
> > + .cache_type =3D REGCACHE_RBTREE,
> > + .volatile_reg =3D rk808_is_volatile_reg,
> > +};
> > +
> > static const struct regmap_config rk808_regmap_config =3D {
> > .reg_bits =3D 8,
> > .val_bits =3D 8,
> > @@ -83,7 +90,17 @@ static const struct mfd_cell rk808s[] =3D {
> > },
> > };
> > =20
> > -static const struct rk808_reg_data pre_init_reg[] =3D {
> > +static const struct mfd_cell rk818s[] =3D {
> > + { .name =3D "rk808-clkout", },
> > + { .name =3D "rk808-regulator", },
> > + {
> > + .name =3D "rk808-rtc",
> > + .num_resources =3D ARRAY_SIZE(rtc_resources),
> > + .resources =3D &rtc_resources[0],
> > + },
> > +};
> > +
> > +static const struct rk8xx_reg_data rk808_pre_init_reg[] =3D {
> > { RK808_BUCK3_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_150MA },
> > { RK808_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_200MA },
> > { RK808_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, BOOST_ILMIN_100MA },
> > @@ -94,6 +111,22 @@ static const struct rk808_reg_data pre_init_reg[] =
=3D {
> > VB_LO_SEL_3500MV },
> > };
> > =20
> > +static const struct rk8xx_reg_data rk818_pre_init_reg[] =3D {
> > + { RK818_USB_CTRL_REG, RK818_USB_ILIM_SEL_MASK,
> > + RK818_USB_ILMIN_2000MA },
> > + /* close charger when usb lower then 3.4V */
> > + { RK818_USB_CTRL_REG, RK818_USB_CHG_SD_VSEL_MASK, (0x7 << 4) },
> > + /* no action when vref */
> > + { RK818_H5V_EN_REG, BIT(1), RK818_REF_RDY_CTRL },
> > + /* enable HDMI 5V */
> > + { RK818_H5V_EN_REG, BIT(0), RK818_H5V_EN },
> > + /* improve efficiency */
> > + { RK818_BUCK2_CONFIG_REG, BUCK2_RATE_MASK, BUCK_ILMIN_250MA },
> > + { RK818_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_250MA },
> > + { RK818_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, BOOST_ILMIN_100MA },
> > + { RK808_VB_MON_REG, MASK_ALL, VB_LO_ACT | VB_LO_SEL_3500MV },
> > +};
> > +
> > static const struct regmap_irq rk808_irqs[] =3D {
> > /* INT_STS */
> > [RK808_IRQ_VOUT_LO] =3D {
> > @@ -136,6 +169,76 @@ static const struct regmap_irq rk808_irqs[] =3D {
> > },
> > };
> > =20
> > +static const struct regmap_irq rk818_irqs[] =3D {
> > + /* INT_STS */
> > + [RK818_IRQ_VOUT_LO] =3D {
> > + .mask =3D RK818_IRQ_VOUT_LO_MSK,
> > + .reg_offset =3D 0,
> > + },
> > + [RK818_IRQ_VB_LO] =3D {
> > + .mask =3D RK818_IRQ_VB_LO_MSK,
> > + .reg_offset =3D 0,
> > + },
> > + [RK818_IRQ_PWRON] =3D {
> > + .mask =3D RK818_IRQ_PWRON_MSK,
> > + .reg_offset =3D 0,
> > + },
> > + [RK818_IRQ_PWRON_LP] =3D {
> > + .mask =3D RK818_IRQ_PWRON_LP_MSK,
> > + .reg_offset =3D 0,
> > + },
> > + [RK818_IRQ_HOTDIE] =3D {
> > + .mask =3D RK818_IRQ_HOTDIE_MSK,
> > + .reg_offset =3D 0,
> > + },
> > + [RK818_IRQ_RTC_ALARM] =3D {
> > + .mask =3D RK818_IRQ_RTC_ALARM_MSK,
> > + .reg_offset =3D 0,
> > + },
> > + [RK818_IRQ_RTC_PERIOD] =3D {
> > + .mask =3D RK818_IRQ_RTC_PERIOD_MSK,
> > + .reg_offset =3D 0,
> > + },
> > + [RK818_IRQ_USB_OV] =3D {
> > + .mask =3D RK818_IRQ_USB_OV_MSK,
> > + .reg_offset =3D 0,
> > + },
> > +
> > + /* INT_STS2 */
> > + [RK818_IRQ_PLUG_IN] =3D {
> > + .mask =3D RK818_IRQ_PLUG_IN_MSK,
> > + .reg_offset =3D 1,
> > + },
> > + [RK818_IRQ_PLUG_OUT] =3D {
> > + .mask =3D RK818_IRQ_PLUG_OUT_MSK,
> > + .reg_offset =3D 1,
> > + },
> > + [RK818_IRQ_CHG_OK] =3D {
> > + .mask =3D RK818_IRQ_CHG_OK_MSK,
> > + .reg_offset =3D 1,
> > + },
> > + [RK818_IRQ_CHG_TE] =3D {
> > + .mask =3D RK818_IRQ_CHG_TE_MSK,
> > + .reg_offset =3D 1,
> > + },
> > + [RK818_IRQ_CHG_TS1] =3D {
> > + .mask =3D RK818_IRQ_CHG_TS1_MSK,
> > + .reg_offset =3D 1,
> > + },
> > + [RK818_IRQ_TS2] =3D {
> > + .mask =3D RK818_IRQ_TS2_MSK,
> > + .reg_offset =3D 1,
> > + },
> > + [RK818_IRQ_CHG_CVTLIM] =3D {
> > + .mask =3D RK818_IRQ_CHG_CVTLIM_MSK,
> > + .reg_offset =3D 1,
> > + },
> > + [RK818_IRQ_DISCHG_ILIM] =3D {
> > + .mask =3D RK818_IRQ_DISCHG_ILIM_MSK,
> > + .reg_offset =3D 1,
> > + },
> > +};
> > +
> > static struct regmap_irq_chip rk808_irq_chip =3D {
> > .name =3D "rk808",
> > .irqs =3D rk808_irqs,
> > @@ -148,6 +251,18 @@ static struct regmap_irq_chip rk808_irq_chip =3D {
> > .init_ack_masked =3D true,
> > };
> > =20
> > +static struct regmap_irq_chip rk818_irq_chip =3D {
> > + .name =3D "rk818",
> > + .irqs =3D rk818_irqs,
> > + .num_irqs =3D ARRAY_SIZE(rk818_irqs),
> > + .num_regs =3D 2,
> > + .irq_reg_stride =3D 2,
> > + .status_base =3D RK818_INT_STS_REG1,
> > + .mask_base =3D RK818_INT_STS_MSK_REG1,
> > + .ack_base =3D RK818_INT_STS_REG1,
> > + .init_ack_masked =3D true,
> > +};
> > +
> > static struct i2c_client *rk808_i2c_client;
> > static void rk808_device_shutdown(void)
> > {
> > @@ -167,6 +282,48 @@ static void rk808_device_shutdown(void)
> > dev_err(&rk808_i2c_client->dev, "power off error!\n");
> > }
> > =20
> > +static const struct of_device_id rk808_of_match[] =3D {
> > + { .compatible =3D "rockchip,rk808", .data =3D (void *) RK808_ID },
> > + { .compatible =3D "rockchip,rk818", .data =3D (void *) RK818_ID },
> > + { },
> > +};
> > +MODULE_DEVICE_TABLE(of, rk808_of_match);
> > +
> > +static int rk8xx_match_device(struct rk808 *rk808, struct device *dev)
> > +{
> > + const struct of_device_id *of_id;
> > +
> > + of_id =3D of_match_device(rk808_of_match, dev);
> > + if (!of_id) {
> > + dev_err(dev, "Unable to match OF ID\n");
> > + return -ENODEV;
> > + }
> > + rk808->variant =3D (long) of_id->data;
> > +
> > + switch (rk808->variant) {
> > + case RK808_ID:
> > + rk808->nr_cells =3D ARRAY_SIZE(rk808s);
> > + rk808->cells =3D rk808s;
> > + rk808->regmap_cfg =3D &rk808_regmap_config;
> > + rk808->regmap_irq_chip =3D &rk808_irq_chip;
> > + rk808->pre_init_reg =3D rk808_pre_init_reg;
> > + rk808->nr_pre_init_regs =3D ARRAY_SIZE(rk808_pre_init_reg);
> > + break;
> > + case RK818_ID:
> > + rk808->nr_cells =3D ARRAY_SIZE(rk818s);
> > + rk808->cells =3D rk818s;
> > + rk808->regmap_cfg =3D &rk818_regmap_config;
> > + rk808->regmap_irq_chip =3D &rk818_irq_chip;
> > + rk808->pre_init_reg =3D rk818_pre_init_reg;
> > + rk808->nr_pre_init_regs =3D ARRAY_SIZE(rk818_pre_init_reg);
> > + break;
> > + default:
> > + dev_err(dev, "unsupported RK8XX ID %lu\n", rk808->variant);
> > + return -EINVAL;
> > + }
> > +
> > + return 0;
> > +}
> > static int rk808_probe(struct i2c_client *client,
> > const struct i2c_device_id *id)
> > {
> > @@ -176,45 +333,51 @@ static int rk808_probe(struct i2c_client *client,
> > int ret;
> > int i;
> > =20
> > - if (!client->irq) {
> > - dev_err(&client->dev, "No interrupt support, no core IRQ\n");
> > - return -EINVAL;
> > - }
> > -
> > rk808 =3D devm_kzalloc(&client->dev, sizeof(*rk808), GFP_KERNEL);
> > if (!rk808)
> > return -ENOMEM;
> > =20
> > - rk808->regmap =3D devm_regmap_init_i2c(client, &rk808_regmap_config);
> > + ret =3D rk8xx_match_device(rk808, &client->dev);
> > + if (ret)
> > + return ret;
> > +
> > + rk808->i2c =3D client;
> > + i2c_set_clientdata(client, rk808);
> > +
> > + rk808->regmap =3D devm_regmap_init_i2c(client, rk808->regmap_cfg);
> > if (IS_ERR(rk808->regmap)) {
> > dev_err(&client->dev, "regmap initialization failed\n");
> > return PTR_ERR(rk808->regmap);
> > }
> > =20
> > - for (i =3D 0; i < ARRAY_SIZE(pre_init_reg); i++) {
> > - ret =3D regmap_update_bits(rk808->regmap, pre_init_reg[i].addr,
> > - pre_init_reg[i].mask,
> > - pre_init_reg[i].value);
> > - if (ret) {
> > - dev_err(&client->dev,
> > - "0x%x write err\n", pre_init_reg[i].addr);
> > - return ret;
> > - }
> > + if (!client->irq) {
> > + dev_err(&client->dev, "No interrupt support, no core IRQ\n");
> > + return -EINVAL;
> > }
> > =20
> > ret =3D regmap_add_irq_chip(rk808->regmap, client->irq,
> > IRQF_ONESHOT, -1,
> > - &rk808_irq_chip, &rk808->irq_data);
> > + rk808->regmap_irq_chip, &rk808->irq_data);
> > if (ret) {
> > dev_err(&client->dev, "Failed to add irq_chip %d\n", ret);
> > return ret;
> > }
> > =20
> > - rk808->i2c =3D client;
> > - i2c_set_clientdata(client, rk808);
> > + for (i =3D 0; i < rk808->nr_pre_init_regs; i++) {
> > + ret =3D regmap_update_bits(rk808->regmap,
> > + rk808->pre_init_reg[i].addr,
> > + rk808->pre_init_reg[i].mask,
> > + rk808->pre_init_reg[i].value);
> > + if (ret) {
> > + dev_err(&client->dev,
> > + "0x%x write err\n",
> > + rk808->pre_init_reg[i].addr);
> > + return ret;
> > + }
> > + }
> > =20
> > - ret =3D mfd_add_devices(&client->dev, -1,
> > - rk808s, ARRAY_SIZE(rk808s),
> > + ret =3D mfd_add_devices(&client->dev, PLATFORM_DEVID_NONE,
> > + rk808->cells, rk808->nr_cells,
> > NULL, 0, regmap_irq_get_domain(rk808->irq_data));
> > if (ret) {
> > dev_err(&client->dev, "failed to add MFD devices %d\n", ret);
> > @@ -246,14 +409,9 @@ static int rk808_remove(struct i2c_client *client)
> > return 0;
> > }
> > =20
> > -static const struct of_device_id rk808_of_match[] =3D {
> > - { .compatible =3D "rockchip,rk808" },
> > - { },
> > -};
> > -MODULE_DEVICE_TABLE(of, rk808_of_match);
> > -
> > static const struct i2c_device_id rk808_ids[] =3D {
> > { "rk808" },
> > + { "rk818" },
> > { },
> > };
> > MODULE_DEVICE_TABLE(i2c, rk808_ids);
> > @@ -273,4 +431,5 @@ module_i2c_driver(rk808_i2c_driver);
> > MODULE_LICENSE("GPL");
> > MODULE_AUTHOR("Chris Zhong <zyw@rock-chips.com>");
> > MODULE_AUTHOR("Zhang Qing <zhangqing@rock-chips.com>");
> > -MODULE_DESCRIPTION("RK808 PMIC driver");
> > +MODULE_AUTHOR("Wadim Egorov <w.egorov@phytec.de>");
> > +MODULE_DESCRIPTION("RK808/RK818 PMIC driver");
> > diff --git a/include/linux/mfd/rk808.h b/include/linux/mfd/rk808.h
> > index 441b6ee..5ce810c 100644
> > --- a/include/linux/mfd/rk808.h
> > +++ b/include/linux/mfd/rk808.h
> > @@ -1,11 +1,15 @@
> > /*
> > - * rk808.h for Rockchip RK808
> > + * Register definitions for Rockchip's RK808/RK818 PMIC
> > *
> > * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
> > *
> > * Author: Chris Zhong <zyw@rock-chips.com>
> > * Author: Zhang Qing <zhangqing@rock-chips.com>
> > *
> > + * Copyright (C) 2016 PHYTEC Messtechnik GmbH
> > + *
> > + * Author: Wadim Egorov <w.egorov@phytec.de>
> > + *
> > * This program is free software; you can redistribute it and/or modif=
y it
> > * under the terms and conditions of the GNU General Public License,
> > * version 2, as published by the Free Software Foundation.
> > @@ -16,8 +20,8 @@
> > * more details.
> > */
> > =20
> > -#ifndef __LINUX_REGULATOR_rk808_H
> > -#define __LINUX_REGULATOR_rk808_H
> > +#ifndef __LINUX_REGULATOR_RK808_H
> > +#define __LINUX_REGULATOR_RK808_H
> > =20
> > #include <linux/regulator/machine.h>
> > #include <linux/regmap.h>
> > @@ -28,7 +32,7 @@
> > =20
> > #define RK808_DCDC1 0 /* (0+RK808_START) */
> > #define RK808_LDO1 4 /* (4+RK808_START) */
> > -#define RK808_NUM_REGULATORS 14
> > +#define RK808_NUM_REGULATORS 14
> > =20
> > enum rk808_reg {
> > RK808_ID_DCDC1,
> > @@ -115,7 +119,92 @@ enum rk808_reg {
> > #define RK808_INT_STS_MSK_REG2 0x4f
> > #define RK808_IO_POL_REG 0x50
> > =20
> > -/* IRQ Definitions */
> > +/* RK818 */
> > +#define RK818_DCDC1 0
> > +#define RK818_LDO1 4
> > +#define RK818_NUM_REGULATORS 17
> > +
> > +enum rk818_reg {
> > + RK818_ID_DCDC1,
> > + RK818_ID_DCDC2,
> > + RK818_ID_DCDC3,
> > + RK818_ID_DCDC4,
> > + RK818_ID_BOOST,
> > + RK818_ID_LDO1,
> > + RK818_ID_LDO2,
> > + RK818_ID_LDO3,
> > + RK818_ID_LDO4,
> > + RK818_ID_LDO5,
> > + RK818_ID_LDO6,
> > + RK818_ID_LDO7,
> > + RK818_ID_LDO8,
> > + RK818_ID_LDO9,
> > + RK818_ID_SWITCH,
> > + RK818_ID_HDMI_SWITCH,
> > + RK818_ID_OTG_SWITCH,
> > +};
> > +
> > +#define RK818_DCDC_EN_REG 0x23
> > +#define RK818_LDO_EN_REG 0x24
> > +#define RK818_SLEEP_SET_OFF_REG1 0x25
> > +#define RK818_SLEEP_SET_OFF_REG2 0x26
> > +#define RK818_DCDC_UV_STS_REG 0x27
> > +#define RK818_DCDC_UV_ACT_REG 0x28
> > +#define RK818_LDO_UV_STS_REG 0x29
> > +#define RK818_LDO_UV_ACT_REG 0x2a
> > +#define RK818_DCDC_PG_REG 0x2b
> > +#define RK818_LDO_PG_REG 0x2c
> > +#define RK818_VOUT_MON_TDB_REG 0x2d
> > +#define RK818_BUCK1_CONFIG_REG 0x2e
> > +#define RK818_BUCK1_ON_VSEL_REG 0x2f
> > +#define RK818_BUCK1_SLP_VSEL_REG 0x30
> > +#define RK818_BUCK2_CONFIG_REG 0x32
> > +#define RK818_BUCK2_ON_VSEL_REG 0x33
> > +#define RK818_BUCK2_SLP_VSEL_REG 0x34
> > +#define RK818_BUCK3_CONFIG_REG 0x36
> > +#define RK818_BUCK4_CONFIG_REG 0x37
> > +#define RK818_BUCK4_ON_VSEL_REG 0x38
> > +#define RK818_BUCK4_SLP_VSEL_REG 0x39
> > +#define RK818_BOOST_CONFIG_REG 0x3a
> > +#define RK818_LDO1_ON_VSEL_REG 0x3b
> > +#define RK818_LDO1_SLP_VSEL_REG 0x3c
> > +#define RK818_LDO2_ON_VSEL_REG 0x3d
> > +#define RK818_LDO2_SLP_VSEL_REG 0x3e
> > +#define RK818_LDO3_ON_VSEL_REG 0x3f
> > +#define RK818_LDO3_SLP_VSEL_REG 0x40
> > +#define RK818_LDO4_ON_VSEL_REG 0x41
> > +#define RK818_LDO4_SLP_VSEL_REG 0x42
> > +#define RK818_LDO5_ON_VSEL_REG 0x43
> > +#define RK818_LDO5_SLP_VSEL_REG 0x44
> > +#define RK818_LDO6_ON_VSEL_REG 0x45
> > +#define RK818_LDO6_SLP_VSEL_REG 0x46
> > +#define RK818_LDO7_ON_VSEL_REG 0x47
> > +#define RK818_LDO7_SLP_VSEL_REG 0x48
> > +#define RK818_LDO8_ON_VSEL_REG 0x49
> > +#define RK818_LDO8_SLP_VSEL_REG 0x4a
> > +#define RK818_BOOST_LDO9_ON_VSEL_REG 0x54
> > +#define RK818_BOOST_LDO9_SLP_VSEL_REG 0x55
> > +#define RK818_DEVCTRL_REG 0x4b
> > +#define RK818_INT_STS_REG1 0X4c
> > +#define RK818_INT_STS_MSK_REG1 0x4d
> > +#define RK818_INT_STS_REG2 0x4e
> > +#define RK818_INT_STS_MSK_REG2 0x4f
> > +#define RK818_IO_POL_REG 0x50
> > +#define RK818_H5V_EN_REG 0x52
> > +#define RK818_SLEEP_SET_OFF_REG3 0x53
> > +#define RK818_BOOST_LDO9_ON_VSEL_REG 0x54
> > +#define RK818_BOOST_LDO9_SLP_VSEL_REG 0x55
> > +#define RK818_BOOST_CTRL_REG 0x56
> > +#define RK818_DCDC_ILMAX 0x90
> > +#define RK818_USB_CTRL_REG 0xa1
> > +
> > +#define RK818_H5V_EN BIT(0)
> > +#define RK818_REF_RDY_CTRL BIT(1)
> > +#define RK818_USB_ILIM_SEL_MASK 0xf
> > +#define RK818_USB_ILMIN_2000MA 0x7
> > +#define RK818_USB_CHG_SD_VSEL_MASK 0x70
> > +
> > +/* RK808 IRQ Definitions */
> > #define RK808_IRQ_VOUT_LO 0
> > #define RK808_IRQ_VB_LO 1
> > #define RK808_IRQ_PWRON 2
> > @@ -137,6 +226,43 @@ enum rk808_reg {
> > #define RK808_IRQ_PLUG_IN_INT_MSK BIT(0)
> > #define RK808_IRQ_PLUG_OUT_INT_MSK BIT(1)
> > =20
> > +/* RK818 IRQ Definitions */
> > +#define RK818_IRQ_VOUT_LO 0
> > +#define RK818_IRQ_VB_LO 1
> > +#define RK818_IRQ_PWRON 2
> > +#define RK818_IRQ_PWRON_LP 3
> > +#define RK818_IRQ_HOTDIE 4
> > +#define RK818_IRQ_RTC_ALARM 5
> > +#define RK818_IRQ_RTC_PERIOD 6
> > +#define RK818_IRQ_USB_OV 7
> > +#define RK818_IRQ_PLUG_IN 8
> > +#define RK818_IRQ_PLUG_OUT 9
> > +#define RK818_IRQ_CHG_OK 10
> > +#define RK818_IRQ_CHG_TE 11
> > +#define RK818_IRQ_CHG_TS1 12
> > +#define RK818_IRQ_TS2 13
> > +#define RK818_IRQ_CHG_CVTLIM 14
> > +#define RK818_IRQ_DISCHG_ILIM 7
> > +
> > +#define RK818_IRQ_VOUT_LO_MSK BIT(0)
> > +#define RK818_IRQ_VB_LO_MSK BIT(1)
> > +#define RK818_IRQ_PWRON_MSK BIT(2)
> > +#define RK818_IRQ_PWRON_LP_MSK BIT(3)
> > +#define RK818_IRQ_HOTDIE_MSK BIT(4)
> > +#define RK818_IRQ_RTC_ALARM_MSK BIT(5)
> > +#define RK818_IRQ_RTC_PERIOD_MSK BIT(6)
> > +#define RK818_IRQ_USB_OV_MSK BIT(7)
> > +#define RK818_IRQ_PLUG_IN_MSK BIT(0)
> > +#define RK818_IRQ_PLUG_OUT_MSK BIT(1)
> > +#define RK818_IRQ_CHG_OK_MSK BIT(2)
> > +#define RK818_IRQ_CHG_TE_MSK BIT(3)
> > +#define RK818_IRQ_CHG_TS1_MSK BIT(4)
> > +#define RK818_IRQ_TS2_MSK BIT(5)
> > +#define RK818_IRQ_CHG_CVTLIM_MSK BIT(6)
> > +#define RK818_IRQ_DISCHG_ILIM_MSK BIT(7)
> > +
> > +#define RK818_NUM_IRQ 16
> > +
> > #define RK808_VBAT_LOW_2V8 0x00
> > #define RK808_VBAT_LOW_2V9 0x01
> > #define RK808_VBAT_LOW_3V0 0x02
> > @@ -191,9 +317,27 @@ enum {
> > BOOST_ILMIN_250MA,
> > };
> > =20
> > +enum {
> > + RK808_ID,
> > + RK818_ID,
> > +};
> > +
> > +struct rk8xx_reg_data {
> > + int addr;
> > + int mask;
> > + int value;
> > +};
> > +
> > struct rk808 {
> > - struct i2c_client *i2c;
> > - struct regmap_irq_chip_data *irq_data;
> > - struct regmap *regmap;
> > + struct i2c_client *i2c;
> > + struct regmap_irq_chip_data *irq_data;
> > + struct regmap *regmap;
> > + long variant;
> > + int nr_cells;
> > + const struct mfd_cell *cells;
> > + const struct regmap_config *regmap_cfg;
> > + const struct regmap_irq_chip *regmap_irq_chip;
> > + const struct rk8xx_reg_data *pre_init_reg;
> > + int nr_pre_init_regs;
> > };
> > -#endif /* __LINUX_REGULATOR_rk808_H */
> > +#endif /* __LINUX_REGULATOR_RK808_H */
>=20
--=20
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org =E2=94=82 Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
--=20
--=20
You received this message because you are subscribed to "rtc-linux".
Membership options at http://groups.google.com/group/rtc-linux .
Please read http://groups.google.com/group/rtc-linux/web/checklist
before submitting a driver.
---=20
You received this message because you are subscribed to the Google Groups "=
rtc-linux" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to rtc-linux+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
^ permalink raw reply [flat|nested] 34+ messages in thread
end of thread, other threads:[~2016-05-10 7:54 UTC | newest]
Thread overview: 34+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-04-26 14:54 [PATCH v4 0/7] Add support for rk818 Wadim Egorov
2016-04-26 14:54 ` Wadim Egorov
2016-04-26 14:54 ` [rtc-linux] " Wadim Egorov
2016-04-26 14:54 ` [PATCH v4 1/7] regulator: rk808: Add rk808_reg_ops_ranges for LDO3 Wadim Egorov
2016-04-26 14:54 ` [rtc-linux] " Wadim Egorov
2016-04-27 16:35 ` Applied "regulator: rk808: Add rk808_reg_ops_ranges for LDO3" to the regulator tree Mark Brown
2016-04-27 16:35 ` Mark Brown
2016-04-27 16:35 ` Mark Brown
2016-04-27 16:35 ` [rtc-linux] " Mark Brown
2016-04-27 21:54 ` [PATCH v4 1/7] regulator: rk808: Add rk808_reg_ops_ranges for LDO3 Heiko Stübner
2016-04-27 21:54 ` [rtc-linux] " Heiko Stübner
2016-04-26 14:54 ` [PATCH v4 2/7] regulator: rk808: Migrate to regulator core's simplified DT parsing code Wadim Egorov
2016-04-26 14:54 ` Wadim Egorov
2016-04-26 14:54 ` [rtc-linux] " Wadim Egorov
2016-04-27 16:57 ` Mark Brown
2016-04-27 16:57 ` Mark Brown
2016-04-27 16:57 ` [rtc-linux] " Mark Brown
2016-04-26 14:54 ` [PATCH v4 3/7] mfd: RK808: Add RK818 support Wadim Egorov
2016-04-26 14:54 ` [rtc-linux] " Wadim Egorov
2016-05-10 6:51 ` Wadim Egorov
2016-05-10 6:51 ` [rtc-linux] " Wadim Egorov
2016-05-10 7:54 ` Lee Jones
2016-05-10 7:54 ` [rtc-linux] " Lee Jones
2016-04-26 14:54 ` [PATCH v4 4/7] regulator: rk808: Add regulator driver for RK818 Wadim Egorov
2016-04-26 14:54 ` [rtc-linux] " Wadim Egorov
2016-04-26 14:54 ` [PATCH v4 5/7] mfd: dt-bindings: Add RK818 device tree bindings document Wadim Egorov
2016-04-26 14:54 ` Wadim Egorov
2016-04-26 14:54 ` [rtc-linux] " Wadim Egorov
2016-04-26 14:54 ` [PATCH v4 6/7] clk: Kconfig: Name RK818 in Kconfig for COMMON_CLK_RK808 Wadim Egorov
2016-04-26 14:54 ` Wadim Egorov
2016-04-26 14:54 ` [rtc-linux] " Wadim Egorov
2016-04-26 14:54 ` [PATCH v4 7/7] rtc: Kconfig: Name RK818 in Kconfig for RTC_DRV_RK808 Wadim Egorov
2016-04-26 14:54 ` Wadim Egorov
2016-04-26 14:54 ` [rtc-linux] " Wadim Egorov
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.