power domain: Add support for multiple powerdomains per device

There are cases where there are more than one power domain
attached to the device inorder to get the device functional.
So add support for enabling power domain based on the index.

Reviewed-by: Tom Rini <trini@konsulko.com>
Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
This commit is contained in:
Lokesh Vutla 2018-08-27 15:57:44 +05:30 committed by Tom Rini
parent e585bef17f
commit 2618cf3657
2 changed files with 30 additions and 2 deletions

View file

@ -28,7 +28,8 @@ static int power_domain_of_xlate_default(struct power_domain *power_domain,
return 0; return 0;
} }
int power_domain_get(struct udevice *dev, struct power_domain *power_domain) int power_domain_get_by_index(struct udevice *dev,
struct power_domain *power_domain, int index)
{ {
struct ofnode_phandle_args args; struct ofnode_phandle_args args;
int ret; int ret;
@ -38,7 +39,8 @@ int power_domain_get(struct udevice *dev, struct power_domain *power_domain)
debug("%s(dev=%p, power_domain=%p)\n", __func__, dev, power_domain); debug("%s(dev=%p, power_domain=%p)\n", __func__, dev, power_domain);
ret = dev_read_phandle_with_args(dev, "power-domains", ret = dev_read_phandle_with_args(dev, "power-domains",
"#power-domain-cells", 0, 0, &args); "#power-domain-cells", 0, index,
&args);
if (ret) { if (ret) {
debug("%s: dev_read_phandle_with_args failed: %d\n", debug("%s: dev_read_phandle_with_args failed: %d\n",
__func__, ret); __func__, ret);
@ -73,6 +75,11 @@ int power_domain_get(struct udevice *dev, struct power_domain *power_domain)
return 0; return 0;
} }
int power_domain_get(struct udevice *dev, struct power_domain *power_domain)
{
return power_domain_get_by_index(dev, power_domain, 0);
}
int power_domain_free(struct power_domain *power_domain) int power_domain_free(struct power_domain *power_domain)
{ {
struct power_domain_ops *ops = power_domain_dev_ops(power_domain->dev); struct power_domain_ops *ops = power_domain_dev_ops(power_domain->dev);

View file

@ -97,6 +97,27 @@ int power_domain_get(struct udevice *dev, struct power_domain *power_domain)
} }
#endif #endif
/**
* power_domain_get_by_index - Get the indexed power domain for a device.
*
* @dev: The client device.
* @power_domain: A pointer to a power domain struct to initialize.
* @index: Power domain index to be powered on.
*
* @return 0 if OK, or a negative error code.
*/
#if CONFIG_IS_ENABLED(POWER_DOMAIN)
int power_domain_get_by_index(struct udevice *dev,
struct power_domain *power_domain, int index);
#else
static inline
int power_domain_get_by_index(struct udevice *dev,
struct power_domain *power_domain, int index)
{
return -ENOSYS;
}
#endif
/** /**
* power_domain_free - Free a previously requested power domain. * power_domain_free - Free a previously requested power domain.
* *