* [PATCH v1 0/2] cmd: bind allow to bind driver with driver_data
@ 2020-04-21 14:08 Patrice Chotard
2020-04-21 14:08 ` [PATCH v1 1/2] dm: core: give access to driver_check_compatible() Patrice Chotard
2020-04-21 14:08 ` [PATCH v1 2/2] cmd: bind: allow to bind driver with driver data Patrice Chotard
0 siblings, 2 replies; 7+ messages in thread
From: Patrice Chotard @ 2020-04-21 14:08 UTC (permalink / raw)
To: u-boot
For this, we make usage of driver_check_compatible() primitive.
Patch 1 is giving access to driver_check_compatible()
Patch 2 is adding find_udevice_id() which parses the driver
of_match list and returns the driver corresponding entry.
Patrice Chotard (2):
dm: core: give access to driver_check_compatible()
cmd: bind: allow to bind driver with driver data
cmd/bind.c | 29 ++++++++++++++++++++++++++++-
drivers/core/lists.c | 6 +++---
include/dm/lists.h | 12 ++++++++++++
3 files changed, 43 insertions(+), 4 deletions(-)
--
2.17.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v1 1/2] dm: core: give access to driver_check_compatible()
2020-04-21 14:08 [PATCH v1 0/2] cmd: bind allow to bind driver with driver_data Patrice Chotard
@ 2020-04-21 14:08 ` Patrice Chotard
2020-04-21 17:36 ` Simon Glass
2020-04-21 14:08 ` [PATCH v1 2/2] cmd: bind: allow to bind driver with driver data Patrice Chotard
1 sibling, 1 reply; 7+ messages in thread
From: Patrice Chotard @ 2020-04-21 14:08 UTC (permalink / raw)
To: u-boot
driver_check_compatible() can be useful in particular case,
give access to this primitive
Signed-off-by: Patrice Chotard <patrice.chotard@st.com>
Cc: Jean-Jacques Hiblot <jjhiblot@ti.com>
---
drivers/core/lists.c | 6 +++---
include/dm/lists.h | 12 ++++++++++++
2 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/drivers/core/lists.c b/drivers/core/lists.c
index 68204c303f..c807cf8698 100644
--- a/drivers/core/lists.c
+++ b/drivers/core/lists.c
@@ -106,9 +106,9 @@ int device_bind_driver_to_node(struct udevice *parent, const char *drv_name,
* @param compat: The compatible string to search for
* @return 0 if there is a match, -ENOENT if no match
*/
-static int driver_check_compatible(const struct udevice_id *of_match,
- const struct udevice_id **of_idp,
- const char *compat)
+int driver_check_compatible(const struct udevice_id *of_match,
+ const struct udevice_id **of_idp,
+ const char *compat)
{
if (!of_match)
return -ENOENT;
diff --git a/include/dm/lists.h b/include/dm/lists.h
index 810e244d9e..7615f0ab38 100644
--- a/include/dm/lists.h
+++ b/include/dm/lists.h
@@ -44,6 +44,18 @@ struct uclass_driver *lists_uclass_lookup(enum uclass_id id);
*/
int lists_bind_drivers(struct udevice *parent, bool pre_reloc_only);
+/**
+ * driver_check_compatible() - Check if a driver matches a compatible string
+ *
+ * @param of_match: List of compatible strings to match
+ * @param of_idp: Returns the match that was found
+ * @param compat: The compatible string to search for
+ * @return 0 if there is a match, -ENOENT if no match
+ */
+int driver_check_compatible(const struct udevice_id *of_match,
+ const struct udevice_id **of_idp,
+ const char *compat);
+
/**
* lists_bind_fdt() - bind a device tree node
*
--
2.17.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v1 2/2] cmd: bind: allow to bind driver with driver data
2020-04-21 14:08 [PATCH v1 0/2] cmd: bind allow to bind driver with driver_data Patrice Chotard
2020-04-21 14:08 ` [PATCH v1 1/2] dm: core: give access to driver_check_compatible() Patrice Chotard
@ 2020-04-21 14:08 ` Patrice Chotard
2020-04-21 17:36 ` Simon Glass
1 sibling, 1 reply; 7+ messages in thread
From: Patrice Chotard @ 2020-04-21 14:08 UTC (permalink / raw)
To: u-boot
Initial implementation invokes device_bind_with_driver_data()
with driver_data parameter equal to 0.
For driver with driver data, the bind command can't bind
correctly this driver or even worse causes data abort.
Add find_udevice_id() to parse the driver's of_match list
and return the entry corresponding to the driver compatible string.
This allows to get access to driver_data and to use it as
parameters of device_bind_with_driver_data().
Signed-off-by: Patrice Chotard <patrice.chotard@st.com>
Cc: Jean-Jacques Hiblot <jjhiblot@ti.com>
---
cmd/bind.c | 29 ++++++++++++++++++++++++++++-
1 file changed, 28 insertions(+), 1 deletion(-)
diff --git a/cmd/bind.c b/cmd/bind.c
index 44a5f17f0d..ab1844c855 100644
--- a/cmd/bind.c
+++ b/cmd/bind.c
@@ -118,6 +118,29 @@ static int unbind_child_by_class_index(const char *uclass, int index,
return ret;
}
+static const struct udevice_id *find_udevice_id(struct driver *drv,
+ ofnode ofnode)
+{
+ const char *compat_list, *compat;
+ const struct udevice_id *id;
+ int ret, compat_length, i;
+
+ compat_list = ofnode_get_property(ofnode, "compatible", &compat_length);
+ /*
+ * Walk through the compatible string list and find the corresponding
+ * udevice_id entry
+ */
+ for (i = 0; i < compat_length; i += strlen(compat) + 1) {
+ compat = compat_list + i;
+
+ ret = driver_check_compatible(drv->of_match, &id, compat);
+ if (!ret)
+ break;
+ }
+
+ return id;
+}
+
static int bind_by_node_path(const char *path, const char *drv_name)
{
struct udevice *dev;
@@ -125,6 +148,7 @@ static int bind_by_node_path(const char *path, const char *drv_name)
int ret;
ofnode ofnode;
struct driver *drv;
+ const struct udevice_id *id;
drv = lists_driver_lookup_name(drv_name);
if (!drv) {
@@ -150,8 +174,11 @@ static int bind_by_node_path(const char *path, const char *drv_name)
}
ofnode = ofnode_path(path);
+ id = find_udevice_id(drv, ofnode);
+
ret = device_bind_with_driver_data(parent, drv, ofnode_get_name(ofnode),
- 0, ofnode, &dev);
+ id->data, ofnode, &dev);
+
if (!dev || ret) {
printf("Unable to bind. err:%d\n", ret);
return ret;
--
2.17.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v1 2/2] cmd: bind: allow to bind driver with driver data
2020-04-21 14:08 ` [PATCH v1 2/2] cmd: bind: allow to bind driver with driver data Patrice Chotard
@ 2020-04-21 17:36 ` Simon Glass
2020-04-22 8:13 ` Patrice CHOTARD
0 siblings, 1 reply; 7+ messages in thread
From: Simon Glass @ 2020-04-21 17:36 UTC (permalink / raw)
To: u-boot
Hi Patrice,
On Tue, 21 Apr 2020 at 08:09, Patrice Chotard <patrice.chotard@st.com> wrote:
>
> Initial implementation invokes device_bind_with_driver_data()
> with driver_data parameter equal to 0.
> For driver with driver data, the bind command can't bind
> correctly this driver or even worse causes data abort.
>
> Add find_udevice_id() to parse the driver's of_match list
> and return the entry corresponding to the driver compatible string.
> This allows to get access to driver_data and to use it as
> parameters of device_bind_with_driver_data().
>
> Signed-off-by: Patrice Chotard <patrice.chotard@st.com>
> Cc: Jean-Jacques Hiblot <jjhiblot@ti.com>
>
> ---
>
> cmd/bind.c | 29 ++++++++++++++++++++++++++++-
> 1 file changed, 28 insertions(+), 1 deletion(-)
>
The thing I don't quite get here is why the driver name needs to be
specified. If the device tree node is present, and it has a compatible
string, can't DM find the driver and bind a device automatically?
Also, is there any docs for this command? It would be good to add to
doc/driver-model and also add a simple test.
Regards,
Simon
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v1 1/2] dm: core: give access to driver_check_compatible()
2020-04-21 14:08 ` [PATCH v1 1/2] dm: core: give access to driver_check_compatible() Patrice Chotard
@ 2020-04-21 17:36 ` Simon Glass
0 siblings, 0 replies; 7+ messages in thread
From: Simon Glass @ 2020-04-21 17:36 UTC (permalink / raw)
To: u-boot
Hi Patrice,
On Tue, 21 Apr 2020 at 08:09, Patrice Chotard <patrice.chotard@st.com> wrote:
>
> driver_check_compatible() can be useful in particular case,
> give access to this primitive
>
> Signed-off-by: Patrice Chotard <patrice.chotard@st.com>
> Cc: Jean-Jacques Hiblot <jjhiblot@ti.com>
> ---
>
> drivers/core/lists.c | 6 +++---
> include/dm/lists.h | 12 ++++++++++++
> 2 files changed, 15 insertions(+), 3 deletions(-)
>
Please see my comment on the other patch.
Regards,
Simon
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v1 2/2] cmd: bind: allow to bind driver with driver data
2020-04-21 17:36 ` Simon Glass
@ 2020-04-22 8:13 ` Patrice CHOTARD
2020-04-22 16:32 ` Simon Glass
0 siblings, 1 reply; 7+ messages in thread
From: Patrice CHOTARD @ 2020-04-22 8:13 UTC (permalink / raw)
To: u-boot
On 4/21/20 7:36 PM, Simon Glass wrote:
> Hi Patrice,
>
> On Tue, 21 Apr 2020 at 08:09, Patrice Chotard <patrice.chotard@st.com> wrote:
>> Initial implementation invokes device_bind_with_driver_data()
>> with driver_data parameter equal to 0.
>> For driver with driver data, the bind command can't bind
>> correctly this driver or even worse causes data abort.
>>
>> Add find_udevice_id() to parse the driver's of_match list
>> and return the entry corresponding to the driver compatible string.
>> This allows to get access to driver_data and to use it as
>> parameters of device_bind_with_driver_data().
>>
>> Signed-off-by: Patrice Chotard <patrice.chotard@st.com>
>> Cc: Jean-Jacques Hiblot <jjhiblot@ti.com>
>>
>> ---
>>
>> cmd/bind.c | 29 ++++++++++++++++++++++++++++-
>> 1 file changed, 28 insertions(+), 1 deletion(-)
>>
> The thing I don't quite get here is why the driver name needs to be
> specified. If the device tree node is present, and it has a compatible
Sorry, i didn't get your point when you said "why the driver name needs to be specified"
Which part of this patch do you made reference to ?
> string, can't DM find the driver and bind a device automatically?
>
> Also, is there any docs for this command? It would be good to add to
Is what in cmd/bind.c not enough ?
U_BOOT_CMD(
??? bind,??? 4,??? 0,??? do_bind_unbind,
??? "Bind a device to a driver",
??? "<node path> <driver>\n"
??? "bind <class> <index> <driver>\n"
);
U_BOOT_CMD(
??? unbind,??? 4,??? 0,??? do_bind_unbind,
??? "Unbind a device from a driver",
??? "<node path>\n"
??? "unbind <class> <index>\n"
??? "unbind <class> <index> <driver>\n"
);
> doc/driver-model and also add a simple test.
Ok i will add an additionnal test to test/py/tests/test_bind.py
Thanks
Patrice
>
> Regards,
> Simon
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v1 2/2] cmd: bind: allow to bind driver with driver data
2020-04-22 8:13 ` Patrice CHOTARD
@ 2020-04-22 16:32 ` Simon Glass
0 siblings, 0 replies; 7+ messages in thread
From: Simon Glass @ 2020-04-22 16:32 UTC (permalink / raw)
To: u-boot
Hi Patrice,
On Wed, 22 Apr 2020 at 02:13, Patrice CHOTARD <patrice.chotard@st.com> wrote:
>
>
> On 4/21/20 7:36 PM, Simon Glass wrote:
> > Hi Patrice,
> >
> > On Tue, 21 Apr 2020 at 08:09, Patrice Chotard <patrice.chotard@st.com> wrote:
> >> Initial implementation invokes device_bind_with_driver_data()
> >> with driver_data parameter equal to 0.
> >> For driver with driver data, the bind command can't bind
> >> correctly this driver or even worse causes data abort.
> >>
> >> Add find_udevice_id() to parse the driver's of_match list
> >> and return the entry corresponding to the driver compatible string.
> >> This allows to get access to driver_data and to use it as
> >> parameters of device_bind_with_driver_data().
> >>
> >> Signed-off-by: Patrice Chotard <patrice.chotard@st.com>
> >> Cc: Jean-Jacques Hiblot <jjhiblot@ti.com>
> >>
> >> ---
> >>
> >> cmd/bind.c | 29 ++++++++++++++++++++++++++++-
> >> 1 file changed, 28 insertions(+), 1 deletion(-)
> >>
> > The thing I don't quite get here is why the driver name needs to be
> > specified. If the device tree node is present, and it has a compatible
>
> Sorry, i didn't get your point when you said "why the driver name needs to be specified"
It's just that I don't understand it at all. If the compatible string
is available, why not use lists_bind_fdt()?
>
> Which part of this patch do you made reference to ?
The whole thing, because I just don't understand the bind command.
>
> > string, can't DM find the driver and bind a device automatically?
> >
> > Also, is there any docs for this command? It would be good to add to
>
> Is what in cmd/bind.c not enough ?
I am just confused here. You obviously have a use case in mind, but
the help below is not sufficient to understand what is going on. As I
said, if you have a device-tree node you can find the driver. I am
just not sure what this is for.
It could really use a short document as I said, to explain the uses of
this command and what it does in a bit more detail.
>
>
> U_BOOT_CMD(
> bind, 4, 0, do_bind_unbind,
> "Bind a device to a driver",
> "<node path> <driver>\n"
> "bind <class> <index> <driver>\n"
> );
>
> U_BOOT_CMD(
> unbind, 4, 0, do_bind_unbind,
> "Unbind a device from a driver",
> "<node path>\n"
> "unbind <class> <index>\n"
> "unbind <class> <index> <driver>\n"
> );
>
>
> > doc/driver-model and also add a simple test.
>
> Ok i will add an additionnal test to test/py/tests/test_bind.py
OK thanks.
Regards,
SImon
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2020-04-22 16:32 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-21 14:08 [PATCH v1 0/2] cmd: bind allow to bind driver with driver_data Patrice Chotard
2020-04-21 14:08 ` [PATCH v1 1/2] dm: core: give access to driver_check_compatible() Patrice Chotard
2020-04-21 17:36 ` Simon Glass
2020-04-21 14:08 ` [PATCH v1 2/2] cmd: bind: allow to bind driver with driver data Patrice Chotard
2020-04-21 17:36 ` Simon Glass
2020-04-22 8:13 ` Patrice CHOTARD
2020-04-22 16:32 ` Simon Glass
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.