From patchwork Tue Sep 23 19:20:54 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Srinivas Kandagatla X-Patchwork-Id: 37750 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-we0-f199.google.com (mail-we0-f199.google.com [74.125.82.199]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 08FB220970 for ; Tue, 23 Sep 2014 19:21:14 +0000 (UTC) Received: by mail-we0-f199.google.com with SMTP id t60sf2868789wes.10 for ; Tue, 23 Sep 2014 12:21:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:sender:precedence:list-id:x-original-sender :x-original-authentication-results:mailing-list:list-post:list-help :list-archive:list-unsubscribe; bh=f3k72pnIpZfHefCW/WtsMRZINGRJrnzlTeE3ryJVUA0=; b=lZWEb7yA53zNM9moXqZ4QvEHqiJlftO0z/jkbeRsEnta/b5LCk+DFbipehOz1Z0vOA SggE09htEcgamzq7+WrKXMUyCI5BZ36Yaakx8MLTaQwgt59rC9XrDCxNk5u72321ecwP i+noBirWJP1SuZs1Nru16oYdxQvxoypAh/1wrQ3WU+VvQ20zVDe+NjtgSONUKAKRQxIk GLU25xGc+nmrFOBOpqZj9gAD19vz/gvT+bsDOg/gyjqL2DveN0B3tSYIPnQqBSxBQUtx l+eWyLm6luvVV9nan2Q6+V554AEEjOT8fg2gVpcq3ISI3xpOJZdTrrdL4f/Mh/YWTlRn JRaw== X-Gm-Message-State: ALoCoQnNfBuJd+N6uA821p5kNfcVBaaNkoLTksHjCJgnCVSrW7WrgRVAiedvE7gwLcGZS/eUtgYp X-Received: by 10.194.100.3 with SMTP id eu3mr21976wjb.6.1411500073891; Tue, 23 Sep 2014 12:21:13 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.204.99 with SMTP id kx3ls91180lac.7.gmail; Tue, 23 Sep 2014 12:21:13 -0700 (PDT) X-Received: by 10.112.54.135 with SMTP id j7mr1441519lbp.51.1411500073703; Tue, 23 Sep 2014 12:21:13 -0700 (PDT) Received: from mail-la0-f50.google.com (mail-la0-f50.google.com [209.85.215.50]) by mx.google.com with ESMTPS id jf6si20007540lac.14.2014.09.23.12.21.13 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 23 Sep 2014 12:21:13 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.50 as permitted sender) client-ip=209.85.215.50; Received: by mail-la0-f50.google.com with SMTP id ty20so9230539lab.23 for ; Tue, 23 Sep 2014 12:21:13 -0700 (PDT) X-Received: by 10.152.246.6 with SMTP id xs6mr1720310lac.56.1411500073590; Tue, 23 Sep 2014 12:21:13 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.130.169 with SMTP id of9csp470924lbb; Tue, 23 Sep 2014 12:21:12 -0700 (PDT) X-Received: by 10.68.200.101 with SMTP id jr5mr2529687pbc.36.1411500072025; Tue, 23 Sep 2014 12:21:12 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id bo5si22351105pbc.192.2014.09.23.12.21.11 for ; Tue, 23 Sep 2014 12:21:12 -0700 (PDT) Received-SPF: none (google.com: linux-arm-msm-owner@vger.kernel.org does not designate permitted sender hosts) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751638AbaIWTVK (ORCPT + 5 others); Tue, 23 Sep 2014 15:21:10 -0400 Received: from mail-wi0-f173.google.com ([209.85.212.173]:45699 "EHLO mail-wi0-f173.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751307AbaIWTVJ (ORCPT ); Tue, 23 Sep 2014 15:21:09 -0400 Received: by mail-wi0-f173.google.com with SMTP id r20so5575796wiv.6 for ; Tue, 23 Sep 2014 12:21:07 -0700 (PDT) X-Received: by 10.180.198.10 with SMTP id iy10mr6007588wic.10.1411500067810; Tue, 23 Sep 2014 12:21:07 -0700 (PDT) Received: from srini-ThinkPad-X1-Carbon-2nd.dlink.com (host-78-149-10-230.as13285.net. [78.149.10.230]) by mx.google.com with ESMTPSA id q18sm3321898wik.12.2014.09.23.12.21.05 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 23 Sep 2014 12:21:06 -0700 (PDT) From: Srinivas Kandagatla To: khilman@linaro.org, arm@kernel.org Cc: agross@codeaurora.org, galak@codeaurora.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH v2] soc: qcom: do not disable the iface clock in probe Date: Tue, 23 Sep 2014 20:20:54 +0100 Message-Id: <1411500054-13600-1-git-send-email-srinivas.kandagatla@linaro.org> X-Mailer: git-send-email 1.9.1 Sender: linux-arm-msm-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: srinivas.kandagatla@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.50 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , since commit 31964ffebbb9 ("tty: serial: msm: Remove direct access to GSBI")' serial hangs if earlyprintk are enabled. This hang is noticed only when the GSBI driver is probed and all the earlyprintks before gsbi probe are seen on the console. The reason why it hangs is because GSBI driver disables hclk in its probe function without realizing that the serial IP might be in use by a bootconsole. As gsbi driver disables the clock in probe the bootconsole locks up. Turning off hclk's could be dangerous if there are system components like earlyprintk using the hclk. This patch fixes the issue by delegating the clock management to probe and remove functions in gsbi rather than disabling the clock in probe. More detailed problem description can be found here: http://www.spinics.net/lists/linux-arm-msm/msg10589.html Tested-by: Linus Walleij Signed-off-by: Srinivas Kandagatla --- Hi Kevin, Am resending this patch with reference to the problem and adding more details to the log. Could you pick this fix for the next rc, as this fixes a serial console hang with earlyprintk on SOCs like APQ8064. Changes since v1: - added more info in the change log as requested by Kumar and Kevin. thanks, srini drivers/soc/qcom/qcom_gsbi.c | 46 +++++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/drivers/soc/qcom/qcom_gsbi.c b/drivers/soc/qcom/qcom_gsbi.c index 447458e..7e1f120 100644 --- a/drivers/soc/qcom/qcom_gsbi.c +++ b/drivers/soc/qcom/qcom_gsbi.c @@ -22,44 +22,63 @@ #define GSBI_CTRL_REG 0x0000 #define GSBI_PROTOCOL_SHIFT 4 +struct gsbi_info { + struct clk *hclk; + u32 mode; + u32 crci; +}; + static int gsbi_probe(struct platform_device *pdev) { struct device_node *node = pdev->dev.of_node; struct resource *res; void __iomem *base; - struct clk *hclk; - u32 mode, crci = 0; + struct gsbi_info *gsbi; + + gsbi = devm_kzalloc(&pdev->dev, sizeof(*gsbi), GFP_KERNEL); + + if (!gsbi) + return -ENOMEM; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); base = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(base)) return PTR_ERR(base); - if (of_property_read_u32(node, "qcom,mode", &mode)) { + if (of_property_read_u32(node, "qcom,mode", &gsbi->mode)) { dev_err(&pdev->dev, "missing mode configuration\n"); return -EINVAL; } /* not required, so default to 0 if not present */ - of_property_read_u32(node, "qcom,crci", &crci); + of_property_read_u32(node, "qcom,crci", &gsbi->crci); - dev_info(&pdev->dev, "GSBI port protocol: %d crci: %d\n", mode, crci); + dev_info(&pdev->dev, "GSBI port protocol: %d crci: %d\n", + gsbi->mode, gsbi->crci); + gsbi->hclk = devm_clk_get(&pdev->dev, "iface"); + if (IS_ERR(gsbi->hclk)) + return PTR_ERR(gsbi->hclk); - hclk = devm_clk_get(&pdev->dev, "iface"); - if (IS_ERR(hclk)) - return PTR_ERR(hclk); + clk_prepare_enable(gsbi->hclk); - clk_prepare_enable(hclk); - - writel_relaxed((mode << GSBI_PROTOCOL_SHIFT) | crci, + writel_relaxed((gsbi->mode << GSBI_PROTOCOL_SHIFT) | gsbi->crci, base + GSBI_CTRL_REG); /* make sure the gsbi control write is not reordered */ wmb(); - clk_disable_unprepare(hclk); + platform_set_drvdata(pdev, gsbi); + + return of_platform_populate(node, NULL, NULL, &pdev->dev); +} + +static int gsbi_remove(struct platform_device *pdev) +{ + struct gsbi_info *gsbi = platform_get_drvdata(pdev); + + clk_disable_unprepare(gsbi->hclk); - return of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); + return 0; } static const struct of_device_id gsbi_dt_match[] = { @@ -76,6 +95,7 @@ static struct platform_driver gsbi_driver = { .of_match_table = gsbi_dt_match, }, .probe = gsbi_probe, + .remove = gsbi_remove, }; module_platform_driver(gsbi_driver);