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 = <®_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