2 * Copyright (C) 2013 Boris BREZILLON <b.brezillon@overkiz.com>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
11 #include <linux/clk-provider.h>
12 #include <linux/clkdev.h>
13 #include <linux/clk/at91_pmc.h>
14 #include <linux/delay.h>
16 #include <linux/of_address.h>
17 #include <linux/of_irq.h>
19 #include <linux/interrupt.h>
20 #include <linux/irq.h>
21 #include <linux/mfd/syscon.h>
22 #include <linux/regmap.h>
23 #include <linux/sched.h>
24 #include <linux/wait.h>
28 #define SLOW_CLOCK_FREQ 32768
30 #define MAINFRDY_TIMEOUT (((MAINF_DIV + 1) * USEC_PER_SEC) / \
32 #define MAINF_LOOP_MIN_WAIT (USEC_PER_SEC / SLOW_CLOCK_FREQ)
33 #define MAINF_LOOP_MAX_WAIT MAINFRDY_TIMEOUT
35 #define MOR_KEY_MASK (0xff << 16)
39 struct regmap *regmap;
41 wait_queue_head_t wait;
44 #define to_clk_main_osc(hw) container_of(hw, struct clk_main_osc, hw)
46 struct clk_main_rc_osc {
48 struct regmap *regmap;
50 wait_queue_head_t wait;
51 unsigned long frequency;
52 unsigned long accuracy;
55 #define to_clk_main_rc_osc(hw) container_of(hw, struct clk_main_rc_osc, hw)
57 struct clk_rm9200_main {
59 struct regmap *regmap;
62 #define to_clk_rm9200_main(hw) container_of(hw, struct clk_rm9200_main, hw)
64 struct clk_sam9x5_main {
66 struct regmap *regmap;
68 wait_queue_head_t wait;
72 #define to_clk_sam9x5_main(hw) container_of(hw, struct clk_sam9x5_main, hw)
74 static irqreturn_t clk_main_osc_irq_handler(int irq, void *dev_id)
76 struct clk_main_osc *osc = dev_id;
79 disable_irq_nosync(osc->irq);
84 static inline bool clk_main_osc_ready(struct regmap *regmap)
88 regmap_read(regmap, AT91_PMC_SR, &status);
90 return status & AT91_PMC_MOSCS;
93 static int clk_main_osc_prepare(struct clk_hw *hw)
95 struct clk_main_osc *osc = to_clk_main_osc(hw);
96 struct regmap *regmap = osc->regmap;
99 regmap_read(regmap, AT91_CKGR_MOR, &tmp);
100 tmp &= ~MOR_KEY_MASK;
102 if (tmp & AT91_PMC_OSCBYPASS)
105 if (!(tmp & AT91_PMC_MOSCEN)) {
106 tmp |= AT91_PMC_MOSCEN | AT91_PMC_KEY;
107 regmap_write(regmap, AT91_CKGR_MOR, tmp);
110 while (!clk_main_osc_ready(regmap)) {
111 enable_irq(osc->irq);
112 wait_event(osc->wait,
113 clk_main_osc_ready(regmap));
119 static void clk_main_osc_unprepare(struct clk_hw *hw)
121 struct clk_main_osc *osc = to_clk_main_osc(hw);
122 struct regmap *regmap = osc->regmap;
125 regmap_read(regmap, AT91_CKGR_MOR, &tmp);
126 if (tmp & AT91_PMC_OSCBYPASS)
129 if (!(tmp & AT91_PMC_MOSCEN))
132 tmp &= ~(AT91_PMC_KEY | AT91_PMC_MOSCEN);
133 regmap_write(regmap, AT91_CKGR_MOR, tmp | AT91_PMC_KEY);
136 static int clk_main_osc_is_prepared(struct clk_hw *hw)
138 struct clk_main_osc *osc = to_clk_main_osc(hw);
139 struct regmap *regmap = osc->regmap;
142 regmap_read(regmap, AT91_CKGR_MOR, &tmp);
143 if (tmp & AT91_PMC_OSCBYPASS)
146 regmap_read(regmap, AT91_PMC_SR, &status);
148 return (status & AT91_PMC_MOSCS) && (tmp & AT91_PMC_MOSCEN);
151 static const struct clk_ops main_osc_ops = {
152 .prepare = clk_main_osc_prepare,
153 .unprepare = clk_main_osc_unprepare,
154 .is_prepared = clk_main_osc_is_prepared,
157 static struct clk * __init
158 at91_clk_register_main_osc(struct regmap *regmap,
161 const char *parent_name,
165 struct clk_main_osc *osc;
166 struct clk *clk = NULL;
167 struct clk_init_data init;
169 if (!irq || !name || !parent_name)
170 return ERR_PTR(-EINVAL);
172 osc = kzalloc(sizeof(*osc), GFP_KERNEL);
174 return ERR_PTR(-ENOMEM);
177 init.ops = &main_osc_ops;
178 init.parent_names = &parent_name;
179 init.num_parents = 1;
180 init.flags = CLK_IGNORE_UNUSED;
182 osc->hw.init = &init;
183 osc->regmap = regmap;
186 init_waitqueue_head(&osc->wait);
187 irq_set_status_flags(osc->irq, IRQ_NOAUTOEN);
188 ret = request_irq(osc->irq, clk_main_osc_irq_handler,
189 IRQF_TRIGGER_HIGH, name, osc);
196 regmap_update_bits(regmap,
197 AT91_CKGR_MOR, MOR_KEY_MASK |
199 AT91_PMC_OSCBYPASS | AT91_PMC_KEY);
201 clk = clk_register(NULL, &osc->hw);
210 static void __init of_at91rm9200_clk_main_osc_setup(struct device_node *np)
214 const char *name = np->name;
215 const char *parent_name;
216 struct regmap *regmap;
219 of_property_read_string(np, "clock-output-names", &name);
220 bypass = of_property_read_bool(np, "atmel,osc-bypass");
221 parent_name = of_clk_get_parent_name(np, 0);
223 regmap = syscon_node_to_regmap(of_get_parent(np));
227 irq = irq_of_parse_and_map(np, 0);
231 clk = at91_clk_register_main_osc(regmap, irq, name, parent_name, bypass);
235 of_clk_add_provider(np, of_clk_src_simple_get, clk);
237 CLK_OF_DECLARE(at91rm9200_clk_main_osc, "atmel,at91rm9200-clk-main-osc",
238 of_at91rm9200_clk_main_osc_setup);
240 static irqreturn_t clk_main_rc_osc_irq_handler(int irq, void *dev_id)
242 struct clk_main_rc_osc *osc = dev_id;
245 disable_irq_nosync(osc->irq);
250 static bool clk_main_rc_osc_ready(struct regmap *regmap)
254 regmap_read(regmap, AT91_PMC_SR, &status);
256 return status & AT91_PMC_MOSCRCS;
259 static int clk_main_rc_osc_prepare(struct clk_hw *hw)
261 struct clk_main_rc_osc *osc = to_clk_main_rc_osc(hw);
262 struct regmap *regmap = osc->regmap;
265 regmap_read(regmap, AT91_CKGR_MOR, &mor);
267 if (!(mor & AT91_PMC_MOSCRCEN))
268 regmap_update_bits(regmap, AT91_CKGR_MOR,
269 MOR_KEY_MASK | AT91_PMC_MOSCRCEN,
270 AT91_PMC_MOSCRCEN | AT91_PMC_KEY);
272 while (!clk_main_rc_osc_ready(regmap)) {
273 enable_irq(osc->irq);
274 wait_event(osc->wait,
275 clk_main_rc_osc_ready(regmap));
281 static void clk_main_rc_osc_unprepare(struct clk_hw *hw)
283 struct clk_main_rc_osc *osc = to_clk_main_rc_osc(hw);
284 struct regmap *regmap = osc->regmap;
287 regmap_read(regmap, AT91_CKGR_MOR, &mor);
289 if (!(mor & AT91_PMC_MOSCRCEN))
292 regmap_update_bits(regmap, AT91_CKGR_MOR,
293 MOR_KEY_MASK | AT91_PMC_MOSCRCEN, AT91_PMC_KEY);
296 static int clk_main_rc_osc_is_prepared(struct clk_hw *hw)
298 struct clk_main_rc_osc *osc = to_clk_main_rc_osc(hw);
299 struct regmap *regmap = osc->regmap;
300 unsigned int mor, status;
302 regmap_read(regmap, AT91_CKGR_MOR, &mor);
303 regmap_read(regmap, AT91_PMC_SR, &status);
305 return (mor & AT91_PMC_MOSCRCEN) && (status & AT91_PMC_MOSCRCS);
308 static unsigned long clk_main_rc_osc_recalc_rate(struct clk_hw *hw,
309 unsigned long parent_rate)
311 struct clk_main_rc_osc *osc = to_clk_main_rc_osc(hw);
313 return osc->frequency;
316 static unsigned long clk_main_rc_osc_recalc_accuracy(struct clk_hw *hw,
317 unsigned long parent_acc)
319 struct clk_main_rc_osc *osc = to_clk_main_rc_osc(hw);
321 return osc->accuracy;
324 static const struct clk_ops main_rc_osc_ops = {
325 .prepare = clk_main_rc_osc_prepare,
326 .unprepare = clk_main_rc_osc_unprepare,
327 .is_prepared = clk_main_rc_osc_is_prepared,
328 .recalc_rate = clk_main_rc_osc_recalc_rate,
329 .recalc_accuracy = clk_main_rc_osc_recalc_accuracy,
332 static struct clk * __init
333 at91_clk_register_main_rc_osc(struct regmap *regmap,
336 u32 frequency, u32 accuracy)
339 struct clk_main_rc_osc *osc;
340 struct clk *clk = NULL;
341 struct clk_init_data init;
343 if (!name || !frequency)
344 return ERR_PTR(-EINVAL);
346 osc = kzalloc(sizeof(*osc), GFP_KERNEL);
348 return ERR_PTR(-ENOMEM);
351 init.ops = &main_rc_osc_ops;
352 init.parent_names = NULL;
353 init.num_parents = 0;
354 init.flags = CLK_IS_ROOT | CLK_IGNORE_UNUSED;
356 osc->hw.init = &init;
357 osc->regmap = regmap;
359 osc->frequency = frequency;
360 osc->accuracy = accuracy;
362 init_waitqueue_head(&osc->wait);
363 irq_set_status_flags(osc->irq, IRQ_NOAUTOEN);
364 ret = request_irq(osc->irq, clk_main_rc_osc_irq_handler,
365 IRQF_TRIGGER_HIGH, name, osc);
369 clk = clk_register(NULL, &osc->hw);
378 static void __init of_at91sam9x5_clk_main_rc_osc_setup(struct device_node *np)
384 const char *name = np->name;
385 struct regmap *regmap;
387 of_property_read_string(np, "clock-output-names", &name);
388 of_property_read_u32(np, "clock-frequency", &frequency);
389 of_property_read_u32(np, "clock-accuracy", &accuracy);
391 irq = irq_of_parse_and_map(np, 0);
395 regmap = syscon_node_to_regmap(of_get_parent(np));
399 clk = at91_clk_register_main_rc_osc(regmap, irq, name, frequency,
404 of_clk_add_provider(np, of_clk_src_simple_get, clk);
406 CLK_OF_DECLARE(at91sam9x5_clk_main_rc_osc, "atmel,at91sam9x5-clk-main-rc-osc",
407 of_at91sam9x5_clk_main_rc_osc_setup);
410 static int clk_main_probe_frequency(struct regmap *regmap)
412 unsigned long prep_time, timeout;
415 timeout = jiffies + usecs_to_jiffies(MAINFRDY_TIMEOUT);
418 regmap_read(regmap, AT91_CKGR_MCFR, &mcfr);
419 if (mcfr & AT91_PMC_MAINRDY)
421 usleep_range(MAINF_LOOP_MIN_WAIT, MAINF_LOOP_MAX_WAIT);
422 } while (time_before(prep_time, timeout));
427 static unsigned long clk_main_recalc_rate(struct regmap *regmap,
428 unsigned long parent_rate)
435 pr_warn("Main crystal frequency not set, using approximate value\n");
436 regmap_read(regmap, AT91_CKGR_MCFR, &mcfr);
437 if (!(mcfr & AT91_PMC_MAINRDY))
440 return ((mcfr & AT91_PMC_MAINF) * SLOW_CLOCK_FREQ) / MAINF_DIV;
443 static int clk_rm9200_main_prepare(struct clk_hw *hw)
445 struct clk_rm9200_main *clkmain = to_clk_rm9200_main(hw);
447 return clk_main_probe_frequency(clkmain->regmap);
450 static int clk_rm9200_main_is_prepared(struct clk_hw *hw)
452 struct clk_rm9200_main *clkmain = to_clk_rm9200_main(hw);
455 regmap_read(clkmain->regmap, AT91_CKGR_MCFR, &status);
457 return status & AT91_PMC_MAINRDY ? 1 : 0;
460 static unsigned long clk_rm9200_main_recalc_rate(struct clk_hw *hw,
461 unsigned long parent_rate)
463 struct clk_rm9200_main *clkmain = to_clk_rm9200_main(hw);
465 return clk_main_recalc_rate(clkmain->regmap, parent_rate);
468 static const struct clk_ops rm9200_main_ops = {
469 .prepare = clk_rm9200_main_prepare,
470 .is_prepared = clk_rm9200_main_is_prepared,
471 .recalc_rate = clk_rm9200_main_recalc_rate,
474 static struct clk * __init
475 at91_clk_register_rm9200_main(struct regmap *regmap,
477 const char *parent_name)
479 struct clk_rm9200_main *clkmain;
480 struct clk *clk = NULL;
481 struct clk_init_data init;
484 return ERR_PTR(-EINVAL);
487 return ERR_PTR(-EINVAL);
489 clkmain = kzalloc(sizeof(*clkmain), GFP_KERNEL);
491 return ERR_PTR(-ENOMEM);
494 init.ops = &rm9200_main_ops;
495 init.parent_names = &parent_name;
496 init.num_parents = 1;
499 clkmain->hw.init = &init;
500 clkmain->regmap = regmap;
502 clk = clk_register(NULL, &clkmain->hw);
509 static void __init of_at91rm9200_clk_main_setup(struct device_node *np)
512 const char *parent_name;
513 const char *name = np->name;
514 struct regmap *regmap;
516 parent_name = of_clk_get_parent_name(np, 0);
517 of_property_read_string(np, "clock-output-names", &name);
519 regmap = syscon_node_to_regmap(of_get_parent(np));
523 clk = at91_clk_register_rm9200_main(regmap, name, parent_name);
527 of_clk_add_provider(np, of_clk_src_simple_get, clk);
529 CLK_OF_DECLARE(at91rm9200_clk_main, "atmel,at91rm9200-clk-main",
530 of_at91rm9200_clk_main_setup);
532 static irqreturn_t clk_sam9x5_main_irq_handler(int irq, void *dev_id)
534 struct clk_sam9x5_main *clkmain = dev_id;
536 wake_up(&clkmain->wait);
537 disable_irq_nosync(clkmain->irq);
542 static inline bool clk_sam9x5_main_ready(struct regmap *regmap)
546 regmap_read(regmap, AT91_PMC_SR, &status);
548 return status & AT91_PMC_MOSCSELS ? 1 : 0;
551 static int clk_sam9x5_main_prepare(struct clk_hw *hw)
553 struct clk_sam9x5_main *clkmain = to_clk_sam9x5_main(hw);
554 struct regmap *regmap = clkmain->regmap;
556 while (!clk_sam9x5_main_ready(regmap)) {
557 enable_irq(clkmain->irq);
558 wait_event(clkmain->wait,
559 clk_sam9x5_main_ready(regmap));
562 return clk_main_probe_frequency(regmap);
565 static int clk_sam9x5_main_is_prepared(struct clk_hw *hw)
567 struct clk_sam9x5_main *clkmain = to_clk_sam9x5_main(hw);
569 return clk_sam9x5_main_ready(clkmain->regmap);
572 static unsigned long clk_sam9x5_main_recalc_rate(struct clk_hw *hw,
573 unsigned long parent_rate)
575 struct clk_sam9x5_main *clkmain = to_clk_sam9x5_main(hw);
577 return clk_main_recalc_rate(clkmain->regmap, parent_rate);
580 static int clk_sam9x5_main_set_parent(struct clk_hw *hw, u8 index)
582 struct clk_sam9x5_main *clkmain = to_clk_sam9x5_main(hw);
583 struct regmap *regmap = clkmain->regmap;
589 regmap_read(regmap, AT91_CKGR_MOR, &tmp);
590 tmp &= ~MOR_KEY_MASK;
592 if (index && !(tmp & AT91_PMC_MOSCSEL))
593 regmap_write(regmap, AT91_CKGR_MOR, tmp | AT91_PMC_MOSCSEL);
594 else if (!index && (tmp & AT91_PMC_MOSCSEL))
595 regmap_write(regmap, AT91_CKGR_MOR, tmp & ~AT91_PMC_MOSCSEL);
597 while (!clk_sam9x5_main_ready(regmap)) {
598 enable_irq(clkmain->irq);
599 wait_event(clkmain->wait,
600 clk_sam9x5_main_ready(regmap));
606 static u8 clk_sam9x5_main_get_parent(struct clk_hw *hw)
608 struct clk_sam9x5_main *clkmain = to_clk_sam9x5_main(hw);
611 regmap_read(clkmain->regmap, AT91_CKGR_MOR, &status);
613 return status & AT91_PMC_MOSCEN ? 1 : 0;
616 static const struct clk_ops sam9x5_main_ops = {
617 .prepare = clk_sam9x5_main_prepare,
618 .is_prepared = clk_sam9x5_main_is_prepared,
619 .recalc_rate = clk_sam9x5_main_recalc_rate,
620 .set_parent = clk_sam9x5_main_set_parent,
621 .get_parent = clk_sam9x5_main_get_parent,
624 static struct clk * __init
625 at91_clk_register_sam9x5_main(struct regmap *regmap,
628 const char **parent_names,
632 struct clk_sam9x5_main *clkmain;
633 struct clk *clk = NULL;
634 struct clk_init_data init;
638 return ERR_PTR(-EINVAL);
640 if (!parent_names || !num_parents)
641 return ERR_PTR(-EINVAL);
643 clkmain = kzalloc(sizeof(*clkmain), GFP_KERNEL);
645 return ERR_PTR(-ENOMEM);
648 init.ops = &sam9x5_main_ops;
649 init.parent_names = parent_names;
650 init.num_parents = num_parents;
651 init.flags = CLK_SET_PARENT_GATE;
653 clkmain->hw.init = &init;
654 clkmain->regmap = regmap;
656 regmap_read(clkmain->regmap, AT91_CKGR_MOR, &status);
657 clkmain->parent = status & AT91_PMC_MOSCEN ? 1 : 0;
658 init_waitqueue_head(&clkmain->wait);
659 irq_set_status_flags(clkmain->irq, IRQ_NOAUTOEN);
660 ret = request_irq(clkmain->irq, clk_sam9x5_main_irq_handler,
661 IRQF_TRIGGER_HIGH, name, clkmain);
665 clk = clk_register(NULL, &clkmain->hw);
667 free_irq(clkmain->irq, clkmain);
674 static void __init of_at91sam9x5_clk_main_setup(struct device_node *np)
677 const char *parent_names[2];
680 const char *name = np->name;
681 struct regmap *regmap;
683 num_parents = of_clk_get_parent_count(np);
684 if (num_parents <= 0 || num_parents > 2)
687 of_clk_parent_fill(np, parent_names, num_parents);
688 regmap = syscon_node_to_regmap(of_get_parent(np));
692 of_property_read_string(np, "clock-output-names", &name);
694 irq = irq_of_parse_and_map(np, 0);
698 clk = at91_clk_register_sam9x5_main(regmap, irq, name, parent_names,
703 of_clk_add_provider(np, of_clk_src_simple_get, clk);
705 CLK_OF_DECLARE(at91sam9x5_clk_main, "atmel,at91sam9x5-clk-main",
706 of_at91sam9x5_clk_main_setup);