[PATCH] soc: ti: wkup_m3_ipc: switch to using remoteproc OF infrastructure

Rob Herring robh+dt at kernel.org
Tue Aug 16 07:54:35 PDT 2016


On Fri, Aug 12, 2016 at 11:43 AM, Bjorn Andersson
<bjorn.andersson at linaro.org> wrote:
> On Fri 12 Aug 09:00 PDT 2016, Suman Anna wrote:
>
>> On 08/12/2016 06:02 AM, Lee Jones wrote:
>> > On Thu, 11 Aug 2016, Suman Anna wrote:
>> >
>> >> The remoteproc framework has been enhanced recently to provide new
>> >> OF API to retrieve a remoteproc handle by client drivers through a
>> >> standard 'rprocs' property in client nodes. The wkup_m3_ipc driver
>> >> has been using a custom 'ti,rproc' property until now, switch this
>> >> to use this new OF infrastructure. The wkup_m3_ipc driver has been
>> >> fixed up to provide backward compatibility for older DTBs by
>> >> replacing the older property with the standard newer property.
>> >>
>> >> The wkup_m3_ipc binding has also been updated accordingly.
>> >>
>> >> Signed-off-by: Suman Anna <s-anna at ti.com>
>> >> ---
>> >> This patch is based on the discussion [1] for introducing new standard
>> >> OF API in remoteproc core series [2] and the exporting of couple of
>> >> functions in OF base code [3].
>> >>
>> >> With this in place, the remoteproc core need not be looking for the
>> >> TI specific property anymore. I will submit the DTS changes once this
>> >> makes it to mainline.
>> >>
>> >> regards
>> >> Suman
>> >>
>> >> [1] https://patchwork.kernel.org/patch/9237767/
>> >> [2] http://marc.info/?l=linux-kernel&m=146894341701010&w=2
>> >> [3] https://patchwork.kernel.org/patch/9276181/
>> >>
>> >>  .../devicetree/bindings/soc/ti/wkup_m3_ipc.txt     |  9 ++++++--
>> >>  drivers/soc/ti/wkup_m3_ipc.c                       | 26 +++++++++++++++++++++-
>> >>  2 files changed, 32 insertions(+), 3 deletions(-)
>> >>
>> >> diff --git a/Documentation/devicetree/bindings/soc/ti/wkup_m3_ipc.txt b/Documentation/devicetree/bindings/soc/ti/wkup_m3_ipc.txt
>> >> index 401550487ed6..2ea7dd91acff 100644
>> >> --- a/Documentation/devicetree/bindings/soc/ti/wkup_m3_ipc.txt
>> >> +++ b/Documentation/devicetree/bindings/soc/ti/wkup_m3_ipc.txt
>> >> @@ -23,12 +23,17 @@ Required properties:
>> >>                    with the Wakeup M3 processor
>> >>  - interrupts:             Contains the interrupt information for the wkup_m3
>> >>                    interrupt that signals the MPU.
>> >> -- ti,rproc:               phandle to the wkup_m3 rproc node so the IPC driver
>> >> +- rprocs:         phandle to the wkup_m3 rproc node so the IPC driver
>> >>                    can boot it.
>> >>  - mboxes:         phandles used by IPC framework to get correct mbox
>> >>                    channel for communication. Must point to appropriate
>> >>                    mbox_wkupm3 child node.
>> >>
>> >> +Deprecated properties:
>> >> +----------------------
>> >> +- ti,rproc:               This property has been replaced with the "rprocs"
>> >> +                  property.
>> >> +
>> >>  Example:
>> >>  --------
>> >>  /* AM33xx */
>> >> @@ -48,7 +53,7 @@ Example:
>> >>                            compatible = "ti,am3352-wkup-m3-ipc";
>> >>                            reg = <0x1324 0x24>;
>> >>                            interrupts = <78>;
>> >> -                          ti,rproc = <&wkup_m3>;
>> >> +                          rprocs = <&wkup_m3>;
>> >>                            mboxes = <&mailbox &mbox_wkupm3>;
>> >>                    };
>> >>
>> >> diff --git a/drivers/soc/ti/wkup_m3_ipc.c b/drivers/soc/ti/wkup_m3_ipc.c
>> >> index 8823cc81ae45..86085f9bf6a8 100644
>> >> --- a/drivers/soc/ti/wkup_m3_ipc.c
>> >> +++ b/drivers/soc/ti/wkup_m3_ipc.c
>> >> @@ -1,7 +1,7 @@
>> >>  /*
>> >>   * AMx3 Wkup M3 IPC driver
>> >>   *
>> >> - * Copyright (C) 2015 Texas Instruments, Inc.
>> >> + * Copyright (C) 2015-2016 Texas Instruments, Inc.
>> >>   *
>> >>   * Dave Gerlach <d-gerlach at ti.com>
>> >>   *
>> >> @@ -390,6 +390,8 @@ static int wkup_m3_ipc_probe(struct platform_device *pdev)
>> >>    struct resource *res;
>> >>    struct task_struct *task;
>> >>    struct wkup_m3_ipc *m3_ipc;
>> >> +  struct property *nprop, *oprop;
>> >> +  const char nprop_name[] = "rprocs";
>> >>
>> >>    m3_ipc = devm_kzalloc(dev, sizeof(*m3_ipc), GFP_KERNEL);
>> >>    if (!m3_ipc)
>> >> @@ -415,6 +417,28 @@ static int wkup_m3_ipc_probe(struct platform_device *pdev)
>> >>            return ret;
>> >>    }
>> >>
>> >> +  /* provide compatibility for older DTBs using ti,rproc property */
>> >> +  nprop = of_find_property(dev->of_node, "rprocs", NULL);
>> >> +  if (!nprop) {
>> >> +          oprop = of_find_property(dev->of_node, "ti,rproc", NULL);
>> >> +          if (!oprop) {
>> >> +                  dev_err(&pdev->dev, "node is missing ti,rproc property\n");
>> >> +                  return -ENODEV;
>> >> +          }
>> >> +
>> >> +          nprop = kzalloc(sizeof(*nprop) + sizeof(nprop_name),
>> >> +                          GFP_KERNEL);
>> >> +          if (!nprop)
>> >> +                  return -ENOMEM;
>> >> +
>> >> +          nprop->name = (char *)nprop + sizeof(*nprop);
>> >> +          snprintf(nprop->name, sizeof(nprop_name), nprop_name);
>> >> +          nprop->value = oprop->value;
>> >> +          nprop->length = oprop->length;
>> >> +          of_update_property(dev->of_node, nprop);
>> >> +          of_remove_property(dev->of_node, oprop);
>> >> +  }
>> >> +
>> >
>> > +1 for getting the functionality out of core code.
>> >
>> > -100 for having to jump though all these hoops.
>> >
>> > If you are going to keep all of this, I would at least tuck it away in
>> > a header file or something.
>>
>> Hiding it somewhere else won't make much of a difference though. If this
>> is such an eyesore, we still can do this cleanly without jumping through
>> these hoops. I would say this is a direct result of the removal of the
>> rproc_get_by_phandle API in Patch 2 of your OF remoteproc series [2].
>> That API is still an agnostic API. We can just add the of_rproc_get()
>> convenience helper in your Patch 1 and drop patch 2 completely with no
>> references to ti,rproc in the core code in the first place. The other
>> option, if we do want to remove that API is to add an additional
>> property name argument (NULL to mean "rprocs") to
>> of_rproc_get_by_index(), and it can be hidden away under of_rproc_get()
>> API - which is what I am expecting most of the new client users would
>> use anyway.
>>
>> Once "rprocs" hits mainline, I will definitely switch over the
>> wkup_m3_ipc nodes to use that standard property and can fix this driver
>> independently.
>>
>
> We're stuck with this problem all over the place, as the world continues
> to evolve we will have issues with DT being static. This has been
> discussed many times before and the suggested solution is always what
> you implemented here - make the code deal with both versions, preferably
> by patching.
>
> The fact that you had to export the of_ operations indicates that no-one
> has tried this before and I'm happy you did. I'm however not happy about
> the size of the chunk of code it takes to do this dance.
>
> I think for this to be practical we need to provide higher level
> operations for DT modification - in this case a of_rename_property().
>
> @Rob, any comments on this?

I agree. Pantelis submitted some helpers in this area a while back
(for the changeset API IIRC). I believe they were mostly fine, but
needed some users.

Rob



More information about the linux-arm-kernel mailing list