aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clk/clk-divider.c
diff options
context:
space:
mode:
authorSaravana Kannan <skannan@codeaurora.org>2012-04-26 01:58:56 -0400
committerMike Turquette <mturquette@linaro.org>2012-05-01 21:13:20 -0400
commit0197b3ea0f66cd2a11417f58fe1812858ea77908 (patch)
tree73b49012db637bb7f7dad53ee2edf2c6d651ffda /drivers/clk/clk-divider.c
parente447c50e3af5dcad3075c80bd1bdc4e2024b8186 (diff)
clk: Use a separate struct for holding init data.
Create a struct clk_init_data to hold all data that needs to be passed from the platfrom specific driver to the common clock framework during clock registration. Add a pointer to this struct inside clk_hw. This has several advantages: * Completely hides struct clk from many clock platform drivers and static clock initialization code that don't care for static initialization of the struct clks. * For platforms that want to do complete static initialization, it removed the need to directly mess with the struct clk's fields while still allowing to statically allocate struct clk. This keeps the code more future proof even if they include clk-private.h. * Simplifies the generic clk_register() function and allows adding optional fields in the future without modifying the function signature. * Simplifies the static initialization of clocks on all platforms by removing the need for forward delcarations or convoluted macros. Signed-off-by: Saravana Kannan <skannan@codeaurora.org> [mturquette@linaro.org: kept DEFINE_CLK_* macros and __clk_init] Signed-off-by: Mike Turquette <mturquette@linaro.org> Cc: Andrew Lunn <andrew@lunn.ch> Cc: Rob Herring <rob.herring@calxeda.com> Cc: Russell King <linux@arm.linux.org.uk> Cc: Jeremy Kerr <jeremy.kerr@canonical.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Arnd Bergman <arnd.bergmann@linaro.org> Cc: Paul Walmsley <paul@pwsan.com> Cc: Shawn Guo <shawn.guo@freescale.com> Cc: Sascha Hauer <s.hauer@pengutronix.de> Cc: Jamie Iles <jamie@jamieiles.com> Cc: Richard Zhao <richard.zhao@linaro.org> Cc: Saravana Kannan <skannan@codeaurora.org> Cc: Magnus Damm <magnus.damm@gmail.com> Cc: Mark Brown <broonie@opensource.wolfsonmicro.com> Cc: Linus Walleij <linus.walleij@stericsson.com> Cc: Stephen Boyd <sboyd@codeaurora.org> Cc: Amit Kucheria <amit.kucheria@linaro.org> Cc: Deepak Saxena <dsaxena@linaro.org> Cc: Grant Likely <grant.likely@secretlab.ca>
Diffstat (limited to 'drivers/clk/clk-divider.c')
-rw-r--r--drivers/clk/clk-divider.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/clk/clk-divider.c b/drivers/clk/clk-divider.c
index 90627e4069a..8ea11b44452 100644
--- a/drivers/clk/clk-divider.c
+++ b/drivers/clk/clk-divider.c
@@ -167,6 +167,7 @@ struct clk *clk_register_divider(struct device *dev, const char *name,
167{ 167{
168 struct clk_divider *div; 168 struct clk_divider *div;
169 struct clk *clk; 169 struct clk *clk;
170 struct clk_init_data init;
170 171
171 /* allocate the divider */ 172 /* allocate the divider */
172 div = kzalloc(sizeof(struct clk_divider), GFP_KERNEL); 173 div = kzalloc(sizeof(struct clk_divider), GFP_KERNEL);
@@ -175,19 +176,22 @@ struct clk *clk_register_divider(struct device *dev, const char *name,
175 return ERR_PTR(-ENOMEM); 176 return ERR_PTR(-ENOMEM);
176 } 177 }
177 178
179 init.name = name;
180 init.ops = &clk_divider_ops;
181 init.flags = flags;
182 init.parent_names = (parent_name ? &parent_name: NULL);
183 init.num_parents = (parent_name ? 1 : 0);
184
178 /* struct clk_divider assignments */ 185 /* struct clk_divider assignments */
179 div->reg = reg; 186 div->reg = reg;
180 div->shift = shift; 187 div->shift = shift;
181 div->width = width; 188 div->width = width;
182 div->flags = clk_divider_flags; 189 div->flags = clk_divider_flags;
183 div->lock = lock; 190 div->lock = lock;
191 div->hw.init = &init;
184 192
185 /* register the clock */ 193 /* register the clock */
186 clk = clk_register(dev, name, 194 clk = clk_register(dev, &div->hw);
187 &clk_divider_ops, &div->hw,
188 (parent_name ? &parent_name: NULL),
189 (parent_name ? 1 : 0),
190 flags);
191 195
192 if (IS_ERR(clk)) 196 if (IS_ERR(clk))
193 kfree(div); 197 kfree(div);