All of lore.kernel.org
 help / color / mirror / Atom feed
* Locking in the clk API, part 2: clk_prepare/clk_unprepare
@ 2011-02-01  9:11 ` Jeremy Kerr
  0 siblings, 0 replies; 445+ messages in thread
From: Jeremy Kerr @ 2011-02-01  9:11 UTC (permalink / raw)
  To: linux-arm-kernel

Hi all,

> I suggested that clk_prepare() be callable only from non-atomic contexts,
> and do whatever's required to ensure that the clock is available.  That
> may end up enabling the clock as a result.

I think that clk_prepare/clk_unprepare looks like the most promising solution, 
so will try to get some preliminary patches done. Here's what I'm planning:

-----

The changes to the API are essentially:

1) Document clk_enable/clk_disable as callable from atomic contexts, and
   so clock implementations must not sleep within this function.

2) For clock implementations that may sleep to turn on a clock, we add a
   new pair of functions to the clock API: clk_prepare and clk_unprepare.

   These will provide hooks for the clock implmentation to do any sleepable
   work (eg, wait for PLLs to settle) in preparation for a later clk_enable.

   For the most common clock implemntation cases (where clocks can be enabled 
   atomically), these functions will be a no-op, and all of the enable/disable
   work can be done in clk_enable/clk_disable.

   For implementations where clocks require blocking on enable/disable, most
   of the work will be done in clk_prepare/clk_unprepare. The clk_enable
   and clk_disable functions may be no-ops.

For drivers, this means that clk_prepare must be called (and have returned) 
before calling clk_enable.

= Enable/Prepare counts =

I intend to do the enable and prepare "counting" in the core clock API, 
meaning that that the clk_ops callbacks will only invoked on the first 
prepare/enable and the last unprepare/disable.

= Concurrency =

Splitting the prepare and enable stages introduces the concurrency 
requirements:

1) clk_enable must not return before the clock is outputting a valid clock 
   signal.

2) clk_prepare must not return before the clock is fully prepared (ie, it is 
   safe to call clk_enable).

It is not possible for clk_enable to wait for the clock to be prepared, 
because that would require synchronisation with clk_prepare, which may then 
require blocking. Therefore:

3) The clock consumer *must* respect the proper ordering of clk_prepare and 
   clk_enable. For example, drivers that call clk_enable during an interrupt 
   must ensure that the interrupt handler will not be invoked until 
   clk_prepare has returned.

= Other considerations =

The time that a clock spends "prepared" is a superset of the the time that a 
clock spends "enabled". Therefore, clocks that are switched on during 
clk_prepare (ie, non-atomic clocks) will be running for a larger amount of 
time. In some cases, this can be mitigated by moving some of the final 
(atomic) switching functionality to the clk_enable function.

= Implementation =

Basically:

struct clk {
	const struct clk_ops *ops
	int                  enable_count;
	spinlock_t           enable_lock;
	int                  prepare_count;
	struct mutex         prepare_lock;
};

int clk_enable(struct clk *clk)
{
	int ret = 0;

	spin_lock(&clk->enable_lock);
	if (!clk->enable_count)
		ret = clk->ops->enable(clk);

	if (!ret)
		clk->enable_count++;
	spin_unlock(&clk->enable_lock);

	return ret;
}

int clk_prepare(struct clk *clk)
{
	int ret = 0;

	mutex_lock(&clk->prepare_lock);
	if (!clk->prepare_count)
		ret = clk->ops->prepare(clk);

	if (!ret)
		clk->prepare_count++;
	mutex_unlock(&clk->prepare_lock);

	return ret;
}

-----

Comments welcome, code coming soon.

Cheers,


Jeremy


^ permalink raw reply	[flat|nested] 445+ messages in thread
* [PATCH 0/2] Common struct clk implementation, v10
@ 2011-01-05  3:51 Jeremy Kerr
  2011-01-05  3:51   ` Jeremy Kerr
  0 siblings, 1 reply; 445+ messages in thread
From: Jeremy Kerr @ 2011-01-05  3:51 UTC (permalink / raw)
  To: linux-kernel, linux-arm-kernel; +Cc: Ben Herrenchmidt, Uwe Kleine-König

Hi all,

These patches are an attempt to allow platforms to share clock code. At
present, the definitions of 'struct clk' are local to platform code,
which makes allocating and initialising cross-platform clock sources
difficult, and makes it impossible to compile a single image containing
support for two ARM platforms with different struct clks.

The two patches are for the architecture-independent kernel code,
introducing the common clk infrastructure. The changelog for the first
patch includes details about the new clock definitions.

As requested by rmk, I've put together a small series of patches
illustrating the usage of the common struct clock on the ARM imx51
platform. These are available in my git tree:

 git://kernel.ubuntu.com/jk/dt/linux-2.6

in the clk-common-mx51 branch (clk-common..clk-common-mx51). There is
also a port for versatile (clk-common-versatile) in this tree too.

The approach I've taken with the imx51 port is to temporarly duplicate
the platform-common clock code (ie, for all mxc-based boards) to enable
usage of the common struct clk on one machine (imx51), while leaving the
others as-is. For a proper platform-wide usage of the common struct clk,
we'd be better off doing the whole platform at once. However, mx51 is
the only mxc-based HW I have, hence the duplicated example port.

In the example port, the first change simply converts the mxc's struct
clk to a struct clk_mxc, using the new API.  The subsequent patches move
certain clocks to more specific data structures (eg clk_fixed and
clk_pll) where possible.

Also, Yong Shen has contributed a patch to export a tree of clock data
(currently the clock rate and enable_count) through debugfs; this is in
the clk-common-debug branch.

Ben Herrenschmidt is looking at using common struct clk code for powerpc
too, hence the kernel-wide approach.

Many thanks to the following for their input:
 * Ben Dooks <ben-linux@fluff.org>
 * Baruch Siach <baruch@tkos.co.il>
 * Russell King <linux@arm.linux.org.uk>
 * Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
 * Lorenzo Pieralisi <Lorenzo.Pieralisi@arm.com>
 * Vincent Guittot <vincent.guittot@linaro.org>
 * Sascha Hauer <s.hauer@pengutronix.de>

Russell - now that we've had a few platforms ported to the common clk
infrastructure, I believe it's ready to merge. If so, do you want this
in the patch tracker? Otherwise, let me know what needs changing.

Cheers,


Jeremy

--
v10:
 * comment fixups, from Uwe's review
 * added DEFINE_CLK_FIXED

v9:
 * comment improvements
 * kerneldoc fixups
 * add WARN_ON to clk_disable

v8:
 * add atomic clocks, and locking wrappers
 * expand comments on clk and clk_ops

v7:
 * change CLK_INIT to initialise clk->mutex statically

v6:
 * fixed up references to 'clk_operations' in the changelog

v5:
 * uninline main API, and share definitions with !USE_COMMON_STRUCT_CLK
 * add __clk_get
 * delay mutex init
 * kerneldoc for struct clk

v4:
 * use mutex for enable/disable locking
 * DEFINE_CLK -> INIT_CLK, and pass the clk name for mutex init
 * struct clk_operations -> struct clk_ops

v3:
 * do clock usage refcounting in common code
 * provide sample port

v2:
 * no longer ARM-specific
 * use clk_operations

---
Jeremy Kerr (2):
      Add a common struct clk
      clk: Generic support for fixed-rate clocks


