]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
ARM: OMAP2+: CM: add support for getting phys address for a clkctrl register
authorTero Kristo <t-kristo@ti.com>
Fri, 4 Aug 2017 14:37:45 +0000 (17:37 +0300)
committerTero Kristo <t-kristo@ti.com>
Mon, 4 Dec 2017 09:35:20 +0000 (11:35 +0200)
Add a new CM API for fetching the physical address of a hwmod clkctrl
register. This is needed to map omap hwmods against clkctrl clocks, the
existing support for clkdm address translation was not sufficient to
handle the mutant cases where the clockdomain offset is completely
off from the clkctrl ones.

Signed-off-by: Tero Kristo <t-kristo@ti.com>
arch/arm/mach-omap2/cm.h
arch/arm/mach-omap2/cm_common.c

index e833984cc85e6fc8cfa1a4045351cee19a404449..39c9c10f3b1bb0ce4aef52168a9eb04a83c252f8 100644 (file)
@@ -52,6 +52,7 @@ extern void omap2_set_globals_cm(void __iomem *cm, void __iomem *cm2);
  * @wait_module_idle: ptr to the SoC CM-specific wait_module_idle impl
  * @module_enable: ptr to the SoC CM-specific module_enable impl
  * @module_disable: ptr to the SoC CM-specific module_disable impl
+ * @xlate_clkctrl: ptr to the SoC CM-specific clkctrl xlate addr impl
  */
 struct cm_ll_data {
        int (*split_idlest_reg)(struct clk_omap_reg *idlest_reg, s16 *prcm_inst,
@@ -62,6 +63,7 @@ struct cm_ll_data {
                                u8 idlest_shift);
        void (*module_enable)(u8 mode, u8 part, u16 inst, u16 clkctrl_offs);
        void (*module_disable)(u8 part, u16 inst, u16 clkctrl_offs);
+       u32 (*xlate_clkctrl)(u8 part, u16 inst, u16 clkctrl_offs);
 };
 
 extern int cm_split_idlest_reg(struct clk_omap_reg *idlest_reg, s16 *prcm_inst,
@@ -72,6 +74,7 @@ int omap_cm_wait_module_idle(u8 part, s16 prcm_mod, u16 idlest_reg,
                             u8 idlest_shift);
 int omap_cm_module_enable(u8 mode, u8 part, u16 inst, u16 clkctrl_offs);
 int omap_cm_module_disable(u8 part, u16 inst, u16 clkctrl_offs);
+u32 omap_cm_xlate_clkctrl(u8 part, u16 inst, u16 clkctrl_offs);
 extern int cm_register(struct cm_ll_data *cld);
 extern int cm_unregister(struct cm_ll_data *cld);
 int omap_cm_init(void);
index d555791cf349dd160f49be49e58088e16900466b..1752e92e77c6d0745c427853abcd56a0a71e8e53 100644 (file)
@@ -175,6 +175,16 @@ int omap_cm_module_disable(u8 part, u16 inst, u16 clkctrl_offs)
        return 0;
 }
 
+u32 omap_cm_xlate_clkctrl(u8 part, u16 inst, u16 clkctrl_offs)
+{
+       if (!cm_ll_data->xlate_clkctrl) {
+               WARN_ONCE(1, "cm: %s: no low-level function defined\n",
+                         __func__);
+               return 0;
+       }
+       return cm_ll_data->xlate_clkctrl(part, inst, clkctrl_offs);
+}
+
 /**
  * cm_register - register per-SoC low-level data with the CM
  * @cld: low-level per-SoC OMAP CM data & function pointers to register