OMAP2+: voltage: keep track of powerdomains in each voltagedomain
When a powerdomain is registered and it has an associated voltage domain, add the powerdomain to the voltagedomain using voltdm_add_pwrdm(). Also add voltagedomain iterator helper functions to iterate over all registered voltagedomains and all powerdomains associated with a voltagedomain. Modeled after a similar relationship between clockdomains and powerdomains. Signed-off-by: Kevin Hilman <khilman@ti.com>
This commit is contained in:
parent
048a7034f1
commit
e69c22b145
@ -99,6 +99,8 @@ static int _pwrdm_register(struct powerdomain *pwrdm)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
pwrdm->voltdm.ptr = voltdm;
|
pwrdm->voltdm.ptr = voltdm;
|
||||||
|
INIT_LIST_HEAD(&pwrdm->voltdm_node);
|
||||||
|
voltdm_add_pwrdm(voltdm, pwrdm);
|
||||||
|
|
||||||
list_add(&pwrdm->node, &pwrdm_list);
|
list_add(&pwrdm->node, &pwrdm_list);
|
||||||
|
|
||||||
|
@ -91,6 +91,7 @@ struct powerdomain;
|
|||||||
* @pwrsts_mem_on: Possible memory bank pwrstates when pwrdm in ON
|
* @pwrsts_mem_on: Possible memory bank pwrstates when pwrdm in ON
|
||||||
* @pwrdm_clkdms: Clockdomains in this powerdomain
|
* @pwrdm_clkdms: Clockdomains in this powerdomain
|
||||||
* @node: list_head linking all powerdomains
|
* @node: list_head linking all powerdomains
|
||||||
|
* @voltdm_node: list_head linking all powerdomains in a voltagedomain
|
||||||
* @state:
|
* @state:
|
||||||
* @state_counter:
|
* @state_counter:
|
||||||
* @timer:
|
* @timer:
|
||||||
@ -114,6 +115,7 @@ struct powerdomain {
|
|||||||
const u8 prcm_partition;
|
const u8 prcm_partition;
|
||||||
struct clockdomain *pwrdm_clkdms[PWRDM_MAX_CLKDMS];
|
struct clockdomain *pwrdm_clkdms[PWRDM_MAX_CLKDMS];
|
||||||
struct list_head node;
|
struct list_head node;
|
||||||
|
struct list_head voltdm_node;
|
||||||
int state;
|
int state;
|
||||||
unsigned state_counter[PWRDM_MAX_PWRSTS];
|
unsigned state_counter[PWRDM_MAX_PWRSTS];
|
||||||
unsigned ret_logic_off_counter;
|
unsigned ret_logic_off_counter;
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
#include "control.h"
|
#include "control.h"
|
||||||
|
|
||||||
#include "voltage.h"
|
#include "voltage.h"
|
||||||
|
#include "powerdomain.h"
|
||||||
|
|
||||||
#include "vc.h"
|
#include "vc.h"
|
||||||
#include "vp.h"
|
#include "vp.h"
|
||||||
@ -1085,11 +1086,90 @@ static struct voltagedomain *_voltdm_lookup(const char *name)
|
|||||||
return voltdm;
|
return voltdm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* voltdm_add_pwrdm - add a powerdomain to a voltagedomain
|
||||||
|
* @voltdm: struct voltagedomain * to add the powerdomain to
|
||||||
|
* @pwrdm: struct powerdomain * to associate with a voltagedomain
|
||||||
|
*
|
||||||
|
* Associate the powerdomain @pwrdm with a voltagedomain @voltdm. This
|
||||||
|
* enables the use of voltdm_for_each_pwrdm(). Returns -EINVAL if
|
||||||
|
* presented with invalid pointers; -ENOMEM if memory could not be allocated;
|
||||||
|
* or 0 upon success.
|
||||||
|
*/
|
||||||
|
int voltdm_add_pwrdm(struct voltagedomain *voltdm, struct powerdomain *pwrdm)
|
||||||
|
{
|
||||||
|
if (!voltdm || !pwrdm)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
pr_debug("voltagedomain: associating powerdomain %s with voltagedomain "
|
||||||
|
"%s\n", pwrdm->name, voltdm->name);
|
||||||
|
|
||||||
|
list_add(&pwrdm->voltdm_node, &voltdm->pwrdm_list);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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)
|
static int _voltdm_register(struct voltagedomain *voltdm)
|
||||||
{
|
{
|
||||||
if (!voltdm || !voltdm->name)
|
if (!voltdm || !voltdm->name)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
INIT_LIST_HEAD(&voltdm->pwrdm_list);
|
||||||
list_add(&voltdm->node, &voltdm_list);
|
list_add(&voltdm->node, &voltdm_list);
|
||||||
|
|
||||||
pr_debug("voltagedomain: registered %s\n", voltdm->name);
|
pr_debug("voltagedomain: registered %s\n", voltdm->name);
|
||||||
|
@ -19,6 +19,8 @@
|
|||||||
#include "vc.h"
|
#include "vc.h"
|
||||||
#include "vp.h"
|
#include "vp.h"
|
||||||
|
|
||||||
|
struct powerdomain;
|
||||||
|
|
||||||
/* XXX document */
|
/* XXX document */
|
||||||
#define VOLTSCALE_VPFORCEUPDATE 1
|
#define VOLTSCALE_VPFORCEUPDATE 1
|
||||||
#define VOLTSCALE_VCBYPASS 2
|
#define VOLTSCALE_VCBYPASS 2
|
||||||
@ -55,12 +57,14 @@ struct omap_vfsm_instance_data {
|
|||||||
* @name: Name of the voltage domain which can be used as a unique identifier.
|
* @name: Name of the voltage domain which can be used as a unique identifier.
|
||||||
* @scalable: Whether or not this voltage domain is scalable
|
* @scalable: Whether or not this voltage domain is scalable
|
||||||
* @node: list_head linking all voltage domains
|
* @node: list_head linking all voltage domains
|
||||||
|
* @pwrdm_list: list_head linking all powerdomains in this voltagedomain
|
||||||
* @vdd: to be removed
|
* @vdd: to be removed
|
||||||
*/
|
*/
|
||||||
struct voltagedomain {
|
struct voltagedomain {
|
||||||
char *name;
|
char *name;
|
||||||
bool scalable;
|
bool scalable;
|
||||||
struct list_head node;
|
struct list_head node;
|
||||||
|
struct list_head pwrdm_list;
|
||||||
struct omap_vdd_info *vdd;
|
struct omap_vdd_info *vdd;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -187,4 +191,9 @@ extern void omap44xx_voltagedomains_init(void);
|
|||||||
struct voltagedomain *voltdm_lookup(const char *name);
|
struct voltagedomain *voltdm_lookup(const char *name);
|
||||||
void voltdm_init(struct voltagedomain **voltdm_list);
|
void voltdm_init(struct voltagedomain **voltdm_list);
|
||||||
int voltdm_add_pwrdm(struct voltagedomain *voltdm, struct powerdomain *pwrdm);
|
int voltdm_add_pwrdm(struct voltagedomain *voltdm, struct powerdomain *pwrdm);
|
||||||
|
int voltdm_for_each(int (*fn)(struct voltagedomain *voltdm, void *user),
|
||||||
|
void *user);
|
||||||
|
int voltdm_for_each_pwrdm(struct voltagedomain *voltdm,
|
||||||
|
int (*fn)(struct voltagedomain *voltdm,
|
||||||
|
struct powerdomain *pwrdm));
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user