Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1270254 > unrolled thread
| Started by | Liviu Dudau <Liviu.Dudau@arm.com> |
|---|---|
| First post | 2015-11-16 15:50 +0100 |
| Last post | 2015-11-16 18:00 +0100 |
| Articles | 7 — 3 participants |
Back to article view | Back to linux.kernel
[PATCH 0/2] Improve drm_of_component_probe() and move rockchip to use it Liviu Dudau <Liviu.Dudau@arm.com> - 2015-11-16 15:50 +0100
[PATCH 2/2] drm/rockchip: Convert the probe function to the generic drm_of_component_probe() Liviu Dudau <Liviu.Dudau@arm.com> - 2015-11-16 15:50 +0100
Re: [PATCH 2/2] drm/rockchip: Convert the probe function to the generic drm_of_component_probe() Russell King - ARM Linux <linux@arm.linux.org.uk> - 2015-11-16 17:40 +0100
Re: [PATCH 2/2] drm/rockchip: Convert the probe function to the generic drm_of_component_probe() Liviu Dudau <Liviu.Dudau@arm.com> - 2015-11-16 18:00 +0100
Re: [PATCH 2/2] drm/rockchip: Convert the probe function to the generic drm_of_component_probe() Heiko Stübner <heiko@sntech.de> - 2015-11-16 18:10 +0100
Re: [PATCH 0/2] Improve drm_of_component_probe() and move rockchip to use it Heiko Stübner <heiko@sntech.de> - 2015-11-16 17:10 +0100
Re: [PATCH 0/2] Improve drm_of_component_probe() and move rockchip to use it Liviu Dudau <Liviu.Dudau@arm.com> - 2015-11-16 18:00 +0100
| From | Liviu Dudau <Liviu.Dudau@arm.com> |
|---|---|
| Date | 2015-11-16 15:50 +0100 |
| Subject | [PATCH 0/2] Improve drm_of_component_probe() and move rockchip to use it |
| Message-ID | <qvtgt-6H-3@gated-at.bofh.it> |
Hello, When I have introduced the drm_of_component_probe() function I have managed to break rockchip's DRM driver as the compare_of() function had to match both local crtc ports and remote encoder ones. As suggested by Russell King, I have now enhanced the drm_of_component_probe() function to take two comparison functions, and converted (again) rockchip driver to use it. I would really like to get some Tested-By this time if possible from IMX, Armada and Rockchip developers as I lack hardware to do that myself. The only thing not implemented from Russell's suggestion list is the renaming of the function into drm_kms_component_probe(). Best regards, Liviu Liviu Dudau (2): drm: Improve drm_of_component_probe() to correctly handle ports and remote ports. drm/rockchip: Convert the probe function to the generic drm_of_component_probe() drivers/gpu/drm/armada/armada_drv.c | 3 +- drivers/gpu/drm/drm_of.c | 23 +++++-- drivers/gpu/drm/imx/imx-drm-core.c | 3 +- drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 98 ++++++----------------------- include/drm/drm_of.h | 6 +- 5 files changed, 44 insertions(+), 89 deletions(-) -- 2.6.0 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [next] | [standalone]
| From | Liviu Dudau <Liviu.Dudau@arm.com> |
|---|---|
| Date | 2015-11-16 15:50 +0100 |
| Subject | [PATCH 2/2] drm/rockchip: Convert the probe function to the generic drm_of_component_probe() |
| Message-ID | <qvtgv-6H-55@gated-at.bofh.it> |
| In reply to | #1270254 |
Take two: Initial attempt to convert rockchip to drm_of_component_probe()
missed the difference between ports and encoders when using the
compare_of() function. Now that drm_of_component_probe() has been enhanced,
let's try again the conversion.
Signed-off-by: Liviu Dudau <Liviu.Dudau@arm.com>
---
drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 98 ++++++-----------------------
1 file changed, 18 insertions(+), 80 deletions(-)
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index f22e1e1..581e98c 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -19,6 +19,7 @@
#include <drm/drmP.h>
#include <drm/drm_crtc_helper.h>
#include <drm/drm_fb_helper.h>
+#include <drm/drm_of.h>
#include <linux/dma-mapping.h>
#include <linux/pm_runtime.h>
#include <linux/module.h>
@@ -411,36 +412,6 @@ int rockchip_drm_encoder_get_mux_id(struct device_node *node,
}
EXPORT_SYMBOL_GPL(rockchip_drm_encoder_get_mux_id);
-static int compare_of(struct device *dev, void *data)
-{
- struct device_node *np = data;
-
- return dev->of_node == np;
-}
-
-static void rockchip_add_endpoints(struct device *dev,
- struct component_match **match,
- struct device_node *port)
-{
- struct device_node *ep, *remote;
-
- for_each_child_of_node(port, ep) {
- remote = of_graph_get_remote_port_parent(ep);
- if (!remote || !of_device_is_available(remote)) {
- of_node_put(remote);
- continue;
- } else if (!of_device_is_available(remote->parent)) {
- dev_warn(dev, "parent device of %s is not available\n",
- remote->full_name);
- of_node_put(remote);
- continue;
- }
-
- component_match_add(dev, match, compare_of, remote);
- of_node_put(remote);
- }
-}
-
static int rockchip_drm_bind(struct device *dev)
{
struct drm_device *drm;
@@ -481,63 +452,30 @@ static const struct component_master_ops rockchip_drm_ops = {
.unbind = rockchip_drm_unbind,
};
-static int rockchip_drm_platform_probe(struct platform_device *pdev)
+static int compare_port(struct device *dev, void *data)
{
- struct device *dev = &pdev->dev;
- struct component_match *match = NULL;
- struct device_node *np = dev->of_node;
- struct device_node *port;
- int i;
+ struct device_node *np = data;
- if (!np)
- return -ENODEV;
- /*
- * Bind the crtc ports first, so that
- * drm_of_find_possible_crtcs called from encoder .bind callbacks
- * works as expected.
- */
- for (i = 0;; i++) {
- port = of_parse_phandle(np, "ports", i);
- if (!port)
- break;
-
- if (!of_device_is_available(port->parent)) {
- of_node_put(port);
- continue;
- }
+ return dev->parent->of_node == np;
+}
- component_match_add(dev, &match, compare_of, port->parent);
- of_node_put(port);
- }
+static int compare_encoder(struct device *dev, void *data)
+{
+ struct device_node *np = data;
- if (i == 0) {
- dev_err(dev, "missing 'ports' property\n");
- return -ENODEV;
- }
+ return dev->of_node == np;
+}
- if (!match) {
- dev_err(dev, "No available vop found for display-subsystem.\n");
- return -ENODEV;
- }
- /*
- * For each bound crtc, bind the encoders attached to its
- * remote endpoint.
- */
- for (i = 0;; i++) {
- port = of_parse_phandle(np, "ports", i);
- if (!port)
- break;
-
- if (!of_device_is_available(port->parent)) {
- of_node_put(port);
- continue;
- }
+static int rockchip_drm_platform_probe(struct platform_device *pdev)
+{
+ int ret = drm_of_component_probe(&pdev->dev, compare_port,
+ compare_encoder, &rockchip_drm_ops);
- rockchip_add_endpoints(dev, &match, port);
- of_node_put(port);
- }
+ /* keep compatibility with old code that was returning -ENODEV */
+ if (ret == -EINVAL)
+ return -ENODEV;
- return component_master_add_with_match(dev, &rockchip_drm_ops, match);
+ return ret;
}
static int rockchip_drm_platform_remove(struct platform_device *pdev)
--
2.6.0
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Russell King - ARM Linux <linux@arm.linux.org.uk> |
|---|---|
| Date | 2015-11-16 17:40 +0100 |
| Subject | Re: [PATCH 2/2] drm/rockchip: Convert the probe function to the generic drm_of_component_probe() |
| Message-ID | <qvuYW-1eV-25@gated-at.bofh.it> |
| In reply to | #1270264 |
I've tweaked your patch to make the above (buggy) change a little clearer.
On Mon, Nov 16, 2015 at 02:44:53PM +0000, Liviu Dudau wrote:
> - for (i = 0;; i++) {
> - port = of_parse_phandle(np, "ports", i);
> - if (!port)
> - break;
> -
> - if (!of_device_is_available(port->parent)) {
> - of_node_put(port);
> - continue;
> - }
>
> - component_match_add(dev, &match, compare_of, port->parent);
> - of_node_put(port);
> - }
> -static int compare_of(struct device *dev, void *data)
> -{
> - struct device_node *np = data;
> -
> - return dev->of_node == np;
> -}
The original above passes port->parent to component_match_add(). This
means 'np' in the above compare_of() function is 'port->parent'.
This means the above comparison is effectively:
dev->of_node == port->parent
The generic code instead does this:
component_match_add(dev, &match, compare_of, port);
So what we get in the comparison function is 'port' rather than
'port->parent':
> +static int compare_port(struct device *dev, void *data)
> {
> + struct device_node *np = data;
> + return dev->parent->of_node == np;
> +}
which means the comparison is:
dev->parent->of_node == port
which is a different comparison from the above.
You instead want this to be:
return dev->of_node == np->parent;
Heiko, please test the above change to compare_port() - I think you'll
find that will fix your issue.
Thanks.
--
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Liviu Dudau <Liviu.Dudau@arm.com> |
|---|---|
| Date | 2015-11-16 18:00 +0100 |
| Subject | Re: [PATCH 2/2] drm/rockchip: Convert the probe function to the generic drm_of_component_probe() |
| Message-ID | <qvvii-1lM-25@gated-at.bofh.it> |
| In reply to | #1270345 |
On Mon, Nov 16, 2015 at 04:30:16PM +0000, Russell King - ARM Linux wrote:
> I've tweaked your patch to make the above (buggy) change a little clearer.
>
> On Mon, Nov 16, 2015 at 02:44:53PM +0000, Liviu Dudau wrote:
> > - for (i = 0;; i++) {
> > - port = of_parse_phandle(np, "ports", i);
> > - if (!port)
> > - break;
> > -
> > - if (!of_device_is_available(port->parent)) {
> > - of_node_put(port);
> > - continue;
> > - }
> >
> > - component_match_add(dev, &match, compare_of, port->parent);
> > - of_node_put(port);
> > - }
>
> > -static int compare_of(struct device *dev, void *data)
> > -{
> > - struct device_node *np = data;
> > -
> > - return dev->of_node == np;
> > -}
>
> The original above passes port->parent to component_match_add(). This
> means 'np' in the above compare_of() function is 'port->parent'.
>
> This means the above comparison is effectively:
>
> dev->of_node == port->parent
>
> The generic code instead does this:
>
> component_match_add(dev, &match, compare_of, port);
>
> So what we get in the comparison function is 'port' rather than
> 'port->parent':
>
> > +static int compare_port(struct device *dev, void *data)
> > {
> > + struct device_node *np = data;
> > + return dev->parent->of_node == np;
> > +}
>
> which means the comparison is:
>
> dev->parent->of_node == port
>
> which is a different comparison from the above.
>
> You instead want this to be:
>
> return dev->of_node == np->parent;
>
> Heiko, please test the above change to compare_port() - I think you'll
> find that will fix your issue.
Sorry, I admit I'm not very good at doing patches without being able
to test them. :(
Thanks for helping on this!
Liviu
>
> Thanks.
>
> --
> FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
> according to speedtest.net.
>
--
====================
| I would like to |
| fix the world, |
| but they're not |
| giving me the |
\ source code! /
---------------
¯\_(ツ)_/¯
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Heiko Stübner <heiko@sntech.de> |
|---|---|
| Date | 2015-11-16 18:10 +0100 |
| Subject | Re: [PATCH 2/2] drm/rockchip: Convert the probe function to the generic drm_of_component_probe() |
| Message-ID | <qvvrY-1EC-35@gated-at.bofh.it> |
| In reply to | #1270377 |
Am Montag, 16. November 2015, 16:52:06 schrieb Liviu Dudau:
> On Mon, Nov 16, 2015 at 04:30:16PM +0000, Russell King - ARM Linux wrote:
> > I've tweaked your patch to make the above (buggy) change a little clearer.
> >
> > On Mon, Nov 16, 2015 at 02:44:53PM +0000, Liviu Dudau wrote:
> > > - for (i = 0;; i++) {
> > > - port = of_parse_phandle(np, "ports", i);
> > > - if (!port)
> > > - break;
> > > -
> > > - if (!of_device_is_available(port->parent)) {
> > > - of_node_put(port);
> > > - continue;
> > > - }
> > >
> > > - component_match_add(dev, &match, compare_of, port->parent);
> > > - of_node_put(port);
> > > - }
> > >
> > > -static int compare_of(struct device *dev, void *data)
> > > -{
> > > - struct device_node *np = data;
> > > -
> > > - return dev->of_node == np;
> > > -}
> >
> > The original above passes port->parent to component_match_add(). This
> > means 'np' in the above compare_of() function is 'port->parent'.
> >
> > This means the above comparison is effectively:
> > dev->of_node == port->parent
> >
> > The generic code instead does this:
> > component_match_add(dev, &match, compare_of, port);
> >
> > So what we get in the comparison function is 'port' rather than
> >
> > 'port->parent':
> > > +static int compare_port(struct device *dev, void *data)
> > >
> > > {
> > >
> > > + struct device_node *np = data;
> > > + return dev->parent->of_node == np;
> > > +}
> >
> > which means the comparison is:
> > dev->parent->of_node == port
> >
> > which is a different comparison from the above.
> >
> > You instead want this to be:
> > return dev->of_node == np->parent;
> >
> > Heiko, please test the above change to compare_port() - I think you'll
> > find that will fix your issue.
>
> Sorry, I admit I'm not very good at doing patches without being able
> to test them. :(
>
> Thanks for helping on this!
Russell's hint was correct. With the compare function changed like he pointed
out, I again get a working display with your patches :-)
So, thanks Russell for spotting this.
Heiko
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Heiko Stübner <heiko@sntech.de> |
|---|---|
| Date | 2015-11-16 17:10 +0100 |
| Message-ID | <qvuvU-151-5@gated-at.bofh.it> |
| In reply to | #1270254 |
Hi Liviu, Am Montag, 16. November 2015, 14:44:51 schrieb Liviu Dudau: > When I have introduced the drm_of_component_probe() function I have managed > to break rockchip's DRM driver as the compare_of() function had to match > both local crtc ports and remote encoder ones. As suggested by Russell > King, I have now enhanced the drm_of_component_probe() function to take two > comparison functions, and converted (again) rockchip driver to use it. > > I would really like to get some Tested-By this time if possible from IMX, > Armada and Rockchip developers as I lack hardware to do that myself. > > The only thing not implemented from Russell's suggestion list is the > renaming of the function into drm_kms_component_probe(). with these patches applied I loose the display on my rk3288. A bit of dumb debug-output shows that the compare function does seem to do strange things: [ 1.020476] [drm] Initialized drm 1.1.0 20060810 [ 1.025943] drm_of_component_probe: adding port /vop@ff940000/port [ 1.032225] drm_of_component_probe: adding port /vop@ff930000/port [ 1.038421] drm_of_component_probe: adding encoder /hdmi@ff980000 [ 1.044535] drm_of_component_probe: adding encoder /edp@ff970000 [ 1.050562] drm_of_component_probe: adding encoder /hdmi@ff980000 [ 1.056663] drm_of_component_probe: adding encoder /edp@ff970000 ---- Columns: dev->parent / dev comparing dev->parent->of_node with np [ 1.062683] compare_port: platform/ff980000.hdmi comparing NULL with /vop@ff940000/port [ 1.071017] compare_port: platform/ff980000.hdmi comparing NULL with /vop@ff940000/port [ 1.079024] compare_port: platform/ff930000.vop comparing NULL with /vop@ff940000/port [ 1.087117] compare_port: platform/ff980000.hdmi comparing NULL with /vop@ff940000/port [ 1.095130] compare_port: platform/ff930000.vop comparing NULL with /vop@ff940000/port [ 1.103054] compare_port: platform/ff940000.vop comparing NULL with /vop@ff940000/port [ 1.111553] panel_regulator: supplied by vcc33_sys I need to dig deeper to find out what's happening there, but maybe you already have some idea in the meantime :-) Thanks Heiko -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Liviu Dudau <Liviu.Dudau@arm.com> |
|---|---|
| Date | 2015-11-16 18:00 +0100 |
| Subject | Re: [PATCH 0/2] Improve drm_of_component_probe() and move rockchip to use it |
| Message-ID | <qvvih-1lM-1@gated-at.bofh.it> |
| In reply to | #1270316 |
On Mon, Nov 16, 2015 at 05:07:17PM +0100, Heiko Stübner wrote:
> Hi Liviu,
>
> Am Montag, 16. November 2015, 14:44:51 schrieb Liviu Dudau:
> > When I have introduced the drm_of_component_probe() function I have managed
> > to break rockchip's DRM driver as the compare_of() function had to match
> > both local crtc ports and remote encoder ones. As suggested by Russell
> > King, I have now enhanced the drm_of_component_probe() function to take two
> > comparison functions, and converted (again) rockchip driver to use it.
> >
> > I would really like to get some Tested-By this time if possible from IMX,
> > Armada and Rockchip developers as I lack hardware to do that myself.
> >
> > The only thing not implemented from Russell's suggestion list is the
> > renaming of the function into drm_kms_component_probe().
>
> with these patches applied I loose the display on my rk3288. A bit of dumb
> debug-output shows that the compare function does seem to do strange things:
>
> [ 1.020476] [drm] Initialized drm 1.1.0 20060810
> [ 1.025943] drm_of_component_probe: adding port /vop@ff940000/port
> [ 1.032225] drm_of_component_probe: adding port /vop@ff930000/port
> [ 1.038421] drm_of_component_probe: adding encoder /hdmi@ff980000
> [ 1.044535] drm_of_component_probe: adding encoder /edp@ff970000
> [ 1.050562] drm_of_component_probe: adding encoder /hdmi@ff980000
> [ 1.056663] drm_of_component_probe: adding encoder /edp@ff970000
>
> ---- Columns: dev->parent / dev comparing dev->parent->of_node with np
>
> [ 1.062683] compare_port: platform/ff980000.hdmi comparing NULL with /vop@ff940000/port
> [ 1.071017] compare_port: platform/ff980000.hdmi comparing NULL with /vop@ff940000/port
> [ 1.079024] compare_port: platform/ff930000.vop comparing NULL with /vop@ff940000/port
> [ 1.087117] compare_port: platform/ff980000.hdmi comparing NULL with /vop@ff940000/port
> [ 1.095130] compare_port: platform/ff930000.vop comparing NULL with /vop@ff940000/port
> [ 1.103054] compare_port: platform/ff940000.vop comparing NULL with /vop@ff940000/port
> [ 1.111553] panel_regulator: supplied by vcc33_sys
>
>
> I need to dig deeper to find out what's happening there, but maybe you
> already have some idea in the meantime :-)
Did I got the content of the compare_{port,encoder}() functions the wrong way around?
Best regards,
Liviu
>
>
> Thanks
> Heiko
>
--
====================
| I would like to |
| fix the world, |
| but they're not |
| giving me the |
\ source code! /
---------------
¯\_(ツ)_/¯
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web