^ permalink raw reply	[flat|nested] 445+ messages in thread
* [PATCH 0/2] Common struct clk implementation, v10
@ 2011-01-05  3:18 Jeremy Kerr
  2011-01-05  3:18 ` [PATCH 1/2] Add a common struct clk Jeremy Kerr
  0 siblings, 1 reply; 445+ messages in thread
From: Jeremy Kerr @ 2011-01-05  3:18 UTC (permalink / raw)
  To: linux-arm-kernel

Hi all,

These patches are an attempt to allow platforms to share clock code. At
present, the definitions of 'struct clk' are local to platform code,
which makes allocating and initialising cross-platform clock sources
difficult, and makes it impossible to compile a single image containing
support for two ARM platforms with different struct clks.

The two patches are for the architecture-independent kernel code,
introducing the common clk infrastructure. The changelog for the first
patch includes details about the new clock definitions.

As requested by rmk, I've put together a small series of patches
illustrating the usage of the common struct clock on the ARM imx51
platform. These are available in my git tree:

 git://kernel.ubuntu.com/jk/dt/linux-2.6

in the clk-common-mx51 branch (clk-common..clk-common-mx51). There is
also a port for versatile (clk-common-versatile) in this tree too.

The approach I've taken with the imx51 port is to temporarly duplicate
the platform-common clock code (ie, for all mxc-based boards) to enable
usage of the common struct clk on one machine (imx51), while leaving the
others as-is. For a proper platform-wide usage of the common struct clk,
we'd be better off doing the whole platform at once. However, mx51 is
the only mxc-based HW I have, hence the duplicated example port.

In the example port, the first change simply converts the mxc's struct
clk to a struct clk_mxc, using the new API.  The subsequent patches move
certain clocks to more specific data structures (eg clk_fixed and
clk_pll) where possible.

Also, Yong Shen has contributed a patch to export a tree of clock data
(currently the clock rate and enable_count) through debugfs; this is in
the clk-common-debug branch.

Ben Herrenschmidt is looking at using common struct clk code for powerpc
too, hence the kernel-wide approach.

Many thanks to the following for their input:
 * Ben Dooks <ben-linux@fluff.org>
 * Baruch Siach <baruch@tkos.co.il>
 * Russell King <linux@arm.linux.org.uk>
 * Uwe Kleine-K?nig <u.kleine-koenig@pengutronix.de>
 * Lorenzo Pieralisi <Lorenzo.Pieralisi@arm.com>
 * Vincent Guittot <vincent.guittot@linaro.org>
 * Sascha Hauer <s.hauer@pengutronix.de>

Russell - now that we've had a few platforms ported to the common clk
infrastructure, I believe it's ready to merge. If so, do you want this
in the patch tracker? Otherwise, let me know what needs changing.

Cheers,


Jeremy

--
v10:
 * comment fixups, from Uwe's review
 * added DEFINE_CLK_FIXED

v9:
 * comment improvements
 * kerneldoc fixups
 * add WARN_ON to clk_disable

v8:
 * add atomic clocks, and locking wrappers
 * expand comments on clk and clk_ops

v7:
 * change CLK_INIT to initialise clk->mutex statically

v6:
 * fixed up references to 'clk_operations' in the changelog

v5:
 * uninline main API, and share definitions with !USE_COMMON_STRUCT_CLK
 * add __clk_get
 * delay mutex init
 * kerneldoc for struct clk

v4:
 * use mutex for enable/disable locking
 * DEFINE_CLK -> INIT_CLK, and pass the clk name for mutex init
 * struct clk_operations -> struct clk_ops

v3:
 * do clock usage refcounting in common code
 * provide sample port

v2:
 * no longer ARM-specific
 * use clk_operations

---
Jeremy Kerr (2):
      Add a common struct clk
      clk: Generic support for fixed-rate clocks

^ permalink raw reply	[flat|nested] 445+ messages in thread
* [PATCH 0/2] Common struct clk implementation, v8
@ 2010-12-08  2:08 Jeremy Kerr
  2010-12-08  2:08   ` Jeremy Kerr
  0 siblings, 1 reply; 445+ messages in thread
From: Jeremy Kerr @ 2010-12-08  2:08 UTC (permalink / raw)
  To: linux-arm-kernel; +Cc: linux-kernel

[apologies for the resend: missed this series description]

Hi all,

These patches are an attempt to allow platforms to share clock code. At
present, the definitions of 'struct clk' are local to platform code,
which makes allocating and initialising cross-platform clock sources
difficult, and makes it impossible to compile a single image containing
support for two ARM platforms with different struct clks.

The two patches are for the architecture-independent kernel code,
introducing the common clk infrastructure. The changelog for the first
patch includes details about the new clock definitions.

As requested by rmk, I've put together a small series of patches
illustrating the usage of the common struct clock on the ARM imx51
platform. These are available in my git tree:

 git://kernel.ubuntu.com/jk/dt/linux-2.6

in the clk-common-mx51 branch (clk-common..clk-common-mx51). There is
also a port  for versatile (clk-common-versatile) in this tree too.

The approach I've taken with the imx51 port is to temporarly duplicate
the platform-common clock code (ie, for all mxc-based boards) to enable
usage of the common struct clk on one machine (imx51), while leaving the
others as-is. For a proper platform-wide usage of the common struct clk,
we'd be better off doing the whole platform at once. However, mx51 is
the only mxc-based HW I have, hence the duplicated example port.

In the example port, the first change simply converts the mxc's struct
clk to a struct clk_mxc, using the new API.  The subsequent patches move
certain clocks to more specific data structures (eg clk_fixed and
clk_pll) where possible.

Ben Herrenschmidt is looking at using common struct clk code for powerpc
too, hence the kernel-wide approach.

Many thanks to the following for their input:
 * Ben Dooks <ben-linux@fluff.org>
 * Baruch Siach <baruch@tkos.co.il>
 * Russell King <linux@arm.linux.org.uk>
 * Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
 * Lorenzo Pieralisi <Lorenzo.Pieralisi@arm.com>
 * Vincent Guittot <vincent.guittot@linaro.org>

Russell - now that we've had a few platforms ported to the common clk
infrastructure, I believe it's ready to merge. If so, do you want this
in the patch tracker? Otherwise, let me know what needs changing.

Cheers,


Jeremy

--
v8:
 * add atomic clocks, and locking wrappers
 * expand comments on clk and clk_ops

v7:
 * change CLK_INIT to initialise clk->mutex statically

v6:
 * fixed up references to 'clk_operations' in the changelog

v5:
 * uninline main API, and share definitions with !USE_COMMON_STRUCT_CLK
 * add __clk_get
 * delay mutex init
 * kerneldoc for struct clk

v4:
 * use mutex for enable/disable locking
 * DEFINE_CLK -> INIT_CLK, and pass the clk name for mutex init
 * struct clk_operations -> struct clk_ops

v3:
 * do clock usage refcounting in common code
 * provide sample port

v2:
 * no longer ARM-specific
 * use clk_operations

---
Jeremy Kerr (2):
      Add a common struct clk
      clk: Generic support for fixed-rate clocks


