ARM: OMAP2+: PRCM: store also physical addresses for instances
authorTero Kristo <t-kristo@ti.com>
Wed, 31 May 2017 15:00:00 +0000 (18:00 +0300)
committerTony Lindgren <tony@atomide.com>
Tue, 6 Jun 2017 07:13:51 +0000 (00:13 -0700)
In some cases the physical address info is needed, so store this
under the existing cm*_base, prm_base and prcm_mpu_base variables.
These are converted now to structs that contain both virtual and
physical address base for the instance.

Signed-off-by: Tero Kristo <t-kristo@ti.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
16 files changed:
arch/arm/mach-omap2/cm.h
arch/arm/mach-omap2/cm2xxx_3xxx.h
arch/arm/mach-omap2/cm33xx.c
arch/arm/mach-omap2/cm3xxx.c
arch/arm/mach-omap2/cm_common.c
arch/arm/mach-omap2/cminst44xx.c
arch/arm/mach-omap2/prcm-common.h
arch/arm/mach-omap2/prcm_mpu44xx.c
arch/arm/mach-omap2/prcm_mpu_44xx_54xx.h
arch/arm/mach-omap2/prm.h
arch/arm/mach-omap2/prm2xxx_3xxx.h
arch/arm/mach-omap2/prm33xx.c
arch/arm/mach-omap2/prm3xxx.c
arch/arm/mach-omap2/prm44xx.c
arch/arm/mach-omap2/prm_common.c
arch/arm/mach-omap2/prminst44xx.c

index de75cbcdc9d1bdf34db8edb78a4347f873e331fa..e833984cc85e6fc8cfa1a4045351cee19a404449 100644 (file)
 
 # ifndef __ASSEMBLER__
 #include <linux/clk/ti.h>
-extern void __iomem *cm_base;
-extern void __iomem *cm2_base;
+
+#include "prcm-common.h"
+
+extern struct omap_domain_base cm_base;
+extern struct omap_domain_base cm2_base;
 extern void omap2_set_globals_cm(void __iomem *cm, void __iomem *cm2);
 # endif
 
index 72928a3ce2aab5266bf85f1d892be0304c1828b2..aa148cd57cc1acaba2c1a2ffe2e2f749b3c2d2ae 100644 (file)
 
 static inline u32 omap2_cm_read_mod_reg(s16 module, u16 idx)
 {
-       return readl_relaxed(cm_base + module + idx);
+       return readl_relaxed(cm_base.va + module + idx);
 }
 
 static inline void omap2_cm_write_mod_reg(u32 val, s16 module, u16 idx)
 {
-       writel_relaxed(val, cm_base + module + idx);
+       writel_relaxed(val, cm_base.va + module + idx);
 }
 
 /* Read-modify-write a register in a CM module. Caller must lock */
index 6f2d0aec05139fc1f09b5a57a973423c7cf90882..a9e08d89104e54b8cf02a0ad17869c50a57588df 100644 (file)
 /* Read a register in a CM instance */
 static inline u32 am33xx_cm_read_reg(u16 inst, u16 idx)
 {
-       return readl_relaxed(cm_base + inst + idx);
+       return readl_relaxed(cm_base.va + inst + idx);
 }
 
 /* Write into a register in a CM */
 static inline void am33xx_cm_write_reg(u32 val, u16 inst, u16 idx)
 {
-       writel_relaxed(val, cm_base + inst + idx);
+       writel_relaxed(val, cm_base.va + inst + idx);
 }
 
 /* Read-modify-write a register in CM */
