diff options
Diffstat (limited to 'arch/arm/mach-omap2/prm_common.c')
| -rw-r--r-- | arch/arm/mach-omap2/prm_common.c | 82 | 
1 files changed, 82 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/prm_common.c b/arch/arm/mach-omap2/prm_common.c index 228b850e632..25e8b823211 100644 --- a/arch/arm/mach-omap2/prm_common.c +++ b/arch/arm/mach-omap2/prm_common.c @@ -23,12 +23,18 @@  #include <linux/irq.h>  #include <linux/interrupt.h>  #include <linux/slab.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/clk-provider.h> +#include <linux/clk/ti.h> +#include "soc.h"  #include "prm2xxx_3xxx.h"  #include "prm2xxx.h"  #include "prm3xxx.h"  #include "prm44xx.h"  #include "common.h" +#include "clock.h"  /*   * OMAP_PRCM_MAX_NR_PENDING_REG: maximum number of PRM_IRQ*_MPU regs @@ -56,6 +62,8 @@ static struct omap_prcm_irq_setup *prcm_irq_setup;  /* prm_base: base virtual address of the PRM IP block */  void __iomem *prm_base; +u16 prm_features; +  /*   * prm_ll_data: function pointers to SoC-specific implementations of   * common PRM functions @@ -322,6 +330,11 @@ int omap_prcm_register_chain_handler(struct omap_prcm_irq_setup *irq_setup)  		prcm_irq_chips[i] = gc;  	} +	if (of_have_populated_dt()) { +		int irq = omap_prcm_event_to_irq("io"); +		omap_pcs_legacy_init(irq, irq_setup->reconfigure_io_chain); +	} +  	return 0;  err: @@ -453,3 +466,72 @@ int prm_unregister(struct prm_ll_data *pld)  	return 0;  } + +static struct of_device_id omap_prcm_dt_match_table[] = { +	{ .compatible = "ti,am3-prcm" }, +	{ .compatible = "ti,am3-scrm" }, +	{ .compatible = "ti,am4-prcm" }, +	{ .compatible = "ti,am4-scrm" }, +	{ .compatible = "ti,omap3-prm" }, +	{ .compatible = "ti,omap3-cm" }, +	{ .compatible = "ti,omap3-scrm" }, +	{ .compatible = "ti,omap4-cm1" }, +	{ .compatible = "ti,omap4-prm" }, +	{ .compatible = "ti,omap4-cm2" }, +	{ .compatible = "ti,omap4-scrm" }, +	{ .compatible = "ti,omap5-prm" }, +	{ .compatible = "ti,omap5-cm-core-aon" }, +	{ .compatible = "ti,omap5-scrm" }, +	{ .compatible = "ti,omap5-cm-core" }, +	{ .compatible = "ti,dra7-prm" }, +	{ .compatible = "ti,dra7-cm-core-aon" }, +	{ .compatible = "ti,dra7-cm-core" }, +	{ } +}; + +static struct clk_hw_omap memmap_dummy_ck = { +	.flags = MEMMAP_ADDRESSING, +}; + +static u32 prm_clk_readl(void __iomem *reg) +{ +	return omap2_clk_readl(&memmap_dummy_ck, reg); +} + +static void prm_clk_writel(u32 val, void __iomem *reg) +{ +	omap2_clk_writel(val, &memmap_dummy_ck, reg); +} + +static struct ti_clk_ll_ops omap_clk_ll_ops = { +	.clk_readl = prm_clk_readl, +	.clk_writel = prm_clk_writel, +}; + +int __init of_prcm_init(void) +{ +	struct device_node *np; +	void __iomem *mem; +	int memmap_index = 0; + +	ti_clk_ll_ops = &omap_clk_ll_ops; + +	for_each_matching_node(np, omap_prcm_dt_match_table) { +		mem = of_iomap(np, 0); +		clk_memmaps[memmap_index] = mem; +		ti_dt_clk_init_provider(np, memmap_index); +		memmap_index++; +	} + +	ti_dt_clockdomains_setup(); + +	return 0; +} + +static int __init prm_late_init(void) +{ +	if (prm_ll_data->late_init) +		return prm_ll_data->late_init(); +	return 0; +} +subsys_initcall(prm_late_init);  | 
