From patchwork Tue May 2 06:54:51 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacob Chen X-Patchwork-Id: 757410 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3wHBv80W7Jz9s8H for ; Tue, 2 May 2017 16:57:55 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id B818FC21C4D; Tue, 2 May 2017 06:56:16 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id D5F06C21C46; Tue, 2 May 2017 06:55:48 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 23CFEC21C42; Tue, 2 May 2017 06:55:27 +0000 (UTC) Received: from mail-pg0-f68.google.com (mail-pg0-f68.google.com [74.125.83.68]) by lists.denx.de (Postfix) with ESMTPS id D0BDFC21C3A for ; Tue, 2 May 2017 06:55:23 +0000 (UTC) Received: by mail-pg0-f68.google.com with SMTP id i63so118358pgd.2 for ; Mon, 01 May 2017 23:55:23 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ZqGqnSoJA5dBa4Vph05qDMEoU8pBg6QEVJTcIjeqdaM=; b=VgiE+WzguA6YFPu7edI6gI2Kou+bo/8hlM+S351HspBZVnQFXGv8hunmfZBTs9Hp0v 3yYCKgPY0/VLfDoTYN17cdcJjSSgFTKvdmjnPb/Q8xgHsCGt6HZOZcwuP5TGVrK7mYPY Z46moBOUupgSsnvz/Dm6lksaucPfPCy67pCYdeSHEP6z6ux0eTw2wRT54eRTHCDL6A2a zd0rrAPDgEhqSzOrUsntlf9PpE43umB3GCEyHVhDwrdlW+yP6X11eouwg8oiFsjEH1bl iXxQVRdvLM5KmtKl0Unk4yDa4vOItZmgtlPy5yz7K6xeS+vWnDA+H1kvWlxPv4NMOPOC ztzw== X-Gm-Message-State: AN3rC/5wH30Jz52b/0neiu3bWiIg84YY1j6MZG5piAsQFzgMDCjqVmnH /lEFS3Y3oV2tjA== X-Received: by 10.84.254.4 with SMTP id b4mr39146793plm.64.1493708122558; Mon, 01 May 2017 23:55:22 -0700 (PDT) Received: from localhost.localdomain ([103.29.142.67]) by smtp.gmail.com with ESMTPSA id s89sm27968540pfi.79.2017.05.01.23.55.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 01 May 2017 23:55:22 -0700 (PDT) From: Jacob Chen To: u-boot@lists.denx.de Date: Tue, 2 May 2017 14:54:51 +0800 Message-Id: <1493708092-22273-5-git-send-email-jacob-chen@iotwrt.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1493708092-22273-1-git-send-email-jacob-chen@iotwrt.com> References: <1493708092-22273-1-git-send-email-jacob-chen@iotwrt.com> Cc: zhangqing@rock-chips.com, Jacob Chen , cjh@rock-chips.com Subject: [U-Boot] [PATCH v2 4/5] power: regulator: rk808: add rk818 support X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" 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. Signed-off-by: Jacob Chen Reviewed-by: Simon Glass --- Changes in v2: None drivers/power/regulator/rk808.c | 55 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/drivers/power/regulator/rk808.c b/drivers/power/regulator/rk808.c index 441806c..71ab76e 100644 --- a/drivers/power/regulator/rk808.c +++ b/drivers/power/regulator/rk808.c @@ -25,6 +25,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 + struct rk808_reg_info { uint min_uv; uint step_uv; @@ -50,10 +56,51 @@ static const struct rk808_reg_info rk808_ldo[] = { { 1800000, 100000, REG_LDO8_ON_VSEL, RK808_LDO_VSEL_MASK, }, }; +static const struct rk808_reg_info rk818_buck[] = { + { 712500, 12500, REG_BUCK1_ON_VSEL, RK818_BUCK_VSEL_MASK, }, + { 712500, 12500, REG_BUCK2_ON_VSEL, RK818_BUCK_VSEL_MASK, }, + { 712500, 12500, -1, RK818_BUCK_VSEL_MASK, }, + { 1800000, 100000, REG_BUCK4_ON_VSEL, RK818_BUCK4_VSEL_MASK, }, +}; + +static const struct rk808_reg_info rk818_ldo[] = { + { 1800000, 100000, REG_LDO1_ON_VSEL, RK818_LDO_VSEL_MASK, }, + { 1800000, 100000, REG_LDO2_ON_VSEL, RK818_LDO_VSEL_MASK, }, + { 800000, 100000, REG_LDO3_ON_VSEL, RK818_LDO3_ON_VSEL_MASK, }, + { 1800000, 100000, REG_LDO4_ON_VSEL, RK818_LDO_VSEL_MASK, }, + { 1800000, 100000, REG_LDO5_ON_VSEL, RK818_LDO_VSEL_MASK, }, + { 800000, 100000, REG_LDO6_ON_VSEL, RK818_LDO_VSEL_MASK, }, + { 800000, 100000, REG_LDO7_ON_VSEL, RK818_LDO_VSEL_MASK, }, + { 1800000, 100000, REG_LDO8_ON_VSEL, RK818_LDO_VSEL_MASK, }, +}; + +static const struct rk808_reg_info *get_buck_reg(struct udevice *pmic, + int num) +{ + struct rk808_priv *rk808 = dev_get_priv(pmic); + switch (rk808->variant) { + case RK818_ID: + return &rk818_buck[num]; + default: + return &rk808_buck[num]; + } +} + +static const struct rk808_reg_info *get_ldo_reg(struct udevice *pmic, + int num) +{ + struct rk808_priv *rk808 = dev_get_priv(pmic); + switch (rk808->variant) { + case RK818_ID: + return &rk818_ldo[num - 1]; + default: + return &rk808_ldo[num - 1]; + } +} static int _buck_set_value(struct udevice *pmic, int buck, int uvolt) { - const struct rk808_reg_info *info = &rk808_buck[buck - 1]; + const struct rk808_reg_info *info = get_buck_reg(pmic, buck - 1); int mask = info->vsel_mask; int val; @@ -89,7 +136,7 @@ static int _buck_set_enable(struct udevice *pmic, int buck, bool enable) static int buck_get_value(struct udevice *dev) { int buck = dev->driver_data - 1; - const struct rk808_reg_info *info = &rk808_buck[buck]; + const struct rk808_reg_info *info = get_buck_reg(dev->parent, buck); int mask = info->vsel_mask; int ret, val; @@ -135,7 +182,7 @@ static bool buck_get_enable(struct udevice *dev) static int ldo_get_value(struct udevice *dev) { int ldo = dev->driver_data - 1; - const struct rk808_reg_info *info = &rk808_ldo[ldo]; + const struct rk808_reg_info *info = get_ldo_reg(dev->parent, ldo); int mask = info->vsel_mask; int ret, val; @@ -152,7 +199,7 @@ static int ldo_get_value(struct udevice *dev) static int ldo_set_value(struct udevice *dev, int uvolt) { int ldo = dev->driver_data - 1; - const struct rk808_reg_info *info = &rk808_ldo[ldo]; + const struct rk808_reg_info *info = get_ldo_reg(dev->parent, ldo); int mask = info->vsel_mask; int val;