From patchwork Thu Jun 9 08:58:12 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Viresh KUMAR X-Patchwork-Id: 99677 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id BEFA9B6FE8 for ; Thu, 9 Jun 2011 18:58:56 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752086Ab1FII6z (ORCPT ); Thu, 9 Jun 2011 04:58:55 -0400 Received: from eu1sys200aog120.obsmtp.com ([207.126.144.149]:50430 "EHLO eu1sys200aog120.obsmtp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751368Ab1FII6y (ORCPT ); Thu, 9 Jun 2011 04:58:54 -0400 Received: from beta.dmz-ap.st.com ([138.198.100.35]) (using TLSv1) by eu1sys200aob120.postini.com ([207.126.147.11]) with SMTP ID DSNKTfCLOwa5S16HhxG9zhrpVRgQCfSVLUN7@postini.com; Thu, 09 Jun 2011 08:58:53 UTC Received: from zeta.dmz-ap.st.com (ns6.st.com [138.198.234.13]) by beta.dmz-ap.st.com (STMicroelectronics) with ESMTP id 7FB7B11E; Thu, 9 Jun 2011 08:58:27 +0000 (GMT) Received: from Webmail-ap.st.com (eapex1hubcas1.st.com [10.80.176.8]) by zeta.dmz-ap.st.com (STMicroelectronics) with ESMTP id 5EC0FD75; Thu, 9 Jun 2011 08:58:27 +0000 (GMT) Received: from localhost (10.199.7.86) by Webmail-ap.st.com (10.80.176.7) with Microsoft SMTP Server (TLS) id 8.2.234.1; Thu, 9 Jun 2011 16:58:26 +0800 From: Viresh Kumar To: , Cc: , , , , , , , , , , Subject: [PATCH] ata/ahci_platform: Add support for enabling/disabling clock. Date: Thu, 9 Jun 2011 14:28:12 +0530 Message-ID: <211461c299bab630fda07f81963cab0b5f40c98d.1307609821.git.viresh.kumar@st.com> X-Mailer: git-send-email 1.7.2.2 MIME-Version: 1.0 Sender: linux-ide-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ide@vger.kernel.org On many architectures, drivers are supposed to enable/disable functional clock of device. This patch adds support for clock enabling/disabling in ahci_platform.c. Signed-off-by: Viresh Kumar --- drivers/ata/ahci.h | 4 ++++ drivers/ata/ahci_platform.c | 36 +++++++++++++++++++++++++++++++----- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h index 12c5282..fec6289 100644 --- a/drivers/ata/ahci.h +++ b/drivers/ata/ahci.h @@ -35,6 +35,7 @@ #ifndef _AHCI_H #define _AHCI_H +#include #include /* Enclosure Management Control */ @@ -296,6 +297,9 @@ struct ahci_host_priv { u32 em_loc; /* enclosure management location */ u32 em_buf_sz; /* EM buffer size in byte */ u32 em_msg_type; /* EM message type */ +#ifdef CONFIG_HAVE_CLK + struct clk *clk; /* clk structure, only if HAVE_CLK is defined */ +#endif }; extern int ahci_ignore_sss; diff --git a/drivers/ata/ahci_platform.c b/drivers/ata/ahci_platform.c index 6fef1fa..eaa4053 100644 --- a/drivers/ata/ahci_platform.c +++ b/drivers/ata/ahci_platform.c @@ -12,6 +12,7 @@ * any later version. */ +#include #include #include #include @@ -75,6 +76,20 @@ static int __init ahci_probe(struct platform_device *pdev) return -ENOMEM; } +#ifdef CONFIG_HAVE_CLK + hpriv->clk = clk_get(dev, NULL); + if (IS_ERR(hpriv->clk)) { + dev_err(dev, "Clock not found\n"); + return PTR_ERR(hpriv->clk); + } + + rc = clk_enable(hpriv->clk); + if (rc) { + dev_err(dev, "clock enable failed"); + goto free_clk; + } +#endif + /* * Some platforms might need to prepare for mmio region access, * which could be done in the following init call. So, the mmio @@ -84,7 +99,7 @@ static int __init ahci_probe(struct platform_device *pdev) if (pdata && pdata->init) { rc = pdata->init(dev, hpriv->mmio); if (rc) - return rc; + goto disable_clk; } ahci_save_initial_config(dev, hpriv, @@ -110,7 +125,7 @@ static int __init ahci_probe(struct platform_device *pdev) host = ata_host_alloc_pinfo(dev, ppi, n_ports); if (!host) { rc = -ENOMEM; - goto err0; + goto pdata_exit; } host->private_data = hpriv; @@ -140,7 +155,7 @@ static int __init ahci_probe(struct platform_device *pdev) rc = ahci_reset_controller(host); if (rc) - goto err0; + goto pdata_exit; ahci_init_controller(host); ahci_print_info(host, "platform"); @@ -148,12 +163,18 @@ static int __init ahci_probe(struct platform_device *pdev) rc = ata_host_activate(host, irq, ahci_interrupt, IRQF_SHARED, &ahci_platform_sht); if (rc) - goto err0; + goto pdata_exit; return 0; -err0: +pdata_exit: if (pdata && pdata->exit) pdata->exit(dev); +disable_clk: +#ifdef CONFIG_HAVE_CLK + clk_disable(hpriv->clk); +free_clk: + clk_put(hpriv->clk); +#endif return rc; } @@ -162,12 +183,17 @@ static int __devexit ahci_remove(struct platform_device *pdev) struct device *dev = &pdev->dev; struct ahci_platform_data *pdata = dev->platform_data; struct ata_host *host = dev_get_drvdata(dev); + struct ahci_host_priv *hpriv = host->private_data; ata_host_detach(host); if (pdata && pdata->exit) pdata->exit(dev); +#ifdef CONFIG_HAVE_CLK + clk_disable(hpriv->clk); + clk_put(hpriv->clk); +#endif return 0; }