index 55b046a719dc653275eb7421b735f876b3dc81cd..961bc478b9de5519e20fef0555fd574accc58018 100644 (file)
@@ -669,7 +669,8 @@ static struct cm_ll_data omap3xxx_cm_ll_data = {
 
 int __init omap3xxx_cm_init(const struct omap_prcm_init_data *data)
 {
-       omap2_clk_legacy_provider_init(TI_CLKM_CM, cm_base + OMAP3430_IVA2_MOD);
+       omap2_clk_legacy_provider_init(TI_CLKM_CM, cm_base.va +
+                                      OMAP3430_IVA2_MOD);
        return cm_register(&omap3xxx_cm_ll_data);
 }
 
index bbe41f4c9dc8ca58fb5d8fbb8e15126e5ecfb9a0..d555791cf349dd160f49be49e58088e16900466b 100644 (file)
@@ -32,10 +32,10 @@ static struct cm_ll_data null_cm_ll_data;
 static struct cm_ll_data *cm_ll_data = &null_cm_ll_data;
 
 /* cm_base: base virtual address of the CM IP block */
-void __iomem *cm_base;
+struct omap_domain_base cm_base;
 
 /* cm2_base: base virtual address of the CM2 IP block (OMAP44xx only) */
-void __iomem *cm2_base;
+struct omap_domain_base cm2_base;
 
 #define CM_NO_CLOCKS           0x1
 #define CM_SINGLE_INSTANCE     0x2
@@ -49,8 +49,8 @@ void __iomem *cm2_base;
  */
 void __init omap2_set_globals_cm(void __iomem *cm, void __iomem *cm2)
 {
-       cm_base = cm;
-       cm2_base = cm2;
+       cm_base.va = cm;
+       cm2_base.va = cm2;
 }
 
 /**
@@ -315,27 +315,34 @@ int __init omap2_cm_base_init(void)
        struct device_node *np;
        const struct of_device_id *match;
        struct omap_prcm_init_data *data;
-       void __iomem *mem;
+       struct resource res;
+       int ret;
+       struct omap_domain_base *mem = NULL;
 
        for_each_matching_node_and_match(np, omap_cm_dt_match_table, &match) {
                data = (struct omap_prcm_init_data *)match->data;
 
-               mem = of_iomap(np, 0);
-               if (!mem)
-                       return -ENOMEM;
+               ret = of_address_to_resource(np, 0, &res);
+               if (ret)
+                       return ret;
 
                if (data->index == TI_CLKM_CM)
-                       cm_base = mem + data->offset;
+                       mem = &cm_base;
 
                if (data->index == TI_CLKM_CM2)
-                       cm2_base = mem + data->offset;
+                       mem = &cm2_base;
+
+               data->mem = ioremap(res.start, resource_size(&res));
 
-               data->mem = mem;
+               if (mem) {
+                       mem->pa = res.start + data->offset;
+                       mem->va = data->mem + data->offset;
+               }
 
                data->np = np;
 
                if (data->init && (data->flags & CM_SINGLE_INSTANCE ||
-                                  (cm_base && cm2_base)))
+                                  (cm_base.va && cm2_base.va)))
                        data->init(data);
        }
 
index 2ab27ade136a2dbca7e225102cb9700d35674504..cfa10a31b9536264c823b763263ca582743ed38b 100644 (file)
@@ -55,7 +55,7 @@
 #define CLKCTRL_IDLEST_INTERFACE_IDLE          0x2
 #define CLKCTRL_IDLEST_DISABLED                        0x3
 
-static void __iomem *_cm_bases[OMAP4_MAX_PRCM_PARTITIONS];
+static struct omap_domain_base _cm_bases[OMAP4_MAX_PRCM_PARTITIONS];
 
 /**
  * omap_cm_base_init - Populates the cm partitions
@@ -65,10 +65,11 @@ static void __iomem *_cm_bases[OMAP4_MAX_PRCM_PARTITIONS];
  */
 static void omap_cm_base_init(void)
 {
-       _cm_bases[OMAP4430_PRM_PARTITION] = prm_base;
-       _cm_bases[OMAP4430_CM1_PARTITION] = cm_base;
-       _cm_bases[OMAP4430_CM2_PARTITION] = cm2_base;
-       _cm_bases[OMAP4430_PRCM_MPU_PARTITION] = prcm_mpu_base;
+       memcpy(&_cm_bases[OMAP4430_PRM_PARTITION], &prm_base, sizeof(prm_base));
+       memcpy(&_cm_bases[OMAP4430_CM1_PARTITION], &cm_base, sizeof(cm_base));
+       memcpy(&_cm_bases[OMAP4430_CM2_PARTITION], &cm2_base, sizeof(cm2_base));
+       memcpy(&_cm_bases[OMAP4430_PRCM_MPU_PARTITION], &prcm_mpu_base,
+              sizeof(prcm_mpu_base));
 }
 
 /* Private functions */
@@ -116,8 +117,8 @@ static u32 omap4_cminst_read_inst_reg(u8 part, u16 inst, u16 idx)
 {
        BUG_ON(part >= OMAP4_MAX_PRCM_PARTITIONS ||
               part == OMAP4430_INVALID_PRCM_PARTITION ||
-              !_cm_bases[part]);
-       return readl_relaxed(_cm_bases[part] + inst + idx);
+              !_cm_bases[part].va);
+       return readl_relaxed(_cm_bases[part].va + inst + idx);
 }
 
 /* Write into a register in a CM instance */
