Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 129c65ee authored by Paul Walmsley's avatar Paul Walmsley
Browse files

OMAP: powerdomain: split pwrdm_init() into two functions



In preparation for OMAP_CHIP() removal, split pwrdm_init() into three
functions.  This allows some of them to be called multiple times: for
example, pwrdm_register_pwrdms() can be called once to register
powerdomains that are common to a group of SoCs, and once to register
powerdomains that are specific to a single SoC.

The appropriate order to call these functions - which is enforced
by the code - is:

1. pwrdm_register_platform_funcs()
2. pwrdm_register_pwrdms() (can be called multiple times)
3. pwrdm_complete_init()

Convert the OMAP2, 3, and 4 powerdomain init code to use these new
functions.

While here, improve documentation, and increase CodingStyle
conformance by shortening some local variable names.

Signed-off-by: default avatarPaul Walmsley <paul@pwsan.com>
parent a5ffef6a
Loading
Loading
Loading
Loading
+62 −22
Original line number Diff line number Diff line
/*
 * OMAP powerdomain control
 *
 * Copyright (C) 2007-2008 Texas Instruments, Inc.
 * Copyright (C) 2007-2008, 2011 Texas Instruments, Inc.
 * Copyright (C) 2007-2011 Nokia Corporation
 *
 * Written by Paul Walmsley
@@ -194,36 +194,76 @@ static int _pwrdm_post_transition_cb(struct powerdomain *pwrdm, void *unused)
/* Public functions */

/**
 * pwrdm_init - set up the powerdomain layer
 * @pwrdms: array of struct powerdomain pointers to register
 * @custom_funcs: func pointers for arch specific implementations
 * pwrdm_register_platform_funcs - register powerdomain implementation fns
 * @po: func pointers for arch specific implementations
 *
 * Loop through the array of powerdomains @pwrdms, registering all
 * that are available on the current CPU.  Also, program all
 * powerdomain target state as ON; this is to prevent domains from
 * hitting low power states (if bootloader has target states set to
 * something other than ON) and potentially even losing context while
 * PM is not fully initialized.  The PM late init code can then program
 * the desired target state for all the power domains.  No return
 * value.
 * Register the list of function pointers used to implement the
 * powerdomain functions on different OMAP SoCs.  Should be called
 * before any other pwrdm_register*() function.  Returns -EINVAL if
 * @po is null, -EEXIST if platform functions have already been
 * registered, or 0 upon success.
 */
void pwrdm_init(struct powerdomain **pwrdms, struct pwrdm_ops *custom_funcs)
int pwrdm_register_platform_funcs(struct pwrdm_ops *po)
{
	if (!po)
		return -EINVAL;

	if (arch_pwrdm)
		return -EEXIST;

	arch_pwrdm = po;

	return 0;
}

/**
 * pwrdm_register_pwrdms - register SoC powerdomains
 * @ps: pointer to an array of struct powerdomain to register
 *
 * Register the powerdomains available on a particular OMAP SoC.  Must
 * be called after pwrdm_register_platform_funcs().  May be called
 * multiple times.  Returns -EACCES if called before
 * pwrdm_register_platform_funcs(); -EINVAL if the argument @ps is
 * null; or 0 upon success.
 */
int pwrdm_register_pwrdms(struct powerdomain **ps)
{
	struct powerdomain **p = NULL;
	struct powerdomain *temp_p;

	if (!custom_funcs)
		WARN(1, "powerdomain: No custom pwrdm functions registered\n");
	else
		arch_pwrdm = custom_funcs;
	if (!arch_pwrdm)
		return -EEXIST;

	if (pwrdms) {
		for (p = pwrdms; *p; p++)
	if (!ps)
		return -EINVAL;

	for (p = ps; *p; p++)
		_pwrdm_register(*p);

	return 0;
}

/**
 * pwrdm_complete_init - set up the powerdomain layer
 *
 * Do whatever is necessary to initialize registered powerdomains and
 * powerdomain code.  Currently, this programs the next power state
 * for each powerdomain to ON.  This prevents powerdomains from
 * unexpectedly losing context or entering high wakeup latency modes
 * with non-power-management-enabled kernels.  Must be called after
 * pwrdm_register_pwrdms().  Returns -EACCES if called before
 * pwrdm_register_pwrdms(), or 0 upon success.
 */
int pwrdm_complete_init(void)
{
	struct powerdomain *temp_p;

	if (list_empty(&pwrdm_list))
		return -EACCES;

	list_for_each_entry(temp_p, &pwrdm_list, node)
		pwrdm_set_next_pwrst(temp_p, PWRDM_POWER_ON);

	return 0;
}

/**
+3 −1
Original line number Diff line number Diff line
@@ -162,7 +162,9 @@ struct pwrdm_ops {
	int	(*pwrdm_wait_transition)(struct powerdomain *pwrdm);
};

void pwrdm_init(struct powerdomain **pwrdm_list, struct pwrdm_ops *custom_funcs);
int pwrdm_register_platform_funcs(struct pwrdm_ops *custom_funcs);
int pwrdm_register_pwrdms(struct powerdomain **pwrdm_list);
int pwrdm_complete_init(void);

struct powerdomain *pwrdm_lookup(const char *name);

+3 −1
Original line number Diff line number Diff line
@@ -119,5 +119,7 @@ static struct powerdomain *powerdomains_omap2xxx[] __initdata = {

void __init omap2xxx_powerdomains_init(void)
{
	pwrdm_init(powerdomains_omap2xxx, &omap2_pwrdm_operations);
	pwrdm_register_platform_funcs(&omap2_pwrdm_operations);
	pwrdm_register_pwrdms(powerdomains_omap2xxx);
	pwrdm_complete_init();
}
+3 −1
Original line number Diff line number Diff line
@@ -283,5 +283,7 @@ static struct powerdomain *powerdomains_omap3xxx[] __initdata = {

void __init omap3xxx_powerdomains_init(void)
{
	pwrdm_init(powerdomains_omap3xxx, &omap3_pwrdm_operations);
	pwrdm_register_platform_funcs(&omap3_pwrdm_operations);
	pwrdm_register_pwrdms(powerdomains_omap3xxx);
	pwrdm_complete_init();
}
+3 −1
Original line number Diff line number Diff line
@@ -352,5 +352,7 @@ static struct powerdomain *powerdomains_omap44xx[] __initdata = {

void __init omap44xx_powerdomains_init(void)
{
	pwrdm_init(powerdomains_omap44xx, &omap4_pwrdm_operations);
	pwrdm_register_platform_funcs(&omap4_pwrdm_operations);
	pwrdm_register_pwrdms(powerdomains_omap44xx);
	pwrdm_complete_init();
}