On Fri, Sep 29, 2017 at 02:10:31PM +0200, Noralf Trønnes wrote: > > Den 29.09.2017 05.22, skrev Meghana Madhyastha: > >On Thu, Sep 28, 2017 at 06:02:27PM +0200, Noralf Trønnes wrote: > >>Den 28.09.2017 16.08, skrev Daniel Vetter: > >>>On Thu, Sep 28, 2017 at 02:44:34PM +0530, Meghana Madhyastha wrote: > >>>>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@xxxxxxxxx> > >>>>--- > >>>>Changes in v3: > >>>>-Change it back to a single patch from two patches in v2 > >>>> > >>>> drivers/gpu/drm/drm_of.c | 44 ++++++++++++++++++++++++++ > >>>> 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, 47 insertions(+), 42 deletions(-) > >>>> > >>>>diff --git a/drivers/gpu/drm/drm_of.c b/drivers/gpu/drm/drm_of.c > >>>>index 8dafbdf..d878d3a 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,46 @@ 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. > >>>>+ * > >>>>+ * Note: It is the responsibility of the caller to call put_device() when > >>>>+ * releasing the resource. > >>>>+ * > >>>>+ * 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); > >>>>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) > >>>Minor detail I missed: The dummy version for the #else here is missing. > >>>Not a problem for tinydrm, but might be an issue for a driver where > >>>CONFIG_OF is optional. > >>Yeah, we need a dummy version. tinydrm can in theory be used on non-DT > >>platforms. The only resource that isn't available there is backlight > >>since there is no platform or ACPI way of describing that dependency. > >> > >>Another problem I discovered when trying to compile this, is that if > >>DRM is builtin and LCD_CLASS_DEVICE is a module: > >> > >>drivers/gpu/drm/drm_of.c:292: undefined reference to > >>`of_find_backlight_by_node' > >> > >>I see that I solved this in tinydrm by just selecting > >>BACKLIGHT_LCD_SUPPORT and LCD_CLASS_DEVICE. I'm not aware of a way to > >>force LCD_CLASS_DEVICE to be builtin if DRM is builtin. > >> > >>Arnd fixed a similar type of dependecy in the repaper driver by forcing > >>repaper to be a module if necessary. To be honest, I don't know why his > >>fix works: > >>https://github.com/torvalds/linux/commit/8312a3fe84b96e30a010fa20f933606d976ac002 > >I didn't quite understand how we could use this fix for the current > >case. Isn't this specific to the repaper driver dependency ? > > This is the solution Daniel mentions: > > menuconfig DRM > tristate "Direct Rendering Manager (XFree86 4.1.0 and higher DRI > support)" > depends on (AGP || AGP=n) && !EMULATED_CMPXCHG && HAS_DMA > + depends on (LCD_CLASS_DEVICE || LCD_CLASS_DEVICE=n) I had tried this but it resulted in a recursive dependencies error. Regards, Meghana > > We also have another problem: CONFIG_OF=y && CONFIG_LCD_CLASS_DEVICE=n > That will result in a missing symbol error. > > You can try this change to include/linux/backlight.h: > > -#ifdef CONFIG_OF > +#if defined(CONFIG_OF) && IS_ENABLED(CONFIG_LCD_CLASS_DEVICE) > struct backlight_device *of_find_backlight_by_node(struct device_node > *node); > #else > static inline struct backlight_device * > of_find_backlight_by_node(struct device_node *node) > { > return NULL; > } > #endif > > This will need to be a patch of its own since it's another subsystem. > > You have to try the various kconfig variations to be sure, I'm no kconfig > expert. > CONFIG_OF=y/n, CONFIG_DRM=y/m, CONFIG_LCD_CLASS_DEVICE=y/m/n > > Noralf. Sure will try this. > >>Another way of solving this is to put the function in > >>drivers/gpu/drm/drm_backlight.c and add a DRM_BACKLIGHT konfig option > >>that does the selection. > >> > >>Noralf. > >> > >>>Otherwise I think this patch looks good. > >>>-Daniel > >>> > >>>>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); > >>>>-- > >>>>2.7.4 > >>>> > _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel