diff mbox series

[v1,2/2] cmd: bind: allow to bind driver with driver data

Message ID 20200421140840.25729-3-patrice.chotard@st.com
State New
Headers show
Series cmd: bind allow to bind driver with driver_data | expand

Commit Message

Patrice CHOTARD April 21, 2020, 2:08 p.m. UTC
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 at st.com>
Cc: Jean-Jacques Hiblot <jjhiblot at ti.com>

---

 cmd/bind.c | 29 ++++++++++++++++++++++++++++-
 1 file changed, 28 insertions(+), 1 deletion(-)

Comments

Simon Glass April 21, 2020, 5:36 p.m. UTC | #1
Hi Patrice,

On Tue, 21 Apr 2020 at 08:09, Patrice Chotard <patrice.chotard at 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 at st.com>
> Cc: Jean-Jacques Hiblot <jjhiblot at 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
Patrice CHOTARD April 22, 2020, 8:13 a.m. UTC | #2
On 4/21/20 7:36 PM, Simon Glass wrote:
> Hi Patrice,
>
> On Tue, 21 Apr 2020 at 08:09, Patrice Chotard <patrice.chotard at 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 at st.com>
>> Cc: Jean-Jacques Hiblot <jjhiblot at 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
Simon Glass April 22, 2020, 4:32 p.m. UTC | #3
Hi Patrice,

On Wed, 22 Apr 2020 at 02:13, Patrice CHOTARD <patrice.chotard at 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 at 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 at st.com>
> >> Cc: Jean-Jacques Hiblot <jjhiblot at 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
diff mbox series

Patch

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;