From mboxrd@z Thu Jan 1 00:00:00 1970 From: Srinivas Kandagatla Subject: Re: [RFC PATCH 1/2] soc: qcom: do not disable the iface clock in probe Date: Tue, 12 Aug 2014 05:25:49 +0100 Message-ID: <53E9974D.4080505@linaro.org> References: <1402410678-12931-1-git-send-email-srinivas.kandagatla@linaro.org> <1402410717-12977-1-git-send-email-srinivas.kandagatla@linaro.org> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Return-path: Received: from mail-pa0-f46.google.com ([209.85.220.46]:59887 "EHLO mail-pa0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752815AbaHLEZz (ORCPT ); Tue, 12 Aug 2014 00:25:55 -0400 Received: by mail-pa0-f46.google.com with SMTP id lj1so12222532pab.5 for ; Mon, 11 Aug 2014 21:25:54 -0700 (PDT) In-Reply-To: <1402410717-12977-1-git-send-email-srinivas.kandagatla@linaro.org> Sender: linux-arm-msm-owner@vger.kernel.org List-Id: linux-arm-msm@vger.kernel.org To: linux-arm-msm@vger.kernel.org Cc: agross@codeaurora.org Hi Andy/Kumar, If its not too late, Can we queue this fix for 3.17-rc1 or rc2? thanks, srini On 10/06/14 15:31, Srinivas Kandagatla wrote: > The use case here is when we have a bootconsole which is printing the > characters on serial console and gsbi driver comes up after some time. > As gsbi driver disables the clock in probe the bootconsole locks up. > > This patch fixes the problem by disabling the clock in platform remove > rather than in probe. > > Signed-off-by: Srinivas Kandagatla > --- > 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 ab7b441..64fb298 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); >