diff options
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/mach-omap2/cm.h | 1 | ||||
-rw-r--r-- | arch/arm/mach-omap2/cm_common.c | 51 | ||||
-rw-r--r-- | arch/arm/mach-omap2/control.c | 47 | ||||
-rw-r--r-- | arch/arm/mach-omap2/control.h | 1 | ||||
-rw-r--r-- | arch/arm/mach-omap2/io.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-omap2/prm_common.c | 23 |
6 files changed, 106 insertions, 21 deletions
diff --git a/arch/arm/mach-omap2/cm.h b/arch/arm/mach-omap2/cm.h index 6222e87a79b6..748ac338812b 100644 --- a/arch/arm/mach-omap2/cm.h +++ b/arch/arm/mach-omap2/cm.h | |||
@@ -70,6 +70,7 @@ int omap_cm_module_enable(u8 mode, u8 part, u16 inst, u16 clkctrl_offs); | |||
70 | int omap_cm_module_disable(u8 part, u16 inst, u16 clkctrl_offs); | 70 | int omap_cm_module_disable(u8 part, u16 inst, u16 clkctrl_offs); |
71 | extern int cm_register(struct cm_ll_data *cld); | 71 | extern int cm_register(struct cm_ll_data *cld); |
72 | extern int cm_unregister(struct cm_ll_data *cld); | 72 | extern int cm_unregister(struct cm_ll_data *cld); |
73 | int omap_cm_init(void); | ||
73 | 74 | ||
74 | # endif | 75 | # endif |
75 | 76 | ||
diff --git a/arch/arm/mach-omap2/cm_common.c b/arch/arm/mach-omap2/cm_common.c index 8fe02fcedc48..f3d578be3272 100644 --- a/arch/arm/mach-omap2/cm_common.c +++ b/arch/arm/mach-omap2/cm_common.c | |||
@@ -15,10 +15,13 @@ | |||
15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
16 | #include <linux/errno.h> | 16 | #include <linux/errno.h> |
17 | #include <linux/bug.h> | 17 | #include <linux/bug.h> |
18 | #include <linux/of.h> | ||
19 | #include <linux/of_address.h> | ||
18 | 20 | ||
19 | #include "cm2xxx.h" | 21 | #include "cm2xxx.h" |
20 | #include "cm3xxx.h" | 22 | #include "cm3xxx.h" |
21 | #include "cm44xx.h" | 23 | #include "cm44xx.h" |
24 | #include "clock.h" | ||
22 | 25 | ||
23 | /* | 26 | /* |
24 | * cm_ll_data: function pointers to SoC-specific implementations of | 27 | * cm_ll_data: function pointers to SoC-specific implementations of |
@@ -212,3 +215,51 @@ int cm_unregister(struct cm_ll_data *cld) | |||
212 | 215 | ||
213 | return 0; | 216 | return 0; |
214 | } | 217 | } |
218 | |||
219 | static struct omap_prcm_init_data cm_data = { | ||
220 | .index = TI_CLKM_CM, | ||
221 | }; | ||
222 | |||
223 | static struct omap_prcm_init_data cm2_data = { | ||
224 | .index = TI_CLKM_CM2, | ||
225 | }; | ||
226 | |||
227 | static const struct of_device_id omap_cm_dt_match_table[] = { | ||
228 | { .compatible = "ti,omap3-cm", .data = &cm_data }, | ||
229 | { .compatible = "ti,omap4-cm1", .data = &cm_data }, | ||
230 | { .compatible = "ti,omap4-cm2", .data = &cm2_data }, | ||
231 | { .compatible = "ti,omap5-cm-core-aon", .data = &cm_data }, | ||
232 | { .compatible = "ti,omap5-cm-core", .data = &cm2_data }, | ||
233 | { .compatible = "ti,dra7-cm-core-aon", .data = &cm_data }, | ||
234 | { .compatible = "ti,dra7-cm-core", .data = &cm2_data }, | ||
235 | { } | ||
236 | }; | ||
237 | |||
238 | /** | ||
239 | * omap_cm_init - low level init for the CM drivers | ||
240 | * | ||
241 | * Initializes the low level clock infrastructure for CM drivers. | ||
242 | * Returns 0 in success, negative error value in failure. | ||
243 | */ | ||
244 | int __init omap_cm_init(void) | ||
245 | { | ||
246 | struct device_node *np; | ||
247 | void __iomem *mem; | ||
248 | const struct of_device_id *match; | ||
249 | const struct omap_prcm_init_data *data; | ||
250 | int ret; | ||
251 | |||
252 | for_each_matching_node_and_match(np, omap_cm_dt_match_table, &match) { | ||
253 | data = match->data; | ||
254 | |||
255 | mem = of_iomap(np, 0); | ||
256 | if (!mem) | ||
257 | return -ENOMEM; | ||
258 | |||
259 | ret = omap2_clk_provider_init(np, data->index, mem); | ||
260 | if (ret) | ||
261 | return ret; | ||
262 | } | ||
263 | |||
264 | return 0; | ||
265 | } | ||
diff --git a/arch/arm/mach-omap2/control.c b/arch/arm/mach-omap2/control.c index da041b4ab29c..e8818242f968 100644 --- a/arch/arm/mach-omap2/control.c +++ b/arch/arm/mach-omap2/control.c | |||
@@ -14,6 +14,7 @@ | |||
14 | 14 | ||
15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
16 | #include <linux/io.h> | 16 | #include <linux/io.h> |
17 | #include <linux/of_address.h> | ||
17 | 18 | ||
18 | #include "soc.h" | 19 | #include "soc.h" |
19 | #include "iomap.h" | 20 | #include "iomap.h" |
@@ -25,6 +26,7 @@ | |||
25 | #include "sdrc.h" | 26 | #include "sdrc.h" |
26 | #include "pm.h" | 27 | #include "pm.h" |
27 | #include "control.h" | 28 | #include "control.h" |
29 | #include "clock.h" | ||
28 | 30 | ||
29 | /* Used by omap3_ctrl_save_padconf() */ | 31 | /* Used by omap3_ctrl_save_padconf() */ |
30 | #define START_PADCONF_SAVE 0x2 | 32 | #define START_PADCONF_SAVE 0x2 |
@@ -611,3 +613,48 @@ void __init omap3_ctrl_init(void) | |||
611 | omap3_ctrl_setup_d2d_padconf(); | 613 | omap3_ctrl_setup_d2d_padconf(); |
612 | } | 614 | } |
613 | #endif /* CONFIG_ARCH_OMAP3 && CONFIG_PM */ | 615 | #endif /* CONFIG_ARCH_OMAP3 && CONFIG_PM */ |
616 | |||
617 | struct control_init_data { | ||
618 | int index; | ||
619 | }; | ||
620 | |||
621 | static struct control_init_data ctrl_data = { | ||
622 | .index = TI_CLKM_CTRL, | ||
623 | }; | ||
624 | |||
625 | static const struct of_device_id omap_scrm_dt_match_table[] = { | ||
626 | { .compatible = "ti,am3-scrm", .data = &ctrl_data }, | ||
627 | { .compatible = "ti,am4-scrm", .data = &ctrl_data }, | ||
628 | { .compatible = "ti,omap2-scrm", .data = &ctrl_data }, | ||
629 | { .compatible = "ti,omap3-scrm", .data = &ctrl_data }, | ||
630 | { } | ||
631 | }; | ||
632 | |||
633 | /** | ||
634 | * omap_control_init - low level init for the control driver | ||
635 | * | ||
636 | * Initializes the low level clock infrastructure for control driver. | ||
637 | * Returns 0 in success, negative error value in failure. | ||
638 | */ | ||
639 | int __init omap_control_init(void) | ||
640 | { | ||
641 | struct device_node *np; | ||
642 | void __iomem *mem; | ||
643 | const struct of_device_id *match; | ||
644 | const struct omap_prcm_init_data *data; | ||
645 | int ret; | ||
646 | |||
647 | for_each_matching_node_and_match(np, omap_scrm_dt_match_table, &match) { | ||
648 | data = match->data; | ||
649 | |||
650 | mem = of_iomap(np, 0); | ||
651 | if (!mem) | ||
652 | return -ENOMEM; | ||
653 | |||
654 | ret = omap2_clk_provider_init(np, data->index, mem); | ||
655 | if (ret) | ||
656 | return ret; | ||
657 | } | ||
658 | |||
659 | return 0; | ||
660 | } | ||
diff --git a/arch/arm/mach-omap2/control.h b/arch/arm/mach-omap2/control.h index b8a487181210..baf5783cb05d 100644 --- a/arch/arm/mach-omap2/control.h +++ b/arch/arm/mach-omap2/control.h | |||
@@ -464,6 +464,7 @@ extern void omap_ctrl_write_dsp_boot_mode(u8 bootmode); | |||
464 | extern void omap3630_ctrl_disable_rta(void); | 464 | extern void omap3630_ctrl_disable_rta(void); |
465 | extern int omap3_ctrl_save_padconf(void); | 465 | extern int omap3_ctrl_save_padconf(void); |
466 | void omap3_ctrl_init(void); | 466 | void omap3_ctrl_init(void); |
467 | int omap_control_init(void); | ||
467 | extern void omap2_set_globals_control(void __iomem *ctrl, | 468 | extern void omap2_set_globals_control(void __iomem *ctrl, |
468 | void __iomem *ctrl_pad); | 469 | void __iomem *ctrl_pad); |
469 | #else | 470 | #else |
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 460da22a005c..46640c0ddc0f 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
@@ -756,6 +756,10 @@ int __init omap_clk_init(void) | |||
756 | ti_clk_init_features(); | 756 | ti_clk_init_features(); |
757 | 757 | ||
758 | if (of_have_populated_dt()) { | 758 | if (of_have_populated_dt()) { |
759 | ret = omap_control_init(); | ||
760 | if (ret) | ||
761 | return ret; | ||
762 | |||
759 | ret = omap_prcm_init(); | 763 | ret = omap_prcm_init(); |
760 | if (ret) | 764 | if (ret) |
761 | return ret; | 765 | return ret; |
diff --git a/arch/arm/mach-omap2/prm_common.c b/arch/arm/mach-omap2/prm_common.c index 1bfd00e10f76..6cbebbe252c4 100644 --- a/arch/arm/mach-omap2/prm_common.c +++ b/arch/arm/mach-omap2/prm_common.c | |||
@@ -637,43 +637,22 @@ static struct omap_prcm_init_data prm_data = { | |||
637 | .index = TI_CLKM_PRM, | 637 | .index = TI_CLKM_PRM, |
638 | }; | 638 | }; |
639 | 639 | ||
640 | static struct omap_prcm_init_data cm_data = { | ||
641 | .index = TI_CLKM_CM, | ||
642 | }; | ||
643 | |||
644 | static struct omap_prcm_init_data cm2_data = { | ||
645 | .index = TI_CLKM_CM2, | ||
646 | }; | ||
647 | |||
648 | static struct omap_prcm_init_data scrm_data = { | 640 | static struct omap_prcm_init_data scrm_data = { |
649 | .index = TI_CLKM_SCRM, | 641 | .index = TI_CLKM_SCRM, |
650 | }; | 642 | }; |
651 | 643 | ||
652 | static const struct of_device_id omap_prcm_dt_match_table[] = { | 644 | static const struct of_device_id omap_prcm_dt_match_table[] = { |
653 | { .compatible = "ti,am3-prcm", .data = &prm_data }, | 645 | { .compatible = "ti,am3-prcm", .data = &prm_data }, |
654 | { .compatible = "ti,am3-scrm", .data = &scrm_data }, | ||
655 | { .compatible = "ti,am4-prcm", .data = &prm_data }, | 646 | { .compatible = "ti,am4-prcm", .data = &prm_data }, |
656 | { .compatible = "ti,am4-scrm", .data = &scrm_data }, | ||
657 | { .compatible = "ti,dm814-prcm", .data = &prm_data }, | 647 | { .compatible = "ti,dm814-prcm", .data = &prm_data }, |
658 | { .compatible = "ti,dm814-scrm", .data = &scrm_data }, | ||
659 | { .compatible = "ti,dm816-prcm", .data = &prm_data }, | 648 | { .compatible = "ti,dm816-prcm", .data = &prm_data }, |
660 | { .compatible = "ti,dm816-scrm", .data = &scrm_data }, | ||
661 | { .compatible = "ti,omap2-prcm", .data = &prm_data }, | 649 | { .compatible = "ti,omap2-prcm", .data = &prm_data }, |
662 | { .compatible = "ti,omap2-scrm", .data = &scrm_data }, | ||
663 | { .compatible = "ti,omap3-prm", .data = &prm_data }, | 650 | { .compatible = "ti,omap3-prm", .data = &prm_data }, |
664 | { .compatible = "ti,omap3-cm", .data = &cm_data }, | ||
665 | { .compatible = "ti,omap3-scrm", .data = &scrm_data }, | ||
666 | { .compatible = "ti,omap4-cm1", .data = &cm_data }, | ||
667 | { .compatible = "ti,omap4-prm", .data = &prm_data }, | 651 | { .compatible = "ti,omap4-prm", .data = &prm_data }, |
668 | { .compatible = "ti,omap4-cm2", .data = &cm2_data }, | ||
669 | { .compatible = "ti,omap4-scrm", .data = &scrm_data }, | 652 | { .compatible = "ti,omap4-scrm", .data = &scrm_data }, |
670 | { .compatible = "ti,omap5-prm", .data = &prm_data }, | 653 | { .compatible = "ti,omap5-prm", .data = &prm_data }, |
671 | { .compatible = "ti,omap5-cm-core-aon", .data = &cm_data }, | ||
672 | { .compatible = "ti,omap5-scrm", .data = &scrm_data }, | 654 | { .compatible = "ti,omap5-scrm", .data = &scrm_data }, |
673 | { .compatible = "ti,omap5-cm-core", .data = &cm2_data }, | ||
674 | { .compatible = "ti,dra7-prm", .data = &prm_data }, | 655 | { .compatible = "ti,dra7-prm", .data = &prm_data }, |
675 | { .compatible = "ti,dra7-cm-core-aon", .data = &cm_data }, | ||
676 | { .compatible = "ti,dra7-cm-core", .data = &cm2_data }, | ||
677 | { } | 656 | { } |
678 | }; | 657 | }; |
679 | 658 | ||
@@ -703,6 +682,8 @@ int __init omap_prcm_init(void) | |||
703 | return ret; | 682 | return ret; |
704 | } | 683 | } |
705 | 684 | ||
685 | omap_cm_init(); | ||
686 | |||
706 | return 0; | 687 | return 0; |
707 | } | 688 | } |
708 | 689 | ||