[U-Boot,2/4] power: pmic: rk808: add RK818 support

Submitted by Jacob Chen on April 21, 2017, 3:34 a.m.

Details

Message ID 1492745648-1642-3-git-send-email-jacob-chen@iotwrt.com
State Superseded
Delegated to: Jaehoon Chung
Headers show

Commit Message

Jacob Chen April 21, 2017, 3:34 a.m.
The RK818 chip is a Power Management IC (PMIC) for multimedia and handheld
devices.

For boards use rk818, the input current should be set in the early stage, before
ddr initialization.

To use rk818,below configs should be enabled:
	CONFIG_SPL_I2C_SUPPORT=y
	CONFIG_SPL_POWER_SUPPORT=y
and rk818 device should probe in spl board_init_f.

Signed-off-by: Jacob Chen <jacob-chen@iotwrt.com>
---

 drivers/power/pmic/rk808.c | 29 +++++++++++++++++++++++++++++
 include/power/rk808_pmic.h | 12 ++++++++++++
 2 files changed, 41 insertions(+)

Comments

Wadim Egorov April 21, 2017, 9:16 a.m.
Hi Jacob,


Am 21.04.2017 um 05:34 schrieb Jacob Chen:
> The RK818 chip is a Power Management IC (PMIC) for multimedia and handheld
> devices.
>
> For boards use rk818, the input current should be set in the early stage, before
> ddr initialization.
>
> To use rk818,below configs should be enabled:
> 	CONFIG_SPL_I2C_SUPPORT=y
> 	CONFIG_SPL_POWER_SUPPORT=y
> and rk818 device should probe in spl board_init_f.
>
> Signed-off-by: Jacob Chen <jacob-chen@iotwrt.com>
> ---
>
>  drivers/power/pmic/rk808.c | 29 +++++++++++++++++++++++++++++
>  include/power/rk808_pmic.h | 12 ++++++++++++
>  2 files changed, 41 insertions(+)
>
> diff --git a/drivers/power/pmic/rk808.c b/drivers/power/pmic/rk808.c
> index 3f5f316..2d764d9 100644
> --- a/drivers/power/pmic/rk808.c
> +++ b/drivers/power/pmic/rk808.c
> @@ -80,6 +80,33 @@ static int rk808_bind(struct udevice *dev)
>  }
>  #endif
>  
> +static int rk808_probe(struct udevice *dev)
> +{
> +	struct rk808_priv *priv = dev_get_priv(dev);
> +	uint8_t msb, lsb;
> +
> +	/* read Chip variant */
> +	rk808_read(dev, ID_MSB, &msb, 1);
> +	rk808_read(dev, ID_LSB, &lsb, 1);
> +
> +	priv->variant = ((msb << 8) | lsb) & RK8XX_ID_MSK;
> +
> +#ifdef CONFIG_SPL_BUILD
> +	if (priv->variant == RK818_ID) {
> +		uint8_t txdata;
> +		/*
> +		 * Increase USB input current selection to 2A and close charger
> +		 * when usb lower then 3.4V.
> +		 */
> +		txdata = 0x77;
> +		rk808_write(dev, REG_USB_CTRL, &txdata, 1);
> +		udelay(3);
> +	}

I don't think this is the right place for this board specific setup. Not
every RK818 based device has such a high power consumption and has to
increase it's USB input current selection.
You should move the USB_CTRL register write to board_init_f() and check
for the board with #ifdef TARGET_XXX

Regards,
Wadim

> +#endif
> +
> +	return 0;
> +}
> +
>  static struct dm_pmic_ops rk808_ops = {
>  	.reg_count = rk808_reg_count,
>  	.read = rk808_read,
> @@ -88,6 +115,7 @@ static struct dm_pmic_ops rk808_ops = {
>  
>  static const struct udevice_id rk808_ids[] = {
>  	{ .compatible = "rockchip,rk808" },
> +	{ .compatible = "rockchip,rk818" },
>  	{ }
>  };
>  
> @@ -98,5 +126,6 @@ U_BOOT_DRIVER(pmic_rk808) = {
>  #if CONFIG_IS_ENABLED(PMIC_CHILDREN)
>  	.bind = rk808_bind,
>  #endif
> +	.probe = rk808_probe,
>  	.ops = &rk808_ops,
>  };
> diff --git a/include/power/rk808_pmic.h b/include/power/rk808_pmic.h
> index d29c2b3..c370c32 100644
> --- a/include/power/rk808_pmic.h
> +++ b/include/power/rk808_pmic.h
> @@ -170,12 +170,24 @@ enum {
>  	RK808_NUM_OF_REGS,
>  };
>  
> +enum {
> +	RK805_ID = 0x8050,
> +	RK808_ID = 0x0000,
> +	RK818_ID = 0x8180,
> +};
> +
> +#define RK8XX_ID_MSK	0xfff0
> +
>  struct rk808_reg_table {
>  	char *name;
>  	u8 reg_ctl;
>  	u8 reg_vol;
>  };
>  
> +struct rk808_priv {
> +	int variant;
> +};
> +
>  int rk808_spl_configure_buck(struct udevice *pmic, int buck, int uvolt);
>  
>  #endif

Patch hide | download patch | download mbox

diff --git a/drivers/power/pmic/rk808.c b/drivers/power/pmic/rk808.c
index 3f5f316..2d764d9 100644
--- a/drivers/power/pmic/rk808.c
+++ b/drivers/power/pmic/rk808.c
@@ -80,6 +80,33 @@  static int rk808_bind(struct udevice *dev)
 }
 #endif
 
+static int rk808_probe(struct udevice *dev)
+{
+	struct rk808_priv *priv = dev_get_priv(dev);
+	uint8_t msb, lsb;
+
+	/* read Chip variant */
+	rk808_read(dev, ID_MSB, &msb, 1);
+	rk808_read(dev, ID_LSB, &lsb, 1);
+
+	priv->variant = ((msb << 8) | lsb) & RK8XX_ID_MSK;
+
+#ifdef CONFIG_SPL_BUILD
+	if (priv->variant == RK818_ID) {
+		uint8_t txdata;
+		/*
+		 * Increase USB input current selection to 2A and close charger
+		 * when usb lower then 3.4V.
+		 */
+		txdata = 0x77;
+		rk808_write(dev, REG_USB_CTRL, &txdata, 1);
+		udelay(3);
+	}
+#endif
+
+	return 0;
+}
+
 static struct dm_pmic_ops rk808_ops = {
 	.reg_count = rk808_reg_count,
 	.read = rk808_read,
@@ -88,6 +115,7 @@  static struct dm_pmic_ops rk808_ops = {
 
 static const struct udevice_id rk808_ids[] = {
 	{ .compatible = "rockchip,rk808" },
+	{ .compatible = "rockchip,rk818" },
 	{ }
 };
 
@@ -98,5 +126,6 @@  U_BOOT_DRIVER(pmic_rk808) = {
 #if CONFIG_IS_ENABLED(PMIC_CHILDREN)
 	.bind = rk808_bind,
 #endif
+	.probe = rk808_probe,
 	.ops = &rk808_ops,
 };
diff --git a/include/power/rk808_pmic.h b/include/power/rk808_pmic.h
index d29c2b3..c370c32 100644
--- a/include/power/rk808_pmic.h
+++ b/include/power/rk808_pmic.h
@@ -170,12 +170,24 @@  enum {
 	RK808_NUM_OF_REGS,
 };
 
+enum {
+	RK805_ID = 0x8050,
+	RK808_ID = 0x0000,
+	RK818_ID = 0x8180,
+};
+
+#define RK8XX_ID_MSK	0xfff0
+
 struct rk808_reg_table {
 	char *name;
 	u8 reg_ctl;
 	u8 reg_vol;
 };
 
+struct rk808_priv {
+	int variant;
+};
+
 int rk808_spl_configure_buck(struct udevice *pmic, int buck, int uvolt);
 
 #endif