From patchwork Wed Jan 22 19:04:46 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hans de Goede X-Patchwork-Id: 3525381 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 0F3C59F1C3 for ; Wed, 22 Jan 2014 19:59:56 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id C32BC20179 for ; Wed, 22 Jan 2014 19:59:54 +0000 (UTC) Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id B21D020176 for ; Wed, 22 Jan 2014 19:59:53 +0000 (UTC) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1W63Ak-0002dF-Sp; Wed, 22 Jan 2014 19:09:12 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1W639o-0000a3-8P; Wed, 22 Jan 2014 19:08:12 +0000 Received: from mx1.redhat.com ([209.132.183.28]) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1W637R-0000Ke-Kq for linux-arm-kernel@lists.infradead.org; Wed, 22 Jan 2014 19:05:51 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s0MJ5O0l031137 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 22 Jan 2014 14:05:24 -0500 Received: from shalem.localdomain.com (vpn1-5-1.ams2.redhat.com [10.36.5.1]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s0MJ4oFl029525; Wed, 22 Jan 2014 14:05:21 -0500 From: Hans de Goede To: Tejun Heo Subject: [PATCH v5 11/14] ahci-imx: Add imx_ahci_phy_init / _exit helpers Date: Wed, 22 Jan 2014 20:04:46 +0100 Message-Id: <1390417489-5354-12-git-send-email-hdegoede@redhat.com> In-Reply-To: <1390417489-5354-1-git-send-email-hdegoede@redhat.com> References: <1390417489-5354-1-git-send-email-hdegoede@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20140122_140546_004618_4EA011BE X-CRM114-Status: GOOD ( 18.22 ) X-Spam-Score: -7.5 (-------) Cc: devicetree , Hans de Goede , linux-ide@vger.kernel.org, Oliver Schinagl , Richard Zhu , linux-sunxi@googlegroups.com, Maxime Ripard , linux-arm-kernel@lists.infradead.org, Roger Quadros X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Signed-off-by: Hans de Goede --- drivers/ata/ahci_imx.c | 142 +++++++++++++++++++++++++++---------------------- 1 file changed, 77 insertions(+), 65 deletions(-) diff --git a/drivers/ata/ahci_imx.c b/drivers/ata/ahci_imx.c index 2210866..e58e062 100644 --- a/drivers/ata/ahci_imx.c +++ b/drivers/ata/ahci_imx.c @@ -51,6 +51,7 @@ static int ahci_imx_hotplug; module_param_named(hotplug, ahci_imx_hotplug, int, 0644); MODULE_PARM_DESC(hotplug, "AHCI IMX hot-plug support (0=Don't support, 1=support)"); +static void imx_ahci_phy_exit(struct ahci_host_priv *hpriv); static void ahci_imx_host_stop(struct ata_host *host); static void ahci_imx_error_handler(struct ata_port *ap) @@ -78,10 +79,8 @@ static void ahci_imx_error_handler(struct ata_port *ap) */ reg_val = readl(mmio + PORT_PHY_CTL); writel(reg_val | PORT_PHY_CTL_PDDQ_LOC, mmio + PORT_PHY_CTL); - regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13, - IMX6Q_GPR13_SATA_MPLL_CLK_EN, - !IMX6Q_GPR13_SATA_MPLL_CLK_EN); - ahci_platform_disable_clks(hpriv); + + imx_ahci_phy_exit(hpriv); imxpriv->no_device = true; } @@ -98,40 +97,18 @@ static const struct ata_port_info ahci_imx_port_info = { .port_ops = &ahci_imx_ops, }; -static int imx_ahci_probe(struct platform_device *pdev) +static int imx_ahci_phy_init(struct ahci_host_priv *hpriv) { - struct device *dev = &pdev->dev; - struct ahci_host_priv *hpriv; - struct imx_ahci_priv *imxpriv; - unsigned int reg_val; + struct imx_ahci_priv *imxpriv = hpriv->plat_data; int rc; - imxpriv = devm_kzalloc(dev, sizeof(*imxpriv), GFP_KERNEL); - if (!imxpriv) - return -ENOMEM; - - hpriv = ahci_platform_get_resources(pdev); - if (IS_ERR(hpriv)) - return PTR_ERR(hpriv); - if (!hpriv->clks[CLK_AHB]) { - dev_err(dev, "no ahb clk, need sata, sata_ref and ahb clks\n"); - rc = -ENOENT; - goto put_resources; - } - hpriv->plat_data = imxpriv; - - imxpriv->gpr = - syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr"); - if (IS_ERR(imxpriv->gpr)) { - dev_err(dev, "failed to find fsl,imx6q-iomux-gpr regmap\n"); - rc = PTR_ERR(imxpriv->gpr); - goto put_resources; - } + if (imxpriv->no_device) + return 0; if (hpriv->target_pwr) { rc = regulator_enable(hpriv->target_pwr); if (rc) - goto put_resources; + return rc; } rc = ahci_platform_enable_clks(hpriv); @@ -144,7 +121,8 @@ static int imx_ahci_probe(struct platform_device *pdev) * is 0x07ffffff, and the other one write for setting * the mpll_clk_en. */ - regmap_update_bits(imxpriv->gpr, 0x34, IMX6Q_GPR13_SATA_RX_EQ_VAL_MASK + regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13 + , IMX6Q_GPR13_SATA_RX_EQ_VAL_MASK | IMX6Q_GPR13_SATA_RX_LOS_LVL_MASK | IMX6Q_GPR13_SATA_RX_DPLL_MODE_MASK | IMX6Q_GPR13_SATA_SPD_MODE_MASK @@ -162,9 +140,69 @@ static int imx_ahci_probe(struct platform_device *pdev) | IMX6Q_GPR13_SATA_TX_ATTEN_9_16 | IMX6Q_GPR13_SATA_TX_BOOST_3_33_DB | IMX6Q_GPR13_SATA_TX_LVL_1_025_V); - regmap_update_bits(imxpriv->gpr, 0x34, IMX6Q_GPR13_SATA_MPLL_CLK_EN, + + regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13, + IMX6Q_GPR13_SATA_MPLL_CLK_EN, IMX6Q_GPR13_SATA_MPLL_CLK_EN); - usleep_range(100, 200); + + usleep_range(1000, 2000); + return 0; + +disable_regulator: + if (hpriv->target_pwr) + regulator_disable(hpriv->target_pwr); + return rc; +} + +static void imx_ahci_phy_exit(struct ahci_host_priv *hpriv) +{ + struct imx_ahci_priv *imxpriv = hpriv->plat_data; + + if (imxpriv->no_device) + return; + + regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13, + IMX6Q_GPR13_SATA_MPLL_CLK_EN, + !IMX6Q_GPR13_SATA_MPLL_CLK_EN); + ahci_platform_disable_clks(hpriv); + + if (hpriv->target_pwr) + regulator_disable(hpriv->target_pwr); +} + +static int imx_ahci_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct ahci_host_priv *hpriv; + struct imx_ahci_priv *imxpriv; + unsigned int reg_val; + int rc; + + imxpriv = devm_kzalloc(dev, sizeof(*imxpriv), GFP_KERNEL); + if (!imxpriv) + return -ENOMEM; + + hpriv = ahci_platform_get_resources(pdev); + if (IS_ERR(hpriv)) + return PTR_ERR(hpriv); + if (!hpriv->clks[CLK_AHB]) { + dev_err(dev, "no ahb clk, need sata, sata_ref and ahb clks\n"); + rc = -ENOENT; + goto put_resources; + } + hpriv->plat_data = imxpriv; + + imxpriv->gpr = + syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr"); + if (IS_ERR(imxpriv->gpr)) { + dev_err(dev, "failed to find fsl,imx6q-iomux-gpr regmap\n"); + rc = PTR_ERR(imxpriv->gpr); + goto put_resources; + } + + rc = imx_ahci_phy_init(hpriv); + if (rc) + goto put_resources; /* * Configure the HWINIT bits of the HOST_CAP and HOST_PORTS_IMPL, @@ -189,15 +227,12 @@ static int imx_ahci_probe(struct platform_device *pdev) rc = ahci_platform_init_host(pdev, hpriv, &ahci_imx_port_info, 0, 0); if (rc) - goto disable_clks; + goto phy_exit; return 0; -disable_clks: - ahci_platform_disable_clks(hpriv); -disable_regulator: - if (hpriv->target_pwr) - regulator_disable(hpriv->target_pwr); +phy_exit: + imx_ahci_phy_exit(hpriv); put_resources: ahci_platform_put_resources(hpriv); return rc; @@ -206,18 +241,8 @@ put_resources: static void ahci_imx_host_stop(struct ata_host *host) { struct ahci_host_priv *hpriv = host->private_data; - struct imx_ahci_priv *imxpriv = hpriv->plat_data; - - if (!imxpriv->no_device) { - regmap_update_bits(imxpriv->gpr, 0x34, - IMX6Q_GPR13_SATA_MPLL_CLK_EN, - !IMX6Q_GPR13_SATA_MPLL_CLK_EN); - ahci_platform_disable_clks(hpriv); - } - - if (hpriv->target_pwr) - regulator_disable(hpriv->target_pwr); + imx_ahci_phy_exit(hpriv); ahci_platform_put_resources(hpriv); } @@ -225,26 +250,13 @@ static int imx_ahci_suspend(struct device *dev) { struct ata_host *host = dev_get_drvdata(dev); struct ahci_host_priv *hpriv = host->private_data; - struct imx_ahci_priv *imxpriv = hpriv->plat_data; int rc; rc = ahci_platform_suspend_host(dev); if (rc) return rc; - /* - * If no_device is set, The CLKs had been gated off in the - * initialization so don't do it again here. - */ - if (!imxpriv->no_device) { - regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13, - IMX6Q_GPR13_SATA_MPLL_CLK_EN, - !IMX6Q_GPR13_SATA_MPLL_CLK_EN); - ahci_platform_disable_clks(hpriv); - } - - if (hpriv->target_pwr) - regulator_disable(hpriv->target_pwr); + imx_ahci_phy_exit(hpriv); return 0; }