From: Chris Ruehl <chris.ruehl@gtsys.com.hk>
To: Philipp Zabel <p.zabel@pengutronix.de>, dri-devel@lists.freedesktop.org
Cc: "David Airlie" <airlied@linux.ie>,
stable@vger.kernel.org, "Fabio Estevam" <festevam@gmail.com>,
"Marcel Ziswiler" <marcel.ziswiler@toradex.com>,
"Fabio Estevam" <fabio.estevam@nxp.com>,
"Lothar Waßmann" <lw@karo-electronics.de>,
"Dennis Gilmore" <dennis@ausil.us>,
kernel@pengutronix.de
Subject: Re: [PATCH v2] drm/imx: Match imx-ipuv3-crtc components using device node in platform data
Date: Sat, 21 May 2016 12:28:20 +0800 [thread overview]
Message-ID: <573FE3E4.9070400@gtsys.com.hk> (raw)
In-Reply-To: <1463576200-21151-1-git-send-email-p.zabel@pengutronix.de>
Hi,
On Wednesday, May 18, 2016 08:56 PM, Philipp Zabel wrote:
> The component master driver imx-drm-core matches component devices using
> their of_node. Since commit 950b410dd1ab ("gpu: ipu-v3: Fix imx-ipuv3-crtc
> module autoloading"), the imx-ipuv3-crtc dev->of_node is not set during
> probing. Before that, of_node was set and caused an of: modalias to be
> used instead of the platform: modalias, which broke module autoloading.
>
> On the other hand, if dev->of_node is not set yet when the imx-ipuv3-crtc
> probe function calls component_add, component matching in imx-drm-core
> fails. While dev->of_node will be set once the next component tries to
> bring up the component master, imx-drm-core component binding will never
> succeed if one of the crtc devices is probed last.
>
> Add of_node to the component platform data and match against the
> pdata->of_node instead of dev->of_node in imx-drm-core to work around
> this problem.
>
> Cc: <stable@vger.kernel.org> # 4.4.x
> Fixes: 950b410dd1ab ("gpu: ipu-v3: Fix imx-ipuv3-crtc module autoloading")
> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
> ---
> Changes since v1:
> - Also set the crtc->port to the of_node from platform data
> ---
> drivers/gpu/drm/imx/imx-drm-core.c | 8 ++++++++
> drivers/gpu/drm/imx/ipuv3-crtc.c | 2 +-
> drivers/gpu/ipu-v3/ipu-common.c | 5 +++--
> include/video/imx-ipu-v3.h | 2 ++
> 4 files changed, 14 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/imx/imx-drm-core.c b/drivers/gpu/drm/imx/imx-drm-core.c
> index e26dcde..05229b9 100644
> --- a/drivers/gpu/drm/imx/imx-drm-core.c
> +++ b/drivers/gpu/drm/imx/imx-drm-core.c
> @@ -25,6 +25,7 @@
> #include <drm/drm_fb_cma_helper.h>
> #include <drm/drm_plane_helper.h>
> #include <drm/drm_of.h>
> +#include <video/imx-ipu-v3.h>
>
> #include "imx-drm.h"
>
> @@ -444,6 +445,13 @@ static int compare_of(struct device *dev, void *data)
> {
> struct device_node *np = data;
>
> + /* Special case for DI, dev->of_node may not be set yet */
> + if (strcmp(dev->driver->name, "imx-ipuv3-crtc") == 0) {
> + struct ipu_client_platformdata *pdata = dev->platform_data;
> +
> + return pdata->of_node == np;
> + }
> +
> /* Special case for LDB, one device for two channels */
> if (of_node_cmp(np->name, "lvds-channel") == 0) {
> np = of_get_parent(np);
> diff --git a/drivers/gpu/drm/imx/ipuv3-crtc.c b/drivers/gpu/drm/imx/ipuv3-crtc.c
> index dee8e8b..b2c30b8 100644
> --- a/drivers/gpu/drm/imx/ipuv3-crtc.c
> +++ b/drivers/gpu/drm/imx/ipuv3-crtc.c
> @@ -473,7 +473,7 @@ static int ipu_crtc_init(struct ipu_crtc *ipu_crtc,
>
> ret = imx_drm_add_crtc(drm, &ipu_crtc->base, &ipu_crtc->imx_crtc,
> &ipu_crtc->plane[0]->base, &ipu_crtc_helper_funcs,
> - ipu_crtc->dev->of_node);
> + pdata->of_node);
> if (ret) {
> dev_err(ipu_crtc->dev, "adding crtc failed with %d.\n", ret);
> goto err_put_resources;
> diff --git a/drivers/gpu/ipu-v3/ipu-common.c b/drivers/gpu/ipu-v3/ipu-common.c
> index abb98c7..99dcacf 100644
> --- a/drivers/gpu/ipu-v3/ipu-common.c
> +++ b/drivers/gpu/ipu-v3/ipu-common.c
> @@ -997,7 +997,7 @@ struct ipu_platform_reg {
> };
>
> /* These must be in the order of the corresponding device tree port nodes */
> -static const struct ipu_platform_reg client_reg[] = {
> +static struct ipu_platform_reg client_reg[] = {
> {
> .pdata = {
> .csi = 0,
> @@ -1048,7 +1048,7 @@ static int ipu_add_client_devices(struct ipu_soc *ipu, unsigned long ipu_base)
> mutex_unlock(&ipu_client_id_mutex);
>
> for (i = 0; i < ARRAY_SIZE(client_reg); i++) {
> - const struct ipu_platform_reg *reg = &client_reg[i];
> + struct ipu_platform_reg *reg = &client_reg[i];
> struct platform_device *pdev;
> struct device_node *of_node;
>
> @@ -1070,6 +1070,7 @@ static int ipu_add_client_devices(struct ipu_soc *ipu, unsigned long ipu_base)
>
> pdev->dev.parent = dev;
>
> + reg->pdata.of_node = of_node;
> ret = platform_device_add_data(pdev, ®->pdata,
> sizeof(reg->pdata));
> if (!ret)
> diff --git a/include/video/imx-ipu-v3.h b/include/video/imx-ipu-v3.h
> index ad66589..3a2a794 100644
> --- a/include/video/imx-ipu-v3.h
> +++ b/include/video/imx-ipu-v3.h
> @@ -16,6 +16,7 @@
> #include <linux/videodev2.h>
> #include <linux/bitmap.h>
> #include <linux/fb.h>
> +#include <linux/of.h>
> #include <media/v4l2-mediabus.h>
> #include <video/videomode.h>
>
> @@ -345,6 +346,7 @@ struct ipu_client_platformdata {
> int dc;
> int dp;
> int dma[2];
> + struct device_node *of_node;
> };
>
> #endif /* __DRM_IPU_H__ */
>
Tested successfully against kernel 4.6
root@gtsir-a0fd:~# dmesg | grep hdmi
[ 2.288698] dwhdmi-imx 120000.hdmi: Detected HDMI controller 0x13:0xa:0xa0:0xc1
[ 2.307519] imx-drm display-subsystem: bound 120000.hdmi (ops dw_hdmi_imx_ops)
Tested-by: Chris Ruehl <chris.ruehl@gtsys.com.hk>
Thank you!
--
GTSYS Limited RFID Technology
9/F, Unit E, R07, Kwai Shing Industrial Building Phase 2,
42-46 Tai Lin Pai Road, Kwai Chung, N.T., Hong Kong
Tel (852) 9079 9521
Disclaimer: http://www.gtsys.com.hk/email/classified.html
prev parent reply other threads:[~2016-05-21 4:28 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-18 12:56 [PATCH v2] drm/imx: Match imx-ipuv3-crtc components using device node in platform data Philipp Zabel
2016-05-18 13:59 ` Fabio Estevam
2016-05-18 13:59 ` Lothar Waßmann
2016-05-20 12:13 ` [v2] " Heiko Schocher
2016-05-21 4:28 ` Chris Ruehl [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=573FE3E4.9070400@gtsys.com.hk \
--to=chris.ruehl@gtsys.com.hk \
--cc=airlied@linux.ie \
--cc=dennis@ausil.us \
--cc=dri-devel@lists.freedesktop.org \
--cc=fabio.estevam@nxp.com \
--cc=festevam@gmail.com \
--cc=kernel@pengutronix.de \
--cc=lw@karo-electronics.de \
--cc=marcel.ziswiler@toradex.com \
--cc=p.zabel@pengutronix.de \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).