@@ -125,8 +126,8 @@ static void omap4_cminst_write_inst_reg(u32 val, u8 part, u16 inst, u16 idx)
 {
        BUG_ON(part >= OMAP4_MAX_PRCM_PARTITIONS ||
               part == OMAP4430_INVALID_PRCM_PARTITION ||
-              !_cm_bases[part]);
-       writel_relaxed(val, _cm_bases[part] + inst + idx);
+              !_cm_bases[part].va);
+       writel_relaxed(val, _cm_bases[part].va + inst + idx);
 }
 
 /* Read-modify-write a register in CM1. Caller must lock */
index c8f590b7c32de018917071c55db11361c0ba4c08..ee7041d523cf9d64cbffda1abd9834af676775c1 100644 (file)
@@ -526,10 +526,16 @@ struct omap_prcm_irq_setup {
        .priority = _priority                           \
        }
 
+struct omap_domain_base {
+       u32 pa;
+       void __iomem *va;
+};
+
 /**
  * struct omap_prcm_init_data - PRCM driver init data
  * @index: clock memory mapping index to be used
  * @mem: IO mem pointer for this module
+ * @phys: IO mem physical base address for this module
  * @offset: module base address offset from the IO base
  * @flags: PRCM module init flags
  * @device_inst_offset: device instance offset within the module address space
@@ -539,6 +545,7 @@ struct omap_prcm_irq_setup {
 struct omap_prcm_init_data {
        int index;
        void __iomem *mem;
+       u32 phys;
        s16 offset;
        u16 flags;
        s32 device_inst_offset;
index cdbee6326d2921375cc23abe55b15dac4dbd7723..9c782f5c3f94c941d00d41864f9228d62ad59a16 100644 (file)
@@ -24,7 +24,7 @@
  * prcm_mpu_base: the virtual address of the start of the PRCM_MPU IP
  *   block registers
  */
-void __iomem *prcm_mpu_base;
+struct omap_domain_base prcm_mpu_base;
 
 /* PRCM_MPU low-level functions */
 
@@ -58,5 +58,5 @@ u32 omap4_prcm_mpu_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst, s16 reg)
  */
 void __init omap2_set_globals_prcm_mpu(void __iomem *prcm_mpu)
 {
-       prcm_mpu_base = prcm_mpu;
+       prcm_mpu_base.va = prcm_mpu;
 }
index ca149e70bed07702bed6691d03cbb5ac07cfab50..f565f7f73175c4c4cd8ca11d7cfccdc9c3269aac 100644 (file)
@@ -24,7 +24,9 @@
 #define __ARCH_ARM_MACH_OMAP2_PRCM_MPU_44XX_54XX_H
 
 #ifndef __ASSEMBLER__
-extern void __iomem *prcm_mpu_base;
+#include "prcm-common.h"
+
+extern struct omap_domain_base prcm_mpu_base;
 
 extern u32 omap4_prcm_mpu_read_inst_reg(s16 inst, u16 idx);
 extern void omap4_prcm_mpu_write_inst_reg(u32 val, s16 inst, u16 idx);
