From patchwork Wed Nov 16 17:01:30 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Dwivedi, Avaneesh Kumar (avani)" X-Patchwork-Id: 9432211 X-Patchwork-Delegate: agross@codeaurora.org Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 912BC60755 for ; Wed, 16 Nov 2016 17:02:12 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8048228F71 for ; Wed, 16 Nov 2016 17:02:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7509328FD0; Wed, 16 Nov 2016 17:02:12 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 06AB128FB3 for ; Wed, 16 Nov 2016 17:02:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932870AbcKPRCD (ORCPT ); Wed, 16 Nov 2016 12:02:03 -0500 Received: from smtp.codeaurora.org ([198.145.29.96]:57322 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932643AbcKPRB7 (ORCPT ); Wed, 16 Nov 2016 12:01:59 -0500 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id F1E046156B; Wed, 16 Nov 2016 17:01:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1479315719; bh=/d3TgqaYEXdQpCXxkSpfV4JMKLW+lsCi/abRGjgEfWo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=glBtutcVhEKKIzcdh8S9ypROQEleCX7eaZwlz3OcvpT9nT+3bHisLdBi5m6InYsdV Wg/bqFACFUQEizLtijcSB50aMCVzXGmc3VACLj1LIyVFCvnu2B2uzWellufkw0ZvSp f3WJ9NhlB6e5UvtdjEVPrVqXMIPZVLNZlrdFjThM= Received: from akdwived-linux.qualcomm.com (unknown [202.46.23.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: akdwived@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 920A661515; Wed, 16 Nov 2016 17:01:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1479315718; bh=/d3TgqaYEXdQpCXxkSpfV4JMKLW+lsCi/abRGjgEfWo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=iciQ8T8MlYjNRNvxwewf1agAiKPW9hI+ohY2b8IXCvfK9you91wsZQ6QwrjSDx7W0 ihDYAx76H9WyNkck6s/za1c91rqj5gAA5lWDk+/1Q+u+esbf2ZAgZCfvnSpJ775iJe cNIrQbpS7coZ7RA0ieDeY5q3VuLv5KlYvVF1a6B0= DMARC-Filter: OpenDMARC Filter v1.3.1 smtp.codeaurora.org 920A661515 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=pass smtp.mailfrom=akdwived@codeaurora.org From: Avaneesh Kumar Dwivedi To: bjorn.andersson@linaro.org Cc: sboyd@codeaurora.org, agross@codeaurora.org, linux-arm-msm@vger.kernel.org, Avaneesh Kumar Dwivedi Subject: [PATCH v4 04/10] remoteproc: qcom: Modify regulator enable and disable interface Date: Wed, 16 Nov 2016 22:31:30 +0530 Message-Id: <1479315696-15490-5-git-send-email-akdwived@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1479315696-15490-1-git-send-email-akdwived@codeaurora.org> References: <1479315696-15490-1-git-send-email-akdwived@codeaurora.org> Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Regulator enable routine will get additional input parameter of regulator info and count, It will read regulator info and will do appropriate voltage and load configuration before turning them up. Signed-off-by: Avaneesh Kumar Dwivedi --- drivers/remoteproc/qcom_q6v5_pil.c | 87 ++++++++++++++++++++++++++------------ 1 file changed, 59 insertions(+), 28 deletions(-) diff --git a/drivers/remoteproc/qcom_q6v5_pil.c b/drivers/remoteproc/qcom_q6v5_pil.c index 32e4bbc..8843605 100644 --- a/drivers/remoteproc/qcom_q6v5_pil.c +++ b/drivers/remoteproc/qcom_q6v5_pil.c @@ -127,7 +127,6 @@ struct q6v5 { struct qcom_smem_state *state; unsigned stop_bit; - struct regulator_bulk_data supply[4]; struct clk *ahb_clk; struct clk *axi_clk; @@ -155,12 +154,6 @@ struct q6v5 { size_t mpss_size; }; -enum { - Q6V5_SUPPLY_CX, - Q6V5_SUPPLY_MX, - Q6V5_SUPPLY_MSS, - Q6V5_SUPPLY_PLL, -}; static int q6v5_regulator_init(struct device *dev, struct reg_info **regs_ref, char **reg_str, int volatage_load[][2]) @@ -206,33 +199,64 @@ static int q6v5_regulator_init(struct device *dev, return reg_count; } -static int q6v5_regulator_enable(struct q6v5 *qproc) +static int q6v5_regulator_enable(struct q6v5 *qproc, + struct reg_info *regs, int count) { - struct regulator *mss = qproc->supply[Q6V5_SUPPLY_MSS].consumer; - struct regulator *mx = qproc->supply[Q6V5_SUPPLY_MX].consumer; - int ret; + int i, rc = 0; + + for (i = 0; i < count; i++) { + if (regs[i].uV > 0) { + rc = regulator_set_voltage(regs[i].reg, + regs[i].uV, INT_MAX); + if (rc) { + dev_err(qproc->dev, + "Failed to request voltage for %d.\n", + i); + goto err_voltage; + } + } - /* TODO: Q6V5_SUPPLY_CX is supposed to be set to super-turbo here */ + if (regs[i].uA > 0) { + rc = regulator_set_load(regs[i].reg, + regs[i].uA); + if (rc < 0) { + dev_err(qproc->dev, "Failed to set regulator mode\n"); + goto err_load; + } + } - ret = regulator_set_voltage(mx, 1050000, INT_MAX); - if (ret) - return ret; + rc = regulator_enable(regs[i].reg); + if (rc) { + dev_err(qproc->dev, "Regulator enable failed\n"); + goto err_enable; + } + } - regulator_set_voltage(mss, 1000000, 1150000); + return 0; +err_enable: + if (regs[i].uA > 0) { + regulator_set_voltage(regs[i].reg, 0, INT_MAX); + regulator_set_load(regs[i].reg, 0); + } +err_load: + if (regs[i].uV > 0) + regulator_set_voltage(regs[i].reg, 0, INT_MAX); +err_voltage: + for (i--; i >= 0; i--) { + if (regs[i].uV > 0) + regulator_set_voltage(regs[i].reg, 0, INT_MAX); + + if (regs[i].uA > 0) + regulator_set_load(regs[i].reg, 0); + + regulator_disable(regs[i].reg); + } - return regulator_bulk_enable(ARRAY_SIZE(qproc->supply), qproc->supply); + return rc; } static void q6v5_regulator_disable(struct q6v5 *qproc) { - struct regulator *mss = qproc->supply[Q6V5_SUPPLY_MSS].consumer; - struct regulator *mx = qproc->supply[Q6V5_SUPPLY_MX].consumer; - - /* TODO: Q6V5_SUPPLY_CX corner votes should be released */ - - regulator_bulk_disable(ARRAY_SIZE(qproc->supply), qproc->supply); - regulator_set_voltage(mx, 0, INT_MAX); - regulator_set_voltage(mss, 0, 1150000); } static int q6v5_load(struct rproc *rproc, const struct firmware *fw) @@ -524,12 +548,19 @@ static int q6v5_start(struct rproc *rproc) struct q6v5 *qproc = (struct q6v5 *)rproc->priv; int ret; - ret = q6v5_regulator_enable(qproc); + ret = q6v5_regulator_enable(qproc, qproc->proxy_regs, + qproc->proxy_reg_count); if (ret) { - dev_err(qproc->dev, "failed to enable supplies\n"); + dev_err(qproc->dev, "failed to enable proxy supplies\n"); return ret; } + ret = q6v5_regulator_enable(qproc, qproc->active_regs, + qproc->active_reg_count); + if (ret) { + dev_err(qproc->dev, "failed to enable supplies\n"); + goto disable_proxy_clk; + } ret = reset_control_deassert(qproc->mss_restart); if (ret) { dev_err(qproc->dev, "failed to deassert mss restart\n"); @@ -599,7 +630,7 @@ static int q6v5_start(struct rproc *rproc) reset_control_assert(qproc->mss_restart); disable_vdd: q6v5_regulator_disable(qproc); - +disable_proxy_clk: return ret; }