Loading drivers/base/power/clock_ops.c +53 −32 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ #include <linux/pm.h> #include <linux/pm_clock.h> #include <linux/clk.h> #include <linux/clkdev.h> #include <linux/slab.h> #include <linux/err.h> Loading @@ -34,14 +35,20 @@ struct pm_clock_entry { /** * pm_clk_enable - Enable a clock, reporting any errors * @dev: The device for the given clock * @clk: The clock being enabled. * @ce: PM clock entry corresponding to the clock. */ static inline int __pm_clk_enable(struct device *dev, struct clk *clk) static inline int __pm_clk_enable(struct device *dev, struct pm_clock_entry *ce) { int ret = clk_enable(clk); if (ret) int ret; if (ce->status < PCE_STATUS_ERROR) { ret = clk_enable(ce->clk); if (!ret) ce->status = PCE_STATUS_ENABLED; else dev_err(dev, "%s: failed to enable clk %p, error %d\n", __func__, clk, ret); __func__, ce->clk, ret); } return ret; } Loading @@ -53,6 +60,7 @@ static inline int __pm_clk_enable(struct device *dev, struct clk *clk) */ static void pm_clk_acquire(struct device *dev, struct pm_clock_entry *ce) { if (!ce->clk) ce->clk = clk_get(dev, ce->con_id); if (IS_ERR(ce->clk)) { ce->status = PCE_STATUS_ERROR; Loading @@ -63,15 +71,8 @@ static void pm_clk_acquire(struct device *dev, struct pm_clock_entry *ce) } } /** * pm_clk_add - Start using a device clock for power management. * @dev: Device whose clock is going to be used for power management. * @con_id: Connection ID of the clock. * * Add the clock represented by @con_id to the list of clocks used for * the power management of @dev. */ int pm_clk_add(struct device *dev, const char *con_id) static int __pm_clk_add(struct device *dev, const char *con_id, struct clk *clk) { struct pm_subsys_data *psd = dev_to_psd(dev); struct pm_clock_entry *ce; Loading @@ -93,6 +94,12 @@ int pm_clk_add(struct device *dev, const char *con_id) kfree(ce); return -ENOMEM; } } else { if (IS_ERR(ce->clk) || !__clk_get(clk)) { kfree(ce); return -ENOENT; } ce->clk = clk; } pm_clk_acquire(dev, ce); Loading @@ -103,6 +110,32 @@ int pm_clk_add(struct device *dev, const char *con_id) return 0; } /** * pm_clk_add - Start using a device clock for power management. * @dev: Device whose clock is going to be used for power management. * @con_id: Connection ID of the clock. * * Add the clock represented by @con_id to the list of clocks used for * the power management of @dev. */ int pm_clk_add(struct device *dev, const char *con_id) { return __pm_clk_add(dev, con_id, NULL); } /** * pm_clk_add_clk - Start using a device clock for power management. * @dev: Device whose clock is going to be used for power management. * @clk: Clock pointer * * Add the clock to the list of clocks used for the power management of @dev. * It will increment refcount on clock pointer, use clk_put() on it when done. */ int pm_clk_add_clk(struct device *dev, struct clk *clk) { return __pm_clk_add(dev, NULL, clk); } /** * __pm_clk_remove - Destroy PM clock entry. * @ce: PM clock entry to destroy. Loading Loading @@ -266,7 +299,6 @@ int pm_clk_resume(struct device *dev) struct pm_subsys_data *psd = dev_to_psd(dev); struct pm_clock_entry *ce; unsigned long flags; int ret; dev_dbg(dev, "%s()\n", __func__); Loading @@ -275,13 +307,8 @@ int pm_clk_resume(struct device *dev) spin_lock_irqsave(&psd->lock, flags); list_for_each_entry(ce, &psd->clock_list, node) { if (ce->status < PCE_STATUS_ERROR) { ret = __pm_clk_enable(dev, ce->clk); if (!ret) ce->status = PCE_STATUS_ENABLED; } } list_for_each_entry(ce, &psd->clock_list, node) __pm_clk_enable(dev, ce); spin_unlock_irqrestore(&psd->lock, flags); Loading Loading @@ -390,7 +417,6 @@ int pm_clk_resume(struct device *dev) struct pm_subsys_data *psd = dev_to_psd(dev); struct pm_clock_entry *ce; unsigned long flags; int ret; dev_dbg(dev, "%s()\n", __func__); Loading @@ -400,13 +426,8 @@ int pm_clk_resume(struct device *dev) spin_lock_irqsave(&psd->lock, flags); list_for_each_entry(ce, &psd->clock_list, node) { if (ce->status < PCE_STATUS_ERROR) { ret = __pm_clk_enable(dev, ce->clk); if (!ret) ce->status = PCE_STATUS_ENABLED; } } list_for_each_entry(ce, &psd->clock_list, node) __pm_clk_enable(dev, ce); spin_unlock_irqrestore(&psd->lock, flags); Loading include/linux/pm_clock.h +8 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ struct pm_clk_notifier_block { char *con_ids[]; }; struct clk; #ifdef CONFIG_PM_CLK static inline bool pm_clk_no_clocks(struct device *dev) { Loading @@ -29,6 +31,7 @@ extern void pm_clk_init(struct device *dev); extern int pm_clk_create(struct device *dev); extern void pm_clk_destroy(struct device *dev); extern int pm_clk_add(struct device *dev, const char *con_id); extern int pm_clk_add_clk(struct device *dev, struct clk *clk); extern void pm_clk_remove(struct device *dev, const char *con_id); extern int pm_clk_suspend(struct device *dev); extern int pm_clk_resume(struct device *dev); Loading @@ -51,6 +54,11 @@ static inline int pm_clk_add(struct device *dev, const char *con_id) { return -EINVAL; } static inline int pm_clk_add_clk(struct device *dev, struct clk *clk) { return -EINVAL; } static inline void pm_clk_remove(struct device *dev, const char *con_id) { } Loading Loading
drivers/base/power/clock_ops.c +53 −32 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ #include <linux/pm.h> #include <linux/pm_clock.h> #include <linux/clk.h> #include <linux/clkdev.h> #include <linux/slab.h> #include <linux/err.h> Loading @@ -34,14 +35,20 @@ struct pm_clock_entry { /** * pm_clk_enable - Enable a clock, reporting any errors * @dev: The device for the given clock * @clk: The clock being enabled. * @ce: PM clock entry corresponding to the clock. */ static inline int __pm_clk_enable(struct device *dev, struct clk *clk) static inline int __pm_clk_enable(struct device *dev, struct pm_clock_entry *ce) { int ret = clk_enable(clk); if (ret) int ret; if (ce->status < PCE_STATUS_ERROR) { ret = clk_enable(ce->clk); if (!ret) ce->status = PCE_STATUS_ENABLED; else dev_err(dev, "%s: failed to enable clk %p, error %d\n", __func__, clk, ret); __func__, ce->clk, ret); } return ret; } Loading @@ -53,6 +60,7 @@ static inline int __pm_clk_enable(struct device *dev, struct clk *clk) */ static void pm_clk_acquire(struct device *dev, struct pm_clock_entry *ce) { if (!ce->clk) ce->clk = clk_get(dev, ce->con_id); if (IS_ERR(ce->clk)) { ce->status = PCE_STATUS_ERROR; Loading @@ -63,15 +71,8 @@ static void pm_clk_acquire(struct device *dev, struct pm_clock_entry *ce) } } /** * pm_clk_add - Start using a device clock for power management. * @dev: Device whose clock is going to be used for power management. * @con_id: Connection ID of the clock. * * Add the clock represented by @con_id to the list of clocks used for * the power management of @dev. */ int pm_clk_add(struct device *dev, const char *con_id) static int __pm_clk_add(struct device *dev, const char *con_id, struct clk *clk) { struct pm_subsys_data *psd = dev_to_psd(dev); struct pm_clock_entry *ce; Loading @@ -93,6 +94,12 @@ int pm_clk_add(struct device *dev, const char *con_id) kfree(ce); return -ENOMEM; } } else { if (IS_ERR(ce->clk) || !__clk_get(clk)) { kfree(ce); return -ENOENT; } ce->clk = clk; } pm_clk_acquire(dev, ce); Loading @@ -103,6 +110,32 @@ int pm_clk_add(struct device *dev, const char *con_id) return 0; } /** * pm_clk_add - Start using a device clock for power management. * @dev: Device whose clock is going to be used for power management. * @con_id: Connection ID of the clock. * * Add the clock represented by @con_id to the list of clocks used for * the power management of @dev. */ int pm_clk_add(struct device *dev, const char *con_id) { return __pm_clk_add(dev, con_id, NULL); } /** * pm_clk_add_clk - Start using a device clock for power management. * @dev: Device whose clock is going to be used for power management. * @clk: Clock pointer * * Add the clock to the list of clocks used for the power management of @dev. * It will increment refcount on clock pointer, use clk_put() on it when done. */ int pm_clk_add_clk(struct device *dev, struct clk *clk) { return __pm_clk_add(dev, NULL, clk); } /** * __pm_clk_remove - Destroy PM clock entry. * @ce: PM clock entry to destroy. Loading Loading @@ -266,7 +299,6 @@ int pm_clk_resume(struct device *dev) struct pm_subsys_data *psd = dev_to_psd(dev); struct pm_clock_entry *ce; unsigned long flags; int ret; dev_dbg(dev, "%s()\n", __func__); Loading @@ -275,13 +307,8 @@ int pm_clk_resume(struct device *dev) spin_lock_irqsave(&psd->lock, flags); list_for_each_entry(ce, &psd->clock_list, node) { if (ce->status < PCE_STATUS_ERROR) { ret = __pm_clk_enable(dev, ce->clk); if (!ret) ce->status = PCE_STATUS_ENABLED; } } list_for_each_entry(ce, &psd->clock_list, node) __pm_clk_enable(dev, ce); spin_unlock_irqrestore(&psd->lock, flags); Loading Loading @@ -390,7 +417,6 @@ int pm_clk_resume(struct device *dev) struct pm_subsys_data *psd = dev_to_psd(dev); struct pm_clock_entry *ce; unsigned long flags; int ret; dev_dbg(dev, "%s()\n", __func__); Loading @@ -400,13 +426,8 @@ int pm_clk_resume(struct device *dev) spin_lock_irqsave(&psd->lock, flags); list_for_each_entry(ce, &psd->clock_list, node) { if (ce->status < PCE_STATUS_ERROR) { ret = __pm_clk_enable(dev, ce->clk); if (!ret) ce->status = PCE_STATUS_ENABLED; } } list_for_each_entry(ce, &psd->clock_list, node) __pm_clk_enable(dev, ce); spin_unlock_irqrestore(&psd->lock, flags); Loading
include/linux/pm_clock.h +8 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ struct pm_clk_notifier_block { char *con_ids[]; }; struct clk; #ifdef CONFIG_PM_CLK static inline bool pm_clk_no_clocks(struct device *dev) { Loading @@ -29,6 +31,7 @@ extern void pm_clk_init(struct device *dev); extern int pm_clk_create(struct device *dev); extern void pm_clk_destroy(struct device *dev); extern int pm_clk_add(struct device *dev, const char *con_id); extern int pm_clk_add_clk(struct device *dev, struct clk *clk); extern void pm_clk_remove(struct device *dev, const char *con_id); extern int pm_clk_suspend(struct device *dev); extern int pm_clk_resume(struct device *dev); Loading @@ -51,6 +54,11 @@ static inline int pm_clk_add(struct device *dev, const char *con_id) { return -EINVAL; } static inline int pm_clk_add_clk(struct device *dev, struct clk *clk) { return -EINVAL; } static inline void pm_clk_remove(struct device *dev, const char *con_id) { } Loading