clk: Add support to set custom flags with clk_set_flags
The new API clk_set_flags could be used by hardware specific clock drivers
or clients for specific hardware requirements. These flags could be custom
defined as per hardware needs.
Change-Id: Ia67373ee2b8934c898052c68338fa86cb16070dd
Signed-off-by: Taniya Das <tdas@codeaurora.org>
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index 820a939..1cff20e 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -1982,6 +1982,18 @@
}
EXPORT_SYMBOL_GPL(clk_is_match);
+int clk_set_flags(struct clk *clk, unsigned long flags)
+{
+ if (!clk)
+ return 0;
+
+ if (!clk->core->ops->set_flags)
+ return -EINVAL;
+
+ return clk->core->ops->set_flags(clk->core->hw, flags);
+}
+EXPORT_SYMBOL_GPL(clk_set_flags);
+
/*** debugfs support ***/
#ifdef CONFIG_DEBUG_FS
diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
index a39c0c5..1f82247 100644
--- a/include/linux/clk-provider.h
+++ b/include/linux/clk-provider.h
@@ -177,6 +177,8 @@
* directory is provided as an argument. Called with
* prepare_lock held. Returns 0 on success, -EERROR otherwise.
*
+ * @set_flags: Set custom flags which deal with hardware specifics. Returns 0
+ * on success, -EERROR otherwise.
*
* The clk_enable/clk_disable and clk_prepare/clk_unprepare pairs allow
* implementations to split any work between atomic (enable) and sleepable
@@ -217,6 +219,7 @@
int (*set_phase)(struct clk_hw *hw, int degrees);
void (*init)(struct clk_hw *hw);
int (*debug_init)(struct clk_hw *hw, struct dentry *dentry);
+ int (*set_flags)(struct clk_hw *hw, unsigned int flags);
};
/**
diff --git a/include/linux/clk.h b/include/linux/clk.h
index 123c027..1325b23 100644
--- a/include/linux/clk.h
+++ b/include/linux/clk.h
@@ -420,6 +420,16 @@
*/
struct clk *clk_get_sys(const char *dev_id, const char *con_id);
+/**
+ * clk_set_flags - set the custom HW specific flags for this clock
+ * @clk: clock source
+ * @flags: custom flags which would be hardware specific, defined for specific
+ * hardware.
+ *
+ * Returns success 0 or negative errno.
+ */
+int clk_set_flags(struct clk *clk, unsigned long flags);
+
#else /* !CONFIG_HAVE_CLK */
static inline struct clk *clk_get(struct device *dev, const char *id)