> -----Original Message----- > From: Lukasz Majewski [mailto:lu...@denx.de] > Sent: 2019年5月17日 6:11 > To: Stefano Babic <sba...@denx.de>; Fabio Estevam <feste...@gmail.com>; > Marek Vasut <ma...@denx.de>; Simon Glass <s...@chromium.org>; Tom Rini > <tr...@konsulko.com>; u-boot@lists.denx.de; Jagan Teki > <ja...@amarulasolutions.com>; Peng Fan <peng....@nxp.com>; Marcel > Ziswiler <marcel.ziswi...@toradex.com>; Adam Ford <aford...@gmail.com> > Cc: Lukasz Majewski <lu...@denx.de>; Neil Armstrong > <narmstr...@baylibre.com>; Philipp Tomsich > <philipp.toms...@theobroma-systems.com>; Andreas Dannenberg > <dannenb...@ti.com>; Fabrice Gasnier <fabrice.gasn...@st.com>; Liviu > Dudau <liviu.du...@foss.arm.com> > Subject: [PATCH v4 07/13] 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->driver_data field is read. > > Signed-off-by: Lukasz Majewski <lu...@denx.de> > > --- > > Changes in v4: None > Changes in v3: > - New patch > > drivers/clk/clk-uclass.c | 15 +++++++++++++++ > include/clk.h | 9 +++++++++ > 2 files changed, 24 insertions(+) > > diff --git a/drivers/clk/clk-uclass.c b/drivers/clk/clk-uclass.c index > 79b3b0494c..1a726dafaa 100644 > --- a/drivers/clk/clk-uclass.c > +++ b/drivers/clk/clk-uclass.c > @@ -379,6 +379,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 = (struct clk *)dev_get_driver_data(pdev);
This has a trick is that force driver_data to struct clk *, and this requires all clk wrappers needs take clk as the first element in the wrapper structure. So better add a comment here. Then it is fine to me, and Reviewed-by: Peng Fan <peng....@nxp.com> > + 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); diff --git > a/include/clk.h b/include/clk.h index 89dc64bfaf..0873b1e507 100644 > --- a/include/clk.h > +++ b/include/clk.h > @@ -259,6 +259,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. > * > * @clk: A clock struct that was previously successfully requested by > -- > 2.11.0 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot