Received: by 2002:ac0:bc90:0:0:0:0:0 with SMTP id a16csp3653383img; Mon, 25 Mar 2019 15:00:15 -0700 (PDT) X-Google-Smtp-Source: APXvYqxBX6EtQDAv7TYcXTiFgn4QoKEea3hORquWWg8edTbuwbRt2gl8UyuWv7dzgJrI0SOztmHh X-Received: by 2002:a65:6091:: with SMTP id t17mr25342873pgu.328.1553551215243; Mon, 25 Mar 2019 15:00:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553551215; cv=none; d=google.com; s=arc-20160816; b=k3+HazbG/9HSa02ZGYwOu+47qR5ph8Nes++wymcm4P6SwvuM3UrmJzzNClbx3+nYuZ 4XSMkRciYSeF+w+jOGzJejQ0wu9IYLLLvqQH+1PCr3f6s4O5/FXMaAtU22wBsLzGfplf bStInlQVijstojXB/9isqBehOBcxN308AKRHERG5xkw8qtsgePDv1ij8CCrHQEiLvq3b AlLaDU2ZkgzzKQET0XHY+p+QNAetiTRNluCXoPT8hfFI1BT1Ld/Y7L2GFUESjm4sUn+p WcD2Bvs1bJqymXXBR/35whmDnq6s8k37+4T83V93Vy4N3QbqJU+QEd6HZw45O9sjSMdV 3Yqg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=CxpIShRWs3Z0XOZ8vdG8R38nVCUS7QOmS9jiLMBHg+Q=; b=ogIQiZN4bL3foJNkfNiADv/AUgUtAUJ1ItLWlY8UxCxZVdl0FMVKBCBg13BYSZwihK 7aOHw7sAJarB2padcKrtXn0o09dVEibg91g5cF+FwnPNHS8ibKVVqKcNJboGh4MaO3VS 4xD8ge3W5Qzu05ZbFTkwJ45y+pXYDiLyFXLCce/SvPajboGGoAaS0SfuMF1TVRq5AanR 5Fle17fT38PQ1U369NXgyxw8n4EcH3MVSiw1p7AzGZTK8o4rjchPAxCvscZbFSk7FG3g kWxyK3wodX+c3XNNifqFZobBEBcT8bKKzsrbqUlxrI24dQisIVW/Mbh+DUOw10c1dcw3 BIkQ== 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 q29si15029202pfi.98.2019.03.25.15.00.00; Mon, 25 Mar 2019 15:00:15 -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 S1730601AbfCYV7L (ORCPT + 99 others); Mon, 25 Mar 2019 17:59:11 -0400 Received: from muru.com ([72.249.23.125]:42616 "EHLO muru.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729478AbfCYV7I (ORCPT ); Mon, 25 Mar 2019 17:59:08 -0400 Received: from hillo.muru.com (localhost [127.0.0.1]) by muru.com (Postfix) with ESMTP id F1FA78206; Mon, 25 Mar 2019 21:59:20 +0000 (UTC) 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: [PATCH 05/14] bus: ti-sysc: Add separate functions for handling clocks Date: Mon, 25 Mar 2019 14:58:40 -0700 Message-Id: <20190325215849.13182-6-tony@atomide.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190325215849.13182-1-tony@atomide.com> References: <20190325215849.13182-1-tony@atomide.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 >= 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 >= 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