diff options
author | Thomas Abraham <thomas.abraham@linaro.org> | 2012-01-27 01:22:07 -0500 |
---|---|---|
committer | Kukjin Kim <kgene.kim@samsung.com> | 2012-01-27 01:22:07 -0500 |
commit | c8aa130b74cc5b112cb2b119d3b477abaaf6e5b2 (patch) | |
tree | 80ca3b93767b0aec09ed566924c196033ad12b49 /drivers/base/power/domain.c | |
parent | dcd6c92267155e70a94b3927bce681ce74b80d1f (diff) |
PM / Domains: Add OF support
A device node pointer is added to generic pm domain structure to associate
the domain with a node in the device tree. The platform code parses the
device tree to find available nodes representing the generic power domain,
instantiates the available domains and initializes them by calling
pm_genpd_init().
Nodes representing the devices include a phandle of the power domain to
which it belongs. As these devices get instantiated, the driver code
checkes for availability of a power domain phandle, converts the phandle
to a device node and uses the new pm_genpd_of_add_device() api to
associate the device with a power domain.
pm_genpd_of_add_device() runs through its list of registered power domains
and matches the OF node of the domain with the one specified as the
parameter. If a match is found, the device is associated with the matched
domain.
Cc: Rob Herring <rob.herring@calxeda.com>
Cc: Grant Likely <grant.likely@secretlab.ca>
Signed-off-by: Thomas Abraham <thomas.abraham@linaro.org>
Acked-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
Diffstat (limited to 'drivers/base/power/domain.c')
-rw-r--r-- | drivers/base/power/domain.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c index 978bbf7ac6af..939109b75c9b 100644 --- a/drivers/base/power/domain.c +++ b/drivers/base/power/domain.c | |||
@@ -1171,6 +1171,38 @@ int __pm_genpd_add_device(struct generic_pm_domain *genpd, struct device *dev, | |||
1171 | } | 1171 | } |
1172 | 1172 | ||
1173 | /** | 1173 | /** |
1174 | * __pm_genpd_of_add_device - Add a device to an I/O PM domain. | ||
1175 | * @genpd_node: Device tree node pointer representing a PM domain to which the | ||
1176 | * the device is added to. | ||
1177 | * @dev: Device to be added. | ||
1178 | * @td: Set of PM QoS timing parameters to attach to the device. | ||
1179 | */ | ||
1180 | int __pm_genpd_of_add_device(struct device_node *genpd_node, struct device *dev, | ||
1181 | struct gpd_timing_data *td) | ||
1182 | { | ||
1183 | struct generic_pm_domain *genpd = NULL, *gpd; | ||
1184 | |||
1185 | dev_dbg(dev, "%s()\n", __func__); | ||
1186 | |||
1187 | if (IS_ERR_OR_NULL(genpd_node) || IS_ERR_OR_NULL(dev)) | ||
1188 | return -EINVAL; | ||
1189 | |||
1190 | mutex_lock(&gpd_list_lock); | ||
1191 | list_for_each_entry(gpd, &gpd_list, gpd_list_node) { | ||
1192 | if (gpd->of_node == genpd_node) { | ||
1193 | genpd = gpd; | ||
1194 | break; | ||
1195 | } | ||
1196 | } | ||
1197 | mutex_unlock(&gpd_list_lock); | ||
1198 | |||
1199 | if (!genpd) | ||
1200 | return -EINVAL; | ||
1201 | |||
1202 | return __pm_genpd_add_device(genpd, dev, td); | ||
1203 | } | ||
1204 | |||
1205 | /** | ||
1174 | * pm_genpd_remove_device - Remove a device from an I/O PM domain. | 1206 | * pm_genpd_remove_device - Remove a device from an I/O PM domain. |
1175 | * @genpd: PM domain to remove the device from. | 1207 | * @genpd: PM domain to remove the device from. |
1176 | * @dev: Device to be removed. | 1208 | * @dev: Device to be removed. |