[PATCH] drm/tinydrm: Move tinydrm_of_find_backlight into drm_of.c

Daniel Vetter daniel at ffwll.ch
Thu Sep 28 09:38:36 UTC 2017


On Thu, Sep 28, 2017 at 11:27 AM, Meghana Madhyastha
<meghana.madhyastha at gmail.com> wrote:
> On Thu, Sep 28, 2017 at 09:15:39AM +0200, Daniel Vetter wrote:
>> On Wed, Sep 27, 2017 at 05:08:07PM +0200, Noralf Trønnes wrote:
>> >
>> > Den 27.09.2017 15.54, skrev Meghana Madhyastha:
>> > > Rename tinydrm_of_find_backlight to drm_of_find_backlight
>> > > and move it into drm_of.c from tinydrm-helpers.c. This is
>> > > because other drivers in the drm subsystem might need to call
>> > > this function. In that case and otherwise, it is better from
>> > > an organizational point of view to move it into drm_of.c along
>> > > with the other _of.c functions.
>> > >
>> > > Signed-off-by: Meghana Madhyastha <meghana.madhyastha at gmail.com>
>> > > ---
>> >
>> > I suggest you split this patch in 2, one to add the function and one to
>> > use it in tinydrm.
>>
>> In general I'd agree to split into 3 phases: 1) add new function 2)
>> convert drivers 3) remove old one.
>>
>> But since there's only 1 caller this seems like overkill.
>>
>> > >   drivers/gpu/drm/drm_of.c                       | 41 ++++++++++++++++++++++++++
>> > >   drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c | 40 -------------------------
>> > >   drivers/gpu/drm/tinydrm/mi0283qt.c             |  3 +-
>> > >   include/drm/drm_of.h                           |  1 +
>> > >   include/drm/tinydrm/tinydrm-helpers.h          |  1 -
>> > >   5 files changed, 44 insertions(+), 42 deletions(-)
>> > >
>> > > diff --git a/drivers/gpu/drm/drm_of.c b/drivers/gpu/drm/drm_of.c
>> > > index 8dafbdf..d8cded3 100644
>> > > --- a/drivers/gpu/drm/drm_of.c
>> > > +++ b/drivers/gpu/drm/drm_of.c
>> > > @@ -1,6 +1,7 @@
>> > >   #include <linux/component.h>
>> > >   #include <linux/export.h>
>> > >   #include <linux/list.h>
>> > > +#include <linux/backlight.h>
>> > >   #include <linux/of_graph.h>
>> > >   #include <drm/drmP.h>
>> > >   #include <drm/drm_bridge.h>
>> > > @@ -260,3 +261,43 @@ int drm_of_find_panel_or_bridge(const struct device_node *np,
>> > >           return ret;
>> > >   }
>> > >   EXPORT_SYMBOL_GPL(drm_of_find_panel_or_bridge);
>> > > +
>> > > +/**
>> > > + * drm_of_find_backlight - Find backlight device in device-tree
>> > > + * @dev: Device
>> > > + *
>> > > + * This function looks for a DT node pointed to by a property named 'backlight'
>> > > + * and uses of_find_backlight_by_node() to get the backlight device.
>> > > + * Additionally if the brightness property is zero, it is set to
>> > > + * max_brightness.
>> >
>> > Please add a note here about the callers responsibility to call
>> > put_device() when releasing the resource.
>> > See the of_find_backlight_by_node() docs.
>> >
>> > > + *
>> > > + * Returns:
>> > > + * NULL if there's no backlight property.
>> > > + * Error pointer -EPROBE_DEFER if the DT node is found, but no backlight device
>> > > + * is found.
>> > > + * If the backlight device is found, a pointer to the structure is returned.
>> > > + */
>> > > +struct backlight_device *drm_of_find_backlight(struct device *dev)
>> > > +{
>> > > + struct backlight_device *backlight;
>> > > + struct device_node *np;
>> > > +
>> > > + np = of_parse_phandle(dev->of_node, "backlight", 0);
>> > > + if (!np)
>> > > +         return NULL;
>> > > +
>> > > + backlight = of_find_backlight_by_node(np);
>> > > + of_node_put(np);
>> > > +
>> > > + if (!backlight)
>> > > +         return ERR_PTR(-EPROBE_DEFER);
>> > > +
>> > > + if (!backlight->props.brightness) {
>> > > +         backlight->props.brightness = backlight->props.max_brightness;
>> > > +         DRM_DEBUG_KMS("Backlight brightness set to %d\n",
>> > > +                       backlight->props.brightness);
>> > > + }
>> > > +
>> > > + return backlight;
>> > > +}
>> > > +EXPORT_SYMBOL(drm_of_find_backlight);
>> >
>> > Can you also please add a devm_ version of this function. tinydrm uses
>> > devres[1] versions of functions for requiring device resources, so it
>> > would be nice to do this for backlight as well. tinydrm is currently
>> > broken in this respect, it doesn't put the backlight device.
>> >
>> > I had a devm_of_find_backlight() version lying around that I've adjusted
>> > to give you an idea of what I'm talking about:
>> >
>> > static void devm_drm_of_find_backlight_release(void *data)
>> > {
>> >     put_device(data);
>> > }
>> >
>> > struct backlight_device *devm_drm_of_find_backlight(struct device *dev)
>> > {
>> >     struct backlight_device *backlight;
>> >     int ret;
>> >
>> >     backlight = drm_of_find_backlight(dev);
>> >     if (IS_ERR_OR_NULL(backlight))
>> >         return backlight;
>> >
>> >     ret = devm_add_action(dev, devm_drm_of_find_backlight_release,
>> >                   backlight->dev);
>> >     if (ret) {
>> >         put_device(backlight->dev);
>> >         return ERR_PTR(ret);
>> >     }
>> >
>> >     return backlight;
>> > }
>>
>> Good idea for a follow up patch imo.
>>
>> Another follow up patch series which would be really good is then
>> converting drivers over to using this (preferrably the devm_ version). A
>> quick git grep shows there's quite a few.
>
> I have a quick question on this. I did a git grep and found that the
> other drivers used the function of_find_backlight_by_node defined in
> video/backlight. This seems to be doing a different thing (taking
> struct device_node* as a parameter instead of struct device*).
> Basically, this function finds the backlight device by device-tree node.
> How would you suggest converting these cases ?

