]> git.karo-electronics.de Git - linux-beck.git/commitdiff
ARM: OMAP2+: CM: add common APIs for cm_module_enable/disable
authorTero Kristo <t-kristo@ti.com>
Mon, 27 Oct 2014 15:39:24 +0000 (08:39 -0700)
committerTony Lindgren <tony@atomide.com>
Mon, 27 Oct 2014 15:39:24 +0000 (08:39 -0700)
Adds a generic CM driver API for enabling/disabling modules.
The SoC specific implementations are registered through cm_ll_data.

Signed-off-by: Tero Kristo <t-kristo@ti.com>
Tested-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
arch/arm/mach-omap2/cm.h
arch/arm/mach-omap2/cm33xx.c
arch/arm/mach-omap2/cm33xx.h
arch/arm/mach-omap2/cm_common.c
arch/arm/mach-omap2/cminst44xx.c
arch/arm/mach-omap2/cminst44xx.h
arch/arm/mach-omap2/omap_hwmod.c

index 3ecc5d73e2c5357260e1eab9a24c2ada808931a3..6222e87a79b623e7299e2c694e01246979d1accd 100644 (file)
@@ -46,6 +46,8 @@ extern void omap2_set_globals_cm(void __iomem *cm, void __iomem *cm2);
  * @split_idlest_reg: ptr to the SoC CM-specific split_idlest_reg impl
  * @wait_module_ready: ptr to the SoC CM-specific wait_module_ready impl
  * @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
  */
 struct cm_ll_data {
        int (*split_idlest_reg)(void __iomem *idlest_reg, s16 *prcm_inst,
@@ -54,6 +56,8 @@ struct cm_ll_data {
                                 u8 idlest_shift);
        int (*wait_module_idle)(u8 part, s16 prcm_mod, u16 idlest_reg,
                                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);
 };
 
 extern int cm_split_idlest_reg(void __iomem *idlest_reg, s16 *prcm_inst,
@@ -62,6 +66,8 @@ int omap_cm_wait_module_ready(u8 part, s16 prcm_mod, u16 idlest_reg,
                              u8 idlest_shift);
 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);
 extern int cm_register(struct cm_ll_data *cld);
 extern int cm_unregister(struct cm_ll_data *cld);
 
index ffdcb7abf092a7fbabb55507bc8fb9dedb522d53..b9ad463a368a2ba35c234042a90b800d3b80aa94 100644 (file)
@@ -277,13 +277,14 @@ static int am33xx_cm_wait_module_idle(u8 part, s16 inst, u16 clkctrl_offs,
 /**
  * am33xx_cm_module_enable - Enable the modulemode inside CLKCTRL
  * @mode: Module mode (SW or HW)
+ * @part: CM partition, ignored for AM33xx
  * @inst: CM instance register offset (*_INST macro)
- * @cdoffs: Clockdomain register offset (*_CDOFFS macro)
  * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro)
  *
  * No return value.
  */
-void am33xx_cm_module_enable(u8 mode, u16 inst, s16 cdoffs, u16 clkctrl_offs)
+static void am33xx_cm_module_enable(u8 mode, u8 part, u16 inst,
+                                   u16 clkctrl_offs)
 {
        u32 v;
 
@@ -295,13 +296,13 @@ void am33xx_cm_module_enable(u8 mode, u16 inst, s16 cdoffs, u16 clkctrl_offs)
 
 /**
  * am33xx_cm_module_disable - Disable the module inside CLKCTRL
+ * @part: CM partition, ignored for AM33xx
  * @inst: CM instance register offset (*_INST macro)
- * @cdoffs: Clockdomain register offset (*_CDOFFS macro)
  * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro)
  *
  * No return value.
  */
-void am33xx_cm_module_disable(u16 inst, s16 cdoffs, u16 clkctrl_offs)
+static void am33xx_cm_module_disable(u8 part, u16 inst, u16 clkctrl_offs)
 {
        u32 v;
 
@@ -368,6 +369,8 @@ struct clkdm_ops am33xx_clkdm_operations = {
 static struct cm_ll_data am33xx_cm_ll_data = {
        .wait_module_ready      = &am33xx_cm_wait_module_ready,
        .wait_module_idle       = &am33xx_cm_wait_module_idle,
+       .module_enable          = &am33xx_cm_module_enable,
+       .module_disable         = &am33xx_cm_module_disable,
 };
 
 int __init am33xx_cm_init(void)
index 78a61e5d80e2ac8a6df9430c6843224711fbbd80..046b4b2bc9d93db7a584554c3dc4f93ae0342639 100644 (file)
 
 #ifndef __ASSEMBLER__
 int am33xx_cm_init(void);
-
-#if defined(CONFIG_SOC_AM33XX) || defined(CONFIG_SOC_AM43XX)
-extern void am33xx_cm_module_enable(u8 mode, u16 inst, s16 cdoffs,
-                                       u16 clkctrl_offs);
-extern void am33xx_cm_module_disable(u16 inst, s16 cdoffs,
-                                       u16 clkctrl_offs);
-#else
-static inline void am33xx_cm_module_enable(u8 mode, u16 inst, s16 cdoffs,
-                                       u16 clkctrl_offs)
-{
-}
-static inline void am33xx_cm_module_disable(u16 inst, s16 cdoffs,
-                                       u16 clkctrl_offs)
-{
-}
-#endif
-
 #endif /* ASSEMBLER */
 #endif
index c6237df288d859f170fa87ff33ca3ae034e95ca5..8fe02fcedc48e3974bc90388753efa8a9c27aab6 100644 (file)
@@ -123,6 +123,51 @@ int omap_cm_wait_module_idle(u8 part, s16 prcm_mod, u16 idlest_reg,
                                            idlest_shift);
 }
 
+/**
+ * omap_cm_module_enable - enable a module
+ * @mode: target mode for the module
+ * @part: PRCM partition
+ * @inst: PRCM instance
+ * @clkctrl_offs: CM_CLKCTRL register offset for the module
+ *
+ * Enables clocks for a module identified by (@part, @inst, @clkctrl_offs)
+ * making its IO space accessible. Return 0 upon success, -EINVAL if no
+ * per-SoC module_enable() function pointer has been registered.
+ */
+int omap_cm_module_enable(u8 mode, u8 part, u16 inst, u16 clkctrl_offs)
+{
+       if (!cm_ll_data->module_enable) {
+               WARN_ONCE(1, "cm: %s: no low-level function defined\n",
+                         __func__);
+               return -EINVAL;
+       }
+
+       cm_ll_data->module_enable(mode, part, inst, clkctrl_offs);
+       return 0;
+}
+
+/**
+ * omap_cm_module_disable - disable a module
+ * @part: PRCM partition
+ * @inst: PRCM instance
+ * @clkctrl_offs: CM_CLKCTRL register offset for the module
+ *
+ * Disables clocks for a module identified by (@part, @inst, @clkctrl_offs)
+ * makings its IO space inaccessible. Return 0 upon success, -EINVAL if
+ * no per-SoC module_disable() function pointer has been registered.
+ */
+int omap_cm_module_disable(u8 part, u16 inst, u16 clkctrl_offs)
+{
+       if (!cm_ll_data->module_disable) {
+               WARN_ONCE(1, "cm: %s: no low-level function defined\n",
+                         __func__);
+               return -EINVAL;
+       }
+
+       cm_ll_data->module_disable(part, inst, clkctrl_offs);
+       return 0;
+}
+
 /**
  * cm_register - register per-SoC low-level data with the CM
  * @cld: low-level per-SoC OMAP CM data & function pointers to register
index b189a2b468083a61a5dc53fad97ac329cc605b62..ac034109078ebf4e7b2513d2b99a7b565667d372 100644 (file)
@@ -319,13 +319,12 @@ static int omap4_cminst_wait_module_idle(u8 part, s16 inst, u16 clkctrl_offs,
  * @mode: Module mode (SW or HW)
  * @part: PRCM partition ID that the CM_CLKCTRL register exists in
  * @inst: CM instance register offset (*_INST macro)
- * @cdoffs: Clockdomain register offset (*_CDOFFS macro)
  * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro)
  *
  * No return value.
  */
-void omap4_cminst_module_enable(u8 mode, u8 part, u16 inst, s16 cdoffs,
-                           u16 clkctrl_offs)
+static void omap4_cminst_module_enable(u8 mode, u8 part, u16 inst,
+                                      u16 clkctrl_offs)
 {
        u32 v;
 
@@ -339,13 +338,11 @@ void omap4_cminst_module_enable(u8 mode, u8 part, u16 inst, s16 cdoffs,
  * omap4_cminst_module_disable - Disable the module inside CLKCTRL
  * @part: PRCM partition ID that the CM_CLKCTRL register exists in
  * @inst: CM instance register offset (*_INST macro)
- * @cdoffs: Clockdomain register offset (*_CDOFFS macro)
  * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro)
  *
  * No return value.
  */
-void omap4_cminst_module_disable(u8 part, u16 inst, s16 cdoffs,
-                            u16 clkctrl_offs)
+static void omap4_cminst_module_disable(u8 part, u16 inst, u16 clkctrl_offs)
 {
        u32 v;
 
@@ -513,6 +510,8 @@ struct clkdm_ops am43xx_clkdm_operations = {
 static struct cm_ll_data omap4xxx_cm_ll_data = {
        .wait_module_ready      = &omap4_cminst_wait_module_ready,
        .wait_module_idle       = &omap4_cminst_wait_module_idle,
+       .module_enable          = &omap4_cminst_module_enable,
+       .module_disable         = &omap4_cminst_module_disable,
 };
 
 int __init omap4_cm_init(void)
index d6634fada357dd24699365af3d31949a7ab51578..ffbd7219bb81c394dba5cd09bee15d18ef851600 100644 (file)
 #ifndef __ARCH_ASM_MACH_OMAP2_CMINST44XX_H
 #define __ARCH_ASM_MACH_OMAP2_CMINST44XX_H
 
-extern void omap4_cminst_module_enable(u8 mode, u8 part, u16 inst, s16 cdoffs,
-                                      u16 clkctrl_offs);
-extern void omap4_cminst_module_disable(u8 part, u16 inst, s16 cdoffs,
-                                       u16 clkctrl_offs);
 /*
  * In an ideal world, we would not export these low-level functions,
  * but this will probably take some time to fix properly
index 03a42b37ef187a8a8b108934240be6dd639d5ce2..a8f57ef1e1d41c144fad14239ee895db15615724 100644 (file)
@@ -979,11 +979,9 @@ static void _omap4_enable_module(struct omap_hwmod *oh)
        pr_debug("omap_hwmod: %s: %s: %d\n",
                 oh->name, __func__, oh->prcm.omap4.modulemode);
 
-       omap4_cminst_module_enable(oh->prcm.omap4.modulemode,
-                                  oh->clkdm->prcm_partition,
-                                  oh->clkdm->cm_inst,
-                                  oh->clkdm->clkdm_offs,
-                                  oh->prcm.omap4.clkctrl_offs);
+       omap_cm_module_enable(oh->prcm.omap4.modulemode,
+                             oh->clkdm->prcm_partition,
+                             oh->clkdm->cm_inst, oh->prcm.omap4.clkctrl_offs);
 }
 
 /**
@@ -1001,9 +999,8 @@ static void _am33xx_enable_module(struct omap_hwmod *oh)
        pr_debug("omap_hwmod: %s: %s: %d\n",
                 oh->name, __func__, oh->prcm.omap4.modulemode);
 
-       am33xx_cm_module_enable(oh->prcm.omap4.modulemode, oh->clkdm->cm_inst,
-                               oh->clkdm->clkdm_offs,
-                               oh->prcm.omap4.clkctrl_offs);
+       omap_cm_module_enable(oh->prcm.omap4.modulemode, 0, oh->clkdm->cm_inst,
+                             oh->prcm.omap4.clkctrl_offs);
 }
 
 /**
@@ -1857,10 +1854,8 @@ static int _omap4_disable_module(struct omap_hwmod *oh)
 
        pr_debug("omap_hwmod: %s: %s\n", oh->name, __func__);
 
-       omap4_cminst_module_disable(oh->clkdm->prcm_partition,
-                                   oh->clkdm->cm_inst,
-                                   oh->clkdm->clkdm_offs,
-                                   oh->prcm.omap4.clkctrl_offs);
+       omap_cm_module_disable(oh->clkdm->prcm_partition, oh->clkdm->cm_inst,
+                              oh->prcm.omap4.clkctrl_offs);
 
        v = _omap4_wait_target_disable(oh);
        if (v)
@@ -1889,8 +1884,8 @@ static int _am33xx_disable_module(struct omap_hwmod *oh)
        if (_are_any_hardreset_lines_asserted(oh))
                return 0;
 
-       am33xx_cm_module_disable(oh->clkdm->cm_inst, oh->clkdm->clkdm_offs,
-                                oh->prcm.omap4.clkctrl_offs);
+       omap_cm_module_disable(0, oh->clkdm->cm_inst,
+                              oh->prcm.omap4.clkctrl_offs);
 
        v = _am33xx_wait_target_disable(oh);
        if (v)