diff mbox series

[U-Boot,v3,07/11] dm: clk: Define clk_get_parent_rate() for clk operations

Message ID 20190425102953.5348-8-lukma@denx.de
State Changes Requested
Delegated to: Tom Rini
Headers show
Series clk: Port Linux common clock framework [CCF] to U-boot (tag: 5.0-rc3) | expand

Commit Message

Lukasz Majewski April 25, 2019, 10:29 a.m. UTC
This commit adds the clk_get_parent_rate() function, which is responsible
for getting the rate of parent clock.
Unfortunately, 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 alleviate this problem - the clk_get_parent_rate() function has been
introduced to clk-uclass.c.

Signed-off-by: Lukasz Majewski <lukma@denx.de>

---

Changes in v3:
- The rate information is now cached into struct clk field
- The clk_get_parent() is used to get pointer to the parent struct clk

 drivers/clk/clk-uclass.c | 22 ++++++++++++++++++++++
 include/clk.h            |  9 +++++++++
 2 files changed, 31 insertions(+)

Comments

Peng Fan April 26, 2019, 2:36 a.m. UTC | #1
> Subject: [PATCH v3 07/11] dm: clk: Define clk_get_parent_rate() for clk
> operations
> 
> This commit adds the clk_get_parent_rate() function, which is responsible for
> getting the rate of parent clock.
> Unfortunately, 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 alleviate this problem - the clk_get_parent_rate() function has been
> introduced to clk-uclass.c.
> 
> Signed-off-by: Lukasz Majewski <lukma@denx.de>
> 
> ---
> 
> Changes in v3:
> - The rate information is now cached into struct clk field
> - The clk_get_parent() is used to get pointer to the parent struct clk
> 
>  drivers/clk/clk-uclass.c | 22 ++++++++++++++++++++++
>  include/clk.h            |  9 +++++++++
>  2 files changed, 31 insertions(+)
> 
> diff --git a/drivers/clk/clk-uclass.c b/drivers/clk/clk-uclass.c index
> 7ebe4e79fe..da6624d4f2 100644
> --- a/drivers/clk/clk-uclass.c
> +++ b/drivers/clk/clk-uclass.c
> @@ -355,6 +355,28 @@ struct clk *clk_get_parent(struct clk *clk)
>  	return pclk;
>  }
> 
> +ulong clk_get_parent_rate(struct clk *clk) {
> +	const struct clk_ops *ops;
> +	struct clk *pclk;
> +
> +	debug("%s(clk=%p)\n", __func__, clk);
> +
> +	pclk = clk_get_parent(clk);
> +	if (IS_ERR(pclk))
> +		return -ENODEV;
> +
> +	ops = clk_dev_ops(pclk->dev);
> +	if (!ops->get_rate)
> +		return -ENOSYS;
> +
> +	/* Read the 'rate' if not already set */
> +	if (!pclk->rate)
> +		pclk->rate = clk_get_rate(pclk);

Suggest a flag NOCACHE like Linux,
in clk_get_rate, check the flag, if not set,
just read the cached value.

How do you think?

Regards,
Peng.

> +
> +	return pclk->rate;
> +}
> +
>  ulong clk_set_rate(struct clk *clk, ulong rate)  {
>  	const struct clk_ops *ops = clk_dev_ops(clk->dev); diff --git
> a/include/clk.h b/include/clk.h index b44ee3b158..98c3e12fb4 100644
> --- a/include/clk.h
> +++ b/include/clk.h
> @@ -249,6 +249,15 @@ ulong clk_get_rate(struct clk *clk);  struct clk
> *clk_get_parent(struct clk *clk);
> 
>  /**
> + * clk_get_parent_rate() - Get parent of current clock rate.
> + *
> + * @clk:	A clock struct that was previously successfully requested by
> + *		clk_request/get_by_*().
> + * @return clock rate in Hz, or -ve error code.
> + */
> +ulong clk_get_parent_rate(struct clk *clk);
> +
> +/**
>   * clk_set_rate() - Set current clock rate.
>   *
>   * @clk:	A clock struct that was previously successfully requested by
> --
> 2.11.0
Lukasz Majewski April 26, 2019, 6:04 a.m. UTC | #2
Hi Peng,

Thank you for your feedback.

> > Subject: [PATCH v3 07/11] dm: clk: Define clk_get_parent_rate() for
> > clk operations
> > 
> > This commit adds the clk_get_parent_rate() function, which is
> > responsible for getting the rate of parent clock.
> > Unfortunately, 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 alleviate this problem - the clk_get_parent_rate() function has
> > been introduced to clk-uclass.c.
> > 
> > Signed-off-by: Lukasz Majewski <lukma@denx.de>
> > 
> > ---
> > 
> > Changes in v3:
> > - The rate information is now cached into struct clk field
> > - The clk_get_parent() is used to get pointer to the parent struct
> > clk
> > 
> >  drivers/clk/clk-uclass.c | 22 ++++++++++++++++++++++
> >  include/clk.h            |  9 +++++++++
> >  2 files changed, 31 insertions(+)
> > 
> > diff --git a/drivers/clk/clk-uclass.c b/drivers/clk/clk-uclass.c
> > index 7ebe4e79fe..da6624d4f2 100644
> > --- a/drivers/clk/clk-uclass.c
> > +++ b/drivers/clk/clk-uclass.c
> > @@ -355,6 +355,28 @@ struct clk *clk_get_parent(struct clk *clk)
> >  	return pclk;
> >  }
> > 
> > +ulong clk_get_parent_rate(struct clk *clk) {
> > +	const struct clk_ops *ops;
> > +	struct clk *pclk;
> > +
> > +	debug("%s(clk=%p)\n", __func__, clk);
> > +
> > +	pclk = clk_get_parent(clk);
> > +	if (IS_ERR(pclk))
> > +		return -ENODEV;
> > +
> > +	ops = clk_dev_ops(pclk->dev);
> > +	if (!ops->get_rate)
> > +		return -ENOSYS;
> > +
> > +	/* Read the 'rate' if not already set */
> > +	if (!pclk->rate)
> > +		pclk->rate = clk_get_rate(pclk);  
> 
> Suggest a flag NOCACHE like Linux,
> in clk_get_rate, check the flag, if not set,
> just read the cached value.
> 
> How do you think?

No problem from my side. I will wait a few more days for more feedback
nad prepare next version of CCF port.

Please also look on the design decision described in the cover letter:
http://patchwork.ozlabs.org/cover/1090669/

(There is also link to github repo with those patches).
Maybe you would have other idea for solving mentioned problems?



I would also like to make the CCF code as much IMX SoC agnostic as
possible - in other words - make it working on iMX6Q and iMX8 from
the outset (so I would know that other SoCs would be easily added).

> 
> Regards,
> Peng.
> 
> > +
> > +	return pclk->rate;
> > +}
> > +
> >  ulong clk_set_rate(struct clk *clk, ulong rate)  {
> >  	const struct clk_ops *ops = clk_dev_ops(clk->dev); diff
> > --git a/include/clk.h b/include/clk.h index b44ee3b158..98c3e12fb4
> > 100644 --- a/include/clk.h
> > +++ b/include/clk.h
> > @@ -249,6 +249,15 @@ ulong clk_get_rate(struct clk *clk);  struct
> > clk *clk_get_parent(struct clk *clk);
> > 
> >  /**
> > + * clk_get_parent_rate() - Get parent of current clock rate.
> > + *
> > + * @clk:	A clock struct that was previously successfully
> > requested by
> > + *		clk_request/get_by_*().
> > + * @return clock rate in Hz, or -ve error code.
> > + */
> > +ulong clk_get_parent_rate(struct clk *clk);
> > +
> > +/**
> >   * clk_set_rate() - Set current clock rate.
> >   *
> >   * @clk:	A clock struct that was previously successfully
> > requested by --
> > 2.11.0  
> 




Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
diff mbox series

Patch

diff --git a/drivers/clk/clk-uclass.c b/drivers/clk/clk-uclass.c
index 7ebe4e79fe..da6624d4f2 100644
--- a/drivers/clk/clk-uclass.c
+++ b/drivers/clk/clk-uclass.c
@@ -355,6 +355,28 @@  struct clk *clk_get_parent(struct clk *clk)
 	return pclk;
 }
 
+ulong clk_get_parent_rate(struct clk *clk)
+{
+	const struct clk_ops *ops;
+	struct clk *pclk;
+
+	debug("%s(clk=%p)\n", __func__, clk);
+
+	pclk = clk_get_parent(clk);
+	if (IS_ERR(pclk))
+		return -ENODEV;
+
+	ops = clk_dev_ops(pclk->dev);
+	if (!ops->get_rate)
+		return -ENOSYS;
+
+	/* Read the 'rate' if not already set */
+	if (!pclk->rate)
+		pclk->rate = clk_get_rate(pclk);
+
+	return pclk->rate;
+}
+
 ulong clk_set_rate(struct clk *clk, ulong rate)
 {
 	const struct clk_ops *ops = clk_dev_ops(clk->dev);
diff --git a/include/clk.h b/include/clk.h
index b44ee3b158..98c3e12fb4 100644
--- a/include/clk.h
+++ b/include/clk.h
@@ -249,6 +249,15 @@  ulong clk_get_rate(struct clk *clk);
 struct clk *clk_get_parent(struct clk *clk);
 
 /**
+ * clk_get_parent_rate() - Get parent of current clock rate.
+ *
+ * @clk:	A clock struct that was previously successfully requested by
+ *		clk_request/get_by_*().
+ * @return clock rate in Hz, or -ve error code.
+ */
+ulong clk_get_parent_rate(struct clk *clk);
+
+/**
  * clk_set_rate() - Set current clock rate.
  *
  * @clk:	A clock struct that was previously successfully requested by