| From 9cb18db0701f6b74f0c45c23ad767b3ebebe37f6 Mon Sep 17 00:00:00 2001 |
| From: Johan Hovold <johan@kernel.org> |
| Date: Fri, 29 Dec 2017 19:48:43 +0100 |
| Subject: video: fbdev: atmel_lcdfb: fix display-timings lookup |
| |
| From: Johan Hovold <johan@kernel.org> |
| |
| commit 9cb18db0701f6b74f0c45c23ad767b3ebebe37f6 upstream. |
| |
| Fix child-node lookup during probe, which ended up searching the whole |
| device tree depth-first starting at the parent rather than just matching |
| on its children. |
| |
| To make things worse, the parent display node was also prematurely |
| freed. |
| |
| Note that the display and timings node references are never put after a |
| successful dt-initialisation so the nodes would leak on later probe |
| deferrals and on driver unbind. |
| |
| Fixes: b985172b328a ("video: atmel_lcdfb: add device tree suport") |
| Cc: stable <stable@vger.kernel.org> # 3.13 |
| Cc: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> |
| Cc: Nicolas Ferre <nicolas.ferre@microchip.com> |
| Cc: Alexandre Belloni <alexandre.belloni@free-electrons.com> |
| Signed-off-by: Johan Hovold <johan@kernel.org> |
| Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/video/fbdev/atmel_lcdfb.c | 8 +++++++- |
| 1 file changed, 7 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/video/fbdev/atmel_lcdfb.c |
| +++ b/drivers/video/fbdev/atmel_lcdfb.c |
| @@ -1120,7 +1120,7 @@ static int atmel_lcdfb_of_init(struct at |
| goto put_display_node; |
| } |
| |
| - timings_np = of_find_node_by_name(display_np, "display-timings"); |
| + timings_np = of_get_child_by_name(display_np, "display-timings"); |
| if (!timings_np) { |
| dev_err(dev, "failed to find display-timings node\n"); |
| ret = -ENODEV; |
| @@ -1141,6 +1141,12 @@ static int atmel_lcdfb_of_init(struct at |
| fb_add_videomode(&fb_vm, &info->modelist); |
| } |
| |
| + /* |
| + * FIXME: Make sure we are not referencing any fields in display_np |
| + * and timings_np and drop our references to them before returning to |
| + * avoid leaking the nodes on probe deferral and driver unbind. |
| + */ |
| + |
| return 0; |
| |
| put_timings_node: |