2 * linux/include/linux/clk-private.h
4 * Copyright (c) 2010-2011 Jeremy Kerr <jeremy.kerr@canonical.com>
5 * Copyright (C) 2011-2012 Linaro Ltd <mturquette@linaro.org>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
11 #ifndef __LINUX_CLK_PRIVATE_H
12 #define __LINUX_CLK_PRIVATE_H
14 #include <linux/clk-provider.h>
15 #include <linux/list.h>
18 * WARNING: Do not include clk-private.h from any file that implements struct
19 * clk_ops. Doing so is a layering violation!
21 * This header exists only to allow for statically initialized clock data. Any
22 * static clock data must be defined in a separate file from the logic that
23 * implements the clock operations for that same data.
26 #ifdef CONFIG_COMMON_CLK
30 const struct clk_ops *ops;
37 unsigned long new_rate;
39 unsigned int enable_count;
40 unsigned int prepare_count;
41 struct hlist_head children;
42 struct hlist_node child_node;
43 unsigned int notifier_count;
44 #ifdef CONFIG_COMMON_CLK_DEBUG
45 struct dentry *dentry;
50 * DOC: Basic clock implementations common to many platforms
52 * Each basic clock hardware type is comprised of a structure describing the
53 * clock hardware, implementations of the relevant callbacks in struct clk_ops,
54 * unique flags for that hardware type, a registration function and an
55 * alternative macro for static initialization
58 #define DEFINE_CLK_FIXED_RATE(_name, _flags, _rate, \
60 static struct clk _name; \
61 static char *_name##_parent_names[] = {}; \
62 static struct clk_fixed_rate _name##_hw = { \
66 .fixed_rate = _rate, \
67 .flags = _fixed_rate_flags, \
69 static struct clk _name = { \
71 .ops = &clk_fixed_rate_ops, \
72 .hw = &_name##_hw.hw, \
73 .parent_names = _name##_parent_names, \
75 ARRAY_SIZE(_name##_parent_names), \
79 #define DEFINE_CLK_GATE(_name, _parent_name, _parent_ptr, \
80 _flags, _reg, _bit_idx, \
82 static struct clk _name; \
83 static char *_name##_parent_names[] = { \
86 static struct clk *_name##_parents[] = { \
89 static struct clk_gate _name##_hw = { \
94 .bit_idx = _bit_idx, \
95 .flags = _gate_flags, \
98 static struct clk _name = { \
100 .ops = &clk_gate_ops, \
101 .hw = &_name##_hw.hw, \
102 .parent_names = _name##_parent_names, \
104 ARRAY_SIZE(_name##_parent_names), \
105 .parents = _name##_parents, \
109 #define DEFINE_CLK_DIVIDER(_name, _parent_name, _parent_ptr, \
110 _flags, _reg, _shift, _width, \
111 _divider_flags, _lock) \
112 static struct clk _name; \
113 static char *_name##_parent_names[] = { \
116 static struct clk *_name##_parents[] = { \
119 static struct clk_divider _name##_hw = { \
126 .flags = _divider_flags, \
129 static struct clk _name = { \
131 .ops = &clk_divider_ops, \
132 .hw = &_name##_hw.hw, \
133 .parent_names = _name##_parent_names, \
135 ARRAY_SIZE(_name##_parent_names), \
136 .parents = _name##_parents, \
140 #define DEFINE_CLK_MUX(_name, _parent_names, _parents, _flags, \
141 _reg, _shift, _width, \
143 static struct clk _name; \
144 static struct clk_mux _name##_hw = { \
151 .flags = _mux_flags, \
154 static struct clk _name = { \
156 .ops = &clk_mux_ops, \
157 .hw = &_name##_hw.hw, \
158 .parent_names = _parent_names, \
160 ARRAY_SIZE(_parent_names), \
161 .parents = _parents, \
166 * __clk_init - initialize the data structures in a struct clk
167 * @dev: device initializing this clk, placeholder for now
168 * @clk: clk being initialized
170 * Initializes the lists in struct clk, queries the hardware for the
171 * parent and rate and sets them both.
173 * Any struct clk passed into __clk_init must have the following members
182 * It is not necessary to call clk_register if __clk_init is used directly with
183 * statically initialized clock data.
185 void __clk_init(struct device *dev, struct clk *clk);
187 #endif /* CONFIG_COMMON_CLK */
188 #endif /* CLK_PRIVATE_H */