From patchwork Fri Jan 25 11:40:55 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ulf Hansson X-Patchwork-Id: 14288 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id 1E0D023F02 for ; Fri, 25 Jan 2013 11:42:39 +0000 (UTC) Received: from mail-vb0-f52.google.com (mail-vb0-f52.google.com [209.85.212.52]) by fiordland.canonical.com (Postfix) with ESMTP id 9BF1DA19252 for ; Fri, 25 Jan 2013 11:42:38 +0000 (UTC) Received: by mail-vb0-f52.google.com with SMTP id fa15so179134vbb.39 for ; Fri, 25 Jan 2013 03:42:38 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:x-forwarded-to:x-forwarded-for:delivered-to:x-received :received-spf:from:to:cc:subject:date:message-id:x-mailer :in-reply-to:references:mime-version:content-type:x-gm-message-state; bh=4ciLsuhBkiBYVgQVqSHoV1CWkOA7/mdOeXfg5Fv2+IA=; b=TCrPu3PLyV8FtDH+JYmZ46kODpVmyB+MyCeZTRwgRUgPgxaNOOXJyA70Zt+ZYUjA2k qH1w55ifCruxOYKYMlwYsa4WV/asEErRZxYpp2BBEJ9OzyBmKg2TmAw9fEa8AeBMp2Nf ggE2F2DZkmHMlwnpbkQXAXih9dbmtXUMmkQV77X0ieosPTneQ7q9Q3pN19PvmT/SdVVp h8LS56NkU0qVo6ilAma7KoBr9ANcSzEVdOuqqe/hijPWv2K+TJ6BVZs1ts1gsJR2AdXV cStsfXaBVsNofP9apOrZPaJND06ENHwpH0rhPMAsKTcJiHOSkfc85tvN90I7eN3vChj/ KxZw== X-Received: by 10.52.88.168 with SMTP id bh8mr4780235vdb.51.1359114158070; Fri, 25 Jan 2013 03:42:38 -0800 (PST) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.58.145.101 with SMTP id st5csp111862veb; Fri, 25 Jan 2013 03:42:37 -0800 (PST) X-Received: by 10.204.9.4 with SMTP id j4mr1734933bkj.36.1359114156612; Fri, 25 Jan 2013 03:42:36 -0800 (PST) Received: from eu1sys200aog110.obsmtp.com (eu1sys200aog110.obsmtp.com [207.126.144.129]) by mx.google.com with SMTP id w2si1241967eel.78.2013.01.25.03.41.08 (version=TLSv1 cipher=RC4-SHA bits=128/128); Fri, 25 Jan 2013 03:42:36 -0800 (PST) Received-SPF: neutral (google.com: 207.126.144.129 is neither permitted nor denied by best guess record for domain of ulf.hansson@stericsson.com) client-ip=207.126.144.129; Authentication-Results: mx.google.com; spf=neutral (google.com: 207.126.144.129 is neither permitted nor denied by best guess record for domain of ulf.hansson@stericsson.com) smtp.mail=ulf.hansson@stericsson.com Received: from beta.dmz-us.st.com ([167.4.1.35]) (using TLSv1) by eu1sys200aob110.postini.com ([207.126.147.11]) with SMTP ID DSNKUQJvVFcwMOQ0DkvNwZbgkYEQlhE3l7IL@postini.com; Fri, 25 Jan 2013 11:41:11 UTC Received: from zeta.dmz-us.st.com (ns4.st.com [167.4.16.71]) by beta.dmz-us.st.com (STMicroelectronics) with ESMTP id 1C43D4D; Fri, 25 Jan 2013 11:40:21 +0000 (GMT) Received: from relay1.stm.gmessaging.net (unknown [10.230.100.17]) by zeta.dmz-us.st.com (STMicroelectronics) with ESMTP id C39A07A; Fri, 25 Jan 2013 05:57:00 +0000 (GMT) Received: from exdcvycastm022.EQ1STM.local (alteon-source-exch [10.230.100.61]) (using TLSv1 with cipher RC4-MD5 (128/128 bits)) (Client CN "exdcvycastm022", Issuer "exdcvycastm022" (not verified)) by relay1.stm.gmessaging.net (Postfix) with ESMTPS id 09FAA24C07C; Fri, 25 Jan 2013 12:41:00 +0100 (CET) Received: from steludxu1397.stericsson.com (10.230.100.153) by smtp.stericsson.com (10.230.100.30) with Microsoft SMTP Server (TLS) id 8.3.83.0; Fri, 25 Jan 2013 12:41:05 +0100 From: Ulf Hansson To: , Mike Turquette Cc: Linus Walleij , Philippe Begnic , Ulf Hansson Subject: [PATCH 1/3] clk: Remove _clk_reparent from API and restructure code Date: Fri, 25 Jan 2013 12:40:55 +0100 Message-ID: <1359114057-11681-2-git-send-email-ulf.hansson@stericsson.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1359114057-11681-1-git-send-email-ulf.hansson@stericsson.com> References: <1359114057-11681-1-git-send-email-ulf.hansson@stericsson.com> MIME-Version: 1.0 X-Gm-Message-State: ALoCoQldO1+vgKZ96kPDw86Ihz9UsSunxCyMHrhUwA11J7hf6BrKlNQUSslzlIIHpND6UVB4fMPt From: Ulf Hansson There shall be no reason for keeping this API available for clock providers. So we remove it from the API and restrcuture the code so for example the COMMON_CLK_DEBUG part is separated. This patch will also make it possible to hold the spinlock over the actual update of the clock tree topology, which could not be done before when both debugfs updates and clock rate updates was done within the same function. Signed-off-by: Ulf Hansson --- drivers/clk/clk.c | 82 ++++++++++++++++++++++++------------------ include/linux/clk-provider.h | 1 - 2 files changed, 48 insertions(+), 35 deletions(-) diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 593a2e4..2e10cc1 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -284,6 +284,39 @@ out: } /** + * clk_debug_reparent - reparent clk node in the debugfs clk tree + * @clk: the clk being reparented + * @new_parent: the new clk parent, may be NULL + * + * Rename clk entry in the debugfs clk tree if debugfs has been + * initialized. Otherwise it bails out early since the debugfs clk tree + * will be created lazily by clk_debug_init as part of a late_initcall. + * + * Caller must hold prepare_lock. + */ +static void clk_debug_reparent(struct clk *clk, struct clk *new_parent) +{ + struct dentry *d; + struct dentry *new_parent_d; + + if (!inited) + return; + + if (new_parent) + new_parent_d = new_parent->dentry; + else + new_parent_d = orphandir; + + d = debugfs_rename(clk->dentry->d_parent, clk->dentry, + new_parent_d, clk->name); + if (d) + clk->dentry = d; + else + pr_debug("%s: failed to rename debugfs entry for %s\n", + __func__, clk->name); +} + +/** * clk_debug_init - lazily create the debugfs clk tree visualization * * clks are often initialized very early during boot before memory can @@ -338,6 +371,9 @@ static int __init clk_debug_init(void) late_initcall(clk_debug_init); #else static inline int clk_debug_register(struct clk *clk) { return 0; } +static inline void clk_debug_reparent(struct clk *clk, struct clk *new_parent) +{ +} #endif /* caller must hold prepare_lock */ @@ -1179,16 +1215,8 @@ out: return ret; } -void __clk_reparent(struct clk *clk, struct clk *new_parent) +static void clk_reparent(struct clk *clk, struct clk *new_parent) { -#ifdef CONFIG_COMMON_CLK_DEBUG - struct dentry *d; - struct dentry *new_parent_d; -#endif - - if (!clk || !new_parent) - return; - hlist_del(&clk->child_node); if (new_parent) @@ -1196,28 +1224,7 @@ void __clk_reparent(struct clk *clk, struct clk *new_parent) else hlist_add_head(&clk->child_node, &clk_orphan_list); -#ifdef CONFIG_COMMON_CLK_DEBUG - if (!inited) - goto out; - - if (new_parent) - new_parent_d = new_parent->dentry; - else - new_parent_d = orphandir; - - d = debugfs_rename(clk->dentry->d_parent, clk->dentry, - new_parent_d, clk->name); - if (d) - clk->dentry = d; - else - pr_debug("%s: failed to rename debugfs entry for %s\n", - __func__, clk->name); -out: -#endif - clk->parent = new_parent; - - __clk_recalc_rates(clk, POST_RATE_CHANGE); } static int __clk_set_parent(struct clk *clk, struct clk *parent) @@ -1329,7 +1336,9 @@ int clk_set_parent(struct clk *clk, struct clk *parent) } /* propagate rate recalculation downstream */ - __clk_reparent(clk, parent); + clk_reparent(clk, parent); + clk_debug_reparent(clk, parent); + __clk_recalc_rates(clk, POST_RATE_CHANGE); out: mutex_unlock(&prepare_lock); @@ -1453,14 +1462,19 @@ int __clk_init(struct device *dev, struct clk *clk) hlist_for_each_entry_safe(orphan, tmp, tmp2, &clk_orphan_list, child_node) { if (orphan->ops->get_parent) { i = orphan->ops->get_parent(orphan->hw); - if (!strcmp(clk->name, orphan->parent_names[i])) - __clk_reparent(orphan, clk); + if (!strcmp(clk->name, orphan->parent_names[i])) { + clk_reparent(orphan, clk); + clk_debug_reparent(orphan, clk); + __clk_recalc_rates(orphan, POST_RATE_CHANGE); + } continue; } for (i = 0; i < orphan->num_parents; i++) if (!strcmp(clk->name, orphan->parent_names[i])) { - __clk_reparent(orphan, clk); + clk_reparent(orphan, clk); + clk_debug_reparent(orphan, clk); + __clk_recalc_rates(orphan, POST_RATE_CHANGE); break; } } diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index 4989b8a..87a7c2c 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h @@ -359,7 +359,6 @@ struct clk *__clk_lookup(const char *name); */ int __clk_prepare(struct clk *clk); void __clk_unprepare(struct clk *clk); -void __clk_reparent(struct clk *clk, struct clk *new_parent); unsigned long __clk_round_rate(struct clk *clk, unsigned long rate); struct of_device_id;