diff options
author | Tom Rini <trini@konsulko.com> | 2019-10-30 20:13:46 +0300 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2019-10-30 20:13:46 +0300 |
commit | 412326d1bc2d346d7b4faad6fa547eaf065681a2 (patch) | |
tree | f321db73de4b43f8bf56d6998d3053a8b48b1e1c /include | |
parent | 1a81cf8ab735dfb0947dce497cf1503f59066c22 (diff) | |
parent | 9a52be129c5b159269ac69a7ae0197eb02612f1d (diff) | |
download | u-boot-412326d1bc2d346d7b4faad6fa547eaf065681a2.tar.xz |
Merge tag 'u-boot-clk-23Oct2019' of https://gitlab.denx.de/u-boot/custodians/u-boot-clk
- Add I2C clocks for i.MX6Q CCF driver
- Fix check in clk_set_default_parents()
- Managed API to get clock from device tree
- Fixes for core clock code (including sandbox regression tests)
Diffstat (limited to 'include')
-rw-r--r-- | include/clk.h | 56 |
1 files changed, 53 insertions, 3 deletions
diff --git a/include/clk.h b/include/clk.h index 18b2e3ca54..a5ee53d94a 100644 --- a/include/clk.h +++ b/include/clk.h @@ -155,6 +155,37 @@ int clk_get_bulk(struct udevice *dev, struct clk_bulk *bulk); int clk_get_by_name(struct udevice *dev, const char *name, struct clk *clk); /** + * devm_clk_get - lookup and obtain a managed reference to a clock producer. + * @dev: device for clock "consumer" + * @id: clock consumer ID + * + * Returns a struct clk corresponding to the clock producer, or + * valid IS_ERR() condition containing errno. The implementation + * uses @dev and @id to determine the clock consumer, and thereby + * the clock producer. (IOW, @id may be identical strings, but + * clk_get may return different clock producers depending on @dev.) + * + * Drivers must assume that the clock source is not enabled. + * + * devm_clk_get should not be called from within interrupt context. + * + * The clock will automatically be freed when the device is unbound + * from the bus. + */ +struct clk *devm_clk_get(struct udevice *dev, const char *id); + +/** + * devm_clk_get_optional - lookup and obtain a managed reference to an optional + * clock producer. + * @dev: device for clock "consumer" + * @id: clock consumer ID + * + * Behaves the same as devm_clk_get() except where there is no clock producer. + * In this case, instead of returning -ENOENT, the function returns NULL. + */ +struct clk *devm_clk_get_optional(struct udevice *dev, const char *id); + +/** * clk_release_all() - Disable (turn off)/Free an array of previously * requested clocks. * @@ -168,6 +199,19 @@ int clk_get_by_name(struct udevice *dev, const char *name, struct clk *clk); */ int clk_release_all(struct clk *clk, int count); +/** + * devm_clk_put - "free" a managed clock source + * @dev: device used to acquire the clock + * @clk: clock source acquired with devm_clk_get() + * + * Note: drivers must ensure that all clk_enable calls made on this + * clock source are balanced by clk_disable calls prior to calling + * this function. + * + * clk_put should not be called from within interrupt context. + */ +void devm_clk_put(struct udevice *dev, struct clk *clk); + #else static inline int clk_get_by_index(struct udevice *dev, int index, struct clk *clk) @@ -200,10 +244,13 @@ static inline int clk_release_all(struct clk *clk, int count) * * @dev: A device to process (the ofnode associated with this device * will be processed). + * @stage: A integer. 0 indicates that this is called before the device + * is probed. 1 indicates that this is called just after the + * device has been probed */ -int clk_set_defaults(struct udevice *dev); +int clk_set_defaults(struct udevice *dev, int stage); #else -static inline int clk_set_defaults(struct udevice *dev) +static inline int clk_set_defaults(struct udevice *dev, int stage) { return 0; } @@ -356,7 +403,7 @@ int soc_clk_dump(void); */ static inline bool clk_valid(struct clk *clk) { - return !!clk->dev; + return clk && !!clk->dev; } /** @@ -379,3 +426,6 @@ int clk_get_by_id(ulong id, struct clk **clkp); */ bool clk_dev_binded(struct clk *clk); #endif + +#define clk_prepare_enable(clk) clk_enable(clk) +#define clk_disable_unprepare(clk) clk_disable(clk) |