|
@@ -257,3 +257,73 @@ int clkdm_register_platform_funcs(struct clkdm_ops *co)
|
|
|
|
|
|
if (arch_clkdm)
|
|
if (arch_clkdm)
|
|
return -EEXIST;
|
|
return -EEXIST;
|
|
|
|
+
|
|
|
|
+ arch_clkdm = co;
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * clkdm_register_clkdms - register SoC clockdomains
|
|
|
|
+ * @cs: pointer to an array of struct clockdomain to register
|
|
|
|
+ *
|
|
|
|
+ * Register the clockdomains available on a particular OMAP SoC. Must
|
|
|
|
+ * be called after clkdm_register_platform_funcs(). May be called
|
|
|
|
+ * multiple times. Returns -EACCES if called before
|
|
|
|
+ * clkdm_register_platform_funcs(); -EINVAL if the argument @cs is
|
|
|
|
+ * null; or 0 upon success.
|
|
|
|
+ */
|
|
|
|
+int clkdm_register_clkdms(struct clockdomain **cs)
|
|
|
|
+{
|
|
|
|
+ struct clockdomain **c = NULL;
|
|
|
|
+
|
|
|
|
+ if (!arch_clkdm)
|
|
|
|
+ return -EACCES;
|
|
|
|
+
|
|
|
|
+ if (!cs)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ for (c = cs; *c; c++)
|
|
|
|
+ _clkdm_register(*c);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * clkdm_register_autodeps - register autodeps (if required)
|
|
|
|
+ * @ia: pointer to a static array of struct clkdm_autodep to register
|
|
|
|
+ *
|
|
|
|
+ * Register clockdomain "automatic dependencies." These are
|
|
|
|
+ * clockdomain wakeup and sleep dependencies that are automatically
|
|
|
|
+ * added whenever the first clock inside a clockdomain is enabled, and
|
|
|
|
+ * removed whenever the last clock inside a clockdomain is disabled.
|
|
|
|
+ * These are currently only used on OMAP3 devices, and are deprecated,
|
|
|
|
+ * since they waste energy. However, until the OMAP2/3 IP block
|
|
|
|
+ * enable/disable sequence can be converted to match the OMAP4
|
|
|
|
+ * sequence, they are needed.
|
|
|
|
+ *
|
|
|
|
+ * Must be called only after all of the SoC clockdomains are
|
|
|
|
+ * registered, since the function will resolve autodep clockdomain
|
|
|
|
+ * names into clockdomain pointers.
|
|
|
|
+ *
|
|
|
|
+ * The struct clkdm_autodep @ia array must be static, as this function
|
|
|
|
+ * does not copy the array elements.
|
|
|
|
+ *
|
|
|
|
+ * Returns -EACCES if called before any clockdomains have been
|
|
|
|
+ * registered, -EINVAL if called with a null @ia argument, -EEXIST if
|
|
|
|
+ * autodeps have already been registered, or 0 upon success.
|
|
|
|
+ */
|
|
|
|
+int clkdm_register_autodeps(struct clkdm_autodep *ia)
|
|
|
|
+{
|
|
|
|
+ struct clkdm_autodep *a = NULL;
|
|
|
|
+
|
|
|
|
+ if (list_empty(&clkdm_list))
|
|
|
|
+ return -EACCES;
|
|
|
|
+
|
|
|
|
+ if (!ia)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ if (autodeps)
|
|
|
|
+ return -EEXIST;
|
|
|
|
+
|
|
|
|
+ autodeps = ia;
|