Skip to content

Commit

Permalink
OMAP clockdomain/powerdomain: remove runtime register/unregister
Browse files Browse the repository at this point in the history
OMAP clockdomains and powerdomains are currently defined statically,
only registered at boot, and never unregistered, so we can remove the
unregister function and the locking.   A variant of this was originally
suggested a while ago by Dmitry Baryshkov <dbaryshkov@gmail.com>.
This version of this patch contains an additional fix from Kevin Hilman
<khilman@deeprootsystems.com> to address one of the pwrdm_for_each_nolock()
users in mach-omap2/pm-debug.c.   Thanks Kevin.

Signed-off-by: Paul Walmsley <paul@pwsan.com>
Cc: Dmitry Baryshkov <dbaryshkov@gmail.com>
Cc: Kevin Hilman <khilman@deeprootsystems.com>
  • Loading branch information
Paul Walmsley committed Jan 27, 2010
1 parent 3d309cd commit e909d62
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 216 deletions.
118 changes: 40 additions & 78 deletions arch/arm/mach-omap2/clockdomain.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,6 @@
/* clkdm_list contains all registered struct clockdomains */
static LIST_HEAD(clkdm_list);

/* clkdm_mutex protects clkdm_list add and del ops */
static DEFINE_MUTEX(clkdm_mutex);

/* array of clockdomain deps to be added/removed when clkdm in hwsup mode */
static struct clkdm_autodep *autodeps;

Expand All @@ -67,6 +64,45 @@ static struct clockdomain *_clkdm_lookup(const char *name)
return clkdm;
}

/**
* _clkdm_register - register a clockdomain
* @clkdm: struct clockdomain * to register
*
* Adds a clockdomain to the internal clockdomain list.
* Returns -EINVAL if given a null pointer, -EEXIST if a clockdomain is
* already registered by the provided name, or 0 upon success.
*/
static int _clkdm_register(struct clockdomain *clkdm)
{
struct powerdomain *pwrdm;

if (!clkdm || !clkdm->name)
return -EINVAL;

if (!omap_chip_is(clkdm->omap_chip))
return -EINVAL;

pwrdm = pwrdm_lookup(clkdm->pwrdm.name);
if (!pwrdm) {
pr_err("clockdomain: %s: powerdomain %s does not exist\n",
clkdm->name, clkdm->pwrdm.name);
return -EINVAL;
}
clkdm->pwrdm.ptr = pwrdm;

/* Verify that the clockdomain is not already registered */
if (_clkdm_lookup(clkdm->name))
return -EEXIST;

list_add(&clkdm->node, &clkdm_list);

pwrdm_add_clkdm(pwrdm, clkdm);

pr_debug("clockdomain: registered %s\n", clkdm->name);

return 0;
}

/* _clkdm_deps_lookup - look up the specified clockdomain in a clkdm list */
static struct clkdm_dep *_clkdm_deps_lookup(struct clockdomain *clkdm,
struct clkdm_dep *deps)
Expand Down Expand Up @@ -240,84 +276,14 @@ void clkdm_init(struct clockdomain **clkdms,

if (clkdms)
for (c = clkdms; *c; c++)
clkdm_register(*c);
_clkdm_register(*c);

autodeps = init_autodeps;
if (autodeps)
for (autodep = autodeps; autodep->clkdm.ptr; autodep++)
_autodep_lookup(autodep);
}

/**
* clkdm_register - register a clockdomain
* @clkdm: struct clockdomain * to register
*
* Adds a clockdomain to the internal clockdomain list.
* Returns -EINVAL if given a null pointer, -EEXIST if a clockdomain is
* already registered by the provided name, or 0 upon success.
*/
int clkdm_register(struct clockdomain *clkdm)
{
int ret = -EINVAL;
struct powerdomain *pwrdm;

if (!clkdm || !clkdm->name)
return -EINVAL;

if (!omap_chip_is(clkdm->omap_chip))
return -EINVAL;

pwrdm = pwrdm_lookup(clkdm->pwrdm.name);
if (!pwrdm) {
pr_err("clockdomain: %s: powerdomain %s does not exist\n",
clkdm->name, clkdm->pwrdm.name);
return -EINVAL;
}
clkdm->pwrdm.ptr = pwrdm;

mutex_lock(&clkdm_mutex);
/* Verify that the clockdomain is not already registered */
if (_clkdm_lookup(clkdm->name)) {
ret = -EEXIST;
goto cr_unlock;
}

list_add(&clkdm->node, &clkdm_list);

pwrdm_add_clkdm(pwrdm, clkdm);

pr_debug("clockdomain: registered %s\n", clkdm->name);
ret = 0;

cr_unlock:
mutex_unlock(&clkdm_mutex);

return ret;
}

/**
* clkdm_unregister - unregister a clockdomain
* @clkdm: struct clockdomain * to unregister
*
* Removes a clockdomain from the internal clockdomain list. Returns
* -EINVAL if clkdm argument is NULL.
*/
int clkdm_unregister(struct clockdomain *clkdm)
{
if (!clkdm)
return -EINVAL;

pwrdm_del_clkdm(clkdm->pwrdm.ptr, clkdm);

mutex_lock(&clkdm_mutex);
list_del(&clkdm->node);
mutex_unlock(&clkdm_mutex);

pr_debug("clockdomain: unregistered %s\n", clkdm->name);

return 0;
}

/**
* clkdm_lookup - look up a clockdomain by name, return a pointer
* @name: name of clockdomain
Expand All @@ -334,14 +300,12 @@ struct clockdomain *clkdm_lookup(const char *name)

clkdm = NULL;

mutex_lock(&clkdm_mutex);
list_for_each_entry(temp_clkdm, &clkdm_list, node) {
if (!strcmp(name, temp_clkdm->name)) {
clkdm = temp_clkdm;
break;
}
}
mutex_unlock(&clkdm_mutex);

return clkdm;
}
Expand Down Expand Up @@ -369,13 +333,11 @@ int clkdm_for_each(int (*fn)(struct clockdomain *clkdm, void *user),
if (!fn)
return -EINVAL;

mutex_lock(&clkdm_mutex);
list_for_each_entry(clkdm, &clkdm_list, node) {
ret = (*fn)(clkdm, user);
if (ret)
break;
}
mutex_unlock(&clkdm_mutex);

return ret;
}
Expand Down
2 changes: 1 addition & 1 deletion arch/arm/mach-omap2/pm-debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -577,7 +577,7 @@ static int __init pm_dbg_init(void)
(void) debugfs_create_file("time", S_IRUGO,
d, (void *)DEBUG_FILE_TIMERS, &debug_fops);

pwrdm_for_each_nolock(pwrdms_setup, (void *)d);
pwrdm_for_each(pwrdms_setup, (void *)d);

pm_dbg_dir = debugfs_create_dir("registers", d);
if (IS_ERR(pm_dbg_dir))
Expand Down
Loading

0 comments on commit e909d62

Please sign in to comment.