On Mon, Oct 16, 2017 at 04:02:45PM +0300, Sakari Ailus wrote:
> Hi Hans,
> 
> On Tue, Oct 10, 2017 at 03:07:29PM +0200, Hans Verkuil wrote:
> > On 10/10/2017 01:27 PM, Sakari Ailus wrote:
> > > Hi Hans,
> > > 
> > > On Mon, Oct 09, 2017 at 02:06:55PM +0200, Hans Verkuil wrote:
> > >> Hi Sakari,
> > >>
> > >> My reply here is also valid for v15.
> > >>
> > >> On 26/09/17 13:30, Sakari Ailus wrote:
> > >>> Hi Hans,
> > >>>
> > >>> Thanks for the review.
> > >>>
> > >>> On Tue, Sep 26, 2017 at 10:47:40AM +0200, Hans Verkuil wrote:
> > >>>> On 26/09/17 00:25, Sakari Ailus wrote:
> > >>>>> v4l2_fwnode_reference_parse_int_prop() will find an fwnode such that 
> > >>>>> under
> > >>>>> the device's own fwnode, it will follow child fwnodes with the given
> > >>>>> property-value pair and return the resulting fwnode.
> > >>>>>
> > >>>>> Signed-off-by: Sakari Ailus <sakari.ai...@linux.intel.com>
> > >>>>> ---
> > >>>>>  drivers/media/v4l2-core/v4l2-fwnode.c | 201 
> > >>>>> ++++++++++++++++++++++++++++++++++
> > >>>>>  1 file changed, 201 insertions(+)
> > >>>>>
> > >>>>> diff --git a/drivers/media/v4l2-core/v4l2-fwnode.c 
> > >>>>> b/drivers/media/v4l2-core/v4l2-fwnode.c
> > >>>>> index f739dfd16cf7..f93049c361e4 100644
> > >>>>> --- a/drivers/media/v4l2-core/v4l2-fwnode.c
> > >>>>> +++ b/drivers/media/v4l2-core/v4l2-fwnode.c
> > >>>>> @@ -578,6 +578,207 @@ static int v4l2_fwnode_reference_parse(
> > >>>>>       return ret;
> > >>>>>  }
> > >>>>>  
> > >>>>> +/*
> > >>>>> + * v4l2_fwnode_reference_get_int_prop - parse a reference with 
> > >>>>> integer
> > >>>>> + *                                   arguments
> > >>>>> + * @dev: struct device pointer
> > >>>>> + * @notifier: notifier for @dev
> > >>>>> + * @prop: the name of the property
> > >>>>> + * @index: the index of the reference to get
> > >>>>> + * @props: the array of integer property names
> > >>>>> + * @nprops: the number of integer property names in @nprops
> > >>>>> + *
> > >>>>> + * Find fwnodes referred to by a property @prop, then under that
> > >>>>> + * iteratively, @nprops times, follow each child node which has a
> > >>>>> + * property in @props array at a given child index the value of which
> > >>>>> + * matches the integer argument at an index.
> > >>>>
> > >>>> "at an index". Still makes no sense to me. Which index?
> > >>>
> > >>> How about this:
> > >>>
> > >>> First find an fwnode referred to by the reference at @index in @prop.
> > >>>
> > >>> Then under that fwnode, @nprops times, for each property in @props,
> > >>> iteratively follow child nodes starting from fwnode such that they have 
> > >>> the
> > >>> property in @props array at the index of the child node distance from 
> > >>> the
> > >>
> > >> distance? You mean 'instance'?
> > > 
> > > No. It's a tree structure: this is the distance between a node in the tree
> > > and the root node (i.e. device's fwnode).
> > > 
> > >>
> > >>> root node and the value of that property matching with the integer 
> > >>> argument of
> > >>> the reference, at the same index.
> > >>
> > >> You've completely lost me. About halfway through this sentence my brain 
> > >> crashed :-)
> > > 
> > > :-D
> > > 
> > > Did keeping distance have any effect?
> > 
> > No :-)
> > 
> > "the index of the child node distance from the root node": I have absolutely
> > no idea how to interpret that.
> 
> This index is referring to the properties array and its value is the same
> as the distance of the child node from the device's root node.
> 
> > 
> > > 
> > >>
> > >>>
> > >>>>
> > >>>>> + *
> > >>>>> + * For example, if this function was called with arguments and values
> > >>>>> + * @dev corresponding to device "SEN", @prop == "flash-leds", @index
> > >>>>> + * == 1, @props == { "led" }, @nprops == 1, with the ASL snippet 
> > >>>>> below
> > >>>>> + * it would return the node marked with THISONE. The @dev argument in
> > >>>>> + * the ASL below.
> > >>>>
> > >>>> I know I asked for this before, but can you change the example to one 
> > >>>> where
> > >>>> nprops = 2? I think that will help understanding this.
> > >>>
> > >>> I could do that but then the example no longer corresponds to any actual
> > >>> case that exists at the moment. LED nodes will use a single integer
> > >>> argument and lens-focus nodes none.
> > >>
> > >> So? The example is here to understand the code and it doesn't have to be
> > >> related to actual hardware for a mainlined driver.
> > > 
> > > This isn't about hardware, the definitions being parsed currently aren't
> > > specific to any single piece of hardware. I could add an example which 
> > > does
> > > not exist, that's certainly possible. But I fail to see how it'd help
> > > while the contrary could well be the case.
> > 
> > It helps to relate the code (and the comments for that matter) to what is in
> > the ACPI. In fact, if you can make such an example, then I can see if I can
> > come up with a better description.
> 
> Hmm. I thought about the example, and figured out the graph data structure
> could be parsed using this function as well. From
> Documentation/acpi/dsd/graph.txt:
> 
>     Scope (\_SB.PCI0.I2C2)
>     {
>       Device (CAM0)
>       {
>           Name (_DSD, Package () {
>               ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
>               Package () {
>                   Package () { "compatible", Package () { "nokia,smia" } },
>               },
>               ToUUID("dbb8e3e6-5886-4ba6-8795-1319f52a966b"),
>               Package () {
>                   Package () { "port0", "PRT0" },
>               }
>           })
>           Name (PRT0, Package() {
>               ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
>               Package () {
>                   Package () { "port", 0 },
>               },
>               ToUUID("dbb8e3e6-5886-4ba6-8795-1319f52a966b"),
>               Package () {
>                   Package () { "endpoint0", "EP00" },
>               }
>           })
>           Name (EP00, Package() {
>               ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
>               Package () {
>                   Package () { "endpoint", 0 },
>                   Package () { "remote-endpoint", Package() { \_SB.PCI0.ISP, 
> 4, 0 } },
>               }
>           })
>       }
>     }
> 
>     Scope (\_SB.PCI0)
>     {
>       Device (ISP)
>       {
>           Name (_DSD, Package () {
>               ToUUID("dbb8e3e6-5886-4ba6-8795-1319f52a966b"),
>               Package () {
>                   Package () { "port4", "PRT4" },
>               }
>           })
> 
>           Name (PRT4, Package() {
>               ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
>               Package () {
>                   Package () { "port", 4 }, /* CSI-2 port number */
>               },
>               ToUUID("dbb8e3e6-5886-4ba6-8795-1319f52a966b"),
>               Package () {
>                   Package () { "endpoint0", "EP40" },
>               }
>           })
> 
>           Name (EP40, Package() {
>               ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
>               Package () {
>                   Package () { "endpoint", 0 },
>                   Package () { "remote-endpoint", Package () { 
> \_SB.PCI0.I2C2.CAM0, 0, 0 } },
>               }
>           })
>       }
>     }