The function you're moving also uses of_find_backglight_by_node, but
wraps it up to be more convenient for drm drivers. I didn't carefully
audit all of them, but I'd assume a bunch of these other callers might
be able to use the same convenience helper. But I might be wrong, and
we need a drm_panel specific helper. Just something I've noticed and
figured might be worth to check.
-Daniel

>
> Thanks and regards,
> Meghana
>
>> Either way, the patch that adds these to the core should also add a TODO
>> entry so we don't forget to complete this conversion.
>>
>> Thanks, Daniel
>>
>> >
>> > [1] https://www.kernel.org/doc/Documentation/driver-model/devres.txt
>> >
>> > Noralf.
>> >
>> > > diff --git a/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c b/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c
>> > > index bd6cce0..cd4c6a5 100644
>> > > --- a/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c
>> > > +++ b/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c
>> > > @@ -237,46 +237,6 @@ void tinydrm_xrgb8888_to_gray8(u8 *dst, void *vaddr, struct drm_framebuffer *fb,
>> > >   EXPORT_SYMBOL(tinydrm_xrgb8888_to_gray8);
>> > >   /**
>> > > - * tinydrm_of_find_backlight - Find backlight device in device-tree
>> > > - * @dev: Device
>> > > - *
>> > > - * This function looks for a DT node pointed to by a property named 'backlight'
>> > > - * and uses of_find_backlight_by_node() to get the backlight device.
>> > > - * Additionally if the brightness property is zero, it is set to
>> > > - * max_brightness.
>> > > - *
>> > > - * Returns:
>> > > - * NULL if there's no backlight property.
>> > > - * Error pointer -EPROBE_DEFER if the DT node is found, but no backlight device
>> > > - * is found.
>> > > - * If the backlight device is found, a pointer to the structure is returned.
>> > > - */
>> > > -struct backlight_device *tinydrm_of_find_backlight(struct device *dev)
>> > > -{
>> > > - struct backlight_device *backlight;
>> > > - struct device_node *np;
>> > > -
>> > > - np = of_parse_phandle(dev->of_node, "backlight", 0);
>> > > - if (!np)
>> > > -         return NULL;
>> > > -
>> > > - backlight = of_find_backlight_by_node(np);
>> > > - of_node_put(np);
>> > > -
>> > > - if (!backlight)
>> > > -         return ERR_PTR(-EPROBE_DEFER);
>> > > -
>> > > - if (!backlight->props.brightness) {
>> > > -         backlight->props.brightness = backlight->props.max_brightness;
>> > > -         DRM_DEBUG_KMS("Backlight brightness set to %d\n",
>> > > -                       backlight->props.brightness);
>> > > - }
>> > > -
>> > > - return backlight;
>> > > -}
>> > > -EXPORT_SYMBOL(tinydrm_of_find_backlight);
>> > > -
>> > > -/**
>> > >    * tinydrm_enable_backlight - Enable backlight helper
>> > >    * @backlight: Backlight device
>> > >    *
>> > > diff --git a/drivers/gpu/drm/tinydrm/mi0283qt.c b/drivers/gpu/drm/tinydrm/mi0283qt.c
>> > > index 7e5bb7d..5e3d635 100644
>> > > --- a/drivers/gpu/drm/tinydrm/mi0283qt.c
>> > > +++ b/drivers/gpu/drm/tinydrm/mi0283qt.c
>> > > @@ -12,6 +12,7 @@
>> > >   #include <drm/tinydrm/ili9341.h>
>> > >   #include <drm/tinydrm/mipi-dbi.h>
>> > >   #include <drm/tinydrm/tinydrm-helpers.h>
>> > > +#include <drm/drm_of.h>
>> > >   #include <linux/delay.h>
>> > >   #include <linux/gpio/consumer.h>
>> > >   #include <linux/module.h>
>> > > @@ -189,7 +190,7 @@ static int mi0283qt_probe(struct spi_device *spi)
>> > >           if (IS_ERR(mipi->regulator))
>> > >                   return PTR_ERR(mipi->regulator);
>> > > - mipi->backlight = tinydrm_of_find_backlight(dev);
>> > > + mipi->backlight = drm_of_find_backlight(dev);
>> > >           if (IS_ERR(mipi->backlight))
>> > >                   return PTR_ERR(mipi->backlight);
>> > > diff --git a/include/drm/drm_of.h b/include/drm/drm_of.h
>> > > index 104dd51..e8fba5b 100644
>> > > --- a/include/drm/drm_of.h
>> > > +++ b/include/drm/drm_of.h
>> > > @@ -29,6 +29,7 @@ int drm_of_find_panel_or_bridge(const struct device_node *np,
>> > >                                   int port, int endpoint,
>> > >                                   struct drm_panel **panel,
>> > >                                   struct drm_bridge **bridge);
>> > > +struct backlight_device *drm_of_find_backlight(struct device *dev);
>> > >   #else
>> > >   static inline uint32_t drm_of_find_possible_crtcs(struct drm_device *dev,
>> > >                                                     struct device_node *port)
>> > > diff --git a/include/drm/tinydrm/tinydrm-helpers.h b/include/drm/tinydrm/tinydrm-helpers.h
>> > > index d554ded..e40ef2d 100644
>> > > --- a/include/drm/tinydrm/tinydrm-helpers.h
>> > > +++ b/include/drm/tinydrm/tinydrm-helpers.h
>> > > @@ -46,7 +46,6 @@ void tinydrm_xrgb8888_to_rgb565(u16 *dst, void *vaddr,
>> > >   void tinydrm_xrgb8888_to_gray8(u8 *dst, void *vaddr, struct drm_framebuffer *fb,
>> > >                                  struct drm_clip_rect *clip);
>> > > -struct backlight_device *tinydrm_of_find_backlight(struct device *dev);
>> > >   int tinydrm_enable_backlight(struct backlight_device *backlight);
>> > >   int tinydrm_disable_backlight(struct backlight_device *backlight);
>> >
>>
>> --
>> Daniel Vetter
>> Software Engineer, Intel Corporation
>> http://blog.ffwll.ch



-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch


More information about the dri-devel mailing list