From: Benjamin GAIGNARD <benjamin.gaignard@st.com>
To: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>,
"agx@sigxcpu.org" <agx@sigxcpu.org>,
Yannick FERTRE <yannick.fertre@st.com>
Cc: "dmitry.torokhov@gmail.com" <dmitry.torokhov@gmail.com>,
"robh+dt@kernel.org" <robh+dt@kernel.org>,
"mark.rutland@arm.com" <mark.rutland@arm.com>,
"hadess@hadess.net" <hadess@hadess.net>,
"frowand.list@gmail.com" <frowand.list@gmail.com>,
"m.felsch@pengutronix.de" <m.felsch@pengutronix.de>,
"arnd@arndb.de" <arnd@arndb.de>,
"linux-input@vger.kernel.org" <linux-input@vger.kernel.org>,
"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-stm32@st-md-mailman.stormreply.com"
<linux-stm32@st-md-mailman.stormreply.com>,
"broonie@kernel.org" <broonie@kernel.org>,
Linux PM <linux-pm@vger.kernel.org>
Subject: Re: [PATCH 1/5] of/device: Add of_ functions for device_link_{add,remove}
Date: Wed, 24 Apr 2019 13:39:23 +0000 [thread overview]
Message-ID: <a762a6b6-a039-3b80-e1dc-edbc2ebcde7c@st.com> (raw)
In-Reply-To: <d038f078-08dc-41ff-edc2-12f37d88a8a3@intel.com>
On 4/24/19 3:06 PM, Rafael J. Wysocki wrote:
> On 4/24/2019 12:19 PM, Benjamin Gaignard wrote:
>> Allows to create and remove links between consumer and suppliers from
>> device-tree data. Use 'links-add' property from consumer node to setup
>> a link with a list of suppliers.
>
> One immediate question about this one is why stateless links are
> better here?
They aren't better, it is just because I wanted to keep one of_ function
for each related device_link_* functions.
>
>> Consumers will be suspend before their suppliers and resume after them.
>>
>> Add devm_of_device_links_add() to automatically remove the links
>> when the device is unbound from the bus.
>
> And this might not be necessary even with managed links.
I guess I could use DL_FLAG_PM_RUNTIME and DL_FLAG_AUTOREMOVE_CONSUMER
flags and just keep
of_device_links_add() but the naming will not be explicit.
>
>> Signed-off-by: Benjamin Gaignard <benjamin.gaignard@st.com>
>> ---
>> drivers/of/device.c | 103
>> ++++++++++++++++++++++++++++++++++++++++++++++
>> include/linux/of_device.h | 20 +++++++++
>> 2 files changed, 123 insertions(+)
>>
>> diff --git a/drivers/of/device.c b/drivers/of/device.c
>> index 3717f2a20d0d..011ba9bf7642 100644
>> --- a/drivers/of/device.c
>> +++ b/drivers/of/device.c
>> @@ -336,3 +336,106 @@ int of_device_uevent_modalias(struct device
>> *dev, struct kobj_uevent_env *env)
>> return 0;
>> }
>> EXPORT_SYMBOL_GPL(of_device_uevent_modalias);
>> +
>> +/**
>> + * of_device_links_add - Create links between consumer and suppliers
>> from
>> + * device tree data
>> + *
>> + * @consumer: consumer device
>> + *
>> + * Returns 0 on success, < 0 on failure.
>> + */
>> +int of_device_links_add(struct device *consumer)
>> +{
>> + struct device_node *np;
>> + struct platform_device *pdev;
>> + int i = 0;
>> +
>> + np = of_parse_phandle(consumer->of_node, "links-add", i++);
>> + while (np) {
>> + pdev = of_find_device_by_node(np);
>> + of_node_put(np);
>> + if (!pdev)
>> + return -EINVAL;
>> +
>> + device_link_add(consumer, &pdev->dev, DL_FLAG_STATELESS);
>> + platform_device_put(pdev);
>> +
>> + np = of_parse_phandle(consumer->of_node, "links-add", i++);
>> + }
>> +
>> + return 0;
>> +}
>> +EXPORT_SYMBOL_GPL(of_device_links_add);
>> +
>> +/**
>> + * of_device_links_remove - Remove links between consumer and
>> suppliers from
>> + * device tree data
>> + *
>> + * @consumer: consumer device
>> + *
>> + * Returns 0 on success, < 0 on failure.
>> + */
>> +int of_device_links_remove(struct device *consumer)
>> +{
>> + struct device_node *np;
>> + struct platform_device *pdev;
>> + int i = 0;
>> +
>> + np = of_parse_phandle(consumer->of_node, "links-add", i++);
>> + while (np) {
>> + pdev = of_find_device_by_node(np);
>> + of_node_put(np);
>> + if (!pdev)
>> + return -EINVAL;
>> +
>> + device_link_remove(consumer, &pdev->dev);
>> + platform_device_put(pdev);
>> +
>> + np = of_parse_phandle(consumer->of_node, "links-add", i++);
>> + }
>> +
>> + return 0;
>> +}
>> +EXPORT_SYMBOL_GPL(of_device_links_remove);
>> +
>> +static void devm_of_device_links_remove(struct device *dev, void *res)
>> +{
>> + of_device_links_remove(*(struct device **)res);
>> +}
>> +
>> +/**
>> + * devm_of_device_links_add - Create links between consumer and
>> suppliers
>> + * from device tree data
>> + *
>> + * @consumer: consumer device
>> + *
>> + * Returns 0 on success, < 0 on failure.
>> + *
>> + * Similar to of_device_links_add(), but will automatically call
>> + * of_device_links_remove() when the device is unbound from the bus.
>> + */
>> +int devm_of_device_links_add(struct device *consumer)
>> +{
>> + struct device **ptr;
>> + int ret;
>> +
>> + if (!consumer)
>> + return -EINVAL;
>> +
>> + ptr = devres_alloc(devm_of_device_links_remove,
>> + sizeof(*ptr), GFP_KERNEL);
>> + if (!ptr)
>> + return -ENOMEM;
>> +
>> + ret = of_device_links_add(consumer);
>> + if (ret < 0) {
>> + devres_free(ptr);
>> + } else {
>> + *ptr = consumer;
>> + devres_add(consumer, ptr);
>> + }
>> +
>> + return ret;
>> +}
>> +EXPORT_SYMBOL_GPL(devm_of_device_links_add);
>> diff --git a/include/linux/of_device.h b/include/linux/of_device.h
>> index 8d31e39dd564..ad01db6828e8 100644
>> --- a/include/linux/of_device.h
>> +++ b/include/linux/of_device.h
>> @@ -41,6 +41,11 @@ extern int of_device_request_module(struct device
>> *dev);
>> extern void of_device_uevent(struct device *dev, struct
>> kobj_uevent_env *env);
>> extern int of_device_uevent_modalias(struct device *dev, struct
>> kobj_uevent_env *env);
>> +
>> +extern int of_device_links_add(struct device *consumer);
>> +extern int of_device_links_remove(struct device *consumer);
>> +extern int devm_of_device_links_add(struct device *consumer);
>> +
>> static inline void of_device_node_put(struct device *dev)
>> {
>> of_node_put(dev->of_node);
>> @@ -91,6 +96,21 @@ static inline int of_device_uevent_modalias(struct
>> device *dev,
>> return -ENODEV;
>> }
>> +static int of_device_links_add(struct device *consumer)
>> +{
>> + return 0;
>> +}
>> +
>> +static int of_device_links_remove(struct device *consumer)
>> +{
>> + return 0;
>> +}
>> +
>> +static int devm_of_device_links_add(struct device *consumer)
>> +{
>> + return 0;
>> +}
>> +
>> static inline void of_device_node_put(struct device *dev) { }
>> static inline const struct of_device_id *__of_match_device(
>
>
next prev parent reply other threads:[~2019-04-24 13:39 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-24 10:19 [PATCH 0/5] Add of_ functions for device_link_add() Benjamin Gaignard
2019-04-24 10:19 ` Benjamin Gaignard
2019-04-24 10:19 ` [PATCH 1/5] of/device: Add of_ functions for device_link_{add,remove} Benjamin Gaignard
2019-04-24 10:19 ` Benjamin Gaignard
2019-04-24 13:06 ` Rafael J. Wysocki
2019-04-24 13:39 ` Benjamin GAIGNARD [this message]
2019-04-24 10:19 ` [PATCH 2/5] Input: edt-ft5x06: Document links-add property Benjamin Gaignard
2019-04-24 10:19 ` Benjamin Gaignard
2019-04-24 10:19 ` [PATCH 3/5] input: edt-ft5x06 - Call devm_of_device_links_add() to create links Benjamin Gaignard
2019-04-24 10:19 ` Benjamin Gaignard
2019-04-24 22:52 ` Dmitry Torokhov
2019-04-25 7:22 ` Benjamin GAIGNARD
2019-04-24 10:19 ` [PATCH 4/5] Input: goodix: Document links-add property Benjamin Gaignard
2019-04-24 10:19 ` Benjamin Gaignard
2019-04-24 10:19 ` [PATCH 5/5] input: goodix - Call devm_of_device_links_add() to create links Benjamin Gaignard
2019-04-24 10:19 ` Benjamin Gaignard
2019-04-25 18:07 ` [PATCH 0/5] Add of_ functions for device_link_add() Rob Herring
2019-04-25 19:24 ` Dmitry Torokhov
2019-04-25 23:02 ` Rob Herring
2019-04-26 8:36 ` Benjamin GAIGNARD
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a762a6b6-a039-3b80-e1dc-edbc2ebcde7c@st.com \
--to=benjamin.gaignard@st.com \
--cc=agx@sigxcpu.org \
--cc=arnd@arndb.de \
--cc=broonie@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=dmitry.torokhov@gmail.com \
--cc=frowand.list@gmail.com \
--cc=hadess@hadess.net \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-stm32@st-md-mailman.stormreply.com \
--cc=m.felsch@pengutronix.de \
--cc=mark.rutland@arm.com \
--cc=rafael.j.wysocki@intel.com \
--cc=robh+dt@kernel.org \
--cc=yannick.fertre@st.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.