index 233bc84fbc0e4ee13248a388a76e7c0270b819a4..94dc3565add818071270c980db0cb03f62d41c49 100644 (file)
@@ -16,7 +16,7 @@
 #include "prcm-common.h"
 
 # ifndef __ASSEMBLER__
-extern void __iomem *prm_base;
+extern struct omap_domain_base prm_base;
 extern u16 prm_features;
 extern void omap2_set_globals_prm(void __iomem *prm);
 int omap_prcm_init(void);
index f57e29b0e041a1f857f6edadc9b39938c3a118e2..6775e10883fb31b0b98474929355f42fee228f14 100644 (file)
 /* Power/reset management domain register get/set */
 static inline u32 omap2_prm_read_mod_reg(s16 module, u16 idx)
 {
-       return readl_relaxed(prm_base + module + idx);
+       return readl_relaxed(prm_base.va + module + idx);
 }
 
 static inline void omap2_prm_write_mod_reg(u32 val, s16 module, u16 idx)
 {
-       writel_relaxed(val, prm_base + module + idx);
+       writel_relaxed(val, prm_base.va + module + idx);
 }
 
 /* Read-modify-write a register in a PRM module. Caller must lock */
index dcb5001d77da3d487c9bfb8674f4de6d3aab9db2..d2c5bcabdbebe03d9e05e4e551815ce85b9c4207 100644 (file)
 /* Read a register in a PRM instance */
 static u32 am33xx_prm_read_reg(s16 inst, u16 idx)
 {
-       return readl_relaxed(prm_base + inst + idx);
+       return readl_relaxed(prm_base.va + inst + idx);
 }
 
 /* Write into a register in a PRM instance */
 static void am33xx_prm_write_reg(u32 val, s16 inst, u16 idx)
 {
-       writel_relaxed(val, prm_base + inst + idx);
+       writel_relaxed(val, prm_base.va + inst + idx);
 }
 
 /* Read-modify-write a register in PRM. Caller must lock */
