Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp407186yba; Wed, 3 Apr 2019 11:02:10 -0700 (PDT) X-Google-Smtp-Source: APXvYqzecy2TMmNUHwtg+hroUAMK7xqn/EaecqnZja5AapNgkA47bwZh4mH/m3PvhLNjjKhOF+0q X-Received: by 2002:a63:3dc8:: with SMTP id k191mr1056074pga.286.1554314530558; Wed, 03 Apr 2019 11:02:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554314530; cv=none; d=google.com; s=arc-20160816; b=Sb3IfBkfI0+TxZmb9/vhDR1vlaHH9tSHcjvLvsyoKNRKgwba0haPxvDSubnSWO9DO9 X6yTH8poATD1YJIhGg9dBekG0A2+BRMI9d7oM0DBY1NzZm2kpV9R4+ZDxqq4lBU6fD0F p9F/ncZHzb7NHEEKEZH4fb7cuU/FpAKYIk9KnKa4JS35OlrA1tbMTQBBBSaZ5rRK85zf f/YqvWG6Rg2rSB9KVM3W+EXfnn/DBhym/Jv4e7MaA5jwpNj6Iq/5TZzlxVAb/zgG0wrV hgWv33papQTa1qOtsA6wOMyOMNO5TQ2gbr1f3Oes9DERmJH3tSIPWDLCxortbTxPOlQB ytZQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=qbgnJgCf9dJkqWZUmsftZWpQBmGizQW7lcw0s40be8E=; b=uFtue0f+hu31gpwJC4xqU8kBOZthoowR0cG8pUj7qMuNs/FUUxxbXYHUKxG7Md1mRd yVssKD98yN6RN2FZc3ZyLgIkP+TbzNbY6NzhTLJR9SEj8cbPlh9JL01nJUJmin1EIw21 V6m213L+VNG+/4hM0qiutAbLPBJzIecG83JfK3FkRLpChIAucSGzp7PAnNOuDaRtYL/M QtOCoQF0HSm2Ui++4tFO7vGgh17hIj9SStx4t1LKfINv2ZgM0mz8VVYt5/7CYRPwSuew jILzm3nzx4lB0p2UGjj/Tk8n6tCxUaVxi6FOv7cGgGoseQN82xplZwazkttCvdSr8RwV ifpQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j21si5077134pgm.232.2019.04.03.11.01.54; Wed, 03 Apr 2019 11:02:10 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726510AbfDCSBA (ORCPT + 99 others); Wed, 3 Apr 2019 14:01:00 -0400 Received: from muru.com ([72.249.23.125]:44150 "EHLO muru.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726084AbfDCSBA (ORCPT ); Wed, 3 Apr 2019 14:01:00 -0400 Received: from atomide.com (localhost [127.0.0.1]) by muru.com (Postfix) with ESMTPS id 8B27C803A; Wed, 3 Apr 2019 18:01:12 +0000 (UTC) Date: Wed, 3 Apr 2019 11:00:54 -0700 From: Tony Lindgren To: linux-omap@vger.kernel.org Cc: Dave Gerlach , Faiz Abbas , Greg Kroah-Hartman , Keerthy , Nishanth Menon , Peter Ujfalusi , Roger Quadros , Suman Anna , Tero Kristo , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH 05/14] bus: ti-sysc: Add separate functions for handling clocks Message-ID: <20190403180054.GS49658@atomide.com> References: <20190325215849.13182-1-tony@atomide.com> <20190325215849.13182-6-tony@atomide.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190325215849.13182-6-tony@atomide.com> User-Agent: Mutt/1.11.4 (2019-03-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org * Tony Lindgren [190325 22:00]: > Let's also add error handling to shut down already enabled clocks > while at it. ... > --- a/drivers/bus/ti-sysc.c > +++ b/drivers/bus/ti-sysc.c > +err_disable: > + for (; i >= 0; i--) { > + clock = ddata->clocks[i]; > + > + /* Main clocks may not have ick */ > + if (IS_ERR_OR_NULL(clock)) > + continue; > + > + clk_disable(clock); > + } > + > + return error; > +} We need to ignore the current clock on error above and use for (i--; i >= 0; i--) instead. The same for sysc_enable_opt_clocks(). Updated patch below. Regards, Tony 8< -------------------- From tony Mon Sep 17 00:00:00 2001 From: Tony Lindgren Date: Thu, 21 Mar 2019 11:00:21 -0700 Subject: [PATCH] bus: ti-sysc: Add separate functions for handling clocks At least McPDM module depends on an external optional clock to be usable. To make handling of the McPDM clock easier in the following patches, let's add separate functions for handling the main clocks and the optional clocks. Let's also add error handling to shut down already enabled clocks while at it. Signed-off-by: Tony Lindgren --- drivers/bus/ti-sysc.c | 141 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 123 insertions(+), 18 deletions(-) diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c --- a/drivers/bus/ti-sysc.c +++ b/drivers/bus/ti-sysc.c @@ -231,6 +231,112 @@ static int sysc_get_clocks(struct sysc *ddata) return 0; } +static int sysc_enable_main_clocks(struct sysc *ddata) +{ + struct clk *clock; + int i, error; + + if (!ddata->clocks) + return 0; + + for (i = 0; i < SYSC_OPTFCK0; i++) { + clock = ddata->clocks[i]; + + /* Main clocks may not have ick */ + if (IS_ERR_OR_NULL(clock)) + continue; + + error = clk_enable(clock); + if (error) + goto err_disable; + } + + return 0; + +err_disable: + for (i--; i >= 0; i--) { + clock = ddata->clocks[i]; + + /* Main clocks may not have ick */ + if (IS_ERR_OR_NULL(clock)) + continue; + + clk_disable(clock); + } + + return error; +} + +static void sysc_disable_main_clocks(struct sysc *ddata) +{ + struct clk *clock; + int i; + + if (!ddata->clocks) + return; + + for (i = 0; i < SYSC_OPTFCK0; i++) { + clock = ddata->clocks[i]; + if (IS_ERR_OR_NULL(clock)) + continue; + + clk_disable(clock); + } +} + +static int sysc_enable_opt_clocks(struct sysc *ddata) +{ + struct clk *clock; + int i, error; + + if (!ddata->clocks) + return 0; + + for (i = SYSC_OPTFCK0; i < SYSC_MAX_CLOCKS; i++) { + clock = ddata->clocks[i]; + + /* Assume no holes for opt clocks */ + if (IS_ERR_OR_NULL(clock)) + return 0; + + error = clk_enable(clock); + if (error) + goto err_disable; + } + + return 0; + +err_disable: + for (i--; i >= 0; i--) { + clock = ddata->clocks[i]; + if (IS_ERR_OR_NULL(clock)) + continue; + + clk_disable(clock); + } + + return error; +} + +static void sysc_disable_opt_clocks(struct sysc *ddata) +{ + struct clk *clock; + int i; + + if (!ddata->clocks) + return; + + for (i = SYSC_OPTFCK0; i < SYSC_MAX_CLOCKS; i++) { + clock = ddata->clocks[i]; + + /* Assume no holes for opt clocks */ + if (IS_ERR_OR_NULL(clock)) + return; + + clk_disable(clock); + } +} + /** * sysc_init_resets - reset module on init * @ddata: device driver data @@ -667,7 +773,7 @@ static int __maybe_unused sysc_runtime_resume_legacy(struct device *dev, static int __maybe_unused sysc_runtime_suspend(struct device *dev) { struct sysc *ddata; - int error = 0, i; + int error = 0; ddata = dev_get_drvdata(dev); @@ -682,15 +788,10 @@ static int __maybe_unused sysc_runtime_suspend(struct device *dev) return error; } - for (i = 0; i < ddata->nr_clocks; i++) { - if (IS_ERR_OR_NULL(ddata->clocks[i])) - continue; + sysc_disable_main_clocks(ddata); - if (i >= SYSC_OPTFCK0 && !sysc_opt_clks_needed(ddata)) - break; - - clk_disable(ddata->clocks[i]); - } + if (sysc_opt_clks_needed(ddata)) + sysc_disable_opt_clocks(ddata); ddata->enabled = false; @@ -700,7 +801,7 @@ static int __maybe_unused sysc_runtime_suspend(struct device *dev) static int __maybe_unused sysc_runtime_resume(struct device *dev) { struct sysc *ddata; - int error = 0, i; + int error = 0; ddata = dev_get_drvdata(dev); @@ -715,20 +816,24 @@ static int __maybe_unused sysc_runtime_resume(struct device *dev) return error; } - for (i = 0; i < ddata->nr_clocks; i++) { - if (IS_ERR_OR_NULL(ddata->clocks[i])) - continue; - - if (i >= SYSC_OPTFCK0 && !sysc_opt_clks_needed(ddata)) - break; - - error = clk_enable(ddata->clocks[i]); + if (sysc_opt_clks_needed(ddata)) { + error = sysc_enable_opt_clocks(ddata); if (error) return error; } + error = sysc_enable_main_clocks(ddata); + if (error) + goto err_main_clocks; + ddata->enabled = true; + return 0; + +err_main_clocks: + if (sysc_opt_clks_needed(ddata)) + sysc_disable_opt_clocks(ddata); + return error; } -- 2.21.0