Skip to contentSkip to conversation

sh_clk: added clk_set_parent/clk_get_parent support

PATCH Applied Francesco VIRLINZI 3 participants 5 messages Mar 10, 2009 – Mar 11, 2009 SuperH

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 sh_clk: added clk_set_parent/clk_get_parent support

Hi all

I would add the following functions in the clock framework
- clk_set_parent
- clk_get_parent

and the utility function
- clk_for_each

Regards
Francesco

From 8b12a8d0c9d8adb86c70debbd2318ae7ef57784b Mon Sep 17 00:00:00 2001
From: Francesco Virlinzi <[email protected]>
Date: Tue, 10 Mar 2009 08:46:11 +0100
Subject: [PATCH] Clk set_parent/get_parent

This patch:
- adds set_parent/get_parent support
- adds clk_for_each utility function
- changes the callback function to return a value

---
 arch/sh/include/asm/clock.h |    9 ++++--
 arch/sh/kernel/cpu/clock.c  |   61 ++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 63 insertions(+), 7 deletions(-)
arch/sh/include/asm/clock.h +6 -3
index f9c8858..133f270 100644
@@ -10,11 +10,12 @@
 struct clk;
 
 struct clk_ops {
-	void (*init)(struct clk *clk);
-	void (*enable)(struct clk *clk);
-	void (*disable)(struct clk *clk);
+	int (*init)(struct clk *clk);
+	int (*enable)(struct clk *clk);
+	int (*disable)(struct clk *clk);
 	void (*recalc)(struct clk *clk);
 	int (*set_rate)(struct clk *clk, unsigned long rate, int algo_id);
+	int (*set_parent)(struct clk *clk, struct clk *parent);
 	long (*round_rate)(struct clk *clk, unsigned long rate);
 };
 
@@ -49,6 +50,8 @@ void clk_recalc_rate(struct clk *);
 int clk_register(struct clk *);
 void clk_unregister(struct clk *);
 
+int clk_for_each(int (*fn)(struct clk *clk, void *data), void *data);
+
 static inline int clk_always_enable(const char *id)
 {
 	struct clk *clk;
arch/sh/kernel/cpu/clock.c +57 -4

97 lines not on this page · raw message

Signature · 1 line
1.5.6.6
#1 lore raw

Hi Francesco,

Thanks for your work on this!

Quoted 3 lines · Francesco VIRLINZI

I would add the following functions in the clock framework
- clk_set_parent
- clk_get_parent

1) I agree about adding the functions above.

Quoted 2 lines

and the utility function
- clk_for_each

2) As much as I like functions like this, where is this used?

(From patch header)

Quoted 1 line

- changes the callback function to return a value

3) These changes break other code. You need to update cpu/sh4a/clock-* files as well. I agree about init and enable, but why does the disable callback need to return something?

Please break out 1) and resubmit it inline to begin with. Let's deal with 2) and 3) separately.

Cheers,

/ magnus

#2 lore raw
In reply to Francesco VIRLINZI
Quoted 18 lines · Magnus Damm

Hi Francesco,

Thanks for your work on this!

Quoted 3 lines · Francesco VIRLINZI

I would add the following functions in the clock framework
- clk_set_parent
- clk_get_parent

1) I agree about adding the functions above.

Quoted 2 lines

and the utility function
- clk_for_each

2) As much as I like functions like this, where is this used?

(From patch header)

Quoted 9 lines
Quoted 1 line

- changes the callback function to return a value

3) These changes break other code. You need to update cpu/sh4a/clock-* files as well. I agree about init and enable, but why does the disable callback need to return something?

Please break out 1) and resubmit it inline to begin with. Let's deal with 2) and 3) separately.

Agreed. 1) can be merged as is, as it doesn't really impact anything, and matches updates to linux/clk.h, even if we don't use them today. 2) needs a user before we consider merging it, and 3) needs to include the updates to all of the clock files if we are to merge it, as this change will have to be made in one shot. It's not clear why the return value is something we care about in most of these cases, so I'm rather less enthusiastic about making such a sweeping change.

For now, I'll fold 1) in to the tree. 2) and 3) can be added later if and when the aforementioned issues are resolved.

#3 lore raw

PATCH 1/1 sh_clk: added clk_set_parent/clk_get_parent v2

In reply to Francesco VIRLINZI

From 96d7aa00af83ecb4a3660ace507221b959aa12f1 Mon Sep 17 00:00:00 2001
From: Francesco Virlinzi <[email protected]>
Date: Wed, 11 Mar 2009 08:09:16 +0100
Subject: [PATCH] sh_clk: Add clk_set_parent/clk_get_parent support

This patch adds the clk_set_parent/clk_get_parent in the sh clock framework

---
 arch/sh/include/asm/clock.h |    1 +
 arch/sh/kernel/cpu/clock.c  |   29 +++++++++++++++++++++++++++++
 2 files changed, 30 insertions(+), 0 deletions(-)
arch/sh/include/asm/clock.h +1 -0
index f9c8858..2f6c962 100644
@@ -15,6 +15,7 @@ struct clk_ops {
 	void (*disable)(struct clk *clk);
 	void (*recalc)(struct clk *clk);
 	int (*set_rate)(struct clk *clk, unsigned long rate, int algo_id);
+	int (*set_parent)(struct clk *clk, struct clk *parent);
 	long (*round_rate)(struct clk *clk, unsigned long rate);
 };
 
arch/sh/kernel/cpu/clock.c +29 -0
index 7b17137..332a179 100644
@@ -239,6 +239,35 @@ void clk_recalc_rate(struct clk *clk)
 }
 EXPORT_SYMBOL_GPL(clk_recalc_rate);
 
+int clk_set_parent(struct clk *clk, struct clk *parent)
+{
+	int ret = -EINVAL;
+	struct clk *old;
+
+	if (!parent || !clk)
+		return ret;
+
+	old = clk->parent;
+	if (likely(clk->ops && clk->ops->set_parent)) {
+		unsigned long flags;
+		spin_lock_irqsave(&clock_lock, flags);
+		ret = clk->ops->set_parent(clk, parent);
+		spin_unlock_irqrestore(&clock_lock, flags);
+		clk->parent = (ret ? old : parent);
+	}
+
+	if (unlikely(clk->flags & CLK_RATE_PROPAGATES))
+		propagate_rate(clk);
+	return ret;
+}
+EXPORT_SYMBOL_GPL(clk_set_parent);
+
+struct clk *clk_get_parent(struct clk *clk)
+{
+	return clk->parent;
+}
+EXPORT_SYMBOL_GPL(clk_get_parent);
+
 long clk_round_rate(struct clk *clk, unsigned long rate)
 {
 	if (likely(clk->ops && clk->ops->round_rate)) {
Signature · 1 line
1.5.6.6