From patchwork Tue Aug 28 11:44:11 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonas Gorski X-Patchwork-Id: 10578295 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 7A27017DB for ; Tue, 28 Aug 2018 11:44:25 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6A7FE291ED for ; Tue, 28 Aug 2018 11:44:25 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5D8A629BEE; Tue, 28 Aug 2018 11:44:25 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 F1A82291ED for ; Tue, 28 Aug 2018 11:44:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727727AbeH1Pfk (ORCPT ); Tue, 28 Aug 2018 11:35:40 -0400 Received: from mail-wr1-f66.google.com ([209.85.221.66]:33784 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727124AbeH1Pfj (ORCPT ); Tue, 28 Aug 2018 11:35:39 -0400 Received: by mail-wr1-f66.google.com with SMTP id v90-v6so1295659wrc.0 for ; Tue, 28 Aug 2018 04:44:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=DYuMM0GVBE6anmnaaOzrljoRCkvsr4C8IhZprxX4SFw=; b=PaeuTl5IonmY3WwspqwULbp051RwPTWOcpohHln+IVWJHYw7wD5Iy3gvR9rZU/kiQ0 m6fcUe2UGed/iuMUNCAg3FEHe81LObWGVzt0BAteM9CMtTTzcbPwcCB9UVlXGy8MRQc6 eT5Ckz3WaVfiffvHKDBD/3ZPHL9Gca8vw52FszLZ23k0QzYlv/RgIR2pdmk/7KMQp0H9 /PXWYh6vh/nHP3owu2pdje7ON+WmeeX19andAHghsHmnkcbYvI9Dp3ruijWlYATIA674 RHk+PN61t9cX8sBAvcRCtgmB3RHF08+x9xxPFZO59icUmcqmuF+DuTfXfNiEfmS9cwtG PiBw== 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; bh=DYuMM0GVBE6anmnaaOzrljoRCkvsr4C8IhZprxX4SFw=; b=DclTd5aRa4ZlOfLhyW90TnTavvwPDtTJZ57l8SF3ei+Ruvn3Wy3o3WMDTXVWPD08t3 Qc7mIwVVJKGegvQFVypGJUsEUgvXvUUBi88WkOLNQjNrm6cs0fffbuGwueYuiY9T8vjp pmQirvDMmsQu425IZeHaEz7AGcfPdNIDMncGnExDYYI57cwVhbZPAMZLWxuR50vkoSbB JS7ctX2FjT0qQNFXmWtpYOd8d7LWF8asxRdJmfjq19ESYbRB/pMGsQ8segyDXbc7CuNA uqIjzYXa/fPdQX3udYBcOQvCKNZzBCKvWKZlzQaS/SoFNJqkzAGTLvu2N/pxgY18gYJx P8EA== X-Gm-Message-State: APzg51B9X+WjVJkt6hUmdAEkMqS5a4WrtUQcL9tlva9hNOyIEBxqN8Xc +T9/FKwMOJXhPFpQ5nE5oodHVzZF X-Google-Smtp-Source: ANB0VdY2EUbueJdLMaEhCblAGxwWYW694SGndUeotKrqltx2peoMLsoOCXTFXuVw5ifgZQz6whGiQg== X-Received: by 2002:adf:9306:: with SMTP id 6-v6mr928686wro.211.1535456661459; Tue, 28 Aug 2018 04:44:21 -0700 (PDT) Received: from localhost.localdomain ([2001:470:9e39::64]) by smtp.gmail.com with ESMTPSA id k63-v6sm1634683wmd.46.2018.08.28.04.44.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 28 Aug 2018 04:44:20 -0700 (PDT) From: Jonas Gorski To: linux-spi@vger.kernel.org Cc: Mark Brown , Florian Fainelli , Stefan Potyra Subject: [PATCH] spi/bcm63xx-hsspi: keep pll clk enabled Date: Tue, 28 Aug 2018 13:44:11 +0200 Message-Id: <20180828114411.6346-1-jonas.gorski@gmail.com> X-Mailer: git-send-email 2.13.2 Sender: linux-spi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-spi@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP If the pll clock needs to be enabled to get its rate, it will also need to be enabled to provide it. So ensure it is kept enabled through the lifetime of the device. Fixes: 0d7412ed1f5dc ("spi/bcm63xx-hspi: Enable the clock before calling clk_get_rate().") Signed-off-by: Jonas Gorski --- drivers/spi/spi-bcm63xx-hsspi.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/drivers/spi/spi-bcm63xx-hsspi.c b/drivers/spi/spi-bcm63xx-hsspi.c index c23849f7aa7b..9a06ffdb73b8 100644 --- a/drivers/spi/spi-bcm63xx-hsspi.c +++ b/drivers/spi/spi-bcm63xx-hsspi.c @@ -101,6 +101,7 @@ struct bcm63xx_hsspi { struct platform_device *pdev; struct clk *clk; + struct clk *pll_clk; void __iomem *regs; u8 __iomem *fifo; @@ -332,7 +333,7 @@ static int bcm63xx_hsspi_probe(struct platform_device *pdev) struct resource *res_mem; void __iomem *regs; struct device *dev = &pdev->dev; - struct clk *clk; + struct clk *clk, *pll_clk = NULL; int irq, ret; u32 reg, rate, num_cs = HSSPI_SPI_MAX_CS; @@ -358,7 +359,7 @@ static int bcm63xx_hsspi_probe(struct platform_device *pdev) rate = clk_get_rate(clk); if (!rate) { - struct clk *pll_clk = devm_clk_get(dev, "pll"); + pll_clk = devm_clk_get(dev, "pll"); if (IS_ERR(pll_clk)) { ret = PTR_ERR(pll_clk); @@ -373,19 +374,20 @@ static int bcm63xx_hsspi_probe(struct platform_device *pdev) clk_disable_unprepare(pll_clk); if (!rate) { ret = -EINVAL; - goto out_disable_clk; + goto out_disable_pll_clk; } } master = spi_alloc_master(&pdev->dev, sizeof(*bs)); if (!master) { ret = -ENOMEM; - goto out_disable_clk; + goto out_disable_pll_clk; } bs = spi_master_get_devdata(master); bs->pdev = pdev; bs->clk = clk; + bs->pll_clk = pll_clk; bs->regs = regs; bs->speed_hz = rate; bs->fifo = (u8 __iomem *)(bs->regs + HSSPI_FIFO_REG(0)); @@ -440,6 +442,8 @@ static int bcm63xx_hsspi_probe(struct platform_device *pdev) out_put_master: spi_master_put(master); +out_disable_pll_clk: + clk_disable_unprepare(pll_clk); out_disable_clk: clk_disable_unprepare(clk); return ret; @@ -453,6 +457,7 @@ static int bcm63xx_hsspi_remove(struct platform_device *pdev) /* reset the hardware and block queue progress */ __raw_writel(0, bs->regs + HSSPI_INT_MASK_REG); + clk_disable_unprepare(bs->pll_clk); clk_disable_unprepare(bs->clk); return 0; @@ -465,6 +470,7 @@ static int bcm63xx_hsspi_suspend(struct device *dev) struct bcm63xx_hsspi *bs = spi_master_get_devdata(master); spi_master_suspend(master); + clk_disable_unprepare(bs->pll_clk); clk_disable_unprepare(bs->clk); return 0; @@ -480,6 +486,12 @@ static int bcm63xx_hsspi_resume(struct device *dev) if (ret) return ret; + if (bs->pll_clk) { + ret = clk_prepare_enable(bs->pll_clk); + if (ret) + return ret; + } + spi_master_resume(master); return 0;