|
@@ -327,3 +327,112 @@ int clkdm_register_autodeps(struct clkdm_autodep *ia)
|
|
|
return -EEXIST;
|
|
|
|
|
|
autodeps = ia;
|
|
|
+ for (a = autodeps; a->clkdm.ptr; a++)
|
|
|
+ _autodep_lookup(a);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * clkdm_complete_init - set up the clockdomain layer
|
|
|
+ *
|
|
|
+ * Put all clockdomains into software-supervised mode; PM code should
|
|
|
+ * later enable hardware-supervised mode as appropriate. Must be
|
|
|
+ * called after clkdm_register_clkdms(). Returns -EACCES if called
|
|
|
+ * before clkdm_register_clkdms(), or 0 upon success.
|
|
|
+ */
|
|
|
+int clkdm_complete_init(void)
|
|
|
+{
|
|
|
+ struct clockdomain *clkdm;
|
|
|
+
|
|
|
+ if (list_empty(&clkdm_list))
|
|
|
+ return -EACCES;
|
|
|
+
|
|
|
+ list_for_each_entry(clkdm, &clkdm_list, node) {
|
|
|
+ if (clkdm->flags & CLKDM_CAN_FORCE_WAKEUP)
|
|
|
+ clkdm_wakeup(clkdm);
|
|
|
+ else if (clkdm->flags & CLKDM_CAN_DISABLE_AUTO)
|
|
|
+ clkdm_deny_idle(clkdm);
|
|
|
+
|
|
|
+ _resolve_clkdm_deps(clkdm, clkdm->wkdep_srcs);
|
|
|
+ clkdm_clear_all_wkdeps(clkdm);
|
|
|
+
|
|
|
+ _resolve_clkdm_deps(clkdm, clkdm->sleepdep_srcs);
|
|
|
+ clkdm_clear_all_sleepdeps(clkdm);
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * clkdm_lookup - look up a clockdomain by name, return a pointer
|
|
|
+ * @name: name of clockdomain
|
|
|
+ *
|
|
|
+ * Find a registered clockdomain by its name @name. Returns a pointer
|
|
|
+ * to the struct clockdomain if found, or NULL otherwise.
|
|
|
+ */
|
|
|
+struct clockdomain *clkdm_lookup(const char *name)
|
|
|
+{
|
|
|
+ struct clockdomain *clkdm, *temp_clkdm;
|
|
|
+
|
|
|
+ if (!name)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ clkdm = NULL;
|
|
|
+
|
|
|
+ list_for_each_entry(temp_clkdm, &clkdm_list, node) {
|
|
|
+ if (!strcmp(name, temp_clkdm->name)) {
|
|
|
+ clkdm = temp_clkdm;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return clkdm;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * clkdm_for_each - call function on each registered clockdomain
|
|
|
+ * @fn: callback function *
|
|
|
+ *
|
|
|
+ * Call the supplied function @fn for each registered clockdomain.
|
|
|
+ * The callback function @fn can return anything but 0 to bail
|
|
|
+ * out early from the iterator. The callback function is called with
|
|
|
+ * the clkdm_mutex held, so no clockdomain structure manipulation
|
|
|
+ * functions should be called from the callback, although hardware
|
|
|
+ * clockdomain control functions are fine. Returns the last return
|
|
|
+ * value of the callback function, which should be 0 for success or
|
|
|
+ * anything else to indicate failure; or -EINVAL if the function pointer
|
|
|
+ * is null.
|
|
|
+ */
|
|
|
+int clkdm_for_each(int (*fn)(struct clockdomain *clkdm, void *user),
|
|
|
+ void *user)
|
|
|
+{
|
|
|
+ struct clockdomain *clkdm;
|
|
|
+ int ret = 0;
|
|
|
+
|
|
|
+ if (!fn)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ list_for_each_entry(clkdm, &clkdm_list, node) {
|
|
|
+ ret = (*fn)(clkdm, user);
|
|
|
+ if (ret)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * clkdm_get_pwrdm - return a ptr to the pwrdm that this clkdm resides in
|
|
|
+ * @clkdm: struct clockdomain *
|
|
|
+ *
|
|
|
+ * Return a pointer to the struct powerdomain that the specified clockdomain
|
|
|
+ * @clkdm exists in, or returns NULL if @clkdm is NULL.
|
|
|
+ */
|
|
|
+struct powerdomain *clkdm_get_pwrdm(struct clockdomain *clkdm)
|
|
|
+{
|
|
|
+ if (!clkdm)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ return clkdm->pwrdm.ptr;
|