From fe6e7d1d52c6bcb25e2a214cbd32d5cc6df80f20 Mon Sep 17 00:00:00 2001
From: Robert Nelson <robertcnelson@gmail.com>
Date: Mon, 7 Apr 2014 10:31:46 -0500
Subject: [PATCH] cleanup: imx_drm patchset should be merged

Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
---
 patch.sh                                      |  42 -
 ...-convert-HDMI-clock-settings-to-tabu.patch | 305 ------
 ...-hdmi-clean-up-setting-CSC-registers.patch |  77 --
 ...-provide-register-modification-funct.patch | 341 -------
 ...imx-hdmi-clean-up-setting-of-vp_conf.patch |  98 --
 ...mx-hdmi-fix-CTS-N-setup-at-init-time.patch | 123 ---
 ...3-more-inteligent-DI-clock-selection.patch | 114 ---
 ...on-t-use-clk_round_rate-before-clk_s.patch |  62 --
 ...8-imx-drm-ipu-v3-more-clocking-fixes.patch | 453 ---------
 ...m-add-imx6-DT-configuration-for-HDMI.patch |  66 --
 ...nd-fix-imx6-DT-descriptions-for-v3-H.patch |  54 -
 ...core-sanitise-imx_drm_encoder_get_mu.patch | 135 ---
 ...core-use-array-instead-of-list-for-C.patch | 177 ----
 ...common-connector-mode-validation-fun.patch | 151 ---
 ...x-drm-simplify-setup-of-panel-format.patch | 183 ----
 ...vert-to-componentised-device-support.patch | 934 ------------------
 ...y-publishing-sysfs-connector-entries.patch |  71 --
 ...17-imx-drm-remove-separate-imx-fbdev.patch | 246 -----
 .../0018-imx-drm-remove-imx-fb.c.patch        | 123 ---
 ...e-supplied-drm_device-where-possible.patch | 206 ----
 ...core-provide-helper-function-to-pars.patch | 112 ---
 ...core-provide-common-connector-and-en.patch |  65 --
 ...m-initialise-drm-components-directly.patch | 591 -----------
 ...core-remove-imx_drm_connector-and-im.patch | 517 ----------
 ...core-get-rid-of-drm_mode_group_init_.patch |  39 -
 ...-imx-drm-imx-drm-core-kill-off-mutex.patch | 136 ---
 ...core-move-allocation-of-imxdrm-devic.patch | 110 ---
 ...mx-drm-imx-drm-core-various-cleanups.patch | 160 ---
 ...core-add-core-hotplug-connector-supp.patch |  91 --
 ...-add-hotplug-support-to-HDMI-compone.patch | 151 ---
 ...dts-imx6qdl-sabresd-Add-HDMI-support.patch |  57 --
 ...d-enable-hdmi-quad-has-to-force-edid.patch |  38 -
 32 files changed, 6028 deletions(-)
 delete mode 100644 patches/imx_drm/0001-imx-drm-imx-hdmi-convert-HDMI-clock-settings-to-tabu.patch
 delete mode 100644 patches/imx_drm/0002-imx-drm-imx-hdmi-clean-up-setting-CSC-registers.patch
 delete mode 100644 patches/imx_drm/0003-imx-drm-imx-hdmi-provide-register-modification-funct.patch
 delete mode 100644 patches/imx_drm/0004-imx-drm-imx-hdmi-clean-up-setting-of-vp_conf.patch
 delete mode 100644 patches/imx_drm/0005-imx-drm-imx-hdmi-fix-CTS-N-setup-at-init-time.patch
 delete mode 100644 patches/imx_drm/0006-imx-drm-ipu-v3-more-inteligent-DI-clock-selection.patch
 delete mode 100644 patches/imx_drm/0007-imx-drm-ipu-v3-don-t-use-clk_round_rate-before-clk_s.patch
 delete mode 100644 patches/imx_drm/0008-imx-drm-ipu-v3-more-clocking-fixes.patch
 delete mode 100644 patches/imx_drm/0009-imx-drm-add-imx6-DT-configuration-for-HDMI.patch
 delete mode 100644 patches/imx_drm/0010-imx-drm-update-and-fix-imx6-DT-descriptions-for-v3-H.patch
 delete mode 100644 patches/imx_drm/0011-imx-drm-imx-drm-core-sanitise-imx_drm_encoder_get_mu.patch
 delete mode 100644 patches/imx_drm/0012-imx-drm-imx-drm-core-use-array-instead-of-list-for-C.patch
 delete mode 100644 patches/imx_drm/0013-imx-drm-provide-common-connector-mode-validation-fun.patch
 delete mode 100644 patches/imx_drm/0014-imx-drm-simplify-setup-of-panel-format.patch
 delete mode 100644 patches/imx_drm/0015-imx-drm-convert-to-componentised-device-support.patch
 delete mode 100644 patches/imx_drm/0016-imx-drm-delay-publishing-sysfs-connector-entries.patch
 delete mode 100644 patches/imx_drm/0017-imx-drm-remove-separate-imx-fbdev.patch
 delete mode 100644 patches/imx_drm/0018-imx-drm-remove-imx-fb.c.patch
 delete mode 100644 patches/imx_drm/0019-imx-drm-use-supplied-drm_device-where-possible.patch
 delete mode 100644 patches/imx_drm/0020-imx-drm-imx-drm-core-provide-helper-function-to-pars.patch
 delete mode 100644 patches/imx_drm/0021-imx-drm-imx-drm-core-provide-common-connector-and-en.patch
 delete mode 100644 patches/imx_drm/0022-imx-drm-initialise-drm-components-directly.patch
 delete mode 100644 patches/imx_drm/0023-imx-drm-imx-drm-core-remove-imx_drm_connector-and-im.patch
 delete mode 100644 patches/imx_drm/0024-imx-drm-imx-drm-core-get-rid-of-drm_mode_group_init_.patch
 delete mode 100644 patches/imx_drm/0025-imx-drm-imx-drm-core-kill-off-mutex.patch
 delete mode 100644 patches/imx_drm/0026-imx-drm-imx-drm-core-move-allocation-of-imxdrm-devic.patch
 delete mode 100644 patches/imx_drm/0027-imx-drm-imx-drm-core-various-cleanups.patch
 delete mode 100644 patches/imx_drm/0028-imx-drm-imx-drm-core-add-core-hotplug-connector-supp.patch
 delete mode 100644 patches/imx_drm/0029-imx-drm-imx-hdmi-add-hotplug-support-to-HDMI-compone.patch
 delete mode 100644 patches/imx_drm_dts/0001-ARM-dts-imx6qdl-sabresd-Add-HDMI-support.patch
 delete mode 100644 patches/imx_drm_dts/0002-arm-dts-wandboard-enable-hdmi-quad-has-to-force-edid.patch

diff --git a/patch.sh b/patch.sh
index b6c5de91e..689eac42a 100644
--- a/patch.sh
+++ b/patch.sh
@@ -120,46 +120,6 @@ dts () {
 	${git} "${DIR}/patches/dts/0012-arm-dts-vf610-twr-Add-support-for-sdhc1.patch"
 }
 
