dm: clk: Define clk_get_parent() for clk operations

This commit adds the clk_get_parent() function, which is responsible
for getting the parent's struct clock pointer.

U-Boot's DM support for getting parent is different (the parent
relationship is in udevice) than the one in Common Clock Framework [CCF]
in Linux. To obtain the pointer to struct clk of parent the
pdev->uclass_priv field is read via dev_get_clk_ptr() wrapper.

Signed-off-by: Lukasz Majewski <lukma@denx.de>
Reviewed-by: Peng Fan <peng.fan@nxp.com>
This commit is contained in:
Lukasz Majewski 2019-06-24 15:50:42 +02:00 committed by Stefano Babic
parent 004c122941
commit 0c660c2b32
2 changed files with 25 additions and 0 deletions

View File

@ -13,6 +13,7 @@
#include <dm/read.h>
#include <dt-structs.h>
#include <errno.h>
#include <linux/clk-provider.h>
static inline const struct clk_ops *clk_dev_ops(struct udevice *dev)
{
@ -379,6 +380,21 @@ ulong clk_get_rate(struct clk *clk)
return ops->get_rate(clk);
}
struct clk *clk_get_parent(struct clk *clk)
{
struct udevice *pdev;
struct clk *pclk;
debug("%s(clk=%p)\n", __func__, clk);
pdev = dev_get_parent(clk->dev);
pclk = dev_get_clk_ptr(pdev);
if (!pclk)
return ERR_PTR(-ENODEV);
return pclk;
}
ulong clk_set_rate(struct clk *clk, ulong rate)
{
const struct clk_ops *ops = clk_dev_ops(clk->dev);

View File

@ -258,6 +258,15 @@ int clk_free(struct clk *clk);
*/
ulong clk_get_rate(struct clk *clk);
/**
* clk_get_parent() - Get current clock's parent.
*
* @clk: A clock struct that was previously successfully requested by
* clk_request/get_by_*().
* @return pointer to parent's struct clk, or error code passed as pointer
*/
struct clk *clk_get_parent(struct clk *clk);
/**
* clk_set_rate() - Set current clock rate.
*