If you did this with DT it'd look roughly like:

cam0 {
        compatible = "nokia,smia";

        port {
                cam0_ep: endpoint {
                        remote-endpoint = <&isp_port4_ep>;
                };
        };
};

isp {
        ports {
                port@4 {
                        reg = <4>;
                        isp_port4_ep: endpoint {
                                remote-endpoint = <&cam0_ep>;
                        };      
                };
        };
};

And in ACPI style, i.e. with explicit "port" and "endpoint" properties as
well as integers to point the ports and endpoints:

cam: cam0 {
        compatible = "nokia,smia";

        port {
                port = <0>;
                cam0_ep: endpoint {
                        endpoint = <0>;
                        remote-endpoint = <&isp 4 0>;
                };
        };
};

isp: isp {
        ports {
                port@4 {
                        port = <4>;
                        isp_port4_ep: endpoint {
                                endpoint = <0>;
                                remote-endpoint = <&cam 0 0>;
                        };      
                };
        };
};


> 
> From the EP40 node under ISP device, you could parse the graph remote
> endpoint using v4l2_fwnode_reference_get_int_prop with these arguments (the
> argument dev changed to fwnode in an earlier version of the patch, I'll
> address that soon as well):
> 
>  @fwnode: fwnode referring to EP40 under ISP.
>  @prop: "remote-endpoint"
>  @index: 0
>  @props: "port", "endpoint"
>  @nprops: 2
> 
> And you'd get back fwnode referring to EP00 under CAM0.
> 
> The same works the other way around: if you use EP00 under CAM0 as the
> fwnode, you'll get fwnode referring to EP40 under ISP.
> 
> If the remote-endpoint property would have additional references beyond the
> first one, then incrementing index could be used to obtain them. The graph
> bindings don't allow this though.
> 
> This function can be eventually moved to the ACPI framework, but doing that
> right now would probably one kernel release delay for the functionality.
> 
> -- 
> Regards,
> 
> Sakari Ailus
> sakari.ai...@linux.intel.com

-- 
Sakari Ailus
e-mail: sakari.ai...@iki.fi

Reply via email to