aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter De Schrijver <pdeschrijver@nvidia.com>2013-11-18 10:11:38 -0500
committerPeter De Schrijver <pdeschrijver@nvidia.com>2013-11-26 11:46:53 -0500
commitb29f9e926442c35bd42ebd283aaed0de2c4f1477 (patch)
tree478f053f15bf821bb82c7d8bc58ea1c861338082
parentbc44275b8ea2df7c77658b08955ec545a37560ab (diff)
clk: tegra: add TEGRA_PERIPH_NO_GATE
Tegra124 has a clock which consists of a mux and a fractional divider. Add support for this. Signed-off-by: Peter De Schrijver <pdeschrijver@nvidia.com> Signed-off-by: Thierry Reding <treding@nvidia.com>
-rw-r--r--drivers/clk/tegra/clk-periph.c18
-rw-r--r--drivers/clk/tegra/clk-tegra-periph.c6
-rw-r--r--drivers/clk/tegra/clk.h1
3 files changed, 22 insertions, 3 deletions
diff --git a/drivers/clk/tegra/clk-periph.c b/drivers/clk/tegra/clk-periph.c
index b5feccca2f1e..d62b396863c1 100644
--- a/drivers/clk/tegra/clk-periph.c
+++ b/drivers/clk/tegra/clk-periph.c
@@ -170,6 +170,14 @@ const struct clk_ops tegra_clk_periph_nodiv_ops = {
170 .disable = clk_periph_disable, 170 .disable = clk_periph_disable,
171}; 171};
172 172
173const struct clk_ops tegra_clk_periph_no_gate_ops = {
174 .get_parent = clk_periph_get_parent,
175 .set_parent = clk_periph_set_parent,
176 .recalc_rate = clk_periph_recalc_rate,
177 .round_rate = clk_periph_round_rate,
178 .set_rate = clk_periph_set_rate,
179};
180
173static struct clk *_tegra_clk_register_periph(const char *name, 181static struct clk *_tegra_clk_register_periph(const char *name,
174 const char **parent_names, int num_parents, 182 const char **parent_names, int num_parents,
175 struct tegra_clk_periph *periph, 183 struct tegra_clk_periph *periph,
@@ -181,11 +189,15 @@ static struct clk *_tegra_clk_register_periph(const char *name,
181 struct tegra_clk_periph_regs *bank; 189 struct tegra_clk_periph_regs *bank;
182 bool div = !(periph->gate.flags & TEGRA_PERIPH_NO_DIV); 190 bool div = !(periph->gate.flags & TEGRA_PERIPH_NO_DIV);
183 191
184 flags |= periph->gate.flags & TEGRA_PERIPH_NO_DIV ? 192 if (periph->gate.flags & TEGRA_PERIPH_NO_DIV) {
185 CLK_SET_RATE_PARENT : 0; 193 flags |= CLK_SET_RATE_PARENT;
194 init.ops = &tegra_clk_periph_nodiv_ops;
195 } else if (periph->gate.flags & TEGRA_PERIPH_NO_GATE)
196 init.ops = &tegra_clk_periph_no_gate_ops;
197 else
198 init.ops = &tegra_clk_periph_ops;
186 199
187 init.name = name; 200 init.name = name;
188 init.ops = div ? &tegra_clk_periph_ops : &tegra_clk_periph_nodiv_ops;
189 init.flags = flags; 201 init.flags = flags;
190 init.parent_names = parent_names; 202 init.parent_names = parent_names;
191 init.num_parents = num_parents; 203 init.num_parents = num_parents;
diff --git a/drivers/clk/tegra/clk-tegra-periph.c b/drivers/clk/tegra/clk-tegra-periph.c
index e8d6f2f20141..958d4f4fe91f 100644
--- a/drivers/clk/tegra/clk-tegra-periph.c
+++ b/drivers/clk/tegra/clk-tegra-periph.c
@@ -135,6 +135,12 @@
135 _clk_num, _gate_flags, _clk_id, _parents##_idx, 0,\ 135 _clk_num, _gate_flags, _clk_id, _parents##_idx, 0,\
136 NULL) 136 NULL)
137 137
138#define MUX8_NOGATE_LOCK(_name, _parents, _offset, _clk_id, _lock) \
139 TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset, \
140 29, MASK(3), 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP,\
141 0, TEGRA_PERIPH_NO_GATE, _clk_id,\
142 _parents##_idx, 0, _lock)
143
138#define INT(_name, _parents, _offset, \ 144#define INT(_name, _parents, _offset, \
139 _clk_num, _gate_flags, _clk_id) \ 145 _clk_num, _gate_flags, _clk_id) \
140 TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\ 146 TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\
diff --git a/drivers/clk/tegra/clk.h b/drivers/clk/tegra/clk.h
index f984ebed9f1f..40fb011233c0 100644
--- a/drivers/clk/tegra/clk.h
+++ b/drivers/clk/tegra/clk.h
@@ -391,6 +391,7 @@ struct tegra_clk_periph_gate {
391#define TEGRA_PERIPH_ON_APB BIT(2) 391#define TEGRA_PERIPH_ON_APB BIT(2)
392#define TEGRA_PERIPH_WAR_1005168 BIT(3) 392#define TEGRA_PERIPH_WAR_1005168 BIT(3)
393#define TEGRA_PERIPH_NO_DIV BIT(4) 393#define TEGRA_PERIPH_NO_DIV BIT(4)
394#define TEGRA_PERIPH_NO_GATE BIT(5)
394 395
395void tegra_periph_reset(struct tegra_clk_periph_gate *gate, bool assert); 396void tegra_periph_reset(struct tegra_clk_periph_gate *gate, bool assert);
396extern const struct clk_ops tegra_clk_periph_gate_ops; 397extern const struct clk_ops tegra_clk_periph_gate_ops;