From patchwork Thu Sep 8 09:11:36 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lee Jones X-Patchwork-Id: 75736 Delivered-To: patch@linaro.org Received: by 10.140.106.11 with SMTP id d11csp738031qgf; Thu, 8 Sep 2016 02:12:20 -0700 (PDT) X-Received: by 10.66.122.197 with SMTP id lu5mr44624345pab.122.1473325939758; Thu, 08 Sep 2016 02:12:19 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f4si32921353pfk.58.2016.09.08.02.12.19; Thu, 08 Sep 2016 02:12:19 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965354AbcIHJMK (ORCPT + 27 others); Thu, 8 Sep 2016 05:12:10 -0400 Received: from mail-wm0-f42.google.com ([74.125.82.42]:38461 "EHLO mail-wm0-f42.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758724AbcIHJMF (ORCPT ); Thu, 8 Sep 2016 05:12:05 -0400 Received: by mail-wm0-f42.google.com with SMTP id 1so76502708wmz.1 for ; Thu, 08 Sep 2016 02:12:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=cIvzNnwOfILOecAMNt65BFlNrV/fxhWNj3dIlctBnbc=; b=C8rqW3sNWTdlvx0nGclNq0Ndn/hMkPYx9i+pailcr7HM/BPVpuulp1gChso3IaheJO RnoUdixmBl47oP+6ts9Tmt5k2Y9lqtFTF/oKTMlile6Zpu7KbvWpBOeG3B0NZ+d9dAGs +clEBZDbZcPcMTLRZVnNyc4ld28sBBkwftj40= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=cIvzNnwOfILOecAMNt65BFlNrV/fxhWNj3dIlctBnbc=; b=GLlKjn87EqsuarR1A8nP6I8JeXR0oqwY+U5d6bL0+YIrSWTxvnCvRsdARSD8TtAsuG V/JaHxiLnVbkzA7S8O5ebYZM7Lv5D3zc06gXhvXW9oU14G8f+6WRZgTUwCP3MfhlGyr7 QiIzpiteXTb5nKNi1u3qldXRRpoqBlfiSFwPPQ5jORsP5Tr22Ywk/hDCgMIN3lNsEWQJ 4F9+5GPStWgn9029o4TtgIzNJAV1OeejQFSVV9WF4By4eH7kg03/4QusyqKKfGRlQog3 +WaHgk4w80OfkX/crxRiObgs3mxHoM4/tCWQdFLsBG6F5SJ1BG1fdGf7kJj1SXPqt5TH pCOA== X-Gm-Message-State: AE9vXwP8j/gyGiKk0NUXifctarAvdqq1rIfZ0BDKz+vufNmgJjuRjuDF4cpcFI+DcoRXVb9I X-Received: by 10.194.164.65 with SMTP id yo1mr14058144wjb.181.1473325923935; Thu, 08 Sep 2016 02:12:03 -0700 (PDT) Received: from localhost.localdomain ([217.46.108.207]) by smtp.gmail.com with ESMTPSA id yj3sm27535005wjb.43.2016.09.08.02.12.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 08 Sep 2016 02:12:03 -0700 (PDT) From: Lee Jones To: ulf.hansson@linaro.org, patrice.chotard@st.com, peter.griffin@linaro.org, robh@kernel.org Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kernel@stlinux.com, Lee Jones , stable@vger.kernel.org Subject: [PATCH 4/4] mmc: sdhci-st: Handle interconnect clock Date: Thu, 8 Sep 2016 10:11:36 +0100 Message-Id: <20160908091136.17301-5-lee.jones@linaro.org> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20160908091136.17301-1-lee.jones@linaro.org> References: <20160908091136.17301-1-lee.jones@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Some ST platforms contain interconnect (ICN) clocks which must be handed correctly in order to obtain full functionality of a given IP. In this case, if the ICN clocks are not handled properly by the ST SDHCI driver MMC will break and the following output can be observed: [ 13.916949] mmc0: Timeout waiting for hardware interrupt. [ 13.922349] sdhci: =========== REGISTER DUMP (mmc0)=========== [ 13.928175] sdhci: Sys addr: 0x00000000 | Version: 0x00001002 [ 13.933999] sdhci: Blk size: 0x00007040 | Blk cnt: 0x00000001 [ 13.939825] sdhci: Argument: 0x00fffff0 | Trn mode: 0x00000013 [ 13.945650] sdhci: Present: 0x1fff0206 | Host ctl: 0x00000011 [ 13.951475] sdhci: Power: 0x0000000f | Blk gap: 0x00000080 [ 13.957300] sdhci: Wake-up: 0x00000000 | Clock: 0x00003f07 [ 13.963126] sdhci: Timeout: 0x00000004 | Int stat: 0x00000000 [ 13.968952] sdhci: Int enab: 0x02ff008b | Sig enab: 0x02ff008b [ 13.974777] sdhci: AC12 err: 0x00000000 | Slot int: 0x00000000 [ 13.980602] sdhci: Caps: 0x21ed3281 | Caps_1: 0x00000000 [ 13.986428] sdhci: Cmd: 0x0000063a | Max curr: 0x00000000 [ 13.992252] sdhci: Host ctl2: 0x00000000 [ 13.996166] sdhci: ADMA Err: 0x00000000 | ADMA Ptr: 0x7c048200 [ 14.001990] sdhci: =========================================== [ 14.009802] mmc0: Got data interrupt 0x02000000 even though no data operation was in progress. A decent point was raised about minimising the use of a local variable that we 'could' do without. I've chosen consistency over the possibility of reducing the local variable count by 1. Thinking that it's more important for the code to be grouped and authoured in a similar manner/style for greater maintainability/readability. Cc: stable@vger.kernel.org Tested-by: Peter Griffin Signed-off-by: Lee Jones --- drivers/mmc/host/sdhci-st.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) -- 2.9.3 diff --git a/drivers/mmc/host/sdhci-st.c b/drivers/mmc/host/sdhci-st.c index c95ba83..ed92ce7 100644 --- a/drivers/mmc/host/sdhci-st.c +++ b/drivers/mmc/host/sdhci-st.c @@ -28,6 +28,7 @@ struct st_mmc_platform_data { struct reset_control *rstc; + struct clk *icnclk; void __iomem *top_ioaddr; }; @@ -353,7 +354,7 @@ static int sdhci_st_probe(struct platform_device *pdev) struct sdhci_host *host; struct st_mmc_platform_data *pdata; struct sdhci_pltfm_host *pltfm_host; - struct clk *clk; + struct clk *clk, *icnclk; int ret = 0; u16 host_version; struct resource *res; @@ -365,6 +366,11 @@ static int sdhci_st_probe(struct platform_device *pdev) return PTR_ERR(clk); } + /* ICN clock isn't compulsory, but use it if it's provided. */ + icnclk = devm_clk_get(&pdev->dev, "icn"); + if (IS_ERR(icnclk)) + icnclk = NULL; + rstc = devm_reset_control_get(&pdev->dev, NULL); if (IS_ERR(rstc)) rstc = NULL; @@ -389,6 +395,7 @@ static int sdhci_st_probe(struct platform_device *pdev) } clk_prepare_enable(clk); + clk_prepare_enable(icnclk); /* Configure the FlashSS Top registers for setting eMMC TX/RX delay */ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, @@ -400,6 +407,7 @@ static int sdhci_st_probe(struct platform_device *pdev) } pltfm_host->clk = clk; + pdata->icnclk = icnclk; /* Configure the Arasan HC inside the flashSS */ st_mmcss_cconfig(np, host); @@ -422,6 +430,7 @@ static int sdhci_st_probe(struct platform_device *pdev) return 0; err_out: + clk_disable_unprepare(icnclk); clk_disable_unprepare(clk); err_of: sdhci_pltfm_free(pdev); @@ -442,6 +451,8 @@ static int sdhci_st_remove(struct platform_device *pdev) ret = sdhci_pltfm_unregister(pdev); + clk_disable_unprepare(pdata->icnclk); + if (rstc) reset_control_assert(rstc); @@ -462,6 +473,7 @@ static int sdhci_st_suspend(struct device *dev) if (pdata->rstc) reset_control_assert(pdata->rstc); + clk_disable_unprepare(pdata->icnclk); clk_disable_unprepare(pltfm_host->clk); out: return ret; @@ -475,6 +487,7 @@ static int sdhci_st_resume(struct device *dev) struct device_node *np = dev->of_node; clk_prepare_enable(pltfm_host->clk); + clk_prepare_enable(pdata->icnclk); if (pdata->rstc) reset_control_deassert(pdata->rstc);