From 229b4a4437da2ea83d68f4ebd1d81a10c2a7e616 Mon Sep 17 00:00:00 2001
From: Waldemar Brodkorb <wbx@openadk.org>
Date: Tue, 8 Jul 2014 12:29:18 +0200
Subject: remove rmk.patch, need refresh later

---
 target/arm/cubox-i/patches/3.15.4/rmk.patch | 6640 ---------------------------
 target/linux/config/Config.in.audio         |    8 +-
 target/linux/config/Config.in.graphics      |    4 +-
 3 files changed, 6 insertions(+), 6646 deletions(-)
 delete mode 100644 target/arm/cubox-i/patches/3.15.4/rmk.patch

(limited to 'target')

diff --git a/target/arm/cubox-i/patches/3.15.4/rmk.patch b/target/arm/cubox-i/patches/3.15.4/rmk.patch
deleted file mode 100644
index 7ccbf3b4a..000000000
--- a/target/arm/cubox-i/patches/3.15.4/rmk.patch
+++ /dev/null
@@ -1,6640 +0,0 @@
- .../DocBook/media/v4l/pixfmt-packed-rgb.xml        |  39 ++
- .../devicetree/bindings/leds/leds-pwm.txt          |   2 +
- Documentation/devicetree/bindings/mmc/mmc.txt      |  11 +
- .../bindings/staging/imx-drm/fsl-imx-drm.txt       |   3 +-
- arch/arm/boot/dts/imx6dl-hummingboard.dts          |  27 +
- arch/arm/boot/dts/imx6q-cubox-i.dts                |   4 +
- arch/arm/boot/dts/imx6qdl-cubox-i.dtsi             |  78 ++-
- arch/arm/boot/dts/imx6qdl-microsom.dtsi            |  98 +++
- arch/arm/configs/imx_v6_v7_defconfig               |   1 +
- arch/arm/mach-imx/clk-imx6q.c                      |  12 +
- arch/arm/mach-imx/clk-pllv3.c                      |  27 +-
- drivers/Kconfig                                    |   2 +
- drivers/Makefile                                   |   1 +
- drivers/ata/ahci_imx.c                             | 184 +++++-
- drivers/cec/Kconfig                                |  14 +
- drivers/cec/Makefile                               |   1 +
- drivers/cec/cec-dev.c                              | 384 +++++++++++
- drivers/gpu/drm/drm_crtc_helper.c                  |   6 -
- drivers/leds/leds-pwm.c                            | 144 ++--
- drivers/mmc/core/core.c                            |  42 ++
- drivers/mmc/core/host.c                            |  68 ++
- drivers/mmc/core/sdio_irq.c                        |  41 +-
- drivers/mmc/host/Kconfig                           |  63 +-
- drivers/mmc/host/dw_mmc.c                          |   2 +
- drivers/mmc/host/sdhci-acpi.c                      |   8 +
- drivers/mmc/host/sdhci-bcm-kona.c                  |   4 +
- drivers/mmc/host/sdhci-bcm2835.c                   |   4 +
- drivers/mmc/host/sdhci-cns3xxx.c                   |  13 +-
- drivers/mmc/host/sdhci-dove.c                      |   4 +
- drivers/mmc/host/sdhci-esdhc-imx.c                 |  82 +--
- drivers/mmc/host/sdhci-esdhc.h                     |   4 +-
- drivers/mmc/host/sdhci-of-arasan.c                 |   4 +
- drivers/mmc/host/sdhci-of-esdhc.c                  |  70 +-
- drivers/mmc/host/sdhci-of-hlwd.c                   |   4 +
- drivers/mmc/host/sdhci-pci.c                       |   9 +-
- drivers/mmc/host/sdhci-pltfm.c                     |   4 +
- drivers/mmc/host/sdhci-pxav2.c                     |  14 +-
- drivers/mmc/host/sdhci-pxav3.c                     |  13 +-
- drivers/mmc/host/sdhci-s3c.c                       |  36 +-
- drivers/mmc/host/sdhci-sirf.c                      |   4 +
- drivers/mmc/host/sdhci-spear.c                     |   5 +-
- drivers/mmc/host/sdhci-tegra.c                     |  27 +-
- drivers/mmc/host/sdhci.c                           | 722 ++++++++++-----------
- drivers/mmc/host/sdhci.h                           |  20 +-
- drivers/regulator/anatop-regulator.c               |   1 +
- drivers/regulator/core.c                           |   2 +-
- drivers/regulator/dummy.c                          |   1 +
- drivers/regulator/fixed.c                          |   4 +-
- drivers/staging/imx-drm/Kconfig                    |  18 +
- drivers/staging/imx-drm/Makefile                   |   3 +
- drivers/staging/imx-drm/drm-ddc-connector.c        |  92 +++
- drivers/staging/imx-drm/drm-ddc-connector.h        |  26 +
- drivers/staging/imx-drm/dw-hdmi-audio.c            | 652 +++++++++++++++++++
- drivers/staging/imx-drm/dw-hdmi-audio.h            |  15 +
- drivers/staging/imx-drm/dw-hdmi-cec.c              | 205 ++++++
- drivers/staging/imx-drm/dw-hdmi-cec.h              |  16 +
- drivers/staging/imx-drm/imx-hdmi.c                 | 178 ++---
- drivers/staging/imx-drm/imx-ldb.c                  |  21 +
- drivers/staging/imx-drm/imx-tve.c                  |  63 +-
- drivers/staging/imx-drm/ipu-v3/imx-ipu-v3.h        |   5 +
- drivers/staging/imx-drm/ipu-v3/ipu-common.c        |  41 +-
- drivers/staging/imx-drm/ipu-v3/ipu-dc.c            |  94 ++-
- drivers/staging/imx-drm/ipu-v3/ipu-di.c            |   2 +-
- drivers/staging/imx-drm/ipu-v3/ipu-dmfc.c          |  25 +-
- drivers/staging/imx-drm/ipu-v3/ipu-dp.c            |  71 +-
- drivers/staging/imx-drm/ipu-v3/ipu-prv.h           |   3 +
- drivers/staging/imx-drm/ipuv3-crtc.c               |  16 +-
- drivers/staging/imx-drm/ipuv3-plane.c              |   4 +
- drivers/staging/imx-drm/parallel-display.c         |   2 +
- include/linux/cec-dev.h                            |  69 ++
- include/linux/mmc/host.h                           |   8 +
- include/linux/mmc/sdhci.h                          |  15 +-
- include/uapi/linux/cec-dev.h                       |  34 +
- include/uapi/linux/videodev2.h                     |   1 +
- sound/soc/fsl/imx-pcm-dma.c                        |   2 +-
- 75 files changed, 3162 insertions(+), 832 deletions(-)
-
-diff --git a/Documentation/DocBook/media/v4l/pixfmt-packed-rgb.xml b/Documentation/DocBook/media/v4l/pixfmt-packed-rgb.xml
-index e1c4f8b4c0b3..88a7fe1ecaf1 100644
---- a/Documentation/DocBook/media/v4l/pixfmt-packed-rgb.xml
-+++ b/Documentation/DocBook/media/v4l/pixfmt-packed-rgb.xml
-@@ -279,6 +279,45 @@ colorspace <constant>V4L2_COLORSPACE_SRGB</constant>.</para>
- 	    <entry></entry>
- 	    <entry></entry>
- 	  </row>
-+	  <row id="V4L2-PIX-FMT-RGB666">
-+	    <entry><constant>V4L2_PIX_FMT_RGB666</constant></entry>
-+	    <entry>'RGBH'</entry>
-+	    <entry></entry>
-+	    <entry>r<subscript>5</subscript></entry>
-+	    <entry>r<subscript>4</subscript></entry>
-+	    <entry>r<subscript>3</subscript></entry>
-+	    <entry>r<subscript>2</subscript></entry>
-+	    <entry>r<subscript>1</subscript></entry>
-+	    <entry>r<subscript>0</subscript></entry>
-+	    <entry>g<subscript>5</subscript></entry>
-+	    <entry>g<subscript>4</subscript></entry>
-+	    <entry></entry>
-+	    <entry>g<subscript>3</subscript></entry>
-+	    <entry>g<subscript>2</subscript></entry>
-+	    <entry>g<subscript>1</subscript></entry>
-+	    <entry>g<subscript>0</subscript></entry>
-+	    <entry>b<subscript>5</subscript></entry>
-+	    <entry>b<subscript>4</subscript></entry>
-+	    <entry>b<subscript>3</subscript></entry>
-+	    <entry>b<subscript>2</subscript></entry>
-+	    <entry></entry>
-+	    <entry>b<subscript>1</subscript></entry>
-+	    <entry>b<subscript>0</subscript></entry>
-+	    <entry></entry>
-+	    <entry></entry>
-+	    <entry></entry>
-+	    <entry></entry>
-+	    <entry></entry>
-+	    <entry></entry>
-+	    <entry></entry>
-+	    <entry></entry>
-+	    <entry></entry>
-+	    <entry></entry>
-+	    <entry></entry>
-+	    <entry></entry>
-+	    <entry></entry>
-+	    <entry></entry>
-+	  </row>
- 	  <row id="V4L2-PIX-FMT-BGR24">
- 	    <entry><constant>V4L2_PIX_FMT_BGR24</constant></entry>
- 	    <entry>'BGR3'</entry>
-diff --git a/Documentation/devicetree/bindings/leds/leds-pwm.txt b/Documentation/devicetree/bindings/leds/leds-pwm.txt
-index 7297107cf832..6c6583c35f2f 100644
---- a/Documentation/devicetree/bindings/leds/leds-pwm.txt
-+++ b/Documentation/devicetree/bindings/leds/leds-pwm.txt
-@@ -13,6 +13,8 @@ node's name represents the name of the corresponding LED.
-   For the pwms and pwm-names property please refer to:
-   Documentation/devicetree/bindings/pwm/pwm.txt
- - max-brightness : Maximum brightness possible for the LED
-+- active-low : (optional) For PWMs where the LED is wired to supply
-+  rather than ground.
- - label :  (optional)
-   see Documentation/devicetree/bindings/leds/common.txt
- - linux,default-trigger :  (optional)
-diff --git a/Documentation/devicetree/bindings/mmc/mmc.txt b/Documentation/devicetree/bindings/mmc/mmc.txt
-index 9dce540771fb..b9b534ebc0c5 100644
---- a/Documentation/devicetree/bindings/mmc/mmc.txt
-+++ b/Documentation/devicetree/bindings/mmc/mmc.txt
-@@ -5,6 +5,8 @@ these definitions.
- Interpreted by the OF core:
- - reg: Registers location and length.
- - interrupts: Interrupts used by the MMC controller.
-+- clocks: Clocks needed for the host controller, if any.
-+- clock-names: Goes with clocks above.
- 
- Card detection:
- If no property below is supplied, host native card detect is used.
-@@ -39,6 +41,15 @@ If no property below is supplied, host native card detect is used.
- - mmc-hs200-1_8v: eMMC HS200 mode(1.8V I/O) is supported
- - mmc-hs200-1_2v: eMMC HS200 mode(1.2V I/O) is supported
- 
-+Card power and reset control:
-+The following properties can be specified for cases where the MMC
-+peripheral needs additional reset, regulator and clock lines. It is for
-+example common for WiFi/BT adapters to have these separate from the main
-+MMC bus:
-+  - card-reset-gpios: Specify GPIOs for card reset (reset active low)
-+  - card-external-vcc-supply: Regulator to drive (independent) card VCC
-+  - clock with name "card_ext_clock": External clock provided to the card
-+
- *NOTE* on CD and WP polarity. To use common for all SD/MMC host controllers line
- polarity properties, we have to fix the meaning of the "normal" and "inverted"
- line levels. We choose to follow the SDHCI standard, which specifies both those
-diff --git a/Documentation/devicetree/bindings/staging/imx-drm/fsl-imx-drm.txt b/Documentation/devicetree/bindings/staging/imx-drm/fsl-imx-drm.txt
-index 3be5ce7a9654..83137ef5a1ba 100644
---- a/Documentation/devicetree/bindings/staging/imx-drm/fsl-imx-drm.txt
-+++ b/Documentation/devicetree/bindings/staging/imx-drm/fsl-imx-drm.txt
-@@ -60,7 +60,8 @@ Parallel display support
- - compatible: Should be "fsl,imx-parallel-display"
- Optional properties:
- - interface_pix_fmt: How this display is connected to the
--  display interface. Currently supported types: "rgb24", "rgb565", "bgr666"
-+  display interface. Currently supported types: "rgb24", "rgb565", "bgr666",
-+  "rgb666"
- - edid: verbatim EDID data block describing attached display.
- - ddc: phandle describing the i2c bus handling the display data
-   channel
-diff --git a/arch/arm/boot/dts/imx6dl-hummingboard.dts b/arch/arm/boot/dts/imx6dl-hummingboard.dts
-index 5bfae54fb780..5cfab68fe43d 100644
---- a/arch/arm/boot/dts/imx6dl-hummingboard.dts
-+++ b/arch/arm/boot/dts/imx6dl-hummingboard.dts
-@@ -67,6 +67,13 @@
- 	status = "okay";
- };
- 
-+&hdmi {
-+	pinctrl-names = "default";
-+	pinctrl-0 = <&pinctrl_hummingboard_hdmi>;
-+	ddc-i2c-bus = <&i2c2>;
-+	status = "okay";
-+};
-+
- &i2c1 {
- 	pinctrl-names = "default";
- 	pinctrl-0 = <&pinctrl_hummingboard_i2c1>;
-@@ -82,6 +89,13 @@
- 	 */
- };
- 
-+&i2c2 {
-+	clock-frequency = <100000>;
-+	pinctrl-names = "default";
-+	pinctrl-0 = <&pinctrl_hummingboard_i2c2>;
-+	status = "okay";
-+};
-+
- &iomuxc {
- 	hummingboard {
- 		pinctrl_hummingboard_flexcan1: hummingboard-flexcan1 {
-@@ -97,6 +111,12 @@
- 			>;
- 		};
- 
-+		pinctrl_hummingboard_hdmi: hummingboard-hdmi {
-+			fsl,pins = <
-+				MX6QDL_PAD_KEY_ROW2__HDMI_TX_CEC_LINE 0x1f8b0
-+			>;
-+		};
-+
- 		pinctrl_hummingboard_i2c1: hummingboard-i2c1 {
- 			fsl,pins = <
- 				MX6QDL_PAD_EIM_D21__I2C1_SCL 0x4001b8b1
-@@ -104,6 +124,13 @@
- 			>;
- 		};
- 
-+		pinctrl_hummingboard_i2c2: hummingboard-i2c2 {
-+			fsl,pins = <
-+				MX6QDL_PAD_KEY_COL3__I2C2_SCL 0x4001b8b1
-+				MX6QDL_PAD_KEY_ROW3__I2C2_SDA 0x4001b8b1
-+			>;
-+		};
-+
- 		pinctrl_hummingboard_spdif: hummingboard-spdif {
- 			fsl,pins = <MX6QDL_PAD_GPIO_17__SPDIF_OUT 0x13091>;
- 		};
-diff --git a/arch/arm/boot/dts/imx6q-cubox-i.dts b/arch/arm/boot/dts/imx6q-cubox-i.dts
-index bc5f31e3e892..9efd8b0c8011 100644
---- a/arch/arm/boot/dts/imx6q-cubox-i.dts
-+++ b/arch/arm/boot/dts/imx6q-cubox-i.dts
-@@ -13,4 +13,8 @@
- 
- &sata {
- 	status = "okay";
-+	fsl,transmit-level-mV = <1104>;
-+	fsl,transmit-boost-mdB = <0>;
-+	fsl,transmit-atten-16ths = <9>;
-+	fsl,no-spread-spectrum;
- };
-diff --git a/arch/arm/boot/dts/imx6qdl-cubox-i.dtsi b/arch/arm/boot/dts/imx6qdl-cubox-i.dtsi
-index c2a24888a276..f45380073973 100644
---- a/arch/arm/boot/dts/imx6qdl-cubox-i.dtsi
-+++ b/arch/arm/boot/dts/imx6qdl-cubox-i.dtsi
-@@ -12,6 +12,19 @@
- 		pinctrl-0 = <&pinctrl_cubox_i_ir>;
- 	};
- 
-+	pwmleds {
-+		compatible = "pwm-leds";
-+		pinctrl-names = "default";
-+		pinctrl-0 = <&pinctrl_cubox_i_pwm1>;
-+
-+		front {
-+			active-low;
-+			label = "imx6:red:front";
-+			max-brightness = <248>;
-+			pwms = <&pwm1 0 50000>;
-+		};
-+	};
-+
- 	regulators {
- 		compatible = "simple-bus";
- 
-@@ -55,6 +68,20 @@
- 	};
- };
- 
-+&hdmi {
-+	pinctrl-names = "default";
-+	pinctrl-0 = <&pinctrl_cubox_i_hdmi>;
-+	ddc-i2c-bus = <&i2c2>;
-+	status = "okay";
-+};
-+
-+&i2c2 {
-+	clock-frequency = <100000>;
-+	pinctrl-names = "default";
-+	pinctrl-0 = <&pinctrl_cubox_i_i2c2>;
-+	status = "okay";
-+};
-+
- &i2c3 {
- 	pinctrl-names = "default";
- 	pinctrl-0 = <&pinctrl_cubox_i_i2c3>;
-@@ -69,6 +96,19 @@
- 
- &iomuxc {
- 	cubox_i {
-+		pinctrl_cubox_i_hdmi: cubox-i-hdmi {
-+			fsl,pins = <
-+				MX6QDL_PAD_KEY_ROW2__HDMI_TX_CEC_LINE 0x1f8b0
-+			>;
-+		};
-+
-+		pinctrl_cubox_i_i2c2: cubox-i-i2c2 {
-+			fsl,pins = <
-+				MX6QDL_PAD_KEY_COL3__I2C2_SCL 0x4001b8b1
-+				MX6QDL_PAD_KEY_ROW3__I2C2_SDA 0x4001b8b1
-+			>;
-+		};
-+
- 		pinctrl_cubox_i_i2c3: cubox-i-i2c3 {
- 			fsl,pins = <
- 				MX6QDL_PAD_EIM_D17__I2C3_SCL 0x4001b8b1
-@@ -82,6 +122,10 @@
- 			>;
- 		};
- 
-+		pinctrl_cubox_i_pwm1: cubox-i-pwm1-front-led {
-+			fsl,pins = <MX6QDL_PAD_DISP0_DAT8__PWM1_OUT 0x1b0b0>;
-+		};
-+
- 		pinctrl_cubox_i_spdif: cubox-i-spdif {
- 			fsl,pins = <MX6QDL_PAD_GPIO_17__SPDIF_OUT 0x13091>;
- 		};
-@@ -111,6 +155,28 @@
- 				MX6QDL_PAD_SD2_DAT3__SD2_DATA3 0x13059
- 			>;
- 		};
-+
-+		pinctrl_cubox_i_usdhc2_100mhz: cubox-i-usdhc2-100mhz {
-+			fsl,pins = <
-+				MX6QDL_PAD_SD2_CMD__SD2_CMD    0x170b9
-+				MX6QDL_PAD_SD2_CLK__SD2_CLK    0x100b9
-+				MX6QDL_PAD_SD2_DAT0__SD2_DATA0 0x170b9
-+				MX6QDL_PAD_SD2_DAT1__SD2_DATA1 0x170b9
-+				MX6QDL_PAD_SD2_DAT2__SD2_DATA2 0x170b9
-+				MX6QDL_PAD_SD2_DAT3__SD2_DATA3 0x130b9
-+			>;
-+		};
-+
-+		pinctrl_cubox_i_usdhc2_200mhz: cubox-i-usdhc2-200mhz {
-+			fsl,pins = <
-+				MX6QDL_PAD_SD2_CMD__SD2_CMD    0x170f9
-+				MX6QDL_PAD_SD2_CLK__SD2_CLK    0x100f9
-+				MX6QDL_PAD_SD2_DAT0__SD2_DATA0 0x170f9
-+				MX6QDL_PAD_SD2_DAT1__SD2_DATA1 0x170f9
-+				MX6QDL_PAD_SD2_DAT2__SD2_DATA2 0x170f9
-+				MX6QDL_PAD_SD2_DAT3__SD2_DATA3 0x130f9
-+			>;
-+		};
- 	};
- };
- 
-@@ -130,9 +196,19 @@
- 	status = "okay";
- };
- 
-+&uart4 {
-+	status = "okay";
-+};
-+
-+&usdhc1 {
-+	status = "okay";
-+};
-+
- &usdhc2 {
--	pinctrl-names = "default";
-+	pinctrl-names = "default", "state_100mhz", "state_200mhz";
- 	pinctrl-0 = <&pinctrl_cubox_i_usdhc2_aux &pinctrl_cubox_i_usdhc2>;
-+	pinctrl-1 = <&pinctrl_cubox_i_usdhc2_aux &pinctrl_cubox_i_usdhc2_100mhz>;
-+	pinctrl-2 = <&pinctrl_cubox_i_usdhc2_aux &pinctrl_cubox_i_usdhc2_200mhz>;
- 	vmmc-supply = <&reg_3p3v>;
- 	cd-gpios = <&gpio1 4 0>;
- 	status = "okay";
-diff --git a/arch/arm/boot/dts/imx6qdl-microsom.dtsi b/arch/arm/boot/dts/imx6qdl-microsom.dtsi
-index d729d0b15f25..a5d72895d9ce 100644
---- a/arch/arm/boot/dts/imx6qdl-microsom.dtsi
-+++ b/arch/arm/boot/dts/imx6qdl-microsom.dtsi
-@@ -1,9 +1,69 @@
- /*
-  * Copyright (C) 2013,2014 Russell King
-  */
-+#include <dt-bindings/gpio/gpio.h>
-+/ {
-+	regulators {
-+		compatible = "simple-bus";
-+
-+		reg_brcm_osc: brcm-osc-reg {
-+			compatible = "regulator-fixed";
-+			enable-active-high;
-+			gpio = <&gpio5 5 0>;
-+			pinctrl-names = "default";
-+			pinctrl-0 = <&pinctrl_microsom_brcm_osc_reg>;
-+			regulator-name = "brcm_osc_reg";
-+			regulator-min-microvolt = <3300000>;
-+			regulator-max-microvolt = <3300000>;
-+			regulator-always-on;
-+			regulator-boot-on;
-+		};
-+
-+		reg_brcm: brcm-reg {
-+			compatible = "regulator-fixed";
-+			enable-active-high;
-+			gpio = <&gpio3 19 0>;
-+			pinctrl-names = "default";
-+			pinctrl-0 = <&pinctrl_microsom_brcm_reg>;
-+			regulator-name = "brcm_reg";
-+			regulator-min-microvolt = <3300000>;
-+			regulator-max-microvolt = <3300000>;
-+			startup-delay-us = <200000>;
-+		};
-+	};
-+};
- 
- &iomuxc {
- 	microsom {
-+		pinctrl_microsom_brcm_osc_reg: microsom-brcm-osc-reg {
-+			fsl,pins = <
-+				MX6QDL_PAD_DISP0_DAT11__GPIO5_IO05 0x40013070
-+			>;
-+		};
-+
-+		pinctrl_microsom_brcm_reg: microsom-brcm-reg {
-+			fsl,pins = <
-+				MX6QDL_PAD_EIM_D19__GPIO3_IO19 0x40013070
-+			>;
-+		};
-+
-+		pinctrl_microsom_brcm_wifi: microsom-brcm-wifi {
-+			fsl,pins = <
-+				MX6QDL_PAD_GPIO_8__XTALOSC_REF_CLK_32K	0x1b0b0
-+				MX6QDL_PAD_CSI0_DATA_EN__GPIO5_IO20	0x40013070
-+				MX6QDL_PAD_CSI0_DAT8__GPIO5_IO26	0x40013070
-+				MX6QDL_PAD_CSI0_DAT9__GPIO5_IO27	0x40013070
-+			>;
-+		};
-+
-+		pinctrl_microsom_brcm_bt: microsom-brcm-bt {
-+			fsl,pins = <
-+				MX6QDL_PAD_CSI0_DAT14__GPIO6_IO00	0x40013070
-+				MX6QDL_PAD_CSI0_DAT15__GPIO6_IO01	0x40013070
-+				MX6QDL_PAD_CSI0_DAT18__GPIO6_IO04	0x40013070
-+			>;
-+		};
-+
- 		pinctrl_microsom_uart1: microsom-uart1 {
- 			fsl,pins = <
- 				MX6QDL_PAD_CSI0_DAT10__UART1_TX_DATA	0x1b0b1
-@@ -11,6 +71,15 @@
- 			>;
- 		};
- 
-+		pinctrl_microsom_uart4_1: microsom-uart4 {
-+			fsl,pins = <
-+				MX6QDL_PAD_CSI0_DAT12__UART4_TX_DATA 0x1b0b1
-+				MX6QDL_PAD_CSI0_DAT13__UART4_RX_DATA 0x1b0b1
-+				MX6QDL_PAD_CSI0_DAT16__UART4_RTS_B 0x1b0b1
-+				MX6QDL_PAD_CSI0_DAT17__UART4_CTS_B 0x1b0b1
-+			>;
-+		};
-+
- 		pinctrl_microsom_usbotg: microsom-usbotg {
- 			/*
- 			 * Similar to pinctrl_usbotg_2, but we want it
-@@ -18,6 +87,17 @@
- 			 */
- 			fsl,pins = <MX6QDL_PAD_GPIO_1__USB_OTG_ID 0x13059>;
- 		};
-+
-+		pinctrl_microsom_usdhc1: microsom-usdhc1 {
-+			fsl,pins = <
-+				MX6QDL_PAD_SD1_CMD__SD1_CMD    0x17059
-+				MX6QDL_PAD_SD1_CLK__SD1_CLK    0x10059
-+				MX6QDL_PAD_SD1_DAT0__SD1_DATA0 0x17059
-+				MX6QDL_PAD_SD1_DAT1__SD1_DATA1 0x17059
-+				MX6QDL_PAD_SD1_DAT2__SD1_DATA2 0x17059
-+				MX6QDL_PAD_SD1_DAT3__SD1_DATA3 0x17059
-+			>;
-+		};
- 	};
- };
- 
-@@ -27,7 +107,25 @@
- 	status = "okay";
- };
- 
-+/* UART4 - Connected to optional BRCM Wifi/BT/FM */
-+&uart4 {
-+	pinctrl-names = "default";
-+	pinctrl-0 = <&pinctrl_microsom_brcm_bt &pinctrl_microsom_uart4_1>;
-+	fsl,uart-has-rtscts;
-+};
-+
- &usbotg {
- 	pinctrl-names = "default";
- 	pinctrl-0 = <&pinctrl_microsom_usbotg>;
- };
-+
-+/* USDHC1 - Connected to optional BRCM Wifi/BT/FM */
-+&usdhc1 {
-+	card-external-vcc-supply = <&reg_brcm>;
-+	card-reset-gpios = <&gpio5 26 GPIO_ACTIVE_LOW>, <&gpio6 0 GPIO_ACTIVE_LOW>;
-+	keep-power-in-suspend;
-+	non-removable;
-+	pinctrl-names = "default";
-+	pinctrl-0 = <&pinctrl_microsom_brcm_wifi &pinctrl_microsom_usdhc1>;
-+	vmmc-supply = <&reg_brcm>;
-+};
-diff --git a/arch/arm/configs/imx_v6_v7_defconfig b/arch/arm/configs/imx_v6_v7_defconfig
-index 09e974392fa1..ea50d34f7944 100644
---- a/arch/arm/configs/imx_v6_v7_defconfig
-+++ b/arch/arm/configs/imx_v6_v7_defconfig
-@@ -245,6 +245,7 @@ CONFIG_DRM_IMX_TVE=y
- CONFIG_DRM_IMX_LDB=y
- CONFIG_DRM_IMX_IPUV3_CORE=y
- CONFIG_DRM_IMX_IPUV3=y
-+CONFIG_DRM_IMX_HDMI=y
- CONFIG_COMMON_CLK_DEBUG=y
- # CONFIG_IOMMU_SUPPORT is not set
- CONFIG_PWM=y
-diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c
-index 2b4d6acfa34a..fefa6c3d4c86 100644
---- a/arch/arm/mach-imx/clk-imx6q.c
-+++ b/arch/arm/mach-imx/clk-imx6q.c
-@@ -454,6 +454,18 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
- 	clk_set_parent(clk[ipu2_di0_sel], clk[ipu2_di0_pre]);
- 	clk_set_parent(clk[ipu2_di1_sel], clk[ipu2_di1_pre]);
- 
-+	if (cpu_is_imx6dl())
-+		clk_set_parent(clk[ipu1_sel], clk[pll3_pfd1_540m]);
-+
-+	clk_set_parent(clk[ipu1_di0_pre_sel], clk[pll5_video_div]);
-+	clk_set_parent(clk[ipu1_di1_pre_sel], clk[pll5_video_div]);
-+	clk_set_parent(clk[ipu2_di0_pre_sel], clk[pll5_video_div]);
-+	clk_set_parent(clk[ipu2_di1_pre_sel], clk[pll5_video_div]);
-+	clk_set_parent(clk[ipu1_di0_sel], clk[ipu1_di0_pre]);
-+	clk_set_parent(clk[ipu1_di1_sel], clk[ipu1_di1_pre]);
-+	clk_set_parent(clk[ipu2_di0_sel], clk[ipu2_di0_pre]);
-+	clk_set_parent(clk[ipu2_di1_sel], clk[ipu2_di1_pre]);
-+
- 	/*
- 	 * The gpmi needs 100MHz frequency in the EDO/Sync mode,
- 	 * We can not get the 100MHz from the pll2_pfd0_352m.
-diff --git a/arch/arm/mach-imx/clk-pllv3.c b/arch/arm/mach-imx/clk-pllv3.c
-index 61364050fccd..3776f974d1dc 100644
---- a/arch/arm/mach-imx/clk-pllv3.c
-+++ b/arch/arm/mach-imx/clk-pllv3.c
-@@ -273,9 +273,10 @@ static int clk_pllv3_av_set_rate(struct clk_hw *hw, unsigned long rate,
- 	struct clk_pllv3 *pll = to_clk_pllv3(hw);
- 	unsigned long min_rate = parent_rate * 27;
- 	unsigned long max_rate = parent_rate * 54;
--	u32 val, div;
-+	u32 val, newval, div;
- 	u32 mfn, mfd = 1000000;
- 	s64 temp64;
-+	int ret;
- 
- 	if (rate < min_rate || rate > max_rate)
- 		return -EINVAL;
-@@ -287,13 +288,27 @@ static int clk_pllv3_av_set_rate(struct clk_hw *hw, unsigned long rate,
- 	mfn = temp64;
- 
- 	val = readl_relaxed(pll->base);
--	val &= ~pll->div_mask;
--	val |= div;
--	writel_relaxed(val, pll->base);
-+
-+	/* set the PLL into bypass mode */
-+	newval = val | BM_PLL_BYPASS;
-+	writel_relaxed(newval, pll->base);
-+
-+	/* configure the new frequency */
-+	newval &= ~pll->div_mask;
-+	newval |= div;
-+	writel_relaxed(newval, pll->base);
- 	writel_relaxed(mfn, pll->base + PLL_NUM_OFFSET);
--	writel_relaxed(mfd, pll->base + PLL_DENOM_OFFSET);
-+	writel(mfd, pll->base + PLL_DENOM_OFFSET);
- 
--	return clk_pllv3_wait_lock(pll);
-+	ret = clk_pllv3_wait_lock(pll);
-+	if (ret == 0 && val & BM_PLL_POWER) {
-+		/* only if it locked can we switch back to the PLL */
-+		newval &= ~BM_PLL_BYPASS;
-+		newval |= val & BM_PLL_BYPASS;
-+		writel(newval, pll->base);
-+	}
-+
-+	return ret;
- }
- 
- static const struct clk_ops clk_pllv3_av_ops = {
-diff --git a/drivers/Kconfig b/drivers/Kconfig
-index 0a0a90f52d26..05a21b857996 100644
---- a/drivers/Kconfig
-+++ b/drivers/Kconfig
-@@ -174,4 +174,6 @@ source "drivers/powercap/Kconfig"
- 
- source "drivers/mcb/Kconfig"
- 
-+source "drivers/cec/Kconfig"
-+
- endmenu
-diff --git a/drivers/Makefile b/drivers/Makefile
-index 7183b6af5dac..470eec2238ca 100644
---- a/drivers/Makefile
-+++ b/drivers/Makefile
-@@ -157,3 +157,4 @@ obj-$(CONFIG_NTB)		+= ntb/
- obj-$(CONFIG_FMC)		+= fmc/
- obj-$(CONFIG_POWERCAP)		+= powercap/
- obj-$(CONFIG_MCB)		+= mcb/
-+obj-$(CONFIG_CEC)		+= cec/
-diff --git a/drivers/ata/ahci_imx.c b/drivers/ata/ahci_imx.c
-index 8befeb69eeb1..54e2972fc6da 100644
---- a/drivers/ata/ahci_imx.c
-+++ b/drivers/ata/ahci_imx.c
-@@ -62,6 +62,7 @@ struct imx_ahci_priv {
- 	struct regmap *gpr;
- 	bool no_device;
- 	bool first_time;
-+	u32 phy_params;
- };
- 
- static int ahci_imx_hotplug;
-@@ -246,14 +247,7 @@ static int imx_sata_enable(struct ahci_host_priv *hpriv)
- 				   IMX6Q_GPR13_SATA_TX_LVL_MASK |
- 				   IMX6Q_GPR13_SATA_MPLL_CLK_EN |
- 				   IMX6Q_GPR13_SATA_TX_EDGE_RATE,
--				   IMX6Q_GPR13_SATA_RX_EQ_VAL_3_0_DB |
--				   IMX6Q_GPR13_SATA_RX_LOS_LVL_SATA2M |
--				   IMX6Q_GPR13_SATA_RX_DPLL_MODE_2P_4F |
--				   IMX6Q_GPR13_SATA_SPD_MODE_3P0G |
--				   IMX6Q_GPR13_SATA_MPLL_SS_EN |
--				   IMX6Q_GPR13_SATA_TX_ATTEN_9_16 |
--				   IMX6Q_GPR13_SATA_TX_BOOST_3_33_DB |
--				   IMX6Q_GPR13_SATA_TX_LVL_1_025_V);
-+				   imxpriv->phy_params);
- 		regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13,
- 				   IMX6Q_GPR13_SATA_MPLL_CLK_EN,
- 				   IMX6Q_GPR13_SATA_MPLL_CLK_EN);
-@@ -324,6 +318,10 @@ static void ahci_imx_error_handler(struct ata_port *ap)
- 	writel(reg_val | IMX_P0PHYCR_TEST_PDDQ, mmio + IMX_P0PHYCR);
- 	imx_sata_disable(hpriv);
- 	imxpriv->no_device = true;
-+
-+	dev_info(ap->dev, "no device found, disabling link.\n");
-+	dev_info(ap->dev, "pass " MODULE_PARAM_PREFIX
-+		 ".hotplug=1 to enable hotplug\n");
- }
- 
- static int ahci_imx_softreset(struct ata_link *link, unsigned int *class,
-@@ -364,6 +362,165 @@ static const struct of_device_id imx_ahci_of_match[] = {
- };
- MODULE_DEVICE_TABLE(of, imx_ahci_of_match);
- 
-+struct reg_value {
-+	u32 of_value;
-+	u32 reg_value;
-+};
-+
-+struct reg_property {
-+	const char *name;
-+	const struct reg_value *values;
-+	size_t num_values;
-+	u32 def_value;
-+	u32 set_value;
-+};
-+
-+static const struct reg_value gpr13_tx_level[] = {
-+	{  937, IMX6Q_GPR13_SATA_TX_LVL_0_937_V },
-+	{  947, IMX6Q_GPR13_SATA_TX_LVL_0_947_V },
-+	{  957, IMX6Q_GPR13_SATA_TX_LVL_0_957_V },
-+	{  966, IMX6Q_GPR13_SATA_TX_LVL_0_966_V },
-+	{  976, IMX6Q_GPR13_SATA_TX_LVL_0_976_V },
-+	{  986, IMX6Q_GPR13_SATA_TX_LVL_0_986_V },
-+	{  996, IMX6Q_GPR13_SATA_TX_LVL_0_996_V },
-+	{ 1005, IMX6Q_GPR13_SATA_TX_LVL_1_005_V },
-+	{ 1015, IMX6Q_GPR13_SATA_TX_LVL_1_015_V },
-+	{ 1025, IMX6Q_GPR13_SATA_TX_LVL_1_025_V },
-+	{ 1035, IMX6Q_GPR13_SATA_TX_LVL_1_035_V },
-+	{ 1045, IMX6Q_GPR13_SATA_TX_LVL_1_045_V },
-+	{ 1054, IMX6Q_GPR13_SATA_TX_LVL_1_054_V },
-+	{ 1064, IMX6Q_GPR13_SATA_TX_LVL_1_064_V },
-+	{ 1074, IMX6Q_GPR13_SATA_TX_LVL_1_074_V },
-+	{ 1084, IMX6Q_GPR13_SATA_TX_LVL_1_084_V },
-+	{ 1094, IMX6Q_GPR13_SATA_TX_LVL_1_094_V },
-+	{ 1104, IMX6Q_GPR13_SATA_TX_LVL_1_104_V },
-+	{ 1113, IMX6Q_GPR13_SATA_TX_LVL_1_113_V },
-+	{ 1123, IMX6Q_GPR13_SATA_TX_LVL_1_123_V },
-+	{ 1133, IMX6Q_GPR13_SATA_TX_LVL_1_133_V },
-+	{ 1143, IMX6Q_GPR13_SATA_TX_LVL_1_143_V },
-+	{ 1152, IMX6Q_GPR13_SATA_TX_LVL_1_152_V },
-+	{ 1162, IMX6Q_GPR13_SATA_TX_LVL_1_162_V },
-+	{ 1172, IMX6Q_GPR13_SATA_TX_LVL_1_172_V },
-+	{ 1182, IMX6Q_GPR13_SATA_TX_LVL_1_182_V },
-+	{ 1191, IMX6Q_GPR13_SATA_TX_LVL_1_191_V },
-+	{ 1201, IMX6Q_GPR13_SATA_TX_LVL_1_201_V },
-+	{ 1211, IMX6Q_GPR13_SATA_TX_LVL_1_211_V },
-+	{ 1221, IMX6Q_GPR13_SATA_TX_LVL_1_221_V },
-+	{ 1230, IMX6Q_GPR13_SATA_TX_LVL_1_230_V },
-+	{ 1240, IMX6Q_GPR13_SATA_TX_LVL_1_240_V }
-+};
-+
-+static const struct reg_value gpr13_tx_boost[] = {
-+	{    0, IMX6Q_GPR13_SATA_TX_BOOST_0_00_DB },
-+	{  370, IMX6Q_GPR13_SATA_TX_BOOST_0_37_DB },
-+	{  740, IMX6Q_GPR13_SATA_TX_BOOST_0_74_DB },
-+	{  111, IMX6Q_GPR13_SATA_TX_BOOST_1_11_DB },
-+	{  148, IMX6Q_GPR13_SATA_TX_BOOST_1_48_DB },
-+	{  185, IMX6Q_GPR13_SATA_TX_BOOST_1_85_DB },
-+	{  222, IMX6Q_GPR13_SATA_TX_BOOST_2_22_DB },
-+	{  259, IMX6Q_GPR13_SATA_TX_BOOST_2_59_DB },
-+	{  296, IMX6Q_GPR13_SATA_TX_BOOST_2_96_DB },
-+	{  333, IMX6Q_GPR13_SATA_TX_BOOST_3_33_DB },
-+	{  370, IMX6Q_GPR13_SATA_TX_BOOST_3_70_DB },
-+	{  407, IMX6Q_GPR13_SATA_TX_BOOST_4_07_DB },
-+	{  444, IMX6Q_GPR13_SATA_TX_BOOST_4_44_DB },
-+	{  481, IMX6Q_GPR13_SATA_TX_BOOST_4_81_DB },
-+	{  528, IMX6Q_GPR13_SATA_TX_BOOST_5_28_DB },
-+	{  575, IMX6Q_GPR13_SATA_TX_BOOST_5_75_DB }
-+};
-+
-+static const struct reg_value gpr13_tx_atten[] = {
-+	{  8, IMX6Q_GPR13_SATA_TX_ATTEN_8_16 },
-+	{  9, IMX6Q_GPR13_SATA_TX_ATTEN_9_16 },
-+	{ 10, IMX6Q_GPR13_SATA_TX_ATTEN_10_16 },
-+	{ 12, IMX6Q_GPR13_SATA_TX_ATTEN_12_16 },
-+	{ 14, IMX6Q_GPR13_SATA_TX_ATTEN_14_16 },
-+	{ 16, IMX6Q_GPR13_SATA_TX_ATTEN_16_16 },
-+};
-+
-+static const struct reg_value gpr13_rx_eq[] = {
-+	{  500, IMX6Q_GPR13_SATA_RX_EQ_VAL_0_5_DB },
-+	{ 1000, IMX6Q_GPR13_SATA_RX_EQ_VAL_1_0_DB },
-+	{ 1500, IMX6Q_GPR13_SATA_RX_EQ_VAL_1_5_DB },
-+	{ 2000, IMX6Q_GPR13_SATA_RX_EQ_VAL_2_0_DB },
-+	{ 2500, IMX6Q_GPR13_SATA_RX_EQ_VAL_2_5_DB },
-+	{ 3000, IMX6Q_GPR13_SATA_RX_EQ_VAL_3_0_DB },
-+	{ 3500, IMX6Q_GPR13_SATA_RX_EQ_VAL_3_5_DB },
-+	{ 4000, IMX6Q_GPR13_SATA_RX_EQ_VAL_4_0_DB },
-+};
-+
-+static const struct reg_property gpr13_props[] = {
-+	{
-+		.name = "fsl,transmit-level-mV",
-+		.values = gpr13_tx_level,
-+		.num_values = ARRAY_SIZE(gpr13_tx_level),
-+		.def_value = IMX6Q_GPR13_SATA_TX_LVL_1_025_V,
-+	}, {
-+		.name = "fsl,transmit-boost-mdB",
-+		.values = gpr13_tx_boost,
-+		.num_values = ARRAY_SIZE(gpr13_tx_boost),
-+		.def_value = IMX6Q_GPR13_SATA_TX_BOOST_3_33_DB,
-+	}, {
-+		.name = "fsl,transmit-atten-16ths",
-+		.values = gpr13_tx_atten,
-+		.num_values = ARRAY_SIZE(gpr13_tx_atten),
-+		.def_value = IMX6Q_GPR13_SATA_TX_ATTEN_9_16,
-+	}, {
-+		.name = "fsl,receive-eq-mdB",
-+		.values = gpr13_rx_eq,
-+		.num_values = ARRAY_SIZE(gpr13_rx_eq),
-+		.def_value = IMX6Q_GPR13_SATA_RX_EQ_VAL_3_0_DB,
-+	}, {
-+		.name = "fsl,no-spread-spectrum",
-+		.def_value = IMX6Q_GPR13_SATA_MPLL_SS_EN,
-+		.set_value = 0,
-+	},
-+};
-+
-+static u32 imx_ahci_parse_props(struct device *dev,
-+				const struct reg_property *prop, size_t num)
-+{
-+	struct device_node *np = dev->of_node;
-+	u32 reg_value = 0;
-+	int i, j;
-+
-+	for (i = 0; i < num; i++, prop++) {
-+		u32 of_val;
-+
-+		if (prop->num_values == 0) {
-+			if (of_property_read_bool(np, prop->name))
-+				reg_value |= prop->set_value;
-+			else
-+				reg_value |= prop->def_value;
-+			continue;
-+		}
-+
-+		if (of_property_read_u32(np, prop->name, &of_val)) {
-+			dev_info(dev, "%s not specified, using %08x\n",
-+				prop->name, prop->def_value);
-+			reg_value |= prop->def_value;
-+			continue;
-+		}
-+
-+		for (j = 0; j < prop->num_values; j++) {
-+			if (prop->values[j].of_value == of_val) {
-+				dev_info(dev, "%s value %u, using %08x\n",
-+					prop->name, of_val, prop->values[j].reg_value);
-+				reg_value |= prop->values[j].reg_value;
-+				break;
-+			}
-+		}
-+
-+		if (j == prop->num_values) {
-+			dev_err(dev, "DT property %s is not a valid value\n",
-+				prop->name);
-+			reg_value |= prop->def_value;
-+		}
-+	}
-+
-+	return reg_value;
-+}
-+
- static int imx_ahci_probe(struct platform_device *pdev)
- {
- 	struct device *dev = &pdev->dev;
-@@ -392,6 +549,8 @@ static int imx_ahci_probe(struct platform_device *pdev)
- 	}
- 
- 	if (imxpriv->type == AHCI_IMX6Q) {
-+		u32 reg_value;
-+
- 		imxpriv->gpr = syscon_regmap_lookup_by_compatible(
- 							"fsl,imx6q-iomuxc-gpr");
- 		if (IS_ERR(imxpriv->gpr)) {
-@@ -399,6 +558,15 @@ static int imx_ahci_probe(struct platform_device *pdev)
- 				"failed to find fsl,imx6q-iomux-gpr regmap\n");
- 			return PTR_ERR(imxpriv->gpr);
- 		}
-+
-+		reg_value = imx_ahci_parse_props(dev, gpr13_props,
-+						 ARRAY_SIZE(gpr13_props));
-+
-+		imxpriv->phy_params =
-+				   IMX6Q_GPR13_SATA_RX_LOS_LVL_SATA2M |
-+				   IMX6Q_GPR13_SATA_RX_DPLL_MODE_2P_4F |
-+				   IMX6Q_GPR13_SATA_SPD_MODE_3P0G |
-+				   reg_value;
- 	}
- 
- 	hpriv = ahci_platform_get_resources(pdev);
-diff --git a/drivers/cec/Kconfig b/drivers/cec/Kconfig
-new file mode 100644
-index 000000000000..d67cfb83de6a
---- /dev/null
-+++ b/drivers/cec/Kconfig
-@@ -0,0 +1,14 @@
-+#
-+# Consumer Electroncs Control support
-+#
-+
-+menu "Consumer Electronics Control devices"
-+
-+config CEC
-+	bool
-+
-+config HDMI_CEC_CORE
-+	tristate
-+	select CEC
-+
-+endmenu
-diff --git a/drivers/cec/Makefile b/drivers/cec/Makefile
-new file mode 100644
-index 000000000000..b94278bc8321
---- /dev/null
-+++ b/drivers/cec/Makefile
-@@ -0,0 +1 @@
-+obj-$(CONFIG_HDMI_CEC_CORE) += cec-dev.o
-diff --git a/drivers/cec/cec-dev.c b/drivers/cec/cec-dev.c
-new file mode 100644
-index 000000000000..ba58d8217851
---- /dev/null
-+++ b/drivers/cec/cec-dev.c
-@@ -0,0 +1,384 @@
-+/*
-+ * HDMI Consumer Electronics Control
-+ *
-+ * This provides the user API for communication with HDMI CEC complaint
-+ * devices in kernel drivers, and is based upon the protocol developed
-+ * by Freescale for their i.MX SoCs.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+#include <linux/cec-dev.h>
-+#include <linux/device.h>
-+#include <linux/fs.h>
-+#include <linux/module.h>
-+#include <linux/poll.h>
-+#include <linux/sched.h>
-+#include <linux/slab.h>
-+
-+struct cec_event {
-+	struct cec_user_event usr;
-+	struct list_head node;
-+};
-+
-+static struct class *cec_class;
-+static int cec_major;
-+
-+static void cec_dev_send_message(struct cec_dev *cec_dev, u8 *msg,
-+	size_t count)
-+{
-+	unsigned long flags;
-+
-+	spin_lock_irqsave(&cec_dev->lock, flags);
-+	cec_dev->retries = 5;
-+	cec_dev->write_busy = 1;
-+	cec_dev->send_message(cec_dev, msg, count);
-+	spin_unlock_irqrestore(&cec_dev->lock, flags);
-+}
-+
-+void cec_dev_event(struct cec_dev *cec_dev, int type, u8 *msg, size_t len)
-+{
-+	struct cec_event *event;
-+	unsigned long flags;
-+
-+	event = kzalloc(sizeof(*event), GFP_ATOMIC);
-+	if (event) {
-+		event->usr.event_type = type;
-+		event->usr.msg_len = len;
-+		if (msg)
-+			memcpy(event->usr.msg, msg, len);
-+
-+		spin_lock_irqsave(&cec_dev->lock, flags);
-+		list_add_tail(&event->node, &cec_dev->events);
-+		spin_unlock_irqrestore(&cec_dev->lock, flags);
-+		wake_up(&cec_dev->waitq);
-+	}
-+}
-+EXPORT_SYMBOL_GPL(cec_dev_event);
-+
-+static int cec_dev_lock_write(struct cec_dev *cec_dev, struct file *file)
-+	__acquires(cec_dev->mutex)
-+{
-+	int ret;
-+
-+	do {
-+		if (file->f_flags & O_NONBLOCK) {
-+			if (cec_dev->write_busy)
-+				return -EAGAIN;
-+		} else {
-+			ret = wait_event_interruptible(cec_dev->waitq,
-+						       !cec_dev->write_busy);
-+			if (ret)
-+				break;
-+		}
-+
-+		ret = mutex_lock_interruptible(&cec_dev->mutex);
-+		if (ret)
-+			break;
-+
-+		if (!cec_dev->write_busy)
-+			break;
-+
-+		mutex_unlock(&cec_dev->mutex);
-+	} while (1);
-+
-+	return ret;
-+}
-+
-+static ssize_t cec_dev_read(struct file *file, char __user *buf,
-+	size_t count, loff_t *ppos)
-+{
-+	struct cec_dev *cec_dev = file->private_data;
-+	ssize_t ret;
-+
-+	if (count > sizeof(struct cec_user_event))
-+		count = sizeof(struct cec_user_event);
-+
-+	if (!access_ok(VERIFY_WRITE, buf, count))
-+		return -EFAULT;
-+
-+	do {
-+		struct cec_event *event = NULL;
-+		unsigned long flags;
-+
-+		spin_lock_irqsave(&cec_dev->lock, flags);
-+		if (!list_empty(&cec_dev->events)) {
-+			event = list_first_entry(&cec_dev->events,
-+					struct cec_event, node);
-+			list_del(&event->node);
-+		}
-+		spin_unlock_irqrestore(&cec_dev->lock, flags);
-+
-+		if (event) {
-+			ret = __copy_to_user(buf, &event->usr, count) ?
-+				 -EFAULT : count;
-+			kfree(event);
-+			break;
-+		}
-+
-+		if (file->f_flags & O_NONBLOCK) {
-+			ret = -EAGAIN;
-+			break;
-+		}
-+
-+		ret = wait_event_interruptible(cec_dev->waitq,
-+					       !list_empty(&cec_dev->events));
-+		if (ret)
-+			break;
-+	} while (1);
-+
-+	return ret;
-+}
-+
-+static ssize_t cec_dev_write(struct file *file, const char __user *buf,
-+	size_t count, loff_t *ppos)
-+{
-+	struct cec_dev *cec_dev = file->private_data;
-+	u8 msg[MAX_MESSAGE_LEN];
-+	int ret;
-+
-+	if (count > sizeof(msg))
-+		return -E2BIG;
-+
-+	if (copy_from_user(msg, buf, count))
-+		return -EFAULT;
-+
-+	ret = cec_dev_lock_write(cec_dev, file);
-+	if (ret)
-+		return ret;
-+
-+	cec_dev_send_message(cec_dev, msg, count);
-+
-+	mutex_unlock(&cec_dev->mutex);
-+
-+	return count;
-+}
-+
-+static long cec_dev_ioctl(struct file *file, u_int cmd, unsigned long arg)
-+{
-+	struct cec_dev *cec_dev = file->private_data;
-+	int ret;
-+
-+	switch (cmd) {
-+	case HDMICEC_IOC_O_SETLOGICALADDRESS:
-+	case HDMICEC_IOC_SETLOGICALADDRESS:
-+		if (arg > 15) {
-+			ret = -EINVAL;
-+			break;
-+		}
-+
-+		ret = cec_dev_lock_write(cec_dev, file);
-+		if (ret == 0) {
-+			unsigned char msg[1];
-+
-+			cec_dev->addresses = BIT(arg);
-+			cec_dev->set_address(cec_dev, cec_dev->addresses);
-+
-+			/*
-+			 * Send a ping message with the source and destination
-+			 * set to our address; the result indicates whether
-+			 * unit has chosen our address simultaneously.
-+			 */
-+			msg[0] = arg << 4 | arg;
-+			cec_dev_send_message(cec_dev, msg, sizeof(msg));
-+			mutex_unlock(&cec_dev->mutex);
-+		}
-+		break;
-+
-+	case HDMICEC_IOC_STARTDEVICE:
-+		ret = mutex_lock_interruptible(&cec_dev->mutex);
-+		if (ret == 0) {
-+			cec_dev->addresses = BIT(15);
-+			cec_dev->set_address(cec_dev, cec_dev->addresses);
-+			mutex_unlock(&cec_dev->mutex);
-+		}
-+		break;
-+
-+	case HDMICEC_IOC_STOPDEVICE:
-+		ret = 0;
-+		break;
-+
-+	case HDMICEC_IOC_GETPHYADDRESS:
-+		ret = put_user(cec_dev->physical, (u16 __user *)arg);
-+		ret = -ENOIOCTLCMD;
-+		break;
-+
-+	default:
-+		ret = -ENOIOCTLCMD;
-+		break;
-+	}
-+
-+	return ret;
-+}
-+
-+static unsigned cec_dev_poll(struct file *file, poll_table *wait)
-+{
-+	struct cec_dev *cec_dev = file->private_data;
-+	unsigned mask = 0;
-+
-+	poll_wait(file, &cec_dev->waitq, wait);
-+
-+	if (cec_dev->write_busy == 0)
-+		mask |= POLLOUT | POLLWRNORM;
-+	if (!list_empty(&cec_dev->events))
-+		mask |= POLLIN | POLLRDNORM;
-+
-+	return mask;
-+}
-+
-+static int cec_dev_release(struct inode *inode, struct file *file)
-+{
-+	struct cec_dev *cec_dev = file->private_data;
-+
-+	mutex_lock(&cec_dev->mutex);
-+	if (cec_dev->users >= 1)
-+		cec_dev->users -= 1;
-+	if (cec_dev->users == 0) {
-+		/*
-+		 * Wait for any write to complete before shutting down.
-+		 * A message should complete in a maximum of 2.75ms *
-+		 * 160 bits + 4.7ms, or 444.7ms.  Let's call that 500ms.
-+		 * If we time out, shutdown anyway.
-+		 */
-+		wait_event_timeout(cec_dev->waitq, !cec_dev->write_busy,
-+				   msecs_to_jiffies(500));
-+
-+		cec_dev->release(cec_dev);
-+
-+		while (!list_empty(&cec_dev->events)) {
-+			struct cec_event *event;
-+
-+			event = list_first_entry(&cec_dev->events,
-+					struct cec_event, node);
-+			list_del(&event->node);
-+			kfree(event);
-+		}
-+	}
-+	mutex_unlock(&cec_dev->mutex);
-+	return 0;
-+}
-+
-+static int cec_dev_open(struct inode *inode, struct file *file)
-+{
-+	struct cec_dev *cec_dev = container_of(inode->i_cdev, struct cec_dev,
-+					       cdev);
-+	int ret = 0;
-+
-+	nonseekable_open(inode, file);
-+
-+	file->private_data = cec_dev;
-+
-+	ret = mutex_lock_interruptible(&cec_dev->mutex);
-+	if (ret)
-+		return ret;
-+
-+	if (cec_dev->users++ == 0) {
-+		cec_dev->addresses = BIT(15);
-+
-+		ret = cec_dev->open(cec_dev);
-+		if (ret < 0)
-+			cec_dev->users = 0;
-+	}
-+	mutex_unlock(&cec_dev->mutex);
-+
-+	return ret;
-+}
-+
-+static const struct file_operations hdmi_cec_fops = {
-+	.owner = THIS_MODULE,
-+	.read = cec_dev_read,
-+	.write = cec_dev_write,
-+	.open = cec_dev_open,
-+	.unlocked_ioctl = cec_dev_ioctl,
-+	.release = cec_dev_release,
-+	.poll = cec_dev_poll,
-+};
-+
-+void cec_dev_init(struct cec_dev *cec_dev, struct module *module)
-+{
-+	cec_dev->devn = MKDEV(cec_major, 0);
-+
-+	INIT_LIST_HEAD(&cec_dev->events);
-+	init_waitqueue_head(&cec_dev->waitq);
-+	spin_lock_init(&cec_dev->lock);
-+	mutex_init(&cec_dev->mutex);
-+
-+	cec_dev->addresses = BIT(15);
-+
-+	cdev_init(&cec_dev->cdev, &hdmi_cec_fops);
-+	cec_dev->cdev.owner = module;
-+}
-+EXPORT_SYMBOL_GPL(cec_dev_init);
-+
-+int cec_dev_add(struct cec_dev *cec_dev, struct device *dev, const char *name)
-+{
-+	struct device *cd;
-+	int ret;
-+
-+	ret = cdev_add(&cec_dev->cdev, cec_dev->devn, 1);
-+	if (ret < 0)
-+		goto err_cdev;
-+
-+	cd = device_create(cec_class, dev, cec_dev->devn, NULL, name);
-+	if (IS_ERR(cd)) {
-+		ret = PTR_ERR(cd);
-+		dev_err(dev, "can't create device: %d\n", ret);
-+		goto err_dev;
-+	}
-+
-+	return 0;
-+
-+ err_dev:
-+	cdev_del(&cec_dev->cdev);
-+ err_cdev:
-+	return ret;
-+}
-+EXPORT_SYMBOL_GPL(cec_dev_add);
-+
-+void cec_dev_remove(struct cec_dev *cec_dev)
-+{
-+	device_destroy(cec_class, cec_dev->devn);
-+	cdev_del(&cec_dev->cdev);
-+}
-+EXPORT_SYMBOL_GPL(cec_dev_remove);
-+
-+static int cec_init(void)
-+{
-+	dev_t dev;
-+	int ret;
-+
-+	cec_class = class_create(THIS_MODULE, "hdmi-cec");
-+	if (IS_ERR(cec_class)) {
-+		ret = PTR_ERR(cec_class);
-+		pr_err("cec: can't create cec class: %d\n", ret);
-+		goto err_class;
-+	}
-+
-+	ret = alloc_chrdev_region(&dev, 0, 1, "hdmi-cec");
-+	if (ret) {
-+		pr_err("cec: can't create character devices: %d\n", ret);
-+		goto err_chrdev;
-+	}
-+
-+	cec_major = MAJOR(dev);
-+
-+	return 0;
-+
-+ err_chrdev:
-+	class_destroy(cec_class);
-+ err_class:
-+	return ret;
-+}
-+subsys_initcall(cec_init);
-+
-+static void cec_exit(void)
-+{
-+	unregister_chrdev_region(MKDEV(cec_major, 0), 1);
-+	class_destroy(cec_class);
-+}
-+module_exit(cec_exit);
-+
-+MODULE_AUTHOR("Russell King <rmk+kernel@arm.linux.org.uk>");
-+MODULE_DESCRIPTION("Generic HDMI CEC driver");
-+MODULE_LICENSE("GPL");
-diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
-index df281b54db01..20585cf62091 100644
---- a/drivers/gpu/drm/drm_crtc_helper.c
-+++ b/drivers/gpu/drm/drm_crtc_helper.c
-@@ -140,16 +140,10 @@ drm_encoder_disable(struct drm_encoder *encoder)
- static void __drm_helper_disable_unused_functions(struct drm_device *dev)
- {
- 	struct drm_encoder *encoder;
--	struct drm_connector *connector;
- 	struct drm_crtc *crtc;
- 
- 	drm_warn_on_modeset_not_all_locked(dev);
- 
--	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
--		if (!connector->encoder)
--			continue;
--	}
--
- 	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
- 		if (!drm_helper_encoder_in_use(encoder)) {
- 			drm_encoder_disable(encoder);
-diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c
-index 7d0aaed1e23a..f5cf1b0f2748 100644
---- a/drivers/leds/leds-pwm.c
-+++ b/drivers/leds/leds-pwm.c
-@@ -69,6 +69,10 @@ static void led_pwm_set(struct led_classdev *led_cdev,
- 
- 	duty *= brightness;
- 	do_div(duty, max);
-+
-+	if (led_dat->active_low)
-+		duty = led_dat->period - duty;
-+
- 	led_dat->duty = duty;
- 
- 	if (led_dat->can_sleep)
-@@ -92,55 +96,75 @@ static void led_pwm_cleanup(struct led_pwm_priv *priv)
- 	}
- }
- 
--static int led_pwm_create_of(struct platform_device *pdev,
--			     struct led_pwm_priv *priv)
-+static int led_pwm_add(struct device *dev, struct led_pwm_priv *priv,
-+		       struct led_pwm *led, struct device_node *child)
- {
--	struct device_node *child;
-+	struct led_pwm_data *led_data = &priv->leds[priv->num_leds];
- 	int ret;
- 
--	for_each_child_of_node(pdev->dev.of_node, child) {
--		struct led_pwm_data *led_dat = &priv->leds[priv->num_leds];
-+	led_data->active_low = led->active_low;
-+	led_data->period = led->pwm_period_ns;
-+	led_data->cdev.name = led->name;
-+	led_data->cdev.default_trigger = led->default_trigger;
-+	led_data->cdev.brightness_set = led_pwm_set;
-+	led_data->cdev.brightness = LED_OFF;
-+	led_data->cdev.max_brightness = led->max_brightness;
-+	led_data->cdev.flags = LED_CORE_SUSPENDRESUME;
-+
-+	if (child)
-+		led_data->pwm = devm_of_pwm_get(dev, child, NULL);
-+	else
-+		led_data->pwm = devm_pwm_get(dev, led->name);
-+	if (IS_ERR(led_data->pwm)) {
-+		ret = PTR_ERR(led_data->pwm);
-+		dev_err(dev, "unable to request PWM for %s: %d\n",
-+			led->name, ret);
-+		return ret;
-+	}
- 
--		led_dat->cdev.name = of_get_property(child, "label",
--						     NULL) ? : child->name;
-+	if (child)
-+		led_data->period = pwm_get_period(led_data->pwm);
- 
--		led_dat->pwm = devm_of_pwm_get(&pdev->dev, child, NULL);
--		if (IS_ERR(led_dat->pwm)) {
--			dev_err(&pdev->dev, "unable to request PWM for %s\n",
--				led_dat->cdev.name);
--			ret = PTR_ERR(led_dat->pwm);
--			goto err;
--		}
--		/* Get the period from PWM core when n*/
--		led_dat->period = pwm_get_period(led_dat->pwm);
-+	led_data->can_sleep = pwm_can_sleep(led_data->pwm);
-+	if (led_data->can_sleep)
-+		INIT_WORK(&led_data->work, led_pwm_work);
- 
--		led_dat->cdev.default_trigger = of_get_property(child,
--						"linux,default-trigger", NULL);
--		of_property_read_u32(child, "max-brightness",
--				     &led_dat->cdev.max_brightness);
-+	ret = led_classdev_register(dev, &led_data->cdev);
-+	if (ret == 0) {
-+		priv->num_leds++;
-+	} else {
-+		dev_err(dev, "failed to register PWM led for %s: %d\n",
-+			led->name, ret);
-+	}
- 
--		led_dat->cdev.brightness_set = led_pwm_set;
--		led_dat->cdev.brightness = LED_OFF;
--		led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME;
-+	return ret;
-+}
- 
--		led_dat->can_sleep = pwm_can_sleep(led_dat->pwm);
--		if (led_dat->can_sleep)
--			INIT_WORK(&led_dat->work, led_pwm_work);
-+static int led_pwm_create_of(struct device *dev, struct led_pwm_priv *priv)
-+{
-+	struct device_node *child;
-+	struct led_pwm led;
-+	int ret = 0;
- 
--		ret = led_classdev_register(&pdev->dev, &led_dat->cdev);
--		if (ret < 0) {
--			dev_err(&pdev->dev, "failed to register for %s\n",
--				led_dat->cdev.name);
-+	memset(&led, 0, sizeof(led));
-+
-+	for_each_child_of_node(dev->of_node, child) {
-+		led.name = of_get_property(child, "label", NULL) ? :
-+			   child->name;
-+
-+		led.default_trigger = of_get_property(child,
-+						"linux,default-trigger", NULL);
-+		led.active_low = of_property_read_bool(child, "active-low");
-+		of_property_read_u32(child, "max-brightness",
-+				     &led.max_brightness);
-+
-+		ret = led_pwm_add(dev, priv, &led, child);
-+		if (ret) {
- 			of_node_put(child);
--			goto err;
-+			break;
- 		}
--		priv->num_leds++;
- 	}
- 
--	return 0;
--err:
--	led_pwm_cleanup(priv);
--
- 	return ret;
- }
- 
-@@ -166,51 +190,23 @@ static int led_pwm_probe(struct platform_device *pdev)
- 
- 	if (pdata) {
- 		for (i = 0; i < count; i++) {
--			struct led_pwm *cur_led = &pdata->leds[i];
--			struct led_pwm_data *led_dat = &priv->leds[i];
--
--			led_dat->pwm = devm_pwm_get(&pdev->dev, cur_led->name);
--			if (IS_ERR(led_dat->pwm)) {
--				ret = PTR_ERR(led_dat->pwm);
--				dev_err(&pdev->dev,
--					"unable to request PWM for %s\n",
--					cur_led->name);
--				goto err;
--			}
--
--			led_dat->cdev.name = cur_led->name;
--			led_dat->cdev.default_trigger = cur_led->default_trigger;
--			led_dat->active_low = cur_led->active_low;
--			led_dat->period = cur_led->pwm_period_ns;
--			led_dat->cdev.brightness_set = led_pwm_set;
--			led_dat->cdev.brightness = LED_OFF;
--			led_dat->cdev.max_brightness = cur_led->max_brightness;
--			led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME;
--
--			led_dat->can_sleep = pwm_can_sleep(led_dat->pwm);
--			if (led_dat->can_sleep)
--				INIT_WORK(&led_dat->work, led_pwm_work);
--
--			ret = led_classdev_register(&pdev->dev, &led_dat->cdev);
--			if (ret < 0)
--				goto err;
-+			ret = led_pwm_add(&pdev->dev, priv, &pdata->leds[i],
-+					  NULL);
-+			if (ret)
-+				break;
- 		}
--		priv->num_leds = count;
- 	} else {
--		ret = led_pwm_create_of(pdev, priv);
--		if (ret)
--			return ret;
-+		ret = led_pwm_create_of(&pdev->dev, priv);
-+	}
-+
-+	if (ret) {
-+		led_pwm_cleanup(priv);
-+		return ret;
- 	}
- 
- 	platform_set_drvdata(pdev, priv);
- 
- 	return 0;
--
--err:
--	priv->num_leds = i;
--	led_pwm_cleanup(priv);
--
--	return ret;
- }
- 
- static int led_pwm_remove(struct platform_device *pdev)
-diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
-index acbc3f2aaaf9..41c4033ec765 100644
---- a/drivers/mmc/core/core.c
-+++ b/drivers/mmc/core/core.c
-@@ -13,11 +13,13 @@
- #include <linux/module.h>
- #include <linux/init.h>
- #include <linux/interrupt.h>
-+#include <linux/clk.h>
- #include <linux/completion.h>
- #include <linux/device.h>
- #include <linux/delay.h>
- #include <linux/pagemap.h>
- #include <linux/err.h>
-+#include <linux/gpio.h>
- #include <linux/leds.h>
- #include <linux/scatterlist.h>
- #include <linux/log2.h>
-@@ -1504,6 +1506,43 @@ void mmc_set_driver_type(struct mmc_host *host, unsigned int drv_type)
- 	mmc_host_clk_release(host);
- }
- 
-+static void mmc_card_power_up(struct mmc_host *host)
-+{
-+	int i;
-+	struct gpio_desc **gds = host->card_reset_gpios;
-+
-+	for (i = 0; i < ARRAY_SIZE(host->card_reset_gpios); i++) {
-+		if (gds[i]) {
-+			dev_dbg(host->parent, "Asserting reset line %d", i);
-+			gpiod_set_value(gds[i], 1);
-+		}
-+	}
-+
-+	if (host->card_regulator) {
-+		dev_dbg(host->parent, "Enabling external regulator");
-+		if (regulator_enable(host->card_regulator))
-+			dev_err(host->parent, "Failed to enable external regulator");
-+	}
-+
-+	if (host->card_clk) {
-+		dev_dbg(host->parent, "Enabling external clock");
-+		clk_prepare_enable(host->card_clk);
-+	}
-+
-+	/* 2ms delay to let clocks and power settle */
-+	mmc_delay(20);
-+
-+	for (i = 0; i < ARRAY_SIZE(host->card_reset_gpios); i++) {
-+		if (gds[i]) {
-+			dev_dbg(host->parent, "Deasserting reset line %d", i);
-+			gpiod_set_value(gds[i], 0);
-+		}
-+	}
-+
-+	/* 2ms delay to after reset release */
-+	mmc_delay(20);
-+}
-+
- /*
-  * Apply power to the MMC stack.  This is a two-stage process.
-  * First, we enable power to the card without the clock running.
-@@ -1520,6 +1559,9 @@ void mmc_power_up(struct mmc_host *host, u32 ocr)
- 	if (host->ios.power_mode == MMC_POWER_ON)
- 		return;
- 
-+	/* Power up the card/module first, if needed */
-+	mmc_card_power_up(host);
-+
- 	mmc_host_clk_hold(host);
- 
- 	host->ios.vdd = fls(ocr) - 1;
-diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c
-index fdea825dbb24..c523f55b317c 100644
---- a/drivers/mmc/core/host.c
-+++ b/drivers/mmc/core/host.c
-@@ -12,14 +12,18 @@
-  *  MMC host class device management
-  */
- 
-+#include <linux/kernel.h>
-+#include <linux/clk.h>
- #include <linux/device.h>
- #include <linux/err.h>
-+#include <linux/gpio/consumer.h>
- #include <linux/idr.h>
- #include <linux/of.h>
- #include <linux/of_gpio.h>
- #include <linux/pagemap.h>
- #include <linux/export.h>
- #include <linux/leds.h>
-+#include <linux/regulator/consumer.h>
- #include <linux/slab.h>
- #include <linux/suspend.h>
- 
-@@ -457,6 +461,66 @@ int mmc_of_parse(struct mmc_host *host)
- 
- EXPORT_SYMBOL(mmc_of_parse);
- 
-+static int mmc_of_parse_child(struct mmc_host *host)
-+{
-+	struct device_node *np;
-+	struct clk *clk;
-+	int i;
-+
-+	if (!host->parent || !host->parent->of_node)
-+		return 0;
-+
-+	np = host->parent->of_node;
-+
-+	host->card_regulator = regulator_get(host->parent, "card-external-vcc");
-+	if (IS_ERR(host->card_regulator)) {
-+		if (PTR_ERR(host->card_regulator) == -EPROBE_DEFER)
-+			return PTR_ERR(host->card_regulator);
-+		host->card_regulator = NULL;
-+	}
-+
-+	/* Parse card power/reset/clock control */
-+	if (of_find_property(np, "card-reset-gpios", NULL)) {
-+		struct gpio_desc *gpd;
-+		int level = 0;
-+
-+		/*
-+		 * If the regulator is enabled, then we can hold the
-+		 * card in reset with an active high resets.  Otherwise,
-+		 * hold the resets low.
-+		 */
-+		if (host->card_regulator && regulator_is_enabled(host->card_regulator))
-+			level = 1;
-+
-+		for (i = 0; i < ARRAY_SIZE(host->card_reset_gpios); i++) {
-+			gpd = devm_gpiod_get_index(host->parent, "card-reset", i);
-+			if (IS_ERR(gpd)) {
-+				if (PTR_ERR(gpd) == -EPROBE_DEFER)
-+					return PTR_ERR(gpd);
-+				break;
-+			}
-+			gpiod_direction_output(gpd, gpiod_is_active_low(gpd) | level);
-+			host->card_reset_gpios[i] = gpd;
-+		}
-+
-+		gpd = devm_gpiod_get_index(host->parent, "card-reset", ARRAY_SIZE(host->card_reset_gpios));
-+		if (!IS_ERR(gpd)) {
-+			dev_warn(host->parent, "More reset gpios than we can handle");
-+			gpiod_put(gpd);
-+		}
-+	}
-+
-+	clk = of_clk_get_by_name(np, "card_ext_clock");
-+	if (IS_ERR(clk)) {
-+		if (PTR_ERR(clk) == -EPROBE_DEFER)
-+			return PTR_ERR(clk);
-+		clk = NULL;
-+	}
-+	host->card_clk = clk;
-+
-+	return 0;
-+}
-+
- /**
-  *	mmc_alloc_host - initialise the per-host structure.
-  *	@extra: sizeof private data structure
-@@ -536,6 +600,10 @@ int mmc_add_host(struct mmc_host *host)
- {
- 	int err;
- 
-+	err = mmc_of_parse_child(host);
-+	if (err)
-+		return err;
-+
- 	WARN_ON((host->caps & MMC_CAP_SDIO_IRQ) &&
- 		!host->ops->enable_sdio_irq);
- 
-diff --git a/drivers/mmc/core/sdio_irq.c b/drivers/mmc/core/sdio_irq.c
-index aaa90460ed23..5cc13c8d35bb 100644
---- a/drivers/mmc/core/sdio_irq.c
-+++ b/drivers/mmc/core/sdio_irq.c
-@@ -90,6 +90,15 @@ static int process_sdio_pending_irqs(struct mmc_host *host)
- 	return ret;
- }
- 
-+void sdio_run_irqs(struct mmc_host *host)
-+{
-+	mmc_claim_host(host);
-+	host->sdio_irq_pending = true;
-+	process_sdio_pending_irqs(host);
-+	mmc_release_host(host);
-+}
-+EXPORT_SYMBOL_GPL(sdio_run_irqs);
-+
- static int sdio_irq_thread(void *_host)
- {
- 	struct mmc_host *host = _host;
-@@ -189,14 +198,20 @@ static int sdio_card_irq_get(struct mmc_card *card)
- 	WARN_ON(!host->claimed);
- 
- 	if (!host->sdio_irqs++) {
--		atomic_set(&host->sdio_irq_thread_abort, 0);
--		host->sdio_irq_thread =
--			kthread_run(sdio_irq_thread, host, "ksdioirqd/%s",
--				mmc_hostname(host));
--		if (IS_ERR(host->sdio_irq_thread)) {
--			int err = PTR_ERR(host->sdio_irq_thread);
--			host->sdio_irqs--;
--			return err;
-+		if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
-+			atomic_set(&host->sdio_irq_thread_abort, 0);
-+			host->sdio_irq_thread =
-+				kthread_run(sdio_irq_thread, host,
-+					    "ksdioirqd/%s", mmc_hostname(host));
-+			if (IS_ERR(host->sdio_irq_thread)) {
-+				int err = PTR_ERR(host->sdio_irq_thread);
-+				host->sdio_irqs--;
-+				return err;
-+			}
-+		} else {
-+			mmc_host_clk_hold(host);
-+			host->ops->enable_sdio_irq(host, 1);
-+			mmc_host_clk_release(host);
- 		}
- 	}
- 
-@@ -211,8 +226,14 @@ static int sdio_card_irq_put(struct mmc_card *card)
- 	BUG_ON(host->sdio_irqs < 1);
- 
- 	if (!--host->sdio_irqs) {
--		atomic_set(&host->sdio_irq_thread_abort, 1);
--		kthread_stop(host->sdio_irq_thread);
-+		if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
-+			atomic_set(&host->sdio_irq_thread_abort, 1);
-+			kthread_stop(host->sdio_irq_thread);
-+		} else {
-+			mmc_host_clk_hold(host);
-+			host->ops->enable_sdio_irq(host, 0);
-+			mmc_host_clk_release(host);
-+		}
- 	}
- 
- 	return 0;
-diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
-index 8aaf8c1f3f63..d8c1f31ab37f 100644
---- a/drivers/mmc/host/Kconfig
-+++ b/drivers/mmc/host/Kconfig
-@@ -25,8 +25,7 @@ config MMC_PXA
- 	  If unsure, say N.
- 
- config MMC_SDHCI
--	tristate "Secure Digital Host Controller Interface support"
--	depends on HAS_DMA
-+	tristate
- 	help
- 	  This selects the generic Secure Digital Host Controller Interface.
- 	  It is used by manufacturers such as Texas Instruments(R), Ricoh(R)
-@@ -59,7 +58,8 @@ config MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER
- 
- config MMC_SDHCI_PCI
- 	tristate "SDHCI support on PCI bus"
--	depends on MMC_SDHCI && PCI
-+	depends on PCI && HAS_DMA
-+	select MMC_SDHCI
- 	help
- 	  This selects the PCI Secure Digital Host Controller Interface.
- 	  Most controllers found today are PCI devices.
-@@ -83,7 +83,8 @@ config MMC_RICOH_MMC
- 
- config MMC_SDHCI_ACPI
- 	tristate "SDHCI support for ACPI enumerated SDHCI controllers"
--	depends on MMC_SDHCI && ACPI
-+	depends on ACPI && HAS_DMA
-+	select MMC_SDHCI
- 	help
- 	  This selects support for ACPI enumerated SDHCI controllers,
- 	  identified by ACPI Compatibility ID PNP0D40 or specific
-@@ -94,8 +95,8 @@ config MMC_SDHCI_ACPI
- 	  If unsure, say N.
- 
- config MMC_SDHCI_PLTFM
--	tristate "SDHCI platform and OF driver helper"
--	depends on MMC_SDHCI
-+	tristate
-+	select MMC_SDHCI
- 	help
- 	  This selects the common helper functions support for Secure Digital
- 	  Host Controller Interface based platform and OF drivers.
-@@ -106,8 +107,8 @@ config MMC_SDHCI_PLTFM
- 
- config MMC_SDHCI_OF_ARASAN
- 	tristate "SDHCI OF support for the Arasan SDHCI controllers"
--	depends on MMC_SDHCI_PLTFM
--	depends on OF
-+	depends on OF && HAS_DMA
-+	select MMC_SDHCI_PLTFM
- 	help
- 	  This selects the Arasan Secure Digital Host Controller Interface
- 	  (SDHCI). This hardware is found e.g. in Xilinx' Zynq SoC.
-@@ -118,9 +119,9 @@ config MMC_SDHCI_OF_ARASAN
- 
- config MMC_SDHCI_OF_ESDHC
- 	tristate "SDHCI OF support for the Freescale eSDHC controller"
--	depends on MMC_SDHCI_PLTFM
--	depends on PPC_OF
-+	depends on PPC_OF && HAS_DMA
- 	select MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER
-+	select MMC_SDHCI_PLTFM
- 	help
- 	  This selects the Freescale eSDHC controller support.
- 
-@@ -130,9 +131,9 @@ config MMC_SDHCI_OF_ESDHC
- 
- config MMC_SDHCI_OF_HLWD
- 	tristate "SDHCI OF support for the Nintendo Wii SDHCI controllers"
--	depends on MMC_SDHCI_PLTFM
--	depends on PPC_OF
-+	depends on PPC_OF && HAS_DMA
- 	select MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER
-+	select MMC_SDHCI_PLTFM
- 	help
- 	  This selects the Secure Digital Host Controller Interface (SDHCI)
- 	  found in the "Hollywood" chipset of the Nintendo Wii video game
-@@ -144,8 +145,8 @@ config MMC_SDHCI_OF_HLWD
- 
- config MMC_SDHCI_CNS3XXX
- 	tristate "SDHCI support on the Cavium Networks CNS3xxx SoC"
--	depends on ARCH_CNS3XXX
--	depends on MMC_SDHCI_PLTFM
-+	depends on ARCH_CNS3XXX && HAS_DMA
-+	select MMC_SDHCI_PLTFM
- 	help
- 	  This selects the SDHCI support for CNS3xxx System-on-Chip devices.
- 
-@@ -155,9 +156,9 @@ config MMC_SDHCI_CNS3XXX
- 
- config MMC_SDHCI_ESDHC_IMX
- 	tristate "SDHCI support for the Freescale eSDHC/uSDHC i.MX controller"
--	depends on ARCH_MXC
--	depends on MMC_SDHCI_PLTFM
-+	depends on ARCH_MXC && HAS_DMA
- 	select MMC_SDHCI_IO_ACCESSORS
-+	select MMC_SDHCI_PLTFM
- 	help
- 	  This selects the Freescale eSDHC/uSDHC controller support
- 	  found on i.MX25, i.MX35 i.MX5x and i.MX6x.
-@@ -168,9 +169,9 @@ config MMC_SDHCI_ESDHC_IMX
- 
- config MMC_SDHCI_DOVE
- 	tristate "SDHCI support on Marvell's Dove SoC"
--	depends on ARCH_DOVE
--	depends on MMC_SDHCI_PLTFM
-+	depends on ARCH_DOVE && HAS_DMA
- 	select MMC_SDHCI_IO_ACCESSORS
-+	select MMC_SDHCI_PLTFM
- 	help
- 	  This selects the Secure Digital Host Controller Interface in
- 	  Marvell's Dove SoC.
-@@ -181,9 +182,9 @@ config MMC_SDHCI_DOVE
- 
- config MMC_SDHCI_TEGRA
- 	tristate "SDHCI platform support for the Tegra SD/MMC Controller"
--	depends on ARCH_TEGRA
--	depends on MMC_SDHCI_PLTFM
-+	depends on ARCH_TEGRA && HAS_DMA
- 	select MMC_SDHCI_IO_ACCESSORS
-+	select MMC_SDHCI_PLTFM
- 	help
- 	  This selects the Tegra SD/MMC controller. If you have a Tegra
- 	  platform with SD or MMC devices, say Y or M here.
-@@ -192,7 +193,8 @@ config MMC_SDHCI_TEGRA
- 
- config MMC_SDHCI_S3C
- 	tristate "SDHCI support on Samsung S3C SoC"
--	depends on MMC_SDHCI && PLAT_SAMSUNG
-+	depends on PLAT_SAMSUNG && HAS_DMA
-+	select MMC_SDHCI
- 	help
- 	  This selects the Secure Digital Host Controller Interface (SDHCI)
- 	  often referrered to as the HSMMC block in some of the Samsung S3C
-@@ -204,8 +206,8 @@ config MMC_SDHCI_S3C
- 
- config MMC_SDHCI_SIRF
- 	tristate "SDHCI support on CSR SiRFprimaII and SiRFmarco SoCs"
--	depends on ARCH_SIRF
--	depends on MMC_SDHCI_PLTFM
-+	depends on ARCH_SIRF && HAS_DMA
-+	select MMC_SDHCI_PLTFM
- 	help
- 	  This selects the SDHCI support for SiRF System-on-Chip devices.
- 
-@@ -215,8 +217,7 @@ config MMC_SDHCI_SIRF
- 
- config MMC_SDHCI_PXAV3
- 	tristate "Marvell MMP2 SD Host Controller support (PXAV3)"
--	depends on CLKDEV_LOOKUP
--	select MMC_SDHCI
-+	depends on CLKDEV_LOOKUP && HAS_DMA
- 	select MMC_SDHCI_PLTFM
- 	default CPU_MMP2
- 	help
-@@ -228,8 +229,7 @@ config MMC_SDHCI_PXAV3
- 
- config MMC_SDHCI_PXAV2
- 	tristate "Marvell PXA9XX SD Host Controller support (PXAV2)"
--	depends on CLKDEV_LOOKUP
--	select MMC_SDHCI
-+	depends on CLKDEV_LOOKUP && HAS_DMA
- 	select MMC_SDHCI_PLTFM
- 	default CPU_PXA910
- 	help
-@@ -241,7 +241,8 @@ config MMC_SDHCI_PXAV2
- 
- config MMC_SDHCI_SPEAR
- 	tristate "SDHCI support on ST SPEAr platform"
--	depends on MMC_SDHCI && PLAT_SPEAR
-+	depends on PLAT_SPEAR && HAS_DMA
-+	select MMC_SDHCI
- 	help
- 	  This selects the Secure Digital Host Controller Interface (SDHCI)
- 	  often referrered to as the HSMMC block in some of the ST SPEAR range
-@@ -263,7 +264,7 @@ config MMC_SDHCI_S3C_DMA
- 
- config MMC_SDHCI_BCM_KONA
- 	tristate "SDHCI support on Broadcom KONA platform"
--	depends on ARCH_BCM_MOBILE
-+	depends on ARCH_BCM_MOBILE && HAS_DMA
- 	select MMC_SDHCI_PLTFM
- 	help
- 	  This selects the Broadcom Kona Secure Digital Host Controller
-@@ -274,9 +275,9 @@ config MMC_SDHCI_BCM_KONA
- 
- config MMC_SDHCI_BCM2835
- 	tristate "SDHCI platform support for the BCM2835 SD/MMC Controller"
--	depends on ARCH_BCM2835
--	depends on MMC_SDHCI_PLTFM
-+	depends on ARCH_BCM2835 && HAS_DMA
- 	select MMC_SDHCI_IO_ACCESSORS
-+	select MMC_SDHCI_PLTFM
- 	help
- 	  This selects the BCM2835 SD/MMC controller. If you have a BCM2835
- 	  platform with SD or MMC devices, say Y or M here.
-diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
-index cced599d5aeb..a2c12ebb376e 100644
---- a/drivers/mmc/host/dw_mmc.c
-+++ b/drivers/mmc/host/dw_mmc.c
-@@ -2140,6 +2140,8 @@ static int dw_mci_init_slot(struct dw_mci *host, unsigned int id)
- 	if (!mmc)
- 		return -ENOMEM;
- 
-+	mmc_of_parse(mmc);
-+
- 	slot = mmc_priv(mmc);
- 	slot->id = id;
- 	slot->mmc = mmc;
-diff --git a/drivers/mmc/host/sdhci-acpi.c b/drivers/mmc/host/sdhci-acpi.c
-index ebb3f392b589..8ce3c28cb76e 100644
---- a/drivers/mmc/host/sdhci-acpi.c
-+++ b/drivers/mmc/host/sdhci-acpi.c
-@@ -102,11 +102,19 @@ static void sdhci_acpi_int_hw_reset(struct sdhci_host *host)
- }
- 
- static const struct sdhci_ops sdhci_acpi_ops_dflt = {
-+	.set_clock = sdhci_set_clock,
- 	.enable_dma = sdhci_acpi_enable_dma,
-+	.set_bus_width = sdhci_set_bus_width,
-+	.reset = sdhci_reset,
-+	.set_uhs_signaling = sdhci_set_uhs_signaling,
- };
- 
- static const struct sdhci_ops sdhci_acpi_ops_int = {
-+	.set_clock = sdhci_set_clock,
- 	.enable_dma = sdhci_acpi_enable_dma,
-+	.set_bus_width = sdhci_set_bus_width,
-+	.reset = sdhci_reset,
-+	.set_uhs_signaling = sdhci_set_uhs_signaling,
- 	.hw_reset   = sdhci_acpi_int_hw_reset,
- };
- 
-diff --git a/drivers/mmc/host/sdhci-bcm-kona.c b/drivers/mmc/host/sdhci-bcm-kona.c
-index 6f166e63b817..dd780c315a63 100644
---- a/drivers/mmc/host/sdhci-bcm-kona.c
-+++ b/drivers/mmc/host/sdhci-bcm-kona.c
-@@ -206,9 +206,13 @@ static void sdhci_bcm_kona_init_74_clocks(struct sdhci_host *host,
- }
- 
- static struct sdhci_ops sdhci_bcm_kona_ops = {
-+	.set_clock = sdhci_set_clock,
- 	.get_max_clock = sdhci_bcm_kona_get_max_clk,
- 	.get_timeout_clock = sdhci_bcm_kona_get_timeout_clock,
- 	.platform_send_init_74_clocks = sdhci_bcm_kona_init_74_clocks,
-+	.set_bus_width = sdhci_set_bus_width,
-+	.reset = sdhci_reset,
-+	.set_uhs_signaling = sdhci_set_uhs_signaling,
- 	.card_event = sdhci_bcm_kona_card_event,
- };
- 
-diff --git a/drivers/mmc/host/sdhci-bcm2835.c b/drivers/mmc/host/sdhci-bcm2835.c
-index f6d8d67c545f..46af9a439d7b 100644
---- a/drivers/mmc/host/sdhci-bcm2835.c
-+++ b/drivers/mmc/host/sdhci-bcm2835.c
-@@ -131,8 +131,12 @@ static const struct sdhci_ops bcm2835_sdhci_ops = {
- 	.read_l = bcm2835_sdhci_readl,
- 	.read_w = bcm2835_sdhci_readw,
- 	.read_b = bcm2835_sdhci_readb,
-+	.set_clock = sdhci_set_clock,
- 	.get_max_clock = sdhci_pltfm_clk_get_max_clock,
- 	.get_min_clock = bcm2835_sdhci_get_min_clock,
-+	.set_bus_width = sdhci_set_bus_width,
-+	.reset = sdhci_reset,
-+	.set_uhs_signaling = sdhci_set_uhs_signaling,
- };
- 
- static const struct sdhci_pltfm_data bcm2835_sdhci_pdata = {
-diff --git a/drivers/mmc/host/sdhci-cns3xxx.c b/drivers/mmc/host/sdhci-cns3xxx.c
-index f2cc26633cb2..14b74075589a 100644
---- a/drivers/mmc/host/sdhci-cns3xxx.c
-+++ b/drivers/mmc/host/sdhci-cns3xxx.c
-@@ -30,13 +30,12 @@ static void sdhci_cns3xxx_set_clock(struct sdhci_host *host, unsigned int clock)
- 	u16 clk;
- 	unsigned long timeout;
- 
--	if (clock == host->clock)
--		return;
-+	host->mmc->actual_clock = 0;
- 
- 	sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL);
- 
- 	if (clock == 0)
--		goto out;
-+		return;
- 
- 	while (host->max_clk / div > clock) {
- 		/*
-@@ -75,13 +74,14 @@ static void sdhci_cns3xxx_set_clock(struct sdhci_host *host, unsigned int clock)
- 
- 	clk |= SDHCI_CLOCK_CARD_EN;
- 	sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
--out:
--	host->clock = clock;
- }
- 
- static const struct sdhci_ops sdhci_cns3xxx_ops = {
- 	.get_max_clock	= sdhci_cns3xxx_get_max_clk,
- 	.set_clock	= sdhci_cns3xxx_set_clock,
-+	.set_bus_width	= sdhci_set_bus_width,
-+	.reset          = sdhci_reset,
-+	.set_uhs_signaling = sdhci_set_uhs_signaling,
- };
- 
- static const struct sdhci_pltfm_data sdhci_cns3xxx_pdata = {
-@@ -90,8 +90,7 @@ static const struct sdhci_pltfm_data sdhci_cns3xxx_pdata = {
- 		  SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK |
- 		  SDHCI_QUIRK_INVERTED_WRITE_PROTECT |
- 		  SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN |
--		  SDHCI_QUIRK_BROKEN_TIMEOUT_VAL |
--		  SDHCI_QUIRK_NONSTANDARD_CLOCK,
-+		  SDHCI_QUIRK_BROKEN_TIMEOUT_VAL,
- };
- 
- static int sdhci_cns3xxx_probe(struct platform_device *pdev)
-diff --git a/drivers/mmc/host/sdhci-dove.c b/drivers/mmc/host/sdhci-dove.c
-index 736d7a2eb7ec..0d315f4496c8 100644
---- a/drivers/mmc/host/sdhci-dove.c
-+++ b/drivers/mmc/host/sdhci-dove.c
-@@ -86,6 +86,10 @@ static u32 sdhci_dove_readl(struct sdhci_host *host, int reg)
- static const struct sdhci_ops sdhci_dove_ops = {
- 	.read_w	= sdhci_dove_readw,
- 	.read_l	= sdhci_dove_readl,
-+	.set_clock = sdhci_set_clock,
-+	.set_bus_width = sdhci_set_bus_width,
-+	.reset = sdhci_reset,
-+	.set_uhs_signaling = sdhci_set_uhs_signaling,
- };
- 
- static const struct sdhci_pltfm_data sdhci_dove_pdata = {
-diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
-index b841bb7cd371..4866d802f9e2 100644
---- a/drivers/mmc/host/sdhci-esdhc-imx.c
-+++ b/drivers/mmc/host/sdhci-esdhc-imx.c
-@@ -160,7 +160,6 @@ struct pltfm_imx_data {
- 		MULTIBLK_IN