Re: [RFC PATCH 2/3] clk: add managed version of clk_bulk_get
On Fri, Apr 21, 2017 at 07:58:37PM -0700, Stephen Boyd wrote: > On 04/13, Dong Aisheng wrote: > > On Wed, Apr 12, 2017 at 12:03:28PM +0800, Dong Aisheng wrote: > > > >drivers/built-in.o: In function `devm_clk_bulk_get': > > >> (.text+0x1930e): undefined reference to `clk_bulk_get' > >drivers/built-in.o: In function `devm_clk_bulk_release': > > >> clk-devres.c:(.text+0x19370): undefined reference to `clk_bulk_put' > > > > clk_bulk_get is defined in clkdev.c which depends on CONFIG_CLKDEV_LOOKUP. > > However, some platforms like m68k may not select CLKDEV_LOOKUP but > > select HAVE_CLK. Thus compiling devm_clk_bulk_get may cause a undefined > > reference to 'clk_bulk_get'. > > > > Since clk_bulk_get is built upon the platform specific clk_get api, > > clk_bulk_get can also be used by that platform accordingly. > > > > Then we probably could move clk_bulk_get into clk-devres.c as well which > > is controlled by common CONFIG_HAVE_CLK to benifit all platforms. > > clk-devres is for devm* things. I'd just make another file for > now, clk-bulk.c or something like that. When everyone moves to > common clk, we can fold it into clk.c, or not because clk.c is > rather large right now. > Thanks for the suggestion. Much agree with you that getting a new file to handle them is better. Will do them in clk-bulk.c first. Regards Dong Aisheng > -- > Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, > a Linux Foundation Collaborative Project
Re: [RFC PATCH 2/3] clk: add managed version of clk_bulk_get
On Fri, Apr 21, 2017 at 07:58:37PM -0700, Stephen Boyd wrote: > On 04/13, Dong Aisheng wrote: > > On Wed, Apr 12, 2017 at 12:03:28PM +0800, Dong Aisheng wrote: > > > >drivers/built-in.o: In function `devm_clk_bulk_get': > > >> (.text+0x1930e): undefined reference to `clk_bulk_get' > >drivers/built-in.o: In function `devm_clk_bulk_release': > > >> clk-devres.c:(.text+0x19370): undefined reference to `clk_bulk_put' > > > > clk_bulk_get is defined in clkdev.c which depends on CONFIG_CLKDEV_LOOKUP. > > However, some platforms like m68k may not select CLKDEV_LOOKUP but > > select HAVE_CLK. Thus compiling devm_clk_bulk_get may cause a undefined > > reference to 'clk_bulk_get'. > > > > Since clk_bulk_get is built upon the platform specific clk_get api, > > clk_bulk_get can also be used by that platform accordingly. > > > > Then we probably could move clk_bulk_get into clk-devres.c as well which > > is controlled by common CONFIG_HAVE_CLK to benifit all platforms. > > clk-devres is for devm* things. I'd just make another file for > now, clk-bulk.c or something like that. When everyone moves to > common clk, we can fold it into clk.c, or not because clk.c is > rather large right now. > Thanks for the suggestion. Much agree with you that getting a new file to handle them is better. Will do them in clk-bulk.c first. Regards Dong Aisheng > -- > Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, > a Linux Foundation Collaborative Project
Re: [RFC PATCH 2/3] clk: add managed version of clk_bulk_get
On Fri, Apr 21, 2017 at 07:55:47PM -0700, Stephen Boyd wrote: > On 04/12, Dong Aisheng wrote: > > diff --git a/include/linux/clk.h b/include/linux/clk.h > > index 1d05b66..3fc6010 100644 > > --- a/include/linux/clk.h > > +++ b/include/linux/clk.h > > @@ -278,11 +278,25 @@ struct clk *clk_get(struct device *dev, const char > > *id); > > * > > * clk_bulk_get should not be called from within interrupt context. > > */ > > - > > Should be in previous patch? > Yes, will fix. > > int __must_check clk_bulk_get(struct device *dev, int num_clks, > > struct clk_bulk_data *clks); > > > > /** > > + * devm_clk_bulk_get - managed get multiple clk consumers > > + * @dev: device for clock "consumer" > > + * @num_clks: the number of clk_bulk_data > > + * @clks: the clk_bulk_data table of consumer > > + * > > + * Return 0 on success, an errno on failure. > > + * > > + * This helper function allows drivers to get several regulator > > s/regulator/clk/ > ditto > > + * consumers in one operation with management, the clks will > > + * automatically be freed when the device is unbound. > > + */ > > +int __must_check devm_clk_bulk_get(struct device *dev, int num_clks, > > Thanks for the __must_check. We need to add more __must_check to > clk APIs. > Yes, just easy to do it from the beginning. :-) Regards Dong Aisheng > > + struct clk_bulk_data *clks); > > + > > +/** > > -- > Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, > a Linux Foundation Collaborative Project > -- > To unsubscribe from this list: send the line "unsubscribe linux-clk" in > the body of a message to majord...@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [RFC PATCH 2/3] clk: add managed version of clk_bulk_get
On Fri, Apr 21, 2017 at 07:55:47PM -0700, Stephen Boyd wrote: > On 04/12, Dong Aisheng wrote: > > diff --git a/include/linux/clk.h b/include/linux/clk.h > > index 1d05b66..3fc6010 100644 > > --- a/include/linux/clk.h > > +++ b/include/linux/clk.h > > @@ -278,11 +278,25 @@ struct clk *clk_get(struct device *dev, const char > > *id); > > * > > * clk_bulk_get should not be called from within interrupt context. > > */ > > - > > Should be in previous patch? > Yes, will fix. > > int __must_check clk_bulk_get(struct device *dev, int num_clks, > > struct clk_bulk_data *clks); > > > > /** > > + * devm_clk_bulk_get - managed get multiple clk consumers > > + * @dev: device for clock "consumer" > > + * @num_clks: the number of clk_bulk_data > > + * @clks: the clk_bulk_data table of consumer > > + * > > + * Return 0 on success, an errno on failure. > > + * > > + * This helper function allows drivers to get several regulator > > s/regulator/clk/ > ditto > > + * consumers in one operation with management, the clks will > > + * automatically be freed when the device is unbound. > > + */ > > +int __must_check devm_clk_bulk_get(struct device *dev, int num_clks, > > Thanks for the __must_check. We need to add more __must_check to > clk APIs. > Yes, just easy to do it from the beginning. :-) Regards Dong Aisheng > > + struct clk_bulk_data *clks); > > + > > +/** > > -- > Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, > a Linux Foundation Collaborative Project > -- > To unsubscribe from this list: send the line "unsubscribe linux-clk" in > the body of a message to majord...@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [RFC PATCH 2/3] clk: add managed version of clk_bulk_get
On 04/13, Dong Aisheng wrote: > On Wed, Apr 12, 2017 at 12:03:28PM +0800, Dong Aisheng wrote: > >drivers/built-in.o: In function `devm_clk_bulk_get': > >> (.text+0x1930e): undefined reference to `clk_bulk_get' >drivers/built-in.o: In function `devm_clk_bulk_release': > >> clk-devres.c:(.text+0x19370): undefined reference to `clk_bulk_put' > > clk_bulk_get is defined in clkdev.c which depends on CONFIG_CLKDEV_LOOKUP. > However, some platforms like m68k may not select CLKDEV_LOOKUP but > select HAVE_CLK. Thus compiling devm_clk_bulk_get may cause a undefined > reference to 'clk_bulk_get'. > > Since clk_bulk_get is built upon the platform specific clk_get api, > clk_bulk_get can also be used by that platform accordingly. > > Then we probably could move clk_bulk_get into clk-devres.c as well which > is controlled by common CONFIG_HAVE_CLK to benifit all platforms. clk-devres is for devm* things. I'd just make another file for now, clk-bulk.c or something like that. When everyone moves to common clk, we can fold it into clk.c, or not because clk.c is rather large right now. -- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
Re: [RFC PATCH 2/3] clk: add managed version of clk_bulk_get
On 04/13, Dong Aisheng wrote: > On Wed, Apr 12, 2017 at 12:03:28PM +0800, Dong Aisheng wrote: > >drivers/built-in.o: In function `devm_clk_bulk_get': > >> (.text+0x1930e): undefined reference to `clk_bulk_get' >drivers/built-in.o: In function `devm_clk_bulk_release': > >> clk-devres.c:(.text+0x19370): undefined reference to `clk_bulk_put' > > clk_bulk_get is defined in clkdev.c which depends on CONFIG_CLKDEV_LOOKUP. > However, some platforms like m68k may not select CLKDEV_LOOKUP but > select HAVE_CLK. Thus compiling devm_clk_bulk_get may cause a undefined > reference to 'clk_bulk_get'. > > Since clk_bulk_get is built upon the platform specific clk_get api, > clk_bulk_get can also be used by that platform accordingly. > > Then we probably could move clk_bulk_get into clk-devres.c as well which > is controlled by common CONFIG_HAVE_CLK to benifit all platforms. clk-devres is for devm* things. I'd just make another file for now, clk-bulk.c or something like that. When everyone moves to common clk, we can fold it into clk.c, or not because clk.c is rather large right now. -- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
Re: [RFC PATCH 2/3] clk: add managed version of clk_bulk_get
On 04/12, Dong Aisheng wrote: > diff --git a/include/linux/clk.h b/include/linux/clk.h > index 1d05b66..3fc6010 100644 > --- a/include/linux/clk.h > +++ b/include/linux/clk.h > @@ -278,11 +278,25 @@ struct clk *clk_get(struct device *dev, const char *id); > * > * clk_bulk_get should not be called from within interrupt context. > */ > - Should be in previous patch? > int __must_check clk_bulk_get(struct device *dev, int num_clks, > struct clk_bulk_data *clks); > > /** > + * devm_clk_bulk_get - managed get multiple clk consumers > + * @dev: device for clock "consumer" > + * @num_clks: the number of clk_bulk_data > + * @clks: the clk_bulk_data table of consumer > + * > + * Return 0 on success, an errno on failure. > + * > + * This helper function allows drivers to get several regulator s/regulator/clk/ > + * consumers in one operation with management, the clks will > + * automatically be freed when the device is unbound. > + */ > +int __must_check devm_clk_bulk_get(struct device *dev, int num_clks, Thanks for the __must_check. We need to add more __must_check to clk APIs. > +struct clk_bulk_data *clks); > + > +/** -- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
Re: [RFC PATCH 2/3] clk: add managed version of clk_bulk_get
On 04/12, Dong Aisheng wrote: > diff --git a/include/linux/clk.h b/include/linux/clk.h > index 1d05b66..3fc6010 100644 > --- a/include/linux/clk.h > +++ b/include/linux/clk.h > @@ -278,11 +278,25 @@ struct clk *clk_get(struct device *dev, const char *id); > * > * clk_bulk_get should not be called from within interrupt context. > */ > - Should be in previous patch? > int __must_check clk_bulk_get(struct device *dev, int num_clks, > struct clk_bulk_data *clks); > > /** > + * devm_clk_bulk_get - managed get multiple clk consumers > + * @dev: device for clock "consumer" > + * @num_clks: the number of clk_bulk_data > + * @clks: the clk_bulk_data table of consumer > + * > + * Return 0 on success, an errno on failure. > + * > + * This helper function allows drivers to get several regulator s/regulator/clk/ > + * consumers in one operation with management, the clks will > + * automatically be freed when the device is unbound. > + */ > +int __must_check devm_clk_bulk_get(struct device *dev, int num_clks, Thanks for the __must_check. We need to add more __must_check to clk APIs. > +struct clk_bulk_data *clks); > + > +/** -- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
Re: [RFC PATCH 2/3] clk: add managed version of clk_bulk_get
On Wed, Apr 12, 2017 at 12:03:28PM +0800, Dong Aisheng wrote: > This patch introduces the managed version of clk_bulk_get. > > Cc: Michael Turquette> Cc: Stephen Boyd > Cc: "Rafael J. Wysocki" > Cc: Viresh Kumar > Cc: Mark Brown > Cc: Shawn Guo > Cc: Fabio Estevam > Cc: Sascha Hauer > Cc: Anson Huang > Cc: Robin Gong > Cc: Bai Ping > Cc: Leonard Crestez > Cc: Octavian Purdila > Signed-off-by: Dong Aisheng > --- > drivers/clk/clk-devres.c | 36 > include/linux/clk.h | 22 +- > 2 files changed, 57 insertions(+), 1 deletion(-) > > diff --git a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c > index 3a218c3..c7fb31d 100644 > --- a/drivers/clk/clk-devres.c > +++ b/drivers/clk/clk-devres.c > @@ -34,6 +34,42 @@ struct clk *devm_clk_get(struct device *dev, const char > *id) > } > EXPORT_SYMBOL(devm_clk_get); > > +struct clk_bulk_devres { > + struct clk_bulk_data *clks; > + int num_clks; > +}; > + > +static void devm_clk_bulk_release(struct device *dev, void *res) > +{ > + struct clk_bulk_devres *devres = res; > + > + clk_bulk_put(devres->num_clks, devres->clks); > +} > + > +int devm_clk_bulk_get(struct device *dev, int num_clks, > + struct clk_bulk_data *clks) > +{ > + struct clk_bulk_devres *devres; > + int ret; > + > + devres = devres_alloc(devm_clk_bulk_release, > + sizeof(*devres), GFP_KERNEL); > + if (!devres) > + return -ENOMEM; > + > + ret = clk_bulk_get(dev, num_clks, clks); Another catch by 0day robot. drivers/built-in.o: In function `devm_clk_bulk_get': >> (.text+0x1930e): undefined reference to `clk_bulk_get' drivers/built-in.o: In function `devm_clk_bulk_release': >> clk-devres.c:(.text+0x19370): undefined reference to `clk_bulk_put' clk_bulk_get is defined in clkdev.c which depends on CONFIG_CLKDEV_LOOKUP. However, some platforms like m68k may not select CLKDEV_LOOKUP but select HAVE_CLK. Thus compiling devm_clk_bulk_get may cause a undefined reference to 'clk_bulk_get'. Since clk_bulk_get is built upon the platform specific clk_get api, clk_bulk_get can also be used by that platform accordingly. Then we probably could move clk_bulk_get into clk-devres.c as well which is controlled by common CONFIG_HAVE_CLK to benifit all platforms. Regards Dong Aisheng
Re: [RFC PATCH 2/3] clk: add managed version of clk_bulk_get
On Wed, Apr 12, 2017 at 12:03:28PM +0800, Dong Aisheng wrote: > This patch introduces the managed version of clk_bulk_get. > > Cc: Michael Turquette > Cc: Stephen Boyd > Cc: "Rafael J. Wysocki" > Cc: Viresh Kumar > Cc: Mark Brown > Cc: Shawn Guo > Cc: Fabio Estevam > Cc: Sascha Hauer > Cc: Anson Huang > Cc: Robin Gong > Cc: Bai Ping > Cc: Leonard Crestez > Cc: Octavian Purdila > Signed-off-by: Dong Aisheng > --- > drivers/clk/clk-devres.c | 36 > include/linux/clk.h | 22 +- > 2 files changed, 57 insertions(+), 1 deletion(-) > > diff --git a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c > index 3a218c3..c7fb31d 100644 > --- a/drivers/clk/clk-devres.c > +++ b/drivers/clk/clk-devres.c > @@ -34,6 +34,42 @@ struct clk *devm_clk_get(struct device *dev, const char > *id) > } > EXPORT_SYMBOL(devm_clk_get); > > +struct clk_bulk_devres { > + struct clk_bulk_data *clks; > + int num_clks; > +}; > + > +static void devm_clk_bulk_release(struct device *dev, void *res) > +{ > + struct clk_bulk_devres *devres = res; > + > + clk_bulk_put(devres->num_clks, devres->clks); > +} > + > +int devm_clk_bulk_get(struct device *dev, int num_clks, > + struct clk_bulk_data *clks) > +{ > + struct clk_bulk_devres *devres; > + int ret; > + > + devres = devres_alloc(devm_clk_bulk_release, > + sizeof(*devres), GFP_KERNEL); > + if (!devres) > + return -ENOMEM; > + > + ret = clk_bulk_get(dev, num_clks, clks); Another catch by 0day robot. drivers/built-in.o: In function `devm_clk_bulk_get': >> (.text+0x1930e): undefined reference to `clk_bulk_get' drivers/built-in.o: In function `devm_clk_bulk_release': >> clk-devres.c:(.text+0x19370): undefined reference to `clk_bulk_put' clk_bulk_get is defined in clkdev.c which depends on CONFIG_CLKDEV_LOOKUP. However, some platforms like m68k may not select CLKDEV_LOOKUP but select HAVE_CLK. Thus compiling devm_clk_bulk_get may cause a undefined reference to 'clk_bulk_get'. Since clk_bulk_get is built upon the platform specific clk_get api, clk_bulk_get can also be used by that platform accordingly. Then we probably could move clk_bulk_get into clk-devres.c as well which is controlled by common CONFIG_HAVE_CLK to benifit all platforms. Regards Dong Aisheng
[RFC PATCH 2/3] clk: add managed version of clk_bulk_get
This patch introduces the managed version of clk_bulk_get. Cc: Michael TurquetteCc: Stephen Boyd Cc: "Rafael J. Wysocki" Cc: Viresh Kumar Cc: Mark Brown Cc: Shawn Guo Cc: Fabio Estevam Cc: Sascha Hauer Cc: Anson Huang Cc: Robin Gong Cc: Bai Ping Cc: Leonard Crestez Cc: Octavian Purdila Signed-off-by: Dong Aisheng --- drivers/clk/clk-devres.c | 36 include/linux/clk.h | 22 +- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c index 3a218c3..c7fb31d 100644 --- a/drivers/clk/clk-devres.c +++ b/drivers/clk/clk-devres.c @@ -34,6 +34,42 @@ struct clk *devm_clk_get(struct device *dev, const char *id) } EXPORT_SYMBOL(devm_clk_get); +struct clk_bulk_devres { + struct clk_bulk_data *clks; + int num_clks; +}; + +static void devm_clk_bulk_release(struct device *dev, void *res) +{ + struct clk_bulk_devres *devres = res; + + clk_bulk_put(devres->num_clks, devres->clks); +} + +int devm_clk_bulk_get(struct device *dev, int num_clks, + struct clk_bulk_data *clks) +{ + struct clk_bulk_devres *devres; + int ret; + + devres = devres_alloc(devm_clk_bulk_release, + sizeof(*devres), GFP_KERNEL); + if (!devres) + return -ENOMEM; + + ret = clk_bulk_get(dev, num_clks, clks); + if (!ret) { + devres->clks = clks; + devres->num_clks = num_clks; + devres_add(dev, devres); + } else { + devres_free(devres); + } + + return ret; +} +EXPORT_SYMBOL_GPL(devm_clk_bulk_get); + static int devm_clk_match(struct device *dev, void *res, void *data) { struct clk **c = res; diff --git a/include/linux/clk.h b/include/linux/clk.h index 1d05b66..3fc6010 100644 --- a/include/linux/clk.h +++ b/include/linux/clk.h @@ -278,11 +278,25 @@ struct clk *clk_get(struct device *dev, const char *id); * * clk_bulk_get should not be called from within interrupt context. */ - int __must_check clk_bulk_get(struct device *dev, int num_clks, struct clk_bulk_data *clks); /** + * devm_clk_bulk_get - managed get multiple clk consumers + * @dev: device for clock "consumer" + * @num_clks: the number of clk_bulk_data + * @clks: the clk_bulk_data table of consumer + * + * Return 0 on success, an errno on failure. + * + * This helper function allows drivers to get several regulator + * consumers in one operation with management, the clks will + * automatically be freed when the device is unbound. + */ +int __must_check devm_clk_bulk_get(struct device *dev, int num_clks, + struct clk_bulk_data *clks); + +/** * devm_clk_get - lookup and obtain a managed reference to a clock producer. * @dev: device for clock "consumer" * @id: clock consumer ID @@ -554,6 +568,12 @@ static inline struct clk *devm_clk_get(struct device *dev, const char *id) return NULL; } +static inline int devm_clk_bulk_get(struct device *dev, int num_clks, + struct clk_bulk_data *clks) +{ + return NULL; +} + static inline struct clk *devm_get_clk_from_child(struct device *dev, struct device_node *np, const char *con_id) { -- 2.7.4
[RFC PATCH 2/3] clk: add managed version of clk_bulk_get
This patch introduces the managed version of clk_bulk_get. Cc: Michael Turquette Cc: Stephen Boyd Cc: "Rafael J. Wysocki" Cc: Viresh Kumar Cc: Mark Brown Cc: Shawn Guo Cc: Fabio Estevam Cc: Sascha Hauer Cc: Anson Huang Cc: Robin Gong Cc: Bai Ping Cc: Leonard Crestez Cc: Octavian Purdila Signed-off-by: Dong Aisheng --- drivers/clk/clk-devres.c | 36 include/linux/clk.h | 22 +- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c index 3a218c3..c7fb31d 100644 --- a/drivers/clk/clk-devres.c +++ b/drivers/clk/clk-devres.c @@ -34,6 +34,42 @@ struct clk *devm_clk_get(struct device *dev, const char *id) } EXPORT_SYMBOL(devm_clk_get); +struct clk_bulk_devres { + struct clk_bulk_data *clks; + int num_clks; +}; + +static void devm_clk_bulk_release(struct device *dev, void *res) +{ + struct clk_bulk_devres *devres = res; + + clk_bulk_put(devres->num_clks, devres->clks); +} + +int devm_clk_bulk_get(struct device *dev, int num_clks, + struct clk_bulk_data *clks) +{ + struct clk_bulk_devres *devres; + int ret; + + devres = devres_alloc(devm_clk_bulk_release, + sizeof(*devres), GFP_KERNEL); + if (!devres) + return -ENOMEM; + + ret = clk_bulk_get(dev, num_clks, clks); + if (!ret) { + devres->clks = clks; + devres->num_clks = num_clks; + devres_add(dev, devres); + } else { + devres_free(devres); + } + + return ret; +} +EXPORT_SYMBOL_GPL(devm_clk_bulk_get); + static int devm_clk_match(struct device *dev, void *res, void *data) { struct clk **c = res; diff --git a/include/linux/clk.h b/include/linux/clk.h index 1d05b66..3fc6010 100644 --- a/include/linux/clk.h +++ b/include/linux/clk.h @@ -278,11 +278,25 @@ struct clk *clk_get(struct device *dev, const char *id); * * clk_bulk_get should not be called from within interrupt context. */ - int __must_check clk_bulk_get(struct device *dev, int num_clks, struct clk_bulk_data *clks); /** + * devm_clk_bulk_get - managed get multiple clk consumers + * @dev: device for clock "consumer" + * @num_clks: the number of clk_bulk_data + * @clks: the clk_bulk_data table of consumer + * + * Return 0 on success, an errno on failure. + * + * This helper function allows drivers to get several regulator + * consumers in one operation with management, the clks will + * automatically be freed when the device is unbound. + */ +int __must_check devm_clk_bulk_get(struct device *dev, int num_clks, + struct clk_bulk_data *clks); + +/** * devm_clk_get - lookup and obtain a managed reference to a clock producer. * @dev: device for clock "consumer" * @id: clock consumer ID @@ -554,6 +568,12 @@ static inline struct clk *devm_clk_get(struct device *dev, const char *id) return NULL; } +static inline int devm_clk_bulk_get(struct device *dev, int num_clks, + struct clk_bulk_data *clks) +{ + return NULL; +} + static inline struct clk *devm_get_clk_from_child(struct device *dev, struct device_node *np, const char *con_id) { -- 2.7.4