Hi Mauro,

On Tuesday 03 March 2015 20:21:29 Mauro Carvalho Chehab wrote:
> Em Wed, 04 Mar 2015 00:56:18 +0200 Laurent Pinchart escreveu:
> > On Tuesday 03 March 2015 13:40:50 Mauro Carvalho Chehab wrote:
> >> Em Mon, 02 Mar 2015 20:52:41 +0000 Laurent Pinchart escreveu:
> >>> On Mon Mar 02 2015 18:55:23 GMT+0200 (EET), Mauro Carvalho Chehab wrote:
> >>>> Em Sun, 1 Feb 2015 12:12:33 +0100 (CET) Guennadi Liakhovetski escreveu:
> >>>>> V4L2 clocks, e.g. used by camera sensors for their master clock, do
> >>>>> not have to be supplied by a different V4L2 driver, they can also be
> >>>>> supplied by an independent source. In this case the standart kernel
> >>>>> clock API should be used to handle such clocks. This patch adds
> >>>>> support for such cases.
> >>>>> 
> >>>>> Signed-off-by: Guennadi Liakhovetski <[email protected]>
> >>>>> Acked-by: Laurent Pinchart <[email protected]>
> >>>>> ---
> >>>>> 
> >>>>> v4: sizeof(*clk) :)
> >>>>> 
> >>>>>  drivers/media/v4l2-core/v4l2-clk.c | 48 ++++++++++++++++++++++++---
> >>>>>  include/media/v4l2-clk.h           |  2 ++
> >>>>>  2 files changed, 47 insertions(+), 3 deletions(-)
> >>>>> 
> >>>>> diff --git a/drivers/media/v4l2-core/v4l2-clk.c
> >>>>> b/drivers/media/v4l2-core/v4l2-clk.c index 3ff0b00..9f8cb20 100644
> >>>>> --- a/drivers/media/v4l2-core/v4l2-clk.c
> >>>>> +++ b/drivers/media/v4l2-core/v4l2-clk.c
> > 
> > [snip]
> > 
> >>>>> @@ -37,6 +38,21 @@ static struct v4l2_clk *v4l2_clk_find(const char
> >>>>> *dev_id)
> >>>>> struct v4l2_clk *v4l2_clk_get(struct device *dev, const char *id)
> >>>>> {
> >>>>>         struct v4l2_clk *clk;
> >>>>> +       struct clk *ccf_clk = clk_get(dev, id);
> >>>>> +
> >>>>> +       if (PTR_ERR(ccf_clk) == -EPROBE_DEFER)
> >>>>> +               return ERR_PTR(-EPROBE_DEFER);
> >>>> 
> >>>> Why not do just:
> >>>>          return ccf_clk;
> >>> 
> >>> I find the explicit error slightly more readable, but that's a matter
> >>> of taste.
> >> 
> >> Well, return(ccf_clk) will likely produce a smaller instruction code
> >> than return (long).
> > 
> > Not if the compiler is smart :-)
> > 
> >>>>> +
> >>>>> +       if (!IS_ERR_OR_NULL(ccf_clk)) {
> >>>>> +               clk = kzalloc(sizeof(*clk), GFP_KERNEL);
> >>>>> +               if (!clk) {
> >>>>> +                       clk_put(ccf_clk);
> >>>>> +                       return ERR_PTR(-ENOMEM);
> >>>>> +               }
> >>>>> +               clk->clk = ccf_clk;
> >>>>> +
> >>>>> +               return clk;
> >>>>> +       }
> >>>> 
> >>>> The error condition here looks a little weird to me. I mean, if the
> >>>> CCF clock returns an error, shouldn't it fail instead of silently
> >>>> run some logic to find another clock source? Isn't it risky on
> >>>> getting a wrong value?
> >>> 
> >>> The idea is that, in the long term, everything should use CCF
> >>> directly. However, we have clock providers on platforms where CCF
> >>> isn't avalaible. V4L2 clock has been introduced  as a  single API
> >>> usable by V4L2 clock users allowing them to retrieve and use clocks
> >>> regardless of whether the provider uses CCF or not. Internally it
> >>> first tries CCF, and then falls back to the non-CCF implementation in
> >>> case of failure.
> >> 
> >> Yeah, I got that the non-CCF is a fallback code, to be used on
> >> platforms that CCF isn't available.
> >> 
> >> However, the above code doesn't seem to look if CCF is available
> >> or not. Instead, it assumes that *all* error codes, or even NULL,
> >> means that CCF isn't available.
> >> 
> >> Shouldn't it be, instead, either waiting for NULL or for some
> >> specific error code, in order to:
> >>
> >> - return the error code, if CCF is available but getting
> >>   the clock failed;
> >> 
> >> - run the backward-compat code when CCF is not available.
> > 
> > Isn't that pretty much what the code is doing ? If we get a -EPROBE_DEFER
> > error from CCF meaning that the clock is known but not registered yet we
> > return it. Otherwise, if the clock is unknown to CCF, or if CCF is
> > disabled, we fall back.
> 
> I didn't check the CCF code, but couldn't it return error codes like
> ENOMEM? What are all the error codes it can return ATM? What, among
> them, can happen when CCF is available?
> 
> Also, as the CCF code can be changed, if the intent behavior is to only
> allow EPROBE_DEFER or NULL, if the there is support for CCF, then you
> need to have an explicit comment there to avoid that any newer patches
> to add different error codes.
> 
> IMHO, it seems a way better to define a single error code to be
> returned when the platform doesn't support CCF (like -ENOTSUPP),

But that's not how CCF works :-)

Regardless of that, note that the clk_get() call is part of the Linux clock 
API, of which CCF is one implementation. clk_get() is implemented by custom 
architecture code on platforms where CCF isn't used.

The idea of this patch is to

- return the platform clock if available (clk_get() returns a non-NULL, non-
error pointer)

- defer probing if the platform clock requests so

- fall back to the internal clocks list

I don't see a need for something else.

> and calling the fallback code only in this case. Something like:
> 
>       if (PTR_ERR(ccf_clk) != -ENOTSUPP)
>               return ccf_clk;
> 
>       /* CCF is not supported. Fall back to the old way */
>       k = kzalloc(sizeof(*clk), GFP_KERNEL);
>       if (!clk) {
>               clk_put(ccf_clk);
>               return ERR_PTR(-ENOMEM);
>       }
>       clk->clk = ccf_clk;
>       return clk;


-- 
Regards,

Laurent Pinchart

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to