^ permalink raw reply	[flat|nested] 445+ messages in thread
* [PATCH 1/2] Add a common struct clk
@ 2010-12-08  2:05 ` Jeremy Kerr
  0 siblings, 0 replies; 445+ messages in thread
From: Jeremy Kerr @ 2010-12-08  2:05 UTC (permalink / raw)
  To: linux-arm-kernel; +Cc: linux-kernel

We currently have ~21 definitions of struct clk in the ARM architecture,
each defined on a per-platform basis. This makes it difficult to define
platform- (or architecture-) independent clock sources without making
assumptions about struct clk, and impossible to compile two
platforms with different struct clks into a single image.

This change is an effort to unify struct clk where possible, by defining
a common struct clk, containing a set of clock operations. Different
clock implementations can set their own operations, and have a standard
interface for generic code. The callback interface is exposed to the
kernel proper, while the clock implementations only need to be seen by
the platform internals.

This allows us to share clock code among platforms, and makes it
possible to dynamically create clock devices in platform-independent
code.

Platforms can enable the generic struct clock through
CONFIG_USE_COMMON_STRUCT_CLK. In this case, the clock infrastructure
consists of a common struct clk:

struct clk {
	const struct clk_ops	*ops;
	unsigned int		enable_count;
	int			flags;
	union {
		struct mutex	mutex;
		spinlock_t	spinlock;
	} lock;
};

And a set of clock operations (defined per type of clock):

struct clk_ops {
	int             (*enable)(struct clk *);
	void            (*disable)(struct clk *);
	unsigned long   (*get_rate)(struct clk *);
	[...]
};

To define a hardware-specific clock, machine code can "subclass" the
struct clock into a new struct (adding any device-specific data), and
provide a set of operations:

struct clk_foo {
	struct clk	clk;
	void __iomem	*some_register;
};

struct clk_ops clk_foo_ops = {
	.get_rate = clk_foo_get_rate,
};

The common clock definitions are based on a development patch from Ben
Herrenschmidt <benh@kernel.crashing.org>.

Signed-off-by: Jeremy Kerr <jeremy.kerr@canonical.com>
Acked-by: Paulius Zaleckas <paulius.zaleckas@gmail.com>

---
 arch/Kconfig        |    3 
 include/linux/clk.h |  158 +++++++++++++++++++++++++++++++++++++++++---
 kernel/Makefile     |    1 
 kernel/clk.c        |  100 +++++++++++++++++++++++++++
 4 files changed, 253 insertions(+), 9 deletions(-)

diff --git a/arch/Kconfig b/arch/Kconfig
index 8bf0fa6..212bd3c 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -165,6 +165,9 @@ config HAVE_MIXED_BREAKPOINTS_REGS
 config HAVE_USER_RETURN_NOTIFIER
 	bool
 
+config USE_COMMON_STRUCT_CLK
+	bool
+
 config HAVE_PERF_EVENTS_NMI
 	bool
 	help
diff --git a/include/linux/clk.h b/include/linux/clk.h
index 1d37f42..e09e40e 100644
--- a/include/linux/clk.h
+++ b/include/linux/clk.h
@@ -3,6 +3,7 @@
  *
  *  Copyright (C) 2004 ARM Limited.
  *  Written by Deep Blue Solutions Limited.
+ *  Copyright (c) 2010 Jeremy Kerr <jeremy.kerr@canonical.com>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -11,18 +12,163 @@
 #ifndef __LINUX_CLK_H
 #define __LINUX_CLK_H
 
+#include <linux/err.h>
+#include <linux/mutex.h>
+#include <linux/spinlock.h>
+
 struct device;
 
-/*
- * The base API.
+#ifdef CONFIG_USE_COMMON_STRUCT_CLK
+
+#define CLK_ATOMIC	0x1
+
+/* If we're using the common struct clk, we define the base clk object here */
+
+/**
+ * struct clk - hardware independent clock structure
+ * @clk_ops:		implementation-specific ops for this clock
+ * @enable_count:	count of clk_enable() calls active on this clock
+ * @flags:		platform-independent flags
+ * @lock:		lock for enable/disable or other HW-specific ops
+ *
+ * The base clock object, used by drivers for hardware-independent manipulation
+ * of clock lines. This will be 'subclassed' by device-specific implementations,
+ * which add device-specific data to struct clk. For example:
+ *
+ *  struct clk_foo {
+ *      struct clk;
+ *      [device specific fields]
+ *  };
+ *
+ * The clock driver code will manage the device-specific data, and pass
+ * clk_foo.clk to the common clock code. The clock driver will be called
+ * through the @ops callbacks.
+ *
+ * The @lock member provides either a spinlock or a mutex to protect (at least)
+ * @enable_count. The type of lock used will depend on @flags; if CLK_ATOMIC is
+ * set, then the core clock code will use a spinlock, otherwise a mutex. This
+ * lock will be acquired during clk_enable and clk_disable, so for atomic
+ * clocks, these ops callbacks must not sleep.
+ *
+ * The choice of atomic or non-atomic clock depends on how the clock is enabled.
+ * Typically, you'll want to use a non-atomic clock. For clocks that need to be
+ * enabled/disabled in interrupt context, use CLK_ATOMIC. Note that atomic
+ * clocks with parents will typically cascade enable/disable operations to
+ * their parent, so the parent of an atomic clock *must* be atomic too.
+ */
+struct clk {
+	const struct clk_ops	*ops;
+	unsigned int		enable_count;
+	int			flags;
+	union {
+		struct mutex	mutex;
+		spinlock_t	spinlock;
+	} lock;
+};
+
+/* static initialiser for non-atomic clocks */
+#define INIT_CLK(name, o) {						\
+	.ops		= &o,						\
+	.enable_count	= 0,						\
+	.flags		= 0,						\
+	.lock.mutex	= __MUTEX_INITIALIZER(name.lock.mutex),		\
+}
+
+/* static initialiser for atomic clocks */
+#define INIT_CLK_ATOMIC(name, o) {					\
+	.ops		= &o,						\
+	.enable_count	= 0,						\
+	.flags		= CLK_ATOMIC,					\
+	.lock.spinlock	= __SPIN_LOCK_UNLOCKED(name.lock.spinlock),	\
+}
+
+/**
+ * clk_ops: Callback operations for clocks; these are to be provided by the
+ * clock implementation, and will be called by drivers through the clk_* API.
+ *
+ * @enable:	Enable the clock. This must not return until the clock is
+ *		generating a valid clock signal, usable by consumer devices.
+ *		Called with clk->lock held.
+ *
+ * @disable:	Disable the clock. Called with clk->lock held.
+ *
+ * @get	/ @put:	Called by the core clock code to notify the driver about
+ *		refounts as clk is passed to drivers. Optional.
+ *
+ * For other callbacks, see the corresponding clk_* functions. Parameters and
+ * return values are passed directly from/to these API functions directly, or
+ * -ENOSYS is returned if the callback is NULL, see kernel/clk.c for
+ * implementation details. All are optional.
  */
+struct clk_ops {
+       int		(*enable)(struct clk *);
+       void		(*disable)(struct clk *);
+       int		(*get)(struct clk *);
+       void		(*put)(struct clk *);
+       unsigned long	(*get_rate)(struct clk *);
+       long		(*round_rate)(struct clk *, unsigned long);
+       int		(*set_rate)(struct clk *, unsigned long);
+       int		(*set_parent)(struct clk *, struct clk *);
+       struct clk *	(*get_parent)(struct clk *);
+};
 
+static inline void __clk_lock(struct clk *clk)
+{
+	if (clk->flags & CLK_ATOMIC)
+		spin_lock(&clk->lock.spinlock);
+	else
+		mutex_lock(&clk->lock.mutex);
+}
+
+static inline void __clk_unlock(struct clk *clk)
+{
+	if (clk->flags & CLK_ATOMIC)
+		spin_unlock(&clk->lock.spinlock);
+	else
+		mutex_unlock(&clk->lock.mutex);
+}
+
+/**
+ * __clk_get - update clock-specific refcounter
+ *
+ * @clk: The clock to refcount
+ *
+ * Before a clock is returned from clk_get, this function should be called
+ * to update any clock-specific refcounting.
+ *
+ * Returns non-zero on success, zero on failure.
+ *
+ * Drivers should not need this function; it is only needed by the
+ * arch-specific clk_get() implementations.
+ */
+int __clk_get(struct clk *clk);
+
+/**
+ * clk_common_init - initialise a clock for driver usage
+ *
+ * Used for runtime intialization of clocks; you don't need to call this
+ * if your clock has been (statically) initialized with INIT_CLK.
+ */
+static inline void clk_common_init(struct clk *clk)
+{
+	clk->enable_count = 0;
+	if (clk->flags & CLK_ATOMIC)
+		spin_lock_init(&clk->lock.spinlock);
+	else
+		mutex_init(&clk->lock.mutex);
+}
+
+#else /* !CONFIG_USE_COMMON_STRUCT_CLK */
 
 /*
- * struct clk - an machine class defined object / cookie.
+ * Global clock object, actual structure is declared per-machine
  */
 struct clk;
 
+static inline void clk_common_init(struct clk *clk) { }
+
+#endif /* !CONFIG_USE_COMMON_STRUCT_CLK */
+
 /**
  * clk_get - lookup and obtain a reference to a clock producer.
  * @dev: device for clock "consumer"
@@ -83,12 +229,6 @@ unsigned long clk_get_rate(struct clk *clk);
  */
 void clk_put(struct clk *clk);
 
-
-/*
- * The remaining APIs are optional for machine class support.
- */
-
-
 /**
  * clk_round_rate - adjust a rate to the exact rate a clock can provide
  * @clk: clock source
diff --git a/kernel/Makefile b/kernel/Makefile
index 0b5ff08..01383a0 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -106,6 +106,7 @@ obj-$(CONFIG_PERF_EVENTS) += perf_event.o
 obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o
 obj-$(CONFIG_USER_RETURN_NOTIFIER) += user-return-notifier.o
 obj-$(CONFIG_PADATA) += padata.o
+obj-$(CONFIG_USE_COMMON_STRUCT_CLK) += clk.o
 
 ifneq ($(CONFIG_SCHED_OMIT_FRAME_POINTER),y)
 # According to Alan Modra <alan@linuxcare.com.au>, the -fno-omit-frame-pointer is
diff --git a/kernel/clk.c b/kernel/clk.c
new file mode 100644
index 0000000..1545e69
--- /dev/null
+++ b/kernel/clk.c
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2010 Canonical Ltd <jeremy.kerr@canonical.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Standard functionality for the common clock API.
+ */
+
+#include <linux/clk.h>
+#include <linux/module.h>
+
+int clk_enable(struct clk *clk)
+{
+	int ret = 0;
+
+	if (!clk->ops->enable)
+		return 0;
+
+	__clk_lock(clk);
+	if (!clk->enable_count)
+		ret = clk->ops->enable(clk);
+
+	if (!ret)
+		clk->enable_count++;
+	__clk_unlock(clk);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(clk_enable);
+
+void clk_disable(struct clk *clk)
+{
+	if (!clk->ops->disable)
+		return;
+
+	__clk_lock(clk);
+
+	if (!--clk->enable_count)
+		clk->ops->disable(clk);
+
+	__clk_unlock(clk);
+}
+EXPORT_SYMBOL_GPL(clk_disable);
+
+unsigned long clk_get_rate(struct clk *clk)
+{
+	if (clk->ops->get_rate)
+		return clk->ops->get_rate(clk);
+	return 0;
+}
+EXPORT_SYMBOL_GPL(clk_get_rate);
+
+int __clk_get(struct clk *clk)
+{
+	if (clk->ops->get)
+		return clk->ops->get(clk);
+	return 1;
+}
+EXPORT_SYMBOL_GPL(__clk_get);
+
+void clk_put(struct clk *clk)
+{
+	if (clk->ops->put)
+		clk->ops->put(clk);
+}
+EXPORT_SYMBOL_GPL(clk_put);
+
+long clk_round_rate(struct clk *clk, unsigned long rate)
+{
+	if (clk->ops->round_rate)
+		return clk->ops->round_rate(clk, rate);
+	return -ENOSYS;
+}
+EXPORT_SYMBOL_GPL(clk_round_rate);
+
+int clk_set_rate(struct clk *clk, unsigned long rate)
+{
+	if (clk->ops->set_rate)
+		return clk->ops->set_rate(clk, rate);
+	return -ENOSYS;
+}
+EXPORT_SYMBOL_GPL(clk_set_rate);
+
+int clk_set_parent(struct clk *clk, struct clk *parent)
+{
+	if (clk->ops->set_parent)
+		return clk->ops->set_parent(clk, parent);
+	return -ENOSYS;
+}
+EXPORT_SYMBOL_GPL(clk_set_parent);
+
+struct clk *clk_get_parent(struct clk *clk)
+{
+	if (clk->ops->get_parent)
+		return clk->ops->get_parent(clk);
+	return ERR_PTR(-ENOSYS);
+}
+EXPORT_SYMBOL_GPL(clk_get_parent);

^ permalink raw reply related	[flat|nested] 445+ messages in thread
* [PATCH 0/2] Common struct clk implementation, v6
@ 2010-07-12  2:37 Jeremy Kerr
  2010-07-12  2:37   ` Jeremy Kerr
  0 siblings, 1 reply; 445+ messages in thread
