|
@@ -343,3 +343,104 @@ int voltdm_add_pwrdm(struct voltagedomain *voltdm, struct powerdomain *pwrdm)
|
|
|
* voltdm_for_each_pwrdm - call function for each pwrdm in a voltdm
|
|
|
* @voltdm: struct voltagedomain * to iterate over
|
|
|
* @fn: callback function *
|
|
|
+ *
|
|
|
+ * Call the supplied function @fn for each powerdomain in the
|
|
|
+ * voltagedomain @voltdm. Returns -EINVAL if presented with invalid
|
|
|
+ * pointers; or passes along the last return value of the callback
|
|
|
+ * function, which should be 0 for success or anything else to
|
|
|
+ * indicate failure.
|
|
|
+ */
|
|
|
+int voltdm_for_each_pwrdm(struct voltagedomain *voltdm,
|
|
|
+ int (*fn)(struct voltagedomain *voltdm,
|
|
|
+ struct powerdomain *pwrdm))
|
|
|
+{
|
|
|
+ struct powerdomain *pwrdm;
|
|
|
+ int ret = 0;
|
|
|
+
|
|
|
+ if (!fn)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ list_for_each_entry(pwrdm, &voltdm->pwrdm_list, voltdm_node)
|
|
|
+ ret = (*fn)(voltdm, pwrdm);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * voltdm_for_each - call function on each registered voltagedomain
|
|
|
+ * @fn: callback function *
|
|
|
+ *
|
|
|
+ * Call the supplied function @fn for each registered voltagedomain.
|
|
|
+ * The callback function @fn can return anything but 0 to bail out
|
|
|
+ * early from the iterator. 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 voltdm_for_each(int (*fn)(struct voltagedomain *voltdm, void *user),
|
|
|
+ void *user)
|
|
|
+{
|
|
|
+ struct voltagedomain *temp_voltdm;
|
|
|
+ int ret = 0;
|
|
|
+
|
|
|
+ if (!fn)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ list_for_each_entry(temp_voltdm, &voltdm_list, node) {
|
|
|
+ ret = (*fn)(temp_voltdm, user);
|
|
|
+ if (ret)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+static int _voltdm_register(struct voltagedomain *voltdm)
|
|
|
+{
|
|
|
+ if (!voltdm || !voltdm->name)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ INIT_LIST_HEAD(&voltdm->pwrdm_list);
|
|
|
+ list_add(&voltdm->node, &voltdm_list);
|
|
|
+
|
|
|
+ pr_debug("voltagedomain: registered %s\n", voltdm->name);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * voltdm_lookup - look up a voltagedomain by name, return a pointer
|
|
|
+ * @name: name of voltagedomain
|
|
|
+ *
|
|
|
+ * Find a registered voltagedomain by its name @name. Returns a pointer
|
|
|
+ * to the struct voltagedomain if found, or NULL otherwise.
|
|
|
+ */
|
|
|
+struct voltagedomain *voltdm_lookup(const char *name)
|
|
|
+{
|
|
|
+ struct voltagedomain *voltdm ;
|
|
|
+
|
|
|
+ if (!name)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ voltdm = _voltdm_lookup(name);
|
|
|
+
|
|
|
+ return voltdm;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * voltdm_init - set up the voltagedomain layer
|
|
|
+ * @voltdm_list: array of struct voltagedomain pointers to register
|
|
|
+ *
|
|
|
+ * Loop through the array of voltagedomains @voltdm_list, registering all
|
|
|
+ * that are available on the current CPU. If voltdm_list is supplied
|
|
|
+ * and not null, all of the referenced voltagedomains will be
|
|
|
+ * registered. No return value.
|
|
|
+ */
|
|
|
+void voltdm_init(struct voltagedomain **voltdms)
|
|
|
+{
|
|
|
+ struct voltagedomain **v;
|
|
|
+
|
|
|
+ if (voltdms) {
|
|
|
+ for (v = voltdms; *v; v++)
|
|
|
+ _voltdm_register(*v);
|
|
|
+ }
|
|
|
+}
|