diff options
-rw-r--r-- | arch/arm/mach-omap2/prm.h | 1 | ||||
-rw-r--r-- | arch/arm/mach-omap2/prm_common.c | 66 |
2 files changed, 67 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/prm.h b/arch/arm/mach-omap2/prm.h index ac25ae6667cf..623db40fdbbd 100644 --- a/arch/arm/mach-omap2/prm.h +++ b/arch/arm/mach-omap2/prm.h | |||
@@ -18,6 +18,7 @@ | |||
18 | # ifndef __ASSEMBLER__ | 18 | # ifndef __ASSEMBLER__ |
19 | extern void __iomem *prm_base; | 19 | extern void __iomem *prm_base; |
20 | extern void omap2_set_globals_prm(void __iomem *prm); | 20 | extern void omap2_set_globals_prm(void __iomem *prm); |
21 | int of_prcm_init(void); | ||
21 | # endif | 22 | # endif |
22 | 23 | ||
23 | 24 | ||
diff --git a/arch/arm/mach-omap2/prm_common.c b/arch/arm/mach-omap2/prm_common.c index a2e1174ad1b6..b4c4ab9c8044 100644 --- a/arch/arm/mach-omap2/prm_common.c +++ b/arch/arm/mach-omap2/prm_common.c | |||
@@ -23,6 +23,10 @@ | |||
23 | #include <linux/irq.h> | 23 | #include <linux/irq.h> |
24 | #include <linux/interrupt.h> | 24 | #include <linux/interrupt.h> |
25 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
26 | #include <linux/of.h> | ||
27 | #include <linux/of_address.h> | ||
28 | #include <linux/clk-provider.h> | ||
29 | #include <linux/clk/ti.h> | ||
26 | 30 | ||
27 | #include "soc.h" | 31 | #include "soc.h" |
28 | #include "prm2xxx_3xxx.h" | 32 | #include "prm2xxx_3xxx.h" |
@@ -30,6 +34,7 @@ | |||
30 | #include "prm3xxx.h" | 34 | #include "prm3xxx.h" |
31 | #include "prm44xx.h" | 35 | #include "prm44xx.h" |
32 | #include "common.h" | 36 | #include "common.h" |
37 | #include "clock.h" | ||
33 | 38 | ||
34 | /* | 39 | /* |
35 | * OMAP_PRCM_MAX_NR_PENDING_REG: maximum number of PRM_IRQ*_MPU regs | 40 | * OMAP_PRCM_MAX_NR_PENDING_REG: maximum number of PRM_IRQ*_MPU regs |
@@ -464,3 +469,64 @@ int prm_unregister(struct prm_ll_data *pld) | |||
464 | 469 | ||
465 | return 0; | 470 | return 0; |
466 | } | 471 | } |
472 | |||
473 | static struct of_device_id omap_prcm_dt_match_table[] = { | ||
474 | { .compatible = "ti,am3-prcm" }, | ||
475 | { .compatible = "ti,am3-scrm" }, | ||
476 | { .compatible = "ti,am4-prcm" }, | ||
477 | { .compatible = "ti,am4-scrm" }, | ||
478 | { .compatible = "ti,omap3-prm" }, | ||
479 | { .compatible = "ti,omap3-cm" }, | ||
480 | { .compatible = "ti,omap3-scrm" }, | ||
481 | { .compatible = "ti,omap4-cm1" }, | ||
482 | { .compatible = "ti,omap4-prm" }, | ||
483 | { .compatible = "ti,omap4-cm2" }, | ||
484 | { .compatible = "ti,omap4-scrm" }, | ||
485 | { .compatible = "ti,omap5-prm" }, | ||
486 | { .compatible = "ti,omap5-cm-core-aon" }, | ||
487 | { .compatible = "ti,omap5-scrm" }, | ||
488 | { .compatible = "ti,omap5-cm-core" }, | ||
489 | { .compatible = "ti,dra7-prm" }, | ||
490 | { .compatible = "ti,dra7-cm-core-aon" }, | ||
491 | { .compatible = "ti,dra7-cm-core" }, | ||
492 | { } | ||
493 | }; | ||
494 | |||
495 | static struct clk_hw_omap memmap_dummy_ck = { | ||
496 | .flags = MEMMAP_ADDRESSING, | ||
497 | }; | ||
498 | |||
499 | static u32 prm_clk_readl(void __iomem *reg) | ||
500 | { | ||
501 | return omap2_clk_readl(&memmap_dummy_ck, reg); | ||
502 | } | ||
503 | |||
504 | static void prm_clk_writel(u32 val, void __iomem *reg) | ||
505 | { | ||
506 | omap2_clk_writel(val, &memmap_dummy_ck, reg); | ||
507 | } | ||
508 | |||
509 | static struct ti_clk_ll_ops omap_clk_ll_ops = { | ||
510 | .clk_readl = prm_clk_readl, | ||
511 | .clk_writel = prm_clk_writel, | ||
512 | }; | ||
513 | |||
514 | int __init of_prcm_init(void) | ||
515 | { | ||
516 | struct device_node *np; | ||
517 | void __iomem *mem; | ||
518 | int memmap_index = 0; | ||
519 | |||
520 | ti_clk_ll_ops = &omap_clk_ll_ops; | ||
521 | |||
522 | for_each_matching_node(np, omap_prcm_dt_match_table) { | ||
523 | mem = of_iomap(np, 0); | ||
524 | clk_memmaps[memmap_index] = mem; | ||
525 | ti_dt_clk_init_provider(np, memmap_index); | ||
526 | memmap_index++; | ||
527 | } | ||
528 | |||
529 | ti_dt_clockdomains_setup(); | ||
530 | |||
531 | return 0; | ||
532 | } | ||