diff options
Diffstat (limited to 'include/linux/clk.h')
| -rw-r--r-- | include/linux/clk.h | 68 | 
1 files changed, 63 insertions, 5 deletions
diff --git a/include/linux/clk.h b/include/linux/clk.h index b9d46fa154b..b0252726df6 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) 2011-2012 Linaro Ltd <mturquette@linaro.org>   *   * 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 @@ -12,18 +13,75 @@  #define __LINUX_CLK_H  #include <linux/kernel.h> +#include <linux/notifier.h>  struct device; -/* - * The base API. +struct clk; + +#ifdef CONFIG_COMMON_CLK + +/** + * DOC: clk notifier callback types + * + * PRE_RATE_CHANGE - called immediately before the clk rate is changed, + *     to indicate that the rate change will proceed.  Drivers must + *     immediately terminate any operations that will be affected by the + *     rate change.  Callbacks may either return NOTIFY_DONE or + *     NOTIFY_STOP. + * + * ABORT_RATE_CHANGE: called if the rate change failed for some reason + *     after PRE_RATE_CHANGE.  In this case, all registered notifiers on + *     the clk will be called with ABORT_RATE_CHANGE. Callbacks must + *     always return NOTIFY_DONE. + * + * POST_RATE_CHANGE - called after the clk rate change has successfully + *     completed.  Callbacks must always return NOTIFY_DONE. + *   */ +#define PRE_RATE_CHANGE			BIT(0) +#define POST_RATE_CHANGE		BIT(1) +#define ABORT_RATE_CHANGE		BIT(2) +/** + * struct clk_notifier - associate a clk with a notifier + * @clk: struct clk * to associate the notifier with + * @notifier_head: a blocking_notifier_head for this clk + * @node: linked list pointers + * + * A list of struct clk_notifier is maintained by the notifier code. + * An entry is created whenever code registers the first notifier on a + * particular @clk.  Future notifiers on that @clk are added to the + * @notifier_head. + */ +struct clk_notifier { +	struct clk			*clk; +	struct srcu_notifier_head	notifier_head; +	struct list_head		node; +}; -/* - * struct clk - an machine class defined object / cookie. +/** + * struct clk_notifier_data - rate data to pass to the notifier callback + * @clk: struct clk * being changed + * @old_rate: previous rate of this clk + * @new_rate: new rate of this clk + * + * For a pre-notifier, old_rate is the clk's rate before this rate + * change, and new_rate is what the rate will be in the future.  For a + * post-notifier, old_rate and new_rate are both set to the clk's + * current rate (this was done to optimize the implementation).   */ -struct clk; +struct clk_notifier_data { +	struct clk		*clk; +	unsigned long		old_rate; +	unsigned long		new_rate; +}; + +int clk_notifier_register(struct clk *clk, struct notifier_block *nb); + +int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb); + +#endif /* !CONFIG_COMMON_CLK */  /**   * clk_get - lookup and obtain a reference to a clock producer.  |