Re: [U-Boot] [PATCH v3 3/8] power: pmic: rk816: support rk816 pmic

2019-09-19 Thread Kever Yang


On 2019/9/19 下午4:08, Elaine Zhang wrote:

The RK816 is a Power Management IC (PMIC) for multimedia
and handheld devices. They contains the following components:
 - Regulators(4*BUCKs, 1*BOOST, 6*LDOs, 1*SWITCH)
 - RTC
 - Clocking

Signed-off-by: Elaine Zhang 


Reviewed-by: Kever Yang

Thanks,
- Kever

---
  drivers/power/pmic/rk8xx.c  |   1 +
  drivers/power/regulator/rk8xx.c | 130 ++--
  include/power/rk8xx_pmic.h  |  11 +++-
  3 files changed, 136 insertions(+), 6 deletions(-)

diff --git a/drivers/power/pmic/rk8xx.c b/drivers/power/pmic/rk8xx.c
index 25c339ab12cc..1900de9d1cdb 100644
--- a/drivers/power/pmic/rk8xx.c
+++ b/drivers/power/pmic/rk8xx.c
@@ -95,6 +95,7 @@ static struct dm_pmic_ops rk8xx_ops = {
  
  static const struct udevice_id rk8xx_ids[] = {

{ .compatible = "rockchip,rk808" },
+   { .compatible = "rockchip,rk816" },
{ .compatible = "rockchip,rk818" },
{ }
  };
diff --git a/drivers/power/regulator/rk8xx.c b/drivers/power/regulator/rk8xx.c
index ef83f66c8b6e..3188d3c6350d 100644
--- a/drivers/power/regulator/rk8xx.c
+++ b/drivers/power/regulator/rk8xx.c
@@ -62,6 +62,21 @@ static const struct rk8xx_reg_info rk808_buck[] = {
{ 180, 10, REG_BUCK4_ON_VSEL, REG_BUCK4_SLP_VSEL, 
REG_BUCK4_CONFIG, RK808_BUCK4_VSEL_MASK, },
  };
  
+static const struct rk8xx_reg_info rk816_buck[] = {

+   /* buck 1 */
+   {  712500,  12500, REG_BUCK1_ON_VSEL, REG_BUCK1_SLP_VSEL, 
REG_BUCK1_CONFIG, RK818_BUCK_VSEL_MASK, 0x00, },
+   { 180, 20, REG_BUCK1_ON_VSEL, REG_BUCK1_SLP_VSEL, 
REG_BUCK1_CONFIG, RK818_BUCK_VSEL_MASK, 0x3c, },
+   { 230,  0, REG_BUCK1_ON_VSEL, REG_BUCK1_SLP_VSEL, 
REG_BUCK1_CONFIG, RK818_BUCK_VSEL_MASK, 0x3f, },
+   /* buck 2 */
+   {  712500,  12500, REG_BUCK2_ON_VSEL, REG_BUCK2_SLP_VSEL, 
REG_BUCK2_CONFIG, RK818_BUCK_VSEL_MASK, 0x00, },
+   { 180, 20, REG_BUCK2_ON_VSEL, REG_BUCK2_SLP_VSEL, 
REG_BUCK2_CONFIG, RK818_BUCK_VSEL_MASK, 0x3c, },
+   { 230,  0, REG_BUCK2_ON_VSEL, REG_BUCK2_SLP_VSEL, 
REG_BUCK2_CONFIG, RK818_BUCK_VSEL_MASK, 0x3f, },
+   /* buck 3 */
+   { 712500,   12500, NA,NA, 
REG_BUCK3_CONFIG, RK818_BUCK_VSEL_MASK, },
+   /* buck 4 */
+   {  80, 10, REG_BUCK4_ON_VSEL, REG_BUCK4_SLP_VSEL, 
REG_BUCK4_CONFIG, RK818_BUCK4_VSEL_MASK, },
+};
+
  static const struct rk8xx_reg_info rk818_buck[] = {
{ 712500,   12500, REG_BUCK1_ON_VSEL, REG_BUCK1_SLP_VSEL, 
REG_BUCK1_CONFIG, RK818_BUCK_VSEL_MASK, },
{ 712500,   12500, REG_BUCK2_ON_VSEL, REG_BUCK2_SLP_VSEL, 
REG_BUCK2_CONFIG, RK818_BUCK_VSEL_MASK, },
@@ -81,6 +96,15 @@ static const struct rk8xx_reg_info rk808_ldo[] = {
{ 180, 10, REG_LDO8_ON_VSEL, REG_LDO8_SLP_VSEL, NA, 
RK808_LDO_VSEL_MASK, },
  };
  
+static const struct rk8xx_reg_info rk816_ldo[] = {

+   { 80, 10, REG_LDO1_ON_VSEL, REG_LDO1_SLP_VSEL, NA, 
RK818_LDO_VSEL_MASK, },
+   { 80, 10, REG_LDO2_ON_VSEL, REG_LDO2_SLP_VSEL, NA, 
RK818_LDO_VSEL_MASK, },
+   { 80, 10, REG_LDO3_ON_VSEL, REG_LDO3_SLP_VSEL, NA, 
RK818_LDO_VSEL_MASK, },
+   { 80, 10, REG_LDO4_ON_VSEL, REG_LDO4_SLP_VSEL, NA, 
RK818_LDO_VSEL_MASK, },
+   { 80, 10, REG_LDO5_ON_VSEL, REG_LDO5_SLP_VSEL, NA, 
RK818_LDO_VSEL_MASK, },
+   { 80, 10, REG_LDO6_ON_VSEL, REG_LDO6_SLP_VSEL, NA, 
RK818_LDO_VSEL_MASK, },
+};
+
  static const struct rk8xx_reg_info rk818_ldo[] = {
{ 180, 10, REG_LDO1_ON_VSEL, REG_LDO1_SLP_VSEL, NA, 
RK818_LDO_VSEL_MASK, },
{ 180, 10, REG_LDO2_ON_VSEL, REG_LDO2_SLP_VSEL, NA, 
RK818_LDO_VSEL_MASK, },
@@ -105,7 +129,21 @@ static const struct rk8xx_reg_info *get_buck_reg(struct 
udevice *pmic,
 int num, int uvolt)
  {
struct rk8xx_priv *priv = dev_get_priv(pmic);
+
switch (priv->variant) {
+   case RK816_ID:
+   switch (num) {
+   case 0:
+   case 1:
+   if (uvolt <= 145)
+   return &rk816_buck[num * 3 + 0];
+   else if (uvolt <= 220)
+   return &rk816_buck[num * 3 + 1];
+   else
+   return &rk816_buck[num * 3 + 2];
+   default:
+   return &rk816_buck[num + 4];
+   }
case RK818_ID:
return &rk818_buck[num];
default:
@@ -116,11 +154,13 @@ static const struct rk8xx_reg_info *get_buck_reg(struct 
udevice *pmic,
  static int _buck_set_value(struct udevice *pmic, int buck, int uvolt)
  {
const struct rk8xx_reg_info *info = get_buck_reg(pmic, buck, uvolt);
+   struct rk8xx_priv *priv = dev_get_priv(pmic);
int mask = info->vsel_mask;
int val;
  
  	if (info->vsel_reg == NA)

return -ENOSYS;
+
   

[U-Boot] [PATCH v3 3/8] power: pmic: rk816: support rk816 pmic

2019-09-19 Thread Elaine Zhang
The RK816 is a Power Management IC (PMIC) for multimedia
and handheld devices. They contains the following components:
- Regulators(4*BUCKs, 1*BOOST, 6*LDOs, 1*SWITCH)
- RTC
- Clocking

Signed-off-by: Elaine Zhang 
---
 drivers/power/pmic/rk8xx.c  |   1 +
 drivers/power/regulator/rk8xx.c | 130 ++--
 include/power/rk8xx_pmic.h  |  11 +++-
 3 files changed, 136 insertions(+), 6 deletions(-)

diff --git a/drivers/power/pmic/rk8xx.c b/drivers/power/pmic/rk8xx.c
index 25c339ab12cc..1900de9d1cdb 100644
--- a/drivers/power/pmic/rk8xx.c
+++ b/drivers/power/pmic/rk8xx.c
@@ -95,6 +95,7 @@ static struct dm_pmic_ops rk8xx_ops = {
 
 static const struct udevice_id rk8xx_ids[] = {
{ .compatible = "rockchip,rk808" },
+   { .compatible = "rockchip,rk816" },
{ .compatible = "rockchip,rk818" },
{ }
 };
diff --git a/drivers/power/regulator/rk8xx.c b/drivers/power/regulator/rk8xx.c
index ef83f66c8b6e..3188d3c6350d 100644
--- a/drivers/power/regulator/rk8xx.c
+++ b/drivers/power/regulator/rk8xx.c
@@ -62,6 +62,21 @@ static const struct rk8xx_reg_info rk808_buck[] = {
{ 180, 10, REG_BUCK4_ON_VSEL, REG_BUCK4_SLP_VSEL, 
REG_BUCK4_CONFIG, RK808_BUCK4_VSEL_MASK, },
 };
 
+static const struct rk8xx_reg_info rk816_buck[] = {
+   /* buck 1 */
+   {  712500,  12500, REG_BUCK1_ON_VSEL, REG_BUCK1_SLP_VSEL, 
REG_BUCK1_CONFIG, RK818_BUCK_VSEL_MASK, 0x00, },
+   { 180, 20, REG_BUCK1_ON_VSEL, REG_BUCK1_SLP_VSEL, 
REG_BUCK1_CONFIG, RK818_BUCK_VSEL_MASK, 0x3c, },
+   { 230,  0, REG_BUCK1_ON_VSEL, REG_BUCK1_SLP_VSEL, 
REG_BUCK1_CONFIG, RK818_BUCK_VSEL_MASK, 0x3f, },
+   /* buck 2 */
+   {  712500,  12500, REG_BUCK2_ON_VSEL, REG_BUCK2_SLP_VSEL, 
REG_BUCK2_CONFIG, RK818_BUCK_VSEL_MASK, 0x00, },
+   { 180, 20, REG_BUCK2_ON_VSEL, REG_BUCK2_SLP_VSEL, 
REG_BUCK2_CONFIG, RK818_BUCK_VSEL_MASK, 0x3c, },
+   { 230,  0, REG_BUCK2_ON_VSEL, REG_BUCK2_SLP_VSEL, 
REG_BUCK2_CONFIG, RK818_BUCK_VSEL_MASK, 0x3f, },
+   /* buck 3 */
+   { 712500,   12500, NA,NA, 
REG_BUCK3_CONFIG, RK818_BUCK_VSEL_MASK, },
+   /* buck 4 */
+   {  80, 10, REG_BUCK4_ON_VSEL, REG_BUCK4_SLP_VSEL, 
REG_BUCK4_CONFIG, RK818_BUCK4_VSEL_MASK, },
+};
+
 static const struct rk8xx_reg_info rk818_buck[] = {
{ 712500,   12500, REG_BUCK1_ON_VSEL, REG_BUCK1_SLP_VSEL, 
REG_BUCK1_CONFIG, RK818_BUCK_VSEL_MASK, },
{ 712500,   12500, REG_BUCK2_ON_VSEL, REG_BUCK2_SLP_VSEL, 
REG_BUCK2_CONFIG, RK818_BUCK_VSEL_MASK, },
@@ -81,6 +96,15 @@ static const struct rk8xx_reg_info rk808_ldo[] = {
{ 180, 10, REG_LDO8_ON_VSEL, REG_LDO8_SLP_VSEL, NA, 
RK808_LDO_VSEL_MASK, },
 };
 
+static const struct rk8xx_reg_info rk816_ldo[] = {
+   { 80, 10, REG_LDO1_ON_VSEL, REG_LDO1_SLP_VSEL, NA, 
RK818_LDO_VSEL_MASK, },
+   { 80, 10, REG_LDO2_ON_VSEL, REG_LDO2_SLP_VSEL, NA, 
RK818_LDO_VSEL_MASK, },
+   { 80, 10, REG_LDO3_ON_VSEL, REG_LDO3_SLP_VSEL, NA, 
RK818_LDO_VSEL_MASK, },
+   { 80, 10, REG_LDO4_ON_VSEL, REG_LDO4_SLP_VSEL, NA, 
RK818_LDO_VSEL_MASK, },
+   { 80, 10, REG_LDO5_ON_VSEL, REG_LDO5_SLP_VSEL, NA, 
RK818_LDO_VSEL_MASK, },
+   { 80, 10, REG_LDO6_ON_VSEL, REG_LDO6_SLP_VSEL, NA, 
RK818_LDO_VSEL_MASK, },
+};
+
 static const struct rk8xx_reg_info rk818_ldo[] = {
{ 180, 10, REG_LDO1_ON_VSEL, REG_LDO1_SLP_VSEL, NA, 
RK818_LDO_VSEL_MASK, },
{ 180, 10, REG_LDO2_ON_VSEL, REG_LDO2_SLP_VSEL, NA, 
RK818_LDO_VSEL_MASK, },
@@ -105,7 +129,21 @@ static const struct rk8xx_reg_info *get_buck_reg(struct 
udevice *pmic,
 int num, int uvolt)
 {
struct rk8xx_priv *priv = dev_get_priv(pmic);
+
switch (priv->variant) {
+   case RK816_ID:
+   switch (num) {
+   case 0:
+   case 1:
+   if (uvolt <= 145)
+   return &rk816_buck[num * 3 + 0];
+   else if (uvolt <= 220)
+   return &rk816_buck[num * 3 + 1];
+   else
+   return &rk816_buck[num * 3 + 2];
+   default:
+   return &rk816_buck[num + 4];
+   }
case RK818_ID:
return &rk818_buck[num];
default:
@@ -116,11 +154,13 @@ static const struct rk8xx_reg_info *get_buck_reg(struct 
udevice *pmic,
 static int _buck_set_value(struct udevice *pmic, int buck, int uvolt)
 {
const struct rk8xx_reg_info *info = get_buck_reg(pmic, buck, uvolt);
+   struct rk8xx_priv *priv = dev_get_priv(pmic);
int mask = info->vsel_mask;
int val;
 
if (info->vsel_reg == NA)
return -ENOSYS;
+
if (info->step_uv == 0) /* Fixed voltage */
val = info->min_sel;
else
@@ -129,