index 718981bb80cdf594d77c6b0d5d5067c806729862..50291a063aab60bac89647df48eb23b5ca959d12 100644 (file)
@@ -676,7 +676,7 @@ static struct prm_ll_data omap3xxx_prm_ll_data = {
 int __init omap3xxx_prm_init(const struct omap_prcm_init_data *data)
 {
        omap2_clk_legacy_provider_init(TI_CLKM_PRM,
-                                      prm_base + OMAP3430_IVA2_MOD);
+                                      prm_base.va + OMAP3430_IVA2_MOD);
        if (omap3_has_io_wakeup())
                prm_features |= PRM_HAS_IO_WAKEUP;
 
index 30768003f8543b4b9080db78c91ea9a3f919a38a..090a13173589edb98948500b4d54a8893f9b5141 100644 (file)
@@ -91,13 +91,13 @@ static struct prm_reset_src_map omap44xx_prm_reset_src_map[] = {
 /* Read a register in a CM/PRM instance in the PRM module */
 static u32 omap4_prm_read_inst_reg(s16 inst, u16 reg)
 {
-       return readl_relaxed(prm_base + inst + reg);
+       return readl_relaxed(prm_base.va + inst + reg);
 }
 
 /* Write into a register in a CM/PRM instance in the PRM module */
 static void omap4_prm_write_inst_reg(u32 val, s16 inst, u16 reg)
 {
-       writel_relaxed(val, prm_base + inst + reg);
+       writel_relaxed(val, prm_base.va + inst + reg);
 }
 
 /* Read-modify-write a register in a PRM module. Caller must lock */
index 2b138b65129a5d609ff2ae02a55181c10154113b..ae13aa710c75f2b15cdb992ec527ac45b441c533 100644 (file)
@@ -66,7 +66,7 @@ static struct irq_chip_generic **prcm_irq_chips;
 static struct omap_prcm_irq_setup *prcm_irq_setup;
 
 /* prm_base: base virtual address of the PRM IP block */
-void __iomem *prm_base;
+struct omap_domain_base prm_base;
 
 u16 prm_features;
 
@@ -325,7 +325,7 @@ int omap_prcm_register_chain_handler(struct omap_prcm_irq_setup *irq_setup)
 
        for (i = 0; i < irq_setup->nr_regs; i++) {
                gc = irq_alloc_generic_chip("PRCM", 1,
-                       irq_setup->base_irq + i * 32, prm_base,
+                       irq_setup->base_irq + i * 32, prm_base.va,
                        handle_level_irq);
 
                if (!gc) {
@@ -364,7 +364,7 @@ err:
  */
 void __init omap2_set_globals_prm(void __iomem *prm)
 {
-       prm_base = prm;
+       prm_base.va = prm;
 }
 
 /**
@@ -755,19 +755,22 @@ int __init omap2_prm_base_init(void)
        struct device_node *np;
        const struct of_device_id *match;
        struct omap_prcm_init_data *data;
-       void __iomem *mem;
+       struct resource res;
+       int ret;
 
        for_each_matching_node_and_match(np, omap_prcm_dt_match_table, &match) {
                data = (struct omap_prcm_init_data *)match->data;
 
-               mem = of_iomap(np, 0);
-               if (!mem)
-                       return -ENOMEM;
+               ret = of_address_to_resource(np, 0, &res);
+               if (ret)
+                       return ret;
 
-               if (data->index == TI_CLKM_PRM)
-                       prm_base = mem + data->offset;
+               data->mem = ioremap(res.start, resource_size(&res));
 
-               data->mem = mem;
+               if (data->index == TI_CLKM_PRM) {
+                       prm_base.va = data->mem + data->offset;
+                       prm_base.pa = res.start + data->offset;
+               }
 
                data->np = np;
 
index d0b15dbafa2efa01b1ba06531d1e163d0e70f16c..48b8127b4e990fe911bbf13087e75a994634fe59 100644 (file)
@@ -29,7 +29,7 @@
 #include "prcm_mpu44xx.h"
 #include "soc.h"
 
-static void __iomem *_prm_bases[OMAP4_MAX_PRCM_PARTITIONS];
+static struct omap_domain_base _prm_bases[OMAP4_MAX_PRCM_PARTITIONS];
 
 static s32 prm_dev_inst = PRM_INSTANCE_UNKNOWN;
 
@@ -41,8 +41,10 @@ static s32 prm_dev_inst = PRM_INSTANCE_UNKNOWN;
  */
 void omap_prm_base_init(void)
 {
-       _prm_bases[OMAP4430_PRM_PARTITION] = prm_base;
-       _prm_bases[OMAP4430_PRCM_MPU_PARTITION] = prcm_mpu_base;
+       memcpy(&_prm_bases[OMAP4430_PRM_PARTITION], &prm_base,
+              sizeof(prm_base));
+       memcpy(&_prm_bases[OMAP4430_PRCM_MPU_PARTITION], &prcm_mpu_base,
+              sizeof(prcm_mpu_base));
 }
 
 s32 omap4_prmst_get_prm_dev_inst(void)
@@ -60,8 +62,8 @@ u32 omap4_prminst_read_inst_reg(u8 part, s16 inst, u16 idx)
 {
        BUG_ON(part >= OMAP4_MAX_PRCM_PARTITIONS ||
               part == OMAP4430_INVALID_PRCM_PARTITION ||
-              !_prm_bases[part]);
-       return readl_relaxed(_prm_bases[part] + inst + idx);
+              !_prm_bases[part].va);
+       return readl_relaxed(_prm_bases[part].va + inst + idx);
 }
 
 /* Write into a register in a PRM instance */
@@ -69,8 +71,8 @@ void omap4_prminst_write_inst_reg(u32 val, u8 part, s16 inst, u16 idx)
 {
        BUG_ON(part >= OMAP4_MAX_PRCM_PARTITIONS ||
               part == OMAP4430_INVALID_PRCM_PARTITION ||
-              !_prm_bases[part]);
-       writel_relaxed(val, _prm_bases[part] + inst + idx);
+              !_prm_bases[part].va);
+       writel_relaxed(val, _prm_bases[part].va + inst + idx);
 }
 
 /* Read-modify-write a register in PRM. Caller must lock */