From: Jeremy Kerr @ 2010-07-12  2:37 UTC (permalink / raw)
  To: linux-arm-kernel; +Cc: linux-kernel, Ben Herrenchmidt

Hi all,

These patches are an attempt to allow platforms to share clock code. At
present, the definitions of 'struct clk' are local to platform code,
which makes allocating and initialising cross-platform clock sources
difficult, and makes it impossible to compile a single image containing
support for two ARM platforms with different struct clks.

The two patches are for the architecture-independent kernel code,
introducing the common clk infrastructure. The changelog for the first
patch includes details about the new clock definitions.

As requested by rmk, I've put together a small series of patches
illustrating the usage of the common struct clock on the ARM imx51
platform. These are available in my git tree:

 git://kernel.ubuntu.com/jk/dt/linux-2.6

in the clk-common-mx51 branch (clk-common..clk-common-mx51). There is
also a port  for versatile (clk-common-versatile) in this tree too.

The approach I've taken with the imx51 port is to temporarly duplicate
the platform-common clock code (ie, for all mxc-based boards) to enable
usage of the common struct clk on one machine (imx51), while leaving the
others as-is. For a proper platform-wide usage of the common struct clk,
we'd be better off doing the whole platform at once. However, mx51 is
the only mxc-based HW I have, hence the duplicated example port.

In the example port, the first change simply converts the mxc's struct
clk to a struct clk_mxc, using the new API.  The subsequent patches move
certain clocks to more specific data structures (eg clk_fixed and
clk_pll) where possible.

Ben Herrenschmidt is looking at using common struct clk code for powerpc
too, hence the kernel-wide approach.

Many thanks to the following for their input:
 * Ben Dooks <ben-linux@fluff.org>
 * Baruch Siach <baruch@tkos.co.il>
 * Russell King <linux@arm.linux.org.uk>
 * Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
 * Lorenzo Pieralisi <Lorenzo.Pieralisi@arm.com>

rmk - now that we've had a few platforms ported to the common clk
infrastructure, I believe it's ready to merge. If so, do you want this
in the patch tracker? Otherwise, let me know what needs changing.

Cheers,


Jeremy

--
v6:
 * fixed up references to 'clk_operations' in the changelog

v5:
 * uninline main API, and share definitions with !USE_COMMON_STRUCT_CLK
 * add __clk_get
 * delay mutex init
 * kerneldoc for struct clk

v4:
 * use mutex for enable/disable locking
 * DEFINE_CLK -> INIT_CLK, and pass the clk name for mutex init
 * struct clk_operations -> struct clk_ops

v3:
 * do clock usage refcounting in common code
 * provide sample port

v2:
 * no longer ARM-specific
 * use clk_operations

