From patchwork Mon Mar 8 17:20:49 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thara Gopinath X-Patchwork-Id: 84090 X-Patchwork-Delegate: khilman@deeprootsystems.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o28HKFRf029641 for ; Mon, 8 Mar 2010 17:21:09 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754279Ab0CHRVI (ORCPT ); Mon, 8 Mar 2010 12:21:08 -0500 Received: from devils.ext.ti.com ([198.47.26.153]:48426 "EHLO devils.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754245Ab0CHRVF (ORCPT ); Mon, 8 Mar 2010 12:21:05 -0500 Received: from dbdp31.itg.ti.com ([172.24.170.98]) by devils.ext.ti.com (8.13.7/8.13.7) with ESMTP id o28HKxxR031377 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 8 Mar 2010 11:21:01 -0600 Received: from linfarm476.india.ti.com (localhost [127.0.0.1]) by dbdp31.itg.ti.com (8.13.8/8.13.8) with ESMTP id o28HKquN007410; Mon, 8 Mar 2010 22:50:53 +0530 (IST) Received: from linfarm476.india.ti.com (localhost [127.0.0.1]) by linfarm476.india.ti.com (8.12.11/8.12.11) with ESMTP id o28HKqIx030098; Mon, 8 Mar 2010 22:50:52 +0530 Received: (from a0393109@localhost) by linfarm476.india.ti.com (8.12.11/8.12.11/Submit) id o28HKq1X030096; Mon, 8 Mar 2010 22:50:52 +0530 From: Thara Gopinath To: linux-omap@vger.kernel.org Cc: khilman@deeprootsystems.com, paul@pwsan.com, nm@ti.com, vishwanath.bs@ti.com, sawant@ti.com, b-cousson@ti.com, Thara Gopinath Subject: [PATCH 1/3] OMAP3: PM: Bug fix in Smartreflex driver. Date: Mon, 8 Mar 2010 22:50:49 +0530 Message-Id: <1268068851-30022-2-git-send-email-thara@ti.com> X-Mailer: git-send-email 1.5.5 In-Reply-To: <1268068851-30022-1-git-send-email-thara@ti.com> References: <1268068851-30022-1-git-send-email-thara@ti.com> Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Mon, 08 Mar 2010 17:21:09 +0000 (UTC) diff --git a/arch/arm/mach-omap2/smartreflex.c b/arch/arm/mach-omap2/smartreflex.c index ca2223d..7aa84ab 100644 --- a/arch/arm/mach-omap2/smartreflex.c +++ b/arch/arm/mach-omap2/smartreflex.c @@ -108,9 +108,14 @@ static int sr_clk_enable(struct omap_sr *sr) { struct omap_smartreflex_data *pdata = sr->pdev->dev.platform_data; + if (!sr->is_sr_reset) + return 0; + if (pdata->device_enable) pdata->device_enable(sr->pdev); + sr->is_sr_reset = 0; + return 0; } @@ -118,6 +123,9 @@ static void sr_clk_disable(struct omap_sr *sr) { struct omap_smartreflex_data *pdata = sr->pdev->dev.platform_data; + if (sr->is_sr_reset) + return; + if (pdata->device_idle) pdata->device_idle(sr->pdev); @@ -262,7 +270,6 @@ static void sr_configure(struct omap_sr *sr) ERRCONFIG_MCUVALIDINTEN | ERRCONFIG_MCUVALIDINTST | ERRCONFIG_MCUBOUNDINTEN | ERRCONFIG_MCUBOUNDINTST)); } - sr->is_sr_reset = 0; } static void sr_start_vddautocomap(int srid) @@ -283,8 +290,7 @@ static void sr_start_vddautocomap(int srid) sr->is_autocomp_active = 1; if (!sr_class->enable(srid)) { sr->is_autocomp_active = 0; - if (sr->is_sr_reset == 1) - sr_clk_disable(sr); + sr_clk_disable(sr); } } @@ -303,8 +309,10 @@ static void sr_stop_vddautocomap(int srid) } if (sr->is_autocomp_active == 1) { - sr_class->disable(srid); - sr_clk_disable(sr); + if (!sr->is_sr_reset) { + sr_class->disable(srid); + sr_clk_disable(sr); + } sr->is_autocomp_active = 0; } @@ -357,6 +365,11 @@ int sr_enable(int srid, u32 target_opp_no) /* Enable the clocks and configure SR */ sr_clk_enable(sr); + + /* Check if SR is already enabled. If yes do nothing */ + if (sr_read_reg(sr, SRCONFIG) & SRCONFIG_SRENABLE) + return true; + sr_configure(sr); nvalue_reciprocal = pdata->sr_nvalue[target_opp_no - 1]; @@ -447,10 +460,8 @@ void omap_smartreflex_enable(int srid) } if (sr->is_autocomp_active == 1) { - if (sr->is_sr_reset == 1) { - if (!sr_class->enable(srid)) - sr_clk_disable(sr); - } + if (!sr_class->enable(srid)) + sr_clk_disable(sr); } } @@ -478,7 +489,7 @@ void omap_smartreflex_disable(int srid) } if (sr->is_autocomp_active == 1) { - if (sr->is_sr_reset == 0) { + if (!sr->is_sr_reset) { sr_class->disable(srid); /* Disable SR clk */ sr_clk_disable(sr);