blob: 845be30be50f830221eea24cca9189fe8fe5eece [file] [log] [blame]
Mike Turquetteb24764902012-03-15 23:11:19 -07001/*
2 * linux/include/linux/clk-private.h
3 *
4 * Copyright (c) 2010-2011 Jeremy Kerr <jeremy.kerr@canonical.com>
5 * Copyright (C) 2011-2012 Linaro Ltd <mturquette@linaro.org>
6 *
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.
10 */
11#ifndef __LINUX_CLK_PRIVATE_H
12#define __LINUX_CLK_PRIVATE_H
13
14#include <linux/clk-provider.h>
Sylwester Nawrockifcb0ee62013-08-24 15:00:10 +020015#include <linux/kref.h>
Mike Turquetteb24764902012-03-15 23:11:19 -070016#include <linux/list.h>
17
18/*
19 * WARNING: Do not include clk-private.h from any file that implements struct
20 * clk_ops. Doing so is a layering violation!
21 *
22 * This header exists only to allow for statically initialized clock data. Any
23 * static clock data must be defined in a separate file from the logic that
24 * implements the clock operations for that same data.
25 */
26
27#ifdef CONFIG_COMMON_CLK
28
Sylwester Nawrockiac2df522013-08-24 20:10:41 +020029struct module;
30
Mike Turquetteb24764902012-03-15 23:11:19 -070031struct clk {
32 const char *name;
33 const struct clk_ops *ops;
34 struct clk_hw *hw;
Sylwester Nawrockiac2df522013-08-24 20:10:41 +020035 struct module *owner;
Mike Turquetteb24764902012-03-15 23:11:19 -070036 struct clk *parent;
Mark Brownd305fb72012-03-21 20:01:20 +000037 const char **parent_names;
Mike Turquetteb24764902012-03-15 23:11:19 -070038 struct clk **parents;
39 u8 num_parents;
James Hogan71472c02013-07-29 12:25:00 +010040 u8 new_parent_index;
Mike Turquetteb24764902012-03-15 23:11:19 -070041 unsigned long rate;
42 unsigned long new_rate;
James Hogan71472c02013-07-29 12:25:00 +010043 struct clk *new_parent;
44 struct clk *new_child;
Mike Turquetteb24764902012-03-15 23:11:19 -070045 unsigned long flags;
46 unsigned int enable_count;
47 unsigned int prepare_count;
Boris BREZILLON5279fc42013-12-21 10:34:47 +010048 unsigned long accuracy;
Mike Turquettee59c5372014-02-18 21:21:25 -080049 int phase;
Mike Turquetteb24764902012-03-15 23:11:19 -070050 struct hlist_head children;
51 struct hlist_node child_node;
52 unsigned int notifier_count;
Mike Turquetteea72dc22013-12-18 21:38:52 -080053#ifdef CONFIG_DEBUG_FS
Mike Turquetteb24764902012-03-15 23:11:19 -070054 struct dentry *dentry;
55#endif
Sylwester Nawrockifcb0ee62013-08-24 15:00:10 +020056 struct kref ref;
Mike Turquetteb24764902012-03-15 23:11:19 -070057};
58
Mike Turquette9d9f78e2012-03-15 23:11:20 -070059/*
60 * DOC: Basic clock implementations common to many platforms
61 *
62 * Each basic clock hardware type is comprised of a structure describing the
63 * clock hardware, implementations of the relevant callbacks in struct clk_ops,
64 * unique flags for that hardware type, a registration function and an
65 * alternative macro for static initialization
66 */
67
Viresh Kumar182f9e8c2012-04-17 16:45:36 +053068#define DEFINE_CLK(_name, _ops, _flags, _parent_names, \
69 _parents) \
70 static struct clk _name = { \
71 .name = #_name, \
72 .ops = &_ops, \
73 .hw = &_name##_hw.hw, \
74 .parent_names = _parent_names, \
75 .num_parents = ARRAY_SIZE(_parent_names), \
76 .parents = _parents, \
Rajendra Nayakf7d8caa2012-06-01 14:02:47 +053077 .flags = _flags | CLK_IS_BASIC, \
Viresh Kumar182f9e8c2012-04-17 16:45:36 +053078 }
79
Mike Turquette9d9f78e2012-03-15 23:11:20 -070080#define DEFINE_CLK_FIXED_RATE(_name, _flags, _rate, \
81 _fixed_rate_flags) \
82 static struct clk _name; \
Rajendra Nayake447c502012-04-27 17:58:13 +053083 static const char *_name##_parent_names[] = {}; \
Mike Turquette9d9f78e2012-03-15 23:11:20 -070084 static struct clk_fixed_rate _name##_hw = { \
85 .hw = { \
86 .clk = &_name, \
87 }, \
88 .fixed_rate = _rate, \
89 .flags = _fixed_rate_flags, \
90 }; \
Viresh Kumar182f9e8c2012-04-17 16:45:36 +053091 DEFINE_CLK(_name, clk_fixed_rate_ops, _flags, \
92 _name##_parent_names, NULL);
Mike Turquette9d9f78e2012-03-15 23:11:20 -070093
Mike Turquette9d9f78e2012-03-15 23:11:20 -070094#define DEFINE_CLK_GATE(_name, _parent_name, _parent_ptr, \
95 _flags, _reg, _bit_idx, \
96 _gate_flags, _lock) \
97 static struct clk _name; \
Rajendra Nayake447c502012-04-27 17:58:13 +053098 static const char *_name##_parent_names[] = { \
Mike Turquette9d9f78e2012-03-15 23:11:20 -070099 _parent_name, \
100 }; \
101 static struct clk *_name##_parents[] = { \
102 _parent_ptr, \
103 }; \
104 static struct clk_gate _name##_hw = { \
105 .hw = { \
106 .clk = &_name, \
107 }, \
108 .reg = _reg, \
109 .bit_idx = _bit_idx, \
110 .flags = _gate_flags, \
111 .lock = _lock, \
112 }; \
Viresh Kumar182f9e8c2012-04-17 16:45:36 +0530113 DEFINE_CLK(_name, clk_gate_ops, _flags, \
114 _name##_parent_names, _name##_parents);
Mike Turquette9d9f78e2012-03-15 23:11:20 -0700115
Rajendra Nayak357c3f02012-06-29 19:06:32 +0530116#define _DEFINE_CLK_DIVIDER(_name, _parent_name, _parent_ptr, \
Mike Turquette9d9f78e2012-03-15 23:11:20 -0700117 _flags, _reg, _shift, _width, \
Rajendra Nayak357c3f02012-06-29 19:06:32 +0530118 _divider_flags, _table, _lock) \
Mike Turquette9d9f78e2012-03-15 23:11:20 -0700119 static struct clk _name; \
Rajendra Nayake447c502012-04-27 17:58:13 +0530120 static const char *_name##_parent_names[] = { \
Mike Turquette9d9f78e2012-03-15 23:11:20 -0700121 _parent_name, \
122 }; \
123 static struct clk *_name##_parents[] = { \
124 _parent_ptr, \
125 }; \
126 static struct clk_divider _name##_hw = { \
127 .hw = { \
128 .clk = &_name, \
129 }, \
130 .reg = _reg, \
131 .shift = _shift, \
132 .width = _width, \
133 .flags = _divider_flags, \
Rajendra Nayak357c3f02012-06-29 19:06:32 +0530134 .table = _table, \
Mike Turquette9d9f78e2012-03-15 23:11:20 -0700135 .lock = _lock, \
136 }; \
Viresh Kumar182f9e8c2012-04-17 16:45:36 +0530137 DEFINE_CLK(_name, clk_divider_ops, _flags, \
138 _name##_parent_names, _name##_parents);
Mike Turquette9d9f78e2012-03-15 23:11:20 -0700139
Rajendra Nayak357c3f02012-06-29 19:06:32 +0530140#define DEFINE_CLK_DIVIDER(_name, _parent_name, _parent_ptr, \
141 _flags, _reg, _shift, _width, \
142 _divider_flags, _lock) \
143 _DEFINE_CLK_DIVIDER(_name, _parent_name, _parent_ptr, \
144 _flags, _reg, _shift, _width, \
145 _divider_flags, NULL, _lock)
146
147#define DEFINE_CLK_DIVIDER_TABLE(_name, _parent_name, \
148 _parent_ptr, _flags, _reg, \
149 _shift, _width, _divider_flags, \
150 _table, _lock) \
151 _DEFINE_CLK_DIVIDER(_name, _parent_name, _parent_ptr, \
152 _flags, _reg, _shift, _width, \
153 _divider_flags, _table, _lock) \
154
Mike Turquette9d9f78e2012-03-15 23:11:20 -0700155#define DEFINE_CLK_MUX(_name, _parent_names, _parents, _flags, \
156 _reg, _shift, _width, \
157 _mux_flags, _lock) \
158 static struct clk _name; \
159 static struct clk_mux _name##_hw = { \
160 .hw = { \
161 .clk = &_name, \
162 }, \
163 .reg = _reg, \
164 .shift = _shift, \
Peter De Schrijverce4f3312013-03-22 14:07:53 +0200165 .mask = BIT(_width) - 1, \
Mike Turquette9d9f78e2012-03-15 23:11:20 -0700166 .flags = _mux_flags, \
167 .lock = _lock, \
168 }; \
Viresh Kumar182f9e8c2012-04-17 16:45:36 +0530169 DEFINE_CLK(_name, clk_mux_ops, _flags, _parent_names, \
170 _parents);
Mike Turquette9d9f78e2012-03-15 23:11:20 -0700171
Sascha Hauerf0948f52012-05-03 15:36:14 +0530172#define DEFINE_CLK_FIXED_FACTOR(_name, _parent_name, \
173 _parent_ptr, _flags, \
174 _mult, _div) \
175 static struct clk _name; \
176 static const char *_name##_parent_names[] = { \
177 _parent_name, \
178 }; \
179 static struct clk *_name##_parents[] = { \
180 _parent_ptr, \
181 }; \
182 static struct clk_fixed_factor _name##_hw = { \
183 .hw = { \
184 .clk = &_name, \
185 }, \
186 .mult = _mult, \
187 .div = _div, \
188 }; \
189 DEFINE_CLK(_name, clk_fixed_factor_ops, _flags, \
190 _name##_parent_names, _name##_parents);
191
Mike Turquetteb24764902012-03-15 23:11:19 -0700192/**
193 * __clk_init - initialize the data structures in a struct clk
194 * @dev: device initializing this clk, placeholder for now
195 * @clk: clk being initialized
196 *
197 * Initializes the lists in struct clk, queries the hardware for the
198 * parent and rate and sets them both.
199 *
200 * Any struct clk passed into __clk_init must have the following members
201 * populated:
202 * .name
203 * .ops
204 * .hw
205 * .parent_names
206 * .num_parents
207 * .flags
208 *
209 * It is not necessary to call clk_register if __clk_init is used directly with
210 * statically initialized clock data.
Mike Turquetted1302a32012-03-29 14:30:40 -0700211 *
212 * Returns 0 on success, otherwise an error code.
Mike Turquetteb24764902012-03-15 23:11:19 -0700213 */
Mike Turquetted1302a32012-03-29 14:30:40 -0700214int __clk_init(struct device *dev, struct clk *clk);
Mike Turquetteb24764902012-03-15 23:11:19 -0700215
Saravana Kannan0197b3e2012-04-25 22:58:56 -0700216struct clk *__clk_register(struct device *dev, struct clk_hw *hw);
217
Mike Turquetteb24764902012-03-15 23:11:19 -0700218#endif /* CONFIG_COMMON_CLK */
219#endif /* CLK_PRIVATE_H */