---
Jeremy Kerr (2):
      Add a common struct clk
      clk: Generic support for fixed-rate clocks


^ permalink raw reply	[flat|nested] 445+ messages in thread
* [PATCH 0/2] Common struct clk implementation, v5
@ 2010-06-21  5:35 Jeremy Kerr
  2010-06-21  5:35   ` Jeremy Kerr
  0 siblings, 1 reply; 445+ messages in thread
From: Jeremy Kerr @ 2010-06-21  5:35 UTC (permalink / raw)
  To: linux-kernel; +Cc: linux-arm-kernel, Ben Herrenchmidt

Hi all,

These patches are an attempt to allow platforms to share clock code. At
present, the definitions of 'struct clk' are local to platform code,
which makes allocating and initialising cross-platform clock sources
difficult, and makes it impossible to compile a single image containing
support for two ARM platforms with different struct clks.

The two patches are for the architecture-independent kernel code,
introducing the common clk infrastructure. The changelog for the first
patch includes details about the new clock definitions.

As requested by rmk, I've put together a small series of patches
illustrating the usage of the common struct clock on the ARM imx51
platform. These are available in my git tree:

 git://kernel.ubuntu.com/jk/dt/linux-2.6

in the clk-common-mx51 branch (clk-common..clk-common-mx51).

The approach I've taken with the imx51 port is to temporarly duplicate
the platform-common clock code (ie, for all mxc-based boards) to enable
usage of the common struct clk on one machine (imx51), while leaving the
others as-is. For a proper platform-wide usage of the common struct clk,
we'd be better off doing the whole platform at once. However, mx51 is
the only mxc-based HW I have, hence the duplicated example port.

In the example port, the first change simply converts the mxc's struct
clk to a struct clk_mxc, using the new API.  The subsequent patches move
certain clocks to more specific data structures (eg clk_fixed and
clk_pll) where possible.

Ben Herrenschmidt is looking at using common struct clk code for powerpc
too, hence the kernel-wide approach.

Comments most welcome.

Cheers,


Jeremy

--
v5:
 * uninline main API, and share definitions with !USE_COMMON_STRUCT_CLK
 * add __clk_get
 * delay mutex init
 * kerneldoc for struct clk

v4:
 * use mutex for enable/disable locking
 * DEFINE_CLK -> INIT_CLK, and pass the clk name for mutex init
 * struct clk_operations -> struct clk_ops

v3:
 * do clock usage refcounting in common code
 * provide sample port

v2:
 * no longer ARM-specific
 * use clk_operations

---
Jeremy Kerr (2):
      Add a common struct clk
      clk: Generic support for fixed-rate clocks


^ permalink raw reply	[flat|nested] 445+ messages in thread

end of thread, other threads:[~2011-04-20 21:30 UTC | newest]

Thread overview: 445+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-02-01  9:11 Locking in the clk API, part 2: clk_prepare/clk_unprepare Jeremy Kerr
2011-02-01  9:11 ` Jeremy Kerr
2011-02-01  9:11 ` Jeremy Kerr
2011-02-01 10:54 ` 
2011-02-01 10:54   ` Uwe Kleine-König
2011-02-01 10:54   ` Uwe Kleine-König
2011-02-01 13:05   ` Jassi Brar
2011-02-01 13:05     ` Jassi Brar
2011-02-01 13:05     ` Jassi Brar
2011-02-01 14:00     ` 
2011-02-01 14:00       ` Uwe Kleine-König
2011-02-01 14:00       ` Uwe Kleine-König
2011-02-01 15:14       ` Russell King - ARM Linux
2011-02-01 15:14         ` Russell King - ARM Linux
2011-02-01 15:14         ` Russell King - ARM Linux
2011-02-01 15:22         ` 
2011-02-01 15:22           ` Uwe Kleine-König
2011-02-01 15:22           ` Uwe Kleine-König
2011-02-01 15:28           ` Russell King - ARM Linux
2011-02-01 15:28             ` Russell King - ARM Linux
2011-02-01 15:28             ` Russell King - ARM Linux
2011-02-01 20:57             ` Saravana Kannan
2011-02-01 20:57               ` Saravana Kannan
2011-02-01 20:57               ` Saravana Kannan
2011-02-02  2:31             ` Jassi Brar
2011-02-02  2:31               ` Jassi Brar
2011-02-02  2:31               ` Jassi Brar
2011-02-01 13:15   ` Russell King - ARM Linux
2011-02-01 13:15     ` Russell King - ARM Linux
2011-02-01 13:15     ` Russell King - ARM Linux
2011-02-01 14:18     ` 
2011-02-01 14:18       ` Uwe Kleine-König
2011-02-01 14:18       ` Uwe Kleine-König
2011-02-01 14:39       ` Russell King - ARM Linux
2011-02-01 14:39         ` Russell King - ARM Linux
2011-02-01 14:39         ` Russell King - ARM Linux
2011-02-01 15:18         ` 
2011-02-01 15:18           ` Uwe Kleine-König
2011-02-01 15:18           ` Uwe Kleine-König
2011-02-01 15:24           ` Russell King - ARM Linux
2011-02-01 15:24             ` Russell King - ARM Linux
2011-02-01 15:24             ` Russell King - ARM Linux
2011-02-01 15:53             ` 
2011-02-01 15:53               ` Uwe Kleine-König
2011-02-01 15:53               ` Uwe Kleine-König
2011-02-01 17:06               ` Russell King - ARM Linux
2011-02-01 17:06                 ` Russell King - ARM Linux
2011-02-01 17:06                 ` Russell King - ARM Linux
2011-02-01 19:32                 ` 
2011-02-01 19:32                   ` Uwe Kleine-König
2011-02-01 19:32                   ` Uwe Kleine-König
2011-02-01 19:56                   ` Russell King - ARM Linux
2011-02-01 19:56                     ` Russell King - ARM Linux
2011-02-01 19:56                     ` Russell King - ARM Linux
2011-02-01 20:21                     ` Saravana Kannan
2011-02-01 20:21                       ` Saravana Kannan
2011-02-01 20:21                       ` Saravana Kannan
2011-02-01 20:43                       ` 
2011-02-01 20:43                         ` Uwe Kleine-König
2011-02-01 20:43                         ` Uwe Kleine-König
2011-02-04  9:33                         ` Richard Zhao
2011-02-04  9:33                           ` Richard Zhao
2011-02-04  9:33                           ` Richard Zhao
2011-02-01 20:06                   ` Nicolas Pitre
2011-02-01 20:06                     ` Nicolas Pitre
2011-02-01 20:06                     ` Nicolas Pitre
2011-02-01 20:33             ` Saravana Kannan
2011-02-01 20:33               ` Saravana Kannan
2011-02-01 20:33               ` Saravana Kannan
2011-02-01 20:36               ` Russell King - ARM Linux
2011-02-01 20:36                 ` Russell King - ARM Linux
2011-02-01 20:36                 ` Russell King - ARM Linux
2011-02-01 20:59             ` Stephen Boyd
2011-02-01 20:59               ` Stephen Boyd
2011-02-01 20:59               ` Stephen Boyd
2011-02-01 21:24               ` Russell King - ARM Linux
2011-02-01 21:24                 ` Russell King - ARM Linux
2011-02-01 21:24                 ` Russell King - ARM Linux
2011-02-04  9:54                 ` Richard Zhao
2011-02-04  9:54                   ` Richard Zhao
2011-02-04  9:54                   ` Richard Zhao
2011-02-04 10:21                   ` 
2011-02-04 10:21                     ` Uwe Kleine-König
2011-02-04 10:21                     ` Uwe Kleine-König
2011-02-04 10:57                     ` Russell King - ARM Linux
2011-02-04 10:57                       ` Russell King - ARM Linux
2011-02-04 10:57                       ` Russell King - ARM Linux
2011-02-04 10:48                   ` Russell King - ARM Linux
2011-02-04 10:48                     ` Russell King - ARM Linux
2011-02-04 10:48                     ` Russell King - ARM Linux
2011-02-04 11:04                     ` Jassi Brar
2011-02-04 11:04                       ` Jassi Brar
2011-02-04 11:04                       ` Jassi Brar
2011-02-04 11:18                       ` Russell King - ARM Linux
2011-02-04 11:18                         ` Russell King - ARM Linux
2011-02-04 11:18                         ` Russell King - ARM Linux
2011-02-04 11:51                         ` Jassi Brar
2011-02-04 11:51                           ` Jassi Brar
2011-02-04 11:51                           ` Jassi Brar
2011-02-04 12:05                           ` Russell King - ARM Linux
2011-02-04 12:05                             ` Russell King - ARM Linux
2011-02-04 12:05                             ` Russell King - ARM Linux
2011-02-01 14:40       ` Jeremy Kerr
2011-02-01 14:40         ` Jeremy Kerr
2011-02-01 14:40         ` Jeremy Kerr
2011-02-04 12:45 ` Richard Zhao
2011-02-04 12:45   ` Richard Zhao
2011-02-04 12:45   ` Richard Zhao
2011-02-04 13:20   ` Russell King - ARM Linux
2011-02-04 13:20     ` Russell King - ARM Linux
2011-02-04 13:20     ` Russell King - ARM Linux
2011-02-07  6:07 ` [RFC,PATCH 1/3] Add a common struct clk Jeremy Kerr
2011-02-07  6:07   ` Jeremy Kerr
2011-02-07  6:07   ` Jeremy Kerr
2011-02-07  7:05   ` 
2011-02-07  7:05     ` Uwe Kleine-König
2011-02-07  7:05     ` Uwe Kleine-König
2011-02-07  7:09   ` 
2011-02-07  8:08   ` 
2011-02-07  8:08     ` Uwe Kleine-König
2011-02-07  8:08     ` Uwe Kleine-König
2011-02-07  8:21   ` Dima Zavin
2011-02-07  8:22     ` Jeremy Kerr
2011-02-07  8:22       ` Jeremy Kerr
2011-02-07  8:22       ` Jeremy Kerr
2011-02-07 19:59   ` Colin Cross
2011-02-07 19:59     ` Colin Cross
2011-02-07 19:59     ` Colin Cross
2011-02-08  1:40     ` Jeremy Kerr
2011-02-08  1:40       ` Jeremy Kerr
2011-02-08  1:40       ` Jeremy Kerr
2011-02-07 20:20   ` Ryan Mallon
2011-02-07 20:20     ` Ryan Mallon
2011-02-07 20:20     ` Ryan Mallon
2011-02-08  2:54     ` Jeremy Kerr
2011-02-08  2:54       ` Jeremy Kerr
2011-02-08  2:54       ` Jeremy Kerr
2011-02-08  3:30       ` Ryan Mallon
2011-02-08  3:30         ` Ryan Mallon
2011-02-08  3:30         ` Ryan Mallon
2011-02-08  7:28         ` Jeremy Kerr
2011-02-08  7:28           ` Jeremy Kerr
2011-02-08  7:28           ` Jeremy Kerr
2011-02-07  6:07 ` [RFC,PATCH 2/3] clk: Generic support for fixed-rate clocks Jeremy Kerr
2011-02-07  6:07   ` Jeremy Kerr
2011-02-07  6:07   ` Jeremy Kerr
2011-02-07  6:07 ` [RFC,PATCH 0/3] Common struct clk implementation, v11 Jeremy Kerr
2011-02-07  6:07   ` Jeremy Kerr
2011-02-07  6:07   ` Jeremy Kerr
2011-02-07  6:07 ` [RFC, Jeremy Kerr
2011-02-07  6:07   ` [RFC, PATCH 3/3] clk: add warnings for incorrect enable/prepare semantics Jeremy Kerr
2011-02-07  6:07   ` Jeremy Kerr
2011-02-07  6:29   ` Jassi Brar
2011-02-07  6:29     ` Jassi Brar
2011-02-07  6:29     ` Jassi Brar
2011-02-07  7:00     ` Jeremy Kerr
2011-02-07  7:00       ` Jeremy Kerr
2011-02-07  7:00       ` Jeremy Kerr
2011-02-07  8:05   ` [RFC, PATCH 3/3] clk: add warnings for incorrect 
2011-02-07  8:05     ` [RFC, PATCH 3/3] clk: add warnings for incorrect enable/prepare semantics Uwe Kleine-König
2011-02-07  8:05     ` Uwe Kleine-König
2011-02-07  8:08     ` Jeremy Kerr
2011-02-07  8:08       ` Jeremy Kerr
2011-02-07  8:08       ` Jeremy Kerr
2011-02-07 14:24       ` [RFC, PATCH 3/3] clk: add warnings for incorrect enable/prepare Nicolas Pitre
2011-02-07 14:24         ` [RFC, PATCH 3/3] clk: add warnings for incorrect enable/prepare semantics Nicolas Pitre
2011-02-07 14:24         ` Nicolas Pitre
2011-02-10  4:26         ` [RFC, PATCH 3/3] clk: add warnings for incorrect enable/prepare Saravana Kannan
2011-02-10  4:26           ` [RFC, PATCH 3/3] clk: add warnings for incorrect enable/prepare semantics Saravana Kannan
2011-02-10  4:26           ` Saravana Kannan
2011-02-09  6:41 ` [RFC,PATCH 0/3] Common struct clk implementation, v12 Jeremy Kerr
2011-02-09  6:41   ` Jeremy Kerr
2011-02-09  6:41   ` Jeremy Kerr
2011-02-09  6:41   ` [RFC,PATCH 2/3] clk: Generic support for fixed-rate clocks Jeremy Kerr
2011-02-09  6:41     ` Jeremy Kerr
2011-02-09  6:41     ` Jeremy Kerr
2011-02-09  6:58     ` Fabio Giovagnini
2011-02-09  6:58       ` Fabio Giovagnini
2011-02-09  6:58       ` Fabio Giovagnini
2011-02-10 23:23     ` Ryan Mallon
2011-02-10 23:23       ` Ryan Mallon
2011-02-10 23:23       ` Ryan Mallon
2011-02-15  1:41       ` Jeremy Kerr
2011-02-15  1:41         ` Jeremy Kerr
2011-02-15  1:41         ` Jeremy Kerr
2011-02-15  4:51         ` Saravana Kannan
2011-02-15  4:51           ` Saravana Kannan
2011-02-15  4:51           ` Saravana Kannan
2011-02-15  6:18           ` Jeremy Kerr
2011-02-15  6:18             ` Jeremy Kerr
2011-02-15  6:18             ` Jeremy Kerr
2011-02-15  6:31             ` Saravana Kannan
2011-02-15  6:31               ` Saravana Kannan
2011-02-15  6:31               ` Saravana Kannan
2011-02-09  6:41   ` [RFC, Jeremy Kerr
2011-02-09  6:41     ` [RFC, PATCH 3/3] clk: add warnings for incorrect enable/prepare semantics Jeremy Kerr
2011-02-09  6:41     ` Jeremy Kerr
2011-02-10  9:37     ` [RFC, PATCH 3/3] clk: add warnings for incorrect Richard Zhao
2011-02-10  9:37       ` [RFC, PATCH 3/3] clk: add warnings for incorrect enable/prepare semantics Richard Zhao
2011-02-10  9:37       ` Richard Zhao
2011-02-15  2:00       ` Jeremy Kerr
2011-02-15  2:00         ` Jeremy Kerr
2011-02-15  2:00         ` Jeremy Kerr
2011-02-09  6:41   ` [RFC,PATCH 1/3] Add a common struct clk Jeremy Kerr
2011-02-09  6:41     ` Jeremy Kerr
2011-02-09  6:41     ` Jeremy Kerr
2011-02-09  9:00     ` 
2011-02-09  9:00       ` Uwe Kleine-König
2011-02-09  9:00       ` Uwe Kleine-König
2011-02-09 20:21     ` Ryan Mallon
2011-02-09 20:21       ` Ryan Mallon
2011-02-09 20:21       ` Ryan Mallon
2011-02-09 20:39       ` 
2011-02-09 20:39         ` Uwe Kleine-König
2011-02-09 20:39         ` Uwe Kleine-König
2011-02-09 20:42         ` Ryan Mallon
2011-02-09 20:42           ` Ryan Mallon
2011-02-09 20:42           ` Ryan Mallon
2011-02-10 10:03       ` Richard Zhao
2011-02-10 10:03         ` Richard Zhao
2011-02-10 10:03         ` Richard Zhao
2011-02-10 10:10         ` Ryan Mallon
2011-02-10 10:10           ` Ryan Mallon
2011-02-10 10:10           ` Ryan Mallon
2011-02-10 12:45           ` Richard Zhao
2011-02-10 12:45             ` Richard Zhao
2011-02-10 12:45             ` Richard Zhao
2011-02-10 10:46         ` 
2011-02-10 10:46           ` Uwe Kleine-König
2011-02-10 10:46           ` Uwe Kleine-König
2011-02-10 13:08           ` Richard Zhao
2011-02-10 13:08             ` Richard Zhao
2011-02-10 13:08             ` Richard Zhao
2011-02-10 13:13             ` Russell King - ARM Linux
2011-02-10 13:13               ` Russell King - ARM Linux
2011-02-10 13:13               ` Russell King - ARM Linux
2011-02-15  1:36       ` Jeremy Kerr
2011-02-15  1:36         ` Jeremy Kerr
2011-02-15  1:36         ` Jeremy Kerr
2011-02-15  1:43         ` Ryan Mallon
2011-02-15  1:43           ` Ryan Mallon
2011-02-15  1:43           ` Ryan Mallon
2011-02-10  5:16     ` Saravana Kannan
2011-02-10  5:16       ` Saravana Kannan
2011-02-10  5:16       ` Saravana Kannan
2011-02-15  2:41       ` Jeremy Kerr
2011-02-15  2:41         ` Jeremy Kerr
2011-02-15  2:41         ` Jeremy Kerr
2011-02-15  5:33         ` Saravana Kannan
2011-02-15  5:33           ` Saravana Kannan
2011-02-15  5:33           ` Saravana Kannan
2011-02-15  7:26           ` Jeremy Kerr
2011-02-15  7:26             ` Jeremy Kerr
2011-02-15  7:26             ` Jeremy Kerr
2011-02-15  8:33             ` Saravana Kannan
2011-02-15  8:33               ` Saravana Kannan
2011-02-15  8:33               ` Saravana Kannan
2011-02-15  8:37             ` Russell King - ARM Linux
2011-02-15  8:37               ` Russell King - ARM Linux
2011-02-15  8:37               ` Russell King - ARM Linux
2011-02-15  9:33               ` Jeremy Kerr
2011-02-15  9:33                 ` Jeremy Kerr
2011-02-15  9:33                 ` Jeremy Kerr
2011-02-15 14:13                 ` Richard Zhao
2011-02-15 14:13                   ` Richard Zhao
2011-02-15 14:13                   ` Richard Zhao
2011-02-20 13:07                 ` Russell King - ARM Linux
2011-02-20 13:07                   ` Russell King - ARM Linux
2011-02-20 13:07                   ` Russell King - ARM Linux
2011-02-16  4:53           ` Saravana Kannan
2011-02-16  4:53             ` Saravana Kannan
2011-02-16  4:53             ` Saravana Kannan
2011-02-20 13:13           ` Russell King - ARM Linux
2011-02-20 13:13             ` Russell King - ARM Linux
2011-02-20 13:13             ` Russell King - ARM Linux
2011-02-21  2:50 ` [PATCH 0/2] Common struct clk implementation, v13 Jeremy Kerr
2011-02-21  2:50   ` Jeremy Kerr
2011-02-21  2:50   ` Jeremy Kerr
2011-02-21  2:50   ` [PATCH 1/2] Add a common struct clk Jeremy Kerr
2011-02-21  2:50     ` Jeremy Kerr
2011-02-21  2:50     ` Jeremy Kerr
2011-02-22 20:17     ` 
2011-02-22 20:17       ` Uwe Kleine-König
2011-02-22 20:17       ` Uwe Kleine-König
2011-02-23  2:49       ` Jeremy Kerr
2011-02-23  2:49         ` Jeremy Kerr
2011-02-23  2:49         ` Jeremy Kerr
2011-02-21  2:50   ` [PATCH 2/2] clk: Generic support for fixed-rate clocks Jeremy Kerr
2011-02-21  2:50     ` Jeremy Kerr
2011-02-21  2:50     ` Jeremy Kerr
2011-02-21 19:51     ` Ryan Mallon
2011-02-21 19:51       ` Ryan Mallon
2011-02-21 19:51       ` Ryan Mallon
2011-02-21 23:29       ` Jeremy Kerr
2011-02-21 23:29         ` Jeremy Kerr
2011-02-21 23:29         ` Jeremy Kerr
2011-02-22 23:33   ` [PATCH] wip: convert imx27 to common struct clk 
2011-02-22 23:33     ` Uwe Kleine-König
2011-02-22 23:33     ` Uwe Kleine-König
2011-02-23  4:17     ` Saravana Kannan
2011-02-23  4:17       ` Saravana Kannan
2011-02-23  4:17       ` Saravana Kannan
2011-02-23  8:15       ` 
2011-02-23  8:15         ` Uwe Kleine-König
2011-02-23  8:15         ` Uwe Kleine-König
2011-03-03  6:40 ` [PATCH 0/2] Common struct clk implementation, v14 Jeremy Kerr
2011-03-03  6:40   ` Jeremy Kerr
2011-03-03  6:40   ` Jeremy Kerr
2011-03-03  6:40   ` [PATCH 1/2] Add a common struct clk Jeremy Kerr
2011-03-03  6:40     ` Jeremy Kerr
2011-03-03  6:40     ` Jeremy Kerr
2011-04-14 12:49     ` Tony Lindgren
2011-04-14 12:49       ` Tony Lindgren
2011-04-14 12:49       ` Tony Lindgren
2011-03-03  6:40   ` [PATCH 2/2] clk: Generic support for fixed-rate clocks Jeremy Kerr
2011-03-03  6:40     ` Jeremy Kerr
2011-03-03  6:40     ` Jeremy Kerr
2011-03-14 10:16   ` [PATCH 0/2] Common struct clk implementation, v14 
2011-03-14 10:16     ` Uwe Kleine-König
2011-03-14 10:16     ` Uwe Kleine-König
2011-03-15  4:31   ` Jeremy Kerr
2011-03-15  4:31     ` Jeremy Kerr
2011-03-15  4:31     ` Jeremy Kerr
2011-03-21  2:33     ` Jeremy Kerr
2011-03-21  2:33       ` Jeremy Kerr
2011-03-21  2:33       ` Jeremy Kerr
2011-04-14  4:20   ` Jeremy Kerr
2011-04-14  4:20     ` Jeremy Kerr
2011-04-14  4:20     ` Jeremy Kerr
2011-04-14 10:00     ` Russell King - ARM Linux
2011-04-14 10:00       ` Russell King - ARM Linux
2011-04-14 10:00       ` Russell King - ARM Linux
2011-04-14 10:23       ` Jeremy Kerr
2011-04-14 10:23         ` Jeremy Kerr
2011-04-14 10:23         ` Jeremy Kerr
2011-04-14 10:26         ` Russell King - ARM Linux
2011-04-14 10:26           ` Russell King - ARM Linux
2011-04-14 10:26           ` Russell King - ARM Linux
2011-04-14 10:25       ` Benjamin Herrenschmidt
2011-04-14 10:25         ` Benjamin Herrenschmidt
2011-04-14 10:25         ` Benjamin Herrenschmidt
2011-04-14 10:32         ` Russell King - ARM Linux
2011-04-14 10:32           ` Russell King - ARM Linux
2011-04-14 10:32           ` Russell King - ARM Linux
2011-04-14 11:59           ` Nicolas Pitre
2011-04-14 11:59             ` Nicolas Pitre
2011-04-14 11:59             ` Nicolas Pitre
2011-04-14 12:09             ` Russell King - ARM Linux
2011-04-14 12:09               ` Russell King - ARM Linux
2011-04-14 12:09               ` Russell King - ARM Linux
2011-04-14 13:39               ` Nicolas Pitre
2011-04-14 13:39                 ` Nicolas Pitre
2011-04-14 13:39                 ` Nicolas Pitre
2011-04-14 14:00                 ` Mark Brown
2011-04-14 14:00                   ` Mark Brown
2011-04-14 14:00                   ` Mark Brown
2011-04-14 15:38                 ` Russell King - ARM Linux
2011-04-14 15:38                   ` Russell King - ARM Linux
2011-04-14 15:38                   ` Russell King - ARM Linux
2011-04-14 16:06                   ` Nicolas Pitre
2011-04-14 16:06                     ` Nicolas Pitre
2011-04-14 16:06                     ` Nicolas Pitre
2011-04-14 17:20                   ` 
2011-04-14 17:20                     ` Uwe Kleine-König
2011-04-14 17:20                     ` Uwe Kleine-König
2011-04-18 10:54                   ` Paul Mundt
2011-04-18 10:54                     ` Paul Mundt
2011-04-18 10:54                     ` Paul Mundt
2011-04-20 14:28                     ` 
2011-04-20 14:28                       ` Uwe Kleine-König
2011-04-20 14:28                       ` Uwe Kleine-König
2011-04-20 16:41                       ` Thomas Gleixner
2011-04-20 16:41                         ` Thomas Gleixner
2011-04-20 16:41                         ` Thomas Gleixner
2011-04-20 21:30                         ` Paul McKenney
2011-04-14 19:29               ` Saravana Kannan
2011-04-14 19:29                 ` Saravana Kannan
2011-04-14 19:29                 ` Saravana Kannan
2011-04-14 16:08           ` 
2011-04-14 16:08             ` Uwe Kleine-König
2011-04-14 16:08             ` Uwe Kleine-König
  -- strict thread matches above, loose matches on Subject: below --
2011-01-05  3:51 [PATCH 0/2] Common struct clk implementation, v10 Jeremy Kerr
2011-01-05  3:51 ` [PATCH 1/2] Add a common struct clk Jeremy Kerr
2011-01-05  3:51   ` Jeremy Kerr
2011-01-06 16:07   ` Richard Cochran
2011-01-06 16:07     ` Richard Cochran
2011-01-06 20:11     ` Uwe Kleine-König
2011-01-06 20:11       ` Uwe Kleine-König
2011-01-07  0:10       ` Jeremy Kerr
2011-01-07  0:10         ` Jeremy Kerr
2011-01-07  0:32         ` Russell King - ARM Linux
2011-01-07  0:32           ` Russell King - ARM Linux
2011-01-07  9:40           ` Uwe Kleine-König
2011-01-07  9:40             ` Uwe Kleine-König
2011-01-08 13:15   ` Sascha Hauer
2011-01-08 13:15     ` Sascha Hauer
2011-01-10  2:43     ` Jeremy Kerr
2011-01-10  2:43       ` Jeremy Kerr
2011-01-10 10:41       ` Sascha Hauer
2011-01-10 10:41         ` Sascha Hauer
2011-01-10 11:00         ` Russell King - ARM Linux
2011-01-10 11:00           ` Russell King - ARM Linux
2011-01-11  0:54           ` Jeremy Kerr
2011-01-11  0:54             ` Jeremy Kerr
2011-01-16  7:26             ` Grant Likely
2011-01-16  7:26               ` Grant Likely
2011-01-16 20:41               ` Ryan Mallon
2011-01-16 20:41                 ` Ryan Mallon
2011-01-16 21:07                 ` Uwe Kleine-König
2011-01-16 21:07                   ` Uwe Kleine-König
2011-01-16 21:39                   ` Ryan Mallon
2011-01-16 21:39                     ` Ryan Mallon
2011-01-11 10:16   ` Sascha Hauer
2011-01-11 10:16     ` Sascha Hauer
2011-01-11 10:27     ` Jeremy Kerr
2011-01-11 10:27       ` Jeremy Kerr
2011-01-11 11:22       ` Sascha Hauer
2011-01-11 11:22         ` Sascha Hauer
2011-01-18  8:44         ` Paul Mundt
2011-01-18  8:44           ` Paul Mundt
2011-01-18  9:21           ` Sascha Hauer
2011-01-18  9:21             ` Sascha Hauer
2011-01-18  9:23             ` Paul Mundt
2011-01-18  9:23               ` Paul Mundt
2011-01-18 12:21   ` Russell King - ARM Linux
2011-01-18 12:21     ` Russell King - ARM Linux
2011-01-05  3:18 [PATCH 0/2] Common struct clk implementation, v10 Jeremy Kerr
2011-01-05  3:18 ` [PATCH 1/2] Add a common struct clk Jeremy Kerr
2010-12-08  2:08 [PATCH 0/2] Common struct clk implementation, v8 Jeremy Kerr
2010-12-08  2:08 ` [PATCH 1/2] Add a common struct clk Jeremy Kerr
2010-12-08  2:08   ` Jeremy Kerr
2010-12-08  2:05 Jeremy Kerr
2010-12-08  2:05 ` Jeremy Kerr
2010-12-08 10:21 ` Uwe Kleine-König
2010-12-08 10:21   ` Uwe Kleine-König
2010-12-10  1:58   ` Jeremy Kerr
2010-12-10  1:58     ` Jeremy Kerr
2010-12-10  9:21     ` Uwe Kleine-König
2010-07-12  2:37 [PATCH 0/2] Common struct clk implementation, v6 Jeremy Kerr
2010-07-12  2:37 ` [PATCH 1/2] Add a common struct clk Jeremy Kerr
2010-07-12  2:37   ` Jeremy Kerr
2010-06-21  5:35 [PATCH 0/2] Common struct clk implementation, v5 Jeremy Kerr
2010-06-21  5:35 ` [PATCH 1/2] Add a common struct clk Jeremy Kerr
2010-06-21  5:35   ` Jeremy Kerr
2010-06-22  4:43   ` Baruch Siach
2010-06-22  4:43     ` Baruch Siach
2010-07-05  2:33   ` MyungJoo Ham
2010-07-05  2:33     ` MyungJoo Ham
2010-07-12  2:19     ` Jeremy Kerr
2010-07-12  2:19       ` Jeremy Kerr

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.