-imx_drm () {
-	echo "dir: imx_drm"
-
-	${git} "${DIR}/patches/imx_drm/0001-imx-drm-imx-hdmi-convert-HDMI-clock-settings-to-tabu.patch"
-	${git} "${DIR}/patches/imx_drm/0002-imx-drm-imx-hdmi-clean-up-setting-CSC-registers.patch"
-	${git} "${DIR}/patches/imx_drm/0003-imx-drm-imx-hdmi-provide-register-modification-funct.patch"
-	${git} "${DIR}/patches/imx_drm/0004-imx-drm-imx-hdmi-clean-up-setting-of-vp_conf.patch"
-	${git} "${DIR}/patches/imx_drm/0005-imx-drm-imx-hdmi-fix-CTS-N-setup-at-init-time.patch"
-	${git} "${DIR}/patches/imx_drm/0006-imx-drm-ipu-v3-more-inteligent-DI-clock-selection.patch"
-	${git} "${DIR}/patches/imx_drm/0007-imx-drm-ipu-v3-don-t-use-clk_round_rate-before-clk_s.patch"
-	${git} "${DIR}/patches/imx_drm/0008-imx-drm-ipu-v3-more-clocking-fixes.patch"
-	${git} "${DIR}/patches/imx_drm/0009-imx-drm-add-imx6-DT-configuration-for-HDMI.patch"
-	${git} "${DIR}/patches/imx_drm/0010-imx-drm-update-and-fix-imx6-DT-descriptions-for-v3-H.patch"
-	${git} "${DIR}/patches/imx_drm/0011-imx-drm-imx-drm-core-sanitise-imx_drm_encoder_get_mu.patch"
-	${git} "${DIR}/patches/imx_drm/0012-imx-drm-imx-drm-core-use-array-instead-of-list-for-C.patch"
-	${git} "${DIR}/patches/imx_drm/0013-imx-drm-provide-common-connector-mode-validation-fun.patch"
-	${git} "${DIR}/patches/imx_drm/0014-imx-drm-simplify-setup-of-panel-format.patch"
-	${git} "${DIR}/patches/imx_drm/0015-imx-drm-convert-to-componentised-device-support.patch"
-	${git} "${DIR}/patches/imx_drm/0016-imx-drm-delay-publishing-sysfs-connector-entries.patch"
-	${git} "${DIR}/patches/imx_drm/0017-imx-drm-remove-separate-imx-fbdev.patch"
-	${git} "${DIR}/patches/imx_drm/0018-imx-drm-remove-imx-fb.c.patch"
-	${git} "${DIR}/patches/imx_drm/0019-imx-drm-use-supplied-drm_device-where-possible.patch"
-	${git} "${DIR}/patches/imx_drm/0020-imx-drm-imx-drm-core-provide-helper-function-to-pars.patch"
-	${git} "${DIR}/patches/imx_drm/0021-imx-drm-imx-drm-core-provide-common-connector-and-en.patch"
-	${git} "${DIR}/patches/imx_drm/0022-imx-drm-initialise-drm-components-directly.patch"
-	${git} "${DIR}/patches/imx_drm/0023-imx-drm-imx-drm-core-remove-imx_drm_connector-and-im.patch"
-	${git} "${DIR}/patches/imx_drm/0024-imx-drm-imx-drm-core-get-rid-of-drm_mode_group_init_.patch"
-	${git} "${DIR}/patches/imx_drm/0025-imx-drm-imx-drm-core-kill-off-mutex.patch"
-	${git} "${DIR}/patches/imx_drm/0026-imx-drm-imx-drm-core-move-allocation-of-imxdrm-devic.patch"
-	${git} "${DIR}/patches/imx_drm/0027-imx-drm-imx-drm-core-various-cleanups.patch"
-	${git} "${DIR}/patches/imx_drm/0028-imx-drm-imx-drm-core-add-core-hotplug-connector-supp.patch"
-	${git} "${DIR}/patches/imx_drm/0029-imx-drm-imx-hdmi-add-hotplug-support-to-HDMI-compone.patch"
-}
-
-imx_drm_dts () {
-	echo "dir: imx_drm_dts"
-	${git} "${DIR}/patches/imx_drm_dts/0001-ARM-dts-imx6qdl-sabresd-Add-HDMI-support.patch"
-	${git} "${DIR}/patches/imx_drm_dts/0002-arm-dts-wandboard-enable-hdmi-quad-has-to-force-edid.patch"
-}
-
 imx_video_staging () {
 	echo "dir: imx_video_staging"
 	${git} "${DIR}/patches/imx_video_staging/0001-ARM-dts-mx6qdl-Add-HDMI-support.patch"
@@ -237,8 +197,6 @@ drivers
 clock
 dts
 
-#imx_drm
-#imx_drm_dts
 #imx_video_staging
 omap_sprz319_erratum
 
diff --git a/patches/imx_drm/0001-imx-drm-imx-hdmi-convert-HDMI-clock-settings-to-tabu.patch b/patches/imx_drm/0001-imx-drm-imx-hdmi-convert-HDMI-clock-settings-to-tabu.patch
deleted file mode 100644
index 5c9a1a98f..000000000
--- a/patches/imx_drm/0001-imx-drm-imx-hdmi-convert-HDMI-clock-settings-to-tabu.patch
+++ /dev/null
@@ -1,305 +0,0 @@
-From 3e46f15211fc92812555dac5af765f88b0bfafbd Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Mon, 4 Nov 2013 11:24:00 +0000
-Subject: [PATCH 01/67] imx-drm: imx-hdmi: convert HDMI clock settings to
- tabular form
-
-Rather than having large if() and switch() statements, provide a table
-to look up the register settings for various clock rates.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/imx-hdmi.c | 250 ++++++++++++++-----------------------
- 1 file changed, 95 insertions(+), 155 deletions(-)
-
-diff --git a/drivers/staging/imx-drm/imx-hdmi.c b/drivers/staging/imx-drm/imx-hdmi.c
-index 62ce0e8..cb316bf 100644
---- a/drivers/staging/imx-drm/imx-hdmi.c
-+++ b/drivers/staging/imx-drm/imx-hdmi.c
-@@ -806,19 +806,94 @@ static void imx_hdmi_phy_sel_interface_control(struct imx_hdmi *hdmi, u8 enable)
- 			 HDMI_PHY_CONF0_SELDIPIF_MASK);
- }
- 
-+enum {
-+	RES_8,
-+	RES_10,
-+	RES_12,
-+	RES_MAX,
-+};
-+
-+struct mpll_config {
-+	unsigned long mpixelclock;
-+	struct {
-+		u16 cpce;
-+		u16 gmp;
-+	} res[RES_MAX];
-+};
-+
-+static const struct mpll_config mpll_config[] = {
-+	{
-+		45250000, {
-+			{ 0x01e0, 0x0000 },
-+			{ 0x21e1, 0x0000 },
-+			{ 0x41e2, 0x0000 }
-+		},
-+	}, {
-+		92500000, {
-+			{ 0x0140, 0x0005 },
-+			{ 0x2141, 0x0005 },
-+			{ 0x4142, 0x0005 },
-+		},
-+	}, {
-+		148500000, {
-+			{ 0x00a0, 0x000a },
-+			{ 0x20a1, 0x000a },
-+			{ 0x40a2, 0x000a },
-+		},
-+	}, {
-+		~0UL, {
-+			{ 0x00a0, 0x000a },
-+			{ 0x2001, 0x000f },
-+			{ 0x4002, 0x000f },
-+		},
-+	}
-+};
-+
-+struct curr_ctrl {
-+	unsigned long mpixelclock;
-+	u16 curr[RES_MAX];
-+};
-+
-+static const struct curr_ctrl curr_ctrl[] = {
-+	/*	pixelclk     bpp8    bpp10   bpp12 */
-+	{
-+		 54000000, { 0x091c, 0x091c, 0x06dc },
-+	}, {
-+		 58400000, { 0x091c, 0x06dc, 0x06dc },
-+	}, {
-+		 72000000, { 0x06dc, 0x06dc, 0x091c },
-+	}, {
-+		 74250000, { 0x06dc, 0x0b5c, 0x091c },
-+	}, {
-+		118800000, { 0x091c, 0x091c, 0x06dc },
-+	}, {
-+		216000000, { 0x06dc, 0x0b5c, 0x091c },
-+	}
-+};
-+
- static int hdmi_phy_configure(struct imx_hdmi *hdmi, unsigned char prep,
- 			      unsigned char res, int cscon)
- {
-+	unsigned res_idx, i;
- 	u8 val, msec;
- 
--	/* color resolution 0 is 8 bit colour depth */
--	if (!res)
--		res = 8;
--
- 	if (prep)
- 		return -EINVAL;
--	else if (res != 8 && res != 12)
-+
-+	switch (res) {
-+	case 0:	/* color resolution 0 is 8 bit colour depth */
-+	case 8:
-+		res_idx = RES_8;
-+		break;
-+	case 10:
-+		res_idx = RES_10;
-+		break;
-+	case 12:
-+		res_idx = RES_12;
-+		break;
-+	default:
- 		return -EINVAL;
-+	}
- 
- 	/* Enable csc path */
- 	if (cscon)
-@@ -845,165 +920,30 @@ static int hdmi_phy_configure(struct imx_hdmi *hdmi, unsigned char prep,
- 			HDMI_PHY_I2CM_SLAVE_ADDR);
- 	hdmi_phy_test_clear(hdmi, 0);
- 
--	if (hdmi->hdmi_data.video_mode.mpixelclock <= 45250000) {
--		switch (res) {
--		case 8:
--			/* PLL/MPLL Cfg */
--			hdmi_phy_i2c_write(hdmi, 0x01e0, 0x06);
--			hdmi_phy_i2c_write(hdmi, 0x0000, 0x15);  /* GMPCTRL */
--			break;
--		case 10:
--			hdmi_phy_i2c_write(hdmi, 0x21e1, 0x06);
--			hdmi_phy_i2c_write(hdmi, 0x0000, 0x15);
--			break;
--		case 12:
--			hdmi_phy_i2c_write(hdmi, 0x41e2, 0x06);
--			hdmi_phy_i2c_write(hdmi, 0x0000, 0x15);
--			break;
--		default:
--			return -EINVAL;
--		}
--	} else if (hdmi->hdmi_data.video_mode.mpixelclock <= 92500000) {
--		switch (res) {
--		case 8:
--			hdmi_phy_i2c_write(hdmi, 0x0140, 0x06);
--			hdmi_phy_i2c_write(hdmi, 0x0005, 0x15);
--			break;
--		case 10:
--			hdmi_phy_i2c_write(hdmi, 0x2141, 0x06);
--			hdmi_phy_i2c_write(hdmi, 0x0005, 0x15);
--			break;
--		case 12:
--			hdmi_phy_i2c_write(hdmi, 0x4142, 0x06);
--			hdmi_phy_i2c_write(hdmi, 0x0005, 0x15);
--		default:
--			return -EINVAL;
--		}
--	} else if (hdmi->hdmi_data.video_mode.mpixelclock <= 148500000) {
--		switch (res) {
--		case 8:
--			hdmi_phy_i2c_write(hdmi, 0x00a0, 0x06);
--			hdmi_phy_i2c_write(hdmi, 0x000a, 0x15);
--			break;
--		case 10:
--			hdmi_phy_i2c_write(hdmi, 0x20a1, 0x06);
--			hdmi_phy_i2c_write(hdmi, 0x000a, 0x15);
--			break;
--		case 12:
--			hdmi_phy_i2c_write(hdmi, 0x40a2, 0x06);
--			hdmi_phy_i2c_write(hdmi, 0x000a, 0x15);
--		default:
--			return -EINVAL;
--		}
--	} else {
--		switch (res) {
--		case 8:
--			hdmi_phy_i2c_write(hdmi, 0x00a0, 0x06);
--			hdmi_phy_i2c_write(hdmi, 0x000a, 0x15);
-+	/* PLL/MPLL Cfg - always match on final entry */
-+	for (i = 0; i < ARRAY_SIZE(mpll_config) - 1; i++)
-+		if (hdmi->hdmi_data.video_mode.mpixelclock <=
-+		    mpll_config[i].mpixelclock)
- 			break;
--		case 10:
--			hdmi_phy_i2c_write(hdmi, 0x2001, 0x06);
--			hdmi_phy_i2c_write(hdmi, 0x000f, 0x15);
--			break;
--		case 12:
--			hdmi_phy_i2c_write(hdmi, 0x4002, 0x06);
--			hdmi_phy_i2c_write(hdmi, 0x000f, 0x15);
--		default:
--			return -EINVAL;
--		}
--	}
- 
--	if (hdmi->hdmi_data.video_mode.mpixelclock <= 54000000) {
--		switch (res) {
--		case 8:
--			hdmi_phy_i2c_write(hdmi, 0x091c, 0x10);  /* CURRCTRL */
--			break;
--		case 10:
--			hdmi_phy_i2c_write(hdmi, 0x091c, 0x10);
--			break;
--		case 12:
--			hdmi_phy_i2c_write(hdmi, 0x06dc, 0x10);
--			break;
--		default:
--			return -EINVAL;
--		}
--	} else if (hdmi->hdmi_data.video_mode.mpixelclock <= 58400000) {
--		switch (res) {
--		case 8:
--			hdmi_phy_i2c_write(hdmi, 0x091c, 0x10);
--			break;
--		case 10:
--			hdmi_phy_i2c_write(hdmi, 0x06dc, 0x10);
--			break;
--		case 12:
--			hdmi_phy_i2c_write(hdmi, 0x06dc, 0x10);
--			break;
--		default:
--			return -EINVAL;
--		}
--	} else if (hdmi->hdmi_data.video_mode.mpixelclock <= 72000000) {
--		switch (res) {
--		case 8:
--			hdmi_phy_i2c_write(hdmi, 0x06dc, 0x10);
--			break;
--		case 10:
--			hdmi_phy_i2c_write(hdmi, 0x06dc, 0x10);
--			break;
--		case 12:
--			hdmi_phy_i2c_write(hdmi, 0x091c, 0x10);
--			break;
--		default:
--			return -EINVAL;
--		}
--	} else if (hdmi->hdmi_data.video_mode.mpixelclock <= 74250000) {
--		switch (res) {
--		case 8:
--			hdmi_phy_i2c_write(hdmi, 0x06dc, 0x10);
--			break;
--		case 10:
--			hdmi_phy_i2c_write(hdmi, 0x0b5c, 0x10);
--			break;
--		case 12:
--			hdmi_phy_i2c_write(hdmi, 0x091c, 0x10);
--			break;
--		default:
--			return -EINVAL;
--		}
--	} else if (hdmi->hdmi_data.video_mode.mpixelclock <= 118800000) {
--		switch (res) {
--		case 8:
--			hdmi_phy_i2c_write(hdmi, 0x091c, 0x10);
--			break;
--		case 10:
--			hdmi_phy_i2c_write(hdmi, 0x091c, 0x10);
--			break;
--		case 12:
--			hdmi_phy_i2c_write(hdmi, 0x06dc, 0x10);
--			break;
--		default:
--			return -EINVAL;
--		}
--	} else if (hdmi->hdmi_data.video_mode.mpixelclock <= 216000000) {
--		switch (res) {
--		case 8:
--			hdmi_phy_i2c_write(hdmi, 0x06dc, 0x10);
--			break;
--		case 10:
--			hdmi_phy_i2c_write(hdmi, 0x0b5c, 0x10);
--			break;
--		case 12:
--			hdmi_phy_i2c_write(hdmi, 0x091c, 0x10);
-+	hdmi_phy_i2c_write(hdmi, mpll_config[i].res[res_idx].cpce, 0x06);
-+	hdmi_phy_i2c_write(hdmi, mpll_config[i].res[res_idx].gmp, 0x15);
-+
-+	for (i = 0; i < ARRAY_SIZE(curr_ctrl); i++)
-+		if (hdmi->hdmi_data.video_mode.mpixelclock <=
-+		    curr_ctrl[i].mpixelclock)
- 			break;
--		default:
--			return -EINVAL;
--		}
--	} else {
-+
-+	if (i >= ARRAY_SIZE(curr_ctrl)) {
- 		dev_err(hdmi->dev,
- 				"Pixel clock %d - unsupported by HDMI\n",
- 				hdmi->hdmi_data.video_mode.mpixelclock);
- 		return -EINVAL;
- 	}
- 
-+	/* CURRCTRL */
-+	hdmi_phy_i2c_write(hdmi, curr_ctrl[i].curr[res_idx], 0x10);
-+
- 	hdmi_phy_i2c_write(hdmi, 0x0000, 0x13);  /* PLLPHBYCTRL */
- 	hdmi_phy_i2c_write(hdmi, 0x0006, 0x17);
- 	/* RESISTANCE TERM 133Ohm Cfg */
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0002-imx-drm-imx-hdmi-clean-up-setting-CSC-registers.patch b/patches/imx_drm/0002-imx-drm-imx-hdmi-clean-up-setting-CSC-registers.patch
deleted file mode 100644
index b8c16e626..000000000
--- a/patches/imx_drm/0002-imx-drm-imx-hdmi-clean-up-setting-CSC-registers.patch
+++ /dev/null
@@ -1,77 +0,0 @@
-From c082f9d7151907da5230f1f20c8da83c9d3188bf Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Mon, 4 Nov 2013 12:10:40 +0000
-Subject: [PATCH 02/67] imx-drm: imx-hdmi: clean up setting CSC registers
-
-Rather than manually writing each register sequentially, we can use a
-loop to reduce the amount of code.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/imx-hdmi.c | 40 +++++++++++++-------------------------
- 1 file changed, 14 insertions(+), 26 deletions(-)
-
-diff --git a/drivers/staging/imx-drm/imx-hdmi.c b/drivers/staging/imx-drm/imx-hdmi.c
-index cb316bf..18de310 100644
---- a/drivers/staging/imx-drm/imx-hdmi.c
-+++ b/drivers/staging/imx-drm/imx-hdmi.c
-@@ -480,6 +480,7 @@ static int is_color_space_interpolation(struct imx_hdmi *hdmi)
- static void imx_hdmi_update_csc_coeffs(struct imx_hdmi *hdmi)
- {
- 	const u16 (*csc_coeff)[3][4] = &csc_coeff_default;
-+	unsigned i;
- 	u32 csc_scale = 1;
- 	u8 val;
- 
-@@ -498,32 +499,19 @@ static void imx_hdmi_update_csc_coeffs(struct imx_hdmi *hdmi)
- 		}
- 	}
- 
--	hdmi_writeb(hdmi, ((*csc_coeff)[0][0] & 0xff), HDMI_CSC_COEF_A1_LSB);
--	hdmi_writeb(hdmi, ((*csc_coeff)[0][0] >> 8), HDMI_CSC_COEF_A1_MSB);
--	hdmi_writeb(hdmi, ((*csc_coeff)[0][1] & 0xff), HDMI_CSC_COEF_A2_LSB);
--	hdmi_writeb(hdmi, ((*csc_coeff)[0][1] >> 8), HDMI_CSC_COEF_A2_MSB);
--	hdmi_writeb(hdmi, ((*csc_coeff)[0][2] & 0xff), HDMI_CSC_COEF_A3_LSB);
--	hdmi_writeb(hdmi, ((*csc_coeff)[0][2] >> 8), HDMI_CSC_COEF_A3_MSB);
--	hdmi_writeb(hdmi, ((*csc_coeff)[0][3] & 0xff), HDMI_CSC_COEF_A4_LSB);
--	hdmi_writeb(hdmi, ((*csc_coeff)[0][3] >> 8), HDMI_CSC_COEF_A4_MSB);
--
--	hdmi_writeb(hdmi, ((*csc_coeff)[1][0] & 0xff), HDMI_CSC_COEF_B1_LSB);
--	hdmi_writeb(hdmi, ((*csc_coeff)[1][0] >> 8), HDMI_CSC_COEF_B1_MSB);
--	hdmi_writeb(hdmi, ((*csc_coeff)[1][1] & 0xff), HDMI_CSC_COEF_B2_LSB);
--	hdmi_writeb(hdmi, ((*csc_coeff)[1][1] >> 8), HDMI_CSC_COEF_B2_MSB);
--	hdmi_writeb(hdmi, ((*csc_coeff)[1][2] & 0xff), HDMI_CSC_COEF_B3_LSB);
--	hdmi_writeb(hdmi, ((*csc_coeff)[1][2] >> 8), HDMI_CSC_COEF_B3_MSB);
--	hdmi_writeb(hdmi, ((*csc_coeff)[1][3] & 0xff), HDMI_CSC_COEF_B4_LSB);
--	hdmi_writeb(hdmi, ((*csc_coeff)[1][3] >> 8), HDMI_CSC_COEF_B4_MSB);
--
--	hdmi_writeb(hdmi, ((*csc_coeff)[2][0] & 0xff), HDMI_CSC_COEF_C1_LSB);
--	hdmi_writeb(hdmi, ((*csc_coeff)[2][0] >> 8), HDMI_CSC_COEF_C1_MSB);
--	hdmi_writeb(hdmi, ((*csc_coeff)[2][1] & 0xff), HDMI_CSC_COEF_C2_LSB);
--	hdmi_writeb(hdmi, ((*csc_coeff)[2][1] >> 8), HDMI_CSC_COEF_C2_MSB);
--	hdmi_writeb(hdmi, ((*csc_coeff)[2][2] & 0xff), HDMI_CSC_COEF_C3_LSB);
--	hdmi_writeb(hdmi, ((*csc_coeff)[2][2] >> 8), HDMI_CSC_COEF_C3_MSB);
--	hdmi_writeb(hdmi, ((*csc_coeff)[2][3] & 0xff), HDMI_CSC_COEF_C4_LSB);
--	hdmi_writeb(hdmi, ((*csc_coeff)[2][3] >> 8), HDMI_CSC_COEF_C4_MSB);
-+	/* The CSC registers are sequential, alternating MSB then LSB */
-+	for (i = 0; i < ARRAY_SIZE(csc_coeff_default[0]); i++) {
-+		u16 coeff_a = (*csc_coeff)[0][i];
-+		u16 coeff_b = (*csc_coeff)[1][i];
-+		u16 coeff_c = (*csc_coeff)[2][i];
-+
-+		hdmi_writeb(hdmi, coeff_a & 0xff, HDMI_CSC_COEF_A1_LSB + i * 2);
-+		hdmi_writeb(hdmi, coeff_a >> 8, HDMI_CSC_COEF_A1_MSB + i * 2);
-+		hdmi_writeb(hdmi, coeff_b & 0xff, HDMI_CSC_COEF_B1_LSB + i * 2);
-+		hdmi_writeb(hdmi, coeff_b >> 8, HDMI_CSC_COEF_B1_MSB + i * 2);
-+		hdmi_writeb(hdmi, coeff_c & 0xff, HDMI_CSC_COEF_C1_LSB + i * 2);
-+		hdmi_writeb(hdmi, coeff_c >> 8, HDMI_CSC_COEF_C1_MSB + i * 2);
-+	}
- 
- 	val = hdmi_readb(hdmi, HDMI_CSC_SCALE);
- 	val &= ~HDMI_CSC_SCALE_CSCSCALE_MASK;
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0003-imx-drm-imx-hdmi-provide-register-modification-funct.patch b/patches/imx_drm/0003-imx-drm-imx-hdmi-provide-register-modification-funct.patch
deleted file mode 100644
index 0477a4d75..000000000
--- a/patches/imx_drm/0003-imx-drm-imx-hdmi-provide-register-modification-funct.patch
+++ /dev/null
@@ -1,341 +0,0 @@
-From 812bc615fd807d9fa1ad57de40061149cef3e7d4 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Mon, 4 Nov 2013 12:42:02 +0000
-Subject: [PATCH 03/67] imx-drm: imx-hdmi: provide register modification
- function
-
-There are a load of read-modify-write patterns to change bitfields in
-various registers in this driver; provide a helper to perform this
-manipulation.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/imx-hdmi.c | 182 +++++++++++++------------------------
- 1 file changed, 65 insertions(+), 117 deletions(-)
-
-diff --git a/drivers/staging/imx-drm/imx-hdmi.c b/drivers/staging/imx-drm/imx-hdmi.c
-index 18de310..2fa8658 100644
---- a/drivers/staging/imx-drm/imx-hdmi.c
-+++ b/drivers/staging/imx-drm/imx-hdmi.c
-@@ -156,37 +156,34 @@ static inline u8 hdmi_readb(struct imx_hdmi *hdmi, int offset)
- 	return readb(hdmi->regs + offset);
- }
- 
-+static void hdmi_modb(struct imx_hdmi *hdmi, u8 data, u8 mask, unsigned reg)
-+{
-+	u8 val = hdmi_readb(hdmi, reg) & ~mask;
-+	val |= data & mask;
-+	hdmi_writeb(hdmi, val, reg);
-+}
-+
- static void hdmi_mask_writeb(struct imx_hdmi *hdmi, u8 data, unsigned int reg,
- 		      u8 shift, u8 mask)
- {
--	u8 value = hdmi_readb(hdmi, reg) & ~mask;
--	value |= (data << shift) & mask;
--	hdmi_writeb(hdmi, value, reg);
-+	hdmi_modb(hdmi, data << shift, mask, reg);
- }
- 
- static void hdmi_set_clock_regenerator_n(struct imx_hdmi *hdmi,
- 					 unsigned int value)
- {
--	u8 val;
--
- 	hdmi_writeb(hdmi, value & 0xff, HDMI_AUD_N1);
- 	hdmi_writeb(hdmi, (value >> 8) & 0xff, HDMI_AUD_N2);
- 	hdmi_writeb(hdmi, (value >> 16) & 0x0f, HDMI_AUD_N3);
- 
- 	/* nshift factor = 0 */
--	val = hdmi_readb(hdmi, HDMI_AUD_CTS3);
--	val &= ~HDMI_AUD_CTS3_N_SHIFT_MASK;
--	hdmi_writeb(hdmi, val, HDMI_AUD_CTS3);
-+	hdmi_modb(hdmi, 0, HDMI_AUD_CTS3_N_SHIFT_MASK, HDMI_AUD_CTS3);
- }
- 
- static void hdmi_regenerate_cts(struct imx_hdmi *hdmi, unsigned int cts)
- {
--	u8 val;
--
- 	/* Must be set/cleared first */
--	val = hdmi_readb(hdmi, HDMI_AUD_CTS3);
--	val &= ~HDMI_AUD_CTS3_CTS_MANUAL;
--	hdmi_writeb(hdmi, val, HDMI_AUD_CTS3);
-+	hdmi_modb(hdmi, 0, HDMI_AUD_CTS3_CTS_MANUAL, HDMI_AUD_CTS3);
- 
- 	hdmi_writeb(hdmi, cts & 0xff, HDMI_AUD_CTS1);
- 	hdmi_writeb(hdmi, (cts >> 8) & 0xff, HDMI_AUD_CTS2);
-@@ -482,7 +479,6 @@ static void imx_hdmi_update_csc_coeffs(struct imx_hdmi *hdmi)
- 	const u16 (*csc_coeff)[3][4] = &csc_coeff_default;
- 	unsigned i;
- 	u32 csc_scale = 1;
--	u8 val;
- 
- 	if (is_color_space_conversion(hdmi)) {
- 		if (hdmi->hdmi_data.enc_out_format == RGB) {
-@@ -513,10 +509,8 @@ static void imx_hdmi_update_csc_coeffs(struct imx_hdmi *hdmi)
- 		hdmi_writeb(hdmi, coeff_c >> 8, HDMI_CSC_COEF_C1_MSB + i * 2);
- 	}
- 
--	val = hdmi_readb(hdmi, HDMI_CSC_SCALE);
--	val &= ~HDMI_CSC_SCALE_CSCSCALE_MASK;
--	val |= csc_scale & HDMI_CSC_SCALE_CSCSCALE_MASK;
--	hdmi_writeb(hdmi, val, HDMI_CSC_SCALE);
-+	hdmi_modb(hdmi, csc_scale, HDMI_CSC_SCALE_CSCSCALE_MASK,
-+		  HDMI_CSC_SCALE);
- }
- 
- static void hdmi_video_csc(struct imx_hdmi *hdmi)
-@@ -524,7 +518,6 @@ static void hdmi_video_csc(struct imx_hdmi *hdmi)
- 	int color_depth = 0;
- 	int interpolation = HDMI_CSC_CFG_INTMODE_DISABLE;
- 	int decimation = 0;
--	u8 val;
- 
- 	/* YCC422 interpolation to 444 mode */
- 	if (is_color_space_interpolation(hdmi))
-@@ -545,10 +538,8 @@ static void hdmi_video_csc(struct imx_hdmi *hdmi)
- 
- 	/* Configure the CSC registers */
- 	hdmi_writeb(hdmi, interpolation | decimation, HDMI_CSC_CFG);
--	val = hdmi_readb(hdmi, HDMI_CSC_SCALE);
--	val &= ~HDMI_CSC_SCALE_CSC_COLORDE_PTH_MASK;
--	val |= color_depth;
--	hdmi_writeb(hdmi, val, HDMI_CSC_SCALE);
-+	hdmi_modb(hdmi, color_depth, HDMI_CSC_SCALE_CSC_COLORDE_PTH_MASK,
-+		  HDMI_CSC_SCALE);
- 
- 	imx_hdmi_update_csc_coeffs(hdmi);
- }
-@@ -603,107 +594,80 @@ static void hdmi_video_packetize(struct imx_hdmi *hdmi)
- 		HDMI_VP_PR_CD_DESIRED_PR_FACTOR_MASK);
- 	hdmi_writeb(hdmi, val, HDMI_VP_PR_CD);
- 
--	val = hdmi_readb(hdmi, HDMI_VP_STUFF);
--	val &= ~HDMI_VP_STUFF_PR_STUFFING_MASK;
--	val |= HDMI_VP_STUFF_PR_STUFFING_STUFFING_MODE;
--	hdmi_writeb(hdmi, val, HDMI_VP_STUFF);
-+	hdmi_modb(hdmi, HDMI_VP_STUFF_PR_STUFFING_STUFFING_MODE,
-+		  HDMI_VP_STUFF_PR_STUFFING_MASK, HDMI_VP_STUFF);
- 
- 	/* Data from pixel repeater block */
- 	if (hdmi_data->pix_repet_factor > 1) {
--		val = hdmi_readb(hdmi, HDMI_VP_CONF);
--		val &= ~(HDMI_VP_CONF_PR_EN_MASK |
--			HDMI_VP_CONF_BYPASS_SELECT_MASK);
--		val |= HDMI_VP_CONF_PR_EN_ENABLE |
--			HDMI_VP_CONF_BYPASS_SELECT_PIX_REPEATER;
--		hdmi_writeb(hdmi, val, HDMI_VP_CONF);
-+		hdmi_modb(hdmi, HDMI_VP_CONF_PR_EN_ENABLE |
-+				HDMI_VP_CONF_BYPASS_SELECT_PIX_REPEATER,
-+			  HDMI_VP_CONF_PR_EN_MASK |
-+			  HDMI_VP_CONF_BYPASS_SELECT_MASK, HDMI_VP_CONF);
- 	} else { /* data from packetizer block */
--		val = hdmi_readb(hdmi, HDMI_VP_CONF);
--		val &= ~(HDMI_VP_CONF_PR_EN_MASK |
--			HDMI_VP_CONF_BYPASS_SELECT_MASK);
--		val |= HDMI_VP_CONF_PR_EN_DISABLE |
--			HDMI_VP_CONF_BYPASS_SELECT_VID_PACKETIZER;
--		hdmi_writeb(hdmi, val, HDMI_VP_CONF);
-+		hdmi_modb(hdmi, HDMI_VP_CONF_PR_EN_DISABLE |
-+				HDMI_VP_CONF_BYPASS_SELECT_VID_PACKETIZER,
-+			  HDMI_VP_CONF_PR_EN_MASK |
-+			  HDMI_VP_CONF_BYPASS_SELECT_MASK, HDMI_VP_CONF);
- 	}
- 
--	val = hdmi_readb(hdmi, HDMI_VP_STUFF);
--	val &= ~HDMI_VP_STUFF_IDEFAULT_PHASE_MASK;
--	val |= 1 << HDMI_VP_STUFF_IDEFAULT_PHASE_OFFSET;
--	hdmi_writeb(hdmi, val, HDMI_VP_STUFF);
-+	hdmi_modb(hdmi, 1 << HDMI_VP_STUFF_IDEFAULT_PHASE_OFFSET,
-+		  HDMI_VP_STUFF_IDEFAULT_PHASE_MASK, HDMI_VP_STUFF);
- 
- 	hdmi_writeb(hdmi, remap_size, HDMI_VP_REMAP);
- 
- 	if (output_select == HDMI_VP_CONF_OUTPUT_SELECTOR_PP) {
--		val = hdmi_readb(hdmi, HDMI_VP_CONF);
--		val &= ~(HDMI_VP_CONF_BYPASS_EN_MASK |
--			HDMI_VP_CONF_PP_EN_ENMASK |
--			HDMI_VP_CONF_YCC422_EN_MASK);
--		val |= HDMI_VP_CONF_BYPASS_EN_DISABLE |
--			HDMI_VP_CONF_PP_EN_ENABLE |
--			HDMI_VP_CONF_YCC422_EN_DISABLE;
--		hdmi_writeb(hdmi, val, HDMI_VP_CONF);
-+		hdmi_modb(hdmi, HDMI_VP_CONF_BYPASS_EN_DISABLE |
-+				HDMI_VP_CONF_PP_EN_ENABLE |
-+				HDMI_VP_CONF_YCC422_EN_DISABLE,
-+			  HDMI_VP_CONF_BYPASS_EN_MASK |
-+			  HDMI_VP_CONF_PP_EN_ENMASK |
-+			  HDMI_VP_CONF_YCC422_EN_MASK, HDMI_VP_CONF);
- 	} else if (output_select == HDMI_VP_CONF_OUTPUT_SELECTOR_YCC422) {
--		val = hdmi_readb(hdmi, HDMI_VP_CONF);
--		val &= ~(HDMI_VP_CONF_BYPASS_EN_MASK |
--			HDMI_VP_CONF_PP_EN_ENMASK |
--			HDMI_VP_CONF_YCC422_EN_MASK);
--		val |= HDMI_VP_CONF_BYPASS_EN_DISABLE |
--			HDMI_VP_CONF_PP_EN_DISABLE |
--			HDMI_VP_CONF_YCC422_EN_ENABLE;
--		hdmi_writeb(hdmi, val, HDMI_VP_CONF);
-+		hdmi_modb(hdmi, HDMI_VP_CONF_BYPASS_EN_DISABLE |
-+				HDMI_VP_CONF_PP_EN_DISABLE |
-+				HDMI_VP_CONF_YCC422_EN_ENABLE,
-+			  HDMI_VP_CONF_BYPASS_EN_MASK |
-+			  HDMI_VP_CONF_PP_EN_ENMASK |
-+			  HDMI_VP_CONF_YCC422_EN_MASK, HDMI_VP_CONF);
- 	} else if (output_select == HDMI_VP_CONF_OUTPUT_SELECTOR_BYPASS) {
--		val = hdmi_readb(hdmi, HDMI_VP_CONF);
--		val &= ~(HDMI_VP_CONF_BYPASS_EN_MASK |
--			HDMI_VP_CONF_PP_EN_ENMASK |
--			HDMI_VP_CONF_YCC422_EN_MASK);
--		val |= HDMI_VP_CONF_BYPASS_EN_ENABLE |
--			HDMI_VP_CONF_PP_EN_DISABLE |
--			HDMI_VP_CONF_YCC422_EN_DISABLE;
--		hdmi_writeb(hdmi, val, HDMI_VP_CONF);
-+		hdmi_modb(hdmi, HDMI_VP_CONF_BYPASS_EN_ENABLE |
-+				HDMI_VP_CONF_PP_EN_DISABLE |
-+				HDMI_VP_CONF_YCC422_EN_DISABLE,
-+			  HDMI_VP_CONF_BYPASS_EN_MASK |
-+			  HDMI_VP_CONF_PP_EN_ENMASK |
-+			  HDMI_VP_CONF_YCC422_EN_MASK, HDMI_VP_CONF);
- 	} else {
- 		return;
- 	}
- 
--	val = hdmi_readb(hdmi, HDMI_VP_STUFF);
--	val &= ~(HDMI_VP_STUFF_PP_STUFFING_MASK |
--		HDMI_VP_STUFF_YCC422_STUFFING_MASK);
--	val |= HDMI_VP_STUFF_PP_STUFFING_STUFFING_MODE |
--		HDMI_VP_STUFF_YCC422_STUFFING_STUFFING_MODE;
--	hdmi_writeb(hdmi, val, HDMI_VP_STUFF);
-+	hdmi_modb(hdmi, HDMI_VP_STUFF_PP_STUFFING_STUFFING_MODE |
-+			HDMI_VP_STUFF_YCC422_STUFFING_STUFFING_MODE,
-+		  HDMI_VP_STUFF_PP_STUFFING_MASK |
-+		  HDMI_VP_STUFF_YCC422_STUFFING_MASK, HDMI_VP_STUFF);
- 
--	val = hdmi_readb(hdmi, HDMI_VP_CONF);
--	val &= ~HDMI_VP_CONF_OUTPUT_SELECTOR_MASK;
--	val |= output_select;
--	hdmi_writeb(hdmi, val, HDMI_VP_CONF);
-+	hdmi_modb(hdmi, output_select, HDMI_VP_CONF_OUTPUT_SELECTOR_MASK,
-+		  HDMI_VP_CONF);
- }
- 
- static inline void hdmi_phy_test_clear(struct imx_hdmi *hdmi,
- 						unsigned char bit)
- {
--	u8 val = hdmi_readb(hdmi, HDMI_PHY_TST0);
--	val &= ~HDMI_PHY_TST0_TSTCLR_MASK;
--	val |= (bit << HDMI_PHY_TST0_TSTCLR_OFFSET) &
--		HDMI_PHY_TST0_TSTCLR_MASK;
--	hdmi_writeb(hdmi, val, HDMI_PHY_TST0);
-+	hdmi_modb(hdmi, bit << HDMI_PHY_TST0_TSTCLR_OFFSET,
-+		  HDMI_PHY_TST0_TSTCLR_MASK, HDMI_PHY_TST0);
- }
- 
- static inline void hdmi_phy_test_enable(struct imx_hdmi *hdmi,
- 						unsigned char bit)
- {
--	u8 val = hdmi_readb(hdmi, HDMI_PHY_TST0);
--	val &= ~HDMI_PHY_TST0_TSTEN_MASK;
--	val |= (bit << HDMI_PHY_TST0_TSTEN_OFFSET) &
--		HDMI_PHY_TST0_TSTEN_MASK;
--	hdmi_writeb(hdmi, val, HDMI_PHY_TST0);
-+	hdmi_modb(hdmi, bit << HDMI_PHY_TST0_TSTEN_OFFSET,
-+		  HDMI_PHY_TST0_TSTEN_MASK, HDMI_PHY_TST0);
- }
- 
- static inline void hdmi_phy_test_clock(struct imx_hdmi *hdmi,
- 						unsigned char bit)
- {
--	u8 val = hdmi_readb(hdmi, HDMI_PHY_TST0);
--	val &= ~HDMI_PHY_TST0_TSTCLK_MASK;
--	val |= (bit << HDMI_PHY_TST0_TSTCLK_OFFSET) &
--		HDMI_PHY_TST0_TSTCLK_MASK;
--	hdmi_writeb(hdmi, val, HDMI_PHY_TST0);
-+	hdmi_modb(hdmi, bit << HDMI_PHY_TST0_TSTCLK_OFFSET,
-+		  HDMI_PHY_TST0_TSTCLK_MASK, HDMI_PHY_TST0);
- }
- 
- static inline void hdmi_phy_test_din(struct imx_hdmi *hdmi,
-@@ -1000,7 +964,7 @@ static int imx_hdmi_phy_init(struct imx_hdmi *hdmi)
- 
- static void hdmi_tx_hdcp_config(struct imx_hdmi *hdmi)
- {
--	u8 de, val;
-+	u8 de;
- 
- 	if (hdmi->hdmi_data.video_mode.mdataenablepolarity)
- 		de = HDMI_A_VIDPOLCFG_DATAENPOL_ACTIVE_HIGH;
-@@ -1008,20 +972,13 @@ static void hdmi_tx_hdcp_config(struct imx_hdmi *hdmi)
- 		de = HDMI_A_VIDPOLCFG_DATAENPOL_ACTIVE_LOW;
- 
- 	/* disable rx detect */
--	val = hdmi_readb(hdmi, HDMI_A_HDCPCFG0);
--	val &= HDMI_A_HDCPCFG0_RXDETECT_MASK;
--	val |= HDMI_A_HDCPCFG0_RXDETECT_DISABLE;
--	hdmi_writeb(hdmi, val, HDMI_A_HDCPCFG0);
-+	hdmi_modb(hdmi, HDMI_A_HDCPCFG0_RXDETECT_DISABLE,
-+		  HDMI_A_HDCPCFG0_RXDETECT_MASK, HDMI_A_HDCPCFG0);
- 
--	val = hdmi_readb(hdmi, HDMI_A_VIDPOLCFG);
--	val &= HDMI_A_VIDPOLCFG_DATAENPOL_MASK;
--	val |= de;
--	hdmi_writeb(hdmi, val, HDMI_A_VIDPOLCFG);
-+	hdmi_modb(hdmi, de, HDMI_A_VIDPOLCFG_DATAENPOL_MASK, HDMI_A_VIDPOLCFG);
- 
--	val = hdmi_readb(hdmi, HDMI_A_HDCPCFG1);
--	val &= HDMI_A_HDCPCFG1_ENCRYPTIONDISABLE_MASK;
--	val |= HDMI_A_HDCPCFG1_ENCRYPTIONDISABLE_DISABLE;
--	hdmi_writeb(hdmi, val, HDMI_A_HDCPCFG1);
-+	hdmi_modb(hdmi, HDMI_A_HDCPCFG1_ENCRYPTIONDISABLE_DISABLE,
-+		  HDMI_A_HDCPCFG1_ENCRYPTIONDISABLE_MASK, HDMI_A_HDCPCFG1);
- }
- 
- static void hdmi_config_AVI(struct imx_hdmi *hdmi)
-@@ -1245,11 +1202,7 @@ static void imx_hdmi_enable_video_path(struct imx_hdmi *hdmi)
- 
- static void hdmi_enable_audio_clk(struct imx_hdmi *hdmi)
- {
--	u8 clkdis;
--
--	clkdis = hdmi_readb(hdmi, HDMI_MC_CLKDIS);
--	clkdis &= ~HDMI_MC_CLKDIS_AUDCLK_DISABLE;
--	hdmi_writeb(hdmi, clkdis, HDMI_MC_CLKDIS);
-+	hdmi_modb(hdmi, 0, HDMI_MC_CLKDIS_AUDCLK_DISABLE, HDMI_MC_CLKDIS);
- }
- 
- /* Workaround to clear the overflow condition */
-@@ -1593,7 +1546,6 @@ static irqreturn_t imx_hdmi_irq(int irq, void *dev_id)
- 	struct imx_hdmi *hdmi = dev_id;
- 	u8 intr_stat;
- 	u8 phy_int_pol;
--	u8 val;
- 
- 	intr_stat = hdmi_readb(hdmi, HDMI_IH_PHY_STAT0);
- 
-@@ -1603,17 +1555,13 @@ static irqreturn_t imx_hdmi_irq(int irq, void *dev_id)
- 		if (phy_int_pol & HDMI_PHY_HPD) {
- 			dev_dbg(hdmi->dev, "EVENT=plugin\n");
- 
--			val = hdmi_readb(hdmi, HDMI_PHY_POL0);
--			val &= ~HDMI_PHY_HPD;
--			hdmi_writeb(hdmi, val, HDMI_PHY_POL0);
-+			hdmi_modb(hdmi, 0, HDMI_PHY_HPD, HDMI_PHY_POL0);
- 
- 			imx_hdmi_poweron(hdmi);
- 		} else {
- 			dev_dbg(hdmi->dev, "EVENT=plugout\n");
- 
--			val = hdmi_readb(hdmi, HDMI_PHY_POL0);
--			val |= HDMI_PHY_HPD;
--			hdmi_writeb(hdmi, val, HDMI_PHY_POL0);
-+			hdmi_modb(hdmi, HDMI_PHY_HPD, HDMI_PHY_HPD, HDMI_PHY_POL0);
- 
- 			imx_hdmi_poweroff(hdmi);
- 		}
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0004-imx-drm-imx-hdmi-clean-up-setting-of-vp_conf.patch b/patches/imx_drm/0004-imx-drm-imx-hdmi-clean-up-setting-of-vp_conf.patch
deleted file mode 100644
index 18c4063b3..000000000
--- a/patches/imx_drm/0004-imx-drm-imx-hdmi-clean-up-setting-of-vp_conf.patch
+++ /dev/null
@@ -1,98 +0,0 @@
-From bebdf6641939b1bb869ac96ae9524cedeb11e419 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Mon, 4 Nov 2013 12:55:30 +0000
-Subject: [PATCH 04/67] imx-drm: imx-hdmi: clean up setting of vp_conf
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/imx-hdmi.c | 49 +++++++++++++++++---------------------
- 1 file changed, 22 insertions(+), 27 deletions(-)
-
-diff --git a/drivers/staging/imx-drm/imx-hdmi.c b/drivers/staging/imx-drm/imx-hdmi.c
-index 2fa8658..ec5b5e2 100644
---- a/drivers/staging/imx-drm/imx-hdmi.c
-+++ b/drivers/staging/imx-drm/imx-hdmi.c
-@@ -555,7 +555,7 @@ static void hdmi_video_packetize(struct imx_hdmi *hdmi)
- 	unsigned int remap_size = HDMI_VP_REMAP_YCC422_16bit;
- 	unsigned int output_select = HDMI_VP_CONF_OUTPUT_SELECTOR_PP;
- 	struct hdmi_data_info *hdmi_data = &hdmi->hdmi_data;
--	u8 val;
-+	u8 val, vp_conf;
- 
- 	if (hdmi_data->enc_out_format == RGB
- 		|| hdmi_data->enc_out_format == YCBCR444) {
-@@ -599,47 +599,42 @@ static void hdmi_video_packetize(struct imx_hdmi *hdmi)
- 
- 	/* Data from pixel repeater block */
- 	if (hdmi_data->pix_repet_factor > 1) {
--		hdmi_modb(hdmi, HDMI_VP_CONF_PR_EN_ENABLE |
--				HDMI_VP_CONF_BYPASS_SELECT_PIX_REPEATER,
--			  HDMI_VP_CONF_PR_EN_MASK |
--			  HDMI_VP_CONF_BYPASS_SELECT_MASK, HDMI_VP_CONF);
-+		vp_conf = HDMI_VP_CONF_PR_EN_ENABLE |
-+			  HDMI_VP_CONF_BYPASS_SELECT_PIX_REPEATER;
- 	} else { /* data from packetizer block */
--		hdmi_modb(hdmi, HDMI_VP_CONF_PR_EN_DISABLE |
--				HDMI_VP_CONF_BYPASS_SELECT_VID_PACKETIZER,
--			  HDMI_VP_CONF_PR_EN_MASK |
--			  HDMI_VP_CONF_BYPASS_SELECT_MASK, HDMI_VP_CONF);
-+		vp_conf = HDMI_VP_CONF_PR_EN_DISABLE |
-+			  HDMI_VP_CONF_BYPASS_SELECT_VID_PACKETIZER;
- 	}
- 
-+	hdmi_modb(hdmi, vp_conf,
-+		  HDMI_VP_CONF_PR_EN_MASK |
-+		  HDMI_VP_CONF_BYPASS_SELECT_MASK, HDMI_VP_CONF);
-+
- 	hdmi_modb(hdmi, 1 << HDMI_VP_STUFF_IDEFAULT_PHASE_OFFSET,
- 		  HDMI_VP_STUFF_IDEFAULT_PHASE_MASK, HDMI_VP_STUFF);
- 
- 	hdmi_writeb(hdmi, remap_size, HDMI_VP_REMAP);
- 
- 	if (output_select == HDMI_VP_CONF_OUTPUT_SELECTOR_PP) {
--		hdmi_modb(hdmi, HDMI_VP_CONF_BYPASS_EN_DISABLE |
--				HDMI_VP_CONF_PP_EN_ENABLE |
--				HDMI_VP_CONF_YCC422_EN_DISABLE,
--			  HDMI_VP_CONF_BYPASS_EN_MASK |
--			  HDMI_VP_CONF_PP_EN_ENMASK |
--			  HDMI_VP_CONF_YCC422_EN_MASK, HDMI_VP_CONF);
-+		vp_conf = HDMI_VP_CONF_BYPASS_EN_DISABLE |
-+			  HDMI_VP_CONF_PP_EN_ENABLE |
-+			  HDMI_VP_CONF_YCC422_EN_DISABLE;
- 	} else if (output_select == HDMI_VP_CONF_OUTPUT_SELECTOR_YCC422) {
--		hdmi_modb(hdmi, HDMI_VP_CONF_BYPASS_EN_DISABLE |
--				HDMI_VP_CONF_PP_EN_DISABLE |
--				HDMI_VP_CONF_YCC422_EN_ENABLE,
--			  HDMI_VP_CONF_BYPASS_EN_MASK |
--			  HDMI_VP_CONF_PP_EN_ENMASK |
--			  HDMI_VP_CONF_YCC422_EN_MASK, HDMI_VP_CONF);
-+		vp_conf = HDMI_VP_CONF_BYPASS_EN_DISABLE |
-+			  HDMI_VP_CONF_PP_EN_DISABLE |
-+			  HDMI_VP_CONF_YCC422_EN_ENABLE;
- 	} else if (output_select == HDMI_VP_CONF_OUTPUT_SELECTOR_BYPASS) {
--		hdmi_modb(hdmi, HDMI_VP_CONF_BYPASS_EN_ENABLE |
--				HDMI_VP_CONF_PP_EN_DISABLE |
--				HDMI_VP_CONF_YCC422_EN_DISABLE,
--			  HDMI_VP_CONF_BYPASS_EN_MASK |
--			  HDMI_VP_CONF_PP_EN_ENMASK |
--			  HDMI_VP_CONF_YCC422_EN_MASK, HDMI_VP_CONF);
-+		vp_conf = HDMI_VP_CONF_BYPASS_EN_ENABLE |
-+			  HDMI_VP_CONF_PP_EN_DISABLE |
-+			  HDMI_VP_CONF_YCC422_EN_DISABLE;
- 	} else {
- 		return;
- 	}
- 
-+	hdmi_modb(hdmi, vp_conf,
-+		  HDMI_VP_CONF_BYPASS_EN_MASK | HDMI_VP_CONF_PP_EN_ENMASK |
-+		  HDMI_VP_CONF_YCC422_EN_MASK, HDMI_VP_CONF);
-+
- 	hdmi_modb(hdmi, HDMI_VP_STUFF_PP_STUFFING_STUFFING_MODE |
- 			HDMI_VP_STUFF_YCC422_STUFFING_STUFFING_MODE,
- 		  HDMI_VP_STUFF_PP_STUFFING_MASK |
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0005-imx-drm-imx-hdmi-fix-CTS-N-setup-at-init-time.patch b/patches/imx_drm/0005-imx-drm-imx-hdmi-fix-CTS-N-setup-at-init-time.patch
deleted file mode 100644
index 1444ef672..000000000
--- a/patches/imx_drm/0005-imx-drm-imx-hdmi-fix-CTS-N-setup-at-init-time.patch
+++ /dev/null
@@ -1,123 +0,0 @@
-From 406783880267c3fa3d76ce8e9a83ba17de3bcf2e Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Thu, 7 Nov 2013 15:35:06 +0000
-Subject: [PATCH 05/67] imx-drm: imx-hdmi: fix CTS/N setup at init time
-
-Many of the variables for the audio clock regenerator (CTS/N) were not
-initialised in any way.  The pixel rate which was being used also
-wasn't being adjusted at all when the display mode is modified.
-
-Get rid of the seaprate 'pixel_clk_rate', and use the stored pixel
-clock rate instead.  Pass this desired pixel clock rate into
-hdmi_set_clk_regenerator().  Collapse down hdmi_init_clk_regenerator()
-since it is a copy of hdmi_set_clk_regenerator(), and pass a default
-pixel clock rate.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/imx-hdmi.c | 48 ++++++++------------------------------
- 1 file changed, 10 insertions(+), 38 deletions(-)
-
-diff --git a/drivers/staging/imx-drm/imx-hdmi.c b/drivers/staging/imx-drm/imx-hdmi.c
-index ec5b5e2..05cf8a0 100644
---- a/drivers/staging/imx-drm/imx-hdmi.c
-+++ b/drivers/staging/imx-drm/imx-hdmi.c
-@@ -134,7 +134,6 @@ struct imx_hdmi {
- 	struct i2c_adapter *ddc;
- 	void __iomem *regs;
- 
--	unsigned long pixel_clk_rate;
- 	unsigned int sample_rate;
- 	int ratio;
- };
-@@ -328,34 +327,25 @@ static unsigned int hdmi_compute_cts(unsigned int freq, unsigned long pixel_clk,
- 		return (cts * ratio) / 100;
- }
- 
--static void hdmi_get_pixel_clk(struct imx_hdmi *hdmi)
--{
--	unsigned long rate;
--
--	rate = 65000000; /* FIXME */
--
--	if (rate)
--		hdmi->pixel_clk_rate = rate;
--}
--
--static void hdmi_set_clk_regenerator(struct imx_hdmi *hdmi)
-+static void hdmi_set_clk_regenerator(struct imx_hdmi *hdmi,
-+	unsigned long pixel_clk)
- {
- 	unsigned int clk_n, clk_cts;
- 
--	clk_n = hdmi_compute_n(hdmi->sample_rate, hdmi->pixel_clk_rate,
-+	clk_n = hdmi_compute_n(hdmi->sample_rate, pixel_clk,
- 			       hdmi->ratio);
--	clk_cts = hdmi_compute_cts(hdmi->sample_rate, hdmi->pixel_clk_rate,
-+	clk_cts = hdmi_compute_cts(hdmi->sample_rate, pixel_clk,
- 				   hdmi->ratio);
- 
- 	if (!clk_cts) {
- 		dev_dbg(hdmi->dev, "%s: pixel clock not supported: %lu\n",
--			 __func__, hdmi->pixel_clk_rate);
-+			 __func__, pixel_clk);
- 		return;
- 	}
- 
- 	dev_dbg(hdmi->dev, "%s: samplerate=%d  ratio=%d  pixelclk=%lu  N=%d cts=%d\n",
- 		__func__, hdmi->sample_rate, hdmi->ratio,
--		hdmi->pixel_clk_rate, clk_n, clk_cts);
-+		pixel_clk, clk_n, clk_cts);
- 
- 	hdmi_set_clock_regenerator_n(hdmi, clk_n);
- 	hdmi_regenerate_cts(hdmi, clk_cts);
-@@ -363,32 +353,12 @@ static void hdmi_set_clk_regenerator(struct imx_hdmi *hdmi)
- 
- static void hdmi_init_clk_regenerator(struct imx_hdmi *hdmi)
- {
--	unsigned int clk_n, clk_cts;
--
--	clk_n = hdmi_compute_n(hdmi->sample_rate, hdmi->pixel_clk_rate,
--			       hdmi->ratio);
--	clk_cts = hdmi_compute_cts(hdmi->sample_rate, hdmi->pixel_clk_rate,
--				   hdmi->ratio);
--
--	if (!clk_cts) {
--		dev_dbg(hdmi->dev, "%s: pixel clock not supported: %lu\n",
--			 __func__, hdmi->pixel_clk_rate);
--		return;
--	}
--
--	dev_dbg(hdmi->dev, "%s: samplerate=%d  ratio=%d  pixelclk=%lu  N=%d cts=%d\n",
--		__func__, hdmi->sample_rate, hdmi->ratio,
--		hdmi->pixel_clk_rate, clk_n, clk_cts);
--
--	hdmi_set_clock_regenerator_n(hdmi, clk_n);
--	hdmi_regenerate_cts(hdmi, clk_cts);
-+	hdmi_set_clk_regenerator(hdmi, 74250000);
- }
- 
- static void hdmi_clk_regenerator_update_pixel_clock(struct imx_hdmi *hdmi)
- {
--	/* Get pixel clock from ipu */
--	hdmi_get_pixel_clk(hdmi);
--	hdmi_set_clk_regenerator(hdmi);
-+	hdmi_set_clk_regenerator(hdmi, hdmi->hdmi_data.video_mode.mpixelclock);
- }
- 
- /*
-@@ -1636,6 +1606,8 @@ static int imx_hdmi_platform_probe(struct platform_device *pdev)
- 		return -ENOMEM;
- 
- 	hdmi->dev = &pdev->dev;
-+	hdmi->sample_rate = 48000;
-+	hdmi->ratio = 100;
- 
- 	if (of_id) {
- 		const struct platform_device_id *device_id = of_id->data;
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0006-imx-drm-ipu-v3-more-inteligent-DI-clock-selection.patch b/patches/imx_drm/0006-imx-drm-ipu-v3-more-inteligent-DI-clock-selection.patch
deleted file mode 100644
index 9f35257ba..000000000
--- a/patches/imx_drm/0006-imx-drm-ipu-v3-more-inteligent-DI-clock-selection.patch
+++ /dev/null
@@ -1,114 +0,0 @@
-From 24013ea8ff5711ef548b709d2f93d541f0bf504a Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Sat, 19 Oct 2013 15:05:31 +0100
-Subject: [PATCH 06/67] imx-drm: ipu-v3: more inteligent DI clock selection
-
-The DI clock selection was very rudimentary: it would statically use
-either the IPU internal clock or the DI external clock depending on
-which "encoder" was being used.  In the case of HDMI, it would always
-use the IPU clock.
-
-Moreover, using the IPU clock resulted in fractional divisors, which
-are achieved by skipping clock pulses.  This can result in the HDMI
-PHY PLL being frequency modulated, and the attached device is then
-unable to properly lock on to the TMDS clock.
-
-We need at least 1% accurate and stable clocks for HDMI.
-
-Arrange for the DI clock to be sourced from the IPU internal clock
-if it can satisfy our requirements, otherwise switch to the DI
-external clock and try and set the external clock to our desired
-pixel clock rate.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/ipu-v3/ipu-di.c | 54 +++++++++++++++++++++++++++++++--
- 1 file changed, 52 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-di.c b/drivers/staging/imx-drm/ipu-v3/ipu-di.c
-index 948a49b..8c7241bb 100644
---- a/drivers/staging/imx-drm/ipu-v3/ipu-di.c
-+++ b/drivers/staging/imx-drm/ipu-v3/ipu-di.c
-@@ -544,10 +544,48 @@ int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
- 	if ((sig->v_sync_width == 0) || (sig->h_sync_width == 0))
- 		return -EINVAL;
- 
-+	dev_dbg(di->ipu->dev, "Clocks: IPU %luHz DI %luHz Needed %luHz\n",
-+		clk_get_rate(di->clk_ipu),
-+		clk_get_rate(di->clk_di),
-+		sig->pixelclock);
-+
-+	/*
-+	 * CLKMODE_EXT means we must use the DI clock: this is needed
-+	 * for things like LVDS which needs to feed the DI and LDB with
-+	 * the same pixel clock.
-+	 *
-+	 * For other interfaces, we can arbitarily select between the DI
-+	 * specific clock and the internal IPU clock.  See DI_GENERAL
-+	 * bit 20.  We select the IPU clock if it can give us a clock
-+	 * rate within 1% of the requested frequency, otherwise we use
-+	 * the DI clock.
-+	 */
- 	if (sig->clkflags & IPU_DI_CLKMODE_EXT)
- 		parent = di->clk_di;
--	else
--		parent = di->clk_ipu;
-+	else {
-+		unsigned long rate, clkrate;
-+		unsigned div, error;
-+
-+		clkrate = clk_get_rate(di->clk_ipu);
-+		div = (clkrate + sig->pixelclock / 2) / sig->pixelclock;
-+		rate = clkrate / div;
-+
-+		error = rate / (sig->pixelclock / 1000);
-+
-+		dev_dbg(di->ipu->dev, "  IPU clock can give %lu with divider %u, error %d.%u%%\n",
-+			rate, div, (signed)(error - 1000) / 10, error % 10);
-+
-+		/* Allow a 1% error */
-+		if (error < 1010 && error >= 990) {
-+			parent = di->clk_ipu;
-+		} else {
-+			parent = di->clk_di;
-+
-+			ret = clk_set_rate(parent, sig->pixelclock);
-+			if (ret)
-+				dev_err(di->ipu->dev, "Setting of DI clock failed: %d\n", ret);
-+		}
-+	}
- 
- 	ret = clk_set_parent(di->clk_di_pixel, parent);
- 	if (ret) {
-@@ -557,6 +595,11 @@ int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
- 		return ret;
- 	}
- 
-+	/*
-+	 * CLKMODE_SYNC means that we want the DI to be clocked at the
-+	 * same rate as the parent clock.  This is needed (eg) for LDB
-+	 * which needs to be fed with the same pixel clock.
-+	 */
- 	if (sig->clkflags & IPU_DI_CLKMODE_SYNC)
- 		round = clk_get_rate(parent);
- 	else
-@@ -564,6 +607,13 @@ int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
- 
- 	ret = clk_set_rate(di->clk_di_pixel, round);
- 
-+	dev_dbg(di->ipu->dev, "Want %luHz IPU %luHz DI %luHz using %s, got %luHz\n",
-+		sig->pixelclock,
-+		clk_get_rate(di->clk_ipu),
-+		clk_get_rate(di->clk_di),
-+		parent == di->clk_di ? "DI" : "IPU",
-+		clk_get_rate(di->clk_di_pixel));
-+
- 	h_total = sig->width + sig->h_sync_width + sig->h_start_width +
- 		sig->h_end_width;
- 	v_total = sig->height + sig->v_sync_width + sig->v_start_width +
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0007-imx-drm-ipu-v3-don-t-use-clk_round_rate-before-clk_s.patch b/patches/imx_drm/0007-imx-drm-ipu-v3-don-t-use-clk_round_rate-before-clk_s.patch
deleted file mode 100644
index d42337d7b..000000000
--- a/patches/imx_drm/0007-imx-drm-ipu-v3-don-t-use-clk_round_rate-before-clk_s.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-From 370b181516f205a9761767808e4702832834faf1 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Sat, 19 Oct 2013 17:38:44 +0100
-Subject: [PATCH 07/67] imx-drm: ipu-v3: don't use clk_round_rate() before
- clk_set_rate()
-
-This is nonsense; clk_round_rate() is just clk_set_rate() without the
-side effect of changing the hardware.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/ipu-v3/ipu-di.c | 13 +++++++++----
- 1 file changed, 9 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-di.c b/drivers/staging/imx-drm/ipu-v3/ipu-di.c
-index 8c7241bb..d766e18 100644
---- a/drivers/staging/imx-drm/ipu-v3/ipu-di.c
-+++ b/drivers/staging/imx-drm/ipu-v3/ipu-di.c
-@@ -560,9 +560,10 @@ int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
- 	 * rate within 1% of the requested frequency, otherwise we use
- 	 * the DI clock.
- 	 */
--	if (sig->clkflags & IPU_DI_CLKMODE_EXT)
-+	round = sig->pixelclock;
-+	if (sig->clkflags & IPU_DI_CLKMODE_EXT) {
- 		parent = di->clk_di;
--	else {
-+	} else {
- 		unsigned long rate, clkrate;
- 		unsigned div, error;
- 
-@@ -584,6 +585,9 @@ int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
- 			ret = clk_set_rate(parent, sig->pixelclock);
- 			if (ret)
- 				dev_err(di->ipu->dev, "Setting of DI clock failed: %d\n", ret);
-+
-+			/* Use the integer divisor rate - avoid fractional dividers */
-+			round = rate;
- 		}
- 	}
- 
-@@ -599,11 +603,12 @@ int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
- 	 * CLKMODE_SYNC means that we want the DI to be clocked at the
- 	 * same rate as the parent clock.  This is needed (eg) for LDB
- 	 * which needs to be fed with the same pixel clock.
-+	 *
-+	 * Note: clk_set_rate(clk, clk_round_rate(clk, rate)) is the
-+	 * same as clk_set_rate(clk, rate);
- 	 */
- 	if (sig->clkflags & IPU_DI_CLKMODE_SYNC)
- 		round = clk_get_rate(parent);
--	else
--		round = clk_round_rate(di->clk_di_pixel, sig->pixelclock);
- 
- 	ret = clk_set_rate(di->clk_di_pixel, round);
- 
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0008-imx-drm-ipu-v3-more-clocking-fixes.patch b/patches/imx_drm/0008-imx-drm-ipu-v3-more-clocking-fixes.patch
deleted file mode 100644
index c02d7699a..000000000
--- a/patches/imx_drm/0008-imx-drm-ipu-v3-more-clocking-fixes.patch
+++ /dev/null
@@ -1,453 +0,0 @@
-From 0721feeee09bdb1ea97b75948f2ab2861d9ee38e Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Sun, 20 Oct 2013 15:36:35 +0100
-Subject: [PATCH 08/67] imx-drm: ipu-v3: more clocking fixes
-
-There's no point in using the clk API for this; we end up having to
-violate the layering this provides.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/ipu-v3/ipu-di.c | 328 ++++++++++----------------------
- 1 file changed, 105 insertions(+), 223 deletions(-)
-
-diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-di.c b/drivers/staging/imx-drm/ipu-v3/ipu-di.c
-index d766e18..82a9eba 100644
---- a/drivers/staging/imx-drm/ipu-v3/ipu-di.c
-+++ b/drivers/staging/imx-drm/ipu-v3/ipu-di.c
-@@ -19,9 +19,6 @@
- #include <linux/io.h>
- #include <linux/err.h>
- #include <linux/platform_device.h>
--#include <linux/clk.h>
--#include <linux/clk-provider.h>
--#include <linux/clkdev.h>
- 
- #include "imx-ipu-v3.h"
- #include "ipu-prv.h"
-@@ -33,10 +30,7 @@ struct ipu_di {
- 	struct clk *clk_di;	/* display input clock */
- 	struct clk *clk_ipu;	/* IPU bus clock */
- 	struct clk *clk_di_pixel; /* resulting pixel clock */
--	struct clk_hw clk_hw_out;
--	char *clk_name;
- 	bool inuse;
--	unsigned long clkflags;
- 	struct ipu_soc *ipu;
- };
- 
-@@ -141,130 +135,6 @@ static inline void ipu_di_write(struct ipu_di *di, u32 value, unsigned offset)
- 	writel(value, di->base + offset);
- }
- 
--static int ipu_di_clk_calc_div(unsigned long inrate, unsigned long outrate)
--{
--	u64 tmp = inrate;
--	int div;
--
--	tmp *= 16;
--
--	do_div(tmp, outrate);
--
--	div = tmp;
--
--	if (div < 0x10)
--		div = 0x10;
--
--#ifdef WTF_IS_THIS
--	/*
--	 * Freescale has this in their Kernel. It is neither clear what
--	 * it does nor why it does it
--	 */
--	if (div & 0x10)
--		div &= ~0x7;
--	else {
--		/* Round up divider if it gets us closer to desired pix clk */
--		if ((div & 0xC) == 0xC) {
--			div += 0x10;
--			div &= ~0xF;
--		}
--	}
--#endif
--	return div;
--}
--
--static unsigned long clk_di_recalc_rate(struct clk_hw *hw,
--		unsigned long parent_rate)
--{
--	struct ipu_di *di = container_of(hw, struct ipu_di, clk_hw_out);
--	unsigned long outrate;
--	u32 div = ipu_di_read(di, DI_BS_CLKGEN0);
--
--	if (div < 0x10)
--		div = 0x10;
--
--	outrate = (parent_rate / div) * 16;
--
--	return outrate;
--}
--
--static long clk_di_round_rate(struct clk_hw *hw, unsigned long rate,
--				unsigned long *prate)
--{
--	struct ipu_di *di = container_of(hw, struct ipu_di, clk_hw_out);
--	unsigned long outrate;
--	int div;
--	u32 val;
--
--	div = ipu_di_clk_calc_div(*prate, rate);
--
--	outrate = (*prate / div) * 16;
--
--	val = ipu_di_read(di, DI_GENERAL);
--
--	if (!(val & DI_GEN_DI_CLK_EXT) && outrate > *prate / 2)
--		outrate = *prate / 2;
--
--	dev_dbg(di->ipu->dev,
--		"%s: inrate: %ld div: 0x%08x outrate: %ld wanted: %ld\n",
--			__func__, *prate, div, outrate, rate);
--
--	return outrate;
--}
--
--static int clk_di_set_rate(struct clk_hw *hw, unsigned long rate,
--				unsigned long parent_rate)
--{
--	struct ipu_di *di = container_of(hw, struct ipu_di, clk_hw_out);
--	int div;
--	u32 clkgen0;
--
--	clkgen0 = ipu_di_read(di, DI_BS_CLKGEN0) & ~0xfff;
--
--	div = ipu_di_clk_calc_div(parent_rate, rate);
--
--	ipu_di_write(di, clkgen0 | div, DI_BS_CLKGEN0);
--
--	dev_dbg(di->ipu->dev, "%s: inrate: %ld desired: %ld div: 0x%08x\n",
--			__func__, parent_rate, rate, div);
--	return 0;
--}
--
--static u8 clk_di_get_parent(struct clk_hw *hw)
--{
--	struct ipu_di *di = container_of(hw, struct ipu_di, clk_hw_out);
--	u32 val;
--
--	val = ipu_di_read(di, DI_GENERAL);
--
--	return val & DI_GEN_DI_CLK_EXT ? 1 : 0;
--}
--
--static int clk_di_set_parent(struct clk_hw *hw, u8 index)
--{
--	struct ipu_di *di = container_of(hw, struct ipu_di, clk_hw_out);
--	u32 val;
--
--	val = ipu_di_read(di, DI_GENERAL);
--
--	if (index)
--		val |= DI_GEN_DI_CLK_EXT;
--	else
--		val &= ~DI_GEN_DI_CLK_EXT;
--
--	ipu_di_write(di, val, DI_GENERAL);
--
--	return 0;
--}
--
--static struct clk_ops clk_di_ops = {
--	.round_rate = clk_di_round_rate,
--	.set_rate = clk_di_set_rate,
--	.recalc_rate = clk_di_recalc_rate,
--	.set_parent = clk_di_set_parent,
--	.get_parent = clk_di_get_parent,
--};
--
- static void ipu_di_data_wave_config(struct ipu_di *di,
- 				     int wave_gen,
- 				     int access_size, int component_size)
-@@ -528,42 +398,58 @@ static void ipu_di_sync_config_noninterlaced(struct ipu_di *di,
- 		ipu_di_sync_config(di, cfg_vga, 0, ARRAY_SIZE(cfg_vga));
- }
- 
--int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
-+static void ipu_di_config_clock(struct ipu_di *di,
-+	const struct ipu_di_signal_cfg *sig)
- {
--	u32 reg;
--	u32 di_gen, vsync_cnt;
--	u32 div;
--	u32 h_total, v_total;
--	int ret;
--	unsigned long round;
--	struct clk *parent;
-+	struct clk *clk;
-+	unsigned clkgen0;
-+	uint32_t val;
- 
--	dev_dbg(di->ipu->dev, "disp %d: panel size = %d x %d\n",
--		di->id, sig->width, sig->height);
-+	if (sig->clkflags & IPU_DI_CLKMODE_EXT) {
-+		/*
-+		 * CLKMODE_EXT means we must use the DI clock: this is
-+		 * needed for things like LVDS which needs to feed the
-+		 * DI and LDB with the same pixel clock.
-+		 */
-+		clk = di->clk_di;
-+
-+		if (sig->clkflags & IPU_DI_CLKMODE_SYNC) {
-+			/*
-+			 * CLKMODE_SYNC means that we want the DI to be
-+			 * clocked at the same rate as the parent clock.
-+			 * This is needed (eg) for LDB which needs to be
-+			 * fed with the same pixel clock.  We assume that
-+			 * the LDB clock has already been set correctly.
-+			 */
-+			clkgen0 = 1 << 4;
-+		} else {
-+			/*
-+			 * We can use the divider.  We should really have
-+			 * a flag here indicating whether the bridge can
-+			 * cope with a fractional divider or not.  For the
-+			 * time being, let's go for simplicitly and
-+			 * reliability.
-+			 */
-+			unsigned long in_rate;
-+			unsigned div;
- 
--	if ((sig->v_sync_width == 0) || (sig->h_sync_width == 0))
--		return -EINVAL;
-+			clk_set_rate(clk, sig->pixelclock);
- 
--	dev_dbg(di->ipu->dev, "Clocks: IPU %luHz DI %luHz Needed %luHz\n",
--		clk_get_rate(di->clk_ipu),
--		clk_get_rate(di->clk_di),
--		sig->pixelclock);
-+			in_rate = clk_get_rate(clk);
-+			div = (in_rate + sig->pixelclock / 2) / sig->pixelclock;
-+			if (div == 0)
-+				div = 1;
- 
--	/*
--	 * CLKMODE_EXT means we must use the DI clock: this is needed
--	 * for things like LVDS which needs to feed the DI and LDB with
--	 * the same pixel clock.
--	 *
--	 * For other interfaces, we can arbitarily select between the DI
--	 * specific clock and the internal IPU clock.  See DI_GENERAL
--	 * bit 20.  We select the IPU clock if it can give us a clock
--	 * rate within 1% of the requested frequency, otherwise we use
--	 * the DI clock.
--	 */
--	round = sig->pixelclock;
--	if (sig->clkflags & IPU_DI_CLKMODE_EXT) {
--		parent = di->clk_di;
-+			clkgen0 = div << 4;
-+		}
- 	} else {
-+		/*
-+		 * For other interfaces, we can arbitarily select between
-+		 * the DI specific clock and the internal IPU clock.  See
-+		 * DI_GENERAL bit 20.  We select the IPU clock if it can
-+		 * give us a clock rate within 1% of the requested frequency,
-+		 * otherwise we use the DI clock.
-+		 */
- 		unsigned long rate, clkrate;
- 		unsigned div, error;
- 
-@@ -578,54 +464,80 @@ int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
- 
- 		/* Allow a 1% error */
- 		if (error < 1010 && error >= 990) {
--			parent = di->clk_ipu;
-+			clk = di->clk_ipu;
-+
-+			clkgen0 = div << 4;
- 		} else {
--			parent = di->clk_di;
-+			unsigned long in_rate;
-+			unsigned div;
-+
-+			clk = di->clk_di;
- 
--			ret = clk_set_rate(parent, sig->pixelclock);
--			if (ret)
--				dev_err(di->ipu->dev, "Setting of DI clock failed: %d\n", ret);
-+			clk_set_rate(clk, sig->pixelclock);
- 
--			/* Use the integer divisor rate - avoid fractional dividers */
--			round = rate;
-+			in_rate = clk_get_rate(clk);
-+			div = (in_rate + sig->pixelclock / 2) / sig->pixelclock;
-+			if (div == 0)
-+				div = 1;
-+
-+			clkgen0 = div << 4;
- 		}
- 	}
- 
--	ret = clk_set_parent(di->clk_di_pixel, parent);
--	if (ret) {
--		dev_err(di->ipu->dev,
--			"setting pixel clock to parent %s failed with %d\n",
--				__clk_get_name(parent), ret);
--		return ret;
--	}
-+	di->clk_di_pixel = clk;
-+
-+	/* Set the divider */
-+	ipu_di_write(di, clkgen0, DI_BS_CLKGEN0);
- 
- 	/*
--	 * CLKMODE_SYNC means that we want the DI to be clocked at the
--	 * same rate as the parent clock.  This is needed (eg) for LDB
--	 * which needs to be fed with the same pixel clock.
--	 *
--	 * Note: clk_set_rate(clk, clk_round_rate(clk, rate)) is the
--	 * same as clk_set_rate(clk, rate);
-+	 * Set the high/low periods.  Bits 24:16 give us the falling edge,
-+	 * and bits 8:0 give the rising edge.  LSB is fraction, and is
-+	 * based on the divider above.  We want a 50% duty cycle, so set
-+	 * the falling edge to be half the divider.
- 	 */
--	if (sig->clkflags & IPU_DI_CLKMODE_SYNC)
--		round = clk_get_rate(parent);
-+	ipu_di_write(di, (clkgen0 >> 4) << 16, DI_BS_CLKGEN1);
- 
--	ret = clk_set_rate(di->clk_di_pixel, round);
-+	/* Finally select the input clock */
-+	val = ipu_di_read(di, DI_GENERAL) & ~DI_GEN_DI_CLK_EXT;
-+	if (clk == di->clk_di)
-+		val |= DI_GEN_DI_CLK_EXT;
-+	ipu_di_write(di, val, DI_GENERAL);
- 
--	dev_dbg(di->ipu->dev, "Want %luHz IPU %luHz DI %luHz using %s, got %luHz\n",
-+	dev_dbg(di->ipu->dev, "Want %luHz IPU %luHz DI %luHz using %s, %luHz\n",
- 		sig->pixelclock,
- 		clk_get_rate(di->clk_ipu),
- 		clk_get_rate(di->clk_di),
--		parent == di->clk_di ? "DI" : "IPU",
--		clk_get_rate(di->clk_di_pixel));
-+		clk == di->clk_di ? "DI" : "IPU",
-+		clk_get_rate(di->clk_di_pixel) / (clkgen0 >> 4));
-+}
-+
-+int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
-+{
-+	u32 reg;
-+	u32 di_gen, vsync_cnt;
-+	u32 div;
-+	u32 h_total, v_total;
-+
-+	dev_dbg(di->ipu->dev, "disp %d: panel size = %d x %d\n",
-+		di->id, sig->width, sig->height);
-+
-+	if ((sig->v_sync_width == 0) || (sig->h_sync_width == 0))
-+		return -EINVAL;
- 
- 	h_total = sig->width + sig->h_sync_width + sig->h_start_width +
- 		sig->h_end_width;
- 	v_total = sig->height + sig->v_sync_width + sig->v_start_width +
- 		sig->v_end_width;
- 
-+	dev_dbg(di->ipu->dev, "Clocks: IPU %luHz DI %luHz Needed %luHz\n",
-+		clk_get_rate(di->clk_ipu),
-+		clk_get_rate(di->clk_di),
-+		sig->pixelclock);
-+
- 	mutex_lock(&di_mutex);
- 
-+	ipu_di_config_clock(di, sig);
-+
- 	div = ipu_di_read(di, DI_BS_CLKGEN0) & 0xfff;
- 	div = div / 16;		/* Now divider is integer portion */
- 
-@@ -709,7 +621,11 @@ EXPORT_SYMBOL_GPL(ipu_di_init_sync_panel);
- 
- int ipu_di_enable(struct ipu_di *di)
- {
--	int ret = clk_prepare_enable(di->clk_di_pixel);
-+	int ret;
-+
-+	WARN_ON(IS_ERR(di->clk_di_pixel));
-+
-+	ret = clk_prepare_enable(di->clk_di_pixel);
- 	if (ret)
- 		return ret;
- 
-@@ -721,6 +637,8 @@ EXPORT_SYMBOL_GPL(ipu_di_enable);
- 
- int ipu_di_disable(struct ipu_di *di)
- {
-+	WARN_ON(IS_ERR(di->clk_di_pixel));
-+
- 	ipu_module_disable(di->ipu, di->module);
- 
- 	clk_disable_unprepare(di->clk_di_pixel);
-@@ -776,13 +694,6 @@ int ipu_di_init(struct ipu_soc *ipu, struct device *dev, int id,
- 		u32 module, struct clk *clk_ipu)
- {
- 	struct ipu_di *di;
--	int ret;
--	const char *di_parent[2];
--	struct clk_init_data init = {
--		.ops = &clk_di_ops,
--		.num_parents = 2,
--		.flags = 0,
--	};
- 
- 	if (id > 1)
- 		return -ENODEV;
-@@ -804,45 +715,16 @@ int ipu_di_init(struct ipu_soc *ipu, struct device *dev, int id,
- 	if (!di->base)
- 		return -ENOMEM;
- 
--	di_parent[0] = __clk_get_name(di->clk_ipu);
--	di_parent[1] = __clk_get_name(di->clk_di);
--
- 	ipu_di_write(di, 0x10, DI_BS_CLKGEN0);
- 
--	init.parent_names = (const char **)&di_parent;
--	di->clk_name = kasprintf(GFP_KERNEL, "%s_di%d_pixel",
--			dev_name(dev), id);
--	if (!di->clk_name)
--		return -ENOMEM;
--
--	init.name = di->clk_name;
--
--	di->clk_hw_out.init = &init;
--	di->clk_di_pixel = clk_register(dev, &di->clk_hw_out);
--
--	if (IS_ERR(di->clk_di_pixel)) {
--		ret = PTR_ERR(di->clk_di_pixel);
--		goto failed_clk_register;
--	}
--
- 	dev_dbg(dev, "DI%d base: 0x%08lx remapped to %p\n",
- 			id, base, di->base);
- 	di->inuse = false;
- 	di->ipu = ipu;
- 
- 	return 0;
--
--failed_clk_register:
--
--	kfree(di->clk_name);
--
--	return ret;
- }
- 
- void ipu_di_exit(struct ipu_soc *ipu, int id)
- {
--	struct ipu_di *di = ipu->di_priv[id];
--
--	clk_unregister(di->clk_di_pixel);
--	kfree(di->clk_name);
- }
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0009-imx-drm-add-imx6-DT-configuration-for-HDMI.patch b/patches/imx_drm/0009-imx-drm-add-imx6-DT-configuration-for-HDMI.patch
deleted file mode 100644
index cd2154afd..000000000
--- a/patches/imx_drm/0009-imx-drm-add-imx6-DT-configuration-for-HDMI.patch
+++ /dev/null
@@ -1,66 +0,0 @@
-From 04cec1a2bc5c70e719c1da8eaca2842da4cd77fb Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Wed, 16 Oct 2013 10:19:00 +0100
-Subject: [PATCH 09/67] imx-drm: add imx6 DT configuration for HDMI
-
-Extracted from another patch by Fabio Estevam, this adds the DT
-configuration for HDMI output on the IMX6 SoCs
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- arch/arm/boot/dts/imx6dl.dtsi  |  4 ++++
- arch/arm/boot/dts/imx6q.dtsi   |  4 ++++
- arch/arm/boot/dts/imx6qdl.dtsi | 10 ++++++++++
- 3 files changed, 18 insertions(+)
-
-diff --git a/arch/arm/boot/dts/imx6dl.dtsi b/arch/arm/boot/dts/imx6dl.dtsi
-index 9c4942f..818bed3 100644
---- a/arch/arm/boot/dts/imx6dl.dtsi
-+++ b/arch/arm/boot/dts/imx6dl.dtsi
-@@ -109,3 +109,7 @@
- 		crtcs = <&ipu1 0>, <&ipu1 1>;
- 	};
- };
-+
-+&hdmi {
-+	crtcs = <&ipu1 0>, <&ipu1 1>;
-+}
-diff --git a/arch/arm/boot/dts/imx6q.dtsi b/arch/arm/boot/dts/imx6q.dtsi
-index fadf498..0ebfea7 100644
---- a/arch/arm/boot/dts/imx6q.dtsi
-+++ b/arch/arm/boot/dts/imx6q.dtsi
-@@ -174,3 +174,7 @@
- 		crtcs = <&ipu1 0>, <&ipu1 1>, <&ipu2 0>, <&ipu2 1>;
- 	};
- };
-+
-+&hdmi {
-+	crtcs = <&ipu1 0>, <&ipu1 1>, <&ipu2 0>, <&ipu2 1>;
-+};
-diff --git a/arch/arm/boot/dts/imx6qdl.dtsi b/arch/arm/boot/dts/imx6qdl.dtsi
-index 947e463..3a4f36f 100644
---- a/arch/arm/boot/dts/imx6qdl.dtsi
-+++ b/arch/arm/boot/dts/imx6qdl.dtsi
-@@ -674,6 +674,16 @@
- 				};
- 			};
- 
-+			hdmi: hdmi@0120000 {
-+				compatible = "fsl,imx6q-hdmi";
-+				reg = <0x00120000 0x9000>;
-+				interrupts = <0 115 0x04>;
-+				gpr = <&gpr>;
-+				clocks = <&clks 123>, <&clks 124>;
-+				clock-names = "iahb", "isfr";
-+				status = "disabled";
-+			};
-+
- 			dcic1: dcic@020e4000 {
- 				reg = <0x020e4000 0x4000>;
- 				interrupts = <0 124 IRQ_TYPE_LEVEL_HIGH>;
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0010-imx-drm-update-and-fix-imx6-DT-descriptions-for-v3-H.patch b/patches/imx_drm/0010-imx-drm-update-and-fix-imx6-DT-descriptions-for-v3-H.patch
deleted file mode 100644
index a4c04dc13..000000000
--- a/patches/imx_drm/0010-imx-drm-update-and-fix-imx6-DT-descriptions-for-v3-H.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-From cf83eb24d22f3a9580fb86ee64e2830c65df062a Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Wed, 30 Oct 2013 20:10:31 +0000
-Subject: [PATCH 10/67] imx-drm: update and fix imx6 DT descriptions for v3
- HDMI driver
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- arch/arm/boot/dts/imx6dl.dtsi  | 3 ++-
- arch/arm/boot/dts/imx6q.dtsi   | 1 +
- arch/arm/boot/dts/imx6qdl.dtsi | 1 -
- 3 files changed, 3 insertions(+), 2 deletions(-)
-
-diff --git a/arch/arm/boot/dts/imx6dl.dtsi b/arch/arm/boot/dts/imx6dl.dtsi
-index 65e54b4..6dc3970 100644
---- a/arch/arm/boot/dts/imx6dl.dtsi
-+++ b/arch/arm/boot/dts/imx6dl.dtsi
-@@ -90,5 +90,6 @@
- };
- 
- &hdmi {
-+	compatible = "fsl,imx6dl-hdmi";
- 	crtcs = <&ipu1 0>, <&ipu1 1>;
--}
-+};
-diff --git a/arch/arm/boot/dts/imx6q.dtsi b/arch/arm/boot/dts/imx6q.dtsi
-index d2467f5..187fe33 100644
---- a/arch/arm/boot/dts/imx6q.dtsi
-+++ b/arch/arm/boot/dts/imx6q.dtsi
-@@ -161,5 +161,6 @@
- };
- 
- &hdmi {
-+	compatible = "fsl,imx6q-hdmi";
- 	crtcs = <&ipu1 0>, <&ipu1 1>, <&ipu2 0>, <&ipu2 1>;
- };
-diff --git a/arch/arm/boot/dts/imx6qdl.dtsi b/arch/arm/boot/dts/imx6qdl.dtsi
-index 400bbc6..930ebe0 100644
---- a/arch/arm/boot/dts/imx6qdl.dtsi
-+++ b/arch/arm/boot/dts/imx6qdl.dtsi
-@@ -1369,7 +1369,6 @@
- 			};
- 
- 			hdmi: hdmi@0120000 {
--				compatible = "fsl,imx6q-hdmi";
- 				reg = <0x00120000 0x9000>;
- 				interrupts = <0 115 0x04>;
- 				gpr = <&gpr>;
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0011-imx-drm-imx-drm-core-sanitise-imx_drm_encoder_get_mu.patch b/patches/imx_drm/0011-imx-drm-imx-drm-core-sanitise-imx_drm_encoder_get_mu.patch
deleted file mode 100644
index a34256e43..000000000
--- a/patches/imx_drm/0011-imx-drm-imx-drm-core-sanitise-imx_drm_encoder_get_mu.patch
+++ /dev/null
@@ -1,135 +0,0 @@
-From e76171b046e95e45266f3a4f4b900a5647e80d70 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Sun, 24 Nov 2013 13:02:52 +0000
-Subject: [PATCH 11/67] imx-drm: imx-drm-core: sanitise
- imx_drm_encoder_get_mux_id()
-
-Address the following issues:
-- imx_drm_encoder_get_mux_id() searches the CRTC list for the matching
-  CRTC, and returns the position within this list as the MUX programming
-  value for encoders.  This is sub-optimal for two reasons:
-  1. It relies upon the CRTC list not changing during the lifetime of
-     the driver.
-  2. It is dependent on the initialisation order of the CRTCs.
-
-  We address (1) in this patch, leaving (2) until a better solution can
-  be found, as (2) requires larger changes.
-
-- imx_drm_encoder is unused.  Instead, pass the drm_encoder which is
-  slightly more useful; all callers pass encoder->crtc as the required
-  crtc, so move this inside the function.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/imx-drm-core.c | 17 ++++++-----------
- drivers/staging/imx-drm/imx-drm.h      |  3 +--
- drivers/staging/imx-drm/imx-hdmi.c     |  3 +--
- drivers/staging/imx-drm/imx-ldb.c      |  6 ++----
- 4 files changed, 10 insertions(+), 19 deletions(-)
-
-diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c
-index 236ed66..92fde89 100644
---- a/drivers/staging/imx-drm/imx-drm-core.c
-+++ b/drivers/staging/imx-drm/imx-drm-core.c
-@@ -53,6 +53,7 @@ struct imx_drm_crtc {
- 	struct imx_drm_crtc_helper_funcs	imx_drm_helper_funcs;
- 	struct module				*owner;
- 	struct crtc_cookie			cookie;
-+	int					mux_id;
- };
- 
- struct imx_drm_encoder {
-@@ -503,7 +504,7 @@ int imx_drm_add_crtc(struct drm_crtc *crtc,
- 	imx_drm_crtc->pipe = imxdrm->pipes++;
- 	imx_drm_crtc->cookie.cookie = cookie;
- 	imx_drm_crtc->cookie.id = id;
--
-+	imx_drm_crtc->mux_id = imx_drm_crtc->pipe;
- 	imx_drm_crtc->crtc = crtc;
- 	imx_drm_crtc->imxdrm = imxdrm;
- 
-@@ -657,22 +658,16 @@ int imx_drm_encoder_add_possible_crtcs(
- }
- EXPORT_SYMBOL_GPL(imx_drm_encoder_add_possible_crtcs);
- 
--int imx_drm_encoder_get_mux_id(struct imx_drm_encoder *imx_drm_encoder,
--		struct drm_crtc *crtc)
-+int imx_drm_encoder_get_mux_id(struct drm_encoder *encoder)
- {
- 	struct imx_drm_device *imxdrm = __imx_drm_device();
- 	struct imx_drm_crtc *imx_crtc;
--	int i = 0;
- 
--	list_for_each_entry(imx_crtc, &imxdrm->crtc_list, list) {
--		if (imx_crtc->crtc == crtc)
--			goto found;
--		i++;
--	}
-+	list_for_each_entry(imx_crtc, &imxdrm->crtc_list, list)
-+		if (imx_crtc->crtc == encoder->crtc)
-+			return imx_crtc->mux_id;
- 
- 	return -EINVAL;
--found:
--	return i;
- }
- EXPORT_SYMBOL_GPL(imx_drm_encoder_get_mux_id);
- 
-diff --git a/drivers/staging/imx-drm/imx-drm.h b/drivers/staging/imx-drm/imx-drm.h
-index ae90c9c..5649f18 100644
---- a/drivers/staging/imx-drm/imx-drm.h
-+++ b/drivers/staging/imx-drm/imx-drm.h
-@@ -64,8 +64,7 @@ void imx_drm_fb_helper_set(struct drm_fbdev_cma *fbdev_helper);
- 
- struct device_node;
- 
--int imx_drm_encoder_get_mux_id(struct imx_drm_encoder *imx_drm_encoder,
--		struct drm_crtc *crtc);
-+int imx_drm_encoder_get_mux_id(struct drm_encoder *encoder);
- int imx_drm_encoder_add_possible_crtcs(struct imx_drm_encoder *imx_drm_encoder,
- 		struct device_node *np);
- 
-diff --git a/drivers/staging/imx-drm/imx-hdmi.c b/drivers/staging/imx-drm/imx-hdmi.c
-index 05cf8a0..a90f08d 100644
---- a/drivers/staging/imx-drm/imx-hdmi.c
-+++ b/drivers/staging/imx-drm/imx-hdmi.c
-@@ -1467,8 +1467,7 @@ static void imx_hdmi_encoder_prepare(struct drm_encoder *encoder)
- static void imx_hdmi_encoder_commit(struct drm_encoder *encoder)
- {
- 	struct imx_hdmi *hdmi = container_of(encoder, struct imx_hdmi, encoder);
--	int mux = imx_drm_encoder_get_mux_id(hdmi->imx_drm_encoder,
--					     encoder->crtc);
-+	int mux = imx_drm_encoder_get_mux_id(encoder);
- 
- 	imx_hdmi_set_ipu_di_mux(hdmi, mux);
- 
-diff --git a/drivers/staging/imx-drm/imx-ldb.c b/drivers/staging/imx-drm/imx-ldb.c
-index 7e59329..4aa47ae 100644
---- a/drivers/staging/imx-drm/imx-ldb.c
-+++ b/drivers/staging/imx-drm/imx-ldb.c
-@@ -179,8 +179,7 @@ static void imx_ldb_encoder_prepare(struct drm_encoder *encoder)
- 	u32 pixel_fmt;
- 	unsigned long serial_clk;
- 	unsigned long di_clk = mode->clock * 1000;
--	int mux = imx_drm_encoder_get_mux_id(imx_ldb_ch->imx_drm_encoder,
--					     encoder->crtc);
-+	int mux = imx_drm_encoder_get_mux_id(encoder);
- 
- 	if (ldb->ldb_ctrl & LDB_SPLIT_MODE_EN) {
- 		/* dual channel LVDS mode */
-@@ -216,8 +215,7 @@ static void imx_ldb_encoder_commit(struct drm_encoder *encoder)
- 	struct imx_ldb_channel *imx_ldb_ch = enc_to_imx_ldb_ch(encoder);
- 	struct imx_ldb *ldb = imx_ldb_ch->ldb;
- 	int dual = ldb->ldb_ctrl & LDB_SPLIT_MODE_EN;
--	int mux = imx_drm_encoder_get_mux_id(imx_ldb_ch->imx_drm_encoder,
--					     encoder->crtc);
-+	int mux = imx_drm_encoder_get_mux_id(encoder);
- 
- 	if (dual) {
- 		clk_prepare_enable(ldb->clk[0]);
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0012-imx-drm-imx-drm-core-use-array-instead-of-list-for-C.patch b/patches/imx_drm/0012-imx-drm-imx-drm-core-use-array-instead-of-list-for-C.patch
deleted file mode 100644
index 77f43c722..000000000
--- a/patches/imx_drm/0012-imx-drm-imx-drm-core-use-array-instead-of-list-for-C.patch
+++ /dev/null
@@ -1,177 +0,0 @@
-From 887eceacc52e3f83fc8dd819c447632d3c0eb7d2 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Sun, 24 Nov 2013 13:23:17 +0000
-Subject: [PATCH 12/67] imx-drm: imx-drm-core: use array instead of list for
- CRTCs
-
-The DRM core indexes vblank by number, so there's little point
-maintaining a list, and have to scan the list to find the appropriate
-structure.  Instead, use an array of pointers to the CRTCs.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/imx-drm-core.c | 57 ++++++++++++++--------------------
- 1 file changed, 23 insertions(+), 34 deletions(-)
-
-diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c
-index 92fde89..c526884 100644
---- a/drivers/staging/imx-drm/imx-drm-core.c
-+++ b/drivers/staging/imx-drm/imx-drm-core.c
-@@ -34,10 +34,12 @@ struct crtc_cookie {
- 	struct list_head list;
- };
- 
-+struct imx_drm_crtc;
-+
- struct imx_drm_device {
- 	struct drm_device			*drm;
- 	struct device				*dev;
--	struct list_head			crtc_list;
-+	struct imx_drm_crtc			*crtc[MAX_CRTC];
- 	struct list_head			encoder_list;
- 	struct list_head			connector_list;
- 	struct mutex				mutex;
-@@ -47,7 +49,6 @@ struct imx_drm_device {
- 
- struct imx_drm_crtc {
- 	struct drm_crtc				*crtc;
--	struct list_head			list;
- 	struct imx_drm_device			*imxdrm;
- 	int					pipe;
- 	struct imx_drm_crtc_helper_funcs	imx_drm_helper_funcs;
-@@ -69,6 +70,8 @@ struct imx_drm_connector {
- 	struct module				*owner;
- };
- 
-+static struct imx_drm_device *__imx_drm_device(void);
-+
- int imx_drm_crtc_id(struct imx_drm_crtc *crtc)
- {
- 	return crtc->pipe;
-@@ -96,34 +99,28 @@ static int imx_drm_driver_unload(struct drm_device *drm)
- 	return 0;
- }
- 
--/*
-- * We don't care at all for crtc numbers, but the core expects the
-- * crtcs to be numbered
-- */
--static struct imx_drm_crtc *imx_drm_crtc_by_num(struct imx_drm_device *imxdrm,
--		int num)
-+struct imx_drm_crtc *imx_drm_find_crtc(struct drm_crtc *crtc)
- {
--	struct imx_drm_crtc *imx_drm_crtc;
-+	struct imx_drm_device *imxdrm = __imx_drm_device();
-+	unsigned i;
-+
-+	for (i = 0; i < MAX_CRTC; i++)
-+		if (imxdrm->crtc[i] && imxdrm->crtc[i]->crtc == crtc)
-+			return imxdrm->crtc[i];
- 
--	list_for_each_entry(imx_drm_crtc, &imxdrm->crtc_list, list)
--		if (imx_drm_crtc->pipe == num)
--			return imx_drm_crtc;
- 	return NULL;
- }
- 
- int imx_drm_crtc_panel_format_pins(struct drm_crtc *crtc, u32 encoder_type,
- 		u32 interface_pix_fmt, int hsync_pin, int vsync_pin)
- {
--	struct imx_drm_device *imxdrm = crtc->dev->dev_private;
--	struct imx_drm_crtc *imx_crtc;
- 	struct imx_drm_crtc_helper_funcs *helper;
-+	struct imx_drm_crtc *imx_crtc;
- 
--	list_for_each_entry(imx_crtc, &imxdrm->crtc_list, list)
--		if (imx_crtc->crtc == crtc)
--			goto found;
-+	imx_crtc = imx_drm_find_crtc(crtc);
-+	if (!imx_crtc)
-+		return -EINVAL;
- 
--	return -EINVAL;
--found:
- 	helper = &imx_crtc->imx_drm_helper_funcs;
- 	if (helper->set_interface_pix_fmt)
- 		return helper->set_interface_pix_fmt(crtc,
-@@ -162,10 +159,9 @@ EXPORT_SYMBOL_GPL(imx_drm_handle_vblank);
- static int imx_drm_enable_vblank(struct drm_device *drm, int crtc)
- {
- 	struct imx_drm_device *imxdrm = drm->dev_private;
--	struct imx_drm_crtc *imx_drm_crtc;
-+	struct imx_drm_crtc *imx_drm_crtc = imxdrm->crtc[crtc];
- 	int ret;
- 
--	imx_drm_crtc = imx_drm_crtc_by_num(imxdrm, crtc);
- 	if (!imx_drm_crtc)
- 		return -EINVAL;
- 
-@@ -181,9 +177,8 @@ static int imx_drm_enable_vblank(struct drm_device *drm, int crtc)
- static void imx_drm_disable_vblank(struct drm_device *drm, int crtc)
- {
- 	struct imx_drm_device *imxdrm = drm->dev_private;
--	struct imx_drm_crtc *imx_drm_crtc;
-+	struct imx_drm_crtc *imx_drm_crtc = imxdrm->crtc[crtc];
- 
--	imx_drm_crtc = imx_drm_crtc_by_num(imxdrm, crtc);
- 	if (!imx_drm_crtc)
- 		return;
- 
-@@ -510,7 +505,7 @@ int imx_drm_add_crtc(struct drm_crtc *crtc,
- 
- 	imx_drm_crtc->owner = owner;
- 
--	list_add_tail(&imx_drm_crtc->list, &imxdrm->crtc_list);
-+	imxdrm->crtc[imx_drm_crtc->pipe] = imx_drm_crtc;
- 
- 	*new_crtc = imx_drm_crtc;
- 
-@@ -533,7 +528,7 @@ int imx_drm_add_crtc(struct drm_crtc *crtc,
- 	return 0;
- 
- err_register:
--	list_del(&imx_drm_crtc->list);
-+	imxdrm->crtc[imx_drm_crtc->pipe] = NULL;
- 	kfree(imx_drm_crtc);
- err_alloc:
- err_busy:
-@@ -553,7 +548,7 @@ int imx_drm_remove_crtc(struct imx_drm_crtc *imx_drm_crtc)
- 
- 	drm_crtc_cleanup(imx_drm_crtc->crtc);
- 
--	list_del(&imx_drm_crtc->list);
-+	imxdrm->crtc[imx_drm_crtc->pipe] = NULL;
- 
- 	drm_mode_group_reinit(imxdrm->drm);
- 
-@@ -660,14 +655,9 @@ EXPORT_SYMBOL_GPL(imx_drm_encoder_add_possible_crtcs);
- 
- int imx_drm_encoder_get_mux_id(struct drm_encoder *encoder)
- {
--	struct imx_drm_device *imxdrm = __imx_drm_device();
--	struct imx_drm_crtc *imx_crtc;
--
--	list_for_each_entry(imx_crtc, &imxdrm->crtc_list, list)
--		if (imx_crtc->crtc == encoder->crtc)
--			return imx_crtc->mux_id;
-+	struct imx_drm_crtc *imx_crtc = imx_drm_find_crtc(encoder->crtc);
- 
--	return -EINVAL;
-+	return imx_crtc ? imx_crtc->mux_id : -EINVAL;
- }
- EXPORT_SYMBOL_GPL(imx_drm_encoder_get_mux_id);
- 
-@@ -854,7 +844,6 @@ static int __init imx_drm_init(void)
- 		return -ENOMEM;
- 
- 	mutex_init(&imx_drm_device->mutex);
--	INIT_LIST_HEAD(&imx_drm_device->crtc_list);
- 	INIT_LIST_HEAD(&imx_drm_device->connector_list);
- 	INIT_LIST_HEAD(&imx_drm_device->encoder_list);
- 
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0013-imx-drm-provide-common-connector-mode-validation-fun.patch b/patches/imx_drm/0013-imx-drm-provide-common-connector-mode-validation-fun.patch
deleted file mode 100644
index 5a3003eaa..000000000
--- a/patches/imx_drm/0013-imx-drm-provide-common-connector-mode-validation-fun.patch
+++ /dev/null
@@ -1,151 +0,0 @@
-From baa68c4bfd9f85ada2d7bb3416f76561a84f1a0e Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Sat, 9 Nov 2013 11:20:55 +0000
-Subject: [PATCH 13/67] imx-drm: provide common connector mode validation
- function
-
-Provide a common connector mode validation function, which can be used
-to limit the available modes according to other components in the
-system.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/imx-drm-core.c     | 7 +++++++
- drivers/staging/imx-drm/imx-drm.h          | 3 +++
- drivers/staging/imx-drm/imx-hdmi.c         | 9 +--------
- drivers/staging/imx-drm/imx-ldb.c          | 8 +-------
- drivers/staging/imx-drm/imx-tve.c          | 5 +++++
- drivers/staging/imx-drm/parallel-display.c | 8 +-------
- 6 files changed, 18 insertions(+), 22 deletions(-)
-
-diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c
-index c526884..7f14ed0 100644
---- a/drivers/staging/imx-drm/imx-drm-core.c
-+++ b/drivers/staging/imx-drm/imx-drm-core.c
-@@ -211,6 +211,13 @@ static const struct file_operations imx_drm_driver_fops = {
- 	.llseek = noop_llseek,
- };
- 
-+int imx_drm_connector_mode_valid(struct drm_connector *connector,
-+	struct drm_display_mode *mode)
-+{
-+	return MODE_OK;
-+}
-+EXPORT_SYMBOL(imx_drm_connector_mode_valid);
-+
- static struct imx_drm_device *imx_drm_device;
- 
- static struct imx_drm_device *__imx_drm_device(void)
-diff --git a/drivers/staging/imx-drm/imx-drm.h b/drivers/staging/imx-drm/imx-drm.h
-index 5649f18..4eb594c 100644
---- a/drivers/staging/imx-drm/imx-drm.h
-+++ b/drivers/staging/imx-drm/imx-drm.h
-@@ -68,4 +68,7 @@ int imx_drm_encoder_get_mux_id(struct drm_encoder *encoder);
- int imx_drm_encoder_add_possible_crtcs(struct imx_drm_encoder *imx_drm_encoder,
- 		struct device_node *np);
- 
-+int imx_drm_connector_mode_valid(struct drm_connector *connector,
-+	struct drm_display_mode *mode);
-+
- #endif /* _IMX_DRM_H_ */
-diff --git a/drivers/staging/imx-drm/imx-hdmi.c b/drivers/staging/imx-drm/imx-hdmi.c
-index a90f08d..4b69045 100644
---- a/drivers/staging/imx-drm/imx-hdmi.c
-+++ b/drivers/staging/imx-drm/imx-hdmi.c
-@@ -1406,13 +1406,6 @@ static int imx_hdmi_connector_get_modes(struct drm_connector *connector)
- 	return 0;
- }
- 
--static int imx_hdmi_connector_mode_valid(struct drm_connector *connector,
--			  struct drm_display_mode *mode)
--{
--
--	return MODE_OK;
--}
--
- static struct drm_encoder *imx_hdmi_connector_best_encoder(struct drm_connector
- 							   *connector)
- {
-@@ -1501,7 +1494,7 @@ static struct drm_connector_funcs imx_hdmi_connector_funcs = {
- 
- static struct drm_connector_helper_funcs imx_hdmi_connector_helper_funcs = {
- 	.get_modes = imx_hdmi_connector_get_modes,
--	.mode_valid = imx_hdmi_connector_mode_valid,
-+	.mode_valid = imx_drm_connector_mode_valid,
- 	.best_encoder = imx_hdmi_connector_best_encoder,
- };
- 
-diff --git a/drivers/staging/imx-drm/imx-ldb.c b/drivers/staging/imx-drm/imx-ldb.c
-index 4aa47ae..c6ec1e9 100644
---- a/drivers/staging/imx-drm/imx-ldb.c
-+++ b/drivers/staging/imx-drm/imx-ldb.c
-@@ -120,12 +120,6 @@ static int imx_ldb_connector_get_modes(struct drm_connector *connector)
- 	return num_modes;
- }
- 
--static int imx_ldb_connector_mode_valid(struct drm_connector *connector,
--			  struct drm_display_mode *mode)
--{
--	return 0;
--}
--
- static struct drm_encoder *imx_ldb_connector_best_encoder(
- 		struct drm_connector *connector)
- {
-@@ -329,7 +323,7 @@ static struct drm_connector_funcs imx_ldb_connector_funcs = {
- static struct drm_connector_helper_funcs imx_ldb_connector_helper_funcs = {
- 	.get_modes = imx_ldb_connector_get_modes,
- 	.best_encoder = imx_ldb_connector_best_encoder,
--	.mode_valid = imx_ldb_connector_mode_valid,
-+	.mode_valid = imx_drm_connector_mode_valid,
- };
- 
- static struct drm_encoder_funcs imx_ldb_encoder_funcs = {
-diff --git a/drivers/staging/imx-drm/imx-tve.c b/drivers/staging/imx-drm/imx-tve.c
-index 9abc7ca..2d4e097 100644
---- a/drivers/staging/imx-drm/imx-tve.c
-+++ b/drivers/staging/imx-drm/imx-tve.c
-@@ -254,6 +254,11 @@ static int imx_tve_connector_mode_valid(struct drm_connector *connector,
- {
- 	struct imx_tve *tve = con_to_tve(connector);
- 	unsigned long rate;
-+	int ret;
-+
-+	ret = imx_drm_connector_mode_valid(connector, mode);
-+	if (ret != MODE_OK)
-+		return ret;
- 
- 	/* pixel clock with 2x oversampling */
- 	rate = clk_round_rate(tve->clk, 2000UL * mode->clock) / 2000;
-diff --git a/drivers/staging/imx-drm/parallel-display.c b/drivers/staging/imx-drm/parallel-display.c
-index 351d61d..18a3e8a 100644
---- a/drivers/staging/imx-drm/parallel-display.c
-+++ b/drivers/staging/imx-drm/parallel-display.c
-@@ -85,12 +85,6 @@ static int imx_pd_connector_get_modes(struct drm_connector *connector)
- 	return num_modes;
- }
- 
--static int imx_pd_connector_mode_valid(struct drm_connector *connector,
--			  struct drm_display_mode *mode)
--{
--	return 0;
--}
--
- static struct drm_encoder *imx_pd_connector_best_encoder(
- 		struct drm_connector *connector)
- {
-@@ -147,7 +141,7 @@ static struct drm_connector_funcs imx_pd_connector_funcs = {
- static struct drm_connector_helper_funcs imx_pd_connector_helper_funcs = {
- 	.get_modes = imx_pd_connector_get_modes,
- 	.best_encoder = imx_pd_connector_best_encoder,
--	.mode_valid = imx_pd_connector_mode_valid,
-+	.mode_valid = imx_drm_connector_mode_valid,
- };
- 
- static struct drm_encoder_funcs imx_pd_encoder_funcs = {
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0014-imx-drm-simplify-setup-of-panel-format.patch b/patches/imx_drm/0014-imx-drm-simplify-setup-of-panel-format.patch
deleted file mode 100644
index e76c10bf7..000000000
--- a/patches/imx_drm/0014-imx-drm-simplify-setup-of-panel-format.patch
+++ /dev/null
@@ -1,183 +0,0 @@
-From f2d66aad1aade34df678177c5ccb58feaea72156 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Sun, 3 Nov 2013 15:52:16 +0000
-Subject: [PATCH 14/67] imx-drm: simplify setup of panel format
-
-The encoder format passed into imx_drm_crtc_panel_format*() is the
-encoder format used for DRM in most cases; the HDMI encoder sets
-this to none, but this is incorrect, it should be TMDS.
-
-Since this is the case, we can pass the drm_encoder structure
-directly into this function and use the supplied fields there to
-configure the CRTC.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/imx-drm-core.c     | 18 ++++++++----------
- drivers/staging/imx-drm/imx-drm.h          |  4 ++--
- drivers/staging/imx-drm/imx-hdmi.c         |  3 +--
- drivers/staging/imx-drm/imx-ldb.c          |  3 +--
- drivers/staging/imx-drm/imx-tve.c          | 12 +++++++-----
- drivers/staging/imx-drm/ipuv3-crtc.c       |  1 +
- drivers/staging/imx-drm/parallel-display.c |  3 +--
- 7 files changed, 21 insertions(+), 23 deletions(-)
-
-diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c
-index 7f14ed0..d9786ec 100644
---- a/drivers/staging/imx-drm/imx-drm-core.c
-+++ b/drivers/staging/imx-drm/imx-drm-core.c
-@@ -111,32 +111,30 @@ struct imx_drm_crtc *imx_drm_find_crtc(struct drm_crtc *crtc)
- 	return NULL;
- }
- 
--int imx_drm_crtc_panel_format_pins(struct drm_crtc *crtc, u32 encoder_type,
-+int imx_drm_panel_format_pins(struct drm_encoder *encoder,
- 		u32 interface_pix_fmt, int hsync_pin, int vsync_pin)
- {
- 	struct imx_drm_crtc_helper_funcs *helper;
- 	struct imx_drm_crtc *imx_crtc;
- 
--	imx_crtc = imx_drm_find_crtc(crtc);
-+	imx_crtc = imx_drm_find_crtc(encoder->crtc);
- 	if (!imx_crtc)
- 		return -EINVAL;
- 
- 	helper = &imx_crtc->imx_drm_helper_funcs;
- 	if (helper->set_interface_pix_fmt)
--		return helper->set_interface_pix_fmt(crtc,
--				encoder_type, interface_pix_fmt,
-+		return helper->set_interface_pix_fmt(encoder->crtc,
-+				encoder->encoder_type, interface_pix_fmt,
- 				hsync_pin, vsync_pin);
- 	return 0;
- }
--EXPORT_SYMBOL_GPL(imx_drm_crtc_panel_format_pins);
-+EXPORT_SYMBOL_GPL(imx_drm_panel_format_pins);
- 
--int imx_drm_crtc_panel_format(struct drm_crtc *crtc, u32 encoder_type,
--		u32 interface_pix_fmt)
-+int imx_drm_panel_format(struct drm_encoder *encoder, u32 interface_pix_fmt)
- {
--	return imx_drm_crtc_panel_format_pins(crtc, encoder_type,
--					      interface_pix_fmt, 2, 3);
-+	return imx_drm_panel_format_pins(encoder, interface_pix_fmt, 2, 3);
- }
--EXPORT_SYMBOL_GPL(imx_drm_crtc_panel_format);
-+EXPORT_SYMBOL_GPL(imx_drm_panel_format);
- 
- int imx_drm_crtc_vblank_get(struct imx_drm_crtc *imx_drm_crtc)
- {
-diff --git a/drivers/staging/imx-drm/imx-drm.h b/drivers/staging/imx-drm/imx-drm.h
-index 4eb594c..e3ca0c6 100644
---- a/drivers/staging/imx-drm/imx-drm.h
-+++ b/drivers/staging/imx-drm/imx-drm.h
-@@ -56,9 +56,9 @@ struct drm_gem_cma_object *imx_drm_fb_get_obj(struct drm_framebuffer *fb);
- 
- struct drm_device *imx_drm_device_get(void);
- void imx_drm_device_put(void);
--int imx_drm_crtc_panel_format_pins(struct drm_crtc *crtc, u32 encoder_type,
-+int imx_drm_panel_format_pins(struct drm_encoder *encoder,
- 		u32 interface_pix_fmt, int hsync_pin, int vsync_pin);
--int imx_drm_crtc_panel_format(struct drm_crtc *crtc, u32 encoder_type,
-+int imx_drm_panel_format(struct drm_encoder *encoder,
- 		u32 interface_pix_fmt);
- void imx_drm_fb_helper_set(struct drm_fbdev_cma *fbdev_helper);
- 
-diff --git a/drivers/staging/imx-drm/imx-hdmi.c b/drivers/staging/imx-drm/imx-hdmi.c
-index 4b69045..50475e6 100644
---- a/drivers/staging/imx-drm/imx-hdmi.c
-+++ b/drivers/staging/imx-drm/imx-hdmi.c
-@@ -1453,8 +1453,7 @@ static void imx_hdmi_encoder_prepare(struct drm_encoder *encoder)
- 	struct imx_hdmi *hdmi = container_of(encoder, struct imx_hdmi, encoder);
- 
- 	imx_hdmi_poweroff(hdmi);
--	imx_drm_crtc_panel_format(encoder->crtc, DRM_MODE_ENCODER_NONE,
--				  V4L2_PIX_FMT_RGB24);
-+	imx_drm_panel_format(encoder, V4L2_PIX_FMT_RGB24);
- }
- 
- static void imx_hdmi_encoder_commit(struct drm_encoder *encoder)
-diff --git a/drivers/staging/imx-drm/imx-ldb.c b/drivers/staging/imx-drm/imx-ldb.c
-index c6ec1e9..dd29a4a 100644
---- a/drivers/staging/imx-drm/imx-ldb.c
-+++ b/drivers/staging/imx-drm/imx-ldb.c
-@@ -200,8 +200,7 @@ static void imx_ldb_encoder_prepare(struct drm_encoder *encoder)
- 		pixel_fmt = V4L2_PIX_FMT_RGB24;
- 	}
- 
--	imx_drm_crtc_panel_format(encoder->crtc, DRM_MODE_ENCODER_LVDS,
--			pixel_fmt);
-+	imx_drm_panel_format(encoder, pixel_fmt);
- }
- 
- static void imx_ldb_encoder_commit(struct drm_encoder *encoder)
-diff --git a/drivers/staging/imx-drm/imx-tve.c b/drivers/staging/imx-drm/imx-tve.c
-index 2d4e097..77131e5 100644
---- a/drivers/staging/imx-drm/imx-tve.c
-+++ b/drivers/staging/imx-drm/imx-tve.c
-@@ -310,13 +310,11 @@ static void imx_tve_encoder_prepare(struct drm_encoder *encoder)
- 
- 	switch (tve->mode) {
- 	case TVE_MODE_VGA:
--		imx_drm_crtc_panel_format_pins(encoder->crtc,
--				DRM_MODE_ENCODER_DAC, IPU_PIX_FMT_GBR24,
-+		imx_drm_panel_format_pins(encoder, IPU_PIX_FMT_GBR24,
- 				tve->hsync_pin, tve->vsync_pin);
- 		break;
- 	case TVE_MODE_TVOUT:
--		imx_drm_crtc_panel_format(encoder->crtc, DRM_MODE_ENCODER_TVDAC,
--					  V4L2_PIX_FMT_YUV444);
-+		imx_drm_panel_format(encoder, V4L2_PIX_FMT_YUV444);
- 		break;
- 	}
- }
-@@ -510,12 +508,16 @@ static int tve_clk_init(struct imx_tve *tve, void __iomem *base)
- 
- static int imx_tve_register(struct imx_tve *tve)
- {
-+	int encoder_type;
- 	int ret;
- 
-+	encoder_type = tve->mode == TVE_MODE_VGA ?
-+				DRM_MODE_ENCODER_DAC : DRM_MODE_ENCODER_TVDAC;
-+
- 	tve->connector.funcs = &imx_tve_connector_funcs;
- 	tve->encoder.funcs = &imx_tve_encoder_funcs;
- 
--	tve->encoder.encoder_type = DRM_MODE_ENCODER_NONE;
-+	tve->encoder.encoder_type = encoder_type;
- 	tve->connector.connector_type = DRM_MODE_CONNECTOR_VGA;
- 
- 	drm_encoder_helper_add(&tve->encoder, &imx_tve_encoder_helper_funcs);
-diff --git a/drivers/staging/imx-drm/ipuv3-crtc.c b/drivers/staging/imx-drm/ipuv3-crtc.c
-index 22be104..08e0a3b 100644
---- a/drivers/staging/imx-drm/ipuv3-crtc.c
-+++ b/drivers/staging/imx-drm/ipuv3-crtc.c
-@@ -284,6 +284,7 @@ static int ipu_set_interface_pix_fmt(struct drm_crtc *crtc, u32 encoder_type,
- 		ipu_crtc->di_clkflags = IPU_DI_CLKMODE_SYNC |
- 			IPU_DI_CLKMODE_EXT;
- 		break;
-+	case DRM_MODE_ENCODER_TMDS:
- 	case DRM_MODE_ENCODER_NONE:
- 		ipu_crtc->di_clkflags = 0;
- 		break;
-diff --git a/drivers/staging/imx-drm/parallel-display.c b/drivers/staging/imx-drm/parallel-display.c
-index 18a3e8a..12bcf4f 100644
---- a/drivers/staging/imx-drm/parallel-display.c
-+++ b/drivers/staging/imx-drm/parallel-display.c
-@@ -108,8 +108,7 @@ static void imx_pd_encoder_prepare(struct drm_encoder *encoder)
- {
- 	struct imx_parallel_display *imxpd = enc_to_imxpd(encoder);
- 
--	imx_drm_crtc_panel_format(encoder->crtc, DRM_MODE_ENCODER_NONE,
--			imxpd->interface_pix_fmt);
-+	imx_drm_panel_format(encoder, imxpd->interface_pix_fmt);
- }
- 
- static void imx_pd_encoder_commit(struct drm_encoder *encoder)
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0015-imx-drm-convert-to-componentised-device-support.patch b/patches/imx_drm/0015-imx-drm-convert-to-componentised-device-support.patch
deleted file mode 100644
index bd7f68c3c..000000000
--- a/patches/imx_drm/0015-imx-drm-convert-to-componentised-device-support.patch
+++ /dev/null
@@ -1,934 +0,0 @@
-From 17b5001b5143e3b7fce1c584bdcffd726dd8667c Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Sun, 3 Nov 2013 11:23:34 +0000
-Subject: [PATCH 15/67] imx-drm: convert to componentised device support
-
-Use the componentised device support for imx-drm.  This requires all
-the sub-components and the master device to register with the component
-device support.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- arch/arm/boot/dts/imx51-babbage.dts        |  10 ++-
- arch/arm/boot/dts/imx53-m53evk.dts         |   8 ++-
- arch/arm/boot/dts/imx53-mba53.dts          |   6 ++
- arch/arm/boot/dts/imx53-qsb-common.dtsi    |   8 ++-
- arch/arm/boot/dts/imx6q-sabresd.dts        |   4 ++
- arch/arm/boot/dts/imx6qdl-sabresd.dtsi     |   6 ++
- drivers/staging/imx-drm/imx-drm-core.c     | 105 +++++++++++++++++++++++------
- drivers/staging/imx-drm/imx-hdmi.c         |  41 +++++++----
- drivers/staging/imx-drm/imx-ldb.c          |  40 +++++++----
- drivers/staging/imx-drm/imx-tve.c          |  63 ++++++++++-------
- drivers/staging/imx-drm/ipuv3-crtc.c       |  46 +++++++++----
- drivers/staging/imx-drm/parallel-display.c |  30 +++++++--
- 12 files changed, 275 insertions(+), 92 deletions(-)
-
-diff --git a/arch/arm/boot/dts/imx51-babbage.dts b/arch/arm/boot/dts/imx51-babbage.dts
-index 121dadd..92b93fc 100644
---- a/arch/arm/boot/dts/imx51-babbage.dts
-+++ b/arch/arm/boot/dts/imx51-babbage.dts
-@@ -21,7 +21,7 @@
- 		reg = <0x90000000 0x20000000>;
- 	};
- 
--	display@di0 {
-+	display0: display@di0 {
- 		compatible = "fsl,imx-parallel-display";
- 		crtcs = <&ipu 0>;
- 		interface-pix-fmt = "rgb24";
-@@ -43,7 +43,7 @@
- 		};
- 	};
- 
--	display@di1 {
-+	display1: display@di1 {
- 		compatible = "fsl,imx-parallel-display";
- 		crtcs = <&ipu 1>;
- 		interface-pix-fmt = "rgb565";
-@@ -81,6 +81,12 @@
- 		};
- 	};
- 
-+	imx-drm {
-+		compatible = "fsl,imx-drm";
-+		crtcs = <&ipu 0>, <&ipu 1>;
-+		connectors = <&display0>, <&display1>;
-+	};
-+
- 	leds {
- 		compatible = "gpio-leds";
- 		pinctrl-names = "default";
-diff --git a/arch/arm/boot/dts/imx53-m53evk.dts b/arch/arm/boot/dts/imx53-m53evk.dts
-index e8d11e2..d939ba8 100644
---- a/arch/arm/boot/dts/imx53-m53evk.dts
-+++ b/arch/arm/boot/dts/imx53-m53evk.dts
-@@ -21,7 +21,7 @@
- 	};
- 
- 	soc {
--		display@di1 {
-+		display1: display@di1 {
- 			compatible = "fsl,imx-parallel-display";
- 			crtcs = <&ipu 1>;
- 			interface-pix-fmt = "bgr666";
-@@ -54,6 +54,12 @@
- 		power-supply = <&reg_backlight>;
- 	};
- 
-+	imx-drm {
-+		compatible = "fsl,imx-drm";
-+		crtcs = <&ipu 1>;
-+		connectors = <&display1>;
-+	};
-+
- 	leds {
- 		compatible = "gpio-leds";
- 		pinctrl-names = "default";
-diff --git a/arch/arm/boot/dts/imx53-mba53.dts b/arch/arm/boot/dts/imx53-mba53.dts
-index 55af110..a398745 100644
---- a/arch/arm/boot/dts/imx53-mba53.dts
-+++ b/arch/arm/boot/dts/imx53-mba53.dts
-@@ -35,6 +35,12 @@
- 		status = "disabled";
- 	};
- 
-+	imx-drm {
-+		compatible = "fsl,imx-drm";
-+		crtcs = <&ipu 1>;
-+		connectors = <&disp1>, <&tve>;
-+	};
-+
- 	regulators {
- 		compatible = "simple-bus";
- 		#address-cells = <1>;
-diff --git a/arch/arm/boot/dts/imx53-qsb-common.dtsi b/arch/arm/boot/dts/imx53-qsb-common.dtsi
-index 2dca98b..50823d0 100644
---- a/arch/arm/boot/dts/imx53-qsb-common.dtsi
-+++ b/arch/arm/boot/dts/imx53-qsb-common.dtsi
-@@ -17,7 +17,7 @@
- 		reg = <0x70000000 0x40000000>;
- 	};
- 
--	display@di0 {
-+	display0: display@di0 {
- 		compatible = "fsl,imx-parallel-display";
- 		crtcs = <&ipu 0>;
- 		interface-pix-fmt = "rgb565";
-@@ -68,6 +68,12 @@
- 		};
- 	};
- 
-+	imx-drm {
-+		compatible = "fsl,imx-drm";
-+		crtcs = <&ipu 0>;
-+		connectors = <&display0>;
-+	};
-+
- 	leds {
- 		compatible = "gpio-leds";
- 		pinctrl-names = "default";
-diff --git a/arch/arm/boot/dts/imx6q-sabresd.dts b/arch/arm/boot/dts/imx6q-sabresd.dts
-index 9cbdfe7..66f220a 100644
---- a/arch/arm/boot/dts/imx6q-sabresd.dts
-+++ b/arch/arm/boot/dts/imx6q-sabresd.dts
-@@ -20,6 +20,10 @@
- 	compatible = "fsl,imx6q-sabresd", "fsl,imx6q";
- };
- 
-+&imx_drm {
-+	crtcs = <&ipu1 0>, <&ipu1 1>, <&ipu2 0>, <&ipu2 1>;
-+};
-+
- &sata {
- 	status = "okay";
- };
-diff --git a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
-index 0d816d3..04487cb 100644
---- a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
-+++ b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
-@@ -79,6 +79,12 @@
- 		};
- 	};
- 
-+	imx_drm: imx-drm {
-+		compatible = "fsl,imx-drm";
-+		crtcs = <&ipu1 0>, <&ipu1 1>;
-+		connectors = <&ldb>;
-+	};
-+
- 	sound {
- 		compatible = "fsl,imx6q-sabresd-wm8962",
- 			   "fsl,imx-audio-wm8962";
-diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c
-index d9786ec..82b0337 100644
---- a/drivers/staging/imx-drm/imx-drm-core.c
-+++ b/drivers/staging/imx-drm/imx-drm-core.c
-@@ -13,7 +13,7 @@
-  * GNU General Public License for more details.
-  *
-  */
--
-+#include <linux/component.h>
- #include <linux/device.h>
- #include <linux/platform_device.h>
- #include <drm/drmP.h>
-@@ -90,6 +90,8 @@ static int imx_drm_driver_unload(struct drm_device *drm)
- {
- 	struct imx_drm_device *imxdrm = drm->dev_private;
- 
-+	component_unbind_all(drm->dev, drm);
-+
- 	imx_drm_device_put();
- 
- 	drm_vblank_cleanup(drm);
-@@ -371,11 +373,8 @@ static void imx_drm_connector_unregister(
- }
- 
- /*
-- * Called by the CRTC driver when all CRTCs are registered. This
-- * puts all the pieces together and initializes the driver.
-- * Once this is called no more CRTCs can be registered since
-- * the drm core has hardcoded the number of crtcs in several
-- * places.
-+ * Main DRM initialisation. This binds, initialises and registers
-+ * with DRM the subcomponents of the driver.
-  */
- static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
- {
-@@ -428,8 +427,15 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
- 
- 	platform_set_drvdata(drm->platformdev, drm);
- 	mutex_unlock(&imxdrm->mutex);
-+
-+	/* Now try and bind all our sub-components */
-+	ret = component_bind_all(drm->dev, drm);
-+	if (ret)
-+		goto err_relock;
- 	return 0;
- 
-+err_relock:
-+	mutex_lock(&imxdrm->mutex);
- err_vblank:
- 	drm_vblank_cleanup(drm);
- err_kms:
-@@ -809,6 +815,70 @@ static struct drm_driver imx_drm_driver = {
- 	.patchlevel		= 0,
- };
- 
-+static int compare_parent_of(struct device *dev, void *data)
-+{
-+	struct of_phandle_args *args = data;
-+	return dev->parent && dev->parent->of_node == args->np;
-+}
-+
-+static int compare_of(struct device *dev, void *data)
-+{
-+	return dev->of_node == data;
-+}
-+
-+static int imx_drm_add_components(struct device *master, struct master *m)
-+{
-+	struct device_node *np = master->of_node;
-+	unsigned i;
-+	int ret;
-+
-+	for (i = 0; ; i++) {
-+		struct of_phandle_args args;
-+
-+		ret = of_parse_phandle_with_fixed_args(np, "crtcs", 1,
-+						       i, &args);
-+		if (ret)
-+			break;
-+
-+		ret = component_master_add_child(m, compare_parent_of, &args);
-+		of_node_put(args.np);
-+
-+		if (ret)
-+			return ret;
-+	}
-+
-+	for (i = 0; ; i++) {
-+		struct device_node *node;
-+
-+		node = of_parse_phandle(np, "connectors", i);
-+		if (!node)
-+			break;
-+
-+		ret = component_master_add_child(m, compare_of, node);
-+		of_node_put(node);
-+
-+		if (ret)
-+			return ret;
-+	}
-+	return 0;
-+}
-+
-+static int imx_drm_bind(struct device *dev)
-+{
-+	return drm_platform_init(&imx_drm_driver, to_platform_device(dev));
-+}
-+
-+static void imx_drm_unbind(struct device *dev)
-+{
-+	drm_put_dev(dev_get_drvdata(dev));
-+}
-+
-+static const struct component_master_ops imx_drm_ops = {
-+	.add_components = imx_drm_add_components,
-+	.bind = imx_drm_bind,
-+	.unbind = imx_drm_unbind,
-+};
-+
- static int imx_drm_platform_probe(struct platform_device *pdev)
- {
- 	int ret;
-@@ -819,27 +889,31 @@ static int imx_drm_platform_probe(struct platform_device *pdev)
- 
- 	imx_drm_device->dev = &pdev->dev;
- 
--	return drm_platform_init(&imx_drm_driver, pdev);
-+	return component_master_add(&pdev->dev, &imx_drm_ops);
- }
- 
- static int imx_drm_platform_remove(struct platform_device *pdev)
- {
--	drm_put_dev(platform_get_drvdata(pdev));
--
-+	component_master_del(&pdev->dev, &imx_drm_ops);
- 	return 0;
- }
- 
-+static const struct of_device_id imx_drm_dt_ids[] = {
-+	{ .compatible = "fsl,imx-drm", },
-+	{ /* sentinel */ },
-+};
-+MODULE_DEVICE_TABLE(of, imx_drm_dt_ids);
-+
- static struct platform_driver imx_drm_pdrv = {
- 	.probe		= imx_drm_platform_probe,
- 	.remove		= imx_drm_platform_remove,
- 	.driver		= {
- 		.owner	= THIS_MODULE,
- 		.name	= "imx-drm",
-+		.of_match_table = imx_drm_dt_ids,
- 	},
- };
- 
--static struct platform_device *imx_drm_pdev;
--
- static int __init imx_drm_init(void)
- {
- 	int ret;
-@@ -852,12 +926,6 @@ static int __init imx_drm_init(void)
- 	INIT_LIST_HEAD(&imx_drm_device->connector_list);
- 	INIT_LIST_HEAD(&imx_drm_device->encoder_list);
- 
--	imx_drm_pdev = platform_device_register_simple("imx-drm", -1, NULL, 0);
--	if (IS_ERR(imx_drm_pdev)) {
--		ret = PTR_ERR(imx_drm_pdev);
--		goto err_pdev;
--	}
--
- 	ret = platform_driver_register(&imx_drm_pdrv);
- 	if (ret)
- 		goto err_pdrv;
-@@ -865,8 +933,6 @@ static int __init imx_drm_init(void)
- 	return 0;
- 
- err_pdrv:
--	platform_device_unregister(imx_drm_pdev);
--err_pdev:
- 	kfree(imx_drm_device);
- 
- 	return ret;
-@@ -874,7 +940,6 @@ err_pdev:
- 
- static void __exit imx_drm_exit(void)
- {
--	platform_device_unregister(imx_drm_pdev);
- 	platform_driver_unregister(&imx_drm_pdrv);
- 
- 	kfree(imx_drm_device);
-diff --git a/drivers/staging/imx-drm/imx-hdmi.c b/drivers/staging/imx-drm/imx-hdmi.c
-index 50475e6..14b4a4b 100644
---- a/drivers/staging/imx-drm/imx-hdmi.c
-+++ b/drivers/staging/imx-drm/imx-hdmi.c
-@@ -12,6 +12,7 @@
-  * Copyright (C) 2010, Guennadi Liakhovetski <g.liakhovetski@gmx.de>
-  */
- 
-+#include <linux/component.h>
- #include <linux/irq.h>
- #include <linux/delay.h>
- #include <linux/err.h>
-@@ -1582,21 +1583,22 @@ static const struct of_device_id imx_hdmi_dt_ids[] = {
- };
- MODULE_DEVICE_TABLE(of, imx_hdmi_dt_ids);
- 
--static int imx_hdmi_platform_probe(struct platform_device *pdev)
-+static int imx_hdmi_bind(struct device *dev, struct device *master, void *data)
- {
-+	struct platform_device *pdev = to_platform_device(dev);
- 	const struct of_device_id *of_id =
--				of_match_device(imx_hdmi_dt_ids, &pdev->dev);
--	struct device_node *np = pdev->dev.of_node;
-+				of_match_device(imx_hdmi_dt_ids, dev);
-+	struct device_node *np = dev->of_node;
- 	struct device_node *ddc_node;
- 	struct imx_hdmi *hdmi;
- 	struct resource *iores;
- 	int ret, irq;
- 
--	hdmi = devm_kzalloc(&pdev->dev, sizeof(*hdmi), GFP_KERNEL);
-+	hdmi = devm_kzalloc(dev, sizeof(*hdmi), GFP_KERNEL);
- 	if (!hdmi)
- 		return -ENOMEM;
- 
--	hdmi->dev = &pdev->dev;
-+	hdmi->dev = dev;
- 	hdmi->sample_rate = 48000;
- 	hdmi->ratio = 100;
- 
-@@ -1620,13 +1622,13 @@ static int imx_hdmi_platform_probe(struct platform_device *pdev)
- 	if (irq < 0)
- 		return -EINVAL;
- 
--	ret = devm_request_irq(&pdev->dev, irq, imx_hdmi_irq, 0,
--			       dev_name(&pdev->dev), hdmi);
-+	ret = devm_request_irq(dev, irq, imx_hdmi_irq, 0,
-+			       dev_name(dev), hdmi);
- 	if (ret)
- 		return ret;
- 
- 	iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
--	hdmi->regs = devm_ioremap_resource(&pdev->dev, iores);
-+	hdmi->regs = devm_ioremap_resource(dev, iores);
- 	if (IS_ERR(hdmi->regs))
- 		return PTR_ERR(hdmi->regs);
- 
-@@ -1665,7 +1667,7 @@ static int imx_hdmi_platform_probe(struct platform_device *pdev)
- 	}
- 
- 	/* Product and revision IDs */
--	dev_info(&pdev->dev,
-+	dev_info(dev,
- 		"Detected HDMI controller 0x%x:0x%x:0x%x:0x%x\n",
- 		hdmi_readb(hdmi, HDMI_DESIGN_ID),
- 		hdmi_readb(hdmi, HDMI_REVISION_ID),
-@@ -1699,7 +1701,7 @@ static int imx_hdmi_platform_probe(struct platform_device *pdev)
- 
- 	imx_drm_encoder_add_possible_crtcs(hdmi->imx_drm_encoder, np);
- 
--	platform_set_drvdata(pdev, hdmi);
-+	dev_set_drvdata(dev, hdmi);
- 
- 	return 0;
- 
-@@ -1711,9 +1713,10 @@ err_isfr:
- 	return ret;
- }
- 
--static int imx_hdmi_platform_remove(struct platform_device *pdev)
-+static void imx_hdmi_unbind(struct device *dev, struct device *master,
-+	void *data)
- {
--	struct imx_hdmi *hdmi = platform_get_drvdata(pdev);
-+	struct imx_hdmi *hdmi = dev_get_drvdata(dev);
- 	struct drm_connector *connector = &hdmi->connector;
- 	struct drm_encoder *encoder = &hdmi->encoder;
- 
-@@ -1724,7 +1727,21 @@ static int imx_hdmi_platform_remove(struct platform_device *pdev)
- 	clk_disable_unprepare(hdmi->iahb_clk);
- 	clk_disable_unprepare(hdmi->isfr_clk);
- 	i2c_put_adapter(hdmi->ddc);
-+}
- 
-+static const struct component_ops hdmi_ops = {
-+	.bind	= imx_hdmi_bind,
-+	.unbind	= imx_hdmi_unbind,
-+};
-+
-+static int imx_hdmi_platform_probe(struct platform_device *pdev)
-+{
-+	return component_add(&pdev->dev, &hdmi_ops);
-+}
-+
-+static int imx_hdmi_platform_remove(struct platform_device *pdev)
-+{
-+	component_del(&pdev->dev, &hdmi_ops);
- 	return 0;
- }
- 
-diff --git a/drivers/staging/imx-drm/imx-ldb.c b/drivers/staging/imx-drm/imx-ldb.c
-index dd29a4a..d00f93f 100644
---- a/drivers/staging/imx-drm/imx-ldb.c
-+++ b/drivers/staging/imx-drm/imx-ldb.c
-@@ -20,6 +20,7 @@
- 
- #include <linux/module.h>
- #include <linux/clk.h>
-+#include <linux/component.h>
- #include <drm/drmP.h>
- #include <drm/drm_fb_helper.h>
- #include <drm/drm_crtc_helper.h>
-@@ -450,11 +451,11 @@ static const struct of_device_id imx_ldb_dt_ids[] = {
- };
- MODULE_DEVICE_TABLE(of, imx_ldb_dt_ids);
- 
--static int imx_ldb_probe(struct platform_device *pdev)
-+static int imx_ldb_bind(struct device *dev, struct device *master, void *data)
- {
--	struct device_node *np = pdev->dev.of_node;
-+	struct device_node *np = dev->of_node;
- 	const struct of_device_id *of_id =
--			of_match_device(imx_ldb_dt_ids, &pdev->dev);
-+			of_match_device(imx_ldb_dt_ids, dev);
- 	struct device_node *child;
- 	const u8 *edidp;
- 	struct imx_ldb *imx_ldb;
-@@ -464,17 +465,17 @@ static int imx_ldb_probe(struct platform_device *pdev)
- 	int ret;
- 	int i;
- 
--	imx_ldb = devm_kzalloc(&pdev->dev, sizeof(*imx_ldb), GFP_KERNEL);
-+	imx_ldb = devm_kzalloc(dev, sizeof(*imx_ldb), GFP_KERNEL);
- 	if (!imx_ldb)
- 		return -ENOMEM;
- 
- 	imx_ldb->regmap = syscon_regmap_lookup_by_phandle(np, "gpr");
- 	if (IS_ERR(imx_ldb->regmap)) {
--		dev_err(&pdev->dev, "failed to get parent regmap\n");
-+		dev_err(dev, "failed to get parent regmap\n");
- 		return PTR_ERR(imx_ldb->regmap);
- 	}
- 
--	imx_ldb->dev = &pdev->dev;
-+	imx_ldb->dev = dev;
- 
- 	if (of_id)
- 		imx_ldb->lvds_mux = of_id->data;
-@@ -512,7 +513,7 @@ static int imx_ldb_probe(struct platform_device *pdev)
- 			return -EINVAL;
- 
- 		if (dual && i > 0) {
--			dev_warn(&pdev->dev, "dual-channel mode, ignoring second output\n");
-+			dev_warn(dev, "dual-channel mode, ignoring second output\n");
- 			continue;
- 		}
- 
-@@ -551,7 +552,7 @@ static int imx_ldb_probe(struct platform_device *pdev)
- 			break;
- 		case LVDS_BIT_MAP_JEIDA:
- 			if (datawidth == 18) {
--				dev_err(&pdev->dev, "JEIDA standard only supported in 24 bit\n");
-+				dev_err(dev, "JEIDA standard only supported in 24 bit\n");
- 				return -EINVAL;
- 			}
- 			if (i == 0 || dual)
-@@ -560,7 +561,7 @@ static int imx_ldb_probe(struct platform_device *pdev)
- 				imx_ldb->ldb_ctrl |= LDB_DATA_WIDTH_CH1_24 | LDB_BIT_MAP_CH1_JEIDA;
- 			break;
- 		default:
--			dev_err(&pdev->dev, "data mapping not specified or invalid\n");
-+			dev_err(dev, "data mapping not specified or invalid\n");
- 			return -EINVAL;
- 		}
- 
-@@ -571,14 +572,15 @@ static int imx_ldb_probe(struct platform_device *pdev)
- 		imx_drm_encoder_add_possible_crtcs(channel->imx_drm_encoder, child);
- 	}
- 
--	platform_set_drvdata(pdev, imx_ldb);
-+	dev_set_drvdata(dev, imx_ldb);
- 
- 	return 0;
- }
- 
--static int imx_ldb_remove(struct platform_device *pdev)
-+static void imx_ldb_unbind(struct device *dev, struct device *master,
-+	void *data)
- {
--	struct imx_ldb *imx_ldb = platform_get_drvdata(pdev);
-+	struct imx_ldb *imx_ldb = dev_get_drvdata(dev);
- 	int i;
- 
- 	for (i = 0; i < 2; i++) {
-@@ -591,7 +593,21 @@ static int imx_ldb_remove(struct platform_device *pdev)
- 		imx_drm_remove_connector(channel->imx_drm_connector);
- 		imx_drm_remove_encoder(channel->imx_drm_encoder);
- 	}
-+}
- 
-+static const struct component_ops imx_ldb_ops = {
-+	.bind	= imx_ldb_bind,
-+	.unbind	= imx_ldb_unbind,
-+};
-+
-+static int imx_ldb_probe(struct platform_device *pdev)
-+{
-+	return component_add(&pdev->dev, &imx_ldb_ops);
-+}
-+
-+static int imx_ldb_remove(struct platform_device *pdev)
-+{
-+	component_del(&pdev->dev, &imx_ldb_ops);
- 	return 0;
- }
- 
-diff --git a/drivers/staging/imx-drm/imx-tve.c b/drivers/staging/imx-drm/imx-tve.c
-index 77131e5..ad840d7 100644
---- a/drivers/staging/imx-drm/imx-tve.c
-+++ b/drivers/staging/imx-drm/imx-tve.c
-@@ -20,6 +20,7 @@
- 
- #include <linux/clk.h>
- #include <linux/clk-provider.h>
-+#include <linux/component.h>
- #include <linux/module.h>
- #include <linux/i2c.h>
- #include <linux/regmap.h>
-@@ -583,9 +584,10 @@ static const int of_get_tve_mode(struct device_node *np)
- 	return -EINVAL;
- }
- 
--static int imx_tve_probe(struct platform_device *pdev)
-+static int imx_tve_bind(struct device *dev, struct device *master, void *data)
- {
--	struct device_node *np = pdev->dev.of_node;
-+	struct platform_device *pdev = to_platform_device(dev);
-+	struct device_node *np = dev->of_node;
- 	struct device_node *ddc_node;
- 	struct imx_tve *tve;
- 	struct resource *res;
-@@ -594,11 +596,11 @@ static int imx_tve_probe(struct platform_device *pdev)
- 	int irq;
- 	int ret;
- 
--	tve = devm_kzalloc(&pdev->dev, sizeof(*tve), GFP_KERNEL);
-+	tve = devm_kzalloc(dev, sizeof(*tve), GFP_KERNEL);
- 	if (!tve)
- 		return -ENOMEM;
- 
--	tve->dev = &pdev->dev;
-+	tve->dev = dev;
- 	spin_lock_init(&tve->lock);
- 
- 	ddc_node = of_parse_phandle(np, "ddc", 0);
-@@ -609,7 +611,7 @@ static int imx_tve_probe(struct platform_device *pdev)
- 
- 	tve->mode = of_get_tve_mode(np);
- 	if (tve->mode != TVE_MODE_VGA) {
--		dev_err(&pdev->dev, "only VGA mode supported, currently\n");
-+		dev_err(dev, "only VGA mode supported, currently\n");
- 		return -EINVAL;
- 	}
- 
-@@ -618,7 +620,7 @@ static int imx_tve_probe(struct platform_device *pdev)
- 					   &tve->hsync_pin);
- 
- 		if (ret < 0) {
--			dev_err(&pdev->dev, "failed to get vsync pin\n");
-+			dev_err(dev, "failed to get vsync pin\n");
- 			return ret;
- 		}
- 
-@@ -626,40 +628,40 @@ static int imx_tve_probe(struct platform_device *pdev)
- 					    &tve->vsync_pin);
- 
- 		if (ret < 0) {
--			dev_err(&pdev->dev, "failed to get vsync pin\n");
-+			dev_err(dev, "failed to get vsync pin\n");
- 			return ret;
- 		}
- 	}
- 
- 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
--	base = devm_ioremap_resource(&pdev->dev, res);
-+	base = devm_ioremap_resource(dev, res);
- 	if (IS_ERR(base))
- 		return PTR_ERR(base);
- 
- 	tve_regmap_config.lock_arg = tve;
--	tve->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "tve", base,
-+	tve->regmap = devm_regmap_init_mmio_clk(dev, "tve", base,
- 						&tve_regmap_config);
- 	if (IS_ERR(tve->regmap)) {
--		dev_err(&pdev->dev, "failed to init regmap: %ld\n",
-+		dev_err(dev, "failed to init regmap: %ld\n",
- 			PTR_ERR(tve->regmap));
- 		return PTR_ERR(tve->regmap);
- 	}
- 
- 	irq = platform_get_irq(pdev, 0);
- 	if (irq < 0) {
--		dev_err(&pdev->dev, "failed to get irq\n");
-+		dev_err(dev, "failed to get irq\n");
- 		return irq;
- 	}
- 
--	ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
-+	ret = devm_request_threaded_irq(dev, irq, NULL,
- 					imx_tve_irq_handler, IRQF_ONESHOT,
- 					"imx-tve", tve);
- 	if (ret < 0) {
--		dev_err(&pdev->dev, "failed to request irq: %d\n", ret);
-+		dev_err(dev, "failed to request irq: %d\n", ret);
- 		return ret;
- 	}
- 
--	tve->dac_reg = devm_regulator_get(&pdev->dev, "dac");
-+	tve->dac_reg = devm_regulator_get(dev, "dac");
- 	if (!IS_ERR(tve->dac_reg)) {
- 		regulator_set_voltage(tve->dac_reg, 2750000, 2750000);
- 		ret = regulator_enable(tve->dac_reg);
-@@ -667,17 +669,17 @@ static int imx_tve_probe(struct platform_device *pdev)
- 			return ret;
- 	}
- 
--	tve->clk = devm_clk_get(&pdev->dev, "tve");
-+	tve->clk = devm_clk_get(dev, "tve");
- 	if (IS_ERR(tve->clk)) {
--		dev_err(&pdev->dev, "failed to get high speed tve clock: %ld\n",
-+		dev_err(dev, "failed to get high speed tve clock: %ld\n",
- 			PTR_ERR(tve->clk));
- 		return PTR_ERR(tve->clk);
- 	}
- 
- 	/* this is the IPU DI clock input selector, can be parented to tve_di */
--	tve->di_sel_clk = devm_clk_get(&pdev->dev, "di_sel");
-+	tve->di_sel_clk = devm_clk_get(dev, "di_sel");
- 	if (IS_ERR(tve->di_sel_clk)) {
--		dev_err(&pdev->dev, "failed to get ipu di mux clock: %ld\n",
-+		dev_err(dev, "failed to get ipu di mux clock: %ld\n",
- 			PTR_ERR(tve->di_sel_clk));
- 		return PTR_ERR(tve->di_sel_clk);
- 	}
-@@ -688,11 +690,11 @@ static int imx_tve_probe(struct platform_device *pdev)
- 
- 	ret = regmap_read(tve->regmap, TVE_COM_CONF_REG, &val);
- 	if (ret < 0) {
--		dev_err(&pdev->dev, "failed to read configuration register: %d\n", ret);
-+		dev_err(dev, "failed to read configuration register: %d\n", ret);
- 		return ret;
- 	}
- 	if (val != 0x00100000) {
--		dev_err(&pdev->dev, "configuration register default value indicates this is not a TVEv2\n");
-+		dev_err(dev, "configuration register default value indicates this is not a TVEv2\n");
- 		return -ENODEV;
- 	}
- 
-@@ -705,14 +707,15 @@ static int imx_tve_probe(struct platform_device *pdev)
- 
- 	ret = imx_drm_encoder_add_possible_crtcs(tve->imx_drm_encoder, np);
- 
--	platform_set_drvdata(pdev, tve);
-+	dev_set_drvdata(dev, tve);
- 
- 	return 0;
- }
- 
--static int imx_tve_remove(struct platform_device *pdev)
-+static void imx_tve_unbind(struct device *dev, struct device *master,
-+	void *data)
- {
--	struct imx_tve *tve = platform_get_drvdata(pdev);
-+	struct imx_tve *tve = dev_get_drvdata(dev);
- 	struct drm_connector *connector = &tve->connector;
- 	struct drm_encoder *encoder = &tve->encoder;
- 
-@@ -723,7 +726,21 @@ static int imx_tve_remove(struct platform_device *pdev)
- 
- 	if (!IS_ERR(tve->dac_reg))
- 		regulator_disable(tve->dac_reg);
-+}
- 
-+static const struct component_ops imx_tve_ops = {
-+	.bind	= imx_tve_bind,
-+	.unbind	= imx_tve_unbind,
-+};
-+
-+static int imx_tve_probe(struct platform_device *pdev)
-+{
-+	return component_add(&pdev->dev, &imx_tve_ops);
-+}
-+
-+static int imx_tve_remove(struct platform_device *pdev)
-+{
-+	component_del(&pdev->dev, &imx_tve_ops);
- 	return 0;
- }
- 
-diff --git a/drivers/staging/imx-drm/ipuv3-crtc.c b/drivers/staging/imx-drm/ipuv3-crtc.c
-index 08e0a3b..d779ad2 100644
---- a/drivers/staging/imx-drm/ipuv3-crtc.c
-+++ b/drivers/staging/imx-drm/ipuv3-crtc.c
-@@ -17,6 +17,7 @@
-  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-  * MA 02110-1301, USA.
-  */
-+#include <linux/component.h>
- #include <linux/module.h>
- #include <linux/export.h>
- #include <linux/device.h>
-@@ -400,43 +401,60 @@ err_put_resources:
- 	return ret;
- }
- 
--static int ipu_drm_probe(struct platform_device *pdev)
-+static int ipu_drm_bind(struct device *dev, struct device *master, void *data)
- {
--	struct ipu_client_platformdata *pdata = pdev->dev.platform_data;
-+	struct ipu_client_platformdata *pdata = dev->platform_data;
- 	struct ipu_crtc *ipu_crtc;
- 	int ret;
- 
--	if (!pdata)
--		return -EINVAL;
--
--	ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));
--	if (ret)
--		return ret;
--
--	ipu_crtc = devm_kzalloc(&pdev->dev, sizeof(*ipu_crtc), GFP_KERNEL);
-+	ipu_crtc = devm_kzalloc(dev, sizeof(*ipu_crtc), GFP_KERNEL);
- 	if (!ipu_crtc)
- 		return -ENOMEM;
- 
--	ipu_crtc->dev = &pdev->dev;
-+	ipu_crtc->dev = dev;
- 
- 	ret = ipu_crtc_init(ipu_crtc, pdata);
- 	if (ret)
- 		return ret;
- 
--	platform_set_drvdata(pdev, ipu_crtc);
-+	dev_set_drvdata(dev, ipu_crtc);
- 
- 	return 0;
- }
- 
--static int ipu_drm_remove(struct platform_device *pdev)
-+static void ipu_drm_unbind(struct device *dev, struct device *master,
-+	void *data)
- {
--	struct ipu_crtc *ipu_crtc = platform_get_drvdata(pdev);
-+	struct ipu_crtc *ipu_crtc = dev_get_drvdata(dev);
- 
- 	imx_drm_remove_crtc(ipu_crtc->imx_crtc);
- 
- 	ipu_plane_put_resources(ipu_crtc->plane[0]);
- 	ipu_put_resources(ipu_crtc);
-+}
-+
-+static const struct component_ops ipu_crtc_ops = {
-+	.bind = ipu_drm_bind,
-+	.unbind = ipu_drm_unbind,
-+};
- 
-+static int ipu_drm_probe(struct platform_device *pdev)
-+{
-+	int ret;
-+
-+	if (!pdev->dev.platform_data)
-+		return -EINVAL;
-+
-+	ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));
-+	if (ret)
-+		return ret;
-+
-+	return component_add(&pdev->dev, &ipu_crtc_ops);
-+}
-+
-+static int ipu_drm_remove(struct platform_device *pdev)
-+{
-+	component_del(&pdev->dev, &ipu_crtc_ops);
- 	return 0;
- }
- 
-diff --git a/drivers/staging/imx-drm/parallel-display.c b/drivers/staging/imx-drm/parallel-display.c
-index 12bcf4f..4019cae 100644
---- a/drivers/staging/imx-drm/parallel-display.c
-+++ b/drivers/staging/imx-drm/parallel-display.c
-@@ -18,6 +18,7 @@
-  * MA 02110-1301, USA.
-  */
- 
-+#include <linux/component.h>
- #include <linux/module.h>
- #include <drm/drmP.h>
- #include <drm/drm_fb_helper.h>
-@@ -192,15 +193,15 @@ static int imx_pd_register(struct imx_parallel_display *imxpd)
- 	return 0;
- }
- 
--static int imx_pd_probe(struct platform_device *pdev)
-+static int imx_pd_bind(struct device *dev, struct device *master, void *data)
- {
--	struct device_node *np = pdev->dev.of_node;
-+	struct device_node *np = dev->of_node;
- 	const u8 *edidp;
- 	struct imx_parallel_display *imxpd;
- 	int ret;
- 	const char *fmt;
- 
--	imxpd = devm_kzalloc(&pdev->dev, sizeof(*imxpd), GFP_KERNEL);
-+	imxpd = devm_kzalloc(dev, sizeof(*imxpd), GFP_KERNEL);
- 	if (!imxpd)
- 		return -ENOMEM;
- 
-@@ -218,7 +219,7 @@ static int imx_pd_probe(struct platform_device *pdev)
- 			imxpd->interface_pix_fmt = V4L2_PIX_FMT_BGR666;
- 	}
- 
--	imxpd->dev = &pdev->dev;
-+	imxpd->dev = dev;
- 
- 	ret = imx_pd_register(imxpd);
- 	if (ret)
-@@ -226,14 +227,15 @@ static int imx_pd_probe(struct platform_device *pdev)
- 
- 	ret = imx_drm_encoder_add_possible_crtcs(imxpd->imx_drm_encoder, np);
- 
--	platform_set_drvdata(pdev, imxpd);
-+	dev_set_drvdata(dev, imxpd);
- 
- 	return 0;
- }
- 
--static int imx_pd_remove(struct platform_device *pdev)
-+static void imx_pd_unbind(struct device *dev, struct device *master,
-+	void *data)
- {
--	struct imx_parallel_display *imxpd = platform_get_drvdata(pdev);
-+	struct imx_parallel_display *imxpd = dev_get_drvdata(dev);
- 	struct drm_connector *connector = &imxpd->connector;
- 	struct drm_encoder *encoder = &imxpd->encoder;
- 
-@@ -241,7 +243,21 @@ static int imx_pd_remove(struct platform_device *pdev)
- 
- 	imx_drm_remove_connector(imxpd->imx_drm_connector);
- 	imx_drm_remove_encoder(imxpd->imx_drm_encoder);
-+}
- 
-+static const struct component_ops imx_pd_ops = {
-+	.bind	= imx_pd_bind,
-+	.unbind	= imx_pd_unbind,
-+};
-+
-+static int imx_pd_probe(struct platform_device *pdev)
-+{
-+	return component_add(&pdev->dev, &imx_pd_ops);
-+}
-+
-+static int imx_pd_remove(struct platform_device *pdev)
-+{
-+	component_del(&pdev->dev, &imx_pd_ops);
- 	return 0;
- }
- 
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0016-imx-drm-delay-publishing-sysfs-connector-entries.patch b/patches/imx_drm/0016-imx-drm-delay-publishing-sysfs-connector-entries.patch
deleted file mode 100644
index 58d2bcf36..000000000
--- a/patches/imx_drm/0016-imx-drm-delay-publishing-sysfs-connector-entries.patch
+++ /dev/null
@@ -1,71 +0,0 @@
-From e355e7dd607bd0338ba1899fc35136cbe2ea13f2 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Sun, 3 Nov 2013 18:39:29 +0000
-Subject: [PATCH 16/67] imx-drm: delay publishing sysfs connector entries
-
-Delay publishing sysfs connector entries until all components have
-initialised.  This reduces the probability of generating false hotplug
-events when we're uncertain whether the driver can fully initialise.
-This also pulls that code out of the individual imx-drm connector
-drivers.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/imx-drm-core.c | 22 +++++++++++++++++++++-
- 1 file changed, 21 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c
-index 82b0337..3cd330e 100644
---- a/drivers/staging/imx-drm/imx-drm-core.c
-+++ b/drivers/staging/imx-drm/imx-drm-core.c
-@@ -355,7 +355,7 @@ static int imx_drm_connector_register(
- 			imx_drm_connector->connector->connector_type);
- 	drm_mode_group_reinit(imxdrm->drm);
- 
--	return drm_sysfs_connector_add(imx_drm_connector->connector);
-+	return 0;
- }
- 
- /*
-@@ -379,6 +379,7 @@ static void imx_drm_connector_unregister(
- static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
- {
- 	struct imx_drm_device *imxdrm = __imx_drm_device();
-+	struct drm_connector *connector;
- 	int ret;
- 
- 	imxdrm->drm = drm;
-@@ -432,8 +433,27 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
- 	ret = component_bind_all(drm->dev, drm);
- 	if (ret)
- 		goto err_relock;
-+
-+	/*
-+	 * All components are now added, we can publish the connector sysfs
-+	 * entries to userspace.  This will generate hotplug events and so
-+	 * userspace will expect to be able to access DRM at this point.
-+	 */
-+	list_for_each_entry(connector, &drm->mode_config.connector_list, head) {
-+		ret = drm_sysfs_connector_add(connector);
-+		if (ret) {
-+			dev_err(drm->dev,
-+				"[CONNECTOR:%d:%s] drm_sysfs_connector_add failed: %d\n",
-+				connector->base.id,
-+				drm_get_connector_name(connector), ret);
-+			goto err_unbind;
-+		}
-+	}
-+
- 	return 0;
- 
-+err_unbind:
-+	component_unbind_all(drm->dev, drm);
- err_relock:
- 	mutex_lock(&imxdrm->mutex);
- err_vblank:
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0017-imx-drm-remove-separate-imx-fbdev.patch b/patches/imx_drm/0017-imx-drm-remove-separate-imx-fbdev.patch
deleted file mode 100644
index 7a6322209..000000000
--- a/patches/imx_drm/0017-imx-drm-remove-separate-imx-fbdev.patch
+++ /dev/null
@@ -1,246 +0,0 @@
-From 8acba02f7e8538a54d4bf3ed8a2d3b31dd5eca45 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Sun, 3 Nov 2013 12:13:47 +0000
-Subject: [PATCH 17/67] imx-drm: remove separate imx-fbdev
-
-Now that we know when the components of the imx-drm subsystem will be
-initialised, we can move the fbdev helper initialisation and teardown
-into imx-drm-core.  This gives us the required ordering that DRM wants
-in both driver load and unload methods.
-
-We can also stop exporting the imx_drm_device_get() and
-imx_drm_device_put() methods; nothing but the fbdev helper was making
-use of these.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/Makefile       |  1 -
- drivers/staging/imx-drm/imx-drm-core.c | 43 ++++++++++++++------
- drivers/staging/imx-drm/imx-drm.h      |  3 --
- drivers/staging/imx-drm/imx-fbdev.c    | 74 ----------------------------------
- 4 files changed, 31 insertions(+), 90 deletions(-)
- delete mode 100644 drivers/staging/imx-drm/imx-fbdev.c
-
-diff --git a/drivers/staging/imx-drm/Makefile b/drivers/staging/imx-drm/Makefile
-index 4677585..5239f90 100644
---- a/drivers/staging/imx-drm/Makefile
-+++ b/drivers/staging/imx-drm/Makefile
-@@ -6,7 +6,6 @@ obj-$(CONFIG_DRM_IMX) += imxdrm.o
- obj-$(CONFIG_DRM_IMX_PARALLEL_DISPLAY) += parallel-display.o
- obj-$(CONFIG_DRM_IMX_TVE) += imx-tve.o
- obj-$(CONFIG_DRM_IMX_LDB) += imx-ldb.o
--obj-$(CONFIG_DRM_IMX_FB_HELPER) += imx-fbdev.o
- obj-$(CONFIG_DRM_IMX_IPUV3_CORE) += ipu-v3/
- 
- imx-ipuv3-crtc-objs  := ipuv3-crtc.o ipuv3-plane.o
-diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c
-index 3cd330e..5a60886 100644
---- a/drivers/staging/imx-drm/imx-drm-core.c
-+++ b/drivers/staging/imx-drm/imx-drm-core.c
-@@ -70,6 +70,10 @@ struct imx_drm_connector {
- 	struct module				*owner;
- };
- 
-+static int legacyfb_depth = 16;
-+module_param(legacyfb_depth, int, 0444);
-+
-+static void imx_drm_device_put(void);
- static struct imx_drm_device *__imx_drm_device(void);
- 
- int imx_drm_crtc_id(struct imx_drm_crtc *crtc)
-@@ -80,16 +84,23 @@ EXPORT_SYMBOL_GPL(imx_drm_crtc_id);
- 
- static void imx_drm_driver_lastclose(struct drm_device *drm)
- {
-+#if IS_ENABLED(CONFIG_DRM_IMX_FB_HELPER)
- 	struct imx_drm_device *imxdrm = drm->dev_private;
- 
- 	if (imxdrm->fbhelper)
- 		drm_fbdev_cma_restore_mode(imxdrm->fbhelper);
-+#endif
- }
- 
- static int imx_drm_driver_unload(struct drm_device *drm)
- {
-+#if IS_ENABLED(CONFIG_DRM_IMX_FB_HELPER)
- 	struct imx_drm_device *imxdrm = drm->dev_private;
- 
-+	if (imxdrm->fbhelper)
-+		drm_fbdev_cma_fini(imxdrm->fbhelper);
-+#endif
-+
- 	component_unbind_all(drm->dev, drm);
- 
- 	imx_drm_device_put();
-@@ -225,7 +236,7 @@ static struct imx_drm_device *__imx_drm_device(void)
- 	return imx_drm_device;
- }
- 
--struct drm_device *imx_drm_device_get(void)
-+static struct drm_device *imx_drm_device_get(void)
- {
- 	struct imx_drm_device *imxdrm = __imx_drm_device();
- 	struct imx_drm_encoder *enc;
-@@ -273,9 +284,8 @@ unwind_enc:
- 	return NULL;
- 
- }
--EXPORT_SYMBOL_GPL(imx_drm_device_get);
- 
--void imx_drm_device_put(void)
-+static void imx_drm_device_put(void)
- {
- 	struct imx_drm_device *imxdrm = __imx_drm_device();
- 	struct imx_drm_encoder *enc;
-@@ -295,7 +305,6 @@ void imx_drm_device_put(void)
- 
- 	mutex_unlock(&imxdrm->mutex);
- }
--EXPORT_SYMBOL_GPL(imx_drm_device_put);
- 
- static int drm_mode_group_reinit(struct drm_device *dev)
- {
-@@ -450,6 +459,24 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
- 		}
- 	}
- 
-+	/*
-+	 * All components are now initialised, so setup the fb helper.
-+	 * The fb helper takes copies of key hardware information, so the
-+	 * crtcs/connectors/encoders must not change after this point.
-+	 */
-+#if IS_ENABLED(CONFIG_DRM_IMX_FB_HELPER)
-+	if (legacyfb_depth != 16 && legacyfb_depth != 32) {
-+		dev_warn(drm->dev, "Invalid legacyfb_depth.  Defaulting to 16bpp\n");
-+		legacyfb_depth = 16;
-+	}
-+	imxdrm->fbhelper = drm_fbdev_cma_init(drm, legacyfb_depth,
-+				drm->mode_config.num_crtc, MAX_CRTC);
-+	if (IS_ERR(imxdrm->fbhelper)) {
-+		ret = PTR_ERR(imxdrm->fbhelper);
-+		imxdrm->fbhelper = NULL;
-+		goto err_unbind;
-+	}
-+#endif
- 	return 0;
- 
- err_unbind:
-@@ -767,14 +794,6 @@ err_busy:
- }
- EXPORT_SYMBOL_GPL(imx_drm_add_connector);
- 
--void imx_drm_fb_helper_set(struct drm_fbdev_cma *fbdev_helper)
--{
--	struct imx_drm_device *imxdrm = __imx_drm_device();
--
--	imxdrm->fbhelper = fbdev_helper;
--}
--EXPORT_SYMBOL_GPL(imx_drm_fb_helper_set);
--
- /*
-  * imx_drm_remove_connector - remove a connector
-  */
-diff --git a/drivers/staging/imx-drm/imx-drm.h b/drivers/staging/imx-drm/imx-drm.h
-index e3ca0c6..d1fb114 100644
---- a/drivers/staging/imx-drm/imx-drm.h
-+++ b/drivers/staging/imx-drm/imx-drm.h
-@@ -54,13 +54,10 @@ void imx_drm_mode_config_init(struct drm_device *drm);
- 
- struct drm_gem_cma_object *imx_drm_fb_get_obj(struct drm_framebuffer *fb);
- 
--struct drm_device *imx_drm_device_get(void);
--void imx_drm_device_put(void);
- int imx_drm_panel_format_pins(struct drm_encoder *encoder,
- 		u32 interface_pix_fmt, int hsync_pin, int vsync_pin);
- int imx_drm_panel_format(struct drm_encoder *encoder,
- 		u32 interface_pix_fmt);
--void imx_drm_fb_helper_set(struct drm_fbdev_cma *fbdev_helper);
- 
- struct device_node;
- 
-diff --git a/drivers/staging/imx-drm/imx-fbdev.c b/drivers/staging/imx-drm/imx-fbdev.c
-deleted file mode 100644
-index 8331739..0000000
---- a/drivers/staging/imx-drm/imx-fbdev.c
-+++ /dev/null
-@@ -1,74 +0,0 @@
--/*
-- * i.MX drm driver
-- *
-- * Copyright (C) 2012 Sascha Hauer, Pengutronix
-- *
-- * Based on Samsung Exynos code
-- *
-- * Copyright (c) 2011 Samsung Electronics Co., Ltd.
-- *
-- * This program is free software; you can redistribute it and/or
-- * modify it under the terms of the GNU General Public License
-- * as published by the Free Software Foundation; either version 2
-- * of the License, or (at your option) any later version.
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- * GNU General Public License for more details.
-- *
-- */
--#include <linux/module.h>
--#include <drm/drmP.h>
--#include <drm/drm_crtc.h>
--#include <drm/drm_crtc_helper.h>
--#include <drm/drm_fb_cma_helper.h>
--
--#include "imx-drm.h"
--
--#define MAX_CONNECTOR		4
--#define PREFERRED_BPP		16
--
--static struct drm_fbdev_cma *fbdev_cma;
--
--static int legacyfb_depth = 16;
--
--module_param(legacyfb_depth, int, 0444);
--
--static int __init imx_fb_helper_init(void)
--{
--	struct drm_device *drm = imx_drm_device_get();
--
--	if (!drm)
--		return -EINVAL;
--
--	if (legacyfb_depth != 16 && legacyfb_depth != 32) {
--		pr_warn("i.MX legacyfb: invalid legacyfb_depth setting. defaulting to 16bpp\n");
--		legacyfb_depth = 16;
--	}
--
--	fbdev_cma = drm_fbdev_cma_init(drm, legacyfb_depth,
--			drm->mode_config.num_crtc, MAX_CONNECTOR);
--
--	if (IS_ERR(fbdev_cma)) {
--		imx_drm_device_put();
--		return PTR_ERR(fbdev_cma);
--	}
--
--	imx_drm_fb_helper_set(fbdev_cma);
--
--	return 0;
--}
--
--static void __exit imx_fb_helper_exit(void)
--{
--	imx_drm_fb_helper_set(NULL);
--	drm_fbdev_cma_fini(fbdev_cma);
--	imx_drm_device_put();
--}
--
--late_initcall(imx_fb_helper_init);
--module_exit(imx_fb_helper_exit);
--
--MODULE_DESCRIPTION("Freescale i.MX legacy fb driver");
--MODULE_AUTHOR("Sascha Hauer, Pengutronix");
--MODULE_LICENSE("GPL");
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0018-imx-drm-remove-imx-fb.c.patch b/patches/imx_drm/0018-imx-drm-remove-imx-fb.c.patch
deleted file mode 100644
index b6fa56cc9..000000000
--- a/patches/imx_drm/0018-imx-drm-remove-imx-fb.c.patch
+++ /dev/null
@@ -1,123 +0,0 @@
-From 1df8b5300001907cb1711f3526394f3ef3240123 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Sun, 3 Nov 2013 16:04:48 +0000
-Subject: [PATCH 18/67] imx-drm: remove imx-fb.c
-
-imx-fb.c doesn't need to be separate from imx-drm-core.c - all it is
-doing is setting up the minimum and maximum sizes of the scanout
-buffers, and setting up the mode_config function pointers.  Move the
-contents into imx-drm-core.c and kill this file.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/Makefile       |  2 +-
- drivers/staging/imx-drm/imx-drm-core.c | 16 +++++++++++-
- drivers/staging/imx-drm/imx-fb.c       | 47 ----------------------------------
- 3 files changed, 16 insertions(+), 49 deletions(-)
- delete mode 100644 drivers/staging/imx-drm/imx-fb.c
-
-diff --git a/drivers/staging/imx-drm/Makefile b/drivers/staging/imx-drm/Makefile
-index 5239f90..129e3a3 100644
---- a/drivers/staging/imx-drm/Makefile
-+++ b/drivers/staging/imx-drm/Makefile
-@@ -1,5 +1,5 @@
- 
--imxdrm-objs := imx-drm-core.o imx-fb.o
-+imxdrm-objs := imx-drm-core.o
- 
- obj-$(CONFIG_DRM_IMX) += imxdrm.o
- 
-diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c
-index 5a60886..3e3fd28 100644
---- a/drivers/staging/imx-drm/imx-drm-core.c
-+++ b/drivers/staging/imx-drm/imx-drm-core.c
-@@ -381,6 +381,10 @@ static void imx_drm_connector_unregister(
- 	drm_mode_group_reinit(imxdrm->drm);
- }
- 
-+static struct drm_mode_config_funcs imx_drm_mode_config_funcs = {
-+	.fb_create = drm_fb_cma_create,
-+};
-+
- /*
-  * Main DRM initialisation. This binds, initialises and registers
-  * with DRM the subcomponents of the driver.
-@@ -406,8 +410,18 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
- 	 */
- 	drm->irq_enabled = true;
- 
-+	/*
-+	 * set max width and height as default value(4096x4096).
-+	 * this value would be used to check framebuffer size limitation
-+	 * at drm_mode_addfb().
-+	 */
-+	drm->mode_config.min_width = 64;
-+	drm->mode_config.min_height = 64;
-+	drm->mode_config.max_width = 4096;
-+	drm->mode_config.max_height = 4096;
-+	drm->mode_config.funcs = &imx_drm_mode_config_funcs;
-+
- 	drm_mode_config_init(drm);
--	imx_drm_mode_config_init(drm);
- 
- 	mutex_lock(&imxdrm->mutex);
- 
-diff --git a/drivers/staging/imx-drm/imx-fb.c b/drivers/staging/imx-drm/imx-fb.c
-deleted file mode 100644
-index 03a7b4e..0000000
---- a/drivers/staging/imx-drm/imx-fb.c
-+++ /dev/null
-@@ -1,47 +0,0 @@
--/*
-- * i.MX drm driver
-- *
-- * Copyright (C) 2012 Sascha Hauer, Pengutronix
-- *
-- * Based on Samsung Exynos code
-- *
-- * Copyright (c) 2011 Samsung Electronics Co., Ltd.
-- *
-- * This program is free software; you can redistribute it and/or
-- * modify it under the terms of the GNU General Public License
-- * as published by the Free Software Foundation; either version 2
-- * of the License, or (at your option) any later version.
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- * GNU General Public License for more details.
-- *
-- */
--#include <linux/module.h>
--#include <drm/drmP.h>
--#include <drm/drm_crtc.h>
--#include <drm/drm_crtc_helper.h>
--#include <drm/drm_gem_cma_helper.h>
--#include <drm/drm_fb_cma_helper.h>
--
--#include "imx-drm.h"
--
--static struct drm_mode_config_funcs imx_drm_mode_config_funcs = {
--	.fb_create = drm_fb_cma_create,
--};
--
--void imx_drm_mode_config_init(struct drm_device *dev)
--{
--	dev->mode_config.min_width = 64;
--	dev->mode_config.min_height = 64;
--
--	/*
--	 * set max width and height as default value(4096x4096).
--	 * this value would be used to check framebuffer size limitation
--	 * at drm_mode_addfb().
--	 */
--	dev->mode_config.max_width = 4096;
--	dev->mode_config.max_height = 4096;
--
--	dev->mode_config.funcs = &imx_drm_mode_config_funcs;
--}
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0019-imx-drm-use-supplied-drm_device-where-possible.patch b/patches/imx_drm/0019-imx-drm-use-supplied-drm_device-where-possible.patch
deleted file mode 100644
index ffa511579..000000000
--- a/patches/imx_drm/0019-imx-drm-use-supplied-drm_device-where-possible.patch
+++ /dev/null
@@ -1,206 +0,0 @@
-From 32266b4520352f5fbae2f236c50daf4fa49c860d Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Sun, 3 Nov 2013 12:26:23 +0000
-Subject: [PATCH 19/67] imx-drm: use supplied drm_device where possible
-
-The component helper provides us the drm_device which is being
-registered.  Rather than having to reference a global in imx-drm-core,
-use this to get the imxdrm device, and also use it to register the CRTC
-against.
-
-This means we never have CRTCs/encoders/connectors without the drivers
-private data being accessible.
-
-Remove the module owner field as well; this provides no protection
-against the device being unbound.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/imx-drm-core.c | 34 +++++-----------------------------
- drivers/staging/imx-drm/imx-drm.h      |  4 ++--
- drivers/staging/imx-drm/ipuv3-crtc.c   |  9 +++++----
- 3 files changed, 12 insertions(+), 35 deletions(-)
-
-diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c
-index 3e3fd28..3d1c6b6 100644
---- a/drivers/staging/imx-drm/imx-drm-core.c
-+++ b/drivers/staging/imx-drm/imx-drm-core.c
-@@ -52,7 +52,6 @@ struct imx_drm_crtc {
- 	struct imx_drm_device			*imxdrm;
- 	int					pipe;
- 	struct imx_drm_crtc_helper_funcs	imx_drm_helper_funcs;
--	struct module				*owner;
- 	struct crtc_cookie			cookie;
- 	int					mux_id;
- };
-@@ -74,7 +73,6 @@ static int legacyfb_depth = 16;
- module_param(legacyfb_depth, int, 0444);
- 
- static void imx_drm_device_put(void);
--static struct imx_drm_device *__imx_drm_device(void);
- 
- int imx_drm_crtc_id(struct imx_drm_crtc *crtc)
- {
-@@ -114,7 +112,7 @@ static int imx_drm_driver_unload(struct drm_device *drm)
- 
- struct imx_drm_crtc *imx_drm_find_crtc(struct drm_crtc *crtc)
- {
--	struct imx_drm_device *imxdrm = __imx_drm_device();
-+	struct imx_drm_device *imxdrm = crtc->dev->dev_private;
- 	unsigned i;
- 
- 	for (i = 0; i < MAX_CRTC; i++)
-@@ -241,7 +239,6 @@ static struct drm_device *imx_drm_device_get(void)
- 	struct imx_drm_device *imxdrm = __imx_drm_device();
- 	struct imx_drm_encoder *enc;
- 	struct imx_drm_connector *con;
--	struct imx_drm_crtc *crtc;
- 
- 	list_for_each_entry(enc, &imxdrm->encoder_list, list) {
- 		if (!try_module_get(enc->owner)) {
-@@ -259,19 +256,8 @@ static struct drm_device *imx_drm_device_get(void)
- 		}
- 	}
- 
--	list_for_each_entry(crtc, &imxdrm->crtc_list, list) {
--		if (!try_module_get(crtc->owner)) {
--			dev_err(imxdrm->dev, "could not get module %s\n",
--					module_name(crtc->owner));
--			goto unwind_crtc;
--		}
--	}
--
- 	return imxdrm->drm;
- 
--unwind_crtc:
--	list_for_each_entry_continue_reverse(crtc, &imxdrm->crtc_list, list)
--		module_put(crtc->owner);
- unwind_con:
- 	list_for_each_entry_continue_reverse(con, &imxdrm->connector_list, list)
- 		module_put(con->owner);
-@@ -290,13 +276,9 @@ static void imx_drm_device_put(void)
- 	struct imx_drm_device *imxdrm = __imx_drm_device();
- 	struct imx_drm_encoder *enc;
- 	struct imx_drm_connector *con;
--	struct imx_drm_crtc *crtc;
- 
- 	mutex_lock(&imxdrm->mutex);
- 
--	list_for_each_entry(crtc, &imxdrm->crtc_list, list)
--		module_put(crtc->owner);
--
- 	list_for_each_entry(con, &imxdrm->connector_list, list)
- 		module_put(con->owner);
- 
-@@ -536,12 +518,12 @@ static void imx_drm_update_possible_crtcs(void)
-  * The return value if !NULL is a cookie for the caller to pass to
-  * imx_drm_remove_crtc later.
-  */
--int imx_drm_add_crtc(struct drm_crtc *crtc,
-+int imx_drm_add_crtc(struct drm_device *drm, struct drm_crtc *crtc,
- 		struct imx_drm_crtc **new_crtc,
- 		const struct imx_drm_crtc_helper_funcs *imx_drm_helper_funcs,
--		struct module *owner, void *cookie, int id)
-+		void *cookie, int id)
- {
--	struct imx_drm_device *imxdrm = __imx_drm_device();
-+	struct imx_drm_device *imxdrm = drm->dev_private;
- 	struct imx_drm_crtc *imx_drm_crtc;
- 	int ret;
- 
-@@ -575,8 +557,6 @@ int imx_drm_add_crtc(struct drm_crtc *crtc,
- 	imx_drm_crtc->crtc = crtc;
- 	imx_drm_crtc->imxdrm = imxdrm;
- 
--	imx_drm_crtc->owner = owner;
--
- 	imxdrm->crtc[imx_drm_crtc->pipe] = imx_drm_crtc;
- 
- 	*new_crtc = imx_drm_crtc;
-@@ -588,11 +568,9 @@ int imx_drm_add_crtc(struct drm_crtc *crtc,
- 	drm_crtc_helper_add(crtc,
- 			imx_drm_crtc->imx_drm_helper_funcs.crtc_helper_funcs);
- 
--	drm_crtc_init(imxdrm->drm, crtc,
-+	drm_crtc_init(drm, crtc,
- 			imx_drm_crtc->imx_drm_helper_funcs.crtc_funcs);
- 
--	drm_mode_group_reinit(imxdrm->drm);
--
- 	imx_drm_update_possible_crtcs();
- 
- 	mutex_unlock(&imxdrm->mutex);
-@@ -622,8 +600,6 @@ int imx_drm_remove_crtc(struct imx_drm_crtc *imx_drm_crtc)
- 
- 	imxdrm->crtc[imx_drm_crtc->pipe] = NULL;
- 
--	drm_mode_group_reinit(imxdrm->drm);
--
- 	mutex_unlock(&imxdrm->mutex);
- 
- 	kfree(imx_drm_crtc);
-diff --git a/drivers/staging/imx-drm/imx-drm.h b/drivers/staging/imx-drm/imx-drm.h
-index d1fb114..7846523 100644
---- a/drivers/staging/imx-drm/imx-drm.h
-+++ b/drivers/staging/imx-drm/imx-drm.h
-@@ -25,10 +25,10 @@ struct imx_drm_crtc_helper_funcs {
- 	const struct drm_crtc_funcs *crtc_funcs;
- };
- 
--int imx_drm_add_crtc(struct drm_crtc *crtc,
-+int imx_drm_add_crtc(struct drm_device *drm, struct drm_crtc *crtc,
- 		struct imx_drm_crtc **new_crtc,
- 		const struct imx_drm_crtc_helper_funcs *imx_helper_funcs,
--		struct module *owner, void *cookie, int id);
-+		void *cookie, int id);
- int imx_drm_remove_crtc(struct imx_drm_crtc *);
- int imx_drm_init_drm(struct platform_device *pdev,
- 		int preferred_bpp);
-diff --git a/drivers/staging/imx-drm/ipuv3-crtc.c b/drivers/staging/imx-drm/ipuv3-crtc.c
-index d779ad2..e646017 100644
---- a/drivers/staging/imx-drm/ipuv3-crtc.c
-+++ b/drivers/staging/imx-drm/ipuv3-crtc.c
-@@ -336,7 +336,7 @@ err_out:
- }
- 
- static int ipu_crtc_init(struct ipu_crtc *ipu_crtc,
--		struct ipu_client_platformdata *pdata)
-+	struct ipu_client_platformdata *pdata, struct drm_device *drm)
- {
- 	struct ipu_soc *ipu = dev_get_drvdata(ipu_crtc->dev->parent);
- 	int dp = -EINVAL;
-@@ -350,9 +350,9 @@ static int ipu_crtc_init(struct ipu_crtc *ipu_crtc,
- 		return ret;
- 	}
- 
--	ret = imx_drm_add_crtc(&ipu_crtc->base,
-+	ret = imx_drm_add_crtc(drm, &ipu_crtc->base,
- 			&ipu_crtc->imx_crtc,
--			&ipu_crtc_helper_funcs, THIS_MODULE,
-+			&ipu_crtc_helper_funcs,
- 			ipu_crtc->dev->parent->of_node, pdata->di);
- 	if (ret) {
- 		dev_err(ipu_crtc->dev, "adding crtc failed with %d.\n", ret);
-@@ -404,6 +404,7 @@ err_put_resources:
- static int ipu_drm_bind(struct device *dev, struct device *master, void *data)
- {
- 	struct ipu_client_platformdata *pdata = dev->platform_data;
-+	struct drm_device *drm = data;
- 	struct ipu_crtc *ipu_crtc;
- 	int ret;
- 
-@@ -413,7 +414,7 @@ static int ipu_drm_bind(struct device *dev, struct device *master, void *data)
- 
- 	ipu_crtc->dev = dev;
- 
--	ret = ipu_crtc_init(ipu_crtc, pdata);
-+	ret = ipu_crtc_init(ipu_crtc, pdata, drm);
- 	if (ret)
- 		return ret;
- 
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0020-imx-drm-imx-drm-core-provide-helper-function-to-pars.patch b/patches/imx_drm/0020-imx-drm-imx-drm-core-provide-helper-function-to-pars.patch
deleted file mode 100644
index dfb3cc812..000000000
--- a/patches/imx_drm/0020-imx-drm-imx-drm-core-provide-helper-function-to-pars.patch
+++ /dev/null
@@ -1,112 +0,0 @@
-From 9e2d410d18bf93c620877a4ea0cab213362a2dda Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Sun, 3 Nov 2013 14:04:47 +0000
-Subject: [PATCH 20/67] imx-drm: imx-drm-core: provide helper function to parse
- possible crtcs
-
-Provide a helper function to parse possible crtcs before the encoder
-is registered.  The crtc mask is derived from the position of the
-CRTCs registered in the drm_device.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/imx-drm-core.c | 66 ++++++++++++++++++++++++++++++++++
- drivers/staging/imx-drm/imx-drm.h      |  2 ++
- 2 files changed, 68 insertions(+)
-
-diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c
-index 3d1c6b6..5cac6ee 100644
---- a/drivers/staging/imx-drm/imx-drm-core.c
-+++ b/drivers/staging/imx-drm/imx-drm-core.c
-@@ -658,6 +658,72 @@ err_busy:
- }
- EXPORT_SYMBOL_GPL(imx_drm_add_encoder);
- 
-+/*
-+ * Find the DRM CRTC possible mask for the device node cookie/id.
-+ *
-+ * The encoder possible masks are defined by their position in the
-+ * mode_config crtc_list.  This means that CRTCs must not be added
-+ * or removed once the DRM device has been fully initialised.
-+ */
-+static uint32_t imx_drm_find_crtc_mask(struct imx_drm_device *imxdrm,
-+	void *cookie, int id)
-+{
-+	unsigned i;
-+
-+	for (i = 0; i < MAX_CRTC; i++) {
-+		struct imx_drm_crtc *imx_drm_crtc = imxdrm->crtc[i];
-+		if (imx_drm_crtc && imx_drm_crtc->cookie.id == id &&
-+		    imx_drm_crtc->cookie.cookie == cookie)
-+			return drm_crtc_mask(imx_drm_crtc->crtc);
-+	}
-+
-+	return 0;
-+}
-+
-+int imx_drm_encoder_parse_of(struct drm_device *drm,
-+	struct drm_encoder *encoder, struct device_node *np)
-+{
-+	struct imx_drm_device *imxdrm = drm->dev_private;
-+	uint32_t crtc_mask = 0;
-+	int i, ret = 0;
-+
-+	for (i = 0; !ret; i++) {
-+		struct of_phandle_args args;
-+		uint32_t mask;
-+		int id;
-+
-+		ret = of_parse_phandle_with_args(np, "crtcs", "#crtc-cells", i,
-+						 &args);
-+		if (ret == -ENOENT)
-+			break;
-+		if (ret < 0)
-+			return ret;
-+
-+		id = args.args_count > 0 ? args.args[0] : 0;
-+		mask = imx_drm_find_crtc_mask(imxdrm, args.np, id);
-+		of_node_put(args.np);
-+
-+		/*
-+		 * If we failed to find the CRTC(s) which this encoder is
-+		 * supposed to be connected to, it's because the CRTC has
-+		 * not been registered yet.  Defer probing, and hope that
-+		 * the required CRTC is added later.
-+		 */
-+		if (mask == 0)
-+			return -EPROBE_DEFER;
-+
-+		crtc_mask |= mask;
-+	}
-+
-+	encoder->possible_crtcs = crtc_mask;
-+
-+	/* FIXME: this is the mask of outputs which can clone this output. */
-+	encoder->possible_clones = ~0;
-+
-+	return 0;
-+}
-+EXPORT_SYMBOL_GPL(imx_drm_encoder_parse_of);
-+
- int imx_drm_encoder_add_possible_crtcs(
- 		struct imx_drm_encoder *imx_drm_encoder,
- 		struct device_node *np)
-diff --git a/drivers/staging/imx-drm/imx-drm.h b/drivers/staging/imx-drm/imx-drm.h
-index 7846523..49d4aaf 100644
---- a/drivers/staging/imx-drm/imx-drm.h
-+++ b/drivers/staging/imx-drm/imx-drm.h
-@@ -64,6 +64,8 @@ struct device_node;
- int imx_drm_encoder_get_mux_id(struct drm_encoder *encoder);
- int imx_drm_encoder_add_possible_crtcs(struct imx_drm_encoder *imx_drm_encoder,
- 		struct device_node *np);
-+int imx_drm_encoder_parse_of(struct drm_device *drm,
-+	struct drm_encoder *encoder, struct device_node *np);
- 
- int imx_drm_connector_mode_valid(struct drm_connector *connector,
- 	struct drm_display_mode *mode);
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0021-imx-drm-imx-drm-core-provide-common-connector-and-en.patch b/patches/imx_drm/0021-imx-drm-imx-drm-core-provide-common-connector-and-en.patch
deleted file mode 100644
index 2f1338287..000000000
--- a/patches/imx_drm/0021-imx-drm-imx-drm-core-provide-common-connector-and-en.patch
+++ /dev/null
@@ -1,65 +0,0 @@
-From 8a51a33b3562de301d522eea1d167c243a16b6df Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Sun, 3 Nov 2013 13:28:24 +0000
-Subject: [PATCH 21/67] imx-drm: imx-drm-core: provide common connector and
- encoder cleanup functions
-
-Provide two helper functions to assist with cleaning up imx-drm
-connectors and encoders.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/imx-drm-core.c | 13 +++++++++++++
- drivers/staging/imx-drm/imx-drm.h      |  3 +++
- 2 files changed, 16 insertions(+)
-
-diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c
-index 5cac6ee..1f50acd 100644
---- a/drivers/staging/imx-drm/imx-drm-core.c
-+++ b/drivers/staging/imx-drm/imx-drm-core.c
-@@ -363,6 +363,19 @@ static void imx_drm_connector_unregister(
- 	drm_mode_group_reinit(imxdrm->drm);
- }
- 
-+void imx_drm_connector_destroy(struct drm_connector *connector)
-+{
-+	drm_sysfs_connector_remove(connector);
-+	drm_connector_cleanup(connector);
-+}
-+EXPORT_SYMBOL_GPL(imx_drm_connector_destroy);
-+
-+void imx_drm_encoder_destroy(struct drm_encoder *encoder)
-+{
-+	drm_encoder_cleanup(encoder);
-+}
-+EXPORT_SYMBOL_GPL(imx_drm_encoder_destroy);
-+
- static struct drm_mode_config_funcs imx_drm_mode_config_funcs = {
- 	.fb_create = drm_fb_cma_create,
- };
-diff --git a/drivers/staging/imx-drm/imx-drm.h b/drivers/staging/imx-drm/imx-drm.h
-index 49d4aaf..0543606 100644
---- a/drivers/staging/imx-drm/imx-drm.h
-+++ b/drivers/staging/imx-drm/imx-drm.h
-@@ -8,6 +8,7 @@
- struct drm_crtc;
- struct drm_connector;
- struct drm_device;
-+struct drm_display_mode;
- struct drm_encoder;
- struct imx_drm_crtc;
- struct drm_fbdev_cma;
-@@ -69,5 +70,7 @@ int imx_drm_encoder_parse_of(struct drm_device *drm,
- 
- int imx_drm_connector_mode_valid(struct drm_connector *connector,
- 	struct drm_display_mode *mode);
-+void imx_drm_connector_destroy(struct drm_connector *connector);
-+void imx_drm_encoder_destroy(struct drm_encoder *encoder);
- 
- #endif /* _IMX_DRM_H_ */
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0022-imx-drm-initialise-drm-components-directly.patch b/patches/imx_drm/0022-imx-drm-initialise-drm-components-directly.patch
deleted file mode 100644
index e1cedd6c0..000000000
--- a/patches/imx_drm/0022-imx-drm-initialise-drm-components-directly.patch
+++ /dev/null
@@ -1,591 +0,0 @@
-From 1b3f7675663384be878c9a32b76daa482e2bbe18 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Sun, 3 Nov 2013 13:30:48 +0000
-Subject: [PATCH 22/67] imx-drm: initialise drm components directly
-
-Now that our bind function is only ever called during the main DRM
-driver ->load callback, we don't need to have the imx_drm_connector or
-imx_drm_encoder abstractions anymore.  So let's get rid of it, and move
-the DRM connector and encoder setup into the connector support files.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/imx-hdmi.c         | 56 +++++++-----------------
- drivers/staging/imx-drm/imx-ldb.c          | 68 ++++++++++--------------------
- drivers/staging/imx-drm/imx-tve.c          | 58 +++++++------------------
- drivers/staging/imx-drm/parallel-display.c | 61 ++++++++-------------------
- 4 files changed, 69 insertions(+), 174 deletions(-)
-
-diff --git a/drivers/staging/imx-drm/imx-hdmi.c b/drivers/staging/imx-drm/imx-hdmi.c
-index 14b4a4b..8c58645 100644
---- a/drivers/staging/imx-drm/imx-hdmi.c
-+++ b/drivers/staging/imx-drm/imx-hdmi.c
-@@ -113,9 +113,7 @@ struct hdmi_data_info {
- 
- struct imx_hdmi {
- 	struct drm_connector connector;
--	struct imx_drm_connector *imx_drm_connector;
- 	struct drm_encoder encoder;
--	struct imx_drm_encoder *imx_drm_encoder;
- 
- 	enum imx_hdmi_devtype dev_type;
- 	struct device *dev;
-@@ -1378,10 +1376,6 @@ static enum drm_connector_status imx_hdmi_connector_detect(struct drm_connector
- 	return connector_status_connected;
- }
- 
--static void imx_hdmi_connector_destroy(struct drm_connector *connector)
--{
--}
--
- static int imx_hdmi_connector_get_modes(struct drm_connector *connector)
- {
- 	struct imx_hdmi *hdmi = container_of(connector, struct imx_hdmi,
-@@ -1467,13 +1461,8 @@ static void imx_hdmi_encoder_commit(struct drm_encoder *encoder)
- 	imx_hdmi_poweron(hdmi);
- }
- 
--static void imx_hdmi_encoder_destroy(struct drm_encoder *encoder)
--{
--	return;
--}
--
- static struct drm_encoder_funcs imx_hdmi_encoder_funcs = {
--	.destroy = imx_hdmi_encoder_destroy,
-+	.destroy = imx_drm_encoder_destroy,
- };
- 
- static struct drm_encoder_helper_funcs imx_hdmi_encoder_helper_funcs = {
-@@ -1489,7 +1478,7 @@ static struct drm_connector_funcs imx_hdmi_connector_funcs = {
- 	.dpms = drm_helper_connector_dpms,
- 	.fill_modes = drm_helper_probe_single_connector_modes,
- 	.detect = imx_hdmi_connector_detect,
--	.destroy = imx_hdmi_connector_destroy,
-+	.destroy = imx_drm_connector_destroy,
- };
- 
- static struct drm_connector_helper_funcs imx_hdmi_connector_helper_funcs = {
-@@ -1529,34 +1518,23 @@ static irqreturn_t imx_hdmi_irq(int irq, void *dev_id)
- 	return IRQ_HANDLED;
- }
- 
--static int imx_hdmi_register(struct imx_hdmi *hdmi)
-+static int imx_hdmi_register(struct drm_device *drm, struct imx_hdmi *hdmi)
- {
- 	int ret;
- 
--	hdmi->connector.funcs = &imx_hdmi_connector_funcs;
--	hdmi->encoder.funcs = &imx_hdmi_encoder_funcs;
--
--	hdmi->encoder.encoder_type = DRM_MODE_ENCODER_TMDS;
--	hdmi->connector.connector_type = DRM_MODE_CONNECTOR_HDMIA;
-+	ret = imx_drm_encoder_parse_of(drm, &hdmi->encoder,
-+				       hdmi->dev->of_node);
-+	if (ret)
-+		return ret;
- 
- 	drm_encoder_helper_add(&hdmi->encoder, &imx_hdmi_encoder_helper_funcs);
--	ret = imx_drm_add_encoder(&hdmi->encoder, &hdmi->imx_drm_encoder,
--			THIS_MODULE);
--	if (ret) {
--		dev_err(hdmi->dev, "adding encoder failed: %d\n", ret);
--		return ret;
--	}
-+	drm_encoder_init(drm, &hdmi->encoder, &imx_hdmi_encoder_funcs,
-+			 DRM_MODE_ENCODER_TMDS);
- 
- 	drm_connector_helper_add(&hdmi->connector,
- 			&imx_hdmi_connector_helper_funcs);
--
--	ret = imx_drm_add_connector(&hdmi->connector,
--			&hdmi->imx_drm_connector, THIS_MODULE);
--	if (ret) {
--		imx_drm_remove_encoder(hdmi->imx_drm_encoder);
--		dev_err(hdmi->dev, "adding connector failed: %d\n", ret);
--		return ret;
--	}
-+	drm_connector_init(drm, &hdmi->connector, &imx_hdmi_connector_funcs,
-+			   DRM_MODE_CONNECTOR_HDMIA);
- 
- 	hdmi->connector.encoder = &hdmi->encoder;
- 
-@@ -1588,6 +1566,7 @@ static int imx_hdmi_bind(struct device *dev, struct device *master, void *data)
- 	struct platform_device *pdev = to_platform_device(dev);
- 	const struct of_device_id *of_id =
- 				of_match_device(imx_hdmi_dt_ids, dev);
-+	struct drm_device *drm = data;
- 	struct device_node *np = dev->of_node;
- 	struct device_node *ddc_node;
- 	struct imx_hdmi *hdmi;
-@@ -1695,12 +1674,10 @@ static int imx_hdmi_bind(struct device *dev, struct device *master, void *data)
- 	if (ret)
- 		goto err_iahb;
- 
--	ret = imx_hdmi_register(hdmi);
-+	ret = imx_hdmi_register(drm, hdmi);
- 	if (ret)
- 		goto err_iahb;
- 
--	imx_drm_encoder_add_possible_crtcs(hdmi->imx_drm_encoder, np);
--
- 	dev_set_drvdata(dev, hdmi);
- 
- 	return 0;
-@@ -1717,12 +1694,9 @@ static void imx_hdmi_unbind(struct device *dev, struct device *master,
- 	void *data)
- {
- 	struct imx_hdmi *hdmi = dev_get_drvdata(dev);
--	struct drm_connector *connector = &hdmi->connector;
--	struct drm_encoder *encoder = &hdmi->encoder;
- 
--	drm_mode_connector_detach_encoder(connector, encoder);
--	imx_drm_remove_connector(hdmi->imx_drm_connector);
--	imx_drm_remove_encoder(hdmi->imx_drm_encoder);
-+	hdmi->connector.funcs->destroy(&hdmi->connector);
-+	hdmi->encoder.funcs->destroy(&hdmi->encoder);
- 
- 	clk_disable_unprepare(hdmi->iahb_clk);
- 	clk_disable_unprepare(hdmi->isfr_clk);
-diff --git a/drivers/staging/imx-drm/imx-ldb.c b/drivers/staging/imx-drm/imx-ldb.c
-index d00f93f..5168c76 100644
---- a/drivers/staging/imx-drm/imx-ldb.c
-+++ b/drivers/staging/imx-drm/imx-ldb.c
-@@ -59,9 +59,8 @@ struct imx_ldb;
- struct imx_ldb_channel {
- 	struct imx_ldb *ldb;
- 	struct drm_connector connector;
--	struct imx_drm_connector *imx_drm_connector;
- 	struct drm_encoder encoder;
--	struct imx_drm_encoder *imx_drm_encoder;
-+	struct device_node *child;
- 	int chno;
- 	void *edid;
- 	int edid_len;
-@@ -92,11 +91,6 @@ static enum drm_connector_status imx_ldb_connector_detect(
- 	return connector_status_connected;
- }
- 
--static void imx_ldb_connector_destroy(struct drm_connector *connector)
--{
--	/* do not free here */
--}
--
- static int imx_ldb_connector_get_modes(struct drm_connector *connector)
- {
- 	struct imx_ldb_channel *imx_ldb_ch = con_to_imx_ldb_ch(connector);
-@@ -308,16 +302,11 @@ static void imx_ldb_encoder_disable(struct drm_encoder *encoder)
- 	}
- }
- 
--static void imx_ldb_encoder_destroy(struct drm_encoder *encoder)
--{
--	/* do not free here */
--}
--
- static struct drm_connector_funcs imx_ldb_connector_funcs = {
- 	.dpms = drm_helper_connector_dpms,
- 	.fill_modes = drm_helper_probe_single_connector_modes,
- 	.detect = imx_ldb_connector_detect,
--	.destroy = imx_ldb_connector_destroy,
-+	.destroy = imx_drm_connector_destroy,
- };
- 
- static struct drm_connector_helper_funcs imx_ldb_connector_helper_funcs = {
-@@ -327,7 +316,7 @@ static struct drm_connector_helper_funcs imx_ldb_connector_helper_funcs = {
- };
- 
- static struct drm_encoder_funcs imx_ldb_encoder_funcs = {
--	.destroy = imx_ldb_encoder_destroy,
-+	.destroy = imx_drm_encoder_destroy,
- };
- 
- static struct drm_encoder_helper_funcs imx_ldb_encoder_helper_funcs = {
-@@ -354,45 +343,36 @@ static int imx_ldb_get_clk(struct imx_ldb *ldb, int chno)
- 	return PTR_ERR_OR_ZERO(ldb->clk_pll[chno]);
- }
- 
--static int imx_ldb_register(struct imx_ldb_channel *imx_ldb_ch)
-+static int imx_ldb_register(struct drm_device *drm,
-+	struct imx_ldb_channel *imx_ldb_ch)
- {
--	int ret;
- 	struct imx_ldb *ldb = imx_ldb_ch->ldb;
-+	int ret;
-+
-+	ret = imx_drm_encoder_parse_of(drm, &imx_ldb_ch->encoder,
-+				       imx_ldb_ch->child);
-+	if (ret)
-+		return ret;
- 
- 	ret = imx_ldb_get_clk(ldb, imx_ldb_ch->chno);
- 	if (ret)
- 		return ret;
-+
- 	if (ldb->ldb_ctrl & LDB_SPLIT_MODE_EN) {
--		ret |= imx_ldb_get_clk(ldb, 1);
-+		ret = imx_ldb_get_clk(ldb, 1);
- 		if (ret)
- 			return ret;
- 	}
- 
--	imx_ldb_ch->connector.funcs = &imx_ldb_connector_funcs;
--	imx_ldb_ch->encoder.funcs = &imx_ldb_encoder_funcs;
--
--	imx_ldb_ch->encoder.encoder_type = DRM_MODE_ENCODER_LVDS;
--	imx_ldb_ch->connector.connector_type = DRM_MODE_CONNECTOR_LVDS;
--
- 	drm_encoder_helper_add(&imx_ldb_ch->encoder,
- 			&imx_ldb_encoder_helper_funcs);
--	ret = imx_drm_add_encoder(&imx_ldb_ch->encoder,
--			&imx_ldb_ch->imx_drm_encoder, THIS_MODULE);
--	if (ret) {
--		dev_err(ldb->dev, "adding encoder failed with %d\n", ret);
--		return ret;
--	}
-+	drm_encoder_init(drm, &imx_ldb_ch->encoder, &imx_ldb_encoder_funcs,
-+			 DRM_MODE_ENCODER_LVDS);
- 
- 	drm_connector_helper_add(&imx_ldb_ch->connector,
- 			&imx_ldb_connector_helper_funcs);
--
--	ret = imx_drm_add_connector(&imx_ldb_ch->connector,
--			&imx_ldb_ch->imx_drm_connector, THIS_MODULE);
--	if (ret) {
--		imx_drm_remove_encoder(imx_ldb_ch->imx_drm_encoder);
--		dev_err(ldb->dev, "adding connector failed with %d\n", ret);
--		return ret;
--	}
-+	drm_connector_init(drm, &imx_ldb_ch->connector,
-+			   &imx_ldb_connector_funcs, DRM_MODE_CONNECTOR_LVDS);
- 
- 	drm_mode_connector_attach_encoder(&imx_ldb_ch->connector,
- 			&imx_ldb_ch->encoder);
-@@ -453,6 +433,7 @@ MODULE_DEVICE_TABLE(of, imx_ldb_dt_ids);
- 
- static int imx_ldb_bind(struct device *dev, struct device *master, void *data)
- {
-+	struct drm_device *drm = data;
- 	struct device_node *np = dev->of_node;
- 	const struct of_device_id *of_id =
- 			of_match_device(imx_ldb_dt_ids, dev);
-@@ -523,6 +504,7 @@ static int imx_ldb_bind(struct device *dev, struct device *master, void *data)
- 		channel = &imx_ldb->channel[i];
- 		channel->ldb = imx_ldb;
- 		channel->chno = i;
-+		channel->child = child;
- 
- 		edidp = of_get_property(child, "edid", &channel->edid_len);
- 		if (edidp) {
-@@ -565,11 +547,9 @@ static int imx_ldb_bind(struct device *dev, struct device *master, void *data)
- 			return -EINVAL;
- 		}
- 
--		ret = imx_ldb_register(channel);
-+		ret = imx_ldb_register(drm, channel);
- 		if (ret)
- 			return ret;
--
--		imx_drm_encoder_add_possible_crtcs(channel->imx_drm_encoder, child);
- 	}
- 
- 	dev_set_drvdata(dev, imx_ldb);
-@@ -585,13 +565,9 @@ static void imx_ldb_unbind(struct device *dev, struct device *master,
- 
- 	for (i = 0; i < 2; i++) {
- 		struct imx_ldb_channel *channel = &imx_ldb->channel[i];
--		struct drm_connector *connector = &channel->connector;
--		struct drm_encoder *encoder = &channel->encoder;
--
--		drm_mode_connector_detach_encoder(connector, encoder);
- 
--		imx_drm_remove_connector(channel->imx_drm_connector);
--		imx_drm_remove_encoder(channel->imx_drm_encoder);
-+		channel->connector.funcs->destroy(&channel->connector);
-+		channel->encoder.funcs->destroy(&channel->encoder);
- 	}
- }
- 
-diff --git a/drivers/staging/imx-drm/imx-tve.c b/drivers/staging/imx-drm/imx-tve.c
-index ad840d7..702c0c3 100644
---- a/drivers/staging/imx-drm/imx-tve.c
-+++ b/drivers/staging/imx-drm/imx-tve.c
-@@ -111,9 +111,7 @@ enum {
- 
- struct imx_tve {
- 	struct drm_connector connector;
--	struct imx_drm_connector *imx_drm_connector;
- 	struct drm_encoder encoder;
--	struct imx_drm_encoder *imx_drm_encoder;
- 	struct device *dev;
- 	spinlock_t lock;	/* register lock */
- 	bool enabled;
-@@ -226,11 +224,6 @@ static enum drm_connector_status imx_tve_connector_detect(
- 	return connector_status_connected;
- }
- 
--static void imx_tve_connector_destroy(struct drm_connector *connector)
--{
--	/* do not free here */
--}
--
- static int imx_tve_connector_get_modes(struct drm_connector *connector)
- {
- 	struct imx_tve *tve = con_to_tve(connector);
-@@ -368,16 +361,11 @@ static void imx_tve_encoder_disable(struct drm_encoder *encoder)
- 	tve_disable(tve);
- }
- 
--static void imx_tve_encoder_destroy(struct drm_encoder *encoder)
--{
--	/* do not free here */
--}
--
- static struct drm_connector_funcs imx_tve_connector_funcs = {
- 	.dpms = drm_helper_connector_dpms,
- 	.fill_modes = drm_helper_probe_single_connector_modes,
- 	.detect = imx_tve_connector_detect,
--	.destroy = imx_tve_connector_destroy,
-+	.destroy = imx_drm_connector_destroy,
- };
- 
- static struct drm_connector_helper_funcs imx_tve_connector_helper_funcs = {
-@@ -387,7 +375,7 @@ static struct drm_connector_helper_funcs imx_tve_connector_helper_funcs = {
- };
- 
- static struct drm_encoder_funcs imx_tve_encoder_funcs = {
--	.destroy = imx_tve_encoder_destroy,
-+	.destroy = imx_drm_encoder_destroy,
- };
- 
- static struct drm_encoder_helper_funcs imx_tve_encoder_helper_funcs = {
-@@ -507,7 +495,7 @@ static int tve_clk_init(struct imx_tve *tve, void __iomem *base)
- 	return 0;
- }
- 
--static int imx_tve_register(struct imx_tve *tve)
-+static int imx_tve_register(struct drm_device *drm, struct imx_tve *tve)
- {
- 	int encoder_type;
- 	int ret;
-@@ -515,30 +503,19 @@ static int imx_tve_register(struct imx_tve *tve)
- 	encoder_type = tve->mode == TVE_MODE_VGA ?
- 				DRM_MODE_ENCODER_DAC : DRM_MODE_ENCODER_TVDAC;
- 
--	tve->connector.funcs = &imx_tve_connector_funcs;
--	tve->encoder.funcs = &imx_tve_encoder_funcs;
--
--	tve->encoder.encoder_type = encoder_type;
--	tve->connector.connector_type = DRM_MODE_CONNECTOR_VGA;
-+	ret = imx_drm_encoder_parse_of(drm, &tve->encoder,
-+				       tve->dev->of_node);
-+	if (ret)
-+		return ret;
- 
- 	drm_encoder_helper_add(&tve->encoder, &imx_tve_encoder_helper_funcs);
--	ret = imx_drm_add_encoder(&tve->encoder, &tve->imx_drm_encoder,
--			THIS_MODULE);
--	if (ret) {
--		dev_err(tve->dev, "adding encoder failed with %d\n", ret);
--		return ret;
--	}
-+	drm_encoder_init(drm, &tve->encoder, &imx_tve_encoder_funcs,
-+			 encoder_type);
- 
- 	drm_connector_helper_add(&tve->connector,
- 			&imx_tve_connector_helper_funcs);
--
--	ret = imx_drm_add_connector(&tve->connector,
--			&tve->imx_drm_connector, THIS_MODULE);
--	if (ret) {
--		imx_drm_remove_encoder(tve->imx_drm_encoder);
--		dev_err(tve->dev, "adding connector failed with %d\n", ret);
--		return ret;
--	}
-+	drm_connector_init(drm, &tve->connector, &imx_tve_connector_funcs,
-+			   DRM_MODE_CONNECTOR_VGA);
- 
- 	drm_mode_connector_attach_encoder(&tve->connector, &tve->encoder);
- 
-@@ -587,6 +564,7 @@ static const int of_get_tve_mode(struct device_node *np)
- static int imx_tve_bind(struct device *dev, struct device *master, void *data)
- {
- 	struct platform_device *pdev = to_platform_device(dev);
-+	struct drm_device *drm = data;
- 	struct device_node *np = dev->of_node;
- 	struct device_node *ddc_node;
- 	struct imx_tve *tve;
-@@ -701,12 +679,10 @@ static int imx_tve_bind(struct device *dev, struct device *master, void *data)
- 	/* disable cable detection for VGA mode */
- 	ret = regmap_write(tve->regmap, TVE_CD_CONT_REG, 0);
- 
--	ret = imx_tve_register(tve);
-+	ret = imx_tve_register(drm, tve);
- 	if (ret)
- 		return ret;
- 
--	ret = imx_drm_encoder_add_possible_crtcs(tve->imx_drm_encoder, np);
--
- 	dev_set_drvdata(dev, tve);
- 
- 	return 0;
-@@ -716,13 +692,9 @@ static void imx_tve_unbind(struct device *dev, struct device *master,
- 	void *data)
- {
- 	struct imx_tve *tve = dev_get_drvdata(dev);
--	struct drm_connector *connector = &tve->connector;
--	struct drm_encoder *encoder = &tve->encoder;
--
--	drm_mode_connector_detach_encoder(connector, encoder);
- 
--	imx_drm_remove_connector(tve->imx_drm_connector);
--	imx_drm_remove_encoder(tve->imx_drm_encoder);
-+	tve->connector.funcs->destroy(&tve->connector);
-+	tve->encoder.funcs->destroy(&tve->encoder);
- 
- 	if (!IS_ERR(tve->dac_reg))
- 		regulator_disable(tve->dac_reg);
-diff --git a/drivers/staging/imx-drm/parallel-display.c b/drivers/staging/imx-drm/parallel-display.c
-index 4019cae..d610f07 100644
---- a/drivers/staging/imx-drm/parallel-display.c
-+++ b/drivers/staging/imx-drm/parallel-display.c
-@@ -33,9 +33,7 @@
- 
- struct imx_parallel_display {
- 	struct drm_connector connector;
--	struct imx_drm_connector *imx_drm_connector;
- 	struct drm_encoder encoder;
--	struct imx_drm_encoder *imx_drm_encoder;
- 	struct device *dev;
- 	void *edid;
- 	int edid_len;
-@@ -50,11 +48,6 @@ static enum drm_connector_status imx_pd_connector_detect(
- 	return connector_status_connected;
- }
- 
--static void imx_pd_connector_destroy(struct drm_connector *connector)
--{
--	/* do not free here */
--}
--
- static int imx_pd_connector_get_modes(struct drm_connector *connector)
- {
- 	struct imx_parallel_display *imxpd = con_to_imxpd(connector);
-@@ -126,16 +119,11 @@ static void imx_pd_encoder_disable(struct drm_encoder *encoder)
- {
- }
- 
--static void imx_pd_encoder_destroy(struct drm_encoder *encoder)
--{
--	/* do not free here */
--}
--
- static struct drm_connector_funcs imx_pd_connector_funcs = {
- 	.dpms = drm_helper_connector_dpms,
- 	.fill_modes = drm_helper_probe_single_connector_modes,
- 	.detect = imx_pd_connector_detect,
--	.destroy = imx_pd_connector_destroy,
-+	.destroy = imx_drm_connector_destroy,
- };
- 
- static struct drm_connector_helper_funcs imx_pd_connector_helper_funcs = {
-@@ -145,7 +133,7 @@ static struct drm_connector_helper_funcs imx_pd_connector_helper_funcs = {
- };
- 
- static struct drm_encoder_funcs imx_pd_encoder_funcs = {
--	.destroy = imx_pd_encoder_destroy,
-+	.destroy = imx_drm_encoder_destroy,
- };
- 
- static struct drm_encoder_helper_funcs imx_pd_encoder_helper_funcs = {
-@@ -157,36 +145,26 @@ static struct drm_encoder_helper_funcs imx_pd_encoder_helper_funcs = {
- 	.disable = imx_pd_encoder_disable,
- };
- 
--static int imx_pd_register(struct imx_parallel_display *imxpd)
-+static int imx_pd_register(struct drm_device *drm,
-+	struct imx_parallel_display *imxpd)
- {
- 	int ret;
- 
--	drm_mode_connector_attach_encoder(&imxpd->connector, &imxpd->encoder);
--
--	imxpd->connector.funcs = &imx_pd_connector_funcs;
--	imxpd->encoder.funcs = &imx_pd_encoder_funcs;
--
--	imxpd->encoder.encoder_type = DRM_MODE_ENCODER_NONE;
--	imxpd->connector.connector_type = DRM_MODE_CONNECTOR_VGA;
-+	ret = imx_drm_encoder_parse_of(drm, &imxpd->encoder,
-+				       imxpd->dev->of_node);
-+	if (ret)
-+		return ret;
- 
- 	drm_encoder_helper_add(&imxpd->encoder, &imx_pd_encoder_helper_funcs);
--	ret = imx_drm_add_encoder(&imxpd->encoder, &imxpd->imx_drm_encoder,
--			THIS_MODULE);
--	if (ret) {
--		dev_err(imxpd->dev, "adding encoder failed with %d\n", ret);
--		return ret;
--	}
-+	drm_encoder_init(drm, &imxpd->encoder, &imx_pd_encoder_funcs,
-+			 DRM_MODE_ENCODER_NONE);
- 
- 	drm_connector_helper_add(&imxpd->connector,
- 			&imx_pd_connector_helper_funcs);
-+	drm_connector_init(drm, &imxpd->connector, &imx_pd_connector_funcs,
-+			   DRM_MODE_CONNECTOR_VGA);
- 
--	ret = imx_drm_add_connector(&imxpd->connector,
--			&imxpd->imx_drm_connector, THIS_MODULE);
--	if (ret) {
--		imx_drm_remove_encoder(imxpd->imx_drm_encoder);
--		dev_err(imxpd->dev, "adding connector failed with %d\n", ret);
--		return ret;
--	}
-+	drm_mode_connector_attach_encoder(&imxpd->connector, &imxpd->encoder);
- 
- 	imxpd->connector.encoder = &imxpd->encoder;
- 
-@@ -195,6 +173,7 @@ static int imx_pd_register(struct imx_parallel_display *imxpd)
- 
- static int imx_pd_bind(struct device *dev, struct device *master, void *data)
- {
-+	struct drm_device *drm = data;
- 	struct device_node *np = dev->of_node;
- 	const u8 *edidp;
- 	struct imx_parallel_display *imxpd;
-@@ -221,12 +200,10 @@ static int imx_pd_bind(struct device *dev, struct device *master, void *data)
- 
- 	imxpd->dev = dev;
- 
--	ret = imx_pd_register(imxpd);
-+	ret = imx_pd_register(drm, imxpd);
- 	if (ret)
- 		return ret;
- 
--	ret = imx_drm_encoder_add_possible_crtcs(imxpd->imx_drm_encoder, np);
--
- 	dev_set_drvdata(dev, imxpd);
- 
- 	return 0;
-@@ -236,13 +213,9 @@ static void imx_pd_unbind(struct device *dev, struct device *master,
- 	void *data)
- {
- 	struct imx_parallel_display *imxpd = dev_get_drvdata(dev);
--	struct drm_connector *connector = &imxpd->connector;
--	struct drm_encoder *encoder = &imxpd->encoder;
--
--	drm_mode_connector_detach_encoder(connector, encoder);
- 
--	imx_drm_remove_connector(imxpd->imx_drm_connector);
--	imx_drm_remove_encoder(imxpd->imx_drm_encoder);
-+	imxpd->encoder.funcs->destroy(&imxpd->encoder);
-+	imxpd->connector.funcs->destroy(&imxpd->connector);
- }
- 
- static const struct component_ops imx_pd_ops = {
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0023-imx-drm-imx-drm-core-remove-imx_drm_connector-and-im.patch b/patches/imx_drm/0023-imx-drm-imx-drm-core-remove-imx_drm_connector-and-im.patch
deleted file mode 100644
index 84f197511..000000000
--- a/patches/imx_drm/0023-imx-drm-imx-drm-core-remove-imx_drm_connector-and-im.patch
+++ /dev/null
@@ -1,517 +0,0 @@
-From 8d71de61526924f516548707a5f16ac9e564aeee Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Sun, 3 Nov 2013 13:55:34 +0000
-Subject: [PATCH 23/67] imx-drm: imx-drm-core: remove imx_drm_connector and
- imx_drm_encoder code
-
-The core imx_drm_connector and imx_drm_encoder code is no longer
-required - the connectors and encoders are all using the component
-support, so we can remove this.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/imx-drm-core.c | 371 +--------------------------------
- drivers/staging/imx-drm/imx-drm.h      |  14 --
- 2 files changed, 1 insertion(+), 384 deletions(-)
-
-diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c
-index 1f50acd..b27c425 100644
---- a/drivers/staging/imx-drm/imx-drm-core.c
-+++ b/drivers/staging/imx-drm/imx-drm-core.c
-@@ -40,8 +40,6 @@ struct imx_drm_device {
- 	struct drm_device			*drm;
- 	struct device				*dev;
- 	struct imx_drm_crtc			*crtc[MAX_CRTC];
--	struct list_head			encoder_list;
--	struct list_head			connector_list;
- 	struct mutex				mutex;
- 	int					pipes;
- 	struct drm_fbdev_cma			*fbhelper;
-@@ -56,24 +54,9 @@ struct imx_drm_crtc {
- 	int					mux_id;
- };
- 
--struct imx_drm_encoder {
--	struct drm_encoder			*encoder;
--	struct list_head			list;
--	struct module				*owner;
--	struct list_head			possible_crtcs;
--};
--
--struct imx_drm_connector {
--	struct drm_connector			*connector;
--	struct list_head			list;
--	struct module				*owner;
--};
--
- static int legacyfb_depth = 16;
- module_param(legacyfb_depth, int, 0444);
- 
--static void imx_drm_device_put(void);
--
- int imx_drm_crtc_id(struct imx_drm_crtc *crtc)
- {
- 	return crtc->pipe;
-@@ -101,8 +84,6 @@ static int imx_drm_driver_unload(struct drm_device *drm)
- 
- 	component_unbind_all(drm->dev, drm);
- 
--	imx_drm_device_put();
--
- 	drm_vblank_cleanup(drm);
- 	drm_kms_helper_poll_fini(drm);
- 	drm_mode_config_cleanup(drm);
-@@ -234,135 +215,6 @@ static struct imx_drm_device *__imx_drm_device(void)
- 	return imx_drm_device;
- }
- 
--static struct drm_device *imx_drm_device_get(void)
--{
--	struct imx_drm_device *imxdrm = __imx_drm_device();
--	struct imx_drm_encoder *enc;
--	struct imx_drm_connector *con;
--
--	list_for_each_entry(enc, &imxdrm->encoder_list, list) {
--		if (!try_module_get(enc->owner)) {
--			dev_err(imxdrm->dev, "could not get module %s\n",
--					module_name(enc->owner));
--			goto unwind_enc;
--		}
--	}
--
--	list_for_each_entry(con, &imxdrm->connector_list, list) {
--		if (!try_module_get(con->owner)) {
--			dev_err(imxdrm->dev, "could not get module %s\n",
--					module_name(con->owner));
--			goto unwind_con;
--		}
--	}
--
--	return imxdrm->drm;
--
--unwind_con:
--	list_for_each_entry_continue_reverse(con, &imxdrm->connector_list, list)
--		module_put(con->owner);
--unwind_enc:
--	list_for_each_entry_continue_reverse(enc, &imxdrm->encoder_list, list)
--		module_put(enc->owner);
--
--	mutex_unlock(&imxdrm->mutex);
--
--	return NULL;
--
--}
--
--static void imx_drm_device_put(void)
--{
--	struct imx_drm_device *imxdrm = __imx_drm_device();
--	struct imx_drm_encoder *enc;
--	struct imx_drm_connector *con;
--
--	mutex_lock(&imxdrm->mutex);
--
--	list_for_each_entry(con, &imxdrm->connector_list, list)
--		module_put(con->owner);
--
--	list_for_each_entry(enc, &imxdrm->encoder_list, list)
--		module_put(enc->owner);
--
--	mutex_unlock(&imxdrm->mutex);
--}
--
--static int drm_mode_group_reinit(struct drm_device *dev)
--{
--	struct drm_mode_group *group = &dev->primary->mode_group;
--	uint32_t *id_list = group->id_list;
--	int ret;
--
--	ret = drm_mode_group_init_legacy_group(dev, group);
--	if (ret < 0)
--		return ret;
--
--	kfree(id_list);
--	return 0;
--}
--
--/*
-- * register an encoder to the drm core
-- */
--static int imx_drm_encoder_register(struct imx_drm_encoder *imx_drm_encoder)
--{
--	struct imx_drm_device *imxdrm = __imx_drm_device();
--
--	INIT_LIST_HEAD(&imx_drm_encoder->possible_crtcs);
--
--	drm_encoder_init(imxdrm->drm, imx_drm_encoder->encoder,
--			imx_drm_encoder->encoder->funcs,
--			imx_drm_encoder->encoder->encoder_type);
--
--	drm_mode_group_reinit(imxdrm->drm);
--
--	return 0;
--}
--
--/*
-- * unregister an encoder from the drm core
-- */
--static void imx_drm_encoder_unregister(struct imx_drm_encoder
--		*imx_drm_encoder)
--{
--	struct imx_drm_device *imxdrm = __imx_drm_device();
--
--	drm_encoder_cleanup(imx_drm_encoder->encoder);
--
--	drm_mode_group_reinit(imxdrm->drm);
--}
--
--/*
-- * register a connector to the drm core
-- */
--static int imx_drm_connector_register(
--		struct imx_drm_connector *imx_drm_connector)
--{
--	struct imx_drm_device *imxdrm = __imx_drm_device();
--
--	drm_connector_init(imxdrm->drm, imx_drm_connector->connector,
--			imx_drm_connector->connector->funcs,
--			imx_drm_connector->connector->connector_type);
--	drm_mode_group_reinit(imxdrm->drm);
--
--	return 0;
--}
--
--/*
-- * unregister a connector from the drm core
-- */
--static void imx_drm_connector_unregister(
--		struct imx_drm_connector *imx_drm_connector)
--{
--	struct imx_drm_device *imxdrm = __imx_drm_device();
--
--	drm_sysfs_connector_remove(imx_drm_connector->connector);
--	drm_connector_cleanup(imx_drm_connector->connector);
--
--	drm_mode_group_reinit(imxdrm->drm);
--}
--
- void imx_drm_connector_destroy(struct drm_connector *connector)
- {
- 	drm_sysfs_connector_remove(connector);
-@@ -439,12 +291,8 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
- 	 */
- 	drm->vblank_disable_allowed = true;
- 
--	if (!imx_drm_device_get()) {
--		ret = -EINVAL;
--		goto err_vblank;
--	}
--
- 	platform_set_drvdata(drm->platformdev, drm);
-+
- 	mutex_unlock(&imxdrm->mutex);
- 
- 	/* Now try and bind all our sub-components */
-@@ -492,7 +340,6 @@ err_unbind:
- 	component_unbind_all(drm->dev, drm);
- err_relock:
- 	mutex_lock(&imxdrm->mutex);
--err_vblank:
- 	drm_vblank_cleanup(drm);
- err_kms:
- 	drm_kms_helper_poll_fini(drm);
-@@ -502,29 +349,6 @@ err_kms:
- 	return ret;
- }
- 
--static void imx_drm_update_possible_crtcs(void)
--{
--	struct imx_drm_device *imxdrm = __imx_drm_device();
--	struct imx_drm_crtc *imx_drm_crtc;
--	struct imx_drm_encoder *enc;
--	struct crtc_cookie *cookie;
--
--	list_for_each_entry(enc, &imxdrm->encoder_list, list) {
--		u32 possible_crtcs = 0;
--
--		list_for_each_entry(cookie, &enc->possible_crtcs, list) {
--			list_for_each_entry(imx_drm_crtc, &imxdrm->crtc_list, list) {
--				if (imx_drm_crtc->cookie.cookie == cookie->cookie &&
--						imx_drm_crtc->cookie.id == cookie->id) {
--					possible_crtcs |= 1 << imx_drm_crtc->pipe;
--				}
--			}
--		}
--		enc->encoder->possible_crtcs = possible_crtcs;
--		enc->encoder->possible_clones = possible_crtcs;
--	}
--}
--
- /*
-  * imx_drm_add_crtc - add a new crtc
-  *
-@@ -584,8 +408,6 @@ int imx_drm_add_crtc(struct drm_device *drm, struct drm_crtc *crtc,
- 	drm_crtc_init(drm, crtc,
- 			imx_drm_crtc->imx_drm_helper_funcs.crtc_funcs);
- 
--	imx_drm_update_possible_crtcs();
--
- 	mutex_unlock(&imxdrm->mutex);
- 
- 	return 0;
-@@ -622,56 +444,6 @@ int imx_drm_remove_crtc(struct imx_drm_crtc *imx_drm_crtc)
- EXPORT_SYMBOL_GPL(imx_drm_remove_crtc);
- 
- /*
-- * imx_drm_add_encoder - add a new encoder
-- */
--int imx_drm_add_encoder(struct drm_encoder *encoder,
--		struct imx_drm_encoder **newenc, struct module *owner)
--{
--	struct imx_drm_device *imxdrm = __imx_drm_device();
--	struct imx_drm_encoder *imx_drm_encoder;
--	int ret;
--
--	mutex_lock(&imxdrm->mutex);
--
--	if (imxdrm->drm->open_count) {
--		ret = -EBUSY;
--		goto err_busy;
--	}
--
--	imx_drm_encoder = kzalloc(sizeof(*imx_drm_encoder), GFP_KERNEL);
--	if (!imx_drm_encoder) {
--		ret = -ENOMEM;
--		goto err_alloc;
--	}
--
--	imx_drm_encoder->encoder = encoder;
--	imx_drm_encoder->owner = owner;
--
--	ret = imx_drm_encoder_register(imx_drm_encoder);
--	if (ret) {
--		ret = -ENOMEM;
--		goto err_register;
--	}
--
--	list_add_tail(&imx_drm_encoder->list, &imxdrm->encoder_list);
--
--	*newenc = imx_drm_encoder;
--
--	mutex_unlock(&imxdrm->mutex);
--
--	return 0;
--
--err_register:
--	kfree(imx_drm_encoder);
--err_alloc:
--err_busy:
--	mutex_unlock(&imxdrm->mutex);
--
--	return ret;
--}
--EXPORT_SYMBOL_GPL(imx_drm_add_encoder);
--
--/*
-  * Find the DRM CRTC possible mask for the device node cookie/id.
-  *
-  * The encoder possible masks are defined by their position in the
-@@ -737,49 +509,6 @@ int imx_drm_encoder_parse_of(struct drm_device *drm,
- }
- EXPORT_SYMBOL_GPL(imx_drm_encoder_parse_of);
- 
--int imx_drm_encoder_add_possible_crtcs(
--		struct imx_drm_encoder *imx_drm_encoder,
--		struct device_node *np)
--{
--	struct imx_drm_device *imxdrm = __imx_drm_device();
--	struct of_phandle_args args;
--	struct crtc_cookie *c;
--	int ret = 0;
--	int i;
--
--	if (!list_empty(&imx_drm_encoder->possible_crtcs))
--		return -EBUSY;
--
--	for (i = 0; !ret; i++) {
--		ret = of_parse_phandle_with_args(np, "crtcs",
--				"#crtc-cells", i, &args);
--		if (ret < 0)
--			break;
--
--		c = kzalloc(sizeof(*c), GFP_KERNEL);
--		if (!c) {
--			of_node_put(args.np);
--			return -ENOMEM;
--		}
--
--		c->cookie = args.np;
--		c->id = args.args_count > 0 ? args.args[0] : 0;
--
--		of_node_put(args.np);
--
--		mutex_lock(&imxdrm->mutex);
--
--		list_add_tail(&c->list, &imx_drm_encoder->possible_crtcs);
--
--		mutex_unlock(&imxdrm->mutex);
--	}
--
--	imx_drm_update_possible_crtcs();
--
--	return 0;
--}
--EXPORT_SYMBOL_GPL(imx_drm_encoder_add_possible_crtcs);
--
- int imx_drm_encoder_get_mux_id(struct drm_encoder *encoder)
- {
- 	struct imx_drm_crtc *imx_crtc = imx_drm_find_crtc(encoder->crtc);
-@@ -788,102 +517,6 @@ int imx_drm_encoder_get_mux_id(struct drm_encoder *encoder)
- }
- EXPORT_SYMBOL_GPL(imx_drm_encoder_get_mux_id);
- 
--/*
-- * imx_drm_remove_encoder - remove an encoder
-- */
--int imx_drm_remove_encoder(struct imx_drm_encoder *imx_drm_encoder)
--{
--	struct imx_drm_device *imxdrm = __imx_drm_device();
--	struct crtc_cookie *c, *tmp;
--
--	mutex_lock(&imxdrm->mutex);
--
--	imx_drm_encoder_unregister(imx_drm_encoder);
--
--	list_del(&imx_drm_encoder->list);
--
--	list_for_each_entry_safe(c, tmp, &imx_drm_encoder->possible_crtcs,
--			list)
--		kfree(c);
--
--	mutex_unlock(&imxdrm->mutex);
--
--	kfree(imx_drm_encoder);
--
--	return 0;
--}
--EXPORT_SYMBOL_GPL(imx_drm_remove_encoder);
--
--/*
-- * imx_drm_add_connector - add a connector
-- */
--int imx_drm_add_connector(struct drm_connector *connector,
--		struct imx_drm_connector **new_con,
--		struct module *owner)
--{
--	struct imx_drm_device *imxdrm = __imx_drm_device();
--	struct imx_drm_connector *imx_drm_connector;
--	int ret;
--
--	mutex_lock(&imxdrm->mutex);
--
--	if (imxdrm->drm->open_count) {
--		ret = -EBUSY;
--		goto err_busy;
--	}
--
--	imx_drm_connector = kzalloc(sizeof(*imx_drm_connector), GFP_KERNEL);
--	if (!imx_drm_connector) {
--		ret = -ENOMEM;
--		goto err_alloc;
--	}
--
--	imx_drm_connector->connector = connector;
--	imx_drm_connector->owner = owner;
--
--	ret = imx_drm_connector_register(imx_drm_connector);
--	if (ret)
--		goto err_register;
--
--	list_add_tail(&imx_drm_connector->list, &imxdrm->connector_list);
--
--	*new_con = imx_drm_connector;
--
--	mutex_unlock(&imxdrm->mutex);
--
--	return 0;
--
--err_register:
--	kfree(imx_drm_connector);
--err_alloc:
--err_busy:
--	mutex_unlock(&imxdrm->mutex);
--
--	return ret;
--}
--EXPORT_SYMBOL_GPL(imx_drm_add_connector);
--
--/*
-- * imx_drm_remove_connector - remove a connector
-- */
--int imx_drm_remove_connector(struct imx_drm_connector *imx_drm_connector)
--{
--	struct imx_drm_device *imxdrm = __imx_drm_device();
--
--	mutex_lock(&imxdrm->mutex);
--
--	imx_drm_connector_unregister(imx_drm_connector);
--
--	list_del(&imx_drm_connector->list);
--
--	mutex_unlock(&imxdrm->mutex);
--
--	kfree(imx_drm_connector);
--
--	return 0;
--}
--EXPORT_SYMBOL_GPL(imx_drm_remove_connector);
--
- static const struct drm_ioctl_desc imx_drm_ioctls[] = {
- 	/* none so far */
- };
-@@ -1031,8 +664,6 @@ static int __init imx_drm_init(void)
- 		return -ENOMEM;
- 
- 	mutex_init(&imx_drm_device->mutex);
--	INIT_LIST_HEAD(&imx_drm_device->connector_list);
--	INIT_LIST_HEAD(&imx_drm_device->encoder_list);
- 
- 	ret = platform_driver_register(&imx_drm_pdrv);
- 	if (ret)
-diff --git a/drivers/staging/imx-drm/imx-drm.h b/drivers/staging/imx-drm/imx-drm.h
-index 0543606..ae9c96d 100644
---- a/drivers/staging/imx-drm/imx-drm.h
-+++ b/drivers/staging/imx-drm/imx-drm.h
-@@ -39,18 +39,6 @@ int imx_drm_crtc_vblank_get(struct imx_drm_crtc *imx_drm_crtc);
- void imx_drm_crtc_vblank_put(struct imx_drm_crtc *imx_drm_crtc);
- void imx_drm_handle_vblank(struct imx_drm_crtc *imx_drm_crtc);
- 
--struct imx_drm_encoder;
--int imx_drm_add_encoder(struct drm_encoder *encoder,
--		struct imx_drm_encoder **new_enc,
--		struct module *owner);
--int imx_drm_remove_encoder(struct imx_drm_encoder *);
--
--struct imx_drm_connector;
--int imx_drm_add_connector(struct drm_connector *connector,
--		struct imx_drm_connector **new_con,
--		struct module *owner);
--int imx_drm_remove_connector(struct imx_drm_connector *);
--
- void imx_drm_mode_config_init(struct drm_device *drm);
- 
- struct drm_gem_cma_object *imx_drm_fb_get_obj(struct drm_framebuffer *fb);
-@@ -63,8 +51,6 @@ int imx_drm_panel_format(struct drm_encoder *encoder,
- struct device_node;
- 
- int imx_drm_encoder_get_mux_id(struct drm_encoder *encoder);
--int imx_drm_encoder_add_possible_crtcs(struct imx_drm_encoder *imx_drm_encoder,
--		struct device_node *np);
- int imx_drm_encoder_parse_of(struct drm_device *drm,
- 	struct drm_encoder *encoder, struct device_node *np);
- 
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0024-imx-drm-imx-drm-core-get-rid-of-drm_mode_group_init_.patch b/patches/imx_drm/0024-imx-drm-imx-drm-core-get-rid-of-drm_mode_group_init_.patch
deleted file mode 100644
index 9af3c38ad..000000000
--- a/patches/imx_drm/0024-imx-drm-imx-drm-core-get-rid-of-drm_mode_group_init_.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 06c6b82bf717f1851ca78d0346e915e879061c69 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Mon, 11 Nov 2013 16:20:25 +0000
-Subject: [PATCH 24/67] imx-drm: imx-drm-core: get rid of
- drm_mode_group_init_legacy_group()
-
-Since we're now operating like a conventional DRM driver, doing all
-the initialisation within the driver's ->load callback, we don't
-need to mess around with the mode groups - we can rely on the one
-in the DRM platform code.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/imx-drm-core.c | 6 ------
- 1 file changed, 6 deletions(-)
-
-diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c
-index b27c425..dd97412 100644
---- a/drivers/staging/imx-drm/imx-drm-core.c
-+++ b/drivers/staging/imx-drm/imx-drm-core.c
-@@ -274,12 +274,6 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
- 
- 	drm_kms_helper_poll_init(drm);
- 
--	/* setup the grouping for the legacy output */
--	ret = drm_mode_group_init_legacy_group(drm,
--			&drm->primary->mode_group);
--	if (ret)
--		goto err_kms;
--
- 	ret = drm_vblank_init(drm, MAX_CRTC);
- 	if (ret)
- 		goto err_kms;
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0025-imx-drm-imx-drm-core-kill-off-mutex.patch b/patches/imx_drm/0025-imx-drm-imx-drm-core-kill-off-mutex.patch
deleted file mode 100644
index f6a2994b8..000000000
--- a/patches/imx_drm/0025-imx-drm-imx-drm-core-kill-off-mutex.patch
+++ /dev/null
@@ -1,136 +0,0 @@
-From ccec7f621de02c1a5b3765f74b50d9ab6145658e Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Sun, 3 Nov 2013 15:20:18 +0000
-Subject: [PATCH 25/67] imx-drm: imx-drm-core: kill off mutex
-
-This mutex doesn't protect anything anymore; get rid of it.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/imx-drm-core.c | 26 +++-----------------------
- 1 file changed, 3 insertions(+), 23 deletions(-)
-
-diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c
-index dd97412..d5b82cb 100644
---- a/drivers/staging/imx-drm/imx-drm-core.c
-+++ b/drivers/staging/imx-drm/imx-drm-core.c
-@@ -40,14 +40,12 @@ struct imx_drm_device {
- 	struct drm_device			*drm;
- 	struct device				*dev;
- 	struct imx_drm_crtc			*crtc[MAX_CRTC];
--	struct mutex				mutex;
- 	int					pipes;
- 	struct drm_fbdev_cma			*fbhelper;
- };
- 
- struct imx_drm_crtc {
- 	struct drm_crtc				*crtc;
--	struct imx_drm_device			*imxdrm;
- 	int					pipe;
- 	struct imx_drm_crtc_helper_funcs	imx_drm_helper_funcs;
- 	struct crtc_cookie			cookie;
-@@ -270,8 +268,6 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
- 
- 	drm_mode_config_init(drm);
- 
--	mutex_lock(&imxdrm->mutex);
--
- 	drm_kms_helper_poll_init(drm);
- 
- 	ret = drm_vblank_init(drm, MAX_CRTC);
-@@ -287,12 +283,10 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
- 
- 	platform_set_drvdata(drm->platformdev, drm);
- 
--	mutex_unlock(&imxdrm->mutex);
--
- 	/* Now try and bind all our sub-components */
- 	ret = component_bind_all(drm->dev, drm);
- 	if (ret)
--		goto err_relock;
-+		goto err_vblank;
- 
- 	/*
- 	 * All components are now added, we can publish the connector sysfs
-@@ -332,13 +326,11 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
- 
- err_unbind:
- 	component_unbind_all(drm->dev, drm);
--err_relock:
--	mutex_lock(&imxdrm->mutex);
-+err_vblank:
- 	drm_vblank_cleanup(drm);
- err_kms:
- 	drm_kms_helper_poll_fini(drm);
- 	drm_mode_config_cleanup(drm);
--	mutex_unlock(&imxdrm->mutex);
- 
- 	return ret;
- }
-@@ -358,8 +350,6 @@ int imx_drm_add_crtc(struct drm_device *drm, struct drm_crtc *crtc,
- 	struct imx_drm_crtc *imx_drm_crtc;
- 	int ret;
- 
--	mutex_lock(&imxdrm->mutex);
--
- 	/*
- 	 * The vblank arrays are dimensioned by MAX_CRTC - we can't
- 	 * pass IDs greater than this to those functions.
-@@ -386,7 +376,6 @@ int imx_drm_add_crtc(struct drm_device *drm, struct drm_crtc *crtc,
- 	imx_drm_crtc->cookie.id = id;
- 	imx_drm_crtc->mux_id = imx_drm_crtc->pipe;
- 	imx_drm_crtc->crtc = crtc;
--	imx_drm_crtc->imxdrm = imxdrm;
- 
- 	imxdrm->crtc[imx_drm_crtc->pipe] = imx_drm_crtc;
- 
-@@ -402,8 +391,6 @@ int imx_drm_add_crtc(struct drm_device *drm, struct drm_crtc *crtc,
- 	drm_crtc_init(drm, crtc,
- 			imx_drm_crtc->imx_drm_helper_funcs.crtc_funcs);
- 
--	mutex_unlock(&imxdrm->mutex);
--
- 	return 0;
- 
- err_register:
-@@ -411,7 +398,6 @@ err_register:
- 	kfree(imx_drm_crtc);
- err_alloc:
- err_busy:
--	mutex_unlock(&imxdrm->mutex);
- 	return ret;
- }
- EXPORT_SYMBOL_GPL(imx_drm_add_crtc);
-@@ -421,16 +407,12 @@ EXPORT_SYMBOL_GPL(imx_drm_add_crtc);
-  */
- int imx_drm_remove_crtc(struct imx_drm_crtc *imx_drm_crtc)
- {
--	struct imx_drm_device *imxdrm = imx_drm_crtc->imxdrm;
--
--	mutex_lock(&imxdrm->mutex);
-+	struct imx_drm_device *imxdrm = imx_drm_crtc->crtc->dev->dev_private;
- 
- 	drm_crtc_cleanup(imx_drm_crtc->crtc);
- 
- 	imxdrm->crtc[imx_drm_crtc->pipe] = NULL;
- 
--	mutex_unlock(&imxdrm->mutex);
--
- 	kfree(imx_drm_crtc);
- 
- 	return 0;
-@@ -657,8 +639,6 @@ static int __init imx_drm_init(void)
- 	if (!imx_drm_device)
- 		return -ENOMEM;
- 
--	mutex_init(&imx_drm_device->mutex);
--
- 	ret = platform_driver_register(&imx_drm_pdrv);
- 	if (ret)
- 		goto err_pdrv;
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0026-imx-drm-imx-drm-core-move-allocation-of-imxdrm-devic.patch b/patches/imx_drm/0026-imx-drm-imx-drm-core-move-allocation-of-imxdrm-devic.patch
deleted file mode 100644
index bdbda98c0..000000000
--- a/patches/imx_drm/0026-imx-drm-imx-drm-core-move-allocation-of-imxdrm-devic.patch
+++ /dev/null
@@ -1,110 +0,0 @@
-From b85f2b5d879597708808ece7e5ebbfd6823e3f69 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Sun, 3 Nov 2013 15:31:22 +0000
-Subject: [PATCH 26/67] imx-drm: imx-drm-core: move allocation of imxdrm device
- to driver load function
-
-It is now no longer necessary to keep this structure around; we can
-allocate it upon DRM driver load and destroy it thereafter without
-affecting the other components now.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/imx-drm-core.c | 47 +++++-----------------------------
- 1 file changed, 6 insertions(+), 41 deletions(-)
-
-diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c
-index d5b82cb..35c8f7c 100644
---- a/drivers/staging/imx-drm/imx-drm-core.c
-+++ b/drivers/staging/imx-drm/imx-drm-core.c
-@@ -38,7 +38,6 @@ struct imx_drm_crtc;
- 
- struct imx_drm_device {
- 	struct drm_device			*drm;
--	struct device				*dev;
- 	struct imx_drm_crtc			*crtc[MAX_CRTC];
- 	int					pipes;
- 	struct drm_fbdev_cma			*fbhelper;
-@@ -206,13 +205,6 @@ int imx_drm_connector_mode_valid(struct drm_connector *connector,
- }
- EXPORT_SYMBOL(imx_drm_connector_mode_valid);
- 
--static struct imx_drm_device *imx_drm_device;
--
--static struct imx_drm_device *__imx_drm_device(void)
--{
--	return imx_drm_device;
--}
--
- void imx_drm_connector_destroy(struct drm_connector *connector)
- {
- 	drm_sysfs_connector_remove(connector);
-@@ -236,10 +228,14 @@ static struct drm_mode_config_funcs imx_drm_mode_config_funcs = {
-  */
- static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
- {
--	struct imx_drm_device *imxdrm = __imx_drm_device();
-+	struct imx_drm_device *imxdrm;
- 	struct drm_connector *connector;
- 	int ret;
- 
-+	imxdrm = devm_kzalloc(drm->dev, sizeof(*imxdrm), GFP_KERNEL);
-+	if (!imxdrm)
-+		return -ENOMEM;
-+
- 	imxdrm->drm = drm;
- 
- 	drm->dev_private = imxdrm;
-@@ -604,8 +600,6 @@ static int imx_drm_platform_probe(struct platform_device *pdev)
- 	if (ret)
- 		return ret;
- 
--	imx_drm_device->dev = &pdev->dev;
--
- 	return component_master_add(&pdev->dev, &imx_drm_ops);
- }
- 
-@@ -630,36 +624,7 @@ static struct platform_driver imx_drm_pdrv = {
- 		.of_match_table = imx_drm_dt_ids,
- 	},
- };
--
--static int __init imx_drm_init(void)
--{
--	int ret;
--
--	imx_drm_device = kzalloc(sizeof(*imx_drm_device), GFP_KERNEL);
--	if (!imx_drm_device)
--		return -ENOMEM;
--
--	ret = platform_driver_register(&imx_drm_pdrv);
--	if (ret)
--		goto err_pdrv;
--
--	return 0;
--
--err_pdrv:
--	kfree(imx_drm_device);
--
--	return ret;
--}
--
--static void __exit imx_drm_exit(void)
--{
--	platform_driver_unregister(&imx_drm_pdrv);
--
--	kfree(imx_drm_device);
--}
--
--module_init(imx_drm_init);
--module_exit(imx_drm_exit);
-+module_platform_driver(imx_drm_pdrv);
- 
- MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>");
- MODULE_DESCRIPTION("i.MX drm driver core");
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0027-imx-drm-imx-drm-core-various-cleanups.patch b/patches/imx_drm/0027-imx-drm-imx-drm-core-various-cleanups.patch
deleted file mode 100644
index 632054a9e..000000000
--- a/patches/imx_drm/0027-imx-drm-imx-drm-core-various-cleanups.patch
+++ /dev/null
@@ -1,160 +0,0 @@
-From e7d6231e67b92b6a45921a57cca5cafcc47c7746 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Sun, 3 Nov 2013 15:38:09 +0000
-Subject: [PATCH 27/67] imx-drm: imx-drm-core: various cleanups
-
-Various cleanups are possible after the previous round of changes; these
-have no real functional bearing other than tidying up the code.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/imx-drm-core.c | 47 ++++++++++++----------------------
- drivers/staging/imx-drm/imx-drm.h      |  5 ++--
- 2 files changed, 19 insertions(+), 33 deletions(-)
-
-diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c
-index 35c8f7c..7939cea 100644
---- a/drivers/staging/imx-drm/imx-drm-core.c
-+++ b/drivers/staging/imx-drm/imx-drm-core.c
-@@ -15,12 +15,12 @@
-  */
- #include <linux/component.h>
- #include <linux/device.h>
-+#include <linux/fb.h>
-+#include <linux/module.h>
- #include <linux/platform_device.h>
- #include <drm/drmP.h>
- #include <drm/drm_fb_helper.h>
- #include <drm/drm_crtc_helper.h>
--#include <linux/fb.h>
--#include <linux/module.h>
- #include <drm/drm_gem_cma_helper.h>
- #include <drm/drm_fb_cma_helper.h>
- 
-@@ -28,12 +28,6 @@
- 
- #define MAX_CRTC	4
- 
--struct crtc_cookie {
--	void *cookie;
--	int id;
--	struct list_head list;
--};
--
- struct imx_drm_crtc;
- 
- struct imx_drm_device {
-@@ -47,7 +41,8 @@ struct imx_drm_crtc {
- 	struct drm_crtc				*crtc;
- 	int					pipe;
- 	struct imx_drm_crtc_helper_funcs	imx_drm_helper_funcs;
--	struct crtc_cookie			cookie;
-+	void					*cookie;
-+	int					id;
- 	int					mux_id;
- };
- 
-@@ -271,9 +266,9 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
- 		goto err_kms;
- 
- 	/*
--	 * with vblank_disable_allowed = true, vblank interrupt will be disabled
--	 * by drm timer once a current process gives up ownership of
--	 * vblank event.(after drm_vblank_put function is called)
-+	 * with vblank_disable_allowed = true, vblank interrupt will be
-+	 * disabled by drm timer once a current process gives up ownership
-+	 * of vblank event. (after drm_vblank_put function is called)
- 	 */
- 	drm->vblank_disable_allowed = true;
- 
-@@ -350,26 +345,20 @@ int imx_drm_add_crtc(struct drm_device *drm, struct drm_crtc *crtc,
- 	 * The vblank arrays are dimensioned by MAX_CRTC - we can't
- 	 * pass IDs greater than this to those functions.
- 	 */
--	if (imxdrm->pipes >= MAX_CRTC) {
--		ret = -EINVAL;
--		goto err_busy;
--	}
-+	if (imxdrm->pipes >= MAX_CRTC)
-+		return -EINVAL;
- 
--	if (imxdrm->drm->open_count) {
--		ret = -EBUSY;
--		goto err_busy;
--	}
-+	if (imxdrm->drm->open_count)
-+		return -EBUSY;
- 
- 	imx_drm_crtc = kzalloc(sizeof(*imx_drm_crtc), GFP_KERNEL);
--	if (!imx_drm_crtc) {
--		ret = -ENOMEM;
--		goto err_alloc;
--	}
-+	if (!imx_drm_crtc)
-+		return -ENOMEM;
- 
- 	imx_drm_crtc->imx_drm_helper_funcs = *imx_drm_helper_funcs;
- 	imx_drm_crtc->pipe = imxdrm->pipes++;
--	imx_drm_crtc->cookie.cookie = cookie;
--	imx_drm_crtc->cookie.id = id;
-+	imx_drm_crtc->cookie = cookie;
-+	imx_drm_crtc->id = id;
- 	imx_drm_crtc->mux_id = imx_drm_crtc->pipe;
- 	imx_drm_crtc->crtc = crtc;
- 
-@@ -392,8 +381,6 @@ int imx_drm_add_crtc(struct drm_device *drm, struct drm_crtc *crtc,
- err_register:
- 	imxdrm->crtc[imx_drm_crtc->pipe] = NULL;
- 	kfree(imx_drm_crtc);
--err_alloc:
--err_busy:
- 	return ret;
- }
- EXPORT_SYMBOL_GPL(imx_drm_add_crtc);
-@@ -429,8 +416,8 @@ static uint32_t imx_drm_find_crtc_mask(struct imx_drm_device *imxdrm,
- 
- 	for (i = 0; i < MAX_CRTC; i++) {
- 		struct imx_drm_crtc *imx_drm_crtc = imxdrm->crtc[i];
--		if (imx_drm_crtc && imx_drm_crtc->cookie.id == id &&
--		    imx_drm_crtc->cookie.cookie == cookie)
-+		if (imx_drm_crtc && imx_drm_crtc->id == id &&
-+		    imx_drm_crtc->cookie == cookie)
- 			return drm_crtc_mask(imx_drm_crtc->crtc);
- 	}
- 
-diff --git a/drivers/staging/imx-drm/imx-drm.h b/drivers/staging/imx-drm/imx-drm.h
-index ae9c96d..aa21028 100644
---- a/drivers/staging/imx-drm/imx-drm.h
-+++ b/drivers/staging/imx-drm/imx-drm.h
-@@ -5,14 +5,15 @@
- 
- #define IPU_PIX_FMT_GBR24	v4l2_fourcc('G', 'B', 'R', '3')
- 
-+struct device_node;
- struct drm_crtc;
- struct drm_connector;
- struct drm_device;
- struct drm_display_mode;
- struct drm_encoder;
--struct imx_drm_crtc;
- struct drm_fbdev_cma;
- struct drm_framebuffer;
-+struct imx_drm_crtc;
- struct platform_device;
- 
- int imx_drm_crtc_id(struct imx_drm_crtc *crtc);
-@@ -48,8 +49,6 @@ int imx_drm_panel_format_pins(struct drm_encoder *encoder,
- int imx_drm_panel_format(struct drm_encoder *encoder,
- 		u32 interface_pix_fmt);
- 
--struct device_node;
--
- int imx_drm_encoder_get_mux_id(struct drm_encoder *encoder);
- int imx_drm_encoder_parse_of(struct drm_device *drm,
- 	struct drm_encoder *encoder, struct device_node *np);
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0028-imx-drm-imx-drm-core-add-core-hotplug-connector-supp.patch b/patches/imx_drm/0028-imx-drm-imx-drm-core-add-core-hotplug-connector-supp.patch
deleted file mode 100644
index b03200df7..000000000
--- a/patches/imx_drm/0028-imx-drm-imx-drm-core-add-core-hotplug-connector-supp.patch
+++ /dev/null
@@ -1,91 +0,0 @@
-From 3e68439bf0adc7b11e479d27919b93453d7f9307 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Sun, 3 Nov 2013 22:18:40 +0000
-Subject: [PATCH 28/67] imx-drm: imx-drm-core: add core hotplug connector
- support
-
-Add core imx-drm support for hotplug connector support.  We need to
-setup the poll helper after we've setup the connectors; the helper
-scans the connectors to determine their capabilities.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/imx-drm-core.c | 21 +++++++++++++++++----
- 1 file changed, 17 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c
-index 7939cea..dcba518 100644
---- a/drivers/staging/imx-drm/imx-drm-core.c
-+++ b/drivers/staging/imx-drm/imx-drm-core.c
-@@ -69,7 +69,11 @@ static int imx_drm_driver_unload(struct drm_device *drm)
- {
- #if IS_ENABLED(CONFIG_DRM_IMX_FB_HELPER)
- 	struct imx_drm_device *imxdrm = drm->dev_private;
-+#endif
-+
-+	drm_kms_helper_poll_fini(drm);
- 
-+#if IS_ENABLED(CONFIG_DRM_IMX_FB_HELPER)
- 	if (imxdrm->fbhelper)
- 		drm_fbdev_cma_fini(imxdrm->fbhelper);
- #endif
-@@ -77,7 +81,6 @@ static int imx_drm_driver_unload(struct drm_device *drm)
- 	component_unbind_all(drm->dev, drm);
- 
- 	drm_vblank_cleanup(drm);
--	drm_kms_helper_poll_fini(drm);
- 	drm_mode_config_cleanup(drm);
- 
- 	return 0;
-@@ -213,8 +216,18 @@ void imx_drm_encoder_destroy(struct drm_encoder *encoder)
- }
- EXPORT_SYMBOL_GPL(imx_drm_encoder_destroy);
- 
-+static void imx_drm_output_poll_changed(struct drm_device *drm)
-+{
-+#if IS_ENABLED(CONFIG_DRM_IMX_FB_HELPER)
-+	struct imx_drm_device *imxdrm = drm->dev_private;
-+
-+	drm_fbdev_cma_hotplug_event(imxdrm->fbhelper);
-+#endif
-+}
-+
- static struct drm_mode_config_funcs imx_drm_mode_config_funcs = {
- 	.fb_create = drm_fb_cma_create,
-+	.output_poll_changed = imx_drm_output_poll_changed,
- };
- 
- /*
-@@ -259,8 +272,6 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
- 
- 	drm_mode_config_init(drm);
- 
--	drm_kms_helper_poll_init(drm);
--
- 	ret = drm_vblank_init(drm, MAX_CRTC);
- 	if (ret)
- 		goto err_kms;
-@@ -313,6 +324,9 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
- 		goto err_unbind;
- 	}
- #endif
-+
-+	drm_kms_helper_poll_init(drm);
-+
- 	return 0;
- 
- err_unbind:
-@@ -320,7 +334,6 @@ err_unbind:
- err_vblank:
- 	drm_vblank_cleanup(drm);
- err_kms:
--	drm_kms_helper_poll_fini(drm);
- 	drm_mode_config_cleanup(drm);
- 
- 	return ret;
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm/0029-imx-drm-imx-hdmi-add-hotplug-support-to-HDMI-compone.patch b/patches/imx_drm/0029-imx-drm-imx-hdmi-add-hotplug-support-to-HDMI-compone.patch
deleted file mode 100644
index 5a6498862..000000000
--- a/patches/imx_drm/0029-imx-drm-imx-hdmi-add-hotplug-support-to-HDMI-compone.patch
+++ /dev/null
@@ -1,151 +0,0 @@
-From d94905e019acce960feeda1f92a9427fbe45ebbe Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@arm.linux.org.uk>
-Date: Sun, 3 Nov 2013 22:23:24 +0000
-Subject: [PATCH 29/67] imx-drm: imx-hdmi: add hotplug support to HDMI
- component
-
-Add hotplug support.  We have to make the interrupt handler threaded so
-we can call drm_helper_hpd_irq_event().  Keeping in mind that we will
-want to share the interrupt with other HDMI interface drivers (eg, audio
-and CEC) put the groundwork in now for that, rather than just using
-IRQF_ONESHOT.
-
-Also, we must not call drm_helper_hpd_irq_event() until we have fully
-setup the connector; keep the interrupt(s) muted until after that point.
-
-Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
-Acked-by: Shawn Guo <shawn.guo@linaro.org>
-Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
-Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
----
- drivers/staging/imx-drm/imx-hdmi.c | 40 +++++++++++++++++++++++++++++++-------
- 1 file changed, 33 insertions(+), 7 deletions(-)
-
-diff --git a/drivers/staging/imx-drm/imx-hdmi.c b/drivers/staging/imx-drm/imx-hdmi.c
-index 8c58645..ab16aba 100644
---- a/drivers/staging/imx-drm/imx-hdmi.c
-+++ b/drivers/staging/imx-drm/imx-hdmi.c
-@@ -120,6 +120,8 @@ struct imx_hdmi {
- 	struct clk *isfr_clk;
- 	struct clk *iahb_clk;
- 
-+	enum drm_connector_status connector_status;
-+
- 	struct hdmi_data_info hdmi_data;
- 	int vic;
- 
-@@ -1301,9 +1303,6 @@ static int imx_hdmi_fb_registered(struct imx_hdmi *hdmi)
- 	/* Clear Hotplug interrupts */
- 	hdmi_writeb(hdmi, HDMI_IH_PHY_STAT0_HPD, HDMI_IH_PHY_STAT0);
- 
--	/* Unmute interrupts */
--	hdmi_writeb(hdmi, ~HDMI_IH_PHY_STAT0_HPD, HDMI_IH_MUTE_PHY_STAT0);
--
- 	return 0;
- }
- 
-@@ -1372,8 +1371,9 @@ static void imx_hdmi_poweroff(struct imx_hdmi *hdmi)
- static enum drm_connector_status imx_hdmi_connector_detect(struct drm_connector
- 							*connector, bool force)
- {
--	/* FIXME */
--	return connector_status_connected;
-+	struct imx_hdmi *hdmi = container_of(connector, struct imx_hdmi,
-+					     connector);
-+	return hdmi->connector_status;
- }
- 
- static int imx_hdmi_connector_get_modes(struct drm_connector *connector)
-@@ -1487,6 +1487,18 @@ static struct drm_connector_helper_funcs imx_hdmi_connector_helper_funcs = {
- 	.best_encoder = imx_hdmi_connector_best_encoder,
- };
- 
-+static irqreturn_t imx_hdmi_hardirq(int irq, void *dev_id)
-+{
-+	struct imx_hdmi *hdmi = dev_id;
-+	u8 intr_stat;
-+
-+	intr_stat = hdmi_readb(hdmi, HDMI_IH_PHY_STAT0);
-+	if (intr_stat)
-+		hdmi_writeb(hdmi, ~0, HDMI_IH_MUTE_PHY_STAT0);
-+
-+	return intr_stat ? IRQ_WAKE_THREAD : IRQ_NONE;
-+}
-+
- static irqreturn_t imx_hdmi_irq(int irq, void *dev_id)
- {
- 	struct imx_hdmi *hdmi = dev_id;
-@@ -1503,17 +1515,21 @@ static irqreturn_t imx_hdmi_irq(int irq, void *dev_id)
- 
- 			hdmi_modb(hdmi, 0, HDMI_PHY_HPD, HDMI_PHY_POL0);
- 
-+			hdmi->connector_status = connector_status_connected;
- 			imx_hdmi_poweron(hdmi);
- 		} else {
- 			dev_dbg(hdmi->dev, "EVENT=plugout\n");
- 
- 			hdmi_modb(hdmi, HDMI_PHY_HPD, HDMI_PHY_HPD, HDMI_PHY_POL0);
- 
-+			hdmi->connector_status = connector_status_disconnected;
- 			imx_hdmi_poweroff(hdmi);
- 		}
-+		drm_helper_hpd_irq_event(hdmi->connector.dev);
- 	}
- 
- 	hdmi_writeb(hdmi, intr_stat, HDMI_IH_PHY_STAT0);
-+	hdmi_writeb(hdmi, ~HDMI_IH_PHY_STAT0_HPD, HDMI_IH_MUTE_PHY_STAT0);
- 
- 	return IRQ_HANDLED;
- }
-@@ -1527,6 +1543,8 @@ static int imx_hdmi_register(struct drm_device *drm, struct imx_hdmi *hdmi)
- 	if (ret)
- 		return ret;
- 
-+	hdmi->connector.polled = DRM_CONNECTOR_POLL_HPD;
-+
- 	drm_encoder_helper_add(&hdmi->encoder, &imx_hdmi_encoder_helper_funcs);
- 	drm_encoder_init(drm, &hdmi->encoder, &imx_hdmi_encoder_funcs,
- 			 DRM_MODE_ENCODER_TMDS);
-@@ -1578,6 +1596,7 @@ static int imx_hdmi_bind(struct device *dev, struct device *master, void *data)
- 		return -ENOMEM;
- 
- 	hdmi->dev = dev;
-+	hdmi->connector_status = connector_status_disconnected;
- 	hdmi->sample_rate = 48000;
- 	hdmi->ratio = 100;
- 
-@@ -1601,8 +1620,9 @@ static int imx_hdmi_bind(struct device *dev, struct device *master, void *data)
- 	if (irq < 0)
- 		return -EINVAL;
- 
--	ret = devm_request_irq(dev, irq, imx_hdmi_irq, 0,
--			       dev_name(dev), hdmi);
-+	ret = devm_request_threaded_irq(dev, irq, imx_hdmi_hardirq,
-+					imx_hdmi_irq, IRQF_SHARED,
-+					dev_name(dev), hdmi);
- 	if (ret)
- 		return ret;
- 
-@@ -1678,6 +1698,9 @@ static int imx_hdmi_bind(struct device *dev, struct device *master, void *data)
- 	if (ret)
- 		goto err_iahb;
- 
-+	/* Unmute interrupts */
-+	hdmi_writeb(hdmi, ~HDMI_IH_PHY_STAT0_HPD, HDMI_IH_MUTE_PHY_STAT0);
-+
- 	dev_set_drvdata(dev, hdmi);
- 
- 	return 0;
-@@ -1695,6 +1718,9 @@ static void imx_hdmi_unbind(struct device *dev, struct device *master,
- {
- 	struct imx_hdmi *hdmi = dev_get_drvdata(dev);
- 
-+	/* Disable all interrupts */
-+	hdmi_writeb(hdmi, ~0, HDMI_IH_MUTE_PHY_STAT0);
-+
- 	hdmi->connector.funcs->destroy(&hdmi->connector);
- 	hdmi->encoder.funcs->destroy(&hdmi->encoder);
- 
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm_dts/0001-ARM-dts-imx6qdl-sabresd-Add-HDMI-support.patch b/patches/imx_drm_dts/0001-ARM-dts-imx6qdl-sabresd-Add-HDMI-support.patch
deleted file mode 100644
index f83bd0f58..000000000
--- a/patches/imx_drm_dts/0001-ARM-dts-imx6qdl-sabresd-Add-HDMI-support.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From ce8323b5b6d8c73126ae83ab4acc198534ec7e7a Mon Sep 17 00:00:00 2001
-From: Fabio Estevam <fabio.estevam@freescale.com>
-Date: Tue, 25 Feb 2014 15:22:11 -0300
-Subject: [PATCH 1/2] ARM: dts: imx6qdl-sabresd: Add HDMI support
-
-Add device tree support for HDMI.
-
-Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
----
- arch/arm/boot/dts/imx6qdl-sabresd.dtsi | 17 ++++++++++++++++-
- 1 file changed, 16 insertions(+), 1 deletion(-)
-
-diff --git a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
-index 04487cb..bdcd4c3 100644
---- a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
-+++ b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
-@@ -82,7 +82,7 @@
- 	imx_drm: imx-drm {
- 		compatible = "fsl,imx-drm";
- 		crtcs = <&ipu1 0>, <&ipu1 1>;
--		connectors = <&ldb>;
-+		connectors = <&ldb>, <&hdmi>;
- 	};
- 
- 	sound {
-@@ -143,6 +143,14 @@
- 	status = "okay";
- };
- 
-+&hdmi {
-+	pinctrl-names = "default";
-+	pinctrl-0 = <&pinctrl_sabresd_hdmi>;
-+	ddc = <&i2c2>;
-+	status = "okay";
-+	crtcs = <&ipu1 1>;
-+};
-+
- &i2c1 {
- 	clock-frequency = <100000>;
- 	pinctrl-names = "default";
-@@ -385,6 +393,13 @@
- 			>;
- 		};
- 
-+
-+		pinctrl_sabresd_hdmi: sabresd-hdmi {
-+			fsl,pins = <
-+				MX6QDL_PAD_KEY_ROW2__HDMI_TX_CEC_LINE 0x1f8b0
-+			>;
-+		};
-+
- 		pinctrl_uart1: uart1grp {
- 			fsl,pins = <
- 				MX6QDL_PAD_CSI0_DAT10__UART1_TX_DATA	0x1b0b1
--- 
-1.8.5.3
-
diff --git a/patches/imx_drm_dts/0002-arm-dts-wandboard-enable-hdmi-quad-has-to-force-edid.patch b/patches/imx_drm_dts/0002-arm-dts-wandboard-enable-hdmi-quad-has-to-force-edid.patch
deleted file mode 100644
index 7955da964..000000000
--- a/patches/imx_drm_dts/0002-arm-dts-wandboard-enable-hdmi-quad-has-to-force-edid.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From 0d4a785a330509d9c267f2ca178c7fe6e5acf70a Mon Sep 17 00:00:00 2001
-From: Robert Nelson <robertcnelson@gmail.com>
-Date: Wed, 26 Feb 2014 10:53:13 -0600
-Subject: [PATCH 2/2] arm: dts: wandboard: enable hdmi (quad has to force edid)
-
-Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
----
- arch/arm/boot/dts/imx6qdl-wandboard.dtsi | 7 +++++++
- 1 file changed, 7 insertions(+)
-
-diff --git a/arch/arm/boot/dts/imx6qdl-wandboard.dtsi b/arch/arm/boot/dts/imx6qdl-wandboard.dtsi
-index c0c6960..900870a 100644
---- a/arch/arm/boot/dts/imx6qdl-wandboard.dtsi
-+++ b/arch/arm/boot/dts/imx6qdl-wandboard.dtsi
-@@ -34,6 +34,12 @@
- 		};
- 	};
- 
-+	imx_drm: imx-drm {
-+		compatible = "fsl,imx-drm";
-+		crtcs = <&ipu1 0>, <&ipu1 1>;
-+		connectors = <&hdmi>;
-+	};
-+
- 	sound {
- 		compatible = "fsl,imx6-wandboard-sgtl5000",
- 			     "fsl,imx-audio-sgtl5000";
-@@ -81,6 +87,7 @@
- &hdmi {
- 	ddc = <&i2c1>;
- 	status = "okay";
-+	crtcs = <&ipu1 1>;
- };
- 
- &i2c1 {
--- 
-1.8.5.3
-
-- 
GitLab