aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clk
diff options
context:
space:
mode:
authorHeiko Stuebner <heiko@sntech.de>2013-03-18 00:43:52 -0400
committerKukjin Kim <kgene.kim@samsung.com>2013-03-28 01:46:03 -0400
commit798ed613f5db7f61a7773412b9a6bc3d37d17ecb (patch)
tree1fb1a600a39cf0a74963f59f859e9b04b14879c0 /drivers/clk
parent8b6076d47ff820d1dc7a9aa37c712b561f316a78 (diff)
clk: samsung: register clk_div_tables for divider clocks
On some Samsung platforms divider clocks only use specific divider combinations like the armdiv on s3c2443 and s3c2416. For these usecases the generic divider clock already provides the option of providing a lookup table mapping register values to divider values. Therefore add a new field to samsung_div_clock and if filled with a table, use clk_register_divider_table instead of clk_register_divider to register a divider clock Signed-off-by: Heiko Stuebner <heiko@sntech.de> Reviewed-by: Thomas Abraham <thomas.abraham@linaro.org> Acked-by: Mike Turquette <mturquette@linaro.org> Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
Diffstat (limited to 'drivers/clk')
-rw-r--r--drivers/clk/samsung/clk.c14
-rw-r--r--drivers/clk/samsung/clk.h13
2 files changed, 20 insertions, 7 deletions
diff --git a/drivers/clk/samsung/clk.c b/drivers/clk/samsung/clk.c
index 91d12f397f5d..d36cdd511761 100644
--- a/drivers/clk/samsung/clk.c
+++ b/drivers/clk/samsung/clk.c
@@ -183,9 +183,17 @@ void __init samsung_clk_register_div(struct samsung_div_clock *list,
183 unsigned int idx, ret; 183 unsigned int idx, ret;
184 184
185 for (idx = 0; idx < nr_clk; idx++, list++) { 185 for (idx = 0; idx < nr_clk; idx++, list++) {
186 clk = clk_register_divider(NULL, list->name, list->parent_name, 186 if (list->table)
187 list->flags, reg_base + list->offset, list->shift, 187 clk = clk_register_divider_table(NULL, list->name,
188 list->width, list->div_flags, &lock); 188 list->parent_name, list->flags,
189 reg_base + list->offset, list->shift,
190 list->width, list->div_flags,
191 list->table, &lock);
192 else
193 clk = clk_register_divider(NULL, list->name,
194 list->parent_name, list->flags,
195 reg_base + list->offset, list->shift,
196 list->width, list->div_flags, &lock);
189 if (IS_ERR(clk)) { 197 if (IS_ERR(clk)) {
190 pr_err("%s: failed to register clock %s\n", __func__, 198 pr_err("%s: failed to register clock %s\n", __func__,
191 list->name); 199 list->name);
diff --git a/drivers/clk/samsung/clk.h b/drivers/clk/samsung/clk.h
index 961192ffd696..26a752b18f88 100644
--- a/drivers/clk/samsung/clk.h
+++ b/drivers/clk/samsung/clk.h
@@ -150,9 +150,10 @@ struct samsung_div_clock {
150 u8 width; 150 u8 width;
151 u8 div_flags; 151 u8 div_flags;
152 const char *alias; 152 const char *alias;
153 struct clk_div_table *table;
153}; 154};
154 155
155#define __DIV(_id, dname, cname, pname, o, s, w, f, df, a) \ 156#define __DIV(_id, dname, cname, pname, o, s, w, f, df, a, t) \
156 { \ 157 { \
157 .id = _id, \ 158 .id = _id, \
158 .dev_name = dname, \ 159 .dev_name = dname, \
@@ -164,16 +165,20 @@ struct samsung_div_clock {
164 .width = w, \ 165 .width = w, \
165 .div_flags = df, \ 166 .div_flags = df, \
166 .alias = a, \ 167 .alias = a, \
168 .table = t, \
167 } 169 }
168 170
169#define DIV(_id, cname, pname, o, s, w) \ 171#define DIV(_id, cname, pname, o, s, w) \
170 __DIV(_id, NULL, cname, pname, o, s, w, 0, 0, NULL) 172 __DIV(_id, NULL, cname, pname, o, s, w, 0, 0, NULL, NULL)
171 173
172#define DIV_A(_id, cname, pname, o, s, w, a) \ 174#define DIV_A(_id, cname, pname, o, s, w, a) \
173 __DIV(_id, NULL, cname, pname, o, s, w, 0, 0, a) 175 __DIV(_id, NULL, cname, pname, o, s, w, 0, 0, a, NULL)
174 176
175#define DIV_F(_id, cname, pname, o, s, w, f, df) \ 177#define DIV_F(_id, cname, pname, o, s, w, f, df) \
176 __DIV(_id, NULL, cname, pname, o, s, w, f, df, NULL) 178 __DIV(_id, NULL, cname, pname, o, s, w, f, df, NULL, NULL)
179
180#define DIV_T(_id, cname, pname, o, s, w, t) \
181 __DIV(_id, NULL, cname, pname, o, s, w, 0, 0, NULL, t)
177 182
178/** 183/**
179 * struct samsung_gate_clock: information about gate clock 184 * struct samsung_gate_clock: information about gate clock