aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-11-27 16:39:04 -0800
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-11-27 16:39:04 -0800
commit0b6cbae6e8ff595f9b1c37f9d55b9f924f36dc81 (patch)
tree86303fd404c95138005d0bf6839e6eb687d3db48
parent69bc983ee8450617b575ea820e3cd55a7fef9b99 (diff)
downloadltsi-kernel-0b6cbae6e8ff595f9b1c37f9d55b9f924f36dc81.tar.gz
some renesas patches added
-rw-r--r--patches.renesas/0001-ARM-shmobile-r8a73a4-Add-IRQC-clock-to-device-tree.patch75
-rw-r--r--patches.renesas/0002-ARM-shmobile-r8a7790-Add-IRQC-clock-to-device-tree.patch61
-rw-r--r--patches.renesas/0003-ARM-shmobile-r8a7791-Add-IRQC-clock-to-device-tree.patch61
-rw-r--r--patches.renesas/0004-ARM-shmobile-r8a7794-Add-IRQC-clock-to-device-tree.patch61
-rw-r--r--patches.renesas/0005-clk-emev2-Silence-sparse-warnings.patch33
-rw-r--r--patches.renesas/0006-clk-shmobile-Add-r8a7778-SoC-to-MSTP-bindings.patch29
-rw-r--r--patches.renesas/0007-clk-shmobile-Add-r8a7793-SoC-to-MSTP-bindings.patch35
-rw-r--r--patches.renesas/0008-clk-shmobile-mstp-Document-mandatory-compatible-fall.patch35
-rw-r--r--patches.renesas/0009-i2c-sh_mobile-add-errata-workaround.patch111
-rw-r--r--patches.renesas/0010-i2c-sh_mobile-use-adapter-default-for-timeout.patch34
-rw-r--r--patches.renesas/0011-i2c-sh_mobile-use-proper-type-for-timeout.patch46
-rw-r--r--patches.renesas/0012-irqchip-Constify-irq_domain_ops.patch233
-rw-r--r--patches.renesas/0013-irqchip-renesas-intc-irqpin-Improve-binding-document.patch86
-rw-r--r--patches.renesas/0014-irqchip-irqc-Remove-platform-data-support.patch123
-rw-r--r--patches.renesas/0015-ARM-shmobile-r8a7790-Remove-MSIOF-address-from-devic.patch62
-rw-r--r--patches.renesas/0016-ARM-shmobile-r8a7791-Remove-MSIOF-address-from-devic.patch67
-rw-r--r--patches.renesas/0017-ARM-shmobile-r8a7740-dtsi-Fix-SCIFB-naming.patch31
-rw-r--r--patches.renesas/0018-ARM-shmobile-sh73a0-dtsi-Fix-SCIFB-naming.patch31
-rw-r--r--patches.renesas/0019-ARM-shmobile-defconfig-Replace-USB_RCAR_GEN2_PHY-by-.patch51
-rw-r--r--patches.renesas/0020-ARM-shmobile-r8a7740-dtsi-Use-generic-names-for-devi.patch59
-rw-r--r--patches.renesas/0021-ARM-shmobile-r8a7778-dtsi-Use-generic-names-for-devi.patch32
-rw-r--r--patches.renesas/0022-ARM-shmobile-r8a7779-dtsi-Use-generic-names-for-devi.patch32
-rw-r--r--patches.renesas/0023-ARM-shmobile-r8a7790-dtsi-Use-generic-names-for-devi.patch32
-rw-r--r--patches.renesas/0024-ARM-shmobile-r8a7791-dtsi-Use-generic-names-for-devi.patch32
-rw-r--r--patches.renesas/0025-ARM-shmobile-sh73a0-dtsi-Use-generic-names-for-devic.patch59
-rw-r--r--patches.renesas/0026-ARM-shmobile-ape6evm-dts-Use-generic-names-for-devic.patch32
-rw-r--r--patches.renesas/0027-ARM-shmobile-kzm9d-dts-Use-generic-names-for-device-.patch42
-rw-r--r--patches.renesas/0028-ARM-shmobile-marzen-dts-Use-generic-names-for-device.patch45
-rw-r--r--patches.renesas/0029-ARM-shmobile-armadillo800eva-dts-Use-generic-names-f.patch32
-rw-r--r--patches.renesas/0030-ARM-shmobile-henninger-dts-Add-nor-jedec-compatible-.patch35
-rw-r--r--patches.renesas/0031-ARM-shmobile-bockw-reference-dts-Add-nor-jedec-compa.patch35
-rw-r--r--patches.renesas/0032-ARM-shmobile-lager-dts-Add-nor-jedec-compatible-valu.patch35
-rw-r--r--patches.renesas/0033-ARM-shmobile-bockw-dts-Add-nor-jedec-compatible-valu.patch35
-rw-r--r--patches.renesas/0034-ARM-shmobile-koelsch-dts-Add-nor-jedec-compatible-va.patch35
-rw-r--r--patches.renesas/0035-ARM-shmobile-bockw-dts-Use-generic-names-for-device-.patch32
-rw-r--r--patches.renesas/0036-ARM-shmobile-lager-dts-Use-generic-names-for-device-.patch32
-rw-r--r--patches.renesas/0037-ARM-shmobile-koelsch-dts-Use-generic-names-for-devic.patch32
-rw-r--r--patches.renesas/0038-ARM-shmobile-kzm9g-dts-Configure-the-HOME-key-as-wak.patch32
-rw-r--r--patches.renesas/0039-ARM-shmobile-r8a7790-add-USB-DMAC-device-nodes.patch50
-rw-r--r--patches.renesas/0040-ARM-shmobile-r8a7790-Enable-DMA-for-HSUSB.patch32
-rw-r--r--patches.renesas/0041-ARM-shmobile-r8a7791-add-USB-DMAC-device-nodes.patch50
-rw-r--r--patches.renesas/0042-ARM-shmobile-r8a7791-Enable-DMA-for-HSUSB.patch32
-rw-r--r--patches.renesas/0043-ARM-shmobile-lager-dts-Replace-nor-jedec-by-jedec-sp.patch34
-rw-r--r--patches.renesas/0044-ARM-shmobile-koelsch-dts-Replace-nor-jedec-by-jedec-.patch34
-rw-r--r--patches.renesas/0045-ARM-shmobile-bockw-reference-dts-Replace-nor-jedec-b.patch34
-rw-r--r--patches.renesas/0046-ARM-shmobile-henninger-dts-Replace-nor-jedec-by-jede.patch34
-rw-r--r--patches.renesas/0047-ARM-shmobile-bockw-dts-Replace-nor-jedec-by-jedec-sp.patch34
-rw-r--r--patches.renesas/0048-ARM-shmobile-r8a7790-add-MMCIF-max-frequency.patch37
-rw-r--r--patches.renesas/0049-ARM-shmobile-r8a7791-add-MMCIF-max-frequency.patch28
-rw-r--r--patches.renesas/0050-ARM-shmobile-only-select-sound-drivers-that-build.patch52
-rw-r--r--patches.renesas/0051-ARM-shmobile-r8a7794-dtsi-Describe-DMA-for-the-seria.patch185
-rw-r--r--patches.renesas/0052-ARM-shmobile-r8a7791-dtsi-Describe-DMA-for-the-seria.patch185
-rw-r--r--patches.renesas/0053-ARM-shmobile-r8a7790-dtsi-Describe-DMA-for-the-seria.patch113
-rw-r--r--patches.renesas/0055-ARM-shmobile-r8a7740-remove-I2C-errata-handling.patch101
-rw-r--r--patches.renesas/0056-phy-core-Check-requested-PHY-status-in-_of_phy_get.patch99
-rw-r--r--patches.renesas/0057-phy-rcar-gen2-Add-support-for-R-Car-E2.patch45
-rw-r--r--patches.renesas/0058-usb-phy-Remove-the-phy-rcar-gen2-usb-driver.patch345
-rw-r--r--patches.renesas/0059-pinctrl-allow-exlusive-GPIO-mux-pin-allocation.patch135
-rw-r--r--patches.renesas/0060-pinctrl-move-strict-option-to-pinmux_ops.patch130
-rw-r--r--patches.renesas/0061-pinctrl-use-ERR_CAST-instead-of-ERR_PTR-PTR_ERR.patch31
-rw-r--r--patches.renesas/0062-pinctrl-Grammar-s-used-in-as-used-as.patch29
-rw-r--r--patches.renesas/0063-pinctrl-improve-debugfs-for-strict-controllers.patch81
-rw-r--r--patches.renesas/0064-pinctrl-remove-useless-const-qualifier.patch33
-rw-r--r--patches.renesas/0065-pinctrl-use-const-struct-.-rather-than-struct-.-cons.patch36
-rw-r--r--patches.renesas/0066-pinctrl-fix-confusing-debug-message-in-pinctrl_regis.patch37
-rw-r--r--patches.renesas/0067-pinctrl-don-t-print-unavailable-function-groups.patch38
-rw-r--r--patches.renesas/0068-pinctrl-make-pinctrl_register-return-proper-error-co.patch713
-rw-r--r--patches.renesas/0069-dmaengine-rcar-dmac-fixup-spinlock-in-rcar-dmac.patch175
-rw-r--r--patches.renesas/0070-dmaengine-rcar-dmac-Use-DECLARE_BITMAP.patch31
-rw-r--r--patches.renesas/0071-drm-rcar-du-Document-the-rcar_du_crtc-structure.patch42
-rw-r--r--patches.renesas/0072-drm-rcar-du-Document-the-rcar_du_plane_state-structu.patch44
-rw-r--r--patches.renesas/0073-drm-rcar-du-Move-properties-from-rcar_du_planes-to-r.patch189
-rw-r--r--patches.renesas/0074-drm-rcar-du-Embed-rcar_du_planes-structure-into-rcar.patch139
-rw-r--r--patches.renesas/0075-drm-rcar-du-Rename-to_rcar_du_plane_state-to-to_rcar.patch180
-rw-r--r--patches.renesas/0076-drm-rcar-du-Add-plane-allocation-debugging.patch119
-rw-r--r--patches.renesas/0077-drm-rcar-du-Keep-plane-to-CRTC-associations-when-dis.patch141
-rw-r--r--patches.renesas/0078-drm-rcar-du-Consider-plane-to-CRTC-associations-in-t.patch72
-rw-r--r--patches.renesas/0079-drm-rcar-du-Store-the-number-of-CRTCs-per-group-in-t.patch83
-rw-r--r--patches.renesas/0080-drm-rcar-du-Split-planes-pre-association-4-4-between.patch55
-rw-r--r--patches.renesas/0081-drm-rcar-du-Print-the-error-value-when-DRM-KMS-init-.patch31
-rw-r--r--patches.renesas/0082-drm-rcar-du-Disable-all-planes-when-stopping-the-CRT.patch51
-rw-r--r--patches.renesas/0083-drm-rcar-du-Fix-crash-with-groups-that-have-less-tha.patch108
-rw-r--r--patches.renesas/0084-drm-rcar-du-Clarify-error-message-when-encoder-initi.patch48
-rw-r--r--patches.renesas/0085-drm-rcar-du-Convert-rcar_du_encoders_init_one-return.patch70
-rw-r--r--patches.renesas/0086-drm-rcar-du-Clean-up-planes-in-the-error-paths-of-.a.patch57
-rw-r--r--patches.renesas/0087-drm-rcar-du-Use-the-drm-atomic-state-duplication-hel.patch55
-rw-r--r--patches.renesas/0088-i2c-add-FUNC-flag-for-slave-capabilities.patch31
-rw-r--r--patches.renesas/0089-i2c-constify-platform_device_id.patch63
-rw-r--r--patches.renesas/0090-i2c-rcar-report-slave-capabilities-to-users.patch31
-rw-r--r--patches.renesas/0091-i2c-rcar-use-adapter-default-for-timeout.patch34
-rw-r--r--patches.renesas/0092-i2c-rcar-use-proper-type-for-timeout.patch33
-rw-r--r--patches.renesas/0093-media-rcar-vin-use-monotonic-timestamps.patch34
-rw-r--r--patches.renesas/0094-sh-pfc-fix-sparse-GPIOs-for-R-Car-SoCs.patch39
-rw-r--r--patches.renesas/0095-ASoC-soc-pcm-DPCM-cares-BE-format.patch118
-rw-r--r--patches.renesas/0096-ASoC-rsnd-add-rsnd_dai_to_priv-macro.patch43
-rw-r--r--patches.renesas/0097-ASoC-rsnd-make-sure-it-uses-lock-when-it-calls-rsnd_.patch123
-rw-r--r--patches.renesas/0098-ASoC-rsnd-tidyup-SSI-parent-related-function-macro-n.patch78
-rw-r--r--patches.renesas/0099-ASoC-rsnd-make-sure-SSI-parent-child-uses-same-numbe.patch93
-rw-r--r--patches.renesas/0100-ASoC-rsnd-care-snd_kcontrol-s-index.patch39
-rw-r--r--patches.renesas/0101-ASoC-rsnd-Use-generic-names-for-device-nodes.patch32
-rw-r--r--patches.renesas/0102-ASoC-rsnd-revert-lock-for-calls-to-rsnd_dai_call.patch126
-rw-r--r--patches.renesas/0103-ASoC-rsnd-indicate-unknown-HW-start.patch38
-rw-r--r--patches.renesas/0104-ASoC-rsnd-add-rsnd_dai_stream_quit.patch70
-rw-r--r--patches.renesas/0105-ASoC-rsnd-rsrc-card-uses-FE-BE-merged-format-when-DP.patch30
-rw-r--r--patches.renesas/0106-ASoC-rsnd-spin-lock-for-interrupt-handler.patch165
-rw-r--r--patches.renesas/0107-ASoC-rsnd-Document-r8a7778-specific-binding.patch31
-rw-r--r--patches.renesas/0108-ASoC-rsnd-don-t-care-under-over-run-error-when-PIO.patch61
-rw-r--r--patches.renesas/0109-ASoC-rsnd-don-t-call-snd_pcm_period_elapsed-under-sp.patch148
-rw-r--r--patches.renesas/0110-ASoC-rsrc-card-used-fe.xxx-be.xxx-name-for-dai_link.patch72
-rw-r--r--patches.renesas/0111-ASoC-rsrc-card-tidyup-priv-snd_card-setup-timing.patch74
-rw-r--r--patches.renesas/0112-ASoC-rsrc-card-enable-multi-cpu-codec-for-DPCM.patch90
-rw-r--r--patches.renesas/0113-ASoC-rsrc-card-remove-unused-name.patch29
-rw-r--r--patches.renesas/0114-ASoC-rsnd-card-tidyup-rsrc_priv_to_.patch50
-rw-r--r--patches.renesas/0115-ASoC-rsrc-card-move-rsrc_card_parse_daifmt-to-upper-.patch108
-rw-r--r--patches.renesas/0116-ASoC-rsrc-card-tidyup-return-value-of-clock-error.patch34
-rw-r--r--patches.renesas/0117-ASoC-rsrc-card-cleanup-for-DPCM.patch513
-rw-r--r--patches.renesas/0118-ASoC-rsnd-count-each-mod-SSI-SRC-DVC.patch109
-rw-r--r--patches.renesas/0119-ASoC-rsnd-rsnd_mod-has-rsnd_priv.patch119
-rw-r--r--patches.renesas/0120-ASoC-rsnd-adds-struct-rsnd_dai_stream-as-on-each-fuc.patch396
-rw-r--r--patches.renesas/0121-ASoC-rsnd-add-common-interrupt-handler-for-SSI-SRC-D.patch72
-rw-r--r--patches.renesas/0122-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-rsnd_get_adinr.patch215
-rw-r--r--patches.renesas/0123-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-rsnd_dma_xxx.patch534
-rw-r--r--patches.renesas/0124-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-rsnd_ssi_xxx.patch162
-rw-r--r--patches.renesas/0125-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-rsnd_src_xxx.patch212
-rw-r--r--patches.renesas/0126-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-snd_kcontrol.patch264
-rw-r--r--patches.renesas/0127-ASoC-rsnd-move-rsnd_mod_is_working-to-rsnd_io_is_wor.patch103
-rw-r--r--patches.renesas/0128-ASoC-rsnd-remove-io-from-rsnd_mod.patch62
-rw-r--r--patches.renesas/0129-ASoC-rsrc-card-remove-unused-ret.patch33
-rw-r--r--series133
129 files changed, 11282 insertions, 4 deletions
diff --git a/patches.renesas/0001-ARM-shmobile-r8a73a4-Add-IRQC-clock-to-device-tree.patch b/patches.renesas/0001-ARM-shmobile-r8a73a4-Add-IRQC-clock-to-device-tree.patch
new file mode 100644
index 00000000000000..146a766cacd116
--- /dev/null
+++ b/patches.renesas/0001-ARM-shmobile-r8a73a4-Add-IRQC-clock-to-device-tree.patch
@@ -0,0 +1,75 @@
+From 51952303042eb832c7c99fc9a3436a4033e989f9 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Wed, 18 Mar 2015 19:55:58 +0100
+Subject: [PATCH 001/129] ARM: shmobile: r8a73a4: Add IRQC clock to device tree
+
+Link the external IRQ controllers irqc0 and irqc1 to the IRQC module
+clock, so they can be power managed using that clock.
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+[horms: corrected typo in changelog to refer to r8a73a4]
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+
+(cherry picked from commit 1c2a7eb7169b855f6c3e9db036c6767052528ffe)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a73a4.dtsi | 11 +++++++----
+ include/dt-bindings/clock/r8a73a4-clock.h | 1 +
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+diff --git a/arch/arm/boot/dts/r8a73a4.dtsi b/arch/arm/boot/dts/r8a73a4.dtsi
+index 0fd889f88109..7ee22a41c6c9 100644
+--- a/arch/arm/boot/dts/r8a73a4.dtsi
++++ b/arch/arm/boot/dts/r8a73a4.dtsi
+@@ -163,6 +163,7 @@
+ <0 29 IRQ_TYPE_LEVEL_HIGH>,
+ <0 30 IRQ_TYPE_LEVEL_HIGH>,
+ <0 31 IRQ_TYPE_LEVEL_HIGH>;
++ clocks = <&mstp4_clks R8A73A4_CLK_IRQC>;
+ power-domains = <&pd_c4>;
+ };
+
+@@ -197,6 +198,7 @@
+ <0 55 IRQ_TYPE_LEVEL_HIGH>,
+ <0 56 IRQ_TYPE_LEVEL_HIGH>,
+ <0 57 IRQ_TYPE_LEVEL_HIGH>;
++ clocks = <&mstp4_clks R8A73A4_CLK_IRQC>;
+ power-domains = <&pd_c4>;
+ };
+
+@@ -724,15 +726,16 @@
+ mstp4_clks: mstp4_clks@e6150140 {
+ compatible = "renesas,r8a73a4-mstp-clocks", "renesas,cpg-mstp-clocks";
+ reg = <0 0xe6150140 0 4>, <0 0xe615004c 0 4>;
+- clocks = <&main_div2_clk>, <&cpg_clocks R8A73A4_CLK_HP>,
++ clocks = <&main_div2_clk>, <&main_div2_clk>,
++ <&cpg_clocks R8A73A4_CLK_HP>,
+ <&cpg_clocks R8A73A4_CLK_HP>;
+ #clock-cells = <1>;
+ clock-indices = <
+- R8A73A4_CLK_IIC5 R8A73A4_CLK_IIC4
+- R8A73A4_CLK_IIC3
++ R8A73A4_CLK_IRQC R8A73A4_CLK_IIC5
++ R8A73A4_CLK_IIC4 R8A73A4_CLK_IIC3
+ >;
+ clock-output-names =
+- "iic5", "iic4", "iic3";
++ "irqc", "iic5", "iic4", "iic3";
+ };
+ mstp5_clks: mstp5_clks@e6150144 {
+ compatible = "renesas,r8a73a4-mstp-clocks", "renesas,cpg-mstp-clocks";
+diff --git a/include/dt-bindings/clock/r8a73a4-clock.h b/include/dt-bindings/clock/r8a73a4-clock.h
+index 9a4b4c9ca44a..dd11ecdf837e 100644
+--- a/include/dt-bindings/clock/r8a73a4-clock.h
++++ b/include/dt-bindings/clock/r8a73a4-clock.h
+@@ -54,6 +54,7 @@
+ #define R8A73A4_CLK_IIC3 11
+ #define R8A73A4_CLK_IIC4 10
+ #define R8A73A4_CLK_IIC5 9
++#define R8A73A4_CLK_IRQC 7
+
+ /* MSTP5 */
+ #define R8A73A4_CLK_THERMAL 22
+--
+2.6.2
+
diff --git a/patches.renesas/0002-ARM-shmobile-r8a7790-Add-IRQC-clock-to-device-tree.patch b/patches.renesas/0002-ARM-shmobile-r8a7790-Add-IRQC-clock-to-device-tree.patch
new file mode 100644
index 00000000000000..dfa9109b1dbf52
--- /dev/null
+++ b/patches.renesas/0002-ARM-shmobile-r8a7790-Add-IRQC-clock-to-device-tree.patch
@@ -0,0 +1,61 @@
+From 515b2ec08123ba99a6751ebd27e6687fd60eb372 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Wed, 18 Mar 2015 19:55:59 +0100
+Subject: [PATCH 002/129] ARM: shmobile: r8a7790: Add IRQC clock to device tree
+
+Link the external IRQ controller irqc0 to the IRQC module clock, so it
+can be power managed using that clock.
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 61624caf2479732beb42ea88a6b6ca3c7ae59cd7)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7790.dtsi | 9 +++++++++
+ include/dt-bindings/clock/r8a7790-clock.h | 3 +++
+ 2 files changed, 12 insertions(+)
+
+diff --git a/arch/arm/boot/dts/r8a7790.dtsi b/arch/arm/boot/dts/r8a7790.dtsi
+index 4bb2f4c17321..a81cfda0872f 100644
+--- a/arch/arm/boot/dts/r8a7790.dtsi
++++ b/arch/arm/boot/dts/r8a7790.dtsi
+@@ -252,6 +252,7 @@
+ <0 1 IRQ_TYPE_LEVEL_HIGH>,
+ <0 2 IRQ_TYPE_LEVEL_HIGH>,
+ <0 3 IRQ_TYPE_LEVEL_HIGH>;
++ clocks = <&mstp4_clks R8A7790_CLK_IRQC>;
+ };
+
+ dmac0: dma-controller@e6700000 {
+@@ -1158,6 +1159,14 @@
+ "iic0", "pciec", "iic1", "ssusb", "cmt1",
+ "usbdmac0", "usbdmac1";
+ };
++ mstp4_clks: mstp4_clks@e6150140 {
++ compatible = "renesas,r8a7790-mstp-clocks", "renesas,cpg-mstp-clocks";
++ reg = <0 0xe6150140 0 4>, <0 0xe615004c 0 4>;
++ clocks = <&cp_clk>;
++ #clock-cells = <1>;
++ clock-indices = <R8A7790_CLK_IRQC>;
++ clock-output-names = "irqc";
++ };
+ mstp5_clks: mstp5_clks@e6150144 {
+ compatible = "renesas,r8a7790-mstp-clocks", "renesas,cpg-mstp-clocks";
+ reg = <0 0xe6150144 0 4>, <0 0xe615003c 0 4>;
+diff --git a/include/dt-bindings/clock/r8a7790-clock.h b/include/dt-bindings/clock/r8a7790-clock.h
+index 3f2c6b198d4a..ff7ca3584e16 100644
+--- a/include/dt-bindings/clock/r8a7790-clock.h
++++ b/include/dt-bindings/clock/r8a7790-clock.h
+@@ -79,6 +79,9 @@
+ #define R8A7790_CLK_USBDMAC0 30
+ #define R8A7790_CLK_USBDMAC1 31
+
++/* MSTP4 */
++#define R8A7790_CLK_IRQC 7
++
+ /* MSTP5 */
+ #define R8A7790_CLK_AUDIO_DMAC1 1
+ #define R8A7790_CLK_AUDIO_DMAC0 2
+--
+2.6.2
+
diff --git a/patches.renesas/0003-ARM-shmobile-r8a7791-Add-IRQC-clock-to-device-tree.patch b/patches.renesas/0003-ARM-shmobile-r8a7791-Add-IRQC-clock-to-device-tree.patch
new file mode 100644
index 00000000000000..13c79e6b81b761
--- /dev/null
+++ b/patches.renesas/0003-ARM-shmobile-r8a7791-Add-IRQC-clock-to-device-tree.patch
@@ -0,0 +1,61 @@
+From e4631c4d13aa7401241dade0f94fbc2ebb2eb8f8 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Wed, 18 Mar 2015 19:56:00 +0100
+Subject: [PATCH 003/129] ARM: shmobile: r8a7791: Add IRQC clock to device tree
+
+Link the external IRQ controller irqc0 to the IRQC module clock, so it
+can be power managed using that clock.
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 62d386c04b1cb9df430c955b309406175d26b6b3)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7791.dtsi | 9 +++++++++
+ include/dt-bindings/clock/r8a7791-clock.h | 3 +++
+ 2 files changed, 12 insertions(+)
+
+diff --git a/arch/arm/boot/dts/r8a7791.dtsi b/arch/arm/boot/dts/r8a7791.dtsi
+index 4696062f6dde..20ab76680884 100644
+--- a/arch/arm/boot/dts/r8a7791.dtsi
++++ b/arch/arm/boot/dts/r8a7791.dtsi
+@@ -239,6 +239,7 @@
+ <0 15 IRQ_TYPE_LEVEL_HIGH>,
+ <0 16 IRQ_TYPE_LEVEL_HIGH>,
+ <0 17 IRQ_TYPE_LEVEL_HIGH>;
++ clocks = <&mstp4_clks R8A7791_CLK_IRQC>;
+ };
+
+ dmac0: dma-controller@e6700000 {
+@@ -1160,6 +1161,14 @@
+ "mmcif0", "i2c7", "pciec", "i2c8", "ssusb", "cmt1",
+ "usbdmac0", "usbdmac1";
+ };
++ mstp4_clks: mstp4_clks@e6150140 {
++ compatible = "renesas,r8a7791-mstp-clocks", "renesas,cpg-mstp-clocks";
++ reg = <0 0xe6150140 0 4>, <0 0xe615004c 0 4>;
++ clocks = <&cp_clk>;
++ #clock-cells = <1>;
++ clock-indices = <R8A7791_CLK_IRQC>;
++ clock-output-names = "irqc";
++ };
+ mstp5_clks: mstp5_clks@e6150144 {
+ compatible = "renesas,r8a7791-mstp-clocks", "renesas,cpg-mstp-clocks";
+ reg = <0 0xe6150144 0 4>, <0 0xe615003c 0 4>;
+diff --git a/include/dt-bindings/clock/r8a7791-clock.h b/include/dt-bindings/clock/r8a7791-clock.h
+index 8fc5dc8faeea..402268384b99 100644
+--- a/include/dt-bindings/clock/r8a7791-clock.h
++++ b/include/dt-bindings/clock/r8a7791-clock.h
+@@ -70,6 +70,9 @@
+ #define R8A7791_CLK_USBDMAC0 30
+ #define R8A7791_CLK_USBDMAC1 31
+
++/* MSTP4 */
++#define R8A7791_CLK_IRQC 7
++
+ /* MSTP5 */
+ #define R8A7791_CLK_AUDIO_DMAC1 1
+ #define R8A7791_CLK_AUDIO_DMAC0 2
+--
+2.6.2
+
diff --git a/patches.renesas/0004-ARM-shmobile-r8a7794-Add-IRQC-clock-to-device-tree.patch b/patches.renesas/0004-ARM-shmobile-r8a7794-Add-IRQC-clock-to-device-tree.patch
new file mode 100644
index 00000000000000..57a850bbea320c
--- /dev/null
+++ b/patches.renesas/0004-ARM-shmobile-r8a7794-Add-IRQC-clock-to-device-tree.patch
@@ -0,0 +1,61 @@
+From 60fa35578b9e740ea4914bf7dde1d99f65a329a6 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Wed, 18 Mar 2015 19:56:01 +0100
+Subject: [PATCH 004/129] ARM: shmobile: r8a7794: Add IRQC clock to device tree
+
+Link the external IRQ controller irqc0 to the IRQC module clock, so it
+can be power managed using that clock.
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 1c5ca5db11edd7ff27ad8a98ffb2ac61bfd520b6)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7794.dtsi | 9 +++++++++
+ include/dt-bindings/clock/r8a7794-clock.h | 3 +++
+ 2 files changed, 12 insertions(+)
+
+diff --git a/arch/arm/boot/dts/r8a7794.dtsi b/arch/arm/boot/dts/r8a7794.dtsi
+index 7a3ffa51a8bf..01cf54f70501 100644
+--- a/arch/arm/boot/dts/r8a7794.dtsi
++++ b/arch/arm/boot/dts/r8a7794.dtsi
+@@ -105,6 +105,7 @@
+ <0 15 IRQ_TYPE_LEVEL_HIGH>,
+ <0 16 IRQ_TYPE_LEVEL_HIGH>,
+ <0 17 IRQ_TYPE_LEVEL_HIGH>;
++ clocks = <&mstp4_clks R8A7794_CLK_IRQC>;
+ };
+
+ dmac0: dma-controller@e6700000 {
+@@ -625,6 +626,14 @@
+ "sdhi2", "sdhi1", "sdhi0",
+ "mmcif0", "cmt1", "usbdmac0", "usbdmac1";
+ };
++ mstp4_clks: mstp4_clks@e6150140 {
++ compatible = "renesas,r8a7794-mstp-clocks", "renesas,cpg-mstp-clocks";
++ reg = <0 0xe6150140 0 4>, <0 0xe615004c 0 4>;
++ clocks = <&cp_clk>;
++ #clock-cells = <1>;
++ clock-indices = <R8A7794_CLK_IRQC>;
++ clock-output-names = "irqc";
++ };
+ mstp7_clks: mstp7_clks@e615014c {
+ compatible = "renesas,r8a7794-mstp-clocks", "renesas,cpg-mstp-clocks";
+ reg = <0 0xe615014c 0 4>, <0 0xe61501c4 0 4>;
+diff --git a/include/dt-bindings/clock/r8a7794-clock.h b/include/dt-bindings/clock/r8a7794-clock.h
+index d63323032d6e..09da38a58776 100644
+--- a/include/dt-bindings/clock/r8a7794-clock.h
++++ b/include/dt-bindings/clock/r8a7794-clock.h
+@@ -60,6 +60,9 @@
+ #define R8A7794_CLK_USBDMAC0 30
+ #define R8A7794_CLK_USBDMAC1 31
+
++/* MSTP4 */
++#define R8A7794_CLK_IRQC 7
++
+ /* MSTP5 */
+ #define R8A7794_CLK_THERMAL 22
+ #define R8A7794_CLK_PWM 23
+--
+2.6.2
+
diff --git a/patches.renesas/0005-clk-emev2-Silence-sparse-warnings.patch b/patches.renesas/0005-clk-emev2-Silence-sparse-warnings.patch
new file mode 100644
index 00000000000000..998dee0b1f6bd0
--- /dev/null
+++ b/patches.renesas/0005-clk-emev2-Silence-sparse-warnings.patch
@@ -0,0 +1,33 @@
+From 99622ef7ea52673b884fad6223471817d0037483 Mon Sep 17 00:00:00 2001
+From: Stephen Boyd <sboyd@codeaurora.org>
+Date: Fri, 1 May 2015 12:33:49 -0700
+Subject: [PATCH 005/129] clk: emev2: Silence sparse warnings
+
+drivers/clk/shmobile/clk-emev2.c:37:14: warning: symbol 'smu_base' was not declared. Should it be static?
+
+Cc: Takashi Yoshii <takasi-y@ops.dti.ne.jp>
+Cc: Magnus Damm <damm@opensource.se>
+Acked-by: Simon Horman <horms+renesas@verge.net.au>
+Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
+(cherry picked from commit 43f535702bb2c7b96091c0267fc105d44c18348c)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/clk/shmobile/clk-emev2.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/clk/shmobile/clk-emev2.c b/drivers/clk/shmobile/clk-emev2.c
+index 6c7c929c7765..5b60beb7d0eb 100644
+--- a/drivers/clk/shmobile/clk-emev2.c
++++ b/drivers/clk/shmobile/clk-emev2.c
+@@ -34,7 +34,7 @@
+ static DEFINE_SPINLOCK(lock);
+
+ /* not pretty, but hey */
+-void __iomem *smu_base;
++static void __iomem *smu_base;
+
+ static void __init emev2_smu_write(unsigned long value, int offs)
+ {
+--
+2.6.2
+
diff --git a/patches.renesas/0006-clk-shmobile-Add-r8a7778-SoC-to-MSTP-bindings.patch b/patches.renesas/0006-clk-shmobile-Add-r8a7778-SoC-to-MSTP-bindings.patch
new file mode 100644
index 00000000000000..816a917496e4df
--- /dev/null
+++ b/patches.renesas/0006-clk-shmobile-Add-r8a7778-SoC-to-MSTP-bindings.patch
@@ -0,0 +1,29 @@
+From 4851c88cee58e39fc7cf2e329692314677ab54bc Mon Sep 17 00:00:00 2001
+From: Ulrich Hecht <ulrich.hecht+renesas@gmail.com>
+Date: Thu, 26 Feb 2015 17:42:06 +0100
+Subject: [PATCH 006/129] clk: shmobile: Add r8a7778 SoC to MSTP bindings
+
+Signed-off-by: Ulrich Hecht <ulrich.hecht+renesas@gmail.com>
+Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+(cherry picked from commit 31a0b5373c7562d5a24f973a2afec1785d72d9c4)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt b/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt
+index 0a80fa70ca26..e163092348bf 100644
+--- a/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt
++++ b/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt
+@@ -13,6 +13,7 @@ Required Properties:
+ - "renesas,r7s72100-mstp-clocks" for R7S72100 (RZ) MSTP gate clocks
+ - "renesas,r8a73a4-mstp-clocks" for R8A73A4 (R-Mobile APE6) MSTP gate clocks
+ - "renesas,r8a7740-mstp-clocks" for R8A7740 (R-Mobile A1) MSTP gate clocks
++ - "renesas,r8a7778-mstp-clocks" for R8A7778 (R-Car M1) MSTP gate clocks
+ - "renesas,r8a7779-mstp-clocks" for R8A7779 (R-Car H1) MSTP gate clocks
+ - "renesas,r8a7790-mstp-clocks" for R8A7790 (R-Car H2) MSTP gate clocks
+ - "renesas,r8a7791-mstp-clocks" for R8A7791 (R-Car M2) MSTP gate clocks
+--
+2.6.2
+
diff --git a/patches.renesas/0007-clk-shmobile-Add-r8a7793-SoC-to-MSTP-bindings.patch b/patches.renesas/0007-clk-shmobile-Add-r8a7793-SoC-to-MSTP-bindings.patch
new file mode 100644
index 00000000000000..bd7306f6a430b0
--- /dev/null
+++ b/patches.renesas/0007-clk-shmobile-Add-r8a7793-SoC-to-MSTP-bindings.patch
@@ -0,0 +1,35 @@
+From ae9663eb3e02af654e0710aca81f7028f05911f3 Mon Sep 17 00:00:00 2001
+From: Ulrich Hecht <ulrich.hecht+renesas@gmail.com>
+Date: Thu, 28 May 2015 17:17:00 +0200
+Subject: [PATCH 007/129] clk: shmobile: Add r8a7793 SoC to MSTP bindings
+
+Also replaces "R-Car M2" with "R-Car M2-W" to avoid confusion.
+
+Signed-off-by: Ulrich Hecht <ulrich.hecht+renesas@gmail.com>
+Acked-by: Simon Horman <horms+renesas@verge.net.au>
+Cc: Michael Turquette <mturquette@linaro.org>
+Cc: devicetree@vger.kernel.org
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+(cherry picked from commit b5405db9df8ea71435336bea8295cc4aa84ee3fa)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt b/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt
+index e163092348bf..c95f7d2db6bd 100644
+--- a/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt
++++ b/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt
+@@ -16,7 +16,8 @@ Required Properties:
+ - "renesas,r8a7778-mstp-clocks" for R8A7778 (R-Car M1) MSTP gate clocks
+ - "renesas,r8a7779-mstp-clocks" for R8A7779 (R-Car H1) MSTP gate clocks
+ - "renesas,r8a7790-mstp-clocks" for R8A7790 (R-Car H2) MSTP gate clocks
+- - "renesas,r8a7791-mstp-clocks" for R8A7791 (R-Car M2) MSTP gate clocks
++ - "renesas,r8a7791-mstp-clocks" for R8A7791 (R-Car M2-W) MSTP gate clocks
++ - "renesas,r8a7793-mstp-clocks" for R8A7793 (R-Car M2-N) MSTP gate clocks
+ - "renesas,r8a7794-mstp-clocks" for R8A7794 (R-Car E2) MSTP gate clocks
+ - "renesas,sh73a0-mstp-clocks" for SH73A0 (SH-MobileAG5) MSTP gate clocks
+ - "renesas,cpg-mstp-clock" for generic MSTP gate clocks
+--
+2.6.2
+
diff --git a/patches.renesas/0008-clk-shmobile-mstp-Document-mandatory-compatible-fall.patch b/patches.renesas/0008-clk-shmobile-mstp-Document-mandatory-compatible-fall.patch
new file mode 100644
index 00000000000000..e6314c7df149f0
--- /dev/null
+++ b/patches.renesas/0008-clk-shmobile-mstp-Document-mandatory-compatible-fall.patch
@@ -0,0 +1,35 @@
+From 0f8561648a63896c717c9428b713549c43f23799 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Thu, 28 May 2015 11:28:10 +0200
+Subject: [PATCH 008/129] clk: shmobile: mstp: Document mandatory compatible
+ fallback
+
+The generic MSTP gate clocks compatible value is mandatory, as the
+driver uses only this value for matching. Document that this is a
+fallback that must be present.
+
+Also fix a typo (missing plural "s") in the compatible value.
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+(cherry picked from commit 17df1fb2e502371b63ea1b2110584e8a712d6c20)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt b/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt
+index c95f7d2db6bd..16ed18155160 100644
+--- a/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt
++++ b/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt
+@@ -20,7 +20,7 @@ Required Properties:
+ - "renesas,r8a7793-mstp-clocks" for R8A7793 (R-Car M2-N) MSTP gate clocks
+ - "renesas,r8a7794-mstp-clocks" for R8A7794 (R-Car E2) MSTP gate clocks
+ - "renesas,sh73a0-mstp-clocks" for SH73A0 (SH-MobileAG5) MSTP gate clocks
+- - "renesas,cpg-mstp-clock" for generic MSTP gate clocks
++ and "renesas,cpg-mstp-clocks" as a fallback.
+ - reg: Base address and length of the I/O mapped registers used by the MSTP
+ clocks. The first register is the clock control register and is mandatory.
+ The second register is the clock status register and is optional when not
+--
+2.6.2
+
diff --git a/patches.renesas/0009-i2c-sh_mobile-add-errata-workaround.patch b/patches.renesas/0009-i2c-sh_mobile-add-errata-workaround.patch
new file mode 100644
index 00000000000000..03666e9ab5011a
--- /dev/null
+++ b/patches.renesas/0009-i2c-sh_mobile-add-errata-workaround.patch
@@ -0,0 +1,111 @@
+From 1aef2578075b8f30977492b7d3807e7ae8ab48c6 Mon Sep 17 00:00:00 2001
+From: Wolfram Sang <wsa+renesas@sang-engineering.com>
+Date: Tue, 9 Jun 2015 16:14:39 +0900
+Subject: [PATCH 009/129] i2c: sh_mobile: add errata workaround
+
+This used to be in platform init code. We want it to do in the driver
+now. This is basically a code move and a new compatible added.
+
+Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
+Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Acked-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Acked-by: Simon Horman <horms+renesas@verge.net.au>
+Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
+(cherry picked from commit 3ded3743a026e0762fa74467eafc66ecc1c484cc)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/i2c/busses/i2c-sh_mobile.c | 40 ++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 40 insertions(+)
+
+diff --git a/drivers/i2c/busses/i2c-sh_mobile.c b/drivers/i2c/busses/i2c-sh_mobile.c
+index 007818b3e174..7193bcfdd940 100644
+--- a/drivers/i2c/busses/i2c-sh_mobile.c
++++ b/drivers/i2c/busses/i2c-sh_mobile.c
+@@ -150,6 +150,7 @@ struct sh_mobile_i2c_data {
+
+ struct sh_mobile_dt_config {
+ int clks_per_count;
++ void (*setup)(struct sh_mobile_i2c_data *pd);
+ };
+
+ #define IIC_FLAG_HAS_ICIC67 (1 << 0)
+@@ -164,6 +165,7 @@ struct sh_mobile_dt_config {
+ #define ICIC 0x0c
+ #define ICCL 0x10
+ #define ICCH 0x14
++#define ICSTART 0x70
+
+ /* Register bits */
+ #define ICCR_ICE 0x80
+@@ -190,6 +192,8 @@ struct sh_mobile_dt_config {
+ #define ICIC_WAITE 0x02
+ #define ICIC_DTEE 0x01
+
++#define ICSTART_ICSTART 0x10
++
+ static void iic_wr(struct sh_mobile_i2c_data *pd, int offs, unsigned char data)
+ {
+ if (offs == ICIC)
+@@ -782,6 +786,33 @@ static struct i2c_algorithm sh_mobile_i2c_algorithm = {
+ .master_xfer = sh_mobile_i2c_xfer,
+ };
+
++/*
++ * r8a7740 chip has lasting errata on I2C I/O pad reset.
++ * this is work-around for it.
++ */
++static void sh_mobile_i2c_r8a7740_workaround(struct sh_mobile_i2c_data *pd)
++{
++ iic_set_clr(pd, ICCR, ICCR_ICE, 0);
++ iic_rd(pd, ICCR); /* dummy read */
++
++ iic_set_clr(pd, ICSTART, ICSTART_ICSTART, 0);
++ iic_rd(pd, ICSTART); /* dummy read */
++
++ udelay(10);
++
++ iic_wr(pd, ICCR, ICCR_SCP);
++ iic_wr(pd, ICSTART, 0);
++
++ udelay(10);
++
++ iic_wr(pd, ICCR, ICCR_TRS);
++ udelay(10);
++ iic_wr(pd, ICCR, 0);
++ udelay(10);
++ iic_wr(pd, ICCR, ICCR_TRS);
++ udelay(10);
++}
++
+ static const struct sh_mobile_dt_config default_dt_config = {
+ .clks_per_count = 1,
+ };
+@@ -790,9 +821,15 @@ static const struct sh_mobile_dt_config fast_clock_dt_config = {
+ .clks_per_count = 2,
+ };
+
++static const struct sh_mobile_dt_config r8a7740_dt_config = {
++ .clks_per_count = 1,
++ .setup = sh_mobile_i2c_r8a7740_workaround,
++};
++
+ static const struct of_device_id sh_mobile_i2c_dt_ids[] = {
+ { .compatible = "renesas,rmobile-iic", .data = &default_dt_config },
+ { .compatible = "renesas,iic-r8a73a4", .data = &fast_clock_dt_config },
++ { .compatible = "renesas,iic-r8a7740", .data = &r8a7740_dt_config },
+ { .compatible = "renesas,iic-r8a7790", .data = &fast_clock_dt_config },
+ { .compatible = "renesas,iic-r8a7791", .data = &fast_clock_dt_config },
+ { .compatible = "renesas,iic-r8a7792", .data = &fast_clock_dt_config },
+@@ -885,6 +922,9 @@ static int sh_mobile_i2c_probe(struct platform_device *dev)
+
+ config = match->data;
+ pd->clks_per_count = config->clks_per_count;
++
++ if (config->setup)
++ config->setup(pd);
+ }
+ } else {
+ if (pdata && pdata->bus_speed)
+--
+2.6.2
+
diff --git a/patches.renesas/0010-i2c-sh_mobile-use-adapter-default-for-timeout.patch b/patches.renesas/0010-i2c-sh_mobile-use-adapter-default-for-timeout.patch
new file mode 100644
index 00000000000000..4a4272eb4c41ae
--- /dev/null
+++ b/patches.renesas/0010-i2c-sh_mobile-use-adapter-default-for-timeout.patch
@@ -0,0 +1,34 @@
+From 91446decf89f8432214fed23dcbe912e978b3cc5 Mon Sep 17 00:00:00 2001
+From: Wolfram Sang <wsa+renesas@sang-engineering.com>
+Date: Sat, 20 Jun 2015 21:03:21 +0200
+Subject: [PATCH 010/129] i2c: sh_mobile: use adapter default for timeout
+
+5 seconds is a very large timeout, and it is hardcoded. Use the default
+timeout from 'struct adapter' which is 1 second. It can also be modified
+from userspace for specific workloads via i2c-dev.
+
+Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
+Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
+(cherry picked from commit 41bdbd2887591a3fa586e71cd2b462c3525845a3)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/i2c/busses/i2c-sh_mobile.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/i2c/busses/i2c-sh_mobile.c b/drivers/i2c/busses/i2c-sh_mobile.c
+index 7193bcfdd940..5490bfb58f3e 100644
+--- a/drivers/i2c/busses/i2c-sh_mobile.c
++++ b/drivers/i2c/busses/i2c-sh_mobile.c
+@@ -751,7 +751,7 @@ static int sh_mobile_i2c_xfer(struct i2c_adapter *adapter,
+ /* The interrupt handler takes care of the rest... */
+ k = wait_event_timeout(pd->wait,
+ pd->sr & (ICSR_TACK | SW_DONE),
+- 5 * HZ);
++ adapter->timeout);
+ if (!k) {
+ dev_err(pd->dev, "Transfer request timed out\n");
+ if (pd->dma_direction != DMA_NONE)
+--
+2.6.2
+
diff --git a/patches.renesas/0011-i2c-sh_mobile-use-proper-type-for-timeout.patch b/patches.renesas/0011-i2c-sh_mobile-use-proper-type-for-timeout.patch
new file mode 100644
index 00000000000000..c796f6364126e5
--- /dev/null
+++ b/patches.renesas/0011-i2c-sh_mobile-use-proper-type-for-timeout.patch
@@ -0,0 +1,46 @@
+From 9485483919534a565810906835a347ba0ca3163f Mon Sep 17 00:00:00 2001
+From: Wolfram Sang <wsa+renesas@sang-engineering.com>
+Date: Sat, 20 Jun 2015 21:03:22 +0200
+Subject: [PATCH 011/129] i2c: sh_mobile: use proper type for timeout
+
+wait_event_timeout returns long, not int.
+
+Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
+Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
+(cherry picked from commit 365322fb32e82b20758e8a18e3aa94692ce2a3d1)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/i2c/busses/i2c-sh_mobile.c | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/i2c/busses/i2c-sh_mobile.c b/drivers/i2c/busses/i2c-sh_mobile.c
+index 5490bfb58f3e..47659a925e09 100644
+--- a/drivers/i2c/busses/i2c-sh_mobile.c
++++ b/drivers/i2c/busses/i2c-sh_mobile.c
+@@ -730,7 +730,8 @@ static int sh_mobile_i2c_xfer(struct i2c_adapter *adapter,
+ struct sh_mobile_i2c_data *pd = i2c_get_adapdata(adapter);
+ struct i2c_msg *msg;
+ int err = 0;
+- int i, k;
++ int i;
++ long timeout;
+
+ activate_ch(pd);
+
+@@ -749,10 +750,10 @@ static int sh_mobile_i2c_xfer(struct i2c_adapter *adapter,
+ i2c_op(pd, OP_START, 0);
+
+ /* The interrupt handler takes care of the rest... */
+- k = wait_event_timeout(pd->wait,
++ timeout = wait_event_timeout(pd->wait,
+ pd->sr & (ICSR_TACK | SW_DONE),
+ adapter->timeout);
+- if (!k) {
++ if (!timeout) {
+ dev_err(pd->dev, "Transfer request timed out\n");
+ if (pd->dma_direction != DMA_NONE)
+ sh_mobile_i2c_cleanup_dma(pd);
+--
+2.6.2
+
diff --git a/patches.renesas/0012-irqchip-Constify-irq_domain_ops.patch b/patches.renesas/0012-irqchip-Constify-irq_domain_ops.patch
new file mode 100644
index 00000000000000..f5ea6dbfd5b2a9
--- /dev/null
+++ b/patches.renesas/0012-irqchip-Constify-irq_domain_ops.patch
@@ -0,0 +1,233 @@
+From 01c70414f308dacf523d2efc309942abfe9a76b1 Mon Sep 17 00:00:00 2001
+From: Krzysztof Kozlowski <k.kozlowski.k@gmail.com>
+Date: Mon, 27 Apr 2015 21:54:24 +0900
+Subject: [PATCH 012/129] irqchip: Constify irq_domain_ops
+
+The irq_domain_ops are not modified by the driver and the irqdomain core
+code accepts pointer to a const data.
+
+Signed-off-by: Krzysztof Kozlowski <k.kozlowski.k@gmail.com>
+Cc: Jason Cooper <jason@lakedaemon.net>
+Cc: Kukjin Kim <kgene@kernel.org>
+Cc: Stephen Warren <swarren@wwwdotorg.org>
+Cc: Lee Jones <lee@kernel.org>
+Cc: Matthias Brugger <matthias.bgg@gmail.com>
+Cc: Maxime Ripard <maxime.ripard@free-electrons.com>
+Cc: linux-arm-kernel@lists.infradead.org
+Cc: linux-rpi-kernel@lists.infradead.org
+Cc: linux-mediatek@lists.infradead.org
+Link: http://lkml.kernel.org/r/1430139264-4362-2-git-send-email-k.kozlowski.k@gmail.com
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+(cherry picked from commit 9600973656c697d742e31d202e6212216ea45a3e)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/irqchip/exynos-combiner.c | 2 +-
+ drivers/irqchip/irq-armada-370-xp.c | 2 +-
+ drivers/irqchip/irq-bcm2835.c | 2 +-
+ drivers/irqchip/irq-keystone.c | 2 +-
+ drivers/irqchip/irq-mips-gic.c | 2 +-
+ drivers/irqchip/irq-mtk-sysirq.c | 2 +-
+ drivers/irqchip/irq-mxs.c | 2 +-
+ drivers/irqchip/irq-renesas-intc-irqpin.c | 2 +-
+ drivers/irqchip/irq-renesas-irqc.c | 2 +-
+ drivers/irqchip/irq-s3c24xx.c | 4 ++--
+ drivers/irqchip/irq-sun4i.c | 2 +-
+ drivers/irqchip/irq-versatile-fpga.c | 2 +-
+ drivers/irqchip/irq-vic.c | 2 +-
+ drivers/irqchip/irq-vt8500.c | 2 +-
+ 14 files changed, 15 insertions(+), 15 deletions(-)
+
+diff --git a/drivers/irqchip/exynos-combiner.c b/drivers/irqchip/exynos-combiner.c
+index 5945223b73fa..a57a3a1f339f 100644
+--- a/drivers/irqchip/exynos-combiner.c
++++ b/drivers/irqchip/exynos-combiner.c
+@@ -164,7 +164,7 @@ static int combiner_irq_domain_map(struct irq_domain *d, unsigned int irq,
+ return 0;
+ }
+
+-static struct irq_domain_ops combiner_irq_domain_ops = {
++static const struct irq_domain_ops combiner_irq_domain_ops = {
+ .xlate = combiner_irq_domain_xlate,
+ .map = combiner_irq_domain_map,
+ };
+diff --git a/drivers/irqchip/irq-armada-370-xp.c b/drivers/irqchip/irq-armada-370-xp.c
+index daccc8bdbb42..0d3b0fe2f175 100644
+--- a/drivers/irqchip/irq-armada-370-xp.c
++++ b/drivers/irqchip/irq-armada-370-xp.c
+@@ -409,7 +409,7 @@ static struct notifier_block mpic_cascaded_cpu_notifier = {
+ };
+ #endif /* CONFIG_SMP */
+
+-static struct irq_domain_ops armada_370_xp_mpic_irq_ops = {
++static const struct irq_domain_ops armada_370_xp_mpic_irq_ops = {
+ .map = armada_370_xp_mpic_irq_map,
+ .xlate = irq_domain_xlate_onecell,
+ };
+diff --git a/drivers/irqchip/irq-bcm2835.c b/drivers/irqchip/irq-bcm2835.c
+index 5916d6cdafa1..e68c3b60a681 100644
+--- a/drivers/irqchip/irq-bcm2835.c
++++ b/drivers/irqchip/irq-bcm2835.c
+@@ -135,7 +135,7 @@ static int armctrl_xlate(struct irq_domain *d, struct device_node *ctrlr,
+ return 0;
+ }
+
+-static struct irq_domain_ops armctrl_ops = {
++static const struct irq_domain_ops armctrl_ops = {
+ .xlate = armctrl_xlate
+ };
+
+diff --git a/drivers/irqchip/irq-keystone.c b/drivers/irqchip/irq-keystone.c
+index 78e8b3ce5252..5dc61655055a 100644
+--- a/drivers/irqchip/irq-keystone.c
++++ b/drivers/irqchip/irq-keystone.c
+@@ -131,7 +131,7 @@ static int keystone_irq_map(struct irq_domain *h, unsigned int virq,
+ return 0;
+ }
+
+-static struct irq_domain_ops keystone_irq_ops = {
++static const struct irq_domain_ops keystone_irq_ops = {
+ .map = keystone_irq_map,
+ .xlate = irq_domain_xlate_onecell,
+ };
+diff --git a/drivers/irqchip/irq-mips-gic.c b/drivers/irqchip/irq-mips-gic.c
+index 269c2354c431..4400edd1a6c7 100644
+--- a/drivers/irqchip/irq-mips-gic.c
++++ b/drivers/irqchip/irq-mips-gic.c
+@@ -746,7 +746,7 @@ static int gic_irq_domain_xlate(struct irq_domain *d, struct device_node *ctrlr,
+ return 0;
+ }
+
+-static struct irq_domain_ops gic_irq_domain_ops = {
++static const struct irq_domain_ops gic_irq_domain_ops = {
+ .map = gic_irq_domain_map,
+ .xlate = gic_irq_domain_xlate,
+ };
+diff --git a/drivers/irqchip/irq-mtk-sysirq.c b/drivers/irqchip/irq-mtk-sysirq.c
+index eaf0a710e98a..04de2d4ca70f 100644
+--- a/drivers/irqchip/irq-mtk-sysirq.c
++++ b/drivers/irqchip/irq-mtk-sysirq.c
+@@ -111,7 +111,7 @@ static int mtk_sysirq_domain_alloc(struct irq_domain *domain, unsigned int virq,
+ return irq_domain_alloc_irqs_parent(domain, virq, nr_irqs, &gic_data);
+ }
+
+-static struct irq_domain_ops sysirq_domain_ops = {
++static const struct irq_domain_ops sysirq_domain_ops = {
+ .xlate = mtk_sysirq_domain_xlate,
+ .alloc = mtk_sysirq_domain_alloc,
+ .free = irq_domain_free_irqs_common,
+diff --git a/drivers/irqchip/irq-mxs.c b/drivers/irqchip/irq-mxs.c
+index e4acf1e3f8e3..04bf97b289cf 100644
+--- a/drivers/irqchip/irq-mxs.c
++++ b/drivers/irqchip/irq-mxs.c
+@@ -90,7 +90,7 @@ static int icoll_irq_domain_map(struct irq_domain *d, unsigned int virq,
+ return 0;
+ }
+
+-static struct irq_domain_ops icoll_irq_domain_ops = {
++static const struct irq_domain_ops icoll_irq_domain_ops = {
+ .map = icoll_irq_domain_map,
+ .xlate = irq_domain_xlate_onecell,
+ };
+diff --git a/drivers/irqchip/irq-renesas-intc-irqpin.c b/drivers/irqchip/irq-renesas-intc-irqpin.c
+index 9a0767b9c89d..0670ab4e3897 100644
+--- a/drivers/irqchip/irq-renesas-intc-irqpin.c
++++ b/drivers/irqchip/irq-renesas-intc-irqpin.c
+@@ -347,7 +347,7 @@ static int intc_irqpin_irq_domain_map(struct irq_domain *h, unsigned int virq,
+ return 0;
+ }
+
+-static struct irq_domain_ops intc_irqpin_irq_domain_ops = {
++static const struct irq_domain_ops intc_irqpin_irq_domain_ops = {
+ .map = intc_irqpin_irq_domain_map,
+ .xlate = irq_domain_xlate_twocell,
+ };
+diff --git a/drivers/irqchip/irq-renesas-irqc.c b/drivers/irqchip/irq-renesas-irqc.c
+index cdf80b7794cd..df5bf21a701f 100644
+--- a/drivers/irqchip/irq-renesas-irqc.c
++++ b/drivers/irqchip/irq-renesas-irqc.c
+@@ -168,7 +168,7 @@ static int irqc_irq_domain_map(struct irq_domain *h, unsigned int virq,
+ return 0;
+ }
+
+-static struct irq_domain_ops irqc_irq_domain_ops = {
++static const struct irq_domain_ops irqc_irq_domain_ops = {
+ .map = irqc_irq_domain_map,
+ .xlate = irq_domain_xlate_twocell,
+ };
+diff --git a/drivers/irqchip/irq-s3c24xx.c b/drivers/irqchip/irq-s3c24xx.c
+index c8d373fcd823..e96717f45ea1 100644
+--- a/drivers/irqchip/irq-s3c24xx.c
++++ b/drivers/irqchip/irq-s3c24xx.c
+@@ -502,7 +502,7 @@ err:
+ return -EINVAL;
+ }
+
+-static struct irq_domain_ops s3c24xx_irq_ops = {
++static const struct irq_domain_ops s3c24xx_irq_ops = {
+ .map = s3c24xx_irq_map,
+ .xlate = irq_domain_xlate_twocell,
+ };
+@@ -1228,7 +1228,7 @@ static int s3c24xx_irq_xlate_of(struct irq_domain *d, struct device_node *n,
+ return 0;
+ }
+
+-static struct irq_domain_ops s3c24xx_irq_ops_of = {
++static const struct irq_domain_ops s3c24xx_irq_ops_of = {
+ .map = s3c24xx_irq_map_of,
+ .xlate = s3c24xx_irq_xlate_of,
+ };
+diff --git a/drivers/irqchip/irq-sun4i.c b/drivers/irqchip/irq-sun4i.c
+index 64155b686081..83d6aa6464ee 100644
+--- a/drivers/irqchip/irq-sun4i.c
++++ b/drivers/irqchip/irq-sun4i.c
+@@ -89,7 +89,7 @@ static int sun4i_irq_map(struct irq_domain *d, unsigned int virq,
+ return 0;
+ }
+
+-static struct irq_domain_ops sun4i_irq_ops = {
++static const struct irq_domain_ops sun4i_irq_ops = {
+ .map = sun4i_irq_map,
+ .xlate = irq_domain_xlate_onecell,
+ };
+diff --git a/drivers/irqchip/irq-versatile-fpga.c b/drivers/irqchip/irq-versatile-fpga.c
+index 1ab451729a5c..888111b76ea0 100644
+--- a/drivers/irqchip/irq-versatile-fpga.c
++++ b/drivers/irqchip/irq-versatile-fpga.c
+@@ -132,7 +132,7 @@ static int fpga_irqdomain_map(struct irq_domain *d, unsigned int irq,
+ return 0;
+ }
+
+-static struct irq_domain_ops fpga_irqdomain_ops = {
++static const struct irq_domain_ops fpga_irqdomain_ops = {
+ .map = fpga_irqdomain_map,
+ .xlate = irq_domain_xlate_onetwocell,
+ };
+diff --git a/drivers/irqchip/irq-vic.c b/drivers/irqchip/irq-vic.c
+index 54089debf2dc..d4ce331ea4a0 100644
+--- a/drivers/irqchip/irq-vic.c
++++ b/drivers/irqchip/irq-vic.c
+@@ -256,7 +256,7 @@ static void __exception_irq_entry vic_handle_irq(struct pt_regs *regs)
+ } while (handled);
+ }
+
+-static struct irq_domain_ops vic_irqdomain_ops = {
++static const struct irq_domain_ops vic_irqdomain_ops = {
+ .map = vic_irqdomain_map,
+ .xlate = irq_domain_xlate_onetwocell,
+ };
+diff --git a/drivers/irqchip/irq-vt8500.c b/drivers/irqchip/irq-vt8500.c
+index b7af816f2769..0b297009b856 100644
+--- a/drivers/irqchip/irq-vt8500.c
++++ b/drivers/irqchip/irq-vt8500.c
+@@ -173,7 +173,7 @@ static int vt8500_irq_map(struct irq_domain *h, unsigned int virq,
+ return 0;
+ }
+
+-static struct irq_domain_ops vt8500_irq_domain_ops = {
++static const struct irq_domain_ops vt8500_irq_domain_ops = {
+ .map = vt8500_irq_map,
+ .xlate = irq_domain_xlate_onecell,
+ };
+--
+2.6.2
+
diff --git a/patches.renesas/0013-irqchip-renesas-intc-irqpin-Improve-binding-document.patch b/patches.renesas/0013-irqchip-renesas-intc-irqpin-Improve-binding-document.patch
new file mode 100644
index 00000000000000..75062d1e5c19b8
--- /dev/null
+++ b/patches.renesas/0013-irqchip-renesas-intc-irqpin-Improve-binding-document.patch
@@ -0,0 +1,86 @@
+From 8b32551e436e790c61d27f964f892f20a3edf27a Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Fri, 29 May 2015 11:27:43 +0200
+Subject: [PATCH 013/129] irqchip: renesas: intc-irqpin: Improve binding
+ documentation
+
+Add missing documentation for required properties:
+ - interrupt-controller,
+ - parent interrupts (one entry per provided interrupt).
+
+Add missing documentation for optional properties:
+ - functional clock (managed since commit 705bc96c2c15313c ("irqchip:
+ renesas-intc-irqpin: Add minimal runtime PM support")),
+ - power-domains.
+
+Add an example, taken from r8a7740.dtsi.
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Acked-by: Simon Horman <horms+renesas@verge.net.au>
+Cc: Jason Cooper <jason@lakedaemon.net>
+Link: http://lkml.kernel.org/r/1432891663-23641-1-git-send-email-geert%2Brenesas@glider.be
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+(cherry picked from commit 496c28b13eb9d4f9c751b672daad8b110084cfd8)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ .../interrupt-controller/renesas,intc-irqpin.txt | 39 ++++++++++++++++++++--
+ 1 file changed, 37 insertions(+), 2 deletions(-)
+
+diff --git a/Documentation/devicetree/bindings/interrupt-controller/renesas,intc-irqpin.txt b/Documentation/devicetree/bindings/interrupt-controller/renesas,intc-irqpin.txt
+index 4f7946ae8adc..772c550d3b4b 100644
+--- a/Documentation/devicetree/bindings/interrupt-controller/renesas,intc-irqpin.txt
++++ b/Documentation/devicetree/bindings/interrupt-controller/renesas,intc-irqpin.txt
+@@ -13,9 +13,12 @@ Required properties:
+ - reg: Base address and length of each register bank used by the external
+ IRQ pins driven by the interrupt controller hardware module. The base
+ addresses, length and number of required register banks varies with soctype.
+-
++- interrupt-controller: Identifies the node as an interrupt controller.
+ - #interrupt-cells: has to be <2>: an interrupt index and flags, as defined in
+- interrupts.txt in this directory
++ interrupts.txt in this directory.
++- interrupts: Must contain a list of interrupt specifiers. For each interrupt
++ provided by this irqpin controller instance, there must be one entry,
++ referring to the corresponding parent interrupt.
+
+ Optional properties:
+
+@@ -25,3 +28,35 @@ Optional properties:
+ if different from the default 4 bits
+ - control-parent: disable and enable interrupts on the parent interrupt
+ controller, needed for some broken implementations
++- clocks: Must contain a reference to the functional clock. This property is
++ mandatory if the hardware implements a controllable functional clock for
++ the irqpin controller instance.
++- power-domains: Must contain a reference to the power domain. This property is
++ mandatory if the irqpin controller instance is part of a controllable power
++ domain.
++
++
++Example
++-------
++
++ irqpin1: interrupt-controller@e6900004 {
++ compatible = "renesas,intc-irqpin-r8a7740",
++ "renesas,intc-irqpin";
++ #interrupt-cells = <2>;
++ interrupt-controller;
++ reg = <0xe6900004 4>,
++ <0xe6900014 4>,
++ <0xe6900024 1>,
++ <0xe6900044 1>,
++ <0xe6900064 1>;
++ interrupts = <0 149 IRQ_TYPE_LEVEL_HIGH
++ 0 149 IRQ_TYPE_LEVEL_HIGH
++ 0 149 IRQ_TYPE_LEVEL_HIGH
++ 0 149 IRQ_TYPE_LEVEL_HIGH
++ 0 149 IRQ_TYPE_LEVEL_HIGH
++ 0 149 IRQ_TYPE_LEVEL_HIGH
++ 0 149 IRQ_TYPE_LEVEL_HIGH
++ 0 149 IRQ_TYPE_LEVEL_HIGH>;
++ clocks = <&mstp2_clks R8A7740_CLK_INTCA>;
++ power-domains = <&pd_a4s>;
++ };
+--
+2.6.2
+
diff --git a/patches.renesas/0014-irqchip-irqc-Remove-platform-data-support.patch b/patches.renesas/0014-irqchip-irqc-Remove-platform-data-support.patch
new file mode 100644
index 00000000000000..0f33abaae00065
--- /dev/null
+++ b/patches.renesas/0014-irqchip-irqc-Remove-platform-data-support.patch
@@ -0,0 +1,123 @@
+From 1ace3ec7f549b042502883aba16e5680e2061b0c Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Tue, 28 Apr 2015 12:17:50 +0200
+Subject: [PATCH 014/129] irqchip: irqc: Remove platform data support
+
+As of commit 914d7d148411997c ("ARM: shmobile: r8a73a4: Remove legacy
+code"), the Renesas R-Mobile/R-Car interrupt controller is used with DT
+only, and interrupt numbers are thus always assigned automatically.
+
+Drop the platform data declaration and all related support code.
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Cc: Magnus Damm <magnus.damm@gmail.com>
+Cc: Jason Cooper <jason@lakedaemon.net>
+Link: http://lkml.kernel.org/r/1430216270-31929-1-git-send-email-geert%2Brenesas@glider.be
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+(cherry picked from commit f31105347cc56c13d552b844ada04418769d875d)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/irqchip/irq-renesas-irqc.c | 17 +---------------
+ include/linux/platform_data/irq-renesas-irqc.h | 27 --------------------------
+ 2 files changed, 1 insertion(+), 43 deletions(-)
+ delete mode 100644 include/linux/platform_data/irq-renesas-irqc.h
+
+diff --git a/drivers/irqchip/irq-renesas-irqc.c b/drivers/irqchip/irq-renesas-irqc.c
+index df5bf21a701f..778bd076aeea 100644
+--- a/drivers/irqchip/irq-renesas-irqc.c
++++ b/drivers/irqchip/irq-renesas-irqc.c
+@@ -29,7 +29,6 @@
+ #include <linux/err.h>
+ #include <linux/slab.h>
+ #include <linux/module.h>
+-#include <linux/platform_data/irq-renesas-irqc.h>
+ #include <linux/pm_runtime.h>
+
+ #define IRQC_IRQ_MAX 32 /* maximum 32 interrupts per driver instance */
+@@ -62,7 +61,6 @@ struct irqc_priv {
+ void __iomem *iomem;
+ void __iomem *cpu_int_base;
+ struct irqc_irq irq[IRQC_IRQ_MAX];
+- struct renesas_irqc_config config;
+ unsigned int number_of_irqs;
+ struct platform_device *pdev;
+ struct irq_chip irq_chip;
+@@ -175,7 +173,6 @@ static const struct irq_domain_ops irqc_irq_domain_ops = {
+
+ static int irqc_probe(struct platform_device *pdev)
+ {
+- struct renesas_irqc_config *pdata = pdev->dev.platform_data;
+ struct irqc_priv *p;
+ struct resource *io;
+ struct resource *irq;
+@@ -191,10 +188,6 @@ static int irqc_probe(struct platform_device *pdev)
+ goto err0;
+ }
+
+- /* deal with driver instance configuration */
+- if (pdata)
+- memcpy(&p->config, pdata, sizeof(*pdata));
+-
+ p->pdev = pdev;
+ platform_set_drvdata(pdev, p);
+
+@@ -251,8 +244,7 @@ static int irqc_probe(struct platform_device *pdev)
+ irq_chip->flags = IRQCHIP_MASK_ON_SUSPEND;
+
+ p->irq_domain = irq_domain_add_simple(pdev->dev.of_node,
+- p->number_of_irqs,
+- p->config.irq_base,
++ p->number_of_irqs, 0,
+ &irqc_irq_domain_ops, p);
+ if (!p->irq_domain) {
+ ret = -ENXIO;
+@@ -272,13 +264,6 @@ static int irqc_probe(struct platform_device *pdev)
+
+ dev_info(&pdev->dev, "driving %d irqs\n", p->number_of_irqs);
+
+- /* warn in case of mismatch if irq base is specified */
+- if (p->config.irq_base) {
+- if (p->config.irq_base != p->irq[0].domain_irq)
+- dev_warn(&pdev->dev, "irq base mismatch (%d/%d)\n",
+- p->config.irq_base, p->irq[0].domain_irq);
+- }
+-
+ return 0;
+ err3:
+ while (--k >= 0)
+diff --git a/include/linux/platform_data/irq-renesas-irqc.h b/include/linux/platform_data/irq-renesas-irqc.h
+deleted file mode 100644
+index 3ae17b3e00ed..000000000000
+--- a/include/linux/platform_data/irq-renesas-irqc.h
++++ /dev/null
+@@ -1,27 +0,0 @@
+-/*
+- * Renesas IRQC Driver
+- *
+- * Copyright (C) 2013 Magnus Damm
+- *
+- * 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
+- *
+- * 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.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-
+-#ifndef __IRQ_RENESAS_IRQC_H__
+-#define __IRQ_RENESAS_IRQC_H__
+-
+-struct renesas_irqc_config {
+- unsigned int irq_base;
+-};
+-
+-#endif /* __IRQ_RENESAS_IRQC_H__ */
+--
+2.6.2
+
diff --git a/patches.renesas/0015-ARM-shmobile-r8a7790-Remove-MSIOF-address-from-devic.patch b/patches.renesas/0015-ARM-shmobile-r8a7790-Remove-MSIOF-address-from-devic.patch
new file mode 100644
index 00000000000000..44769f4276d26a
--- /dev/null
+++ b/patches.renesas/0015-ARM-shmobile-r8a7790-Remove-MSIOF-address-from-devic.patch
@@ -0,0 +1,62 @@
+From 433577fad6a4919356d66a2aa5118937a41573dc Mon Sep 17 00:00:00 2001
+From: Ryo Kataoka <ryo.kataoka.wt@renesas.com>
+Date: Sun, 5 Apr 2015 01:54:31 +0900
+Subject: [PATCH 015/129] ARM: shmobile: r8a7790: Remove MSIOF address from
+ device tree
+
+MSIOF Base Address H'E6xx can be accessed by CPU and DMAC.
+MSIOF Base Address H'E7xx for DMAC was removed from H/W manual.
+
+Signed-off-by: Ryo Kataoka <ryo.kataoka.wt@renesas.com>
+Signed-off-by: Yoshihiro Kaneko <ykaneko0929@gmail.com>
+Acked-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit c7d1f08a0c91ad9796d6d1fac8eb913e8a6d4288)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7790.dtsi | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/arch/arm/boot/dts/r8a7790.dtsi b/arch/arm/boot/dts/r8a7790.dtsi
+index a81cfda0872f..22e73906ec88 100644
+--- a/arch/arm/boot/dts/r8a7790.dtsi
++++ b/arch/arm/boot/dts/r8a7790.dtsi
+@@ -1282,7 +1282,7 @@
+
+ msiof0: spi@e6e20000 {
+ compatible = "renesas,msiof-r8a7790";
+- reg = <0 0xe6e20000 0 0x0064>, <0 0xe7e20000 0 0x0064>;
++ reg = <0 0xe6e20000 0 0x0064>;
+ interrupts = <0 156 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp0_clks R8A7790_CLK_MSIOF0>;
+ dmas = <&dmac0 0x51>, <&dmac0 0x52>;
+@@ -1294,7 +1294,7 @@
+
+ msiof1: spi@e6e10000 {
+ compatible = "renesas,msiof-r8a7790";
+- reg = <0 0xe6e10000 0 0x0064>, <0 0xe7e10000 0 0x0064>;
++ reg = <0 0xe6e10000 0 0x0064>;
+ interrupts = <0 157 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7790_CLK_MSIOF1>;
+ dmas = <&dmac0 0x55>, <&dmac0 0x56>;
+@@ -1306,7 +1306,7 @@
+
+ msiof2: spi@e6e00000 {
+ compatible = "renesas,msiof-r8a7790";
+- reg = <0 0xe6e00000 0 0x0064>, <0 0xe7e00000 0 0x0064>;
++ reg = <0 0xe6e00000 0 0x0064>;
+ interrupts = <0 158 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7790_CLK_MSIOF2>;
+ dmas = <&dmac0 0x41>, <&dmac0 0x42>;
+@@ -1318,7 +1318,7 @@
+
+ msiof3: spi@e6c90000 {
+ compatible = "renesas,msiof-r8a7790";
+- reg = <0 0xe6c90000 0 0x0064>, <0 0xe7c90000 0 0x0064>;
++ reg = <0 0xe6c90000 0 0x0064>;
+ interrupts = <0 159 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7790_CLK_MSIOF3>;
+ dmas = <&dmac0 0x45>, <&dmac0 0x46>;
+--
+2.6.2
+
diff --git a/patches.renesas/0016-ARM-shmobile-r8a7791-Remove-MSIOF-address-from-devic.patch b/patches.renesas/0016-ARM-shmobile-r8a7791-Remove-MSIOF-address-from-devic.patch
new file mode 100644
index 00000000000000..49ee0694e265e3
--- /dev/null
+++ b/patches.renesas/0016-ARM-shmobile-r8a7791-Remove-MSIOF-address-from-devic.patch
@@ -0,0 +1,67 @@
+From 70340c23abe732d397b5c9ea926ca42519dc074c Mon Sep 17 00:00:00 2001
+From: Ryo Kataoka <ryo.kataoka.wt@renesas.com>
+Date: Sun, 5 Apr 2015 01:55:12 +0900
+Subject: [PATCH 016/129] ARM: shmobile: r8a7791: Remove MSIOF address from
+ device tree
+
+MSIOF Base Address H'E6xx can be accessed by CPU and DMAC.
+MSIOF Base Address H'E7xx for DMAC was removed from H/W manual.
+
+Signed-off-by: Ryo Kataoka <ryo.kataoka.wt@renesas.com>
+Signed-off-by: Yoshihiro Kaneko <ykaneko0929@gmail.com>
+Acked-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit cb6d08a2b61fc0025a0148d06b71b8a7d0920e98)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ Documentation/devicetree/bindings/spi/sh-msiof.txt | 2 +-
+ arch/arm/boot/dts/r8a7791.dtsi | 6 +++---
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/Documentation/devicetree/bindings/spi/sh-msiof.txt b/Documentation/devicetree/bindings/spi/sh-msiof.txt
+index 4c388bb2f0a2..8f771441be60 100644
+--- a/Documentation/devicetree/bindings/spi/sh-msiof.txt
++++ b/Documentation/devicetree/bindings/spi/sh-msiof.txt
+@@ -60,7 +60,7 @@ Example:
+
+ msiof0: spi@e6e20000 {
+ compatible = "renesas,msiof-r8a7791";
+- reg = <0 0xe6e20000 0 0x0064>, <0 0xe7e20000 0 0x0064>;
++ reg = <0 0xe6e20000 0 0x0064>;
+ interrupts = <0 156 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp0_clks R8A7791_CLK_MSIOF0>;
+ dmas = <&dmac0 0x51>, <&dmac0 0x52>;
+diff --git a/arch/arm/boot/dts/r8a7791.dtsi b/arch/arm/boot/dts/r8a7791.dtsi
+index 20ab76680884..d2c41ad701cc 100644
+--- a/arch/arm/boot/dts/r8a7791.dtsi
++++ b/arch/arm/boot/dts/r8a7791.dtsi
+@@ -1297,7 +1297,7 @@
+
+ msiof0: spi@e6e20000 {
+ compatible = "renesas,msiof-r8a7791";
+- reg = <0 0xe6e20000 0 0x0064>, <0 0xe7e20000 0 0x0064>;
++ reg = <0 0xe6e20000 0 0x0064>;
+ interrupts = <0 156 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp0_clks R8A7791_CLK_MSIOF0>;
+ dmas = <&dmac0 0x51>, <&dmac0 0x52>;
+@@ -1309,7 +1309,7 @@
+
+ msiof1: spi@e6e10000 {
+ compatible = "renesas,msiof-r8a7791";
+- reg = <0 0xe6e10000 0 0x0064>, <0 0xe7e10000 0 0x0064>;
++ reg = <0 0xe6e10000 0 0x0064>;
+ interrupts = <0 157 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7791_CLK_MSIOF1>;
+ dmas = <&dmac0 0x55>, <&dmac0 0x56>;
+@@ -1321,7 +1321,7 @@
+
+ msiof2: spi@e6e00000 {
+ compatible = "renesas,msiof-r8a7791";
+- reg = <0 0xe6e00000 0 0x0064>, <0 0xe7e00000 0 0x0064>;
++ reg = <0 0xe6e00000 0 0x0064>;
+ interrupts = <0 158 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7791_CLK_MSIOF2>;
+ dmas = <&dmac0 0x41>, <&dmac0 0x42>;
+--
+2.6.2
+
diff --git a/patches.renesas/0017-ARM-shmobile-r8a7740-dtsi-Fix-SCIFB-naming.patch b/patches.renesas/0017-ARM-shmobile-r8a7740-dtsi-Fix-SCIFB-naming.patch
new file mode 100644
index 00000000000000..b5f931578ab591
--- /dev/null
+++ b/patches.renesas/0017-ARM-shmobile-r8a7740-dtsi-Fix-SCIFB-naming.patch
@@ -0,0 +1,31 @@
+From 534bed2687d605e01175dfcd057d1f02c0a2c656 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Mon, 27 Apr 2015 15:55:23 +0200
+Subject: [PATCH 017/129] ARM: shmobile: r8a7740 dtsi: Fix SCIFB naming
+
+The single SCIFB on R-Mobile A1 is called "scifb", not "scifb8".
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 50663822618670a1e6ea1dd9912790fd7ed3be0b)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7740.dtsi | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/r8a7740.dtsi b/arch/arm/boot/dts/r8a7740.dtsi
+index 83c1c3ca1b8f..413590d6c316 100644
+--- a/arch/arm/boot/dts/r8a7740.dtsi
++++ b/arch/arm/boot/dts/r8a7740.dtsi
+@@ -275,7 +275,7 @@
+ status = "disabled";
+ };
+
+- scifb8: serial@e6c30000 {
++ scifb: serial@e6c30000 {
+ compatible = "renesas,scifb-r8a7740", "renesas,scifb";
+ reg = <0xe6c30000 0x100>;
+ interrupts = <0 108 IRQ_TYPE_LEVEL_HIGH>;
+--
+2.6.2
+
diff --git a/patches.renesas/0018-ARM-shmobile-sh73a0-dtsi-Fix-SCIFB-naming.patch b/patches.renesas/0018-ARM-shmobile-sh73a0-dtsi-Fix-SCIFB-naming.patch
new file mode 100644
index 00000000000000..42f52c3cb02cc0
--- /dev/null
+++ b/patches.renesas/0018-ARM-shmobile-sh73a0-dtsi-Fix-SCIFB-naming.patch
@@ -0,0 +1,31 @@
+From b14ff4c4ec70c011f094585c616175765f582962 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Mon, 27 Apr 2015 15:55:24 +0200
+Subject: [PATCH 018/129] ARM: shmobile: sh73a0 dtsi: Fix SCIFB naming
+
+The single SCIFB on SH-Mobile AG5 is called "scifb", not "scifb8".
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit dfaac7b7e4015ca2e690c7ea4421aec1405de966)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/sh73a0.dtsi | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/sh73a0.dtsi b/arch/arm/boot/dts/sh73a0.dtsi
+index 45b539ce4d35..cde61b463b6a 100644
+--- a/arch/arm/boot/dts/sh73a0.dtsi
++++ b/arch/arm/boot/dts/sh73a0.dtsi
+@@ -376,7 +376,7 @@
+ status = "disabled";
+ };
+
+- scifb8: serial@e6c30000 {
++ scifb: serial@e6c30000 {
+ compatible = "renesas,scifb-sh73a0", "renesas,scifb";
+ reg = <0xe6c30000 0x100>;
+ interrupts = <0 80 IRQ_TYPE_LEVEL_HIGH>;
+--
+2.6.2
+
diff --git a/patches.renesas/0019-ARM-shmobile-defconfig-Replace-USB_RCAR_GEN2_PHY-by-.patch b/patches.renesas/0019-ARM-shmobile-defconfig-Replace-USB_RCAR_GEN2_PHY-by-.patch
new file mode 100644
index 00000000000000..0efeb8c2e08b99
--- /dev/null
+++ b/patches.renesas/0019-ARM-shmobile-defconfig-Replace-USB_RCAR_GEN2_PHY-by-.patch
@@ -0,0 +1,51 @@
+From 341ad1683fe8a5ff4c2cf2df48501dc9f3bb6e94 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Tue, 28 Apr 2015 14:08:03 +0200
+Subject: [PATCH 019/129] ARM: shmobile: defconfig: Replace USB_RCAR_GEN2_PHY
+ by PHY_RCAR_GEN2
+
+The legacy-only USB_RCAR_GEN2_PHY driver was replaced by the DT-only
+PHY_RCAR_GEN2 driver.
+
+Refresh the defconfig using "make savedefconfig" while we're at it.
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 90037558d5ed25a63499c3973cc1af25da02f673)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/configs/shmobile_defconfig | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/arch/arm/configs/shmobile_defconfig b/arch/arm/configs/shmobile_defconfig
+index b58618e2d13c..9961fbd633f8 100644
+--- a/arch/arm/configs/shmobile_defconfig
++++ b/arch/arm/configs/shmobile_defconfig
+@@ -121,7 +121,6 @@ CONFIG_WATCHDOG=y
+ CONFIG_DA9063_WATCHDOG=y
+ CONFIG_MFD_AS3711=y
+ CONFIG_MFD_DA9063=y
+-CONFIG_REGULATOR=y
+ CONFIG_REGULATOR_AS3711=y
+ CONFIG_REGULATOR_DA9210=y
+ CONFIG_REGULATOR_GPIO=y
+@@ -160,7 +159,6 @@ CONFIG_USB_OHCI_HCD=y
+ CONFIG_USB_R8A66597_HCD=y
+ CONFIG_USB_RENESAS_USBHS=y
+ CONFIG_USB_RCAR_PHY=y
+-CONFIG_USB_RCAR_GEN2_PHY=y
+ CONFIG_USB_GADGET=y
+ CONFIG_USB_RENESAS_USBHS_UDC=y
+ CONFIG_USB_ETH=y
+@@ -182,6 +180,8 @@ CONFIG_IIO=y
+ CONFIG_AK8975=y
+ CONFIG_PWM=y
+ CONFIG_PWM_RENESAS_TPU=y
++CONFIG_GENERIC_PHY=y
++CONFIG_PHY_RCAR_GEN2=y
+ # CONFIG_DNOTIFY is not set
+ CONFIG_MSDOS_FS=y
+ CONFIG_VFAT_FS=y
+--
+2.6.2
+
diff --git a/patches.renesas/0020-ARM-shmobile-r8a7740-dtsi-Use-generic-names-for-devi.patch b/patches.renesas/0020-ARM-shmobile-r8a7740-dtsi-Use-generic-names-for-devi.patch
new file mode 100644
index 00000000000000..6840b4b8121e66
--- /dev/null
+++ b/patches.renesas/0020-ARM-shmobile-r8a7740-dtsi-Use-generic-names-for-devi.patch
@@ -0,0 +1,59 @@
+From 4cd871a72a3fc1dce6cffb91fe03721ac24b9b4d Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Mon, 27 Apr 2015 14:55:25 +0200
+Subject: [PATCH 020/129] ARM: shmobile: r8a7740 dtsi: Use generic names for
+ device nodes
+
+irqpin -> interrupt-controller
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 32e4094238f10dce95bf9f8eacdf84a880182db5)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7740.dtsi | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/arch/arm/boot/dts/r8a7740.dtsi b/arch/arm/boot/dts/r8a7740.dtsi
+index 413590d6c316..d84714468cce 100644
+--- a/arch/arm/boot/dts/r8a7740.dtsi
++++ b/arch/arm/boot/dts/r8a7740.dtsi
+@@ -67,7 +67,7 @@
+ };
+
+ /* irqpin0: IRQ0 - IRQ7 */
+- irqpin0: irqpin@e6900000 {
++ irqpin0: interrupt-controller@e6900000 {
+ compatible = "renesas,intc-irqpin-r8a7740", "renesas,intc-irqpin";
+ #interrupt-cells = <2>;
+ interrupt-controller;
+@@ -89,7 +89,7 @@
+ };
+
+ /* irqpin1: IRQ8 - IRQ15 */
+- irqpin1: irqpin@e6900004 {
++ irqpin1: interrupt-controller@e6900004 {
+ compatible = "renesas,intc-irqpin-r8a7740", "renesas,intc-irqpin";
+ #interrupt-cells = <2>;
+ interrupt-controller;
+@@ -111,7 +111,7 @@
+ };
+
+ /* irqpin2: IRQ16 - IRQ23 */
+- irqpin2: irqpin@e6900008 {
++ irqpin2: interrupt-controller@e6900008 {
+ compatible = "renesas,intc-irqpin-r8a7740", "renesas,intc-irqpin";
+ #interrupt-cells = <2>;
+ interrupt-controller;
+@@ -133,7 +133,7 @@
+ };
+
+ /* irqpin3: IRQ24 - IRQ31 */
+- irqpin3: irqpin@e690000c {
++ irqpin3: interrupt-controller@e690000c {
+ compatible = "renesas,intc-irqpin-r8a7740", "renesas,intc-irqpin";
+ #interrupt-cells = <2>;
+ interrupt-controller;
+--
+2.6.2
+
diff --git a/patches.renesas/0021-ARM-shmobile-r8a7778-dtsi-Use-generic-names-for-devi.patch b/patches.renesas/0021-ARM-shmobile-r8a7778-dtsi-Use-generic-names-for-devi.patch
new file mode 100644
index 00000000000000..05bde476ba1bd6
--- /dev/null
+++ b/patches.renesas/0021-ARM-shmobile-r8a7778-dtsi-Use-generic-names-for-devi.patch
@@ -0,0 +1,32 @@
+From 892f198b9df52f8c9f4569c68250b58e7fc51909 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Mon, 27 Apr 2015 14:55:26 +0200
+Subject: [PATCH 021/129] ARM: shmobile: r8a7778 dtsi: Use generic names for
+ device nodes
+
+irqpin -> interrupt-controller
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit b38150fae0164d363c852d6b782ab7083697c6d2)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7778.dtsi | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/r8a7778.dtsi b/arch/arm/boot/dts/r8a7778.dtsi
+index 868f97309533..7ce9f5fd5865 100644
+--- a/arch/arm/boot/dts/r8a7778.dtsi
++++ b/arch/arm/boot/dts/r8a7778.dtsi
+@@ -68,7 +68,7 @@
+ };
+
+ /* irqpin: IRQ0 - IRQ3 */
+- irqpin: irqpin@fe78001c {
++ irqpin: interrupt-controller@fe78001c {
+ compatible = "renesas,intc-irqpin-r8a7778", "renesas,intc-irqpin";
+ #interrupt-cells = <2>;
+ interrupt-controller;
+--
+2.6.2
+
diff --git a/patches.renesas/0022-ARM-shmobile-r8a7779-dtsi-Use-generic-names-for-devi.patch b/patches.renesas/0022-ARM-shmobile-r8a7779-dtsi-Use-generic-names-for-devi.patch
new file mode 100644
index 00000000000000..3c65780f06dbbe
--- /dev/null
+++ b/patches.renesas/0022-ARM-shmobile-r8a7779-dtsi-Use-generic-names-for-devi.patch
@@ -0,0 +1,32 @@
+From a66e6a237431eb6ef5450543a8f6ca9fa7363552 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Mon, 27 Apr 2015 14:55:27 +0200
+Subject: [PATCH 022/129] ARM: shmobile: r8a7779 dtsi: Use generic names for
+ device nodes
+
+irqpin -> interrupt-controller
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit a37771c6e36f2db84a67074d35d7519f75939b43)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7779.dtsi | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/r8a7779.dtsi b/arch/arm/boot/dts/r8a7779.dtsi
+index 5c2219b9f3eb..5c8071e87ae9 100644
+--- a/arch/arm/boot/dts/r8a7779.dtsi
++++ b/arch/arm/boot/dts/r8a7779.dtsi
+@@ -148,7 +148,7 @@
+ interrupt-controller;
+ };
+
+- irqpin0: irqpin@fe780010 {
++ irqpin0: interrupt-controller@fe780010 {
+ compatible = "renesas,intc-irqpin-r8a7779", "renesas,intc-irqpin";
+ #interrupt-cells = <2>;
+ status = "disabled";
+--
+2.6.2
+
diff --git a/patches.renesas/0023-ARM-shmobile-r8a7790-dtsi-Use-generic-names-for-devi.patch b/patches.renesas/0023-ARM-shmobile-r8a7790-dtsi-Use-generic-names-for-devi.patch
new file mode 100644
index 00000000000000..1aba76b2c81a00
--- /dev/null
+++ b/patches.renesas/0023-ARM-shmobile-r8a7790-dtsi-Use-generic-names-for-devi.patch
@@ -0,0 +1,32 @@
+From 706ff2b4e5f302387f26f828b2f8e476263f67a6 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Mon, 27 Apr 2015 14:55:28 +0200
+Subject: [PATCH 023/129] ARM: shmobile: r8a7790 dtsi: Use generic names for
+ device nodes
+
+rcar_sound -> sound
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit b694e3807b5b12273ba057e8cfcf82c2331606e0)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7790.dtsi | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/r8a7790.dtsi b/arch/arm/boot/dts/r8a7790.dtsi
+index 22e73906ec88..c9055e39b8bb 100644
+--- a/arch/arm/boot/dts/r8a7790.dtsi
++++ b/arch/arm/boot/dts/r8a7790.dtsi
+@@ -1451,7 +1451,7 @@
+ status = "disabled";
+ };
+
+- rcar_sound: rcar_sound@ec500000 {
++ rcar_sound: sound@ec500000 {
+ /*
+ * #sound-dai-cells is required
+ *
+--
+2.6.2
+
diff --git a/patches.renesas/0024-ARM-shmobile-r8a7791-dtsi-Use-generic-names-for-devi.patch b/patches.renesas/0024-ARM-shmobile-r8a7791-dtsi-Use-generic-names-for-devi.patch
new file mode 100644
index 00000000000000..f73ee5ed14cb2c
--- /dev/null
+++ b/patches.renesas/0024-ARM-shmobile-r8a7791-dtsi-Use-generic-names-for-devi.patch
@@ -0,0 +1,32 @@
+From 4f8c205b0bdab2b1b545b5cb4c5cfc3942519b81 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Mon, 27 Apr 2015 14:55:29 +0200
+Subject: [PATCH 024/129] ARM: shmobile: r8a7791 dtsi: Use generic names for
+ device nodes
+
+rcar_sound -> sound
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 6c63e07dcc2e941288d18e3fe9b448265f9ca9d0)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7791.dtsi | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/r8a7791.dtsi b/arch/arm/boot/dts/r8a7791.dtsi
+index d2c41ad701cc..30e1e13a228f 100644
+--- a/arch/arm/boot/dts/r8a7791.dtsi
++++ b/arch/arm/boot/dts/r8a7791.dtsi
+@@ -1494,7 +1494,7 @@
+ status = "disabled";
+ };
+
+- rcar_sound: rcar_sound@ec500000 {
++ rcar_sound: sound@ec500000 {
+ /*
+ * #sound-dai-cells is required
+ *
+--
+2.6.2
+
diff --git a/patches.renesas/0025-ARM-shmobile-sh73a0-dtsi-Use-generic-names-for-devic.patch b/patches.renesas/0025-ARM-shmobile-sh73a0-dtsi-Use-generic-names-for-devic.patch
new file mode 100644
index 00000000000000..d59cea3fd364f5
--- /dev/null
+++ b/patches.renesas/0025-ARM-shmobile-sh73a0-dtsi-Use-generic-names-for-devic.patch
@@ -0,0 +1,59 @@
+From 4bb5e8985d471d3e0aea62c50635733ba07882bc Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Mon, 27 Apr 2015 14:55:30 +0200
+Subject: [PATCH 025/129] ARM: shmobile: sh73a0 dtsi: Use generic names for
+ device nodes
+
+irqpin -> interrupt-controller
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 4239baee807bbd93e89eef184b2547f5ae902615)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/sh73a0.dtsi | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/arch/arm/boot/dts/sh73a0.dtsi b/arch/arm/boot/dts/sh73a0.dtsi
+index cde61b463b6a..11e17c5f26e2 100644
+--- a/arch/arm/boot/dts/sh73a0.dtsi
++++ b/arch/arm/boot/dts/sh73a0.dtsi
+@@ -90,7 +90,7 @@
+ status = "disabled";
+ };
+
+- irqpin0: irqpin@e6900000 {
++ irqpin0: interrupt-controller@e6900000 {
+ compatible = "renesas,intc-irqpin-sh73a0", "renesas,intc-irqpin";
+ #interrupt-cells = <2>;
+ interrupt-controller;
+@@ -112,7 +112,7 @@
+ control-parent;
+ };
+
+- irqpin1: irqpin@e6900004 {
++ irqpin1: interrupt-controller@e6900004 {
+ compatible = "renesas,intc-irqpin-sh73a0", "renesas,intc-irqpin";
+ #interrupt-cells = <2>;
+ interrupt-controller;
+@@ -134,7 +134,7 @@
+ control-parent;
+ };
+
+- irqpin2: irqpin@e6900008 {
++ irqpin2: interrupt-controller@e6900008 {
+ compatible = "renesas,intc-irqpin-sh73a0", "renesas,intc-irqpin";
+ #interrupt-cells = <2>;
+ interrupt-controller;
+@@ -156,7 +156,7 @@
+ control-parent;
+ };
+
+- irqpin3: irqpin@e690000c {
++ irqpin3: interrupt-controller@e690000c {
+ compatible = "renesas,intc-irqpin-sh73a0", "renesas,intc-irqpin";
+ #interrupt-cells = <2>;
+ interrupt-controller;
+--
+2.6.2
+
diff --git a/patches.renesas/0026-ARM-shmobile-ape6evm-dts-Use-generic-names-for-devic.patch b/patches.renesas/0026-ARM-shmobile-ape6evm-dts-Use-generic-names-for-devic.patch
new file mode 100644
index 00000000000000..dae41e31d66de5
--- /dev/null
+++ b/patches.renesas/0026-ARM-shmobile-ape6evm-dts-Use-generic-names-for-devic.patch
@@ -0,0 +1,32 @@
+From 07cfd9bc103e4cac10a03d5e9c674c0c643181e7 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Mon, 27 Apr 2015 14:55:31 +0200
+Subject: [PATCH 026/129] ARM: shmobile: ape6evm dts: Use generic names for
+ device nodes
+
+max8973 -> regulator
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit e8545be97479972346a1519412c5330b4223ca20)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a73a4-ape6evm.dts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/r8a73a4-ape6evm.dts b/arch/arm/boot/dts/r8a73a4-ape6evm.dts
+index 81a38ceee098..a4c425923c05 100644
+--- a/arch/arm/boot/dts/r8a73a4-ape6evm.dts
++++ b/arch/arm/boot/dts/r8a73a4-ape6evm.dts
+@@ -147,7 +147,7 @@
+
+ &i2c5 {
+ status = "okay";
+- vdd_dvfs: max8973@1b {
++ vdd_dvfs: regulator@1b {
+ compatible = "maxim,max8973";
+ reg = <0x1b>;
+
+--
+2.6.2
+
diff --git a/patches.renesas/0027-ARM-shmobile-kzm9d-dts-Use-generic-names-for-device-.patch b/patches.renesas/0027-ARM-shmobile-kzm9d-dts-Use-generic-names-for-device-.patch
new file mode 100644
index 00000000000000..ac982a5a92ac45
--- /dev/null
+++ b/patches.renesas/0027-ARM-shmobile-kzm9d-dts-Use-generic-names-for-device-.patch
@@ -0,0 +1,42 @@
+From 28f203d7b86bf690814fa93fff09cb426fd37e27 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Mon, 27 Apr 2015 14:55:33 +0200
+Subject: [PATCH 027/129] ARM: shmobile: kzm9d dts: Use generic names for
+ device nodes
+
+lan9220 -> ethernet
+uart -> serial
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 69478b2093796860e3991db102ede97131b8d67a)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/emev2-kzm9d.dts | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/arch/arm/boot/dts/emev2-kzm9d.dts b/arch/arm/boot/dts/emev2-kzm9d.dts
+index 19446273e4a7..1dee0aa4f40c 100644
+--- a/arch/arm/boot/dts/emev2-kzm9d.dts
++++ b/arch/arm/boot/dts/emev2-kzm9d.dts
+@@ -81,7 +81,7 @@
+ regulator-boot-on;
+ };
+
+- lan9220@20000000 {
++ ethernet@20000000 {
+ compatible = "smsc,lan9220", "smsc,lan9115";
+ reg = <0x20000000 0x10000>;
+ phy-mode = "mii";
+@@ -96,7 +96,7 @@
+ };
+
+ &pfc {
+- uart1_pins: uart@e1030000 {
++ uart1_pins: serial@e1030000 {
+ renesas,groups = "uart1_ctrl", "uart1_data";
+ renesas,function = "uart1";
+ };
+--
+2.6.2
+
diff --git a/patches.renesas/0028-ARM-shmobile-marzen-dts-Use-generic-names-for-device.patch b/patches.renesas/0028-ARM-shmobile-marzen-dts-Use-generic-names-for-device.patch
new file mode 100644
index 00000000000000..ffcd25ce94cfcc
--- /dev/null
+++ b/patches.renesas/0028-ARM-shmobile-marzen-dts-Use-generic-names-for-device.patch
@@ -0,0 +1,45 @@
+From 5400a5cd96d0f7e15f3532ba61fd36c95cb6a925 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Mon, 27 Apr 2015 14:55:34 +0200
+Subject: [PATCH 028/129] ARM: shmobile: marzen dts: Use generic names for
+ device nodes
+
+lan0 -> ethernet
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit f92d9dc7e6cd15dcd096dc5a4d3e1fe0a034f659)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7779-marzen.dts | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/arch/arm/boot/dts/r8a7779-marzen.dts b/arch/arm/boot/dts/r8a7779-marzen.dts
+index 540756cdf391..20afea6f06ef 100644
+--- a/arch/arm/boot/dts/r8a7779-marzen.dts
++++ b/arch/arm/boot/dts/r8a7779-marzen.dts
+@@ -42,10 +42,10 @@
+ regulator-always-on;
+ };
+
+- lan0@18000000 {
++ ethernet@18000000 {
+ compatible = "smsc,lan9220", "smsc,lan9115";
+ reg = <0x18000000 0x100>;
+- pinctrl-0 = <&lan0_pins>;
++ pinctrl-0 = <&ethernet_pins>;
+ pinctrl-names = "default";
+
+ phy-mode = "mii";
+@@ -176,7 +176,7 @@
+ };
+ };
+
+- lan0_pins: lan0 {
++ ethernet_pins: ethernet {
+ intc {
+ renesas,groups = "intc_irq1_b";
+ renesas,function = "intc";
+--
+2.6.2
+
diff --git a/patches.renesas/0029-ARM-shmobile-armadillo800eva-dts-Use-generic-names-f.patch b/patches.renesas/0029-ARM-shmobile-armadillo800eva-dts-Use-generic-names-f.patch
new file mode 100644
index 00000000000000..46fa098c4feeb0
--- /dev/null
+++ b/patches.renesas/0029-ARM-shmobile-armadillo800eva-dts-Use-generic-names-f.patch
@@ -0,0 +1,32 @@
+From e2a4b32b835b2773cc68ac885f89b15e12033bca Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Mon, 27 Apr 2015 14:55:32 +0200
+Subject: [PATCH 029/129] ARM: shmobile: armadillo800eva dts: Use generic names
+ for device nodes
+
+wm8978 -> codec
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 92d2434d8effe6160eb7f4fd0d01ef5b76930f2a)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7740-armadillo800eva.dts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/r8a7740-armadillo800eva.dts b/arch/arm/boot/dts/r8a7740-armadillo800eva.dts
+index 9bd0cb439f44..2e31d8c01cbf 100644
+--- a/arch/arm/boot/dts/r8a7740-armadillo800eva.dts
++++ b/arch/arm/boot/dts/r8a7740-armadillo800eva.dts
+@@ -208,7 +208,7 @@
+ gpios = <&pfc 166 GPIO_ACTIVE_LOW>;
+ };
+
+- wm8978: wm8978@1a {
++ wm8978: codec@1a {
+ #sound-dai-cells = <0>;
+ compatible = "wlf,wm8978";
+ reg = <0x1a>;
+--
+2.6.2
+
diff --git a/patches.renesas/0030-ARM-shmobile-henninger-dts-Add-nor-jedec-compatible-.patch b/patches.renesas/0030-ARM-shmobile-henninger-dts-Add-nor-jedec-compatible-.patch
new file mode 100644
index 00000000000000..4d95e48cd47180
--- /dev/null
+++ b/patches.renesas/0030-ARM-shmobile-henninger-dts-Add-nor-jedec-compatible-.patch
@@ -0,0 +1,35 @@
+From 04272a6589af8828ca0df59a6d1f19a19573aa17 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Tue, 28 Apr 2015 12:12:56 +0200
+Subject: [PATCH 030/129] ARM: shmobile: henninger dts: Add "nor-jedec"
+ compatible value
+
+Spansion s25fl512s is compatible with "nor-jedec". Hence add the
+"nor-jedec" compatible value, so the driver can bind against the generic
+name, cfr. commit 8ff16cf77ce314c2 ("Documentation: devicetree: m25p80:
+add "nor-jedec" binding").
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 7aa4008133cc5c1dab7006c6f2773de2ce6e8786)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7791-henninger.dts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/r8a7791-henninger.dts b/arch/arm/boot/dts/r8a7791-henninger.dts
+index e33e4047b0b0..bb80122b4113 100644
+--- a/arch/arm/boot/dts/r8a7791-henninger.dts
++++ b/arch/arm/boot/dts/r8a7791-henninger.dts
+@@ -226,7 +226,7 @@
+ flash@0 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+- compatible = "spansion,s25fl512s";
++ compatible = "spansion,s25fl512s", "nor-jedec";
+ reg = <0>;
+ spi-max-frequency = <30000000>;
+ spi-tx-bus-width = <4>;
+--
+2.6.2
+
diff --git a/patches.renesas/0031-ARM-shmobile-bockw-reference-dts-Add-nor-jedec-compa.patch b/patches.renesas/0031-ARM-shmobile-bockw-reference-dts-Add-nor-jedec-compa.patch
new file mode 100644
index 00000000000000..fd0ff9501a4275
--- /dev/null
+++ b/patches.renesas/0031-ARM-shmobile-bockw-reference-dts-Add-nor-jedec-compa.patch
@@ -0,0 +1,35 @@
+From ed17bedc06c92c4346cbd27d658c8da8ebdce8fc Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Tue, 28 Apr 2015 12:12:57 +0200
+Subject: [PATCH 031/129] ARM: shmobile: bockw-reference dts: Add "nor-jedec"
+ compatible value
+
+Spansion s25fl008k is compatible with "nor-jedec". Hence add the
+"nor-jedec" compatible value, so the driver can bind against the generic
+name, cfr. commit 8ff16cf77ce314c2 ("Documentation: devicetree: m25p80:
+add "nor-jedec" binding").
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 97c5afdffaca5d549e5680a2e1264d74821c287c)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7778-bockw-reference.dts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/r8a7778-bockw-reference.dts b/arch/arm/boot/dts/r8a7778-bockw-reference.dts
+index 04c0c37bb784..f9422d887b44 100644
+--- a/arch/arm/boot/dts/r8a7778-bockw-reference.dts
++++ b/arch/arm/boot/dts/r8a7778-bockw-reference.dts
+@@ -119,7 +119,7 @@
+ flash: flash@0 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+- compatible = "spansion,s25fl008k";
++ compatible = "spansion,s25fl008k", "nor-jedec";
+ reg = <0>;
+ spi-max-frequency = <104000000>;
+ m25p,fast-read;
+--
+2.6.2
+
diff --git a/patches.renesas/0032-ARM-shmobile-lager-dts-Add-nor-jedec-compatible-valu.patch b/patches.renesas/0032-ARM-shmobile-lager-dts-Add-nor-jedec-compatible-valu.patch
new file mode 100644
index 00000000000000..355f213dd83a39
--- /dev/null
+++ b/patches.renesas/0032-ARM-shmobile-lager-dts-Add-nor-jedec-compatible-valu.patch
@@ -0,0 +1,35 @@
+From ea6c31e5140587282360b8a2958657bd5008ada5 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Tue, 28 Apr 2015 12:12:55 +0200
+Subject: [PATCH 032/129] ARM: shmobile: lager dts: Add "nor-jedec" compatible
+ value
+
+Spansion s25fl512s is compatible with "nor-jedec". Hence add the
+"nor-jedec" compatible value, so the driver can bind against the generic
+name, cfr. commit 8ff16cf77ce314c2 ("Documentation: devicetree: m25p80:
+add "nor-jedec" binding").
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 7821637c4da224bdcca54421d07a0bb43e6955a9)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7790-lager.dts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/r8a7790-lager.dts b/arch/arm/boot/dts/r8a7790-lager.dts
+index aaa4f258e279..a6c793de8d80 100644
+--- a/arch/arm/boot/dts/r8a7790-lager.dts
++++ b/arch/arm/boot/dts/r8a7790-lager.dts
+@@ -429,7 +429,7 @@
+ flash: flash@0 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+- compatible = "spansion,s25fl512s";
++ compatible = "spansion,s25fl512s", "nor-jedec";
+ reg = <0>;
+ spi-max-frequency = <30000000>;
+ spi-tx-bus-width = <4>;
+--
+2.6.2
+
diff --git a/patches.renesas/0033-ARM-shmobile-bockw-dts-Add-nor-jedec-compatible-valu.patch b/patches.renesas/0033-ARM-shmobile-bockw-dts-Add-nor-jedec-compatible-valu.patch
new file mode 100644
index 00000000000000..a2dcc579630efb
--- /dev/null
+++ b/patches.renesas/0033-ARM-shmobile-bockw-dts-Add-nor-jedec-compatible-valu.patch
@@ -0,0 +1,35 @@
+From ee61923de182e40c892431e179afea0bd9a5f2b8 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Tue, 28 Apr 2015 12:12:58 +0200
+Subject: [PATCH 033/129] ARM: shmobile: bockw dts: Add "nor-jedec" compatible
+ value
+
+Spansion s25fl008k is compatible with "nor-jedec". Hence add the
+"nor-jedec" compatible value, so the driver can bind against the generic
+name, cfr. commit 8ff16cf77ce314c2 ("Documentation: devicetree: m25p80:
+add "nor-jedec" binding").
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit e31cc1e28791e73ae7f9fb382e25b60257790dc6)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7778-bockw.dts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/r8a7778-bockw.dts b/arch/arm/boot/dts/r8a7778-bockw.dts
+index 787fa6f9f46d..7ebc4a4f4608 100644
+--- a/arch/arm/boot/dts/r8a7778-bockw.dts
++++ b/arch/arm/boot/dts/r8a7778-bockw.dts
+@@ -186,7 +186,7 @@
+ flash: flash@0 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+- compatible = "spansion,s25fl008k";
++ compatible = "spansion,s25fl008k", "nor-jedec";
+ reg = <0>;
+ spi-max-frequency = <104000000>;
+ m25p,fast-read;
+--
+2.6.2
+
diff --git a/patches.renesas/0034-ARM-shmobile-koelsch-dts-Add-nor-jedec-compatible-va.patch b/patches.renesas/0034-ARM-shmobile-koelsch-dts-Add-nor-jedec-compatible-va.patch
new file mode 100644
index 00000000000000..6d8db50d8ebdf4
--- /dev/null
+++ b/patches.renesas/0034-ARM-shmobile-koelsch-dts-Add-nor-jedec-compatible-va.patch
@@ -0,0 +1,35 @@
+From cabe329bbd5f99fac948ef2a5d2fec5c2d274529 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Tue, 28 Apr 2015 12:12:54 +0200
+Subject: [PATCH 034/129] ARM: shmobile: koelsch dts: Add "nor-jedec"
+ compatible value
+
+Spansion s25fl512s is compatible with "nor-jedec". Hence add the
+"nor-jedec" compatible value, so the driver can bind against the generic
+name, cfr. commit 8ff16cf77ce314c2 ("Documentation: devicetree: m25p80:
+add "nor-jedec" binding").
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit b20cac26acb53a652b28efc5b94757fe2ef6178e)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7791-koelsch.dts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/r8a7791-koelsch.dts b/arch/arm/boot/dts/r8a7791-koelsch.dts
+index 824ddab9c3ad..6163487289b3 100644
+--- a/arch/arm/boot/dts/r8a7791-koelsch.dts
++++ b/arch/arm/boot/dts/r8a7791-koelsch.dts
+@@ -474,7 +474,7 @@
+ flash: flash@0 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+- compatible = "spansion,s25fl512s";
++ compatible = "spansion,s25fl512s", "nor-jedec";
+ reg = <0>;
+ spi-max-frequency = <30000000>;
+ spi-tx-bus-width = <4>;
+--
+2.6.2
+
diff --git a/patches.renesas/0035-ARM-shmobile-bockw-dts-Use-generic-names-for-device-.patch b/patches.renesas/0035-ARM-shmobile-bockw-dts-Use-generic-names-for-device-.patch
new file mode 100644
index 00000000000000..c2d927c1c474bd
--- /dev/null
+++ b/patches.renesas/0035-ARM-shmobile-bockw-dts-Use-generic-names-for-device-.patch
@@ -0,0 +1,32 @@
+From 0a7a70d1b3627029140d5d369c33244606b9af45 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Tue, 28 Apr 2015 12:29:21 +0200
+Subject: [PATCH 035/129] ARM: shmobile: bockw dts: Use generic names for
+ device nodes
+
+sound-codec -> codec
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 61ffb5ca6c8e5246c7b257a733c33b94b19de3da)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7778-bockw.dts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/r8a7778-bockw.dts b/arch/arm/boot/dts/r8a7778-bockw.dts
+index 7ebc4a4f4608..dfbb12e4fef4 100644
+--- a/arch/arm/boot/dts/r8a7778-bockw.dts
++++ b/arch/arm/boot/dts/r8a7778-bockw.dts
+@@ -85,7 +85,7 @@
+ &i2c0 {
+ status = "okay";
+
+- ak4643: sound-codec@12 {
++ ak4643: codec@12 {
+ compatible = "asahi-kasei,ak4643";
+ #sound-dai-cells = <0>;
+ reg = <0x12>;
+--
+2.6.2
+
diff --git a/patches.renesas/0036-ARM-shmobile-lager-dts-Use-generic-names-for-device-.patch b/patches.renesas/0036-ARM-shmobile-lager-dts-Use-generic-names-for-device-.patch
new file mode 100644
index 00000000000000..d8c30be7cc6cbc
--- /dev/null
+++ b/patches.renesas/0036-ARM-shmobile-lager-dts-Use-generic-names-for-device-.patch
@@ -0,0 +1,32 @@
+From cd9a77bfb064a47348c700c4bb030701ca52994e Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Tue, 28 Apr 2015 12:29:22 +0200
+Subject: [PATCH 036/129] ARM: shmobile: lager dts: Use generic names for
+ device nodes
+
+sound-codec -> codec
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit d22b16876b62b4ffe2b4e31fb7a6e1af1a45fa25)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7790-lager.dts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/r8a7790-lager.dts b/arch/arm/boot/dts/r8a7790-lager.dts
+index a6c793de8d80..b6cffcedd116 100644
+--- a/arch/arm/boot/dts/r8a7790-lager.dts
++++ b/arch/arm/boot/dts/r8a7790-lager.dts
+@@ -525,7 +525,7 @@
+
+ clock-frequency = <100000>;
+
+- ak4643: sound-codec@12 {
++ ak4643: codec@12 {
+ compatible = "asahi-kasei,ak4643";
+ #sound-dai-cells = <0>;
+ reg = <0x12>;
+--
+2.6.2
+
diff --git a/patches.renesas/0037-ARM-shmobile-koelsch-dts-Use-generic-names-for-devic.patch b/patches.renesas/0037-ARM-shmobile-koelsch-dts-Use-generic-names-for-devic.patch
new file mode 100644
index 00000000000000..14fc0c8d6591aa
--- /dev/null
+++ b/patches.renesas/0037-ARM-shmobile-koelsch-dts-Use-generic-names-for-devic.patch
@@ -0,0 +1,32 @@
+From adebc612aa01d519f4d64124ba93ca66c2c062d8 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Tue, 28 Apr 2015 12:29:23 +0200
+Subject: [PATCH 037/129] ARM: shmobile: koelsch dts: Use generic names for
+ device nodes
+
+sound-codec -> codec
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 95cfb59a27360bbfd337d011676893f2726bfb42)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7791-koelsch.dts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/r8a7791-koelsch.dts b/arch/arm/boot/dts/r8a7791-koelsch.dts
+index 6163487289b3..e9c24036f000 100644
+--- a/arch/arm/boot/dts/r8a7791-koelsch.dts
++++ b/arch/arm/boot/dts/r8a7791-koelsch.dts
+@@ -522,7 +522,7 @@
+ status = "okay";
+ clock-frequency = <100000>;
+
+- ak4643: sound-codec@12 {
++ ak4643: codec@12 {
+ compatible = "asahi-kasei,ak4643";
+ #sound-dai-cells = <0>;
+ reg = <0x12>;
+--
+2.6.2
+
diff --git a/patches.renesas/0038-ARM-shmobile-kzm9g-dts-Configure-the-HOME-key-as-wak.patch b/patches.renesas/0038-ARM-shmobile-kzm9g-dts-Configure-the-HOME-key-as-wak.patch
new file mode 100644
index 00000000000000..18f14e01e58bf2
--- /dev/null
+++ b/patches.renesas/0038-ARM-shmobile-kzm9g-dts-Configure-the-HOME-key-as-wak.patch
@@ -0,0 +1,32 @@
+From ff0714f5c9a4fbe68214e7566af21708ef5fc083 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Mon, 4 May 2015 19:36:09 +0200
+Subject: [PATCH 038/129] ARM: shmobile: kzm9g dts: Configure the HOME key as
+ wake-up source
+
+Note that from now on any of the pfc8575 gpio keys will wake up the
+system, as the pfc8575 cannot mask individual interrupts.
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit cab7562a92edb89668fe548f5d8c8300e7438c62)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/sh73a0-kzm9g.dts | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/arch/arm/boot/dts/sh73a0-kzm9g.dts b/arch/arm/boot/dts/sh73a0-kzm9g.dts
+index 022ba505f573..24b4cd24dceb 100644
+--- a/arch/arm/boot/dts/sh73a0-kzm9g.dts
++++ b/arch/arm/boot/dts/sh73a0-kzm9g.dts
+@@ -147,6 +147,7 @@
+ gpios = <&pcf8575 14 GPIO_ACTIVE_LOW>;
+ linux,code = <KEY_HOME>;
+ label = "SW1";
++ gpio-key,wakeup;
+ };
+ };
+
+--
+2.6.2
+
diff --git a/patches.renesas/0039-ARM-shmobile-r8a7790-add-USB-DMAC-device-nodes.patch b/patches.renesas/0039-ARM-shmobile-r8a7790-add-USB-DMAC-device-nodes.patch
new file mode 100644
index 00000000000000..9c85ea48cfb22f
--- /dev/null
+++ b/patches.renesas/0039-ARM-shmobile-r8a7790-add-USB-DMAC-device-nodes.patch
@@ -0,0 +1,50 @@
+From 0042512348f5967bd65cb0d56a4d9dd53e3d2724 Mon Sep 17 00:00:00 2001
+From: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
+Date: Fri, 8 May 2015 16:13:06 +0900
+Subject: [PATCH 039/129] ARM: shmobile: r8a7790: add USB-DMAC device nodes
+
+Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
+Acked-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit a3ff2090dc2a358bfe9e3d4c50f3921a732feb30)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7790.dtsi | 22 ++++++++++++++++++++++
+ 1 file changed, 22 insertions(+)
+
+diff --git a/arch/arm/boot/dts/r8a7790.dtsi b/arch/arm/boot/dts/r8a7790.dtsi
+index c9055e39b8bb..c03a91506c2e 100644
+--- a/arch/arm/boot/dts/r8a7790.dtsi
++++ b/arch/arm/boot/dts/r8a7790.dtsi
+@@ -371,6 +371,28 @@
+ dma-channels = <13>;
+ };
+
++ usb_dmac0: dma-controller@e65a0000 {
++ compatible = "renesas,usb-dmac";
++ reg = <0 0xe65a0000 0 0x100>;
++ interrupts = <0 109 IRQ_TYPE_LEVEL_HIGH
++ 0 109 IRQ_TYPE_LEVEL_HIGH>;
++ interrupt-names = "ch0", "ch1";
++ clocks = <&mstp3_clks R8A7790_CLK_USBDMAC0>;
++ #dma-cells = <1>;
++ dma-channels = <2>;
++ };
++
++ usb_dmac1: dma-controller@e65b0000 {
++ compatible = "renesas,usb-dmac";
++ reg = <0 0xe65b0000 0 0x100>;
++ interrupts = <0 110 IRQ_TYPE_LEVEL_HIGH
++ 0 110 IRQ_TYPE_LEVEL_HIGH>;
++ interrupt-names = "ch0", "ch1";
++ clocks = <&mstp3_clks R8A7790_CLK_USBDMAC1>;
++ #dma-cells = <1>;
++ dma-channels = <2>;
++ };
++
+ i2c0: i2c@e6508000 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+--
+2.6.2
+
diff --git a/patches.renesas/0040-ARM-shmobile-r8a7790-Enable-DMA-for-HSUSB.patch b/patches.renesas/0040-ARM-shmobile-r8a7790-Enable-DMA-for-HSUSB.patch
new file mode 100644
index 00000000000000..fbac55e63b30b8
--- /dev/null
+++ b/patches.renesas/0040-ARM-shmobile-r8a7790-Enable-DMA-for-HSUSB.patch
@@ -0,0 +1,32 @@
+From 24342ebd276466e7addb6cadf6c38bacc55a3daa Mon Sep 17 00:00:00 2001
+From: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
+Date: Fri, 8 May 2015 16:13:07 +0900
+Subject: [PATCH 040/129] ARM: shmobile: r8a7790: Enable DMA for HSUSB
+
+This patch adds DMA properties to the HSUSB node.
+
+Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit e8295dc39136a23b090885f43e13087cd460fc26)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7790.dtsi | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/arch/arm/boot/dts/r8a7790.dtsi b/arch/arm/boot/dts/r8a7790.dtsi
+index c03a91506c2e..62a9086b133d 100644
+--- a/arch/arm/boot/dts/r8a7790.dtsi
++++ b/arch/arm/boot/dts/r8a7790.dtsi
+@@ -673,6 +673,9 @@
+ renesas,buswait = <4>;
+ phys = <&usb0 1>;
+ phy-names = "usb";
++ dmas = <&usb_dmac0 0>, <&usb_dmac0 1>,
++ <&usb_dmac1 0>, <&usb_dmac1 1>;
++ dma-names = "ch0", "ch1", "ch2", "ch3";
+ status = "disabled";
+ };
+
+--
+2.6.2
+
diff --git a/patches.renesas/0041-ARM-shmobile-r8a7791-add-USB-DMAC-device-nodes.patch b/patches.renesas/0041-ARM-shmobile-r8a7791-add-USB-DMAC-device-nodes.patch
new file mode 100644
index 00000000000000..22778ffbc662d3
--- /dev/null
+++ b/patches.renesas/0041-ARM-shmobile-r8a7791-add-USB-DMAC-device-nodes.patch
@@ -0,0 +1,50 @@
+From 5d028095da01eca25b6d185770818afbf65f8de3 Mon Sep 17 00:00:00 2001
+From: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
+Date: Fri, 8 May 2015 16:13:33 +0900
+Subject: [PATCH 041/129] ARM: shmobile: r8a7791: add USB-DMAC device nodes
+
+Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
+Acked-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit e3e25edc1116ebf44b1813aff03b02b7737d41ca)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7791.dtsi | 22 ++++++++++++++++++++++
+ 1 file changed, 22 insertions(+)
+
+diff --git a/arch/arm/boot/dts/r8a7791.dtsi b/arch/arm/boot/dts/r8a7791.dtsi
+index 30e1e13a228f..754c3f20f224 100644
+--- a/arch/arm/boot/dts/r8a7791.dtsi
++++ b/arch/arm/boot/dts/r8a7791.dtsi
+@@ -358,6 +358,28 @@
+ dma-channels = <13>;
+ };
+
++ usb_dmac0: dma-controller@e65a0000 {
++ compatible = "renesas,usb-dmac";
++ reg = <0 0xe65a0000 0 0x100>;
++ interrupts = <0 109 IRQ_TYPE_LEVEL_HIGH
++ 0 109 IRQ_TYPE_LEVEL_HIGH>;
++ interrupt-names = "ch0", "ch1";
++ clocks = <&mstp3_clks R8A7791_CLK_USBDMAC0>;
++ #dma-cells = <1>;
++ dma-channels = <2>;
++ };
++
++ usb_dmac1: dma-controller@e65b0000 {
++ compatible = "renesas,usb-dmac";
++ reg = <0 0xe65b0000 0 0x100>;
++ interrupts = <0 110 IRQ_TYPE_LEVEL_HIGH
++ 0 110 IRQ_TYPE_LEVEL_HIGH>;
++ interrupt-names = "ch0", "ch1";
++ clocks = <&mstp3_clks R8A7791_CLK_USBDMAC1>;
++ #dma-cells = <1>;
++ dma-channels = <2>;
++ };
++
+ /* The memory map in the User's Manual maps the cores to bus numbers */
+ i2c0: i2c@e6508000 {
+ #address-cells = <1>;
+--
+2.6.2
+
diff --git a/patches.renesas/0042-ARM-shmobile-r8a7791-Enable-DMA-for-HSUSB.patch b/patches.renesas/0042-ARM-shmobile-r8a7791-Enable-DMA-for-HSUSB.patch
new file mode 100644
index 00000000000000..18066759fc7d3c
--- /dev/null
+++ b/patches.renesas/0042-ARM-shmobile-r8a7791-Enable-DMA-for-HSUSB.patch
@@ -0,0 +1,32 @@
+From 6dad4acc84563723ad2a12dfd6fcdb9699fab746 Mon Sep 17 00:00:00 2001
+From: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
+Date: Fri, 8 May 2015 16:13:34 +0900
+Subject: [PATCH 042/129] ARM: shmobile: r8a7791: Enable DMA for HSUSB
+
+This patch adds DMA properties to the HSUSB node.
+
+Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 7706993e2deb75022dbcfc3043890aa1a0020189)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7791.dtsi | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/arch/arm/boot/dts/r8a7791.dtsi b/arch/arm/boot/dts/r8a7791.dtsi
+index 754c3f20f224..7613abea13d7 100644
+--- a/arch/arm/boot/dts/r8a7791.dtsi
++++ b/arch/arm/boot/dts/r8a7791.dtsi
+@@ -723,6 +723,9 @@
+ renesas,buswait = <4>;
+ phys = <&usb0 1>;
+ phy-names = "usb";
++ dmas = <&usb_dmac0 0>, <&usb_dmac0 1>,
++ <&usb_dmac1 0>, <&usb_dmac1 1>;
++ dma-names = "ch0", "ch1", "ch2", "ch3";
+ status = "disabled";
+ };
+
+--
+2.6.2
+
diff --git a/patches.renesas/0043-ARM-shmobile-lager-dts-Replace-nor-jedec-by-jedec-sp.patch b/patches.renesas/0043-ARM-shmobile-lager-dts-Replace-nor-jedec-by-jedec-sp.patch
new file mode 100644
index 00000000000000..4fed0fd488b6c8
--- /dev/null
+++ b/patches.renesas/0043-ARM-shmobile-lager-dts-Replace-nor-jedec-by-jedec-sp.patch
@@ -0,0 +1,34 @@
+From 9075eeacaefed852fd06c01a7407178cdc414cbd Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Wed, 20 May 2015 20:16:52 +0200
+Subject: [PATCH 043/129] ARM: shmobile: lager dts: Replace "nor-jedec" by
+ "jedec,spi-nor"
+
+Cfr. commit 8947e396a8296c52 ('Documentation: dt: mtd: replace
+"nor-jedec" binding with "jedec, spi-nor"')
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Acked-by: Brian Norris <computersforpeace@gmail.com>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 755185b279171d78a12f879d06502866c6173b04)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7790-lager.dts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/r8a7790-lager.dts b/arch/arm/boot/dts/r8a7790-lager.dts
+index b6cffcedd116..2eb8a995ae9f 100644
+--- a/arch/arm/boot/dts/r8a7790-lager.dts
++++ b/arch/arm/boot/dts/r8a7790-lager.dts
+@@ -429,7 +429,7 @@
+ flash: flash@0 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+- compatible = "spansion,s25fl512s", "nor-jedec";
++ compatible = "spansion,s25fl512s", "jedec,spi-nor";
+ reg = <0>;
+ spi-max-frequency = <30000000>;
+ spi-tx-bus-width = <4>;
+--
+2.6.2
+
diff --git a/patches.renesas/0044-ARM-shmobile-koelsch-dts-Replace-nor-jedec-by-jedec-.patch b/patches.renesas/0044-ARM-shmobile-koelsch-dts-Replace-nor-jedec-by-jedec-.patch
new file mode 100644
index 00000000000000..d5d0f2ea7c7164
--- /dev/null
+++ b/patches.renesas/0044-ARM-shmobile-koelsch-dts-Replace-nor-jedec-by-jedec-.patch
@@ -0,0 +1,34 @@
+From ebe0743a9b2be4f643c76852158c6fbb81022882 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Wed, 20 May 2015 20:16:54 +0200
+Subject: [PATCH 044/129] ARM: shmobile: koelsch dts: Replace "nor-jedec" by
+ "jedec,spi-nor"
+
+Cfr. commit 8947e396a8296c52 ('Documentation: dt: mtd: replace
+"nor-jedec" binding with "jedec, spi-nor"')
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Acked-by: Brian Norris <computersforpeace@gmail.com>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit cc3db02c9c7cb0c322263b3a6983023b04e3944f)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7791-koelsch.dts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/r8a7791-koelsch.dts b/arch/arm/boot/dts/r8a7791-koelsch.dts
+index e9c24036f000..cffe33ff4d16 100644
+--- a/arch/arm/boot/dts/r8a7791-koelsch.dts
++++ b/arch/arm/boot/dts/r8a7791-koelsch.dts
+@@ -474,7 +474,7 @@
+ flash: flash@0 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+- compatible = "spansion,s25fl512s", "nor-jedec";
++ compatible = "spansion,s25fl512s", "jedec,spi-nor";
+ reg = <0>;
+ spi-max-frequency = <30000000>;
+ spi-tx-bus-width = <4>;
+--
+2.6.2
+
diff --git a/patches.renesas/0045-ARM-shmobile-bockw-reference-dts-Replace-nor-jedec-b.patch b/patches.renesas/0045-ARM-shmobile-bockw-reference-dts-Replace-nor-jedec-b.patch
new file mode 100644
index 00000000000000..89f0ed269f318e
--- /dev/null
+++ b/patches.renesas/0045-ARM-shmobile-bockw-reference-dts-Replace-nor-jedec-b.patch
@@ -0,0 +1,34 @@
+From 9ee0d44a3b7231451f5f7ef9616354553536e045 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Wed, 20 May 2015 20:16:50 +0200
+Subject: [PATCH 045/129] ARM: shmobile: bockw-reference dts: Replace
+ "nor-jedec" by "jedec,spi-nor"
+
+Cfr. commit 8947e396a8296c52 ('Documentation: dt: mtd: replace
+"nor-jedec" binding with "jedec, spi-nor"')
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Acked-by: Brian Norris <computersforpeace@gmail.com>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 49633bbbebcd2e398799389542d621bd9b8c5c56)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7778-bockw-reference.dts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/r8a7778-bockw-reference.dts b/arch/arm/boot/dts/r8a7778-bockw-reference.dts
+index f9422d887b44..dffa6ff30360 100644
+--- a/arch/arm/boot/dts/r8a7778-bockw-reference.dts
++++ b/arch/arm/boot/dts/r8a7778-bockw-reference.dts
+@@ -119,7 +119,7 @@
+ flash: flash@0 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+- compatible = "spansion,s25fl008k", "nor-jedec";
++ compatible = "spansion,s25fl008k", "jedec,spi-nor";
+ reg = <0>;
+ spi-max-frequency = <104000000>;
+ m25p,fast-read;
+--
+2.6.2
+
diff --git a/patches.renesas/0046-ARM-shmobile-henninger-dts-Replace-nor-jedec-by-jede.patch b/patches.renesas/0046-ARM-shmobile-henninger-dts-Replace-nor-jedec-by-jede.patch
new file mode 100644
index 00000000000000..b35a4646007343
--- /dev/null
+++ b/patches.renesas/0046-ARM-shmobile-henninger-dts-Replace-nor-jedec-by-jede.patch
@@ -0,0 +1,34 @@
+From 5f9f8af0316c67e30eee3c41536d7cf95690ccf2 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Wed, 20 May 2015 20:16:53 +0200
+Subject: [PATCH 046/129] ARM: shmobile: henninger dts: Replace "nor-jedec" by
+ "jedec,spi-nor"
+
+Cfr. commit 8947e396a8296c52 ('Documentation: dt: mtd: replace
+"nor-jedec" binding with "jedec, spi-nor"')
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Acked-by: Brian Norris <computersforpeace@gmail.com>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit aad8afc7ac3d9af6f7c43961fc6f41d401207b00)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7791-henninger.dts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/r8a7791-henninger.dts b/arch/arm/boot/dts/r8a7791-henninger.dts
+index bb80122b4113..655d1804e5e9 100644
+--- a/arch/arm/boot/dts/r8a7791-henninger.dts
++++ b/arch/arm/boot/dts/r8a7791-henninger.dts
+@@ -226,7 +226,7 @@
+ flash@0 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+- compatible = "spansion,s25fl512s", "nor-jedec";
++ compatible = "spansion,s25fl512s", "jedec,spi-nor";
+ reg = <0>;
+ spi-max-frequency = <30000000>;
+ spi-tx-bus-width = <4>;
+--
+2.6.2
+
diff --git a/patches.renesas/0047-ARM-shmobile-bockw-dts-Replace-nor-jedec-by-jedec-sp.patch b/patches.renesas/0047-ARM-shmobile-bockw-dts-Replace-nor-jedec-by-jedec-sp.patch
new file mode 100644
index 00000000000000..c656ebc53db425
--- /dev/null
+++ b/patches.renesas/0047-ARM-shmobile-bockw-dts-Replace-nor-jedec-by-jedec-sp.patch
@@ -0,0 +1,34 @@
+From cf4ddc0aed1368a0c77f9eed3619bf8d6d26d726 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Wed, 20 May 2015 20:16:51 +0200
+Subject: [PATCH 047/129] ARM: shmobile: bockw dts: Replace "nor-jedec" by
+ "jedec,spi-nor"
+
+Cfr. commit 8947e396a8296c52 ('Documentation: dt: mtd: replace
+"nor-jedec" binding with "jedec, spi-nor"')
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Acked-by: Brian Norris <computersforpeace@gmail.com>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 9cc785702d9f6367fdecf0fba6e425198e0754c8)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7778-bockw.dts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/r8a7778-bockw.dts b/arch/arm/boot/dts/r8a7778-bockw.dts
+index dfbb12e4fef4..90543b12d7e2 100644
+--- a/arch/arm/boot/dts/r8a7778-bockw.dts
++++ b/arch/arm/boot/dts/r8a7778-bockw.dts
+@@ -186,7 +186,7 @@
+ flash: flash@0 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+- compatible = "spansion,s25fl008k", "nor-jedec";
++ compatible = "spansion,s25fl008k", "jedec,spi-nor";
+ reg = <0>;
+ spi-max-frequency = <104000000>;
+ m25p,fast-read;
+--
+2.6.2
+
diff --git a/patches.renesas/0048-ARM-shmobile-r8a7790-add-MMCIF-max-frequency.patch b/patches.renesas/0048-ARM-shmobile-r8a7790-add-MMCIF-max-frequency.patch
new file mode 100644
index 00000000000000..c703a5ee730a99
--- /dev/null
+++ b/patches.renesas/0048-ARM-shmobile-r8a7790-add-MMCIF-max-frequency.patch
@@ -0,0 +1,37 @@
+From 609af72e289d40f7067b9eb026aed371f0e54ed0 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Thu, 14 May 2015 07:23:04 +0000
+Subject: [PATCH 048/129] ARM: shmobile: r8a7790: add MMCIF max-frequency
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 96370057bd47e8785312e151e3b32ad712693910)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7790.dtsi | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/arch/arm/boot/dts/r8a7790.dtsi b/arch/arm/boot/dts/r8a7790.dtsi
+index 62a9086b133d..70248df02342 100644
+--- a/arch/arm/boot/dts/r8a7790.dtsi
++++ b/arch/arm/boot/dts/r8a7790.dtsi
+@@ -490,6 +490,7 @@
+ dma-names = "tx", "rx";
+ reg-io-width = <4>;
+ status = "disabled";
++ max-frequency = <97500000>;
+ };
+
+ mmcif1: mmc@ee220000 {
+@@ -501,6 +502,7 @@
+ dma-names = "tx", "rx";
+ reg-io-width = <4>;
+ status = "disabled";
++ max-frequency = <97500000>;
+ };
+
+ pfc: pfc@e6060000 {
+--
+2.6.2
+
diff --git a/patches.renesas/0049-ARM-shmobile-r8a7791-add-MMCIF-max-frequency.patch b/patches.renesas/0049-ARM-shmobile-r8a7791-add-MMCIF-max-frequency.patch
new file mode 100644
index 00000000000000..7769715ef279e2
--- /dev/null
+++ b/patches.renesas/0049-ARM-shmobile-r8a7791-add-MMCIF-max-frequency.patch
@@ -0,0 +1,28 @@
+From 497508657af7ae9b4d8246307e5fb2b25c7b300b Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Thu, 14 May 2015 07:23:20 +0000
+Subject: [PATCH 049/129] ARM: shmobile: r8a7791: add MMCIF max-frequency
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit d957ab8dbd79ccd32f6f7c42651b956bb892858d)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7791.dtsi | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/arch/arm/boot/dts/r8a7791.dtsi b/arch/arm/boot/dts/r8a7791.dtsi
+index 7613abea13d7..bbef666596e5 100644
+--- a/arch/arm/boot/dts/r8a7791.dtsi
++++ b/arch/arm/boot/dts/r8a7791.dtsi
+@@ -494,6 +494,7 @@
+ dma-names = "tx", "rx";
+ reg-io-width = <4>;
+ status = "disabled";
++ max-frequency = <97500000>;
+ };
+
+ sdhi0: sd@ee100000 {
+--
+2.6.2
+
diff --git a/patches.renesas/0050-ARM-shmobile-only-select-sound-drivers-that-build.patch b/patches.renesas/0050-ARM-shmobile-only-select-sound-drivers-that-build.patch
new file mode 100644
index 00000000000000..557155a2ced9f2
--- /dev/null
+++ b/patches.renesas/0050-ARM-shmobile-only-select-sound-drivers-that-build.patch
@@ -0,0 +1,52 @@
+From cf4477018ef6d52f8ca4b34455667bfa70c6516b Mon Sep 17 00:00:00 2001
+From: Arnd Bergmann <arnd@arndb.de>
+Date: Tue, 19 May 2015 15:40:37 +0200
+Subject: [PATCH 050/129] ARM: shmobile: only select sound drivers that build
+
+A couple of codec drivers are selected by shmobile platform code,
+but depend on I2C, which results in a build error:
+
+sound/soc/codecs/ak4642.c:638:1: warning: data definition has no type or storage class
+ module_i2c_driver(ak4642_i2c_driver);
+ ^
+sound/soc/codecs/ak4642.c:638:1: error: type defaults to 'int' in declaration of 'module_i2c_driver' [-Werror=implicit-int]
+sound/soc/codecs/ak4642.c:638:1: warning: parameter names (without types) in function declaration
+sound/soc/codecs/ak4642.c:627:26: warning: 'ak4642_i2c_driver' defined but not used [-Wunused-variable]
+
+This ensures that we do not enable the respective drivers when I2C
+is disabled.
+
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Acked-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 66f72f0c8e0d37339b6be1373c61d2a133c8b422)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/mach-shmobile/Kconfig | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/arch/arm/mach-shmobile/Kconfig b/arch/arm/mach-shmobile/Kconfig
+index 0fb484221c90..45006479d461 100644
+--- a/arch/arm/mach-shmobile/Kconfig
++++ b/arch/arm/mach-shmobile/Kconfig
+@@ -139,7 +139,7 @@ config MACH_ARMADILLO800EVA
+ select ARCH_REQUIRE_GPIOLIB
+ select REGULATOR_FIXED_VOLTAGE if REGULATOR
+ select SMSC_PHY if SH_ETH
+- select SND_SOC_WM8978 if SND_SIMPLE_CARD
++ select SND_SOC_WM8978 if SND_SIMPLE_CARD && I2C
+ select USE_OF
+
+ config MACH_BOCKW
+@@ -148,7 +148,7 @@ config MACH_BOCKW
+ select ARCH_REQUIRE_GPIOLIB
+ select REGULATOR_FIXED_VOLTAGE if REGULATOR
+ select SND_SOC_AK4554 if SND_SIMPLE_CARD
+- select SND_SOC_AK4642 if SND_SIMPLE_CARD
++ select SND_SOC_AK4642 if SND_SIMPLE_CARD && I2C
+ select USE_OF
+
+ config MACH_BOCKW_REFERENCE
+--
+2.6.2
+
diff --git a/patches.renesas/0051-ARM-shmobile-r8a7794-dtsi-Describe-DMA-for-the-seria.patch b/patches.renesas/0051-ARM-shmobile-r8a7794-dtsi-Describe-DMA-for-the-seria.patch
new file mode 100644
index 00000000000000..b462504be4f3ad
--- /dev/null
+++ b/patches.renesas/0051-ARM-shmobile-r8a7794-dtsi-Describe-DMA-for-the-seria.patch
@@ -0,0 +1,185 @@
+From cd949bd80cdfdeb1acfc7710c626120904ad2e72 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Wed, 20 May 2015 19:46:27 +0200
+Subject: [PATCH 051/129] ARM: shmobile: r8a7794 dtsi: Describe DMA for the
+ serial ports
+
+Add DMA properties to all SCIF, SCIFA, SCIFB, and HSCIF device nodes.
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 8233a0dee931a9ba7eb3991682538234fbe2729b)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7794.dtsi | 36 ++++++++++++++++++++++++++++++++++++
+ 1 file changed, 36 insertions(+)
+
+diff --git a/arch/arm/boot/dts/r8a7794.dtsi b/arch/arm/boot/dts/r8a7794.dtsi
+index 01cf54f70501..b73819423311 100644
+--- a/arch/arm/boot/dts/r8a7794.dtsi
++++ b/arch/arm/boot/dts/r8a7794.dtsi
+@@ -174,6 +174,8 @@
+ interrupts = <0 144 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7794_CLK_SCIFA0>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x21>, <&dmac0 0x22>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -183,6 +185,8 @@
+ interrupts = <0 145 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7794_CLK_SCIFA1>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x25>, <&dmac0 0x26>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -192,6 +196,8 @@
+ interrupts = <0 151 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7794_CLK_SCIFA2>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x27>, <&dmac0 0x28>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -201,6 +207,8 @@
+ interrupts = <0 29 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp11_clks R8A7794_CLK_SCIFA3>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x1b>, <&dmac0 0x1c>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -210,6 +218,8 @@
+ interrupts = <0 30 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp11_clks R8A7794_CLK_SCIFA4>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x1f>, <&dmac0 0x20>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -219,6 +229,8 @@
+ interrupts = <0 31 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp11_clks R8A7794_CLK_SCIFA5>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x23>, <&dmac0 0x24>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -228,6 +240,8 @@
+ interrupts = <0 148 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7794_CLK_SCIFB0>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x3d>, <&dmac0 0x3e>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -237,6 +251,8 @@
+ interrupts = <0 149 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7794_CLK_SCIFB1>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x19>, <&dmac0 0x1a>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -246,6 +262,8 @@
+ interrupts = <0 150 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7794_CLK_SCIFB2>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x1d>, <&dmac0 0x1e>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -255,6 +273,8 @@
+ interrupts = <0 152 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp7_clks R8A7794_CLK_SCIF0>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x29>, <&dmac0 0x2a>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -264,6 +284,8 @@
+ interrupts = <0 153 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp7_clks R8A7794_CLK_SCIF1>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x2d>, <&dmac0 0x2e>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -273,6 +295,8 @@
+ interrupts = <0 22 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp7_clks R8A7794_CLK_SCIF2>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x2b>, <&dmac0 0x2c>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -282,6 +306,8 @@
+ interrupts = <0 23 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp7_clks R8A7794_CLK_SCIF3>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x2f>, <&dmac0 0x30>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -291,6 +317,8 @@
+ interrupts = <0 24 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp7_clks R8A7794_CLK_SCIF4>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0xfb>, <&dmac0 0xfc>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -300,6 +328,8 @@
+ interrupts = <0 25 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp7_clks R8A7794_CLK_SCIF5>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0xfd>, <&dmac0 0xfe>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -309,6 +339,8 @@
+ interrupts = <0 154 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp7_clks R8A7794_CLK_HSCIF0>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x39>, <&dmac0 0x3a>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -318,6 +350,8 @@
+ interrupts = <0 155 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp7_clks R8A7794_CLK_HSCIF1>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x4d>, <&dmac0 0x4e>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -327,6 +361,8 @@
+ interrupts = <0 21 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp7_clks R8A7794_CLK_HSCIF2>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x3b>, <&dmac0 0x3c>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+--
+2.6.2
+
diff --git a/patches.renesas/0052-ARM-shmobile-r8a7791-dtsi-Describe-DMA-for-the-seria.patch b/patches.renesas/0052-ARM-shmobile-r8a7791-dtsi-Describe-DMA-for-the-seria.patch
new file mode 100644
index 00000000000000..9324426d417c9c
--- /dev/null
+++ b/patches.renesas/0052-ARM-shmobile-r8a7791-dtsi-Describe-DMA-for-the-seria.patch
@@ -0,0 +1,185 @@
+From c50a934834f3bc72e8226a4e57c57358669e1bbd Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Wed, 20 May 2015 19:46:26 +0200
+Subject: [PATCH 052/129] ARM: shmobile: r8a7791 dtsi: Describe DMA for the
+ serial ports
+
+Add DMA properties to all SCIF, SCIFA, SCIFB, and HSCIF device nodes.
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit 558d656513cd481f65f492ab8685605aa85577cf)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7791.dtsi | 36 ++++++++++++++++++++++++++++++++++++
+ 1 file changed, 36 insertions(+)
+
+diff --git a/arch/arm/boot/dts/r8a7791.dtsi b/arch/arm/boot/dts/r8a7791.dtsi
+index bbef666596e5..dc1cd3f16606 100644
+--- a/arch/arm/boot/dts/r8a7791.dtsi
++++ b/arch/arm/boot/dts/r8a7791.dtsi
+@@ -533,6 +533,8 @@
+ interrupts = <0 144 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7791_CLK_SCIFA0>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x21>, <&dmac0 0x22>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -542,6 +544,8 @@
+ interrupts = <0 145 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7791_CLK_SCIFA1>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x25>, <&dmac0 0x26>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -551,6 +555,8 @@
+ interrupts = <0 151 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7791_CLK_SCIFA2>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x27>, <&dmac0 0x28>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -560,6 +566,8 @@
+ interrupts = <0 29 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp11_clks R8A7791_CLK_SCIFA3>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x1b>, <&dmac0 0x1c>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -569,6 +577,8 @@
+ interrupts = <0 30 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp11_clks R8A7791_CLK_SCIFA4>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x1f>, <&dmac0 0x20>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -578,6 +588,8 @@
+ interrupts = <0 31 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp11_clks R8A7791_CLK_SCIFA5>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x23>, <&dmac0 0x24>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -587,6 +599,8 @@
+ interrupts = <0 148 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7791_CLK_SCIFB0>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x3d>, <&dmac0 0x3e>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -596,6 +610,8 @@
+ interrupts = <0 149 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7791_CLK_SCIFB1>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x19>, <&dmac0 0x1a>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -605,6 +621,8 @@
+ interrupts = <0 150 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7791_CLK_SCIFB2>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x1d>, <&dmac0 0x1e>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -614,6 +632,8 @@
+ interrupts = <0 152 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp7_clks R8A7791_CLK_SCIF0>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x29>, <&dmac0 0x2a>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -623,6 +643,8 @@
+ interrupts = <0 153 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp7_clks R8A7791_CLK_SCIF1>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x2d>, <&dmac0 0x2e>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -632,6 +654,8 @@
+ interrupts = <0 22 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp7_clks R8A7791_CLK_SCIF2>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x2b>, <&dmac0 0x2c>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -641,6 +665,8 @@
+ interrupts = <0 23 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp7_clks R8A7791_CLK_SCIF3>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x2f>, <&dmac0 0x30>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -650,6 +676,8 @@
+ interrupts = <0 24 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp7_clks R8A7791_CLK_SCIF4>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0xfb>, <&dmac0 0xfc>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -659,6 +687,8 @@
+ interrupts = <0 25 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp7_clks R8A7791_CLK_SCIF5>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0xfd>, <&dmac0 0xfe>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -668,6 +698,8 @@
+ interrupts = <0 154 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp7_clks R8A7791_CLK_HSCIF0>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x39>, <&dmac0 0x3a>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -677,6 +709,8 @@
+ interrupts = <0 155 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp7_clks R8A7791_CLK_HSCIF1>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x4d>, <&dmac0 0x4e>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -686,6 +720,8 @@
+ interrupts = <0 21 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp7_clks R8A7791_CLK_HSCIF2>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x3b>, <&dmac0 0x3c>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+--
+2.6.2
+
diff --git a/patches.renesas/0053-ARM-shmobile-r8a7790-dtsi-Describe-DMA-for-the-seria.patch b/patches.renesas/0053-ARM-shmobile-r8a7790-dtsi-Describe-DMA-for-the-seria.patch
new file mode 100644
index 00000000000000..33ccd61440950b
--- /dev/null
+++ b/patches.renesas/0053-ARM-shmobile-r8a7790-dtsi-Describe-DMA-for-the-seria.patch
@@ -0,0 +1,113 @@
+From 124bafc41647f7e1e2476da169f470792737a03d Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Wed, 20 May 2015 19:46:25 +0200
+Subject: [PATCH 053/129] ARM: shmobile: r8a7790 dtsi: Describe DMA for the
+ serial ports
+
+Add DMA properties to all SCIF, SCIFA, SCIFB, and HSCIF device nodes.
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+(cherry picked from commit acea43fcb02746e907725c6dbd2eb95b32d79ea5)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/boot/dts/r8a7790.dtsi | 20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+diff --git a/arch/arm/boot/dts/r8a7790.dtsi b/arch/arm/boot/dts/r8a7790.dtsi
+index 70248df02342..51ab8865ea37 100644
+--- a/arch/arm/boot/dts/r8a7790.dtsi
++++ b/arch/arm/boot/dts/r8a7790.dtsi
+@@ -556,6 +556,8 @@
+ interrupts = <0 144 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7790_CLK_SCIFA0>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x21>, <&dmac0 0x22>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -565,6 +567,8 @@
+ interrupts = <0 145 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7790_CLK_SCIFA1>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x25>, <&dmac0 0x26>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -574,6 +578,8 @@
+ interrupts = <0 151 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7790_CLK_SCIFA2>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x27>, <&dmac0 0x28>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -583,6 +589,8 @@
+ interrupts = <0 148 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7790_CLK_SCIFB0>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x3d>, <&dmac0 0x3e>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -592,6 +600,8 @@
+ interrupts = <0 149 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7790_CLK_SCIFB1>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x19>, <&dmac0 0x1a>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -601,6 +611,8 @@
+ interrupts = <0 150 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp2_clks R8A7790_CLK_SCIFB2>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x1d>, <&dmac0 0x1e>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -610,6 +622,8 @@
+ interrupts = <0 152 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp7_clks R8A7790_CLK_SCIF0>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x29>, <&dmac0 0x2a>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -619,6 +633,8 @@
+ interrupts = <0 153 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp7_clks R8A7790_CLK_SCIF1>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x2d>, <&dmac0 0x2e>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -628,6 +644,8 @@
+ interrupts = <0 154 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp7_clks R8A7790_CLK_HSCIF0>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x39>, <&dmac0 0x3a>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+@@ -637,6 +655,8 @@
+ interrupts = <0 155 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mstp7_clks R8A7790_CLK_HSCIF1>;
+ clock-names = "sci_ick";
++ dmas = <&dmac0 0x4d>, <&dmac0 0x4e>;
++ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+--
+2.6.2
+
diff --git a/patches.renesas/0055-ARM-shmobile-r8a7740-remove-I2C-errata-handling.patch b/patches.renesas/0055-ARM-shmobile-r8a7740-remove-I2C-errata-handling.patch
new file mode 100644
index 00000000000000..998e6021499153
--- /dev/null
+++ b/patches.renesas/0055-ARM-shmobile-r8a7740-remove-I2C-errata-handling.patch
@@ -0,0 +1,101 @@
+From b456622171e2a171a5a929e6a4915b705387505b Mon Sep 17 00:00:00 2001
+From: Wolfram Sang <wsa+renesas@sang-engineering.com>
+Date: Tue, 9 Jun 2015 16:14:40 +0900
+Subject: [PATCH 055/129] ARM: shmobile: r8a7740: remove I2C errata handling
+
+This is now done in the I2C driver.
+
+Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
+Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Acked-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Acked-by: Simon Horman <horms+renesas@verge.net.au>
+Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
+(cherry picked from commit b6eba5598dc69d1f3a79183d2521da53d336006e)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ arch/arm/mach-shmobile/setup-r8a7740.c | 55 ----------------------------------
+ 1 file changed, 55 deletions(-)
+
+diff --git a/arch/arm/mach-shmobile/setup-r8a7740.c b/arch/arm/mach-shmobile/setup-r8a7740.c
+index 9832e48396a4..00291cc1772d 100644
+--- a/arch/arm/mach-shmobile/setup-r8a7740.c
++++ b/arch/arm/mach-shmobile/setup-r8a7740.c
+@@ -13,7 +13,6 @@
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+-#include <linux/delay.h>
+ #include <linux/dma-mapping.h>
+ #include <linux/kernel.h>
+ #include <linux/init.h>
+@@ -690,56 +689,6 @@ void __init r8a7740_meram_workaround(void)
+ }
+ }
+
+-#define ICCR 0x0004
+-#define ICSTART 0x0070
+-
+-#define i2c_read(reg, offset) ioread8(reg + offset)
+-#define i2c_write(reg, offset, data) iowrite8(data, reg + offset)
+-
+-/*
+- * r8a7740 chip has lasting errata on I2C I/O pad reset.
+- * this is work-around for it.
+- */
+-static void r8a7740_i2c_workaround(struct platform_device *pdev)
+-{
+- struct resource *res;
+- void __iomem *reg;
+-
+- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+- if (unlikely(!res)) {
+- pr_err("r8a7740 i2c workaround fail (cannot find resource)\n");
+- return;
+- }
+-
+- reg = ioremap(res->start, resource_size(res));
+- if (unlikely(!reg)) {
+- pr_err("r8a7740 i2c workaround fail (cannot map IO)\n");
+- return;
+- }
+-
+- i2c_write(reg, ICCR, i2c_read(reg, ICCR) | 0x80);
+- i2c_read(reg, ICCR); /* dummy read */
+-
+- i2c_write(reg, ICSTART, i2c_read(reg, ICSTART) | 0x10);
+- i2c_read(reg, ICSTART); /* dummy read */
+-
+- udelay(10);
+-
+- i2c_write(reg, ICCR, 0x01);
+- i2c_write(reg, ICSTART, 0x00);
+-
+- udelay(10);
+-
+- i2c_write(reg, ICCR, 0x10);
+- udelay(10);
+- i2c_write(reg, ICCR, 0x00);
+- udelay(10);
+- i2c_write(reg, ICCR, 0x10);
+- udelay(10);
+-
+- iounmap(reg);
+-}
+-
+ void __init r8a7740_add_standard_devices(void)
+ {
+ static struct pm_domain_device domain_devices[] __initdata = {
+@@ -766,10 +715,6 @@ void __init r8a7740_add_standard_devices(void)
+ { "A3SP", &usb_dma_device },
+ };
+
+- /* I2C work-around */
+- r8a7740_i2c_workaround(&i2c0_device);
+- r8a7740_i2c_workaround(&i2c1_device);
+-
+ r8a7740_init_pm_domains();
+
+ /* add devices */
+--
+2.6.2
+
diff --git a/patches.renesas/0056-phy-core-Check-requested-PHY-status-in-_of_phy_get.patch b/patches.renesas/0056-phy-core-Check-requested-PHY-status-in-_of_phy_get.patch
new file mode 100644
index 00000000000000..51c5ff766e7360
--- /dev/null
+++ b/patches.renesas/0056-phy-core-Check-requested-PHY-status-in-_of_phy_get.patch
@@ -0,0 +1,99 @@
+From 96a1c11500ec358d8695ad5b77dad1d1b9601251 Mon Sep 17 00:00:00 2001
+From: Axel Lin <axel.lin@ingics.com>
+Date: Tue, 7 Apr 2015 12:23:38 +0800
+Subject: [PATCH 056/129] phy: core: Check requested PHY status in
+ _of_phy_get()
+
+This is a common checking in various drivers, so move the checking to
+_of_phy_get().
+
+Signed-off-by: Axel Lin <axel.lin@ingics.com>
+Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
+(cherry picked from commit 33f434d283a27116fb358ae5bc3b42967c12f85a)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/phy/phy-core.c | 12 ++++++++++--
+ drivers/phy/phy-miphy28lp.c | 5 -----
+ drivers/phy/phy-miphy365x.c | 5 -----
+ drivers/phy/phy-rcar-gen2.c | 5 -----
+ 4 files changed, 10 insertions(+), 17 deletions(-)
+
+diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c
+index 63bc12d7a73e..313a18aea858 100644
+--- a/drivers/phy/phy-core.c
++++ b/drivers/phy/phy-core.c
+@@ -367,13 +367,21 @@ static struct phy *_of_phy_get(struct device_node *np, int index)
+ phy_provider = of_phy_provider_lookup(args.np);
+ if (IS_ERR(phy_provider) || !try_module_get(phy_provider->owner)) {
+ phy = ERR_PTR(-EPROBE_DEFER);
+- goto err0;
++ goto out_unlock;
++ }
++
++ if (!of_device_is_available(args.np)) {
++ dev_warn(phy_provider->dev, "Requested PHY is disabled\n");
++ phy = ERR_PTR(-ENODEV);
++ goto out_put_module;
+ }
+
+ phy = phy_provider->of_xlate(phy_provider->dev, &args);
++
++out_put_module:
+ module_put(phy_provider->owner);
+
+-err0:
++out_unlock:
+ mutex_unlock(&phy_provider_mutex);
+ of_node_put(args.np);
+
+diff --git a/drivers/phy/phy-miphy28lp.c b/drivers/phy/phy-miphy28lp.c
+index c4cc11dcb2a2..e95b91407b57 100644
+--- a/drivers/phy/phy-miphy28lp.c
++++ b/drivers/phy/phy-miphy28lp.c
+@@ -1107,11 +1107,6 @@ static struct phy *miphy28lp_xlate(struct device *dev,
+ struct device_node *phynode = args->np;
+ int ret, index = 0;
+
+- if (!of_device_is_available(phynode)) {
+- dev_warn(dev, "Requested PHY is disabled\n");
+- return ERR_PTR(-ENODEV);
+- }
+-
+ if (args->args_count != 1) {
+ dev_err(dev, "Invalid number of cells in 'phy' property\n");
+ return ERR_PTR(-EINVAL);
+diff --git a/drivers/phy/phy-miphy365x.c b/drivers/phy/phy-miphy365x.c
+index 019c2d75344e..d5b9a7b6f87a 100644
+--- a/drivers/phy/phy-miphy365x.c
++++ b/drivers/phy/phy-miphy365x.c
+@@ -476,11 +476,6 @@ static struct phy *miphy365x_xlate(struct device *dev,
+ struct device_node *phynode = args->np;
+ int ret, index;
+
+- if (!of_device_is_available(phynode)) {
+- dev_warn(dev, "Requested PHY is disabled\n");
+- return ERR_PTR(-ENODEV);
+- }
+-
+ if (args->args_count != 1) {
+ dev_err(dev, "Invalid number of cells in 'phy' property\n");
+ return ERR_PTR(-EINVAL);
+diff --git a/drivers/phy/phy-rcar-gen2.c b/drivers/phy/phy-rcar-gen2.c
+index 97d45f47d1ad..0da62d45486a 100644
+--- a/drivers/phy/phy-rcar-gen2.c
++++ b/drivers/phy/phy-rcar-gen2.c
+@@ -206,11 +206,6 @@ static struct phy *rcar_gen2_phy_xlate(struct device *dev,
+ struct device_node *np = args->np;
+ int i;
+
+- if (!of_device_is_available(np)) {
+- dev_warn(dev, "Requested PHY is disabled\n");
+- return ERR_PTR(-ENODEV);
+- }
+-
+ drv = dev_get_drvdata(dev);
+ if (!drv)
+ return ERR_PTR(-EINVAL);
+--
+2.6.2
+
diff --git a/patches.renesas/0057-phy-rcar-gen2-Add-support-for-R-Car-E2.patch b/patches.renesas/0057-phy-rcar-gen2-Add-support-for-R-Car-E2.patch
new file mode 100644
index 00000000000000..5b6bed74aefb12
--- /dev/null
+++ b/patches.renesas/0057-phy-rcar-gen2-Add-support-for-R-Car-E2.patch
@@ -0,0 +1,45 @@
+From 7cdbbecbf680db240868769543fcc634661b6f79 Mon Sep 17 00:00:00 2001
+From: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
+Date: Mon, 18 May 2015 18:33:47 +0900
+Subject: [PATCH 057/129] phy: rcar-gen2: Add support for R-Car E2
+
+This patch adds a compatible string to support for R-Car E2.
+
+Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
+Acked-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Acked-by: Simon Horman <horms+renesas@verge.net.au>
+Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
+(cherry picked from commit 9d699bf4dbe29d8f26769ea81dec4a8c91edcd5a)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ Documentation/devicetree/bindings/phy/rcar-gen2-phy.txt | 1 +
+ drivers/phy/phy-rcar-gen2.c | 1 +
+ 2 files changed, 2 insertions(+)
+
+diff --git a/Documentation/devicetree/bindings/phy/rcar-gen2-phy.txt b/Documentation/devicetree/bindings/phy/rcar-gen2-phy.txt
+index 00fc52a034b7..d564ba4f1cf6 100644
+--- a/Documentation/devicetree/bindings/phy/rcar-gen2-phy.txt
++++ b/Documentation/devicetree/bindings/phy/rcar-gen2-phy.txt
+@@ -6,6 +6,7 @@ This file provides information on what the device node for the R-Car generation
+ Required properties:
+ - compatible: "renesas,usb-phy-r8a7790" if the device is a part of R8A7790 SoC.
+ "renesas,usb-phy-r8a7791" if the device is a part of R8A7791 SoC.
++ "renesas,usb-phy-r8a7794" if the device is a part of R8A7794 SoC.
+ - reg: offset and length of the register block.
+ - #address-cells: number of address cells for the USB channel subnodes, must
+ be <1>.
+diff --git a/drivers/phy/phy-rcar-gen2.c b/drivers/phy/phy-rcar-gen2.c
+index 0da62d45486a..39d9b2995435 100644
+--- a/drivers/phy/phy-rcar-gen2.c
++++ b/drivers/phy/phy-rcar-gen2.c
+@@ -195,6 +195,7 @@ static struct phy_ops rcar_gen2_phy_ops = {
+ static const struct of_device_id rcar_gen2_phy_match_table[] = {
+ { .compatible = "renesas,usb-phy-r8a7790" },
+ { .compatible = "renesas,usb-phy-r8a7791" },
++ { .compatible = "renesas,usb-phy-r8a7794" },
+ { }
+ };
+ MODULE_DEVICE_TABLE(of, rcar_gen2_phy_match_table);
+--
+2.6.2
+
diff --git a/patches.renesas/0058-usb-phy-Remove-the-phy-rcar-gen2-usb-driver.patch b/patches.renesas/0058-usb-phy-Remove-the-phy-rcar-gen2-usb-driver.patch
new file mode 100644
index 00000000000000..4001d9017e8779
--- /dev/null
+++ b/patches.renesas/0058-usb-phy-Remove-the-phy-rcar-gen2-usb-driver.patch
@@ -0,0 +1,345 @@
+From 5ece5493efff7d640b54caa55c12c2829ac961e3 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Tue, 28 Apr 2015 14:04:07 +0200
+Subject: [PATCH 058/129] usb: phy: Remove the phy-rcar-gen2-usb driver
+
+The phy-rcar-gen2-usb driver, which supports legacy platform data only,
+is no longer used since commit a483dcbfa21f919c ("ARM: shmobile: lager:
+Remove legacy board support").
+
+This driver was superseded by the DT-only phy-rcar-gen2 driver, which
+was introduced in commit 1233f59f745b237d ("phy: Renesas R-Car Gen2 PHY
+driver").
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+(cherry picked from commit 34ef33f7da6b00900d3a896d33522a035a930245)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/usb/phy/Kconfig | 13 --
+ drivers/usb/phy/Makefile | 1 -
+ drivers/usb/phy/phy-rcar-gen2-usb.c | 246 ------------------------
+ include/linux/platform_data/usb-rcar-gen2-phy.h | 22 ---
+ 4 files changed, 282 deletions(-)
+ delete mode 100644 drivers/usb/phy/phy-rcar-gen2-usb.c
+ delete mode 100644 include/linux/platform_data/usb-rcar-gen2-phy.h
+
+diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig
+index 2175678e674e..3cd3bee54ca6 100644
+--- a/drivers/usb/phy/Kconfig
++++ b/drivers/usb/phy/Kconfig
+@@ -186,19 +186,6 @@ config USB_RCAR_PHY
+ To compile this driver as a module, choose M here: the
+ module will be called phy-rcar-usb.
+
+-config USB_RCAR_GEN2_PHY
+- tristate "Renesas R-Car Gen2 USB PHY support"
+- depends on ARCH_R8A7790 || ARCH_R8A7791 || COMPILE_TEST
+- select USB_PHY
+- help
+- Say Y here to add support for the Renesas R-Car Gen2 USB PHY driver.
+- It is typically used to control internal USB PHY for USBHS,
+- and to configure shared USB channels 0 and 2.
+- This driver supports R8A7790 and R8A7791.
+-
+- To compile this driver as a module, choose M here: the
+- module will be called phy-rcar-gen2-usb.
+-
+ config USB_ULPI
+ bool "Generic ULPI Transceiver Driver"
+ depends on ARM || ARM64
+diff --git a/drivers/usb/phy/Makefile b/drivers/usb/phy/Makefile
+index 75f2bba58c84..e36ab1d46d8b 100644
+--- a/drivers/usb/phy/Makefile
++++ b/drivers/usb/phy/Makefile
+@@ -23,7 +23,6 @@ obj-$(CONFIG_USB_MSM_OTG) += phy-msm-usb.o
+ obj-$(CONFIG_USB_MV_OTG) += phy-mv-usb.o
+ obj-$(CONFIG_USB_MXS_PHY) += phy-mxs-usb.o
+ obj-$(CONFIG_USB_RCAR_PHY) += phy-rcar-usb.o
+-obj-$(CONFIG_USB_RCAR_GEN2_PHY) += phy-rcar-gen2-usb.o
+ obj-$(CONFIG_USB_ULPI) += phy-ulpi.o
+ obj-$(CONFIG_USB_ULPI_VIEWPORT) += phy-ulpi-viewport.o
+ obj-$(CONFIG_KEYSTONE_USB_PHY) += phy-keystone.o
+diff --git a/drivers/usb/phy/phy-rcar-gen2-usb.c b/drivers/usb/phy/phy-rcar-gen2-usb.c
+deleted file mode 100644
+index f81800b6562a..000000000000
+--- a/drivers/usb/phy/phy-rcar-gen2-usb.c
++++ /dev/null
+@@ -1,246 +0,0 @@
+-/*
+- * Renesas R-Car Gen2 USB phy driver
+- *
+- * Copyright (C) 2013 Renesas Solutions Corp.
+- * Copyright (C) 2013 Cogent Embedded, Inc.
+- *
+- * 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/clk.h>
+-#include <linux/delay.h>
+-#include <linux/io.h>
+-#include <linux/module.h>
+-#include <linux/platform_data/usb-rcar-gen2-phy.h>
+-#include <linux/platform_device.h>
+-#include <linux/spinlock.h>
+-#include <linux/usb/otg.h>
+-
+-struct rcar_gen2_usb_phy_priv {
+- struct usb_phy phy;
+- void __iomem *base;
+- struct clk *clk;
+- spinlock_t lock;
+- int usecount;
+- u32 ugctrl2;
+-};
+-
+-#define usb_phy_to_priv(p) container_of(p, struct rcar_gen2_usb_phy_priv, phy)
+-
+-/* Low Power Status register */
+-#define USBHS_LPSTS_REG 0x02
+-#define USBHS_LPSTS_SUSPM (1 << 14)
+-
+-/* USB General control register */
+-#define USBHS_UGCTRL_REG 0x80
+-#define USBHS_UGCTRL_CONNECT (1 << 2)
+-#define USBHS_UGCTRL_PLLRESET (1 << 0)
+-
+-/* USB General control register 2 */
+-#define USBHS_UGCTRL2_REG 0x84
+-#define USBHS_UGCTRL2_USB0_PCI (1 << 4)
+-#define USBHS_UGCTRL2_USB0_HS (3 << 4)
+-#define USBHS_UGCTRL2_USB2_PCI (0 << 31)
+-#define USBHS_UGCTRL2_USB2_SS (1 << 31)
+-
+-/* USB General status register */
+-#define USBHS_UGSTS_REG 0x88
+-#define USBHS_UGSTS_LOCK (1 << 8)
+-
+-/* Enable USBHS internal phy */
+-static int __rcar_gen2_usbhs_phy_enable(void __iomem *base)
+-{
+- u32 val;
+- int i;
+-
+- /* USBHS PHY power on */
+- val = ioread32(base + USBHS_UGCTRL_REG);
+- val &= ~USBHS_UGCTRL_PLLRESET;
+- iowrite32(val, base + USBHS_UGCTRL_REG);
+-
+- val = ioread16(base + USBHS_LPSTS_REG);
+- val |= USBHS_LPSTS_SUSPM;
+- iowrite16(val, base + USBHS_LPSTS_REG);
+-
+- for (i = 0; i < 20; i++) {
+- val = ioread32(base + USBHS_UGSTS_REG);
+- if ((val & USBHS_UGSTS_LOCK) == USBHS_UGSTS_LOCK) {
+- val = ioread32(base + USBHS_UGCTRL_REG);
+- val |= USBHS_UGCTRL_CONNECT;
+- iowrite32(val, base + USBHS_UGCTRL_REG);
+- return 0;
+- }
+- udelay(1);
+- }
+-
+- /* Timed out waiting for the PLL lock */
+- return -ETIMEDOUT;
+-}
+-
+-/* Disable USBHS internal phy */
+-static int __rcar_gen2_usbhs_phy_disable(void __iomem *base)
+-{
+- u32 val;
+-
+- /* USBHS PHY power off */
+- val = ioread32(base + USBHS_UGCTRL_REG);
+- val &= ~USBHS_UGCTRL_CONNECT;
+- iowrite32(val, base + USBHS_UGCTRL_REG);
+-
+- val = ioread16(base + USBHS_LPSTS_REG);
+- val &= ~USBHS_LPSTS_SUSPM;
+- iowrite16(val, base + USBHS_LPSTS_REG);
+-
+- val = ioread32(base + USBHS_UGCTRL_REG);
+- val |= USBHS_UGCTRL_PLLRESET;
+- iowrite32(val, base + USBHS_UGCTRL_REG);
+- return 0;
+-}
+-
+-/* Setup USB channels */
+-static void __rcar_gen2_usb_phy_init(struct rcar_gen2_usb_phy_priv *priv)
+-{
+- u32 val;
+-
+- clk_prepare_enable(priv->clk);
+-
+- /* Set USB channels in the USBHS UGCTRL2 register */
+- val = ioread32(priv->base + USBHS_UGCTRL2_REG);
+- val &= ~(USBHS_UGCTRL2_USB0_HS | USBHS_UGCTRL2_USB2_SS);
+- val |= priv->ugctrl2;
+- iowrite32(val, priv->base + USBHS_UGCTRL2_REG);
+-}
+-
+-/* Shutdown USB channels */
+-static void __rcar_gen2_usb_phy_shutdown(struct rcar_gen2_usb_phy_priv *priv)
+-{
+- __rcar_gen2_usbhs_phy_disable(priv->base);
+- clk_disable_unprepare(priv->clk);
+-}
+-
+-static int rcar_gen2_usb_phy_set_suspend(struct usb_phy *phy, int suspend)
+-{
+- struct rcar_gen2_usb_phy_priv *priv = usb_phy_to_priv(phy);
+- unsigned long flags;
+- int retval;
+-
+- spin_lock_irqsave(&priv->lock, flags);
+- retval = suspend ? __rcar_gen2_usbhs_phy_disable(priv->base) :
+- __rcar_gen2_usbhs_phy_enable(priv->base);
+- spin_unlock_irqrestore(&priv->lock, flags);
+- return retval;
+-}
+-
+-static int rcar_gen2_usb_phy_init(struct usb_phy *phy)
+-{
+- struct rcar_gen2_usb_phy_priv *priv = usb_phy_to_priv(phy);
+- unsigned long flags;
+-
+- spin_lock_irqsave(&priv->lock, flags);
+- /*
+- * Enable the clock and setup USB channels
+- * if it's the first user
+- */
+- if (!priv->usecount++)
+- __rcar_gen2_usb_phy_init(priv);
+- spin_unlock_irqrestore(&priv->lock, flags);
+- return 0;
+-}
+-
+-static void rcar_gen2_usb_phy_shutdown(struct usb_phy *phy)
+-{
+- struct rcar_gen2_usb_phy_priv *priv = usb_phy_to_priv(phy);
+- unsigned long flags;
+-
+- spin_lock_irqsave(&priv->lock, flags);
+- if (!priv->usecount) {
+- dev_warn(phy->dev, "Trying to disable phy with 0 usecount\n");
+- goto out;
+- }
+-
+- /* Disable everything if it's the last user */
+- if (!--priv->usecount)
+- __rcar_gen2_usb_phy_shutdown(priv);
+-out:
+- spin_unlock_irqrestore(&priv->lock, flags);
+-}
+-
+-static int rcar_gen2_usb_phy_probe(struct platform_device *pdev)
+-{
+- struct device *dev = &pdev->dev;
+- struct rcar_gen2_phy_platform_data *pdata;
+- struct rcar_gen2_usb_phy_priv *priv;
+- struct resource *res;
+- void __iomem *base;
+- struct clk *clk;
+- int retval;
+-
+- pdata = dev_get_platdata(dev);
+- if (!pdata) {
+- dev_err(dev, "No platform data\n");
+- return -EINVAL;
+- }
+-
+- clk = devm_clk_get(dev, "usbhs");
+- if (IS_ERR(clk)) {
+- dev_err(dev, "Can't get the clock\n");
+- return PTR_ERR(clk);
+- }
+-
+- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+- base = devm_ioremap_resource(dev, res);
+- if (IS_ERR(base))
+- return PTR_ERR(base);
+-
+- priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+- if (!priv)
+- return -ENOMEM;
+-
+- spin_lock_init(&priv->lock);
+- priv->clk = clk;
+- priv->base = base;
+- priv->ugctrl2 = pdata->chan0_pci ?
+- USBHS_UGCTRL2_USB0_PCI : USBHS_UGCTRL2_USB0_HS;
+- priv->ugctrl2 |= pdata->chan2_pci ?
+- USBHS_UGCTRL2_USB2_PCI : USBHS_UGCTRL2_USB2_SS;
+- priv->phy.dev = dev;
+- priv->phy.label = dev_name(dev);
+- priv->phy.init = rcar_gen2_usb_phy_init;
+- priv->phy.shutdown = rcar_gen2_usb_phy_shutdown;
+- priv->phy.set_suspend = rcar_gen2_usb_phy_set_suspend;
+-
+- retval = usb_add_phy_dev(&priv->phy);
+- if (retval < 0) {
+- dev_err(dev, "Failed to add USB phy\n");
+- return retval;
+- }
+-
+- platform_set_drvdata(pdev, priv);
+-
+- return retval;
+-}
+-
+-static int rcar_gen2_usb_phy_remove(struct platform_device *pdev)
+-{
+- struct rcar_gen2_usb_phy_priv *priv = platform_get_drvdata(pdev);
+-
+- usb_remove_phy(&priv->phy);
+-
+- return 0;
+-}
+-
+-static struct platform_driver rcar_gen2_usb_phy_driver = {
+- .driver = {
+- .name = "usb_phy_rcar_gen2",
+- },
+- .probe = rcar_gen2_usb_phy_probe,
+- .remove = rcar_gen2_usb_phy_remove,
+-};
+-
+-module_platform_driver(rcar_gen2_usb_phy_driver);
+-
+-MODULE_LICENSE("GPL v2");
+-MODULE_DESCRIPTION("Renesas R-Car Gen2 USB phy");
+-MODULE_AUTHOR("Valentine Barshak <valentine.barshak@cogentembedded.com>");
+diff --git a/include/linux/platform_data/usb-rcar-gen2-phy.h b/include/linux/platform_data/usb-rcar-gen2-phy.h
+deleted file mode 100644
+index dd3ba46c0d90..000000000000
+--- a/include/linux/platform_data/usb-rcar-gen2-phy.h
++++ /dev/null
+@@ -1,22 +0,0 @@
+-/*
+- * Copyright (C) 2013 Renesas Solutions Corp.
+- * Copyright (C) 2013 Cogent Embedded, Inc.
+- *
+- * 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.
+- */
+-
+-#ifndef __USB_RCAR_GEN2_PHY_H
+-#define __USB_RCAR_GEN2_PHY_H
+-
+-#include <linux/types.h>
+-
+-struct rcar_gen2_phy_platform_data {
+- /* USB channel 0 configuration */
+- bool chan0_pci:1; /* true: PCI USB host 0, false: USBHS */
+- /* USB channel 2 configuration */
+- bool chan2_pci:1; /* true: PCI USB host 2, false: USBSS */
+-};
+-
+-#endif
+--
+2.6.2
+
diff --git a/patches.renesas/0059-pinctrl-allow-exlusive-GPIO-mux-pin-allocation.patch b/patches.renesas/0059-pinctrl-allow-exlusive-GPIO-mux-pin-allocation.patch
new file mode 100644
index 00000000000000..8190f81c6f1a3c
--- /dev/null
+++ b/patches.renesas/0059-pinctrl-allow-exlusive-GPIO-mux-pin-allocation.patch
@@ -0,0 +1,135 @@
+From 9cd02c86d8c78f512dc0f90d4fad25812da4695b Mon Sep 17 00:00:00 2001
+From: Sonic Zhang <sonic.zhang@analog.com>
+Date: Thu, 9 Apr 2015 11:13:07 +0800
+Subject: [PATCH 059/129] pinctrl: allow exlusive GPIO/mux pin allocation
+
+Disallow simultaneous use of the the GPIO and peripheral mux
+functions by setting a flag "strict" in struct pinctrl_desc.
+
+The blackfin pinmux and gpio controller doesn't allow user to
+set up a pin for both GPIO and peripheral function. So, add flag
+strict in struct pinctrl_desc to check both gpio_owner and
+mux_owner before approving the pin request.
+
+v2-changes:
+- if strict flag is set, check gpio_owner and mux_onwer in if and
+ else clause
+
+v3-changes:
+- add kerneldoc for this struct
+- augment Documentation/pinctrl.txt
+
+Signed-off-by: Sonic Zhang <sonic.zhang@analog.com>
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+(cherry picked from commit fa76a3db7093a527333c380df82a0f158d9b8299)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ Documentation/pinctrl.txt | 11 +++++++++++
+ drivers/pinctrl/pinctrl-adi2.c | 1 +
+ drivers/pinctrl/pinmux.c | 13 +++++++++++++
+ include/linux/pinctrl/pinctrl.h | 3 +++
+ 4 files changed, 28 insertions(+)
+
+diff --git a/Documentation/pinctrl.txt b/Documentation/pinctrl.txt
+index a9b47163bb5d..d6b2bed94c43 100644
+--- a/Documentation/pinctrl.txt
++++ b/Documentation/pinctrl.txt
+@@ -73,6 +73,7 @@ static struct pinctrl_desc foo_desc = {
+ .pins = foo_pins,
+ .npins = ARRAY_SIZE(foo_pins),
+ .owner = THIS_MODULE,
++ .strict = true,
+ };
+
+ int __init foo_probe(void)
+@@ -830,6 +831,11 @@ separate memory range only intended for GPIO driving, and the register
+ range dealing with pin config and pin multiplexing get placed into a
+ different memory range and a separate section of the data sheet.
+
++A flag "strict" in struct pinctrl_desc is available to check and deny
++simultaneous access to the same pin from GPIO and pin multiplexing
++consumers on hardware of this type. The pinctrl driver should set this flag
++accordingly.
++
+ (B)
+
+ pin config
+@@ -850,6 +856,11 @@ possible that the GPIO, pin config and pin multiplex registers are placed into
+ the same memory range and the same section of the data sheet, although that
+ need not be the case.
+
++In some pin controllers, although the physical pins are designed in the same
++way as (B), the GPIO function still can't be enabled at the same time as the
++peripheral functions. So again the "strict" flag should be set, denying
++simultaneous activation by GPIO and other muxed in devices.
++
+ From a kernel point of view, however, these are different aspects of the
+ hardware and shall be put into different subsystems:
+
+diff --git a/drivers/pinctrl/pinctrl-adi2.c b/drivers/pinctrl/pinctrl-adi2.c
+index 8434439c5017..fbd492668da1 100644
+--- a/drivers/pinctrl/pinctrl-adi2.c
++++ b/drivers/pinctrl/pinctrl-adi2.c
+@@ -710,6 +710,7 @@ static struct pinctrl_desc adi_pinmux_desc = {
+ .name = DRIVER_NAME,
+ .pctlops = &adi_pctrl_ops,
+ .pmxops = &adi_pinmux_ops,
++ .strict = true,
+ .owner = THIS_MODULE,
+ };
+
+diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c
+index b874458dcb88..2546fa783464 100644
+--- a/drivers/pinctrl/pinmux.c
++++ b/drivers/pinctrl/pinmux.c
+@@ -107,6 +107,13 @@ static int pin_request(struct pinctrl_dev *pctldev,
+ desc->name, desc->gpio_owner, owner);
+ goto out;
+ }
++ if (pctldev->desc->strict && desc->mux_usecount &&
++ strcmp(desc->mux_owner, owner)) {
++ dev_err(pctldev->dev,
++ "pin %s already requested by %s; cannot claim for %s\n",
++ desc->name, desc->mux_owner, owner);
++ goto out;
++ }
+
+ desc->gpio_owner = owner;
+ } else {
+@@ -116,6 +123,12 @@ static int pin_request(struct pinctrl_dev *pctldev,
+ desc->name, desc->mux_owner, owner);
+ goto out;
+ }
++ if (pctldev->desc->strict && desc->gpio_owner) {
++ dev_err(pctldev->dev,
++ "pin %s already requested by %s; cannot claim for %s\n",
++ desc->name, desc->gpio_owner, owner);
++ goto out;
++ }
+
+ desc->mux_usecount++;
+ if (desc->mux_usecount > 1)
+diff --git a/include/linux/pinctrl/pinctrl.h b/include/linux/pinctrl/pinctrl.h
+index 66e4697516de..fc6b0348c375 100644
+--- a/include/linux/pinctrl/pinctrl.h
++++ b/include/linux/pinctrl/pinctrl.h
+@@ -114,6 +114,8 @@ struct pinctrl_ops {
+ * of the pins field above
+ * @pctlops: pin control operation vtable, to support global concepts like
+ * grouping of pins, this is optional.
++ * @strict: check both gpio_owner and mux_owner strictly before approving
++ the pin request
+ * @pmxops: pinmux operations vtable, if you support pinmuxing in your driver
+ * @confops: pin config operations vtable, if you support pin configuration in
+ * your driver
+@@ -132,6 +134,7 @@ struct pinctrl_desc {
+ const struct pinctrl_ops *pctlops;
+ const struct pinmux_ops *pmxops;
+ const struct pinconf_ops *confops;
++ bool strict;
+ struct module *owner;
+ #ifdef CONFIG_GENERIC_PINCONF
+ unsigned int num_custom_params;
+--
+2.6.2
+
diff --git a/patches.renesas/0060-pinctrl-move-strict-option-to-pinmux_ops.patch b/patches.renesas/0060-pinctrl-move-strict-option-to-pinmux_ops.patch
new file mode 100644
index 00000000000000..89c2485e9c2ff8
--- /dev/null
+++ b/patches.renesas/0060-pinctrl-move-strict-option-to-pinmux_ops.patch
@@ -0,0 +1,130 @@
+From b42d4c0354afb44d8bb946f064e1a59af43fa856 Mon Sep 17 00:00:00 2001
+From: Linus Walleij <linus.walleij@linaro.org>
+Date: Wed, 6 May 2015 14:19:13 +0200
+Subject: [PATCH 060/129] pinctrl: move strict option to pinmux_ops
+
+While the pinmux_ops are ideally just a vtable for pin mux
+calls, the "strict" setting belongs so intuitively with the
+pin multiplexing that we should move it here anyway. Putting
+it in the top pinctrl_desc makes no sense.
+
+Cc: Sonic Zhang <sonic.zhang@analog.com>
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+(cherry picked from commit 8c4c2016345feefcd289ce2479eb70286d30825a)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ Documentation/pinctrl.txt | 2 +-
+ drivers/pinctrl/pinctrl-adi2.c | 2 +-
+ drivers/pinctrl/pinmux.c | 4 ++--
+ include/linux/pinctrl/pinctrl.h | 3 ---
+ include/linux/pinctrl/pinmux.h | 4 ++++
+ 5 files changed, 8 insertions(+), 7 deletions(-)
+
+diff --git a/Documentation/pinctrl.txt b/Documentation/pinctrl.txt
+index d6b2bed94c43..4976389e432d 100644
+--- a/Documentation/pinctrl.txt
++++ b/Documentation/pinctrl.txt
+@@ -73,7 +73,6 @@ static struct pinctrl_desc foo_desc = {
+ .pins = foo_pins,
+ .npins = ARRAY_SIZE(foo_pins),
+ .owner = THIS_MODULE,
+- .strict = true,
+ };
+
+ int __init foo_probe(void)
+@@ -715,6 +714,7 @@ static struct pinmux_ops foo_pmxops = {
+ .get_function_name = foo_get_fname,
+ .get_function_groups = foo_get_groups,
+ .set_mux = foo_set_mux,
++ .strict = true,
+ };
+
+ /* Pinmux operations are handled by some pin controller */
+diff --git a/drivers/pinctrl/pinctrl-adi2.c b/drivers/pinctrl/pinctrl-adi2.c
+index fbd492668da1..49df9037b41e 100644
+--- a/drivers/pinctrl/pinctrl-adi2.c
++++ b/drivers/pinctrl/pinctrl-adi2.c
+@@ -703,6 +703,7 @@ static struct pinmux_ops adi_pinmux_ops = {
+ .get_function_name = adi_pinmux_get_func_name,
+ .get_function_groups = adi_pinmux_get_groups,
+ .gpio_request_enable = adi_pinmux_request_gpio,
++ .strict = true,
+ };
+
+
+@@ -710,7 +711,6 @@ static struct pinctrl_desc adi_pinmux_desc = {
+ .name = DRIVER_NAME,
+ .pctlops = &adi_pctrl_ops,
+ .pmxops = &adi_pinmux_ops,
+- .strict = true,
+ .owner = THIS_MODULE,
+ };
+
+diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c
+index 2546fa783464..c58c168b06c2 100644
+--- a/drivers/pinctrl/pinmux.c
++++ b/drivers/pinctrl/pinmux.c
+@@ -107,7 +107,7 @@ static int pin_request(struct pinctrl_dev *pctldev,
+ desc->name, desc->gpio_owner, owner);
+ goto out;
+ }
+- if (pctldev->desc->strict && desc->mux_usecount &&
++ if (ops->strict && desc->mux_usecount &&
+ strcmp(desc->mux_owner, owner)) {
+ dev_err(pctldev->dev,
+ "pin %s already requested by %s; cannot claim for %s\n",
+@@ -123,7 +123,7 @@ static int pin_request(struct pinctrl_dev *pctldev,
+ desc->name, desc->mux_owner, owner);
+ goto out;
+ }
+- if (pctldev->desc->strict && desc->gpio_owner) {
++ if (ops->strict && desc->gpio_owner) {
+ dev_err(pctldev->dev,
+ "pin %s already requested by %s; cannot claim for %s\n",
+ desc->name, desc->gpio_owner, owner);
+diff --git a/include/linux/pinctrl/pinctrl.h b/include/linux/pinctrl/pinctrl.h
+index fc6b0348c375..66e4697516de 100644
+--- a/include/linux/pinctrl/pinctrl.h
++++ b/include/linux/pinctrl/pinctrl.h
+@@ -114,8 +114,6 @@ struct pinctrl_ops {
+ * of the pins field above
+ * @pctlops: pin control operation vtable, to support global concepts like
+ * grouping of pins, this is optional.
+- * @strict: check both gpio_owner and mux_owner strictly before approving
+- the pin request
+ * @pmxops: pinmux operations vtable, if you support pinmuxing in your driver
+ * @confops: pin config operations vtable, if you support pin configuration in
+ * your driver
+@@ -134,7 +132,6 @@ struct pinctrl_desc {
+ const struct pinctrl_ops *pctlops;
+ const struct pinmux_ops *pmxops;
+ const struct pinconf_ops *confops;
+- bool strict;
+ struct module *owner;
+ #ifdef CONFIG_GENERIC_PINCONF
+ unsigned int num_custom_params;
+diff --git a/include/linux/pinctrl/pinmux.h b/include/linux/pinctrl/pinmux.h
+index 511bda9ed4bf..d3740fa7073f 100644
+--- a/include/linux/pinctrl/pinmux.h
++++ b/include/linux/pinctrl/pinmux.h
+@@ -56,6 +56,9 @@ struct pinctrl_dev;
+ * depending on whether the GPIO is configured as input or output,
+ * a direction selector function may be implemented as a backing
+ * to the GPIO controllers that need pin muxing.
++ * @strict: do not allow simultaneous use of the same pin for GPIO and another
++ * function. Check both gpio_owner and mux_owner strictly before approving
++ * the pin request.
+ */
+ struct pinmux_ops {
+ int (*request) (struct pinctrl_dev *pctldev, unsigned offset);
+@@ -79,6 +82,7 @@ struct pinmux_ops {
+ struct pinctrl_gpio_range *range,
+ unsigned offset,
+ bool input);
++ bool strict;
+ };
+
+ #endif /* CONFIG_PINMUX */
+--
+2.6.2
+
diff --git a/patches.renesas/0061-pinctrl-use-ERR_CAST-instead-of-ERR_PTR-PTR_ERR.patch b/patches.renesas/0061-pinctrl-use-ERR_CAST-instead-of-ERR_PTR-PTR_ERR.patch
new file mode 100644
index 00000000000000..a655ec38a2fac3
--- /dev/null
+++ b/patches.renesas/0061-pinctrl-use-ERR_CAST-instead-of-ERR_PTR-PTR_ERR.patch
@@ -0,0 +1,31 @@
+From 1cf420ea0f8bde21be959898d7470561a8f0b73c Mon Sep 17 00:00:00 2001
+From: Fabian Frederick <fabf@skynet.be>
+Date: Mon, 27 Apr 2015 18:04:05 +0200
+Subject: [PATCH 061/129] pinctrl: use ERR_CAST instead of ERR_PTR/PTR_ERR
+
+Inspired by scripts/coccinelle/api/err_cast.cocci
+
+Signed-off-by: Fabian Frederick <fabf@skynet.be>
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+(cherry picked from commit 66eb3bd857f5311f72c7c371f78ddc9c472befba)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ include/linux/pinctrl/consumer.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/linux/pinctrl/consumer.h b/include/linux/pinctrl/consumer.h
+index 18eccefea06e..d7e5d608faa7 100644
+--- a/include/linux/pinctrl/consumer.h
++++ b/include/linux/pinctrl/consumer.h
+@@ -142,7 +142,7 @@ static inline struct pinctrl * __must_check pinctrl_get_select(
+ s = pinctrl_lookup_state(p, name);
+ if (IS_ERR(s)) {
+ pinctrl_put(p);
+- return ERR_PTR(PTR_ERR(s));
++ return ERR_CAST(s);
+ }
+
+ ret = pinctrl_select_state(p, s);
+--
+2.6.2
+
diff --git a/patches.renesas/0062-pinctrl-Grammar-s-used-in-as-used-as.patch b/patches.renesas/0062-pinctrl-Grammar-s-used-in-as-used-as.patch
new file mode 100644
index 00000000000000..b1868e091bf5bf
--- /dev/null
+++ b/patches.renesas/0062-pinctrl-Grammar-s-used-in-as-used-as.patch
@@ -0,0 +1,29 @@
+From ea6f7a13fb03cca4b5168e8ad5fbb5358f8fb1ce Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Mon, 4 May 2015 19:46:57 +0200
+Subject: [PATCH 062/129] pinctrl: Grammar s/used in as/used as/
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+(cherry picked from commit b217e4385d7ae59d1628b0ecb4cffa10f16d5864)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/pinctrl/core.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c
+index 18ee2089df4a..5b4e6897af22 100644
+--- a/drivers/pinctrl/core.c
++++ b/drivers/pinctrl/core.c
+@@ -558,7 +558,7 @@ int pinctrl_get_group_selector(struct pinctrl_dev *pctldev,
+ }
+
+ /**
+- * pinctrl_request_gpio() - request a single pin to be used in as GPIO
++ * pinctrl_request_gpio() - request a single pin to be used as GPIO
+ * @gpio: the GPIO pin number from the GPIO subsystem number space
+ *
+ * This function should *ONLY* be used from gpiolib-based GPIO drivers,
+--
+2.6.2
+
diff --git a/patches.renesas/0063-pinctrl-improve-debugfs-for-strict-controllers.patch b/patches.renesas/0063-pinctrl-improve-debugfs-for-strict-controllers.patch
new file mode 100644
index 00000000000000..87763d76f9054b
--- /dev/null
+++ b/patches.renesas/0063-pinctrl-improve-debugfs-for-strict-controllers.patch
@@ -0,0 +1,81 @@
+From 9b81e78993fd7b2a3f3ab5c0348a266f471498fa Mon Sep 17 00:00:00 2001
+From: Linus Walleij <linus.walleij@linaro.org>
+Date: Thu, 28 May 2015 10:11:19 +0200
+Subject: [PATCH 063/129] pinctrl: improve debugfs for strict controllers
+
+If we know we are using a strict pin controller (one that cannot
+mix device functions+group use and GPIO) we can be a bit more
+specific in debugfs, just print either device-function-group
+or GPIO consumer for the pin. Let's do that to be helpful.
+
+Cc: Sonic Zhang <sonic.zhang@analog.com>
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+(cherry picked from commit 815088550342904acd68f43436e1b4d1d78b77c1)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/pinctrl/pinmux.c | 41 +++++++++++++++++++++++++++++++++--------
+ 1 file changed, 33 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c
+index c58c168b06c2..77f82b23f7be 100644
+--- a/drivers/pinctrl/pinmux.c
++++ b/drivers/pinctrl/pinmux.c
+@@ -585,7 +585,12 @@ static int pinmux_pins_show(struct seq_file *s, void *what)
+ return 0;
+
+ seq_puts(s, "Pinmux settings per pin\n");
+- seq_puts(s, "Format: pin (name): mux_owner gpio_owner hog?\n");
++ if (pmxops->strict)
++ seq_puts(s,
++ "Format: pin (name): mux_owner|gpio_owner (strict) hog?\n");
++ else
++ seq_puts(s,
++ "Format: pin (name): mux_owner gpio_owner hog?\n");
+
+ mutex_lock(&pctldev->mutex);
+
+@@ -604,14 +609,34 @@ static int pinmux_pins_show(struct seq_file *s, void *what)
+ !strcmp(desc->mux_owner, pinctrl_dev_get_name(pctldev)))
+ is_hog = true;
+
+- seq_printf(s, "pin %d (%s): %s %s%s", pin,
+- desc->name ? desc->name : "unnamed",
+- desc->mux_owner ? desc->mux_owner
+- : "(MUX UNCLAIMED)",
+- desc->gpio_owner ? desc->gpio_owner
+- : "(GPIO UNCLAIMED)",
+- is_hog ? " (HOG)" : "");
++ if (pmxops->strict) {
++ if (desc->mux_owner)
++ seq_printf(s, "pin %d (%s): device %s%s",
++ pin,
++ desc->name ? desc->name : "unnamed",
++ desc->mux_owner,
++ is_hog ? " (HOG)" : "");
++ else if (desc->gpio_owner)
++ seq_printf(s, "pin %d (%s): GPIO %s",
++ pin,
++ desc->name ? desc->name : "unnamed",
++ desc->gpio_owner);
++ else
++ seq_printf(s, "pin %d (%s): UNCLAIMED",
++ pin,
++ desc->name ? desc->name : "unnamed");
++ } else {
++ /* For non-strict controllers */
++ seq_printf(s, "pin %d (%s): %s %s%s", pin,
++ desc->name ? desc->name : "unnamed",
++ desc->mux_owner ? desc->mux_owner
++ : "(MUX UNCLAIMED)",
++ desc->gpio_owner ? desc->gpio_owner
++ : "(GPIO UNCLAIMED)",
++ is_hog ? " (HOG)" : "");
++ }
+
++ /* If mux: print function+group claiming the pin */
+ if (desc->mux_setting)
+ seq_printf(s, " function %s group %s\n",
+ pmxops->get_function_name(pctldev,
+--
+2.6.2
+
diff --git a/patches.renesas/0064-pinctrl-remove-useless-const-qualifier.patch b/patches.renesas/0064-pinctrl-remove-useless-const-qualifier.patch
new file mode 100644
index 00000000000000..d44200b696d633
--- /dev/null
+++ b/patches.renesas/0064-pinctrl-remove-useless-const-qualifier.patch
@@ -0,0 +1,33 @@
+From 139e306e48f5a9fb1a9e912e3b5c8b76b9eefed8 Mon Sep 17 00:00:00 2001
+From: Masahiro Yamada <yamada.masahiro@socionext.com>
+Date: Fri, 22 May 2015 15:19:37 +0900
+Subject: [PATCH 064/129] pinctrl: remove useless const qualifier
+
+This "const" claims the get_function_groups callback never
+changes the given num_groups pointer. It is always true
+in C language, so not worth mentioning.
+
+Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+(cherry picked from commit 5fbf65d5c9c0fd2e5c6c48d69ce34b1c5415f2fd)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ include/linux/pinctrl/pinmux.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/linux/pinctrl/pinmux.h b/include/linux/pinctrl/pinmux.h
+index d3740fa7073f..ace60d775b20 100644
+--- a/include/linux/pinctrl/pinmux.h
++++ b/include/linux/pinctrl/pinmux.h
+@@ -69,7 +69,7 @@ struct pinmux_ops {
+ int (*get_function_groups) (struct pinctrl_dev *pctldev,
+ unsigned selector,
+ const char * const **groups,
+- unsigned * const num_groups);
++ unsigned *num_groups);
+ int (*set_mux) (struct pinctrl_dev *pctldev, unsigned func_selector,
+ unsigned group_selector);
+ int (*gpio_request_enable) (struct pinctrl_dev *pctldev,
+--
+2.6.2
+
diff --git a/patches.renesas/0065-pinctrl-use-const-struct-.-rather-than-struct-.-cons.patch b/patches.renesas/0065-pinctrl-use-const-struct-.-rather-than-struct-.-cons.patch
new file mode 100644
index 00000000000000..999ec15f4b02aa
--- /dev/null
+++ b/patches.renesas/0065-pinctrl-use-const-struct-.-rather-than-struct-.-cons.patch
@@ -0,0 +1,36 @@
+From 2704f56af18f223f8314c7d08758f78baf18732e Mon Sep 17 00:00:00 2001
+From: Masahiro Yamada <yamada.masahiro@socionext.com>
+Date: Fri, 22 May 2015 15:25:50 +0900
+Subject: [PATCH 065/129] pinctrl: use "const struct ..." rather than "struct
+ ... const"
+
+Only this member, pins, is defined as "struct ... const *", but the
+others in this struct, pinlops, pmxops, confops, etc. are defined as
+"const struct ... *".
+
+Swap the "struct pinctrl_pin_desc" and "const" for consistency.
+
+Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+(cherry picked from commit b3da97ee581387cd42dafd76eb2ac23f2335cd92)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ include/linux/pinctrl/pinctrl.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/linux/pinctrl/pinctrl.h b/include/linux/pinctrl/pinctrl.h
+index 66e4697516de..9ba59fcba549 100644
+--- a/include/linux/pinctrl/pinctrl.h
++++ b/include/linux/pinctrl/pinctrl.h
+@@ -127,7 +127,7 @@ struct pinctrl_ops {
+ */
+ struct pinctrl_desc {
+ const char *name;
+- struct pinctrl_pin_desc const *pins;
++ const struct pinctrl_pin_desc *pins;
+ unsigned int npins;
+ const struct pinctrl_ops *pctlops;
+ const struct pinmux_ops *pmxops;
+--
+2.6.2
+
diff --git a/patches.renesas/0066-pinctrl-fix-confusing-debug-message-in-pinctrl_regis.patch b/patches.renesas/0066-pinctrl-fix-confusing-debug-message-in-pinctrl_regis.patch
new file mode 100644
index 00000000000000..a189024339e068
--- /dev/null
+++ b/patches.renesas/0066-pinctrl-fix-confusing-debug-message-in-pinctrl_regis.patch
@@ -0,0 +1,37 @@
+From 02fbbbf691da07c819b2999ab3e30f55c63a8dcc Mon Sep 17 00:00:00 2001
+From: Masahiro Yamada <yamada.masahiro@socionext.com>
+Date: Thu, 28 May 2015 21:52:59 +0900
+Subject: [PATCH 066/129] pinctrl: fix confusing debug message in
+ pinctrl_register_map()
+
+There are two types for pinctrl maps: pinmux and pinconfig
+This debug message shows the number of maps of both types.
+The string "pinmux map" is not precise. Let's say "pinctrl map"
+instead.
+
+Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
+[also fixed %d -> %u]
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+
+(cherry picked from commit 7e9236ff3d92ec326f29a20d86add10f1ff4e9b3)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/pinctrl/core.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c
+index 5b4e6897af22..700935097d03 100644
+--- a/drivers/pinctrl/core.c
++++ b/drivers/pinctrl/core.c
+@@ -1115,7 +1115,7 @@ int pinctrl_register_map(struct pinctrl_map const *maps, unsigned num_maps,
+ int i, ret;
+ struct pinctrl_maps *maps_node;
+
+- pr_debug("add %d pinmux maps\n", num_maps);
++ pr_debug("add %u pinctrl maps\n", num_maps);
+
+ /* First sanity check the new mapping */
+ for (i = 0; i < num_maps; i++) {
+--
+2.6.2
+
diff --git a/patches.renesas/0067-pinctrl-don-t-print-unavailable-function-groups.patch b/patches.renesas/0067-pinctrl-don-t-print-unavailable-function-groups.patch
new file mode 100644
index 00000000000000..fdd834993c56b9
--- /dev/null
+++ b/patches.renesas/0067-pinctrl-don-t-print-unavailable-function-groups.patch
@@ -0,0 +1,38 @@
+From a569abe0e69467db2c07fe57de26551a979f2d2c Mon Sep 17 00:00:00 2001
+From: Ludovic Desroches <ludovic.desroches@atmel.com>
+Date: Mon, 8 Jun 2015 17:16:37 +0200
+Subject: [PATCH 067/129] pinctrl: don't print unavailable function groups
+
+There is no reason to try to print groups associated to a function if
+get_function_groups returns an error. Moreover, it can lead to a NULL
+pointer dereference error.
+
+Signed-off-by: Ludovic Desroches <ludovic.desroches@atmel.com>
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+(cherry picked from commit 9d7ebbbf2264c4ad3c8d50fcb84952126184a7ad)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/pinctrl/pinmux.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c
+index 77f82b23f7be..e7ae890dcf1a 100644
+--- a/drivers/pinctrl/pinmux.c
++++ b/drivers/pinctrl/pinmux.c
+@@ -557,9 +557,12 @@ static int pinmux_functions_show(struct seq_file *s, void *what)
+
+ ret = pmxops->get_function_groups(pctldev, func_selector,
+ &groups, &num_groups);
+- if (ret)
++ if (ret) {
+ seq_printf(s, "function %s: COULD NOT GET GROUPS\n",
+ func);
++ func_selector++;
++ continue;
++ }
+
+ seq_printf(s, "function: %s, groups = [ ", func);
+ for (i = 0; i < num_groups; i++)
+--
+2.6.2
+
diff --git a/patches.renesas/0068-pinctrl-make-pinctrl_register-return-proper-error-co.patch b/patches.renesas/0068-pinctrl-make-pinctrl_register-return-proper-error-co.patch
new file mode 100644
index 00000000000000..448d4d6b2f5be4
--- /dev/null
+++ b/patches.renesas/0068-pinctrl-make-pinctrl_register-return-proper-error-co.patch
@@ -0,0 +1,713 @@
+From f6d5123c26729824ef65e69fbe861a8a8aa5a80a Mon Sep 17 00:00:00 2001
+From: Masahiro Yamada <yamada.masahiro@socionext.com>
+Date: Tue, 9 Jun 2015 13:01:16 +0900
+Subject: [PATCH 068/129] pinctrl: make pinctrl_register() return proper error
+ code
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Currently, pinctrl_register() just returns NULL on error, so the
+callers can not know the exact reason of the failure.
+
+Some of the pinctrl drivers return -EINVAL, some -ENODEV, and some
+-ENOMEM on error of pinctrl_register(), although the error code
+might be different from the real cause of the error.
+
+This commit reworks pinctrl_register() to return the appropriate
+error code and modifies all of the pinctrl drivers to use IS_ERR()
+for the error checking and PTR_ERR() for getting the error code.
+
+Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
+Acked-by: Patrice Chotard <patrice.chotard@st.com>
+Acked-by: Thierry Reding <treding@nvidia.com>
+Acked-by: Heiko Stuebner <heiko@sntech.de>
+Tested-by: Mika Westerberg <mika.westerberg@linux.intel.com>
+Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
+Acked-by: Lee Jones <lee@kernel.org>
+Acked-by: Sören Brinkmann <soren.brinkmann@xilinx.com>
+Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Acked-by: Ray Jui <rjui@broadcom.com>
+Acked-by: Antoine Tenart <antoine.tenart@free-electrons.com>
+Acked-by: Hongzhou Yang <hongzhou.yang@mediatek.com>
+Acked-by: Wei Chen <Wei.Chen@csr.com>
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+(cherry picked from commit 323de9efdf3e75d1dfb48003a52e59d6d9d4c7a5)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+
+Conflicts:
+ drivers/pinctrl/pinctrl-lpc18xx.c
+ drivers/pinctrl/pinctrl-pistachio.c
+ drivers/pinctrl/sirf/pinctrl-atlas7.c
+---
+ drivers/pinctrl/bcm/pinctrl-bcm281xx.c | 4 ++--
+ drivers/pinctrl/bcm/pinctrl-bcm2835.c | 4 ++--
+ drivers/pinctrl/bcm/pinctrl-cygnus-gpio.c | 4 ++--
+ drivers/pinctrl/bcm/pinctrl-cygnus-mux.c | 4 ++--
+ drivers/pinctrl/berlin/berlin.c | 4 ++--
+ drivers/pinctrl/core.c | 17 ++++++++++-------
+ drivers/pinctrl/freescale/pinctrl-imx.c | 4 ++--
+ drivers/pinctrl/freescale/pinctrl-imx1-core.c | 4 ++--
+ drivers/pinctrl/freescale/pinctrl-mxs.c | 4 ++--
+ drivers/pinctrl/intel/pinctrl-cherryview.c | 4 ++--
+ drivers/pinctrl/intel/pinctrl-intel.c | 4 ++--
+ drivers/pinctrl/mediatek/pinctrl-mtk-common.c | 4 ++--
+ drivers/pinctrl/meson/pinctrl-meson.c | 4 ++--
+ drivers/pinctrl/mvebu/pinctrl-mvebu.c | 4 ++--
+ drivers/pinctrl/nomadik/pinctrl-abx500.c | 4 ++--
+ drivers/pinctrl/nomadik/pinctrl-nomadik.c | 4 ++--
+ drivers/pinctrl/pinctrl-adi2.c | 4 ++--
+ drivers/pinctrl/pinctrl-amd.c | 4 ++--
+ drivers/pinctrl/pinctrl-as3722.c | 4 ++--
+ drivers/pinctrl/pinctrl-at91.c | 4 ++--
+ drivers/pinctrl/pinctrl-lantiq.c | 4 ++--
+ drivers/pinctrl/pinctrl-palmas.c | 4 ++--
+ drivers/pinctrl/pinctrl-rockchip.c | 4 ++--
+ drivers/pinctrl/pinctrl-single.c | 4 ++--
+ drivers/pinctrl/pinctrl-st.c | 4 ++--
+ drivers/pinctrl/pinctrl-tb10x.c | 4 ++--
+ drivers/pinctrl/pinctrl-tegra-xusb.c | 4 ++--
+ drivers/pinctrl/pinctrl-tegra.c | 4 ++--
+ drivers/pinctrl/pinctrl-tz1090-pdc.c | 4 ++--
+ drivers/pinctrl/pinctrl-tz1090.c | 4 ++--
+ drivers/pinctrl/pinctrl-u300.c | 4 ++--
+ drivers/pinctrl/pinctrl-zynq.c | 4 ++--
+ drivers/pinctrl/qcom/pinctrl-msm.c | 4 ++--
+ drivers/pinctrl/qcom/pinctrl-spmi-gpio.c | 4 ++--
+ drivers/pinctrl/qcom/pinctrl-spmi-mpp.c | 4 ++--
+ drivers/pinctrl/samsung/pinctrl-exynos5440.c | 4 ++--
+ drivers/pinctrl/samsung/pinctrl-samsung.c | 4 ++--
+ drivers/pinctrl/sh-pfc/pinctrl.c | 4 ++--
+ drivers/pinctrl/sirf/pinctrl-sirf.c | 4 ++--
+ drivers/pinctrl/spear/pinctrl-spear.c | 4 ++--
+ drivers/pinctrl/sunxi/pinctrl-sunxi.c | 4 ++--
+ drivers/pinctrl/vt8500/pinctrl-wmt.c | 4 ++--
+ 42 files changed, 92 insertions(+), 89 deletions(-)
+
+--- a/drivers/pinctrl/bcm/pinctrl-bcm281xx.c
++++ b/drivers/pinctrl/bcm/pinctrl-bcm281xx.c
+@@ -1425,9 +1425,9 @@ static int __init bcm281xx_pinctrl_probe
+ pctl = pinctrl_register(&bcm281xx_pinctrl_desc,
+ &pdev->dev,
+ pdata);
+- if (!pctl) {
++ if (IS_ERR(pctl)) {
+ dev_err(&pdev->dev, "Failed to register pinctrl\n");
+- return -ENODEV;
++ return PTR_ERR(pctl);
+ }
+
+ platform_set_drvdata(pdev, pdata);
+--- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
++++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
+@@ -1036,9 +1036,9 @@ static int bcm2835_pinctrl_probe(struct
+ }
+
+ pc->pctl_dev = pinctrl_register(&bcm2835_pinctrl_desc, dev, pc);
+- if (!pc->pctl_dev) {
++ if (IS_ERR(pc->pctl_dev)) {
+ gpiochip_remove(&pc->gpio_chip);
+- return -EINVAL;
++ return PTR_ERR(pc->pctl_dev);
+ }
+
+ pc->gpio_range = bcm2835_pinctrl_gpio_range;
+--- a/drivers/pinctrl/bcm/pinctrl-cygnus-gpio.c
++++ b/drivers/pinctrl/bcm/pinctrl-cygnus-gpio.c
+@@ -750,9 +750,9 @@ static int cygnus_gpio_register_pinconf(
+ pctldesc->confops = &cygnus_pconf_ops;
+
+ chip->pctl = pinctrl_register(pctldesc, chip->dev, chip);
+- if (!chip->pctl) {
++ if (IS_ERR(chip->pctl)) {
+ dev_err(chip->dev, "unable to register pinctrl device\n");
+- return -EINVAL;
++ return PTR_ERR(chip->pctl);
+ }
+
+ return 0;
+--- a/drivers/pinctrl/bcm/pinctrl-cygnus-mux.c
++++ b/drivers/pinctrl/bcm/pinctrl-cygnus-mux.c
+@@ -989,9 +989,9 @@ static int cygnus_pinmux_probe(struct pl
+
+ pinctrl->pctl = pinctrl_register(&cygnus_pinctrl_desc, &pdev->dev,
+ pinctrl);
+- if (!pinctrl->pctl) {
++ if (IS_ERR(pinctrl->pctl)) {
+ dev_err(&pdev->dev, "unable to register Cygnus IOMUX pinctrl\n");
+- return -EINVAL;
++ return PTR_ERR(pinctrl->pctl);
+ }
+
+ return 0;
+--- a/drivers/pinctrl/berlin/berlin.c
++++ b/drivers/pinctrl/berlin/berlin.c
+@@ -320,9 +320,9 @@ int berlin_pinctrl_probe(struct platform
+ }
+
+ pctrl->pctrl_dev = pinctrl_register(&berlin_pctrl_desc, dev, pctrl);
+- if (!pctrl->pctrl_dev) {
++ if (IS_ERR(pctrl->pctrl_dev)) {
+ dev_err(dev, "failed to register pinctrl driver\n");
+- return -EINVAL;
++ return PTR_ERR(pctrl->pctrl_dev);
+ }
+
+ return 0;
+--- a/drivers/pinctrl/core.c
++++ b/drivers/pinctrl/core.c
+@@ -1704,14 +1704,14 @@ struct pinctrl_dev *pinctrl_register(str
+ int ret;
+
+ if (!pctldesc)
+- return NULL;
++ return ERR_PTR(-EINVAL);
+ if (!pctldesc->name)
+- return NULL;
++ return ERR_PTR(-EINVAL);
+
+ pctldev = kzalloc(sizeof(*pctldev), GFP_KERNEL);
+ if (pctldev == NULL) {
+ dev_err(dev, "failed to alloc struct pinctrl_dev\n");
+- return NULL;
++ return ERR_PTR(-ENOMEM);
+ }
+
+ /* Initialize pin control device struct */
+@@ -1724,20 +1724,23 @@ struct pinctrl_dev *pinctrl_register(str
+ mutex_init(&pctldev->mutex);
+
+ /* check core ops for sanity */
+- if (pinctrl_check_ops(pctldev)) {
++ ret = pinctrl_check_ops(pctldev);
++ if (ret) {
+ dev_err(dev, "pinctrl ops lacks necessary functions\n");
+ goto out_err;
+ }
+
+ /* If we're implementing pinmuxing, check the ops for sanity */
+ if (pctldesc->pmxops) {
+- if (pinmux_check_ops(pctldev))
++ ret = pinmux_check_ops(pctldev);
++ if (ret)
+ goto out_err;
+ }
+
+ /* If we're implementing pinconfig, check the ops for sanity */
+ if (pctldesc->confops) {
+- if (pinconf_check_ops(pctldev))
++ ret = pinconf_check_ops(pctldev);
++ if (ret)
+ goto out_err;
+ }
+
+@@ -1783,7 +1786,7 @@ struct pinctrl_dev *pinctrl_register(str
+ out_err:
+ mutex_destroy(&pctldev->mutex);
+ kfree(pctldev);
+- return NULL;
++ return ERR_PTR(ret);
+ }
+ EXPORT_SYMBOL_GPL(pinctrl_register);
+
+--- a/drivers/pinctrl/freescale/pinctrl-imx.c
++++ b/drivers/pinctrl/freescale/pinctrl-imx.c
+@@ -690,9 +690,9 @@ int imx_pinctrl_probe(struct platform_de
+ ipctl->dev = info->dev;
+ platform_set_drvdata(pdev, ipctl);
+ ipctl->pctl = pinctrl_register(&imx_pinctrl_desc, &pdev->dev, ipctl);
+- if (!ipctl->pctl) {
++ if (IS_ERR(ipctl->pctl)) {
+ dev_err(&pdev->dev, "could not register IMX pinctrl driver\n");
+- return -EINVAL;
++ return PTR_ERR(ipctl->pctl);
+ }
+
+ dev_info(&pdev->dev, "initialized IMX pinctrl driver\n");
+--- a/drivers/pinctrl/freescale/pinctrl-imx1-core.c
++++ b/drivers/pinctrl/freescale/pinctrl-imx1-core.c
+@@ -632,9 +632,9 @@ int imx1_pinctrl_core_probe(struct platf
+ ipctl->dev = info->dev;
+ platform_set_drvdata(pdev, ipctl);
+ ipctl->pctl = pinctrl_register(pctl_desc, &pdev->dev, ipctl);
+- if (!ipctl->pctl) {
++ if (IS_ERR(ipctl->pctl)) {
+ dev_err(&pdev->dev, "could not register IMX pinctrl driver\n");
+- return -EINVAL;
++ return PTR_ERR(ipctl->pctl);
+ }
+
+ ret = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev);
+--- a/drivers/pinctrl/freescale/pinctrl-mxs.c
++++ b/drivers/pinctrl/freescale/pinctrl-mxs.c
+@@ -540,9 +540,9 @@ int mxs_pinctrl_probe(struct platform_de
+ }
+
+ d->pctl = pinctrl_register(&mxs_pinctrl_desc, &pdev->dev, d);
+- if (!d->pctl) {
++ if (IS_ERR(d->pctl)) {
+ dev_err(&pdev->dev, "Couldn't register MXS pinctrl driver\n");
+- ret = -EINVAL;
++ ret = PTR_ERR(d->pctl);
+ goto err;
+ }
+
+--- a/drivers/pinctrl/intel/pinctrl-cherryview.c
++++ b/drivers/pinctrl/intel/pinctrl-cherryview.c
+@@ -1533,9 +1533,9 @@ static int chv_pinctrl_probe(struct plat
+ pctrl->pctldesc.npins = pctrl->community->npins;
+
+ pctrl->pctldev = pinctrl_register(&pctrl->pctldesc, &pdev->dev, pctrl);
+- if (!pctrl->pctldev) {
++ if (IS_ERR(pctrl->pctldev)) {
+ dev_err(&pdev->dev, "failed to register pinctrl driver\n");
+- return -ENODEV;
++ return PTR_ERR(pctrl->pctldev);
+ }
+
+ ret = chv_gpio_probe(pctrl, irq);
+--- a/drivers/pinctrl/intel/pinctrl-intel.c
++++ b/drivers/pinctrl/intel/pinctrl-intel.c
+@@ -1021,9 +1021,9 @@ int intel_pinctrl_probe(struct platform_
+ pctrl->pctldesc.npins = pctrl->soc->npins;
+
+ pctrl->pctldev = pinctrl_register(&pctrl->pctldesc, &pdev->dev, pctrl);
+- if (!pctrl->pctldev) {
++ if (IS_ERR(pctrl->pctldev)) {
+ dev_err(&pdev->dev, "failed to register pinctrl driver\n");
+- return -ENODEV;
++ return PTR_ERR(pctrl->pctldev);
+ }
+
+ ret = intel_gpio_probe(pctrl, irq);
+--- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
++++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
+@@ -1165,9 +1165,9 @@ int mtk_pctrl_init(struct platform_devic
+ mtk_pctrl_desc.npins = pctl->devdata->npins;
+ pctl->dev = &pdev->dev;
+ pctl->pctl_dev = pinctrl_register(&mtk_pctrl_desc, &pdev->dev, pctl);
+- if (!pctl->pctl_dev) {
++ if (IS_ERR(pctl->pctl_dev)) {
+ dev_err(&pdev->dev, "couldn't register pinctrl driver\n");
+- return -EINVAL;
++ return PTR_ERR(pctl->pctl_dev);
+ }
+
+ pctl->chip = devm_kzalloc(&pdev->dev, sizeof(*pctl->chip), GFP_KERNEL);
+--- a/drivers/pinctrl/meson/pinctrl-meson.c
++++ b/drivers/pinctrl/meson/pinctrl-meson.c
+@@ -738,9 +738,9 @@ static int meson_pinctrl_probe(struct pl
+ pc->desc.npins = pc->data->num_pins;
+
+ pc->pcdev = pinctrl_register(&pc->desc, pc->dev, pc);
+- if (!pc->pcdev) {
++ if (IS_ERR(pc->pcdev)) {
+ dev_err(pc->dev, "can't register pinctrl device");
+- return -EINVAL;
++ return PTR_ERR(pc->pcdev);
+ }
+
+ ret = meson_gpiolib_register(pc);
+--- a/drivers/pinctrl/mvebu/pinctrl-mvebu.c
++++ b/drivers/pinctrl/mvebu/pinctrl-mvebu.c
+@@ -706,9 +706,9 @@ int mvebu_pinctrl_probe(struct platform_
+ }
+
+ pctl->pctldev = pinctrl_register(&pctl->desc, &pdev->dev, pctl);
+- if (!pctl->pctldev) {
++ if (IS_ERR(pctl->pctldev)) {
+ dev_err(&pdev->dev, "unable to register pinctrl driver\n");
+- return -EINVAL;
++ return PTR_ERR(pctl->pctldev);
+ }
+
+ dev_info(&pdev->dev, "registered pinctrl driver\n");
+--- a/drivers/pinctrl/nomadik/pinctrl-abx500.c
++++ b/drivers/pinctrl/nomadik/pinctrl-abx500.c
+@@ -1234,10 +1234,10 @@ static int abx500_gpio_probe(struct plat
+ abx500_pinctrl_desc.pins = pct->soc->pins;
+ abx500_pinctrl_desc.npins = pct->soc->npins;
+ pct->pctldev = pinctrl_register(&abx500_pinctrl_desc, &pdev->dev, pct);
+- if (!pct->pctldev) {
++ if (IS_ERR(pct->pctldev)) {
+ dev_err(&pdev->dev,
+ "could not register abx500 pinctrl driver\n");
+- ret = -EINVAL;
++ ret = PTR_ERR(pct->pctldev);
+ goto out_rem_chip;
+ }
+ dev_info(&pdev->dev, "registered pin controller\n");
+--- a/drivers/pinctrl/nomadik/pinctrl-nomadik.c
++++ b/drivers/pinctrl/nomadik/pinctrl-nomadik.c
+@@ -2029,9 +2029,9 @@ static int nmk_pinctrl_probe(struct plat
+ npct->dev = &pdev->dev;
+
+ npct->pctl = pinctrl_register(&nmk_pinctrl_desc, &pdev->dev, npct);
+- if (!npct->pctl) {
++ if (IS_ERR(npct->pctl)) {
+ dev_err(&pdev->dev, "could not register Nomadik pinctrl driver\n");
+- return -EINVAL;
++ return PTR_ERR(npct->pctl);
+ }
+
+ /* We will handle a range of GPIO pins */
+--- a/drivers/pinctrl/pinctrl-adi2.c
++++ b/drivers/pinctrl/pinctrl-adi2.c
+@@ -1070,9 +1070,9 @@ static int adi_pinctrl_probe(struct plat
+
+ /* Now register the pin controller and all pins it handles */
+ pinctrl->pctl = pinctrl_register(&adi_pinmux_desc, &pdev->dev, pinctrl);
+- if (!pinctrl->pctl) {
++ if (IS_ERR(pinctrl->pctl)) {
+ dev_err(&pdev->dev, "could not register pinctrl ADI2 driver\n");
+- return -EINVAL;
++ return PTR_ERR(pinctrl->pctl);
+ }
+
+ platform_set_drvdata(pdev, pinctrl);
+--- a/drivers/pinctrl/pinctrl-amd.c
++++ b/drivers/pinctrl/pinctrl-amd.c
+@@ -789,9 +789,9 @@ static int amd_gpio_probe(struct platfor
+ amd_pinctrl_desc.name = dev_name(&pdev->dev);
+ gpio_dev->pctrl = pinctrl_register(&amd_pinctrl_desc,
+ &pdev->dev, gpio_dev);
+- if (!gpio_dev->pctrl) {
++ if (IS_ERR(gpio_dev->pctrl)) {
+ dev_err(&pdev->dev, "Couldn't register pinctrl driver\n");
+- return -ENODEV;
++ return PTR_ERR(gpio_dev->pctrl);
+ }
+
+ ret = gpiochip_add(&gpio_dev->gc);
+--- a/drivers/pinctrl/pinctrl-as3722.c
++++ b/drivers/pinctrl/pinctrl-as3722.c
+@@ -586,9 +586,9 @@ static int as3722_pinctrl_probe(struct p
+ as3722_pinctrl_desc.npins = ARRAY_SIZE(as3722_pins_desc);
+ as_pci->pctl = pinctrl_register(&as3722_pinctrl_desc,
+ &pdev->dev, as_pci);
+- if (!as_pci->pctl) {
++ if (IS_ERR(as_pci->pctl)) {
+ dev_err(&pdev->dev, "Couldn't register pinctrl driver\n");
+- return -EINVAL;
++ return PTR_ERR(as_pci->pctl);
+ }
+
+ as_pci->gpio_chip = as3722_gpio_chip;
+--- a/drivers/pinctrl/pinctrl-at91.c
++++ b/drivers/pinctrl/pinctrl-at91.c
+@@ -1253,9 +1253,9 @@ static int at91_pinctrl_probe(struct pla
+ platform_set_drvdata(pdev, info);
+ info->pctl = pinctrl_register(&at91_pinctrl_desc, &pdev->dev, info);
+
+- if (!info->pctl) {
++ if (IS_ERR(info->pctl)) {
+ dev_err(&pdev->dev, "could not register AT91 pinctrl driver\n");
+- return -EINVAL;
++ return PTR_ERR(info->pctl);
+ }
+
+ /* We will handle a range of GPIO pins */
+--- a/drivers/pinctrl/pinctrl-lantiq.c
++++ b/drivers/pinctrl/pinctrl-lantiq.c
+@@ -337,9 +337,9 @@ int ltq_pinctrl_register(struct platform
+ info->dev = &pdev->dev;
+
+ info->pctrl = pinctrl_register(desc, &pdev->dev, info);
+- if (!info->pctrl) {
++ if (IS_ERR(info->pctrl)) {
+ dev_err(&pdev->dev, "failed to register LTQ pinmux driver\n");
+- return -EINVAL;
++ return PTR_ERR(info->pctrl);
+ }
+ platform_set_drvdata(pdev, info);
+ return 0;
+--- a/drivers/pinctrl/pinctrl-palmas.c
++++ b/drivers/pinctrl/pinctrl-palmas.c
+@@ -1044,9 +1044,9 @@ static int palmas_pinctrl_probe(struct p
+ palmas_pinctrl_desc.pins = palmas_pins_desc;
+ palmas_pinctrl_desc.npins = ARRAY_SIZE(palmas_pins_desc);
+ pci->pctl = pinctrl_register(&palmas_pinctrl_desc, &pdev->dev, pci);
+- if (!pci->pctl) {
++ if (IS_ERR(pci->pctl)) {
+ dev_err(&pdev->dev, "Couldn't register pinctrl driver\n");
+- return -ENODEV;
++ return PTR_ERR(pci->pctl);
+ }
+ return 0;
+ }
+--- a/drivers/pinctrl/pinctrl-rockchip.c
++++ b/drivers/pinctrl/pinctrl-rockchip.c
+@@ -1274,9 +1274,9 @@ static int rockchip_pinctrl_register(str
+ return ret;
+
+ info->pctl_dev = pinctrl_register(ctrldesc, &pdev->dev, info);
+- if (!info->pctl_dev) {
++ if (IS_ERR(info->pctl_dev)) {
+ dev_err(&pdev->dev, "could not register pinctrl driver\n");
+- return -EINVAL;
++ return PTR_ERR(info->pctl_dev);
+ }
+
+ for (bank = 0; bank < info->ctrl->nr_banks; ++bank) {
+--- a/drivers/pinctrl/pinctrl-single.c
++++ b/drivers/pinctrl/pinctrl-single.c
+@@ -1921,9 +1921,9 @@ static int pcs_probe(struct platform_dev
+ goto free;
+
+ pcs->pctl = pinctrl_register(&pcs->desc, pcs->dev, pcs);
+- if (!pcs->pctl) {
++ if (IS_ERR(pcs->pctl)) {
+ dev_err(pcs->dev, "could not register single pinctrl driver\n");
+- ret = -EINVAL;
++ ret = PTR_ERR(pcs->pctl);
+ goto free;
+ }
+
+--- a/drivers/pinctrl/pinctrl-st.c
++++ b/drivers/pinctrl/pinctrl-st.c
+@@ -1737,9 +1737,9 @@ static int st_pctl_probe(struct platform
+ pctl_desc->name = dev_name(&pdev->dev);
+
+ info->pctl = pinctrl_register(pctl_desc, &pdev->dev, info);
+- if (!info->pctl) {
++ if (IS_ERR(info->pctl)) {
+ dev_err(&pdev->dev, "Failed pinctrl registration\n");
+- return -EINVAL;
++ return PTR_ERR(info->pctl);
+ }
+
+ for (i = 0; i < info->nbanks; i++)
+--- a/drivers/pinctrl/pinctrl-tb10x.c
++++ b/drivers/pinctrl/pinctrl-tb10x.c
+@@ -807,9 +807,9 @@ static int tb10x_pinctrl_probe(struct pl
+ }
+
+ state->pctl = pinctrl_register(&tb10x_pindesc, dev, state);
+- if (!state->pctl) {
++ if (IS_ERR(state->pctl)) {
+ dev_err(dev, "could not register TB10x pin driver\n");
+- ret = -EINVAL;
++ ret = PTR_ERR(state->pctl);
+ goto fail;
+ }
+
+--- a/drivers/pinctrl/pinctrl-tegra-xusb.c
++++ b/drivers/pinctrl/pinctrl-tegra-xusb.c
+@@ -909,9 +909,9 @@ static int tegra_xusb_padctl_probe(struc
+ padctl->desc.owner = THIS_MODULE;
+
+ padctl->pinctrl = pinctrl_register(&padctl->desc, &pdev->dev, padctl);
+- if (!padctl->pinctrl) {
++ if (IS_ERR(padctl->pinctrl)) {
+ dev_err(&pdev->dev, "failed to register pincontrol\n");
+- err = -ENODEV;
++ err = PTR_ERR(padctl->pinctrl);
+ goto reset;
+ }
+
+--- a/drivers/pinctrl/pinctrl-tegra.c
++++ b/drivers/pinctrl/pinctrl-tegra.c
+@@ -703,9 +703,9 @@ int tegra_pinctrl_probe(struct platform_
+ }
+
+ pmx->pctl = pinctrl_register(&tegra_pinctrl_desc, &pdev->dev, pmx);
+- if (!pmx->pctl) {
++ if (IS_ERR(pmx->pctl)) {
+ dev_err(&pdev->dev, "Couldn't register pinctrl driver\n");
+- return -ENODEV;
++ return PTR_ERR(pmx->pctl);
+ }
+
+ pinctrl_add_gpio_range(pmx->pctl, &tegra_pinctrl_gpio_range);
+--- a/drivers/pinctrl/pinctrl-tz1090-pdc.c
++++ b/drivers/pinctrl/pinctrl-tz1090-pdc.c
+@@ -948,9 +948,9 @@ static int tz1090_pdc_pinctrl_probe(stru
+ return PTR_ERR(pmx->regs);
+
+ pmx->pctl = pinctrl_register(&tz1090_pdc_pinctrl_desc, &pdev->dev, pmx);
+- if (!pmx->pctl) {
++ if (IS_ERR(pmx->pctl)) {
+ dev_err(&pdev->dev, "Couldn't register pinctrl driver\n");
+- return -ENODEV;
++ return PTR_ERR(pmx->pctl);
+ }
+
+ platform_set_drvdata(pdev, pmx);
+--- a/drivers/pinctrl/pinctrl-tz1090.c
++++ b/drivers/pinctrl/pinctrl-tz1090.c
+@@ -1963,9 +1963,9 @@ static int tz1090_pinctrl_probe(struct p
+ return PTR_ERR(pmx->regs);
+
+ pmx->pctl = pinctrl_register(&tz1090_pinctrl_desc, &pdev->dev, pmx);
+- if (!pmx->pctl) {
++ if (IS_ERR(pmx->pctl)) {
+ dev_err(&pdev->dev, "Couldn't register pinctrl driver\n");
+- return -ENODEV;
++ return PTR_ERR(pmx->pctl);
+ }
+
+ platform_set_drvdata(pdev, pmx);
+--- a/drivers/pinctrl/pinctrl-u300.c
++++ b/drivers/pinctrl/pinctrl-u300.c
+@@ -1068,9 +1068,9 @@ static int u300_pmx_probe(struct platfor
+ return PTR_ERR(upmx->virtbase);
+
+ upmx->pctl = pinctrl_register(&u300_pmx_desc, &pdev->dev, upmx);
+- if (!upmx->pctl) {
++ if (IS_ERR(upmx->pctl)) {
+ dev_err(&pdev->dev, "could not register U300 pinmux driver\n");
+- return -EINVAL;
++ return PTR_ERR(upmx->pctl);
+ }
+
+ platform_set_drvdata(pdev, upmx);
+--- a/drivers/pinctrl/pinctrl-zynq.c
++++ b/drivers/pinctrl/pinctrl-zynq.c
+@@ -1140,8 +1140,8 @@ static int zynq_pinctrl_probe(struct pla
+ pctrl->nfuncs = ARRAY_SIZE(zynq_pmux_functions);
+
+ pctrl->pctrl = pinctrl_register(&zynq_desc, &pdev->dev, pctrl);
+- if (!pctrl->pctrl)
+- return -ENOMEM;
++ if (IS_ERR(pctrl->pctrl))
++ return PTR_ERR(pctrl->pctrl);
+
+ platform_set_drvdata(pdev, pctrl);
+
+--- a/drivers/pinctrl/qcom/pinctrl-msm.c
++++ b/drivers/pinctrl/qcom/pinctrl-msm.c
+@@ -906,9 +906,9 @@ int msm_pinctrl_probe(struct platform_de
+ msm_pinctrl_desc.pins = pctrl->soc->pins;
+ msm_pinctrl_desc.npins = pctrl->soc->npins;
+ pctrl->pctrl = pinctrl_register(&msm_pinctrl_desc, &pdev->dev, pctrl);
+- if (!pctrl->pctrl) {
++ if (IS_ERR(pctrl->pctrl)) {
+ dev_err(&pdev->dev, "Couldn't register pinctrl driver\n");
+- return -ENODEV;
++ return PTR_ERR(pctrl->pctrl);
+ }
+
+ ret = msm_gpio_init(pctrl);
+--- a/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c
++++ b/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c
+@@ -778,8 +778,8 @@ static int pmic_gpio_probe(struct platfo
+ state->chip.can_sleep = false;
+
+ state->ctrl = pinctrl_register(pctrldesc, dev, state);
+- if (!state->ctrl)
+- return -ENODEV;
++ if (IS_ERR(state->ctrl))
++ return PTR_ERR(state->ctrl);
+
+ ret = gpiochip_add(&state->chip);
+ if (ret) {
+--- a/drivers/pinctrl/qcom/pinctrl-spmi-mpp.c
++++ b/drivers/pinctrl/qcom/pinctrl-spmi-mpp.c
+@@ -892,8 +892,8 @@ static int pmic_mpp_probe(struct platfor
+ state->chip.can_sleep = false;
+
+ state->ctrl = pinctrl_register(pctrldesc, dev, state);
+- if (!state->ctrl)
+- return -ENODEV;
++ if (IS_ERR(state->ctrl))
++ return PTR_ERR(state->ctrl);
+
+ ret = gpiochip_add(&state->chip);
+ if (ret) {
+--- a/drivers/pinctrl/samsung/pinctrl-exynos5440.c
++++ b/drivers/pinctrl/samsung/pinctrl-exynos5440.c
+@@ -822,9 +822,9 @@ static int exynos5440_pinctrl_register(s
+ return ret;
+
+ pctl_dev = pinctrl_register(ctrldesc, &pdev->dev, priv);
+- if (!pctl_dev) {
++ if (IS_ERR(pctl_dev)) {
+ dev_err(&pdev->dev, "could not register pinctrl driver\n");
+- return -EINVAL;
++ return PTR_ERR(pctl_dev);
+ }
+
+ grange.name = "exynos5440-pctrl-gpio-range";
+--- a/drivers/pinctrl/samsung/pinctrl-samsung.c
++++ b/drivers/pinctrl/samsung/pinctrl-samsung.c
+@@ -873,9 +873,9 @@ static int samsung_pinctrl_register(stru
+ return ret;
+
+ drvdata->pctl_dev = pinctrl_register(ctrldesc, &pdev->dev, drvdata);
+- if (!drvdata->pctl_dev) {
++ if (IS_ERR(drvdata->pctl_dev)) {
+ dev_err(&pdev->dev, "could not register pinctrl driver\n");
+- return -EINVAL;
++ return PTR_ERR(drvdata->pctl_dev);
+ }
+
+ for (bank = 0; bank < drvdata->nr_banks; ++bank) {
+--- a/drivers/pinctrl/sh-pfc/pinctrl.c
++++ b/drivers/pinctrl/sh-pfc/pinctrl.c
+@@ -625,8 +625,8 @@ int sh_pfc_register_pinctrl(struct sh_pf
+ pmx->pctl_desc.npins = pfc->info->nr_pins;
+
+ pmx->pctl = pinctrl_register(&pmx->pctl_desc, pfc->dev, pmx);
+- if (pmx->pctl == NULL)
+- return -EINVAL;
++ if (IS_ERR(pmx->pctl))
++ return PTR_ERR(pmx->pctl);
+
+ return 0;
+ }
+--- a/drivers/pinctrl/sirf/pinctrl-sirf.c
++++ b/drivers/pinctrl/sirf/pinctrl-sirf.c
+@@ -310,9 +310,9 @@ static int sirfsoc_pinmux_probe(struct p
+
+ /* Now register the pin controller and all pins it handles */
+ spmx->pmx = pinctrl_register(&sirfsoc_pinmux_desc, &pdev->dev, spmx);
+- if (!spmx->pmx) {
++ if (IS_ERR(spmx->pmx)) {
+ dev_err(&pdev->dev, "could not register SIRFSOC pinmux driver\n");
+- ret = -EINVAL;
++ ret = PTR_ERR(spmx->pmx);
+ goto out_no_pmx;
+ }
+
+--- a/drivers/pinctrl/spear/pinctrl-spear.c
++++ b/drivers/pinctrl/spear/pinctrl-spear.c
+@@ -396,9 +396,9 @@ int spear_pinctrl_probe(struct platform_
+ spear_pinctrl_desc.npins = machdata->npins;
+
+ pmx->pctl = pinctrl_register(&spear_pinctrl_desc, &pdev->dev, pmx);
+- if (!pmx->pctl) {
++ if (IS_ERR(pmx->pctl)) {
+ dev_err(&pdev->dev, "Couldn't register pinctrl driver\n");
+- return -ENODEV;
++ return PTR_ERR(pmx->pctl);
+ }
+
+ return 0;
+--- a/drivers/pinctrl/sunxi/pinctrl-sunxi.c
++++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.c
+@@ -911,9 +911,9 @@ int sunxi_pinctrl_init(struct platform_d
+
+ pctl->pctl_dev = pinctrl_register(pctrl_desc,
+ &pdev->dev, pctl);
+- if (!pctl->pctl_dev) {
++ if (IS_ERR(pctl->pctl_dev)) {
+ dev_err(&pdev->dev, "couldn't register pinctrl driver\n");
+- return -EINVAL;
++ return PTR_ERR(pctl->pctl_dev);
+ }
+
+ pctl->chip = devm_kzalloc(&pdev->dev, sizeof(*pctl->chip), GFP_KERNEL);
+--- a/drivers/pinctrl/vt8500/pinctrl-wmt.c
++++ b/drivers/pinctrl/vt8500/pinctrl-wmt.c
+@@ -594,9 +594,9 @@ int wmt_pinctrl_probe(struct platform_de
+ data->dev = &pdev->dev;
+
+ data->pctl_dev = pinctrl_register(&wmt_desc, &pdev->dev, data);
+- if (!data->pctl_dev) {
++ if (IS_ERR(data->pctl_dev)) {
+ dev_err(&pdev->dev, "Failed to register pinctrl\n");
+- return -EINVAL;
++ return PTR_ERR(data->pctl_dev);
+ }
+
+ err = gpiochip_add(&data->gpio_chip);
diff --git a/patches.renesas/0069-dmaengine-rcar-dmac-fixup-spinlock-in-rcar-dmac.patch b/patches.renesas/0069-dmaengine-rcar-dmac-fixup-spinlock-in-rcar-dmac.patch
new file mode 100644
index 00000000000000..1c42760257b648
--- /dev/null
+++ b/patches.renesas/0069-dmaengine-rcar-dmac-fixup-spinlock-in-rcar-dmac.patch
@@ -0,0 +1,175 @@
+From 8eee16b07e04e1c440cf5298767959913d32aa0c Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Thu, 21 May 2015 03:48:38 +0000
+Subject: [PATCH 069/129] dmaengine: rcar-dmac: fixup spinlock in rcar-dmac
+
+Current rcar-dmac driver is using spin_lock_irq() / spin_unlock_irq()
+in some functions. But, some other driver might call DMAEngine API
+during interrupt disabled. In such case, rcar-dmac side spin_unlock_irq()
+forcefully allows all interrupts. Therefore, other driver receives
+unexpected interruption, and its exclusive access control will be broken.
+This patch replaces spin_lock_irq() to spin_lock_irqsave(),
+and spin_unlock_irq() to spin_unlock_irqrestore().
+
+Reported-by: Cao Minh Hiep <cm-hiep@jinso.co.jp>
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Acked-by: Vinod Koul <vinod.koul@intel.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit d23c9a0a5c237210bccb82a2e9dc0d26e75920ee)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/dma/sh/rcar-dmac.c | 37 +++++++++++++++++++++----------------
+ 1 file changed, 21 insertions(+), 16 deletions(-)
+
+diff --git a/drivers/dma/sh/rcar-dmac.c b/drivers/dma/sh/rcar-dmac.c
+index a18d16cc4795..e0302c784ba4 100644
+--- a/drivers/dma/sh/rcar-dmac.c
++++ b/drivers/dma/sh/rcar-dmac.c
+@@ -465,6 +465,7 @@ static dma_cookie_t rcar_dmac_tx_submit(struct dma_async_tx_descriptor *tx)
+ static int rcar_dmac_desc_alloc(struct rcar_dmac_chan *chan, gfp_t gfp)
+ {
+ struct rcar_dmac_desc_page *page;
++ unsigned long flags;
+ LIST_HEAD(list);
+ unsigned int i;
+
+@@ -482,10 +483,10 @@ static int rcar_dmac_desc_alloc(struct rcar_dmac_chan *chan, gfp_t gfp)
+ list_add_tail(&desc->node, &list);
+ }
+
+- spin_lock_irq(&chan->lock);
++ spin_lock_irqsave(&chan->lock, flags);
+ list_splice_tail(&list, &chan->desc.free);
+ list_add_tail(&page->node, &chan->desc.pages);
+- spin_unlock_irq(&chan->lock);
++ spin_unlock_irqrestore(&chan->lock, flags);
+
+ return 0;
+ }
+@@ -516,6 +517,7 @@ static void rcar_dmac_desc_put(struct rcar_dmac_chan *chan,
+ static void rcar_dmac_desc_recycle_acked(struct rcar_dmac_chan *chan)
+ {
+ struct rcar_dmac_desc *desc, *_desc;
++ unsigned long flags;
+ LIST_HEAD(list);
+
+ /*
+@@ -524,9 +526,9 @@ static void rcar_dmac_desc_recycle_acked(struct rcar_dmac_chan *chan)
+ * list_for_each_entry_safe, isn't safe if we release the channel lock
+ * around the rcar_dmac_desc_put() call.
+ */
+- spin_lock_irq(&chan->lock);
++ spin_lock_irqsave(&chan->lock, flags);
+ list_splice_init(&chan->desc.wait, &list);
+- spin_unlock_irq(&chan->lock);
++ spin_unlock_irqrestore(&chan->lock, flags);
+
+ list_for_each_entry_safe(desc, _desc, &list, node) {
+ if (async_tx_test_ack(&desc->async_tx)) {
+@@ -539,9 +541,9 @@ static void rcar_dmac_desc_recycle_acked(struct rcar_dmac_chan *chan)
+ return;
+
+ /* Put the remaining descriptors back in the wait list. */
+- spin_lock_irq(&chan->lock);
++ spin_lock_irqsave(&chan->lock, flags);
+ list_splice(&list, &chan->desc.wait);
+- spin_unlock_irq(&chan->lock);
++ spin_unlock_irqrestore(&chan->lock, flags);
+ }
+
+ /*
+@@ -556,12 +558,13 @@ static void rcar_dmac_desc_recycle_acked(struct rcar_dmac_chan *chan)
+ static struct rcar_dmac_desc *rcar_dmac_desc_get(struct rcar_dmac_chan *chan)
+ {
+ struct rcar_dmac_desc *desc;
++ unsigned long flags;
+ int ret;
+
+ /* Recycle acked descriptors before attempting allocation. */
+ rcar_dmac_desc_recycle_acked(chan);
+
+- spin_lock_irq(&chan->lock);
++ spin_lock_irqsave(&chan->lock, flags);
+
+ while (list_empty(&chan->desc.free)) {
+ /*
+@@ -570,17 +573,17 @@ static struct rcar_dmac_desc *rcar_dmac_desc_get(struct rcar_dmac_chan *chan)
+ * allocated descriptors. If the allocation fails return an
+ * error.
+ */
+- spin_unlock_irq(&chan->lock);
++ spin_unlock_irqrestore(&chan->lock, flags);
+ ret = rcar_dmac_desc_alloc(chan, GFP_NOWAIT);
+ if (ret < 0)
+ return NULL;
+- spin_lock_irq(&chan->lock);
++ spin_lock_irqsave(&chan->lock, flags);
+ }
+
+ desc = list_first_entry(&chan->desc.free, struct rcar_dmac_desc, node);
+ list_del(&desc->node);
+
+- spin_unlock_irq(&chan->lock);
++ spin_unlock_irqrestore(&chan->lock, flags);
+
+ return desc;
+ }
+@@ -593,6 +596,7 @@ static struct rcar_dmac_desc *rcar_dmac_desc_get(struct rcar_dmac_chan *chan)
+ static int rcar_dmac_xfer_chunk_alloc(struct rcar_dmac_chan *chan, gfp_t gfp)
+ {
+ struct rcar_dmac_desc_page *page;
++ unsigned long flags;
+ LIST_HEAD(list);
+ unsigned int i;
+
+@@ -606,10 +610,10 @@ static int rcar_dmac_xfer_chunk_alloc(struct rcar_dmac_chan *chan, gfp_t gfp)
+ list_add_tail(&chunk->node, &list);
+ }
+
+- spin_lock_irq(&chan->lock);
++ spin_lock_irqsave(&chan->lock, flags);
+ list_splice_tail(&list, &chan->desc.chunks_free);
+ list_add_tail(&page->node, &chan->desc.pages);
+- spin_unlock_irq(&chan->lock);
++ spin_unlock_irqrestore(&chan->lock, flags);
+
+ return 0;
+ }
+@@ -627,9 +631,10 @@ static struct rcar_dmac_xfer_chunk *
+ rcar_dmac_xfer_chunk_get(struct rcar_dmac_chan *chan)
+ {
+ struct rcar_dmac_xfer_chunk *chunk;
++ unsigned long flags;
+ int ret;
+
+- spin_lock_irq(&chan->lock);
++ spin_lock_irqsave(&chan->lock, flags);
+
+ while (list_empty(&chan->desc.chunks_free)) {
+ /*
+@@ -638,18 +643,18 @@ rcar_dmac_xfer_chunk_get(struct rcar_dmac_chan *chan)
+ * allocated descriptors. If the allocation fails return an
+ * error.
+ */
+- spin_unlock_irq(&chan->lock);
++ spin_unlock_irqrestore(&chan->lock, flags);
+ ret = rcar_dmac_xfer_chunk_alloc(chan, GFP_NOWAIT);
+ if (ret < 0)
+ return NULL;
+- spin_lock_irq(&chan->lock);
++ spin_lock_irqsave(&chan->lock, flags);
+ }
+
+ chunk = list_first_entry(&chan->desc.chunks_free,
+ struct rcar_dmac_xfer_chunk, node);
+ list_del(&chunk->node);
+
+- spin_unlock_irq(&chan->lock);
++ spin_unlock_irqrestore(&chan->lock, flags);
+
+ return chunk;
+ }
+--
+2.6.2
+
diff --git a/patches.renesas/0070-dmaengine-rcar-dmac-Use-DECLARE_BITMAP.patch b/patches.renesas/0070-dmaengine-rcar-dmac-Use-DECLARE_BITMAP.patch
new file mode 100644
index 00000000000000..e695cff615b764
--- /dev/null
+++ b/patches.renesas/0070-dmaengine-rcar-dmac-Use-DECLARE_BITMAP.patch
@@ -0,0 +1,31 @@
+From b5f0ba7b44fb4aceafca6fa704cdb325afb80b57 Mon Sep 17 00:00:00 2001
+From: Joe Perches <joe@perches.com>
+Date: Tue, 19 May 2015 18:37:50 -0700
+Subject: [PATCH 070/129] dmaengine: rcar-dmac: Use DECLARE_BITMAP
+
+Use the generic mechanism to declare a bitmap instead of unsigned long.
+
+Signed-off-by: Joe Perches <joe@perches.com>
+Signed-off-by: Vinod Koul <vinod.koul@intel.com>
+(cherry picked from commit 08acf38e3615a5cf641d84f815f3f3ebd2953243)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/dma/sh/rcar-dmac.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/dma/sh/rcar-dmac.c b/drivers/dma/sh/rcar-dmac.c
+index e0302c784ba4..7820d07e7bee 100644
+--- a/drivers/dma/sh/rcar-dmac.c
++++ b/drivers/dma/sh/rcar-dmac.c
+@@ -183,7 +183,7 @@ struct rcar_dmac {
+ unsigned int n_channels;
+ struct rcar_dmac_chan *channels;
+
+- unsigned long modules[256 / BITS_PER_LONG];
++ DECLARE_BITMAP(modules, 256);
+ };
+
+ #define to_rcar_dmac(d) container_of(d, struct rcar_dmac, engine)
+--
+2.6.2
+
diff --git a/patches.renesas/0071-drm-rcar-du-Document-the-rcar_du_crtc-structure.patch b/patches.renesas/0071-drm-rcar-du-Document-the-rcar_du_crtc-structure.patch
new file mode 100644
index 00000000000000..25eb59d9b2aedd
--- /dev/null
+++ b/patches.renesas/0071-drm-rcar-du-Document-the-rcar_du_crtc-structure.patch
@@ -0,0 +1,42 @@
+From f3d116226b4871e35b76bf657d36873c5cc9a3cd Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+Date: Wed, 29 Apr 2015 01:11:57 +0300
+Subject: [PATCH 071/129] drm: rcar-du: Document the rcar_du_crtc structure
+
+Document the structure fields using kerneldoc.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+(cherry picked from commit bce9936a0d7f6570aaa64a41e6ff902716aabfa6)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/gpu/drm/rcar-du/rcar_du_crtc.h | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.h b/drivers/gpu/drm/rcar-du/rcar_du_crtc.h
+index 5d9aa9b33769..4b95d9d08c49 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.h
++++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.h
+@@ -22,6 +22,20 @@
+
+ struct rcar_du_group;
+
++/**
++ * struct rcar_du_crtc - the CRTC, representing a DU superposition processor
++ * @crtc: base DRM CRTC
++ * @clock: the CRTC functional clock
++ * @extclock: external pixel dot clock (optional)
++ * @mmio_offset: offset of the CRTC registers in the DU MMIO block
++ * @index: CRTC software and hardware index
++ * @started: whether the CRTC has been started and is running
++ * @event: event to post when the pending page flip completes
++ * @flip_wait: wait queue used to signal page flip completion
++ * @outputs: bitmask of the outputs (enum rcar_du_output) driven by this CRTC
++ * @enabled: whether the CRTC is enabled, used to control system resume
++ * @group: CRTC group this CRTC belongs to
++ */
+ struct rcar_du_crtc {
+ struct drm_crtc crtc;
+
+--
+2.6.2
+
diff --git a/patches.renesas/0072-drm-rcar-du-Document-the-rcar_du_plane_state-structu.patch b/patches.renesas/0072-drm-rcar-du-Document-the-rcar_du_plane_state-structu.patch
new file mode 100644
index 00000000000000..338779061ff8a3
--- /dev/null
+++ b/patches.renesas/0072-drm-rcar-du-Document-the-rcar_du_plane_state-structu.patch
@@ -0,0 +1,44 @@
+From 11c80836c0d931223d8d50e7eadc6ed913c096c0 Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+Date: Wed, 29 Apr 2015 00:12:40 +0300
+Subject: [PATCH 072/129] drm: rcar-du: Document the rcar_du_plane_state
+ structure
+
+Document the structure fields using kerneldoc.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+(cherry picked from commit 0855c6827f822b51b2b4fc86d1085f47463cb5c9)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/gpu/drm/rcar-du/rcar_du_plane.h | 11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.h b/drivers/gpu/drm/rcar-du/rcar_du_plane.h
+index abff0ebeb195..2beb67acdb38 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_plane.h
++++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.h
+@@ -46,11 +46,20 @@ struct rcar_du_planes {
+ struct drm_property *zpos;
+ };
+
++/**
++ * struct rcar_du_plane_state - Driver-specific plane state
++ * @state: base DRM plane state
++ * @format: information about the pixel format used by the plane
++ * @hwindex: 0-based hardware plane index, -1 means unused
++ * @alpha: value of the plane alpha property
++ * @colorkey: value of the plane colorkey property
++ * @zpos: value of the plane zpos property
++ */
+ struct rcar_du_plane_state {
+ struct drm_plane_state state;
+
+ const struct rcar_du_format_info *format;
+- int hwindex; /* 0-based, -1 means unused */
++ int hwindex;
+
+ unsigned int alpha;
+ unsigned int colorkey;
+--
+2.6.2
+
diff --git a/patches.renesas/0073-drm-rcar-du-Move-properties-from-rcar_du_planes-to-r.patch b/patches.renesas/0073-drm-rcar-du-Move-properties-from-rcar_du_planes-to-r.patch
new file mode 100644
index 00000000000000..811fee5979cf3e
--- /dev/null
+++ b/patches.renesas/0073-drm-rcar-du-Move-properties-from-rcar_du_planes-to-r.patch
@@ -0,0 +1,189 @@
+From b51a533b3f64b700e1f3d22453d483a6ac38a00b Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+Date: Tue, 28 Apr 2015 23:59:29 +0300
+Subject: [PATCH 073/129] drm: rcar-du: Move properties from rcar_du_planes to
+ rcar_du_device
+
+The plane property objects are instantiated once per CRTC group, while
+they should be instantiated once globally for the device. Fix this and
+move them to the rcar_du_device structure.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+(cherry picked from commit 9f6aee952b18d9910912d7cedae9bd26bd901ac3)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/gpu/drm/rcar-du/rcar_du_drv.h | 6 +++++
+ drivers/gpu/drm/rcar-du/rcar_du_kms.c | 29 +++++++++++++++++++++
+ drivers/gpu/drm/rcar-du/rcar_du_plane.c | 46 +++++++++------------------------
+ drivers/gpu/drm/rcar-du/rcar_du_plane.h | 4 ---
+ 4 files changed, 47 insertions(+), 38 deletions(-)
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_drv.h b/drivers/gpu/drm/rcar-du/rcar_du_drv.h
+index c7c538dd2e68..9f34fc86436a 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_drv.h
++++ b/drivers/gpu/drm/rcar-du/rcar_du_drv.h
+@@ -83,6 +83,12 @@ struct rcar_du_device {
+
+ struct rcar_du_group groups[RCAR_DU_MAX_GROUPS];
+
++ struct {
++ struct drm_property *alpha;
++ struct drm_property *colorkey;
++ struct drm_property *zpos;
++ } props;
++
+ unsigned int dpad0_source;
+ struct rcar_du_lvdsenc *lvds[RCAR_DU_MAX_LVDS];
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+index 93117f159a3b..5fd6f8c07ec2 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+@@ -648,6 +648,31 @@ static int rcar_du_encoders_init(struct rcar_du_device *rcdu)
+ return num_encoders;
+ }
+
++static int rcar_du_properties_init(struct rcar_du_device *rcdu)
++{
++ rcdu->props.alpha =
++ drm_property_create_range(rcdu->ddev, 0, "alpha", 0, 255);
++ if (rcdu->props.alpha == NULL)
++ return -ENOMEM;
++
++ /* The color key is expressed as an RGB888 triplet stored in a 32-bit
++ * integer in XRGB8888 format. Bit 24 is used as a flag to disable (0)
++ * or enable source color keying (1).
++ */
++ rcdu->props.colorkey =
++ drm_property_create_range(rcdu->ddev, 0, "colorkey",
++ 0, 0x01ffffff);
++ if (rcdu->props.colorkey == NULL)
++ return -ENOMEM;
++
++ rcdu->props.zpos =
++ drm_property_create_range(rcdu->ddev, 0, "zpos", 1, 7);
++ if (rcdu->props.zpos == NULL)
++ return -ENOMEM;
++
++ return 0;
++}
++
+ int rcar_du_modeset_init(struct rcar_du_device *rcdu)
+ {
+ static const unsigned int mmio_offsets[] = {
+@@ -672,6 +697,10 @@ int rcar_du_modeset_init(struct rcar_du_device *rcdu)
+
+ rcdu->num_crtcs = rcdu->info->num_crtcs;
+
++ ret = rcar_du_properties_init(rcdu);
++ if (ret < 0)
++ return ret;
++
+ /* Initialize the groups. */
+ num_groups = DIV_ROUND_UP(rcdu->num_crtcs, 2);
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
+index 210e5c3fd982..b5565417f673 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
+@@ -328,14 +328,13 @@ static int rcar_du_plane_atomic_set_property(struct drm_plane *plane,
+ uint64_t val)
+ {
+ struct rcar_du_plane_state *rstate = to_rcar_du_plane_state(state);
+- struct rcar_du_plane *rplane = to_rcar_plane(plane);
+- struct rcar_du_group *rgrp = rplane->group;
++ struct rcar_du_device *rcdu = to_rcar_plane(plane)->group->dev;
+
+- if (property == rgrp->planes.alpha)
++ if (property == rcdu->props.alpha)
+ rstate->alpha = val;
+- else if (property == rgrp->planes.colorkey)
++ else if (property == rcdu->props.colorkey)
+ rstate->colorkey = val;
+- else if (property == rgrp->planes.zpos)
++ else if (property == rcdu->props.zpos)
+ rstate->zpos = val;
+ else
+ return -EINVAL;
+@@ -349,14 +348,13 @@ static int rcar_du_plane_atomic_get_property(struct drm_plane *plane,
+ {
+ const struct rcar_du_plane_state *rstate =
+ container_of(state, const struct rcar_du_plane_state, state);
+- struct rcar_du_plane *rplane = to_rcar_plane(plane);
+- struct rcar_du_group *rgrp = rplane->group;
++ struct rcar_du_device *rcdu = to_rcar_plane(plane)->group->dev;
+
+- if (property == rgrp->planes.alpha)
++ if (property == rcdu->props.alpha)
+ *val = rstate->alpha;
+- else if (property == rgrp->planes.colorkey)
++ else if (property == rcdu->props.colorkey)
+ *val = rstate->colorkey;
+- else if (property == rgrp->planes.zpos)
++ else if (property == rcdu->props.zpos)
+ *val = rstate->zpos;
+ else
+ return -EINVAL;
+@@ -399,27 +397,7 @@ int rcar_du_planes_init(struct rcar_du_group *rgrp)
+ unsigned int i;
+ int ret;
+
+- planes->alpha =
+- drm_property_create_range(rcdu->ddev, 0, "alpha", 0, 255);
+- if (planes->alpha == NULL)
+- return -ENOMEM;
+-
+- /* The color key is expressed as an RGB888 triplet stored in a 32-bit
+- * integer in XRGB8888 format. Bit 24 is used as a flag to disable (0)
+- * or enable source color keying (1).
+- */
+- planes->colorkey =
+- drm_property_create_range(rcdu->ddev, 0, "colorkey",
+- 0, 0x01ffffff);
+- if (planes->colorkey == NULL)
+- return -ENOMEM;
+-
+- planes->zpos =
+- drm_property_create_range(rcdu->ddev, 0, "zpos", 1, 7);
+- if (planes->zpos == NULL)
+- return -ENOMEM;
+-
+- /* Create one primary plane per in this group CRTC and seven overlay
++ /* Create one primary plane per CRTC in this group and seven overlay
+ * planes.
+ */
+ num_crtcs = min(rcdu->num_crtcs - 2 * rgrp->index, 2U);
+@@ -448,12 +426,12 @@ int rcar_du_planes_init(struct rcar_du_group *rgrp)
+ continue;
+
+ drm_object_attach_property(&plane->plane.base,
+- planes->alpha, 255);
++ rcdu->props.alpha, 255);
+ drm_object_attach_property(&plane->plane.base,
+- planes->colorkey,
++ rcdu->props.colorkey,
+ RCAR_DU_COLORKEY_NONE);
+ drm_object_attach_property(&plane->plane.base,
+- planes->zpos, 1);
++ rcdu->props.zpos, 1);
+ }
+
+ return 0;
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.h b/drivers/gpu/drm/rcar-du/rcar_du_plane.h
+index 2beb67acdb38..6b17b1f4f414 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_plane.h
++++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.h
+@@ -40,10 +40,6 @@ static inline struct rcar_du_plane *to_rcar_plane(struct drm_plane *plane)
+
+ struct rcar_du_planes {
+ struct rcar_du_plane planes[RCAR_DU_NUM_KMS_PLANES];
+-
+- struct drm_property *alpha;
+- struct drm_property *colorkey;
+- struct drm_property *zpos;
+ };
+
+ /**
+--
+2.6.2
+
diff --git a/patches.renesas/0074-drm-rcar-du-Embed-rcar_du_planes-structure-into-rcar.patch b/patches.renesas/0074-drm-rcar-du-Embed-rcar_du_planes-structure-into-rcar.patch
new file mode 100644
index 00000000000000..492ac67b97fb30
--- /dev/null
+++ b/patches.renesas/0074-drm-rcar-du-Embed-rcar_du_planes-structure-into-rcar.patch
@@ -0,0 +1,139 @@
+From 6632cea8122ed41b9771539e7e2a116bffd71cd1 Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+Date: Wed, 29 Apr 2015 00:05:56 +0300
+Subject: [PATCH 074/129] drm: rcar-du: Embed rcar_du_planes structure into
+ rcar_du_group
+
+The rcar_du_planes structure contains a single field and is only
+instantiated in the rcar_du_group structure. Embed it directly and
+remove the rcar_du_planes structure.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+(cherry picked from commit 99caede11d84af4c0a16fd07f7d7ce9de94f6109)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 10 +++++-----
+ drivers/gpu/drm/rcar-du/rcar_du_group.h | 2 +-
+ drivers/gpu/drm/rcar-du/rcar_du_kms.c | 6 +++---
+ drivers/gpu/drm/rcar-du/rcar_du_plane.c | 3 +--
+ drivers/gpu/drm/rcar-du/rcar_du_plane.h | 4 ----
+ 5 files changed, 10 insertions(+), 15 deletions(-)
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
+index 7d0b8ef9bea2..b5f66b78cbb2 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
+@@ -213,8 +213,8 @@ static void rcar_du_crtc_update_planes(struct rcar_du_crtc *rcrtc)
+ u32 dptsr = 0;
+ u32 dspr = 0;
+
+- for (i = 0; i < ARRAY_SIZE(rcrtc->group->planes.planes); ++i) {
+- struct rcar_du_plane *plane = &rcrtc->group->planes.planes[i];
++ for (i = 0; i < ARRAY_SIZE(rcrtc->group->planes); ++i) {
++ struct rcar_du_plane *plane = &rcrtc->group->planes[i];
+ unsigned int j;
+
+ if (plane->plane.state->crtc != &rcrtc->crtc)
+@@ -427,8 +427,8 @@ void rcar_du_crtc_resume(struct rcar_du_crtc *rcrtc)
+ rcar_du_crtc_start(rcrtc);
+
+ /* Commit the planes state. */
+- for (i = 0; i < ARRAY_SIZE(rcrtc->group->planes.planes); ++i) {
+- struct rcar_du_plane *plane = &rcrtc->group->planes.planes[i];
++ for (i = 0; i < ARRAY_SIZE(rcrtc->group->planes); ++i) {
++ struct rcar_du_plane *plane = &rcrtc->group->planes[i];
+
+ if (plane->plane.state->crtc != &rcrtc->crtc)
+ continue;
+@@ -592,7 +592,7 @@ int rcar_du_crtc_create(struct rcar_du_group *rgrp, unsigned int index)
+ rcrtc->enabled = false;
+
+ ret = drm_crtc_init_with_planes(rcdu->ddev, crtc,
+- &rgrp->planes.planes[index % 2].plane,
++ &rgrp->planes[index % 2].plane,
+ NULL, &crtc_funcs);
+ if (ret < 0)
+ return ret;
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_group.h b/drivers/gpu/drm/rcar-du/rcar_du_group.h
+index ed36433fbe84..ea02bb02f3e1 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_group.h
++++ b/drivers/gpu/drm/rcar-du/rcar_du_group.h
+@@ -40,7 +40,7 @@ struct rcar_du_group {
+
+ struct mutex lock;
+
+- struct rcar_du_planes planes;
++ struct rcar_du_plane planes[RCAR_DU_NUM_KMS_PLANES];
+ };
+
+ u32 rcar_du_group_read(struct rcar_du_group *rgrp, u32 reg);
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+index 5fd6f8c07ec2..4012afacab5f 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+@@ -291,7 +291,7 @@ static int rcar_du_atomic_check(struct drm_device *dev,
+ * plane(s) as freed.
+ */
+ if (!plane_state->format) {
+- index = plane - plane->group->planes.planes;
++ index = plane - plane->group->planes;
+ group_freed_planes[plane->group->index] |= 1 << index;
+ plane_state->hwindex = -1;
+ continue;
+@@ -304,7 +304,7 @@ static int rcar_du_atomic_check(struct drm_device *dev,
+ groups |= 1 << plane->group->index;
+ needs_realloc = true;
+
+- index = plane - plane->group->planes.planes;
++ index = plane - plane->group->planes;
+ group_freed_planes[plane->group->index] |= 1 << index;
+ plane_state->hwindex = -1;
+ }
+@@ -327,7 +327,7 @@ static int rcar_du_atomic_check(struct drm_device *dev,
+ unsigned int used_planes = 0;
+
+ for (i = 0; i < RCAR_DU_NUM_KMS_PLANES; ++i) {
+- struct rcar_du_plane *plane = &group->planes.planes[i];
++ struct rcar_du_plane *plane = &group->planes[i];
+ struct rcar_du_plane_state *plane_state;
+ struct drm_plane_state *s;
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
+index b5565417f673..99fefcaf6597 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
+@@ -389,7 +389,6 @@ static const uint32_t formats[] = {
+
+ int rcar_du_planes_init(struct rcar_du_group *rgrp)
+ {
+- struct rcar_du_planes *planes = &rgrp->planes;
+ struct rcar_du_device *rcdu = rgrp->dev;
+ unsigned int num_planes;
+ unsigned int num_crtcs;
+@@ -409,7 +408,7 @@ int rcar_du_planes_init(struct rcar_du_group *rgrp)
+ enum drm_plane_type type = i < num_crtcs
+ ? DRM_PLANE_TYPE_PRIMARY
+ : DRM_PLANE_TYPE_OVERLAY;
+- struct rcar_du_plane *plane = &planes->planes[i];
++ struct rcar_du_plane *plane = &rgrp->planes[i];
+
+ plane->group = rgrp;
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.h b/drivers/gpu/drm/rcar-du/rcar_du_plane.h
+index 6b17b1f4f414..d1fb9b16a060 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_plane.h
++++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.h
+@@ -38,10 +38,6 @@ static inline struct rcar_du_plane *to_rcar_plane(struct drm_plane *plane)
+ return container_of(plane, struct rcar_du_plane, plane);
+ }
+
+-struct rcar_du_planes {
+- struct rcar_du_plane planes[RCAR_DU_NUM_KMS_PLANES];
+-};
+-
+ /**
+ * struct rcar_du_plane_state - Driver-specific plane state
+ * @state: base DRM plane state
+--
+2.6.2
+
diff --git a/patches.renesas/0075-drm-rcar-du-Rename-to_rcar_du_plane_state-to-to_rcar.patch b/patches.renesas/0075-drm-rcar-du-Rename-to_rcar_du_plane_state-to-to_rcar.patch
new file mode 100644
index 00000000000000..1e5caec5a4bafe
--- /dev/null
+++ b/patches.renesas/0075-drm-rcar-du-Rename-to_rcar_du_plane_state-to-to_rcar.patch
@@ -0,0 +1,180 @@
+From f3742ecfbc8bcb33752ccd0c1fe1948d7c7362d7 Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+Date: Wed, 29 Apr 2015 00:48:17 +0300
+Subject: [PATCH 075/129] drm: rcar-du: Rename to_rcar_du_plane_state to
+ to_rcar_plane_state
+
+All other cast functions are named without using "du", make the plane
+state cast consistent with them.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+(cherry picked from commit ec69a40645c829fcec613b437f72451205ff601f)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 6 +++---
+ drivers/gpu/drm/rcar-du/rcar_du_kms.c | 8 ++++----
+ drivers/gpu/drm/rcar-du/rcar_du_plane.c | 16 ++++++++--------
+ drivers/gpu/drm/rcar-du/rcar_du_plane.h | 2 +-
+ 4 files changed, 16 insertions(+), 16 deletions(-)
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
+index b5f66b78cbb2..15f8d145a133 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
+@@ -195,13 +195,13 @@ void rcar_du_crtc_route_output(struct drm_crtc *crtc,
+
+ static unsigned int plane_zpos(struct rcar_du_plane *plane)
+ {
+- return to_rcar_du_plane_state(plane->plane.state)->zpos;
++ return to_rcar_plane_state(plane->plane.state)->zpos;
+ }
+
+ static const struct rcar_du_format_info *
+ plane_format(struct rcar_du_plane *plane)
+ {
+- return to_rcar_du_plane_state(plane->plane.state)->format;
++ return to_rcar_plane_state(plane->plane.state)->format;
+ }
+
+ static void rcar_du_crtc_update_planes(struct rcar_du_crtc *rcrtc)
+@@ -234,7 +234,7 @@ static void rcar_du_crtc_update_planes(struct rcar_du_crtc *rcrtc)
+ for (i = 0; i < num_planes; ++i) {
+ struct rcar_du_plane *plane = planes[i];
+ struct drm_plane_state *state = plane->plane.state;
+- unsigned int index = to_rcar_du_plane_state(state)->hwindex;
++ unsigned int index = to_rcar_plane_state(state)->hwindex;
+
+ prio -= 4;
+ dspr |= (index + 1) << prio;
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+index 4012afacab5f..14d457047c40 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+@@ -221,7 +221,7 @@ static bool rcar_du_plane_needs_realloc(struct rcar_du_plane *plane,
+ {
+ const struct rcar_du_format_info *cur_format;
+
+- cur_format = to_rcar_du_plane_state(plane->plane.state)->format;
++ cur_format = to_rcar_plane_state(plane->plane.state)->format;
+
+ /* Lowering the number of planes doesn't strictly require reallocation
+ * as the extra hardware plane will be freed when committing, but doing
+@@ -284,7 +284,7 @@ static int rcar_du_atomic_check(struct drm_device *dev,
+ continue;
+
+ plane = to_rcar_plane(state->planes[i]);
+- plane_state = to_rcar_du_plane_state(state->plane_states[i]);
++ plane_state = to_rcar_plane_state(state->plane_states[i]);
+
+ /* If the plane is being disabled we don't need to go through
+ * the full reallocation procedure. Just mark the hardware
+@@ -345,7 +345,7 @@ static int rcar_du_atomic_check(struct drm_device *dev,
+ if (group_freed_planes[index] & (1 << i))
+ continue;
+
+- plane_state = to_rcar_du_plane_state(plane->plane.state);
++ plane_state = to_rcar_plane_state(plane->plane.state);
+ used_planes |= rcar_du_plane_hwmask(plane_state);
+ }
+
+@@ -363,7 +363,7 @@ static int rcar_du_atomic_check(struct drm_device *dev,
+ continue;
+
+ plane = to_rcar_plane(state->planes[i]);
+- plane_state = to_rcar_du_plane_state(state->plane_states[i]);
++ plane_state = to_rcar_plane_state(state->plane_states[i]);
+
+ /* Skip planes that are being disabled or don't need to be
+ * reallocated.
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
+index 99fefcaf6597..d3ed528fa56d 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
+@@ -45,7 +45,7 @@ static void rcar_du_plane_write(struct rcar_du_group *rgrp,
+ static void rcar_du_plane_setup_fb(struct rcar_du_plane *plane)
+ {
+ struct rcar_du_plane_state *state =
+- to_rcar_du_plane_state(plane->plane.state);
++ to_rcar_plane_state(plane->plane.state);
+ struct drm_framebuffer *fb = plane->plane.state->fb;
+ struct rcar_du_group *rgrp = plane->group;
+ unsigned int src_x = state->state.src_x >> 16;
+@@ -109,7 +109,7 @@ static void rcar_du_plane_setup_mode(struct rcar_du_plane *plane,
+ unsigned int index)
+ {
+ struct rcar_du_plane_state *state =
+- to_rcar_du_plane_state(plane->plane.state);
++ to_rcar_plane_state(plane->plane.state);
+ struct rcar_du_group *rgrp = plane->group;
+ u32 colorkey;
+ u32 pnmr;
+@@ -172,7 +172,7 @@ static void __rcar_du_plane_setup(struct rcar_du_plane *plane,
+ unsigned int index)
+ {
+ struct rcar_du_plane_state *state =
+- to_rcar_du_plane_state(plane->plane.state);
++ to_rcar_plane_state(plane->plane.state);
+ struct rcar_du_group *rgrp = plane->group;
+ u32 ddcr2 = PnDDCR2_CODE;
+ u32 ddcr4;
+@@ -222,7 +222,7 @@ static void __rcar_du_plane_setup(struct rcar_du_plane *plane,
+ void rcar_du_plane_setup(struct rcar_du_plane *plane)
+ {
+ struct rcar_du_plane_state *state =
+- to_rcar_du_plane_state(plane->plane.state);
++ to_rcar_plane_state(plane->plane.state);
+
+ __rcar_du_plane_setup(plane, state->hwindex);
+ if (state->format->planes == 2)
+@@ -234,7 +234,7 @@ void rcar_du_plane_setup(struct rcar_du_plane *plane)
+ static int rcar_du_plane_atomic_check(struct drm_plane *plane,
+ struct drm_plane_state *state)
+ {
+- struct rcar_du_plane_state *rstate = to_rcar_du_plane_state(state);
++ struct rcar_du_plane_state *rstate = to_rcar_plane_state(state);
+ struct rcar_du_plane *rplane = to_rcar_plane(plane);
+ struct rcar_du_device *rcdu = rplane->group->dev;
+
+@@ -302,7 +302,7 @@ rcar_du_plane_atomic_duplicate_state(struct drm_plane *plane)
+ struct rcar_du_plane_state *state;
+ struct rcar_du_plane_state *copy;
+
+- state = to_rcar_du_plane_state(plane->state);
++ state = to_rcar_plane_state(plane->state);
+ copy = kmemdup(state, sizeof(*state), GFP_KERNEL);
+ if (copy == NULL)
+ return NULL;
+@@ -319,7 +319,7 @@ static void rcar_du_plane_atomic_destroy_state(struct drm_plane *plane,
+ if (state->fb)
+ drm_framebuffer_unreference(state->fb);
+
+- kfree(to_rcar_du_plane_state(state));
++ kfree(to_rcar_plane_state(state));
+ }
+
+ static int rcar_du_plane_atomic_set_property(struct drm_plane *plane,
+@@ -327,7 +327,7 @@ static int rcar_du_plane_atomic_set_property(struct drm_plane *plane,
+ struct drm_property *property,
+ uint64_t val)
+ {
+- struct rcar_du_plane_state *rstate = to_rcar_du_plane_state(state);
++ struct rcar_du_plane_state *rstate = to_rcar_plane_state(state);
+ struct rcar_du_device *rcdu = to_rcar_plane(plane)->group->dev;
+
+ if (property == rcdu->props.alpha)
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.h b/drivers/gpu/drm/rcar-du/rcar_du_plane.h
+index d1fb9b16a060..9732bff1911b 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_plane.h
++++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.h
+@@ -59,7 +59,7 @@ struct rcar_du_plane_state {
+ };
+
+ static inline struct rcar_du_plane_state *
+-to_rcar_du_plane_state(struct drm_plane_state *state)
++to_rcar_plane_state(struct drm_plane_state *state)
+ {
+ return container_of(state, struct rcar_du_plane_state, state);
+ }
+--
+2.6.2
+
diff --git a/patches.renesas/0076-drm-rcar-du-Add-plane-allocation-debugging.patch b/patches.renesas/0076-drm-rcar-du-Add-plane-allocation-debugging.patch
new file mode 100644
index 00000000000000..227a43dc9a4822
--- /dev/null
+++ b/patches.renesas/0076-drm-rcar-du-Add-plane-allocation-debugging.patch
@@ -0,0 +1,119 @@
+From 0642eeb0dd859099755ca9f9dfd84569af211a6e Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+Date: Wed, 25 Feb 2015 22:31:52 +0200
+Subject: [PATCH 076/129] drm: rcar-du: Add plane allocation debugging
+
+Plane allocation is a complex process, add debugging statements to help
+finding out what could might wrong.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+(cherry picked from commit 08058611958bc161b1de991b494373b8bce56e6b)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/gpu/drm/rcar-du/rcar_du_kms.c | 38 ++++++++++++++++++++++++++++++++++-
+ 1 file changed, 37 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+index 14d457047c40..ade135008e98 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+@@ -286,11 +286,16 @@ static int rcar_du_atomic_check(struct drm_device *dev,
+ plane = to_rcar_plane(state->planes[i]);
+ plane_state = to_rcar_plane_state(state->plane_states[i]);
+
++ dev_dbg(rcdu->dev, "%s: checking plane (%u,%u)\n", __func__,
++ plane->group->index, plane - plane->group->planes);
++
+ /* If the plane is being disabled we don't need to go through
+ * the full reallocation procedure. Just mark the hardware
+ * plane(s) as freed.
+ */
+ if (!plane_state->format) {
++ dev_dbg(rcdu->dev, "%s: plane is being disabled\n",
++ __func__);
+ index = plane - plane->group->planes;
+ group_freed_planes[plane->group->index] |= 1 << index;
+ plane_state->hwindex = -1;
+@@ -301,6 +306,8 @@ static int rcar_du_atomic_check(struct drm_device *dev,
+ * mark the hardware plane(s) as free.
+ */
+ if (rcar_du_plane_needs_realloc(plane, plane_state)) {
++ dev_dbg(rcdu->dev, "%s: plane needs reallocation\n",
++ __func__);
+ groups |= 1 << plane->group->index;
+ needs_realloc = true;
+
+@@ -326,6 +333,9 @@ static int rcar_du_atomic_check(struct drm_device *dev,
+ struct rcar_du_group *group = &rcdu->groups[index];
+ unsigned int used_planes = 0;
+
++ dev_dbg(rcdu->dev, "%s: finding free planes for group %u\n",
++ __func__, index);
++
+ for (i = 0; i < RCAR_DU_NUM_KMS_PLANES; ++i) {
+ struct rcar_du_plane *plane = &group->planes[i];
+ struct rcar_du_plane_state *plane_state;
+@@ -342,15 +352,31 @@ static int rcar_du_atomic_check(struct drm_device *dev,
+ * above. Use the local freed planes list to check for
+ * that condition instead.
+ */
+- if (group_freed_planes[index] & (1 << i))
++ if (group_freed_planes[index] & (1 << i)) {
++ dev_dbg(rcdu->dev,
++ "%s: plane (%u,%u) has been freed, skipping\n",
++ __func__, plane->group->index,
++ plane - plane->group->planes);
+ continue;
++ }
+
+ plane_state = to_rcar_plane_state(plane->plane.state);
+ used_planes |= rcar_du_plane_hwmask(plane_state);
++
++ dev_dbg(rcdu->dev,
++ "%s: plane (%u,%u) uses %u hwplanes (index %d)\n",
++ __func__, plane->group->index,
++ plane - plane->group->planes,
++ plane_state->format ?
++ plane_state->format->planes : 0,
++ plane_state->hwindex);
+ }
+
+ group_free_planes[index] = 0xff & ~used_planes;
+ groups &= ~(1 << index);
++
++ dev_dbg(rcdu->dev, "%s: group %u free planes mask 0x%02x\n",
++ __func__, index, group_free_planes[index]);
+ }
+
+ /* Reallocate hardware planes for each plane that needs it. */
+@@ -365,6 +391,9 @@ static int rcar_du_atomic_check(struct drm_device *dev,
+ plane = to_rcar_plane(state->planes[i]);
+ plane_state = to_rcar_plane_state(state->plane_states[i]);
+
++ dev_dbg(rcdu->dev, "%s: allocating plane (%u,%u)\n", __func__,
++ plane->group->index, plane - plane->group->planes);
++
+ /* Skip planes that are being disabled or don't need to be
+ * reallocated.
+ */
+@@ -380,10 +409,17 @@ static int rcar_du_atomic_check(struct drm_device *dev,
+ return idx;
+ }
+
++ dev_dbg(rcdu->dev, "%s: allocated %u hwplanes (index %u)\n",
++ __func__, plane_state->format->planes, idx);
++
+ plane_state->hwindex = idx;
+
+ group_free_planes[plane->group->index] &=
+ ~rcar_du_plane_hwmask(plane_state);
++
++ dev_dbg(rcdu->dev, "%s: group %u free planes mask 0x%02x\n",
++ __func__, plane->group->index,
++ group_free_planes[plane->group->index]);
+ }
+
+ return 0;
+--
+2.6.2
+
diff --git a/patches.renesas/0077-drm-rcar-du-Keep-plane-to-CRTC-associations-when-dis.patch b/patches.renesas/0077-drm-rcar-du-Keep-plane-to-CRTC-associations-when-dis.patch
new file mode 100644
index 00000000000000..68f2bdca6a6405
--- /dev/null
+++ b/patches.renesas/0077-drm-rcar-du-Keep-plane-to-CRTC-associations-when-dis.patch
@@ -0,0 +1,141 @@
+From bf0a123e3cdd8f1cd6be7370e5ed4639a5de16ab Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+Date: Tue, 28 Apr 2015 18:01:45 +0300
+Subject: [PATCH 077/129] drm: rcar-du: Keep plane to CRTC associations when
+ disabling a plane
+
+Changing the plane to CRTC associations requires restarting the CRTC
+group, creating visible flicker. Mitigate the issue by changing plane
+association only when a plane becomes enabled, not when it get disabled.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+(cherry picked from commit 2a57e9b5af2b96c45d8c73d34416e5dfa5dd38d9)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 48 +++++++++++++++++++--------------
+ drivers/gpu/drm/rcar-du/rcar_du_group.c | 6 +++++
+ drivers/gpu/drm/rcar-du/rcar_du_group.h | 4 ++-
+ 3 files changed, 37 insertions(+), 21 deletions(-)
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
+index 15f8d145a133..620a2c51185c 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
+@@ -208,9 +208,10 @@ static void rcar_du_crtc_update_planes(struct rcar_du_crtc *rcrtc)
+ {
+ struct rcar_du_plane *planes[RCAR_DU_NUM_HW_PLANES];
+ unsigned int num_planes = 0;
++ unsigned int dptsr_planes;
++ unsigned int hwplanes = 0;
+ unsigned int prio = 0;
+ unsigned int i;
+- u32 dptsr = 0;
+ u32 dspr = 0;
+
+ for (i = 0; i < ARRAY_SIZE(rcrtc->group->planes); ++i) {
+@@ -238,37 +239,44 @@ static void rcar_du_crtc_update_planes(struct rcar_du_crtc *rcrtc)
+
+ prio -= 4;
+ dspr |= (index + 1) << prio;
+- dptsr |= DPTSR_PnDK(index) | DPTSR_PnTS(index);
++ hwplanes |= 1 << index;
+
+ if (plane_format(plane)->planes == 2) {
+ index = (index + 1) % 8;
+
+ prio -= 4;
+ dspr |= (index + 1) << prio;
+- dptsr |= DPTSR_PnDK(index) | DPTSR_PnTS(index);
++ hwplanes |= 1 << index;
+ }
+ }
+
+- /* Select display timing and dot clock generator 2 for planes associated
+- * with superposition controller 2.
++ /* Update the planes to display timing and dot clock generator
++ * associations.
++ *
++ * Updating the DPTSR register requires restarting the CRTC group,
++ * resulting in visible flicker. To mitigate the issue only update the
++ * association if needed by enabled planes. Planes being disabled will
++ * keep their current association.
++ *
++ * To mitigate the issue further we could pre-associate planes with
++ * CRTCs, either with a fixed 4/4 split, or through a module parameter.
+ */
+- if (rcrtc->index % 2) {
+- /* The DPTSR register is updated when the display controller is
+- * stopped. We thus need to restart the DU. Once again, sorry
+- * for the flicker. One way to mitigate the issue would be to
+- * pre-associate planes with CRTCs (either with a fixed 4/4
+- * split, or through a module parameter). Flicker would then
+- * occur only if we need to break the pre-association.
+- */
+- mutex_lock(&rcrtc->group->lock);
+- if (rcar_du_group_read(rcrtc->group, DPTSR) != dptsr) {
+- rcar_du_group_write(rcrtc->group, DPTSR, dptsr);
+- if (rcrtc->group->used_crtcs)
+- rcar_du_group_restart(rcrtc->group);
+- }
+- mutex_unlock(&rcrtc->group->lock);
++ mutex_lock(&rcrtc->group->lock);
++
++ dptsr_planes = rcrtc->index % 2 ? rcrtc->group->dptsr_planes | hwplanes
++ : rcrtc->group->dptsr_planes & ~hwplanes;
++
++ if (dptsr_planes != rcrtc->group->dptsr_planes) {
++ rcar_du_group_write(rcrtc->group, DPTSR,
++ (dptsr_planes << 16) | dptsr_planes);
++ rcrtc->group->dptsr_planes = dptsr_planes;
++
++ if (rcrtc->group->used_crtcs)
++ rcar_du_group_restart(rcrtc->group);
+ }
+
++ mutex_unlock(&rcrtc->group->lock);
++
+ rcar_du_group_write(rcrtc->group, rcrtc->index % 2 ? DS2PR : DS1PR,
+ dspr);
+ }
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_group.c b/drivers/gpu/drm/rcar-du/rcar_du_group.c
+index 1bdc0ee0c248..7fd39a7d91c8 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_group.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_group.c
+@@ -85,6 +85,12 @@ static void rcar_du_group_setup(struct rcar_du_group *rgrp)
+ * superposition 0 to DU0 pins. DU1 pins will be configured dynamically.
+ */
+ rcar_du_group_write(rgrp, DORCR, DORCR_PG1D_DS1 | DORCR_DPRS);
++
++ /* Apply planes to CRTCs association. */
++ mutex_lock(&rgrp->lock);
++ rcar_du_group_write(rgrp, DPTSR, (rgrp->dptsr_planes << 16) |
++ rgrp->dptsr_planes);
++ mutex_unlock(&rgrp->lock);
+ }
+
+ /*
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_group.h b/drivers/gpu/drm/rcar-du/rcar_du_group.h
+index ea02bb02f3e1..4f6c37c8d336 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_group.h
++++ b/drivers/gpu/drm/rcar-du/rcar_du_group.h
+@@ -27,7 +27,8 @@ struct rcar_du_device;
+ * @index: group index
+ * @use_count: number of users of the group (rcar_du_group_(get|put))
+ * @used_crtcs: number of CRTCs currently in use
+- * @lock: protects the DPTSR register
++ * @lock: protects the dptsr_planes field and the DPTSR register
++ * @dptsr_planes: bitmask of planes driven by dot-clock and timing generator 1
+ * @planes: planes handled by the group
+ */
+ struct rcar_du_group {
+@@ -39,6 +40,7 @@ struct rcar_du_group {
+ unsigned int used_crtcs;
+
+ struct mutex lock;
++ unsigned int dptsr_planes;
+
+ struct rcar_du_plane planes[RCAR_DU_NUM_KMS_PLANES];
+ };
+--
+2.6.2
+
diff --git a/patches.renesas/0078-drm-rcar-du-Consider-plane-to-CRTC-associations-in-t.patch b/patches.renesas/0078-drm-rcar-du-Consider-plane-to-CRTC-associations-in-t.patch
new file mode 100644
index 00000000000000..4501a49c765bb2
--- /dev/null
+++ b/patches.renesas/0078-drm-rcar-du-Consider-plane-to-CRTC-associations-in-t.patch
@@ -0,0 +1,72 @@
+From 8b00002acbadfefefbdd34ee947f6139168c5865 Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+Date: Wed, 29 Apr 2015 00:51:01 +0300
+Subject: [PATCH 078/129] drm: rcar-du: Consider plane to CRTC associations in
+ the plane allocator
+
+Hardware planes are driven by the timing generator of the CRTC they are
+associated to. Changing the association requires restarting the CRTC
+group that the plane belongs to, resulting in flicker on the other CRTC.
+
+To avoid flicker as much as possible, try to allocate planes first from
+the free planes already associated with the target CRTC. If allocation
+fails then fall back to allocation from all free planes.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+(cherry picked from commit c8af99b60421c184cab1c3a849debce1463ec792)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/gpu/drm/rcar-du/rcar_du_kms.c | 22 +++++++++++++++++++++-
+ 1 file changed, 21 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+index ade135008e98..2c6cf691d163 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+@@ -383,6 +383,8 @@ static int rcar_du_atomic_check(struct drm_device *dev,
+ for (i = 0; i < dev->mode_config.num_total_plane; ++i) {
+ struct rcar_du_plane_state *plane_state;
+ struct rcar_du_plane *plane;
++ unsigned int crtc_planes;
++ unsigned int free;
+ int idx;
+
+ if (!state->planes[i])
+@@ -401,8 +403,21 @@ static int rcar_du_atomic_check(struct drm_device *dev,
+ !rcar_du_plane_needs_realloc(plane, plane_state))
+ continue;
+
++ /* Try to allocate the plane from the free planes currently
++ * associated with the target CRTC to avoid restarting the CRTC
++ * group and thus minimize flicker. If it fails fall back to
++ * allocating from all free planes.
++ */
++ crtc_planes = to_rcar_crtc(plane_state->state.crtc)->index % 2
++ ? plane->group->dptsr_planes
++ : ~plane->group->dptsr_planes;
++ free = group_free_planes[plane->group->index];
++
+ idx = rcar_du_plane_hwalloc(plane_state->format->planes,
+- group_free_planes[plane->group->index]);
++ free & crtc_planes);
++ if (idx < 0)
++ idx = rcar_du_plane_hwalloc(plane_state->format->planes,
++ free);
+ if (idx < 0) {
+ dev_dbg(rcdu->dev, "%s: no available hardware plane\n",
+ __func__);
+@@ -749,6 +764,11 @@ int rcar_du_modeset_init(struct rcar_du_device *rcdu)
+ rgrp->mmio_offset = mmio_offsets[i];
+ rgrp->index = i;
+
++ /* Pre-associate all hardware planes with the first CRTC in the
++ * group.
++ */
++ rgrp->dptsr_planes = 0;
++
+ ret = rcar_du_planes_init(rgrp);
+ if (ret < 0)
+ return ret;
+--
+2.6.2
+
diff --git a/patches.renesas/0079-drm-rcar-du-Store-the-number-of-CRTCs-per-group-in-t.patch b/patches.renesas/0079-drm-rcar-du-Store-the-number-of-CRTCs-per-group-in-t.patch
new file mode 100644
index 00000000000000..e50032e635995c
--- /dev/null
+++ b/patches.renesas/0079-drm-rcar-du-Store-the-number-of-CRTCs-per-group-in-t.patch
@@ -0,0 +1,83 @@
+From 689e9b987f979ec215f653189b013c26958b8d8f Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+Date: Tue, 28 Apr 2015 17:36:33 +0300
+Subject: [PATCH 079/129] drm: rcar-du: Store the number of CRTCs per group in
+ the group structure
+
+The number of CRTCs in a group is only used to implement plane
+initialization for now, but is also needed to implement pre-association
+of planes to CRTCs. Store it in the group structure instead of computing
+it on demand.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+(cherry picked from commit fe6fbe9a024e149e4230a338700d24db8806183a)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/gpu/drm/rcar-du/rcar_du_group.h | 2 ++
+ drivers/gpu/drm/rcar-du/rcar_du_kms.c | 1 +
+ drivers/gpu/drm/rcar-du/rcar_du_plane.c | 6 ++----
+ 3 files changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_group.h b/drivers/gpu/drm/rcar-du/rcar_du_group.h
+index 4f6c37c8d336..7b414b31c3be 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_group.h
++++ b/drivers/gpu/drm/rcar-du/rcar_du_group.h
+@@ -25,6 +25,7 @@ struct rcar_du_device;
+ * @dev: the DU device
+ * @mmio_offset: registers offset in the device memory map
+ * @index: group index
++ * @num_crtcs: number of CRTCs in this group (1 or 2)
+ * @use_count: number of users of the group (rcar_du_group_(get|put))
+ * @used_crtcs: number of CRTCs currently in use
+ * @lock: protects the dptsr_planes field and the DPTSR register
+@@ -36,6 +37,7 @@ struct rcar_du_group {
+ unsigned int mmio_offset;
+ unsigned int index;
+
++ unsigned int num_crtcs;
+ unsigned int use_count;
+ unsigned int used_crtcs;
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+index 2c6cf691d163..fec5f4d794da 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+@@ -763,6 +763,7 @@ int rcar_du_modeset_init(struct rcar_du_device *rcdu)
+ rgrp->dev = rcdu;
+ rgrp->mmio_offset = mmio_offsets[i];
+ rgrp->index = i;
++ rgrp->num_crtcs = min(rcdu->num_crtcs - 2 * i, 2U);
+
+ /* Pre-associate all hardware planes with the first CRTC in the
+ * group.
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
+index d3ed528fa56d..3e30d84b798f 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
+@@ -391,7 +391,6 @@ int rcar_du_planes_init(struct rcar_du_group *rgrp)
+ {
+ struct rcar_du_device *rcdu = rgrp->dev;
+ unsigned int num_planes;
+- unsigned int num_crtcs;
+ unsigned int crtcs;
+ unsigned int i;
+ int ret;
+@@ -399,13 +398,12 @@ int rcar_du_planes_init(struct rcar_du_group *rgrp)
+ /* Create one primary plane per CRTC in this group and seven overlay
+ * planes.
+ */
+- num_crtcs = min(rcdu->num_crtcs - 2 * rgrp->index, 2U);
+- num_planes = num_crtcs + 7;
++ num_planes = rgrp->num_crtcs + 7;
+
+ crtcs = ((1 << rcdu->num_crtcs) - 1) & (3 << (2 * rgrp->index));
+
+ for (i = 0; i < num_planes; ++i) {
+- enum drm_plane_type type = i < num_crtcs
++ enum drm_plane_type type = i < rgrp->num_crtcs
+ ? DRM_PLANE_TYPE_PRIMARY
+ : DRM_PLANE_TYPE_OVERLAY;
+ struct rcar_du_plane *plane = &rgrp->planes[i];
+--
+2.6.2
+
diff --git a/patches.renesas/0080-drm-rcar-du-Split-planes-pre-association-4-4-between.patch b/patches.renesas/0080-drm-rcar-du-Split-planes-pre-association-4-4-between.patch
new file mode 100644
index 00000000000000..2c6cc1403c8534
--- /dev/null
+++ b/patches.renesas/0080-drm-rcar-du-Split-planes-pre-association-4-4-between.patch
@@ -0,0 +1,55 @@
+From 5912b3065d2d83038e616827e9ccafaa8ef6aa11 Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+Date: Tue, 28 Apr 2015 22:00:28 +0300
+Subject: [PATCH 080/129] drm: rcar-du: Split planes pre-association 4/4
+ between CRTCs
+
+If we have more than one CRTCs in a group pre-associate planes 0-3 with
+CRTC 0 and planes 4-7 with CRTC 1 to minimize flicker occurring when the
+association is changed. The pre-association could be controlled by a
+module parameter if needed.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+(cherry picked from commit 2610abfb3a72f6e5444a710b695c9460138f9326)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 3 ---
+ drivers/gpu/drm/rcar-du/rcar_du_kms.c | 7 ++++---
+ 2 files changed, 4 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
+index 620a2c51185c..e6a32c4e4040 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
+@@ -257,9 +257,6 @@ static void rcar_du_crtc_update_planes(struct rcar_du_crtc *rcrtc)
+ * resulting in visible flicker. To mitigate the issue only update the
+ * association if needed by enabled planes. Planes being disabled will
+ * keep their current association.
+- *
+- * To mitigate the issue further we could pre-associate planes with
+- * CRTCs, either with a fixed 4/4 split, or through a module parameter.
+ */
+ mutex_lock(&rcrtc->group->lock);
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+index fec5f4d794da..20859aae882e 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+@@ -765,10 +765,11 @@ int rcar_du_modeset_init(struct rcar_du_device *rcdu)
+ rgrp->index = i;
+ rgrp->num_crtcs = min(rcdu->num_crtcs - 2 * i, 2U);
+
+- /* Pre-associate all hardware planes with the first CRTC in the
+- * group.
++ /* If we have more than one CRTCs in this group pre-associate
++ * planes 0-3 with CRTC 0 and planes 4-7 with CRTC 1 to minimize
++ * flicker occurring when the association is changed.
+ */
+- rgrp->dptsr_planes = 0;
++ rgrp->dptsr_planes = rgrp->num_crtcs > 1 ? 0xf0 : 0;
+
+ ret = rcar_du_planes_init(rgrp);
+ if (ret < 0)
+--
+2.6.2
+
diff --git a/patches.renesas/0081-drm-rcar-du-Print-the-error-value-when-DRM-KMS-init-.patch b/patches.renesas/0081-drm-rcar-du-Print-the-error-value-when-DRM-KMS-init-.patch
new file mode 100644
index 00000000000000..7eebecd3228d2d
--- /dev/null
+++ b/patches.renesas/0081-drm-rcar-du-Print-the-error-value-when-DRM-KMS-init-.patch
@@ -0,0 +1,31 @@
+From 064eec7dca6ec505062cf6d47806fd83d50e65f2 Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+Date: Thu, 14 May 2015 01:08:34 +0300
+Subject: [PATCH 081/129] drm: rcar-du: Print the error value when DRM/KMS init
+ fails
+
+This helps debugging probe failures.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+(cherry picked from commit 6e0c6e1895b9fff3cdb6ef746ee3d8dd4e852f40)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/gpu/drm/rcar-du/rcar_du_drv.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_drv.c b/drivers/gpu/drm/rcar-du/rcar_du_drv.c
+index da1216a73969..780ca11512ba 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_drv.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_drv.c
+@@ -190,7 +190,7 @@ static int rcar_du_load(struct drm_device *dev, unsigned long flags)
+ /* DRM/KMS objects */
+ ret = rcar_du_modeset_init(rcdu);
+ if (ret < 0) {
+- dev_err(&pdev->dev, "failed to initialize DRM/KMS\n");
++ dev_err(&pdev->dev, "failed to initialize DRM/KMS (%d)\n", ret);
+ goto done;
+ }
+
+--
+2.6.2
+
diff --git a/patches.renesas/0082-drm-rcar-du-Disable-all-planes-when-stopping-the-CRT.patch b/patches.renesas/0082-drm-rcar-du-Disable-all-planes-when-stopping-the-CRT.patch
new file mode 100644
index 00000000000000..1f2cc2afe44795
--- /dev/null
+++ b/patches.renesas/0082-drm-rcar-du-Disable-all-planes-when-stopping-the-CRT.patch
@@ -0,0 +1,51 @@
+From cd7950e2150adfc5b861a4c56242a824ce45767c Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+Date: Thu, 14 May 2015 15:01:47 +0300
+Subject: [PATCH 082/129] drm: rcar-du: Disable all planes when stopping the
+ CRTC
+
+The DSnPR plane configuration registers are updated on vblank, and no
+vblank will occur once the CRTC is stopped. We thus can't only disable
+planes right before starting the CRTC as it would start scanning out
+immediately from old frame buffers until the next vblank.
+
+Fix the problem by disabling all planes when stopping the CRTC and wait
+for the change to take effect. This increases the CRTC stop delay,
+especially when multiple CRTCs are stopped in one operation as we now
+wait for one vblank per CRTC. Whether this can be improved needs to be
+researched.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+(cherry picked from commit 911316fe2f4113a096b9975f2467fc501864aef0)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
+index e6a32c4e4040..a40085806f5b 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
+@@ -398,6 +398,19 @@ static void rcar_du_crtc_stop(struct rcar_du_crtc *rcrtc)
+ if (!rcrtc->started)
+ return;
+
++ /* Disable all planes and wait for the change to take effect. This is
++ * required as the DSnPR registers are updated on vblank, and no vblank
++ * will occur once the CRTC is stopped. Disabling planes when starting
++ * the CRTC thus wouldn't be enough as it would start scanning out
++ * immediately from old frame buffers until the next vblank.
++ *
++ * This increases the CRTC stop delay, especially when multiple CRTCs
++ * are stopped in one operation as we now wait for one vblank per CRTC.
++ * Whether this can be improved needs to be researched.
++ */
++ rcar_du_group_write(rcrtc->group, rcrtc->index % 2 ? DS2PR : DS1PR, 0);
++ drm_crtc_wait_one_vblank(crtc);
++
+ /* Disable vertical blanking interrupt reporting. We first need to wait
+ * for page flip completion before stopping the CRTC as userspace
+ * expects page flips to eventually complete.
+--
+2.6.2
+
diff --git a/patches.renesas/0083-drm-rcar-du-Fix-crash-with-groups-that-have-less-tha.patch b/patches.renesas/0083-drm-rcar-du-Fix-crash-with-groups-that-have-less-tha.patch
new file mode 100644
index 00000000000000..362c9b543ecec2
--- /dev/null
+++ b/patches.renesas/0083-drm-rcar-du-Fix-crash-with-groups-that-have-less-tha.patch
@@ -0,0 +1,108 @@
+From c61ebc248be76006c8712894ce767fe679339dfd Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+Date: Mon, 25 May 2015 16:32:45 +0300
+Subject: [PATCH 083/129] drm: rcar-du: Fix crash with groups that have less
+ than 9 planes
+
+Commit 917de180379d ("drm: rcar-du: Implement universal plane support")
+made the number of planes per group dynamic, but didn't update all loops
+over the planes array, resulting in out-of-bound accesses on DU
+instances that have an odd number of CRTCs (such as the R8A7790). Fix
+it.
+
+Fixes: 917de180379d ("drm: rcar-du: Implement universal plane support")
+Cc: stable@vger.kernel.org
+Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+(cherry picked from commit d6aed57481c5b746f91792c8a977f537c09e52c5)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 4 ++--
+ drivers/gpu/drm/rcar-du/rcar_du_group.h | 2 ++
+ drivers/gpu/drm/rcar-du/rcar_du_kms.c | 2 +-
+ drivers/gpu/drm/rcar-du/rcar_du_plane.c | 5 ++---
+ 4 files changed, 7 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
+index a40085806f5b..65d6ba6621ac 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
+@@ -214,7 +214,7 @@ static void rcar_du_crtc_update_planes(struct rcar_du_crtc *rcrtc)
+ unsigned int i;
+ u32 dspr = 0;
+
+- for (i = 0; i < ARRAY_SIZE(rcrtc->group->planes); ++i) {
++ for (i = 0; i < rcrtc->group->num_planes; ++i) {
+ struct rcar_du_plane *plane = &rcrtc->group->planes[i];
+ unsigned int j;
+
+@@ -445,7 +445,7 @@ void rcar_du_crtc_resume(struct rcar_du_crtc *rcrtc)
+ rcar_du_crtc_start(rcrtc);
+
+ /* Commit the planes state. */
+- for (i = 0; i < ARRAY_SIZE(rcrtc->group->planes); ++i) {
++ for (i = 0; i < rcrtc->group->num_planes; ++i) {
+ struct rcar_du_plane *plane = &rcrtc->group->planes[i];
+
+ if (plane->plane.state->crtc != &rcrtc->crtc)
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_group.h b/drivers/gpu/drm/rcar-du/rcar_du_group.h
+index 7b414b31c3be..d7318e1a6b00 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_group.h
++++ b/drivers/gpu/drm/rcar-du/rcar_du_group.h
+@@ -30,6 +30,7 @@ struct rcar_du_device;
+ * @used_crtcs: number of CRTCs currently in use
+ * @lock: protects the dptsr_planes field and the DPTSR register
+ * @dptsr_planes: bitmask of planes driven by dot-clock and timing generator 1
++ * @num_planes: number of planes in the group
+ * @planes: planes handled by the group
+ */
+ struct rcar_du_group {
+@@ -44,6 +45,7 @@ struct rcar_du_group {
+ struct mutex lock;
+ unsigned int dptsr_planes;
+
++ unsigned int num_planes;
+ struct rcar_du_plane planes[RCAR_DU_NUM_KMS_PLANES];
+ };
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+index 20859aae882e..4bb5af4bc474 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+@@ -336,7 +336,7 @@ static int rcar_du_atomic_check(struct drm_device *dev,
+ dev_dbg(rcdu->dev, "%s: finding free planes for group %u\n",
+ __func__, index);
+
+- for (i = 0; i < RCAR_DU_NUM_KMS_PLANES; ++i) {
++ for (i = 0; i < group->num_planes; ++i) {
+ struct rcar_du_plane *plane = &group->planes[i];
+ struct rcar_du_plane_state *plane_state;
+ struct drm_plane_state *s;
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
+index 3e30d84b798f..d90dc428e3fd 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
+@@ -390,7 +390,6 @@ static const uint32_t formats[] = {
+ int rcar_du_planes_init(struct rcar_du_group *rgrp)
+ {
+ struct rcar_du_device *rcdu = rgrp->dev;
+- unsigned int num_planes;
+ unsigned int crtcs;
+ unsigned int i;
+ int ret;
+@@ -398,11 +397,11 @@ int rcar_du_planes_init(struct rcar_du_group *rgrp)
+ /* Create one primary plane per CRTC in this group and seven overlay
+ * planes.
+ */
+- num_planes = rgrp->num_crtcs + 7;
++ rgrp->num_planes = rgrp->num_crtcs + 7;
+
+ crtcs = ((1 << rcdu->num_crtcs) - 1) & (3 << (2 * rgrp->index));
+
+- for (i = 0; i < num_planes; ++i) {
++ for (i = 0; i < rgrp->num_planes; ++i) {
+ enum drm_plane_type type = i < rgrp->num_crtcs
+ ? DRM_PLANE_TYPE_PRIMARY
+ : DRM_PLANE_TYPE_OVERLAY;
+--
+2.6.2
+
diff --git a/patches.renesas/0084-drm-rcar-du-Clarify-error-message-when-encoder-initi.patch b/patches.renesas/0084-drm-rcar-du-Clarify-error-message-when-encoder-initi.patch
new file mode 100644
index 00000000000000..d7b8d0d0b383de
--- /dev/null
+++ b/patches.renesas/0084-drm-rcar-du-Clarify-error-message-when-encoder-initi.patch
@@ -0,0 +1,48 @@
+From 71e6e1617b0fd2d934a92579fbee89881fbf38c6 Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+Date: Tue, 26 May 2015 14:59:42 +0300
+Subject: [PATCH 084/129] drm: rcar-du: Clarify error message when encoder
+ initialization fails
+
+A failure to initialize an encoder currently prints an error message in
+the kernel log without mentioning which encoder failed to initialize. To
+help debugging initialization issues print the encoder DT node name.
+
+This requires moving the error message to the rcar_du_encoders_init_one
+function and refactoring it slightly.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+(cherry picked from commit 64549cdf85a113270729aa123aa475cec7249a0f)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/gpu/drm/rcar-du/rcar_du_kms.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+index 4bb5af4bc474..ab29c179d854 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+@@ -639,6 +639,11 @@ static int rcar_du_encoders_init_one(struct rcar_du_device *rcdu,
+ of_node_put(encoder);
+ of_node_put(connector);
+
++ if (ret && ret != -EPROBE_DEFER)
++ dev_warn(rcdu->dev,
++ "failed to initialize encoder %s (%d), skipping\n",
++ encoder->full_name, ret);
++
+ return ret < 0 ? ret : 1;
+ }
+
+@@ -688,8 +693,6 @@ static int rcar_du_encoders_init(struct rcar_du_device *rcdu)
+ return ret;
+ }
+
+- dev_info(rcdu->dev,
+- "encoder initialization failed, skipping\n");
+ continue;
+ }
+
+--
+2.6.2
+
diff --git a/patches.renesas/0085-drm-rcar-du-Convert-rcar_du_encoders_init_one-return.patch b/patches.renesas/0085-drm-rcar-du-Convert-rcar_du_encoders_init_one-return.patch
new file mode 100644
index 00000000000000..41ba3812fb48fb
--- /dev/null
+++ b/patches.renesas/0085-drm-rcar-du-Convert-rcar_du_encoders_init_one-return.patch
@@ -0,0 +1,70 @@
+From afafe34d25acdfd625ab9d22d597258f89786434 Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+Date: Tue, 26 May 2015 15:07:56 +0300
+Subject: [PATCH 085/129] drm: rcar-du: Convert rcar_du_encoders_init_one()
+ return value to 0/<0
+
+The function returns 1 on success, and either 0 or a negative error code
+on failure. As the 0 and negative values don't need to be differentiated
+by the caller, convert it to the usual scheme of returning 0 on success
+and a negative error code on failure.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+(cherry picked from commit 898a2f387d1c663772c630e8f78ef60f1639077e)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/gpu/drm/rcar-du/rcar_du_kms.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+index ab29c179d854..fa185a450aea 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+@@ -573,7 +573,7 @@ static int rcar_du_encoders_init_one(struct rcar_du_device *rcdu,
+ if (!entity) {
+ dev_dbg(rcdu->dev, "unconnected endpoint %s, skipping\n",
+ ep->local_node->full_name);
+- return 0;
++ return -ENODEV;
+ }
+
+ entity_ep_node = of_parse_phandle(ep->local_node, "remote-endpoint", 0);
+@@ -596,7 +596,7 @@ static int rcar_du_encoders_init_one(struct rcar_du_device *rcdu,
+ encoder->full_name);
+ of_node_put(entity_ep_node);
+ of_node_put(encoder);
+- return 0;
++ return -ENODEV;
+ }
+
+ break;
+@@ -625,7 +625,7 @@ static int rcar_du_encoders_init_one(struct rcar_du_device *rcdu,
+ encoder->full_name);
+ of_node_put(encoder);
+ of_node_put(connector);
+- return 0;
++ return -EINVAL;
+ }
+ } else {
+ /*
+@@ -644,7 +644,7 @@ static int rcar_du_encoders_init_one(struct rcar_du_device *rcdu,
+ "failed to initialize encoder %s (%d), skipping\n",
+ encoder->full_name, ret);
+
+- return ret < 0 ? ret : 1;
++ return ret;
+ }
+
+ static int rcar_du_encoders_init(struct rcar_du_device *rcdu)
+@@ -696,7 +696,7 @@ static int rcar_du_encoders_init(struct rcar_du_device *rcdu)
+ continue;
+ }
+
+- num_encoders += ret;
++ num_encoders++;
+ }
+
+ return num_encoders;
+--
+2.6.2
+
diff --git a/patches.renesas/0086-drm-rcar-du-Clean-up-planes-in-the-error-paths-of-.a.patch b/patches.renesas/0086-drm-rcar-du-Clean-up-planes-in-the-error-paths-of-.a.patch
new file mode 100644
index 00000000000000..a079b17313e217
--- /dev/null
+++ b/patches.renesas/0086-drm-rcar-du-Clean-up-planes-in-the-error-paths-of-.a.patch
@@ -0,0 +1,57 @@
+From f5a3bc87acb2c4178e7ee3a9511f525cb274e388 Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Date: Wed, 27 May 2015 02:14:37 +0300
+Subject: [PATCH 086/129] drm: rcar-du: Clean up planes in the error paths of
+ .atomic_commit()
+
+When the .atomic_commit() handler fails, clean up planes previoulsy
+prepared by drm_atomic_helper_prepare_planes() with a call to
+drm_atomic_helper_cleanup_planes().
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+(cherry picked from commit 39a3d5706527615db2b7d121b64445e79ca1cc1f)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/gpu/drm/rcar-du/rcar_du_kms.c | 12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+index fa185a450aea..56518eb1269a 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+@@ -495,8 +495,10 @@ static int rcar_du_atomic_commit(struct drm_device *dev,
+
+ /* Allocate the commit object. */
+ commit = kzalloc(sizeof(*commit), GFP_KERNEL);
+- if (commit == NULL)
+- return -ENOMEM;
++ if (commit == NULL) {
++ ret = -ENOMEM;
++ goto error;
++ }
+
+ INIT_WORK(&commit->work, rcar_du_atomic_work);
+ commit->dev = dev;
+@@ -519,7 +521,7 @@ static int rcar_du_atomic_commit(struct drm_device *dev,
+
+ if (ret) {
+ kfree(commit);
+- return ret;
++ goto error;
+ }
+
+ /* Swap the state, this is the point of no return. */
+@@ -531,6 +533,10 @@ static int rcar_du_atomic_commit(struct drm_device *dev,
+ rcar_du_atomic_complete(commit);
+
+ return 0;
++
++error:
++ drm_atomic_helper_cleanup_planes(dev, state);
++ return ret;
+ }
+
+ /* -----------------------------------------------------------------------------
+--
+2.6.2
+
diff --git a/patches.renesas/0087-drm-rcar-du-Use-the-drm-atomic-state-duplication-hel.patch b/patches.renesas/0087-drm-rcar-du-Use-the-drm-atomic-state-duplication-hel.patch
new file mode 100644
index 00000000000000..b2f3133123c5df
--- /dev/null
+++ b/patches.renesas/0087-drm-rcar-du-Use-the-drm-atomic-state-duplication-hel.patch
@@ -0,0 +1,55 @@
+From 1508e9935d880b7bd1304db10453f871821fd80a Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Date: Wed, 27 May 2015 16:36:29 +0300
+Subject: [PATCH 087/129] drm: rcar-du: Use the drm atomic state duplication
+ helpers for planes
+
+Ensure that the duplicate and destroy plane state operations will always
+be in sync with the DRM core implementation of the plane state by using
+the __drm_atomic_helper_plane_duplicate_state() and
+__drm_atomic_helper_plane_destroy_state() functions designed especially
+for this purpose.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+(cherry picked from commit 263b39fe33d69da74ae61e594c94eddf75203f7d)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/gpu/drm/rcar-du/rcar_du_plane.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
+index d90dc428e3fd..c66986414bb4 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
+@@ -302,13 +302,15 @@ rcar_du_plane_atomic_duplicate_state(struct drm_plane *plane)
+ struct rcar_du_plane_state *state;
+ struct rcar_du_plane_state *copy;
+
++ if (WARN_ON(!plane->state))
++ return NULL;
++
+ state = to_rcar_plane_state(plane->state);
+ copy = kmemdup(state, sizeof(*state), GFP_KERNEL);
+ if (copy == NULL)
+ return NULL;
+
+- if (copy->state.fb)
+- drm_framebuffer_reference(copy->state.fb);
++ __drm_atomic_helper_plane_duplicate_state(plane, &copy->state);
+
+ return &copy->state;
+ }
+@@ -316,9 +318,7 @@ rcar_du_plane_atomic_duplicate_state(struct drm_plane *plane)
+ static void rcar_du_plane_atomic_destroy_state(struct drm_plane *plane,
+ struct drm_plane_state *state)
+ {
+- if (state->fb)
+- drm_framebuffer_unreference(state->fb);
+-
++ __drm_atomic_helper_plane_destroy_state(plane, state);
+ kfree(to_rcar_plane_state(state));
+ }
+
+--
+2.6.2
+
diff --git a/patches.renesas/0088-i2c-add-FUNC-flag-for-slave-capabilities.patch b/patches.renesas/0088-i2c-add-FUNC-flag-for-slave-capabilities.patch
new file mode 100644
index 00000000000000..291df9a9dc39aa
--- /dev/null
+++ b/patches.renesas/0088-i2c-add-FUNC-flag-for-slave-capabilities.patch
@@ -0,0 +1,31 @@
+From 96f636817fdfeedcf74a978e276dca5150636cbf Mon Sep 17 00:00:00 2001
+From: Wolfram Sang <wsa+renesas@sang-engineering.com>
+Date: Thu, 14 May 2015 14:40:02 +0200
+Subject: [PATCH 088/129] i2c: add FUNC flag for slave capabilities
+
+So users can check in advance if there is slave support.
+
+Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
+Acked-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
+(cherry picked from commit 83caf9896a48de5f838227162c25de405c61ea9d)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ include/uapi/linux/i2c.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/include/uapi/linux/i2c.h b/include/uapi/linux/i2c.h
+index 0e949cbfd333..b0a7dd61eb35 100644
+--- a/include/uapi/linux/i2c.h
++++ b/include/uapi/linux/i2c.h
+@@ -87,6 +87,7 @@ struct i2c_msg {
+ #define I2C_FUNC_PROTOCOL_MANGLING 0x00000004 /* I2C_M_IGNORE_NAK etc. */
+ #define I2C_FUNC_SMBUS_PEC 0x00000008
+ #define I2C_FUNC_NOSTART 0x00000010 /* I2C_M_NOSTART */
++#define I2C_FUNC_SLAVE 0x00000020
+ #define I2C_FUNC_SMBUS_BLOCK_PROC_CALL 0x00008000 /* SMBus 2.0 */
+ #define I2C_FUNC_SMBUS_QUICK 0x00010000
+ #define I2C_FUNC_SMBUS_READ_BYTE 0x00020000
+--
+2.6.2
+
diff --git a/patches.renesas/0089-i2c-constify-platform_device_id.patch b/patches.renesas/0089-i2c-constify-platform_device_id.patch
new file mode 100644
index 00000000000000..ac3bfb310042e7
--- /dev/null
+++ b/patches.renesas/0089-i2c-constify-platform_device_id.patch
@@ -0,0 +1,63 @@
+From c6fa94db3edf9e716a0898399b98ac9592bd0be2 Mon Sep 17 00:00:00 2001
+From: Krzysztof Kozlowski <k.kozlowski.k@gmail.com>
+Date: Sat, 2 May 2015 00:54:25 +0900
+Subject: [PATCH 089/129] i2c: constify platform_device_id
+
+The platform_device_id is not modified by these drivers and core uses it
+as const.
+
+Signed-off-by: Krzysztof Kozlowski <k.kozlowski.k@gmail.com>
+Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
+(cherry picked from commit e9a02a3d89b9d16eafc540d1dc78476a3bb5d4eb)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/i2c/busses/i2c-imx.c | 2 +-
+ drivers/i2c/busses/i2c-mxs.c | 2 +-
+ drivers/i2c/busses/i2c-rcar.c | 2 +-
+ drivers/i2c/busses/i2c-s3c2410.c | 2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+--- a/drivers/i2c/busses/i2c-imx.c
++++ b/drivers/i2c/busses/i2c-imx.c
+@@ -241,7 +241,7 @@ static struct imx_i2c_hwdata vf610_i2c_h
+
+ };
+
+-static struct platform_device_id imx_i2c_devtype[] = {
++static const struct platform_device_id imx_i2c_devtype[] = {
+ {
+ .name = "imx1-i2c",
+ .driver_data = (kernel_ulong_t)&imx1_i2c_hwdata,
+--- a/drivers/i2c/busses/i2c-mxs.c
++++ b/drivers/i2c/busses/i2c-mxs.c
+@@ -784,7 +784,7 @@ static int mxs_i2c_get_ofdata(struct mxs
+ return 0;
+ }
+
+-static struct platform_device_id mxs_i2c_devtype[] = {
++static const struct platform_device_id mxs_i2c_devtype[] = {
+ {
+ .name = "imx23-i2c",
+ .driver_data = MXS_I2C_V1,
+--- a/drivers/i2c/busses/i2c-rcar.c
++++ b/drivers/i2c/busses/i2c-rcar.c
+@@ -714,7 +714,7 @@ static int rcar_i2c_remove(struct platfo
+ return 0;
+ }
+
+-static struct platform_device_id rcar_i2c_id_table[] = {
++static const struct platform_device_id rcar_i2c_id_table[] = {
+ { "i2c-rcar", I2C_RCAR_GEN1 },
+ { "i2c-rcar_gen1", I2C_RCAR_GEN1 },
+ { "i2c-rcar_gen2", I2C_RCAR_GEN2 },
+--- a/drivers/i2c/busses/i2c-s3c2410.c
++++ b/drivers/i2c/busses/i2c-s3c2410.c
+@@ -132,7 +132,7 @@ struct s3c24xx_i2c {
+ unsigned int sys_i2c_cfg;
+ };
+
+-static struct platform_device_id s3c24xx_driver_ids[] = {
++static const struct platform_device_id s3c24xx_driver_ids[] = {
+ {
+ .name = "s3c2410-i2c",
+ .driver_data = 0,
diff --git a/patches.renesas/0090-i2c-rcar-report-slave-capabilities-to-users.patch b/patches.renesas/0090-i2c-rcar-report-slave-capabilities-to-users.patch
new file mode 100644
index 00000000000000..cb51d8342abfaa
--- /dev/null
+++ b/patches.renesas/0090-i2c-rcar-report-slave-capabilities-to-users.patch
@@ -0,0 +1,31 @@
+From 0fd4992443271d994525fcc6a143b6d404a181b9 Mon Sep 17 00:00:00 2001
+From: Wolfram Sang <wsa+renesas@sang-engineering.com>
+Date: Thu, 14 May 2015 14:40:03 +0200
+Subject: [PATCH 090/129] i2c: rcar: report slave capabilities to users
+
+Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
+Acked-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
+(cherry picked from commit 1fb2ad9565be7149cf50d663f47f489a9fcda42d)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/i2c/busses/i2c-rcar.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c
+index 06f34d1c5121..9eef46254369 100644
+--- a/drivers/i2c/busses/i2c-rcar.c
++++ b/drivers/i2c/busses/i2c-rcar.c
+@@ -604,7 +604,8 @@ static int rcar_unreg_slave(struct i2c_client *slave)
+ static u32 rcar_i2c_func(struct i2c_adapter *adap)
+ {
+ /* This HW can't do SMBUS_QUICK and NOSTART */
+- return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK);
++ return I2C_FUNC_I2C | I2C_FUNC_SLAVE |
++ (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK);
+ }
+
+ static const struct i2c_algorithm rcar_i2c_algo = {
+--
+2.6.2
+
diff --git a/patches.renesas/0091-i2c-rcar-use-adapter-default-for-timeout.patch b/patches.renesas/0091-i2c-rcar-use-adapter-default-for-timeout.patch
new file mode 100644
index 00000000000000..296f06d6a730b8
--- /dev/null
+++ b/patches.renesas/0091-i2c-rcar-use-adapter-default-for-timeout.patch
@@ -0,0 +1,34 @@
+From 0ff40493ee2e448b8494759c73ab73b3eaac7118 Mon Sep 17 00:00:00 2001
+From: Wolfram Sang <wsa+renesas@sang-engineering.com>
+Date: Sat, 20 Jun 2015 21:03:19 +0200
+Subject: [PATCH 091/129] i2c: rcar: use adapter default for timeout
+
+5 seconds is a very large timeout, and it is hardcoded. Use the default
+timeout from 'struct adapter' which is 1 second. It can also be modified
+from userspace for specific workloads via i2c-dev.
+
+Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
+Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
+(cherry picked from commit efd2c6118e49152bea891706432ac3c9579836fe)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/i2c/busses/i2c-rcar.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c
+index 9eef46254369..e57e520b4756 100644
+--- a/drivers/i2c/busses/i2c-rcar.c
++++ b/drivers/i2c/busses/i2c-rcar.c
+@@ -532,7 +532,7 @@ static int rcar_i2c_master_xfer(struct i2c_adapter *adap,
+
+ timeout = wait_event_timeout(priv->wait,
+ rcar_i2c_flags_has(priv, ID_DONE),
+- 5 * HZ);
++ adap->timeout);
+ if (!timeout) {
+ ret = -ETIMEDOUT;
+ break;
+--
+2.6.2
+
diff --git a/patches.renesas/0092-i2c-rcar-use-proper-type-for-timeout.patch b/patches.renesas/0092-i2c-rcar-use-proper-type-for-timeout.patch
new file mode 100644
index 00000000000000..3125c1b46cbc2a
--- /dev/null
+++ b/patches.renesas/0092-i2c-rcar-use-proper-type-for-timeout.patch
@@ -0,0 +1,33 @@
+From 0bc42645d914210c386a55724bc59d3be4453ad1 Mon Sep 17 00:00:00 2001
+From: Wolfram Sang <wsa+renesas@sang-engineering.com>
+Date: Sat, 20 Jun 2015 21:03:20 +0200
+Subject: [PATCH 092/129] i2c: rcar: use proper type for timeout
+
+wait_event_timeout returns long, not int.
+
+Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
+Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
+(cherry picked from commit b6763d0da5c16ea8770252c36ba2afca76aaedbd)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/i2c/busses/i2c-rcar.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c
+index e57e520b4756..d8361dada584 100644
+--- a/drivers/i2c/busses/i2c-rcar.c
++++ b/drivers/i2c/busses/i2c-rcar.c
+@@ -490,7 +490,8 @@ static int rcar_i2c_master_xfer(struct i2c_adapter *adap,
+ struct rcar_i2c_priv *priv = i2c_get_adapdata(adap);
+ struct device *dev = rcar_i2c_priv_to_dev(priv);
+ unsigned long flags;
+- int i, ret, timeout;
++ int i, ret;
++ long timeout;
+
+ pm_runtime_get_sync(dev);
+
+--
+2.6.2
+
diff --git a/patches.renesas/0093-media-rcar-vin-use-monotonic-timestamps.patch b/patches.renesas/0093-media-rcar-vin-use-monotonic-timestamps.patch
new file mode 100644
index 00000000000000..3fd94c1909f92f
--- /dev/null
+++ b/patches.renesas/0093-media-rcar-vin-use-monotonic-timestamps.patch
@@ -0,0 +1,34 @@
+From 7660575f41c5298a23c5062fa45ed7cf8f85416f Mon Sep 17 00:00:00 2001
+From: Hans Verkuil <hverkuil@xs4all.nl>
+Date: Thu, 7 May 2015 03:26:21 -0300
+Subject: [PATCH 093/129] [media] rcar-vin: use monotonic timestamps
+
+Even though the rcar-vin driver tells userspace that it will give a monotonic
+timestamp, it is actually using gettimeofday. Replace this with a proper
+monotonic timestamp.
+
+Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
+Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
+(cherry picked from commit b9143e5ac5089561e857e223f7750b85a1951547)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/media/platform/soc_camera/rcar_vin.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/media/platform/soc_camera/rcar_vin.c b/drivers/media/platform/soc_camera/rcar_vin.c
+index 6460f8e1b07f..918390b5a08a 100644
+--- a/drivers/media/platform/soc_camera/rcar_vin.c
++++ b/drivers/media/platform/soc_camera/rcar_vin.c
+@@ -899,7 +899,7 @@ static irqreturn_t rcar_vin_irq(int irq, void *data)
+
+ priv->queue_buf[slot]->v4l2_buf.field = priv->field;
+ priv->queue_buf[slot]->v4l2_buf.sequence = priv->sequence++;
+- do_gettimeofday(&priv->queue_buf[slot]->v4l2_buf.timestamp);
++ v4l2_get_timestamp(&priv->queue_buf[slot]->v4l2_buf.timestamp);
+ vb2_buffer_done(priv->queue_buf[slot], VB2_BUF_STATE_DONE);
+ priv->queue_buf[slot] = NULL;
+
+--
+2.6.2
+
diff --git a/patches.renesas/0094-sh-pfc-fix-sparse-GPIOs-for-R-Car-SoCs.patch b/patches.renesas/0094-sh-pfc-fix-sparse-GPIOs-for-R-Car-SoCs.patch
new file mode 100644
index 00000000000000..40c7c510508427
--- /dev/null
+++ b/patches.renesas/0094-sh-pfc-fix-sparse-GPIOs-for-R-Car-SoCs.patch
@@ -0,0 +1,39 @@
+From 691ecc059b9774036fbcfd00faf3c9581c08f5ce Mon Sep 17 00:00:00 2001
+From: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
+Date: Fri, 26 Jun 2015 01:40:56 +0300
+Subject: [PATCH 094/129] sh-pfc: fix sparse GPIOs for R-Car SoCs
+
+The PFC driver causes the kernel to hang on the R-Car gen2 SoC based boards
+when the CPU_ALL_PORT() macro is fixed to reflect the reality, i.e. when the
+GPIO space becomes actually sparse. This happens because the _GP_GPIO() macro
+includes an indexed initializer which causes the "holes" (array entries filled
+with all 0s) between the groups of the existing GPIOs; and the driver can't
+cope with that. There seems to be no reason to use the indexed initializer,
+so we can remove the index specifier and so avoid the "holes".
+
+Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
+Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+(cherry picked from commit 61bb3aef92a4d102382f399eafccd5c72be6fdf2)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ drivers/pinctrl/sh-pfc/sh_pfc.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/pinctrl/sh-pfc/sh_pfc.h b/drivers/pinctrl/sh-pfc/sh_pfc.h
+index c7508d5f6886..0874cfee6889 100644
+--- a/drivers/pinctrl/sh-pfc/sh_pfc.h
++++ b/drivers/pinctrl/sh-pfc/sh_pfc.h
+@@ -224,7 +224,7 @@ struct sh_pfc_soc_info {
+
+ /* PINMUX_GPIO_GP_ALL - Expand to a list of sh_pfc_pin entries */
+ #define _GP_GPIO(bank, _pin, _name, sfx) \
+- [(bank * 32) + _pin] = { \
++ { \
+ .pin = (bank * 32) + _pin, \
+ .name = __stringify(_name), \
+ .enum_id = _name##_DATA, \
+--
+2.6.2
+
diff --git a/patches.renesas/0095-ASoC-soc-pcm-DPCM-cares-BE-format.patch b/patches.renesas/0095-ASoC-soc-pcm-DPCM-cares-BE-format.patch
new file mode 100644
index 00000000000000..35b48c6b861396
--- /dev/null
+++ b/patches.renesas/0095-ASoC-soc-pcm-DPCM-cares-BE-format.patch
@@ -0,0 +1,118 @@
+From a6baf853cb512141ca208c9368baf2fd330f49a5 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Tue, 12 May 2015 02:03:33 +0000
+Subject: [PATCH 095/129] ASoC: soc-pcm: DPCM cares BE format
+
+Current DPCM is caring only FE format. but it will be no sound
+if FE/BE was below style, and user selects S24_LE format.
+
+ FE: S16_LE/S24_LE
+ BE: S16_LE
+
+DPCM can rewrite the format, so basically we don't want to
+constrain with the BE constraints. But sometimes it will be trouble.
+This patch adds new .dpcm_merged_format on struct snd_soc_dai_link.
+DPCM will use FE / BE merged format if .struct snd_soc_dai_link
+has it. We can have other .dpcm_merged_xxx in the future
+
+ .dpcm_merged_foramt
+ .dpcm_merged_rate
+ .dpcm_merged_chan
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit b073ed4e21268da59c40a4fc5d56e3af808ecc4d)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ include/sound/soc.h | 3 +++
+ sound/soc/soc-pcm.c | 47 ++++++++++++++++++++++++++++++++++++++++++-----
+ 2 files changed, 45 insertions(+), 5 deletions(-)
+
+--- a/include/sound/soc.h
++++ b/include/sound/soc.h
+@@ -984,6 +984,9 @@ struct snd_soc_dai_link {
+ unsigned int dpcm_capture:1;
+ unsigned int dpcm_playback:1;
+
++ /* DPCM used FE & BE merged format */
++ unsigned int dpcm_merged_format:1;
++
+ /* pmdown_time is ignored at stop */
+ unsigned int ignore_pmdown_time:1;
+
+--- a/sound/soc/soc-pcm.c
++++ b/sound/soc/soc-pcm.c
+@@ -1485,30 +1485,67 @@ unwind:
+ }
+
+ static void dpcm_init_runtime_hw(struct snd_pcm_runtime *runtime,
+- struct snd_soc_pcm_stream *stream)
++ struct snd_soc_pcm_stream *stream,
++ u64 formats)
+ {
+ runtime->hw.rate_min = stream->rate_min;
+ runtime->hw.rate_max = stream->rate_max;
+ runtime->hw.channels_min = stream->channels_min;
+ runtime->hw.channels_max = stream->channels_max;
+ if (runtime->hw.formats)
+- runtime->hw.formats &= stream->formats;
++ runtime->hw.formats &= formats & stream->formats;
+ else
+- runtime->hw.formats = stream->formats;
++ runtime->hw.formats = formats & stream->formats;
+ runtime->hw.rates = stream->rates;
+ }
+
++static u64 dpcm_runtime_base_format(struct snd_pcm_substream *substream)
++{
++ struct snd_soc_pcm_runtime *fe = substream->private_data;
++ struct snd_soc_dpcm *dpcm;
++ u64 formats = ULLONG_MAX;
++ int stream = substream->stream;
++
++ if (!fe->dai_link->dpcm_merged_format)
++ return formats;
++
++ /*
++ * It returns merged BE codec format
++ * if FE want to use it (= dpcm_merged_format)
++ */
++
++ list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
++ struct snd_soc_pcm_runtime *be = dpcm->be;
++ struct snd_soc_dai_driver *codec_dai_drv;
++ struct snd_soc_pcm_stream *codec_stream;
++ int i;
++
++ for (i = 0; i < be->num_codecs; i++) {
++ codec_dai_drv = be->codec_dais[i]->driver;
++ if (stream == SNDRV_PCM_STREAM_PLAYBACK)
++ codec_stream = &codec_dai_drv->playback;
++ else
++ codec_stream = &codec_dai_drv->capture;
++
++ formats &= codec_stream->formats;
++ }
++ }
++
++ return formats;
++}
++
+ static void dpcm_set_fe_runtime(struct snd_pcm_substream *substream)
+ {
+ struct snd_pcm_runtime *runtime = substream->runtime;
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ struct snd_soc_dai_driver *cpu_dai_drv = cpu_dai->driver;
++ u64 format = dpcm_runtime_base_format(substream);
+
+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+- dpcm_init_runtime_hw(runtime, &cpu_dai_drv->playback);
++ dpcm_init_runtime_hw(runtime, &cpu_dai_drv->playback, format);
+ else
+- dpcm_init_runtime_hw(runtime, &cpu_dai_drv->capture);
++ dpcm_init_runtime_hw(runtime, &cpu_dai_drv->capture, format);
+ }
+
+ static int dpcm_fe_dai_do_trigger(struct snd_pcm_substream *substream, int cmd);
diff --git a/patches.renesas/0096-ASoC-rsnd-add-rsnd_dai_to_priv-macro.patch b/patches.renesas/0096-ASoC-rsnd-add-rsnd_dai_to_priv-macro.patch
new file mode 100644
index 00000000000000..9a442c2440c00b
--- /dev/null
+++ b/patches.renesas/0096-ASoC-rsnd-add-rsnd_dai_to_priv-macro.patch
@@ -0,0 +1,43 @@
+From 7132d8339224503272ef9e96e335eed0c5d3bddc Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Fri, 10 Apr 2015 08:49:25 +0000
+Subject: [PATCH 096/129] ASoC: rsnd: add rsnd_dai_to_priv() macro
+
+Using standardized function/macro name is useful in driver
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit eb2535f542b4279b42518d6a312c6f7290434e55)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/core.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
+index 9f48d75fa992..a2a0b5768c44 100644
+--- a/sound/soc/sh/rcar/core.c
++++ b/sound/soc/sh/rcar/core.c
+@@ -272,9 +272,10 @@ struct rsnd_dai *rsnd_rdai_get(struct rsnd_priv *priv, int id)
+ return priv->rdai + id;
+ }
+
++#define rsnd_dai_to_priv(dai) snd_soc_dai_get_drvdata(dai)
+ static struct rsnd_dai *rsnd_dai_to_rdai(struct snd_soc_dai *dai)
+ {
+- struct rsnd_priv *priv = snd_soc_dai_get_drvdata(dai);
++ struct rsnd_priv *priv = rsnd_dai_to_priv(dai);
+
+ return rsnd_rdai_get(priv, dai->id);
+ }
+@@ -351,7 +352,7 @@ struct rsnd_dai_stream *rsnd_rdai_to_io(struct rsnd_dai *rdai,
+ static int rsnd_soc_dai_trigger(struct snd_pcm_substream *substream, int cmd,
+ struct snd_soc_dai *dai)
+ {
+- struct rsnd_priv *priv = snd_soc_dai_get_drvdata(dai);
++ struct rsnd_priv *priv = rsnd_dai_to_priv(dai);
+ struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
+ struct rsnd_dai_stream *io = rsnd_rdai_to_io(rdai, substream);
+ int ssi_id = rsnd_mod_id(rsnd_io_to_mod_ssi(io));
+--
+2.6.2
+
diff --git a/patches.renesas/0097-ASoC-rsnd-make-sure-it-uses-lock-when-it-calls-rsnd_.patch b/patches.renesas/0097-ASoC-rsnd-make-sure-it-uses-lock-when-it-calls-rsnd_.patch
new file mode 100644
index 00000000000000..fd6d8ef2522160
--- /dev/null
+++ b/patches.renesas/0097-ASoC-rsnd-make-sure-it-uses-lock-when-it-calls-rsnd_.patch
@@ -0,0 +1,123 @@
+From e80b87910f081ba59cc3954db2675c65f6d85cac Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Fri, 10 Apr 2015 08:49:49 +0000
+Subject: [PATCH 097/129] ASoC: rsnd: make sure it uses lock when it calls
+ rsnd_dai_call
+
+rsnd_dai_call() should be called under rsnd_lock
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit e9c390df671fadc829550935ffb6b23549f26ded)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/core.c | 27 ++++++++++++++++++++++-----
+ 1 file changed, 22 insertions(+), 5 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
+index a2a0b5768c44..164653c0bc10 100644
+--- a/sound/soc/sh/rcar/core.c
++++ b/sound/soc/sh/rcar/core.c
+@@ -731,10 +731,15 @@ static int rsnd_hw_params(struct snd_pcm_substream *substream,
+ {
+ struct snd_soc_dai *dai = rsnd_substream_to_dai(substream);
+ struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
++ struct rsnd_priv *priv = rsnd_dai_to_priv(dai);
+ struct rsnd_dai_stream *io = rsnd_rdai_to_io(rdai, substream);
++ unsigned long flags;
+ int ret;
+
++ rsnd_lock(priv, flags);
+ ret = rsnd_dai_call(hw_params, io, substream, hw_params);
++ rsnd_unlock(priv, flags);
++
+ if (ret)
+ return ret;
+
+@@ -919,14 +924,16 @@ int rsnd_kctrl_new_e(struct rsnd_mod *mod,
+ static int rsnd_pcm_new(struct snd_soc_pcm_runtime *rtd)
+ {
+ struct snd_soc_dai *dai = rtd->cpu_dai;
++ struct rsnd_priv *priv = rsnd_dai_to_priv(dai);
+ struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
+- int ret;
++ unsigned long flags;
++ int ret = 0;
+
+- ret = rsnd_dai_call(pcm_new, &rdai->playback, rtd);
+- if (ret)
+- return ret;
++ rsnd_lock(priv, flags);
++ ret |= rsnd_dai_call(pcm_new, &rdai->playback, rtd);
++ ret |= rsnd_dai_call(pcm_new, &rdai->capture, rtd);
++ rsnd_unlock(priv, flags);
+
+- ret = rsnd_dai_call(pcm_new, &rdai->capture, rtd);
+ if (ret)
+ return ret;
+
+@@ -949,8 +956,11 @@ static const struct snd_soc_component_driver rsnd_soc_component = {
+ static int rsnd_rdai_continuance_probe(struct rsnd_priv *priv,
+ struct rsnd_dai_stream *io)
+ {
++ unsigned long flags;
+ int ret;
+
++ rsnd_lock(priv, flags);
++
+ ret = rsnd_dai_call(probe, io, priv);
+ if (ret == -EAGAIN) {
+ /*
+@@ -983,6 +993,7 @@ static int rsnd_rdai_continuance_probe(struct rsnd_priv *priv,
+ */
+ ret = rsnd_dai_call(probe, io, priv);
+ }
++ rsnd_unlock(priv, flags);
+
+ return ret;
+ }
+@@ -998,6 +1009,7 @@ static int rsnd_probe(struct platform_device *pdev)
+ struct rsnd_dai *rdai;
+ const struct of_device_id *of_id = of_match_device(rsnd_of_match, dev);
+ const struct rsnd_of_data *of_data;
++ unsigned long flags;
+ int (*probe_func[])(struct platform_device *pdev,
+ const struct rsnd_of_data *of_data,
+ struct rsnd_priv *priv) = {
+@@ -1084,10 +1096,12 @@ static int rsnd_probe(struct platform_device *pdev)
+ exit_snd_soc:
+ snd_soc_unregister_platform(dev);
+ exit_snd_probe:
++ rsnd_lock(priv, flags);
+ for_each_rsnd_dai(rdai, priv, i) {
+ rsnd_dai_call(remove, &rdai->playback, priv);
+ rsnd_dai_call(remove, &rdai->capture, priv);
+ }
++ rsnd_unlock(priv, flags);
+
+ return ret;
+ }
+@@ -1096,6 +1110,7 @@ static int rsnd_remove(struct platform_device *pdev)
+ {
+ struct rsnd_priv *priv = dev_get_drvdata(&pdev->dev);
+ struct rsnd_dai *rdai;
++ unsigned long flags;
+ void (*remove_func[])(struct platform_device *pdev,
+ struct rsnd_priv *priv) = {
+ rsnd_ssi_remove,
+@@ -1106,10 +1121,12 @@ static int rsnd_remove(struct platform_device *pdev)
+
+ pm_runtime_disable(&pdev->dev);
+
++ rsnd_lock(priv, flags);
+ for_each_rsnd_dai(rdai, priv, i) {
+ ret |= rsnd_dai_call(remove, &rdai->playback, priv);
+ ret |= rsnd_dai_call(remove, &rdai->capture, priv);
+ }
++ rsnd_unlock(priv, flags);
+
+ for (i = 0; i < ARRAY_SIZE(remove_func); i++)
+ remove_func[i](pdev, priv);
+--
+2.6.2
+
diff --git a/patches.renesas/0098-ASoC-rsnd-tidyup-SSI-parent-related-function-macro-n.patch b/patches.renesas/0098-ASoC-rsnd-tidyup-SSI-parent-related-function-macro-n.patch
new file mode 100644
index 00000000000000..be404d01d9d5aa
--- /dev/null
+++ b/patches.renesas/0098-ASoC-rsnd-tidyup-SSI-parent-related-function-macro-n.patch
@@ -0,0 +1,78 @@
+From 0625166c1d275001f450dc67cccc9b91c2940f78 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Fri, 10 Apr 2015 08:50:12 +0000
+Subject: [PATCH 098/129] ASoC: rsnd: tidyup SSI parent related function/macro
+ names
+
+Current rsnd driver is using SSI parent related function/macro as
+"clock" related. but it is not only clock related.
+tidyup function/macro naming.
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit 8c5c79a1cd51ce1b4fec8bbaecd17d599478bd27)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/ssi.c | 18 +++++++++++-------
+ 1 file changed, 11 insertions(+), 7 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
+index 7bb9c087f3dc..2ef48a44c4ab 100644
+--- a/sound/soc/sh/rcar/ssi.c
++++ b/sound/soc/sh/rcar/ssi.c
+@@ -80,7 +80,7 @@ struct rsnd_ssi {
+ #define rsnd_mod_to_ssi(_mod) container_of((_mod), struct rsnd_ssi, mod)
+ #define rsnd_dma_to_ssi(dma) rsnd_mod_to_ssi(rsnd_dma_to_mod(dma))
+ #define rsnd_ssi_pio_available(ssi) ((ssi)->info->irq > 0)
+-#define rsnd_ssi_clk_from_parent(ssi) ((ssi)->parent)
++#define rsnd_ssi_parent(ssi) ((ssi)->parent)
+ #define rsnd_ssi_mode_flags(p) ((p)->info->flags)
+ #define rsnd_ssi_dai_id(ssi) ((ssi)->info->dai_id)
+ #define rsnd_ssi_of_node(priv) \
+@@ -189,8 +189,10 @@ static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi,
+ rsnd_mod_hw_start(&ssi->mod);
+
+ if (rsnd_rdai_is_clk_master(rdai)) {
+- if (rsnd_ssi_clk_from_parent(ssi))
+- rsnd_ssi_hw_start(ssi->parent, io);
++ struct rsnd_ssi *ssi_parent = rsnd_ssi_parent(ssi);
++
++ if (ssi_parent)
++ rsnd_ssi_hw_start(ssi_parent, io);
+ else
+ rsnd_ssi_master_clk_start(ssi, io);
+ }
+@@ -253,8 +255,10 @@ static void rsnd_ssi_hw_stop(struct rsnd_ssi *ssi)
+ rsnd_ssi_status_check(&ssi->mod, IIRQ);
+
+ if (rsnd_rdai_is_clk_master(rdai)) {
+- if (rsnd_ssi_clk_from_parent(ssi))
+- rsnd_ssi_hw_stop(ssi->parent);
++ struct rsnd_ssi *ssi_parent = rsnd_ssi_parent(ssi);
++
++ if (ssi_parent)
++ rsnd_ssi_hw_stop(ssi_parent);
+ else
+ rsnd_ssi_master_clk_stop(ssi);
+ }
+@@ -598,7 +602,7 @@ int rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod)
+ return !!(rsnd_ssi_mode_flags(ssi) & RSND_SSI_CLK_PIN_SHARE);
+ }
+
+-static void rsnd_ssi_parent_clk_setup(struct rsnd_priv *priv, struct rsnd_ssi *ssi)
++static void rsnd_ssi_parent_setup(struct rsnd_priv *priv, struct rsnd_ssi *ssi)
+ {
+ if (!rsnd_ssi_is_pin_sharing(&ssi->mod))
+ return;
+@@ -732,7 +736,7 @@ int rsnd_ssi_probe(struct platform_device *pdev,
+ if (ret)
+ return ret;
+
+- rsnd_ssi_parent_clk_setup(priv, ssi);
++ rsnd_ssi_parent_setup(priv, ssi);
+ }
+
+ return 0;
+--
+2.6.2
+
diff --git a/patches.renesas/0099-ASoC-rsnd-make-sure-SSI-parent-child-uses-same-numbe.patch b/patches.renesas/0099-ASoC-rsnd-make-sure-SSI-parent-child-uses-same-numbe.patch
new file mode 100644
index 00000000000000..74efaaa00279d3
--- /dev/null
+++ b/patches.renesas/0099-ASoC-rsnd-make-sure-SSI-parent-child-uses-same-numbe.patch
@@ -0,0 +1,93 @@
+From bfe8aecc9388f82d1e70c5384582c7fbbf60d92b Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Fri, 10 Apr 2015 08:50:30 +0000
+Subject: [PATCH 099/129] ASoC: rsnd: make sure SSI parent/child uses same
+ number of sound channel.
+
+SSI parent/child need to use same number of sound data channel
+if these are sharing clock/ws pin. this patch makes it sure.
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit 919567d914b3c134e60c01db72a03a0adc5f41b9)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/ssi.c | 34 ++++++++++++++++++++++++++++++++++
+ 1 file changed, 34 insertions(+)
+
+diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
+index 2ef48a44c4ab..5b89723c3206 100644
+--- a/sound/soc/sh/rcar/ssi.c
++++ b/sound/soc/sh/rcar/ssi.c
+@@ -66,6 +66,7 @@ struct rsnd_ssi {
+
+ u32 cr_own;
+ u32 cr_clk;
++ int chan;
+ int err;
+ unsigned int usrcnt;
+ };
+@@ -264,6 +265,8 @@ static void rsnd_ssi_hw_stop(struct rsnd_ssi *ssi)
+ }
+
+ rsnd_mod_hw_stop(&ssi->mod);
++
++ ssi->chan = 0;
+ }
+
+ dev_dbg(dev, "%s[%d] hw stopped\n",
+@@ -340,6 +343,35 @@ static int rsnd_ssi_quit(struct rsnd_mod *mod,
+ return 0;
+ }
+
++static int rsnd_ssi_hw_params(struct rsnd_mod *mod,
++ struct snd_pcm_substream *substream,
++ struct snd_pcm_hw_params *params)
++{
++ struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
++ struct rsnd_ssi *ssi_parent = rsnd_ssi_parent(ssi);
++ int chan = params_channels(params);
++
++ /*
++ * Already working.
++ * It will happen if SSI has parent/child connection.
++ */
++ if (ssi->usrcnt) {
++ /*
++ * it is error if child <-> parent SSI uses
++ * different channels.
++ */
++ if (ssi->chan != chan)
++ return -EIO;
++ }
++
++ /* It will be removed on rsnd_ssi_hw_stop */
++ ssi->chan = chan;
++ if (ssi_parent)
++ return rsnd_ssi_hw_params(&ssi_parent->mod, substream, params);
++
++ return 0;
++}
++
+ static void rsnd_ssi_record_error(struct rsnd_ssi *ssi, u32 status)
+ {
+ /* under/over flow error */
+@@ -460,6 +492,7 @@ static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
+ .quit = rsnd_ssi_quit,
+ .start = rsnd_ssi_start,
+ .stop = rsnd_ssi_stop,
++ .hw_params = rsnd_ssi_hw_params,
+ };
+
+ static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
+@@ -569,6 +602,7 @@ static struct rsnd_mod_ops rsnd_ssi_dma_ops = {
+ .start = rsnd_ssi_dma_start,
+ .stop = rsnd_ssi_dma_stop,
+ .fallback = rsnd_ssi_fallback,
++ .hw_params = rsnd_ssi_hw_params,
+ };
+
+ int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod)
+--
+2.6.2
+
diff --git a/patches.renesas/0100-ASoC-rsnd-care-snd_kcontrol-s-index.patch b/patches.renesas/0100-ASoC-rsnd-care-snd_kcontrol-s-index.patch
new file mode 100644
index 00000000000000..2813a2d149af82
--- /dev/null
+++ b/patches.renesas/0100-ASoC-rsnd-care-snd_kcontrol-s-index.patch
@@ -0,0 +1,39 @@
+From bb44ae377ffabaffd458843a5c8bdffa7fe2b514 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Fri, 10 Apr 2015 08:50:50 +0000
+Subject: [PATCH 100/129] ASoC: rsnd: care snd_kcontrol's index
+
+rsnd might be used in multi-codec sound card.
+Then, same name kcontrol will be registered many times, and it will
+be error. This patch fixes this issue by using .index
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit da620d722a7b7b16bf8571150acd7fd9e155809f)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/core.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
+index 164653c0bc10..99eb1093c569 100644
+--- a/sound/soc/sh/rcar/core.c
++++ b/sound/soc/sh/rcar/core.c
+@@ -839,12 +839,14 @@ static int __rsnd_kctrl_new(struct rsnd_mod *mod,
+ struct rsnd_kctrl_cfg *cfg,
+ void (*update)(struct rsnd_mod *mod))
+ {
++ struct snd_soc_card *soc_card = rtd->card;
+ struct snd_card *card = rtd->card->snd_card;
+ struct snd_kcontrol *kctrl;
+ struct snd_kcontrol_new knew = {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .name = name,
+ .info = rsnd_kctrl_info,
++ .index = rtd - soc_card->rtd,
+ .get = rsnd_kctrl_get,
+ .put = rsnd_kctrl_put,
+ .private_value = (unsigned long)cfg,
+--
+2.6.2
+
diff --git a/patches.renesas/0101-ASoC-rsnd-Use-generic-names-for-device-nodes.patch b/patches.renesas/0101-ASoC-rsnd-Use-generic-names-for-device-nodes.patch
new file mode 100644
index 00000000000000..d5c12d6fca94fd
--- /dev/null
+++ b/patches.renesas/0101-ASoC-rsnd-Use-generic-names-for-device-nodes.patch
@@ -0,0 +1,32 @@
+From 9681e7afe7774e4d64fc7712d212bedc96bd0a0f Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Mon, 27 Apr 2015 14:49:09 +0200
+Subject: [PATCH 101/129] ASoC: rsnd: Use generic names for device nodes
+
+rcar_sound -> sound
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Acked-by: Simon Horman <horms+renesas@verge.net.au>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit 596f74ec275b0ec608e9450c937c6a29ba91b352)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ Documentation/devicetree/bindings/sound/renesas,rsnd.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Documentation/devicetree/bindings/sound/renesas,rsnd.txt b/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
+index f316ce1f214a..62ece4c59da7 100644
+--- a/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
++++ b/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
+@@ -47,7 +47,7 @@ DAI subnode properties:
+
+ Example:
+
+-rcar_sound: rcar_sound@ec500000 {
++rcar_sound: sound@ec500000 {
+ #sound-dai-cells = <1>;
+ compatible = "renesas,rcar_sound-r8a7791", "renesas,rcar_sound-gen2";
+ reg = <0 0xec500000 0 0x1000>, /* SCU */
+--
+2.6.2
+
diff --git a/patches.renesas/0102-ASoC-rsnd-revert-lock-for-calls-to-rsnd_dai_call.patch b/patches.renesas/0102-ASoC-rsnd-revert-lock-for-calls-to-rsnd_dai_call.patch
new file mode 100644
index 00000000000000..a0e2776cfa9acf
--- /dev/null
+++ b/patches.renesas/0102-ASoC-rsnd-revert-lock-for-calls-to-rsnd_dai_call.patch
@@ -0,0 +1,126 @@
+From 1e69be61914002bafd2e20c5237cf41d384ffd2c Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Tue, 12 May 2015 01:57:50 +0000
+Subject: [PATCH 102/129] ASoC: rsnd: revert lock for calls to rsnd_dai_call
+
+This reverts commit 'e9c390df671f ("ASoC: rsnd: make sure it uses lock when
+it calls rsnd_dai_call)' The additional locks make 1") lock issue when boot
+2) lock issue when unbind/rmmod. And there is no problem without these
+locks. This patch revert it.
+
+Reported-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit ae11a9be5a9bfc085ab3e0b7d2ea7cd01bc1d477)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/core.c | 27 +++++----------------------
+ 1 file changed, 5 insertions(+), 22 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
+index 99eb1093c569..405cacdbedfb 100644
+--- a/sound/soc/sh/rcar/core.c
++++ b/sound/soc/sh/rcar/core.c
+@@ -731,15 +731,10 @@ static int rsnd_hw_params(struct snd_pcm_substream *substream,
+ {
+ struct snd_soc_dai *dai = rsnd_substream_to_dai(substream);
+ struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
+- struct rsnd_priv *priv = rsnd_dai_to_priv(dai);
+ struct rsnd_dai_stream *io = rsnd_rdai_to_io(rdai, substream);
+- unsigned long flags;
+ int ret;
+
+- rsnd_lock(priv, flags);
+ ret = rsnd_dai_call(hw_params, io, substream, hw_params);
+- rsnd_unlock(priv, flags);
+-
+ if (ret)
+ return ret;
+
+@@ -926,16 +921,14 @@ int rsnd_kctrl_new_e(struct rsnd_mod *mod,
+ static int rsnd_pcm_new(struct snd_soc_pcm_runtime *rtd)
+ {
+ struct snd_soc_dai *dai = rtd->cpu_dai;
+- struct rsnd_priv *priv = rsnd_dai_to_priv(dai);
+ struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
+- unsigned long flags;
+- int ret = 0;
++ int ret;
+
+- rsnd_lock(priv, flags);
+- ret |= rsnd_dai_call(pcm_new, &rdai->playback, rtd);
+- ret |= rsnd_dai_call(pcm_new, &rdai->capture, rtd);
+- rsnd_unlock(priv, flags);
++ ret = rsnd_dai_call(pcm_new, &rdai->playback, rtd);
++ if (ret)
++ return ret;
+
++ ret = rsnd_dai_call(pcm_new, &rdai->capture, rtd);
+ if (ret)
+ return ret;
+
+@@ -958,11 +951,8 @@ static const struct snd_soc_component_driver rsnd_soc_component = {
+ static int rsnd_rdai_continuance_probe(struct rsnd_priv *priv,
+ struct rsnd_dai_stream *io)
+ {
+- unsigned long flags;
+ int ret;
+
+- rsnd_lock(priv, flags);
+-
+ ret = rsnd_dai_call(probe, io, priv);
+ if (ret == -EAGAIN) {
+ /*
+@@ -995,7 +985,6 @@ static int rsnd_rdai_continuance_probe(struct rsnd_priv *priv,
+ */
+ ret = rsnd_dai_call(probe, io, priv);
+ }
+- rsnd_unlock(priv, flags);
+
+ return ret;
+ }
+@@ -1011,7 +1000,6 @@ static int rsnd_probe(struct platform_device *pdev)
+ struct rsnd_dai *rdai;
+ const struct of_device_id *of_id = of_match_device(rsnd_of_match, dev);
+ const struct rsnd_of_data *of_data;
+- unsigned long flags;
+ int (*probe_func[])(struct platform_device *pdev,
+ const struct rsnd_of_data *of_data,
+ struct rsnd_priv *priv) = {
+@@ -1098,12 +1086,10 @@ static int rsnd_probe(struct platform_device *pdev)
+ exit_snd_soc:
+ snd_soc_unregister_platform(dev);
+ exit_snd_probe:
+- rsnd_lock(priv, flags);
+ for_each_rsnd_dai(rdai, priv, i) {
+ rsnd_dai_call(remove, &rdai->playback, priv);
+ rsnd_dai_call(remove, &rdai->capture, priv);
+ }
+- rsnd_unlock(priv, flags);
+
+ return ret;
+ }
+@@ -1112,7 +1098,6 @@ static int rsnd_remove(struct platform_device *pdev)
+ {
+ struct rsnd_priv *priv = dev_get_drvdata(&pdev->dev);
+ struct rsnd_dai *rdai;
+- unsigned long flags;
+ void (*remove_func[])(struct platform_device *pdev,
+ struct rsnd_priv *priv) = {
+ rsnd_ssi_remove,
+@@ -1123,12 +1108,10 @@ static int rsnd_remove(struct platform_device *pdev)
+
+ pm_runtime_disable(&pdev->dev);
+
+- rsnd_lock(priv, flags);
+ for_each_rsnd_dai(rdai, priv, i) {
+ ret |= rsnd_dai_call(remove, &rdai->playback, priv);
+ ret |= rsnd_dai_call(remove, &rdai->capture, priv);
+ }
+- rsnd_unlock(priv, flags);
+
+ for (i = 0; i < ARRAY_SIZE(remove_func); i++)
+ remove_func[i](pdev, priv);
+--
+2.6.2
+
diff --git a/patches.renesas/0103-ASoC-rsnd-indicate-unknown-HW-start.patch b/patches.renesas/0103-ASoC-rsnd-indicate-unknown-HW-start.patch
new file mode 100644
index 00000000000000..1d73aa9c7838f3
--- /dev/null
+++ b/patches.renesas/0103-ASoC-rsnd-indicate-unknown-HW-start.patch
@@ -0,0 +1,38 @@
+From 32a7c232b546c0e87184bc487bfff0be13e9ca91 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Thu, 21 May 2015 03:49:13 +0000
+Subject: [PATCH 103/129] ASoC: rsnd: indicate unknown HW start
+
+rsnd_ssi_hw_stop() should be called after rsnd_ssi_hw_start().
+This patch indicates unknown hw_stop as error
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Tested by: Cao Minh Hiep <cm-hiep@jinso.co.jp>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+
+(cherry picked from commit b847357979048f718aa7e218050982ec9c306285)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/ssi.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
+index 5b89723c3206..927ac52a6d1e 100644
+--- a/sound/soc/sh/rcar/ssi.c
++++ b/sound/soc/sh/rcar/ssi.c
+@@ -232,8 +232,10 @@ static void rsnd_ssi_hw_stop(struct rsnd_ssi *ssi)
+ struct device *dev = rsnd_priv_to_dev(priv);
+ u32 cr;
+
+- if (0 == ssi->usrcnt) /* stop might be called without start */
++ if (0 == ssi->usrcnt) {
++ dev_err(dev, "%s called without starting\n", __func__);
+ return;
++ }
+
+ ssi->usrcnt--;
+
+--
+2.6.2
+
diff --git a/patches.renesas/0104-ASoC-rsnd-add-rsnd_dai_stream_quit.patch b/patches.renesas/0104-ASoC-rsnd-add-rsnd_dai_stream_quit.patch
new file mode 100644
index 00000000000000..22ca8536341de1
--- /dev/null
+++ b/patches.renesas/0104-ASoC-rsnd-add-rsnd_dai_stream_quit.patch
@@ -0,0 +1,70 @@
+From 51014374fd2333c386dcb48c5776bc0d125240c6 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Thu, 21 May 2015 03:49:54 +0000
+Subject: [PATCH 104/129] ASoC: rsnd: add rsnd_dai_stream_quit()
+
+Current Renesas R-Car sound driver calls rsnd_dai_stream_init() when
+start, but it didn't call paired function. This patch adds
+rsnd_dai_stream_quit() for it. This is prepare for interrupt error
+status check feature support.
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Tested by: Cao Minh Hiep <cm-hiep@jinso.co.jp>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+
+(cherry picked from commit 5626ad0866657c4758958040589b395d2a58816d)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/core.c | 13 ++++++++-----
+ 1 file changed, 8 insertions(+), 5 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
+index 405cacdbedfb..2b7323c92994 100644
+--- a/sound/soc/sh/rcar/core.c
++++ b/sound/soc/sh/rcar/core.c
+@@ -315,7 +315,7 @@ void rsnd_dai_pointer_update(struct rsnd_dai_stream *io, int byte)
+ }
+ }
+
+-static int rsnd_dai_stream_init(struct rsnd_dai_stream *io,
++static void rsnd_dai_stream_init(struct rsnd_dai_stream *io,
+ struct snd_pcm_substream *substream)
+ {
+ struct snd_pcm_runtime *runtime = substream->runtime;
+@@ -327,8 +327,11 @@ static int rsnd_dai_stream_init(struct rsnd_dai_stream *io,
+ runtime->channels *
+ samples_to_bytes(runtime, 1);
+ io->next_period_byte = io->byte_per_period;
++}
+
+- return 0;
++static void rsnd_dai_stream_quit(struct rsnd_dai_stream *io)
++{
++ io->substream = NULL;
+ }
+
+ static
+@@ -363,9 +366,7 @@ static int rsnd_soc_dai_trigger(struct snd_pcm_substream *substream, int cmd,
+
+ switch (cmd) {
+ case SNDRV_PCM_TRIGGER_START:
+- ret = rsnd_dai_stream_init(io, substream);
+- if (ret < 0)
+- goto dai_trigger_end;
++ rsnd_dai_stream_init(io, substream);
+
+ ret = rsnd_platform_call(priv, dai, start, ssi_id);
+ if (ret < 0)
+@@ -391,6 +392,8 @@ static int rsnd_soc_dai_trigger(struct snd_pcm_substream *substream, int cmd,
+ ret = rsnd_platform_call(priv, dai, stop, ssi_id);
+ if (ret < 0)
+ goto dai_trigger_end;
++
++ rsnd_dai_stream_quit(io);
+ break;
+ default:
+ ret = -EINVAL;
+--
+2.6.2
+
diff --git a/patches.renesas/0105-ASoC-rsnd-rsrc-card-uses-FE-BE-merged-format-when-DP.patch b/patches.renesas/0105-ASoC-rsnd-rsrc-card-uses-FE-BE-merged-format-when-DP.patch
new file mode 100644
index 00000000000000..89c58db5fcf0bb
--- /dev/null
+++ b/patches.renesas/0105-ASoC-rsnd-rsrc-card-uses-FE-BE-merged-format-when-DP.patch
@@ -0,0 +1,30 @@
+From 242092d5a8355e446ec47e0bc80586d666e3d676 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Tue, 12 May 2015 02:03:51 +0000
+Subject: [PATCH 105/129] ASoC: rsnd: rsrc-card uses FE/BE merged format when
+ DPCM
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit b723550d7e84b6b59d427d560be49d8ab177ea89)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/rsrc-card.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/sound/soc/sh/rcar/rsrc-card.c b/sound/soc/sh/rcar/rsrc-card.c
+index a68517afe615..050b0dbcee65 100644
+--- a/sound/soc/sh/rcar/rsrc-card.c
++++ b/sound/soc/sh/rcar/rsrc-card.c
+@@ -232,6 +232,7 @@ rsrc_card_sub_parse_of(struct rsrc_card_priv *priv,
+ if (args_count) {
+ *args_count = args.args_count;
+ dai_link->dynamic = 1;
++ dai_link->dpcm_merged_format = 1;
+ } else {
+ dai_link->no_pcm = 1;
+ priv->codec_conf.of_node = (*p_node);
+--
+2.6.2
+
diff --git a/patches.renesas/0106-ASoC-rsnd-spin-lock-for-interrupt-handler.patch b/patches.renesas/0106-ASoC-rsnd-spin-lock-for-interrupt-handler.patch
new file mode 100644
index 00000000000000..88d6f41a542409
--- /dev/null
+++ b/patches.renesas/0106-ASoC-rsnd-spin-lock-for-interrupt-handler.patch
@@ -0,0 +1,165 @@
+From bed00860b77299f7ef2085554647aa83671d470b Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Thu, 21 May 2015 03:50:23 +0000
+Subject: [PATCH 106/129] ASoC: rsnd: spin lock for interrupt handler
+
+Renesas R-Car driver interrupt handler was not locked before.
+But now, SSI/SRC interrupt handler calls restart function
+which should be called under spin lock.
+Below error might happen witout this patch.
+
+Unable to handle kernel NULL pointer dereference at virtual address 00000048
+pgd = edfac000
+[00000048] *pgd=6e0f0831, *pte=00000000, *ppte=00000000
+Internal error: Oops: 17 [#1] SMP ARM
+CPU: 0 PID: 2009 Comm: aplay Not tainted 4.1.0-rc2-dirty #4
+Hardware name: Generic R8A7790 (Flattened Device Tree)
+task: eeac9040 ti: eebe8000 task.ti: eebe8000
+PC is at rsnd_get_adinr+0x28/0x60
+LR is at rsnd_src_ssiu_start+0xdc/0x19c
+pc : [<c0409790>] lr : [<c040c068>] psr: a0000193
+sp : eebe9e58 ip : eebe9e68 fp : eebe9e64
+r10: c06ed9d0 r9 : ee919d10 r8 : 00000001
+r7 : 00000001 r6 : ee1cb090 r5 : 00000000 r4 : edcaa418
+r3 : 00000000 r2 : eea8ce00 r1 : 80000193 r0 : edcaa418
+...
+
+Reported-by: Cao Minh Hiep <cm-hiep@jinso.co.jp>
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Tested by: Cao Minh Hiep <cm-hiep@jinso.co.jp>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+
+(cherry picked from commit 02299d9875bab5b1e9d87ce9ae4aecf537eb12a4)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/core.c | 12 ++++++++++--
+ sound/soc/sh/rcar/rsnd.h | 3 +--
+ sound/soc/sh/rcar/src.c | 11 ++++++++---
+ sound/soc/sh/rcar/ssi.c | 14 +++++++++++---
+ 4 files changed, 30 insertions(+), 10 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
+index 2b7323c92994..d460d2aa82ee 100644
+--- a/sound/soc/sh/rcar/core.c
++++ b/sound/soc/sh/rcar/core.c
+@@ -170,6 +170,14 @@ void rsnd_mod_quit(struct rsnd_mod *mod)
+ clk_unprepare(mod->clk);
+ }
+
++int rsnd_mod_is_working(struct rsnd_mod *mod)
++{
++ struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
++
++ /* see rsnd_dai_stream_init/quit() */
++ return !!io->substream;
++}
++
+ /*
+ * settting function
+ */
+@@ -362,7 +370,7 @@ static int rsnd_soc_dai_trigger(struct snd_pcm_substream *substream, int cmd,
+ int ret;
+ unsigned long flags;
+
+- rsnd_lock(priv, flags);
++ spin_lock_irqsave(&priv->lock, flags);
+
+ switch (cmd) {
+ case SNDRV_PCM_TRIGGER_START:
+@@ -400,7 +408,7 @@ static int rsnd_soc_dai_trigger(struct snd_pcm_substream *substream, int cmd,
+ }
+
+ dai_trigger_end:
+- rsnd_unlock(priv, flags);
++ spin_unlock_irqrestore(&priv->lock, flags);
+
+ return ret;
+ }
+diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
+index 4e6de6804cfb..03ff071d012f 100644
+--- a/sound/soc/sh/rcar/rsnd.h
++++ b/sound/soc/sh/rcar/rsnd.h
+@@ -303,6 +303,7 @@ int rsnd_mod_init(struct rsnd_mod *mod,
+ int id);
+ void rsnd_mod_quit(struct rsnd_mod *mod);
+ char *rsnd_mod_name(struct rsnd_mod *mod);
++int rsnd_mod_is_working(struct rsnd_mod *mod);
+ struct dma_chan *rsnd_mod_dma_req(struct rsnd_mod *mod);
+
+ /*
+@@ -449,8 +450,6 @@ struct rsnd_priv {
+ #define rsnd_priv_to_pdev(priv) ((priv)->pdev)
+ #define rsnd_priv_to_dev(priv) (&(rsnd_priv_to_pdev(priv)->dev))
+ #define rsnd_priv_to_info(priv) ((priv)->info)
+-#define rsnd_lock(priv, flags) spin_lock_irqsave(&priv->lock, flags)
+-#define rsnd_unlock(priv, flags) spin_unlock_irqrestore(&priv->lock, flags)
+
+ /*
+ * rsnd_kctrl
+diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c
+index 3beb32eb412a..fbe9166e26d1 100644
+--- a/sound/soc/sh/rcar/src.c
++++ b/sound/soc/sh/rcar/src.c
+@@ -673,10 +673,13 @@ static int _rsnd_src_stop_gen2(struct rsnd_mod *mod)
+ static irqreturn_t rsnd_src_interrupt_gen2(int irq, void *data)
+ {
+ struct rsnd_mod *mod = data;
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
++ struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
++
++ spin_lock(&priv->lock);
+
+- if (!io)
+- return IRQ_NONE;
++ /* ignore all cases if not working */
++ if (!rsnd_mod_is_working(mod))
++ goto rsnd_src_interrupt_gen2_out;
+
+ if (rsnd_src_error_record_gen2(mod)) {
+ struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+@@ -692,6 +695,8 @@ static irqreturn_t rsnd_src_interrupt_gen2(int irq, void *data)
+ else
+ dev_warn(dev, "no more SRC restart\n");
+ }
++rsnd_src_interrupt_gen2_out:
++ spin_unlock(&priv->lock);
+
+ return IRQ_HANDLED;
+ }
+diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
+index 927ac52a6d1e..50fa3928a003 100644
+--- a/sound/soc/sh/rcar/ssi.c
++++ b/sound/soc/sh/rcar/ssi.c
+@@ -423,10 +423,15 @@ static irqreturn_t rsnd_ssi_interrupt(int irq, void *data)
+ struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+ struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ int is_dma = rsnd_ssi_is_dma_mode(mod);
+- u32 status = rsnd_mod_read(mod, SSISR);
++ u32 status;
++
++ spin_lock(&priv->lock);
+
+- if (!io)
+- return IRQ_NONE;
++ /* ignore all cases if not working */
++ if (!rsnd_mod_is_working(mod))
++ goto rsnd_ssi_interrupt_out;
++
++ status = rsnd_mod_read(mod, SSISR);
+
+ /* PIO only */
+ if (!is_dma && (status & DIRQ)) {
+@@ -466,6 +471,9 @@ static irqreturn_t rsnd_ssi_interrupt(int irq, void *data)
+
+ rsnd_ssi_record_error(ssi, status);
+
++rsnd_ssi_interrupt_out:
++ spin_unlock(&priv->lock);
++
+ return IRQ_HANDLED;
+ }
+
+--
+2.6.2
+
diff --git a/patches.renesas/0107-ASoC-rsnd-Document-r8a7778-specific-binding.patch b/patches.renesas/0107-ASoC-rsnd-Document-r8a7778-specific-binding.patch
new file mode 100644
index 00000000000000..9ca36ffde8c088
--- /dev/null
+++ b/patches.renesas/0107-ASoC-rsnd-Document-r8a7778-specific-binding.patch
@@ -0,0 +1,31 @@
+From c5f298fe30184e1aa0ebd746368be28bdfdd7c7d Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Mon, 1 Jun 2015 12:44:15 +0200
+Subject: [PATCH 107/129] ASoC: rsnd: Document r8a7778-specific binding
+
+Add the missing r8a7778-specific compatible value, which is already in
+use since v4.1-rc1.
+
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit 7667f716e502f2b3e42085738b205ddc9abcff25)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ Documentation/devicetree/bindings/sound/renesas,rsnd.txt | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/Documentation/devicetree/bindings/sound/renesas,rsnd.txt b/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
+index 62ece4c59da7..b6b3a786855f 100644
+--- a/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
++++ b/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
+@@ -5,6 +5,7 @@ Required properties:
+ "renesas,rcar_sound-gen1" if generation1, and
+ "renesas,rcar_sound-gen2" if generation2
+ Examples with soctypes are:
++ - "renesas,rcar_sound-r8a7778" (R-Car M1A)
+ - "renesas,rcar_sound-r8a7790" (R-Car H2)
+ - "renesas,rcar_sound-r8a7791" (R-Car M2-W)
+ - reg : Should contain the register physical address.
+--
+2.6.2
+
diff --git a/patches.renesas/0108-ASoC-rsnd-don-t-care-under-over-run-error-when-PIO.patch b/patches.renesas/0108-ASoC-rsnd-don-t-care-under-over-run-error-when-PIO.patch
new file mode 100644
index 00000000000000..357e354c0a1b93
--- /dev/null
+++ b/patches.renesas/0108-ASoC-rsnd-don-t-care-under-over-run-error-when-PIO.patch
@@ -0,0 +1,61 @@
+From 2fbc61a79fb010dcc53f3f5defbe83b76311a4d0 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Mon, 15 Jun 2015 06:20:54 +0000
+Subject: [PATCH 108/129] ASoC: rsnd: don't care under/over run error when PIO
+
+PIO is used only for checking data path / codec settings. And underrun
+is very normal when PIO mode. Let's don't care about under/over run
+error when PIO case. Otherwise, 1) too many HW restart happens, 2) some
+sounds which need much data transfer can't play since it falls into
+error detection method which was created for DMA transfer
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit 12927a8f80264256e6cb2d3241fe9d6f4ad7face)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/ssi.c | 16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
+index 50fa3928a003..856917392b79 100644
+--- a/sound/soc/sh/rcar/ssi.c
++++ b/sound/soc/sh/rcar/ssi.c
+@@ -199,15 +199,17 @@ static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi,
+ }
+ }
+
+- cr_mode = rsnd_ssi_is_dma_mode(&ssi->mod) ?
+- DMEN : /* DMA : enable DMA */
+- DIEN; /* PIO : enable Data interrupt */
+-
++ if (rsnd_ssi_is_dma_mode(&ssi->mod)) {
++ cr_mode = UIEN | OIEN | /* over/under run */
++ DMEN; /* DMA : enable DMA */
++ } else {
++ cr_mode = DIEN; /* PIO : enable Data interrupt */
++ }
+
+ cr = ssi->cr_own |
+ ssi->cr_clk |
+ cr_mode |
+- UIEN | OIEN | EN;
++ EN;
+
+ rsnd_mod_write(&ssi->mod, SSICR, cr);
+
+@@ -452,8 +454,8 @@ static irqreturn_t rsnd_ssi_interrupt(int irq, void *data)
+ rsnd_dai_pointer_update(io, sizeof(*buf));
+ }
+
+- /* PIO / DMA */
+- if (status & (UIRQ | OIRQ)) {
++ /* DMA only */
++ if (is_dma && (status & (UIRQ | OIRQ))) {
+ struct device *dev = rsnd_priv_to_dev(priv);
+
+ /*
+--
+2.6.2
+
diff --git a/patches.renesas/0109-ASoC-rsnd-don-t-call-snd_pcm_period_elapsed-under-sp.patch b/patches.renesas/0109-ASoC-rsnd-don-t-call-snd_pcm_period_elapsed-under-sp.patch
new file mode 100644
index 00000000000000..03f1838753b2d8
--- /dev/null
+++ b/patches.renesas/0109-ASoC-rsnd-don-t-call-snd_pcm_period_elapsed-under-sp.patch
@@ -0,0 +1,148 @@
+From 8ea1c6a4bcd03589fe3519d74d673198475d5271 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Mon, 15 Jun 2015 06:21:15 +0000
+Subject: [PATCH 109/129] ASoC: rsnd: don't call snd_pcm_period_elapsed() under
+ spin lock
+
+'a9e1ac1a9e4585b5("ASoC: rsnd: spin lock for interrupt handler")'
+added spin lock under interrupt handler to solve HW restart issue.
+
+OTOH, current rsnd driver calls snd_pcm_period_elapsed() from
+rsnd_dai_pointer_update(). but, it will be called under spin lock
+if SSI was PIO mode.
+
+If it was called under spin lock, it will call
+snd_pcm_update_state() -> snd_pcm_drain_done().
+Then, it calls rsnd_soc_dai_trigger() and will be dead-lock.
+This patch doesn't call rsnd_dai_pointer_update() under spin lock
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit 75defee0f1b3fcd91d8a304d6444635a459b8249)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/core.c | 20 ++++++++++++++++++--
+ sound/soc/sh/rcar/dma.c | 11 ++++++++++-
+ sound/soc/sh/rcar/rsnd.h | 3 ++-
+ sound/soc/sh/rcar/ssi.c | 6 +++++-
+ 4 files changed, 35 insertions(+), 5 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
+index d460d2aa82ee..027b04392674 100644
+--- a/sound/soc/sh/rcar/core.c
++++ b/sound/soc/sh/rcar/core.c
+@@ -302,7 +302,7 @@ int rsnd_dai_pointer_offset(struct rsnd_dai_stream *io, int additional)
+ return pos;
+ }
+
+-void rsnd_dai_pointer_update(struct rsnd_dai_stream *io, int byte)
++bool rsnd_dai_pointer_update(struct rsnd_dai_stream *io, int byte)
+ {
+ io->byte_pos += byte;
+
+@@ -319,8 +319,24 @@ void rsnd_dai_pointer_update(struct rsnd_dai_stream *io, int byte)
+ io->next_period_byte = io->byte_per_period;
+ }
+
+- snd_pcm_period_elapsed(substream);
++ return true;
+ }
++
++ return false;
++}
++
++void rsnd_dai_period_elapsed(struct rsnd_dai_stream *io)
++{
++ struct snd_pcm_substream *substream = io->substream;
++
++ /*
++ * this function should be called...
++ *
++ * - if rsnd_dai_pointer_update() returns true
++ * - without spin lock
++ */
++
++ snd_pcm_period_elapsed(substream);
+ }
+
+ static void rsnd_dai_stream_init(struct rsnd_dai_stream *io,
+diff --git a/sound/soc/sh/rcar/dma.c b/sound/soc/sh/rcar/dma.c
+index 144308f15fb3..ac19ab161c63 100644
+--- a/sound/soc/sh/rcar/dma.c
++++ b/sound/soc/sh/rcar/dma.c
+@@ -36,7 +36,10 @@ static void rsnd_dmaen_complete(void *data)
+ {
+ struct rsnd_dma *dma = (struct rsnd_dma *)data;
+ struct rsnd_mod *mod = rsnd_dma_to_mod(dma);
++ struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+ struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
++ bool elapsed = false;
++ unsigned long flags;
+
+ /*
+ * Renesas sound Gen1 needs 1 DMAC,
+@@ -49,8 +52,14 @@ static void rsnd_dmaen_complete(void *data)
+ * rsnd_dai_pointer_update() will be called twice,
+ * ant it will breaks io->byte_pos
+ */
++ spin_lock_irqsave(&priv->lock, flags);
++
++ elapsed = rsnd_dai_pointer_update(io, io->byte_per_period);
++
++ spin_unlock_irqrestore(&priv->lock, flags);
+
+- rsnd_dai_pointer_update(io, io->byte_per_period);
++ if (elapsed)
++ rsnd_dai_period_elapsed(io);
+ }
+
+ static void rsnd_dmaen_stop(struct rsnd_dma *dma)
+diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
+index 03ff071d012f..e37234ea18e6 100644
+--- a/sound/soc/sh/rcar/rsnd.h
++++ b/sound/soc/sh/rcar/rsnd.h
+@@ -355,7 +355,8 @@ struct rsnd_dai {
+
+ struct rsnd_dai *rsnd_rdai_get(struct rsnd_priv *priv, int id);
+
+-void rsnd_dai_pointer_update(struct rsnd_dai_stream *io, int cnt);
++bool rsnd_dai_pointer_update(struct rsnd_dai_stream *io, int cnt);
++void rsnd_dai_period_elapsed(struct rsnd_dai_stream *io);
+ int rsnd_dai_pointer_offset(struct rsnd_dai_stream *io, int additional);
+
+ /*
+diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
+index 856917392b79..25483211a349 100644
+--- a/sound/soc/sh/rcar/ssi.c
++++ b/sound/soc/sh/rcar/ssi.c
+@@ -426,6 +426,7 @@ static irqreturn_t rsnd_ssi_interrupt(int irq, void *data)
+ struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ int is_dma = rsnd_ssi_is_dma_mode(mod);
+ u32 status;
++ bool elapsed = false;
+
+ spin_lock(&priv->lock);
+
+@@ -451,7 +452,7 @@ static irqreturn_t rsnd_ssi_interrupt(int irq, void *data)
+ else
+ *buf = rsnd_mod_read(mod, SSIRDR);
+
+- rsnd_dai_pointer_update(io, sizeof(*buf));
++ elapsed = rsnd_dai_pointer_update(io, sizeof(*buf));
+ }
+
+ /* DMA only */
+@@ -476,6 +477,9 @@ static irqreturn_t rsnd_ssi_interrupt(int irq, void *data)
+ rsnd_ssi_interrupt_out:
+ spin_unlock(&priv->lock);
+
++ if (elapsed)
++ rsnd_dai_period_elapsed(io);
++
+ return IRQ_HANDLED;
+ }
+
+--
+2.6.2
+
diff --git a/patches.renesas/0110-ASoC-rsrc-card-used-fe.xxx-be.xxx-name-for-dai_link.patch b/patches.renesas/0110-ASoC-rsrc-card-used-fe.xxx-be.xxx-name-for-dai_link.patch
new file mode 100644
index 00000000000000..672de37750d086
--- /dev/null
+++ b/patches.renesas/0110-ASoC-rsrc-card-used-fe.xxx-be.xxx-name-for-dai_link.patch
@@ -0,0 +1,72 @@
+From 10e9fe5f59d8eac66ca26f8f8b56693cc6a25286 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Mon, 15 Jun 2015 06:21:34 +0000
+Subject: [PATCH 110/129] ASoC: rsrc-card: used "fe.xxx"/"be.xxx" name for
+ dai_link
+
+Current dai_link name is using "cpu_dai_name + codec_dai_name",
+but one of them is always "snd-soc-dummy-dai" when DPCM.
+This patch uses "fe.xxx" for cpu, "be.xxx" for codec.
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit d72f4a885e9c310e58f9a07ee17516e8328d224d)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/rsrc-card.c | 20 +++++++-------------
+ 1 file changed, 7 insertions(+), 13 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/rsrc-card.c b/sound/soc/sh/rcar/rsrc-card.c
+index 050b0dbcee65..9a1926f8d348 100644
+--- a/sound/soc/sh/rcar/rsrc-card.c
++++ b/sound/soc/sh/rcar/rsrc-card.c
+@@ -55,11 +55,13 @@ struct rsrc_card_dai {
+ #define RSRC_FB_NUM 2 /* FE/BE */
+ #define IDX_CPU 0
+ #define IDX_CODEC 1
++#define DAI_NAME_NUM 32
+ struct rsrc_card_priv {
+ struct snd_soc_card snd_card;
+ struct rsrc_card_dai_props {
+ struct rsrc_card_dai cpu_dai;
+ struct rsrc_card_dai codec_dai;
++ char dai_name[DAI_NAME_NUM];
+ } dai_props[RSRC_FB_NUM];
+ struct snd_soc_codec_conf codec_conf;
+ struct snd_soc_dai_link dai_link[RSRC_FB_NUM];
+@@ -309,7 +311,7 @@ static int rsrc_card_dai_link_of(struct device_node *node,
+ struct rsrc_card_dai_props *dai_props = rsrc_priv_to_props(priv, idx);
+ struct device_node *cpu = NULL;
+ struct device_node *codec = NULL;
+- char *name;
++ char *name = dai_props->dai_name;
+ char prop[128];
+ int ret, cpu_args;
+
+@@ -348,18 +350,10 @@ static int rsrc_card_dai_link_of(struct device_node *node,
+ /* Simple Card assumes platform == cpu */
+ dai_link->platform_of_node = dai_link->cpu_of_node;
+
+- /* DAI link name is created from CPU/CODEC dai name */
+- name = devm_kzalloc(dev,
+- strlen(dai_link->cpu_dai_name) +
+- strlen(dai_link->codec_dai_name) + 2,
+- GFP_KERNEL);
+- if (!name) {
+- ret = -ENOMEM;
+- goto dai_link_of_err;
+- }
+-
+- sprintf(name, "%s-%s", dai_link->cpu_dai_name,
+- dai_link->codec_dai_name);
++ snprintf(name, DAI_NAME_NUM, "%s.%s",
++ dai_link->dynamic ? "fe" : "be",
++ dai_link->dynamic ? dai_link->cpu_dai_name :
++ dai_link->codec_dai_name);
+ dai_link->name = dai_link->stream_name = name;
+ dai_link->ops = &rsrc_card_ops;
+ dai_link->init = rsrc_card_dai_init;
+--
+2.6.2
+
diff --git a/patches.renesas/0111-ASoC-rsrc-card-tidyup-priv-snd_card-setup-timing.patch b/patches.renesas/0111-ASoC-rsrc-card-tidyup-priv-snd_card-setup-timing.patch
new file mode 100644
index 00000000000000..34f2ff06fb890a
--- /dev/null
+++ b/patches.renesas/0111-ASoC-rsrc-card-tidyup-priv-snd_card-setup-timing.patch
@@ -0,0 +1,74 @@
+From c340e2e36415fb3cca8e0d03973f44c3f5b61bc5 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Mon, 15 Jun 2015 06:22:05 +0000
+Subject: [PATCH 111/129] ASoC: rsrc-card: tidyup priv->snd_card setup timing
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit 3c7e64dd89886af007cb0abbf4523253204c9079)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/rsrc-card.c | 24 ++++++++++--------------
+ 1 file changed, 10 insertions(+), 14 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/rsrc-card.c b/sound/soc/sh/rcar/rsrc-card.c
+index 9a1926f8d348..cdd005b82660 100644
+--- a/sound/soc/sh/rcar/rsrc-card.c
++++ b/sound/soc/sh/rcar/rsrc-card.c
+@@ -391,9 +391,9 @@ dai_link_of_err:
+ }
+
+ static int rsrc_card_parse_of(struct device_node *node,
+- struct rsrc_card_priv *priv)
++ struct rsrc_card_priv *priv,
++ struct device *dev)
+ {
+- struct device *dev = rsrc_priv_to_dev(priv);
+ const struct rsrc_card_of_data *of_data = rsrc_dev_to_of_data(dev);
+ int ret;
+ int i;
+@@ -404,7 +404,13 @@ static int rsrc_card_parse_of(struct device_node *node,
+ /* Parse the card name from DT */
+ snd_soc_of_parse_card_name(&priv->snd_card, "card-name");
+
+- /* DAPM routes */
++ /* Init snd_soc_card */
++ priv->snd_card.owner = THIS_MODULE;
++ priv->snd_card.dev = dev;
++ priv->snd_card.dai_link = priv->dai_link;
++ priv->snd_card.num_links = RSRC_FB_NUM;
++ priv->snd_card.codec_conf = &priv->codec_conf;
++ priv->snd_card.num_configs = 1;
+ priv->snd_card.of_dapm_routes = of_data->routes;
+ priv->snd_card.num_of_dapm_routes = of_data->num_routes;
+
+@@ -446,7 +452,6 @@ static int rsrc_card_unref(struct snd_soc_card *card)
+ static int rsrc_card_probe(struct platform_device *pdev)
+ {
+ struct rsrc_card_priv *priv;
+- struct snd_soc_dai_link *dai_link;
+ struct device_node *np = pdev->dev.of_node;
+ struct device *dev = &pdev->dev;
+ int ret;
+@@ -456,16 +461,7 @@ static int rsrc_card_probe(struct platform_device *pdev)
+ if (!priv)
+ return -ENOMEM;
+
+- /* Init snd_soc_card */
+- priv->snd_card.owner = THIS_MODULE;
+- priv->snd_card.dev = dev;
+- dai_link = priv->dai_link;
+- priv->snd_card.dai_link = dai_link;
+- priv->snd_card.num_links = RSRC_FB_NUM;
+- priv->snd_card.codec_conf = &priv->codec_conf;
+- priv->snd_card.num_configs = 1;
+-
+- ret = rsrc_card_parse_of(np, priv);
++ ret = rsrc_card_parse_of(np, priv, dev);
+ if (ret < 0) {
+ if (ret != -EPROBE_DEFER)
+ dev_err(dev, "parse error %d\n", ret);
+--
+2.6.2
+
diff --git a/patches.renesas/0112-ASoC-rsrc-card-enable-multi-cpu-codec-for-DPCM.patch b/patches.renesas/0112-ASoC-rsrc-card-enable-multi-cpu-codec-for-DPCM.patch
new file mode 100644
index 00000000000000..34dce581b15eea
--- /dev/null
+++ b/patches.renesas/0112-ASoC-rsrc-card-enable-multi-cpu-codec-for-DPCM.patch
@@ -0,0 +1,90 @@
+From aadde69240350f1272ef55c2d39c56e2a1443ff9 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Mon, 15 Jun 2015 06:22:30 +0000
+Subject: [PATCH 112/129] ASoC: rsrc-card: enable multi cpu/codec for DPCM
+
+Current rsrc-card is assuming 1 FE (= CPU), 1 BE (= codec) on card.
+But, it will support multi FE/BE card. This is prepare for it.
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit 3433bf0798356abf2e8b6145ac5633a610c0a8ec)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/rsrc-card.c | 25 +++++++++++++++++++------
+ 1 file changed, 19 insertions(+), 6 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/rsrc-card.c b/sound/soc/sh/rcar/rsrc-card.c
+index cdd005b82660..ae99b3612039 100644
+--- a/sound/soc/sh/rcar/rsrc-card.c
++++ b/sound/soc/sh/rcar/rsrc-card.c
+@@ -52,7 +52,6 @@ struct rsrc_card_dai {
+ struct clk *clk;
+ };
+
+-#define RSRC_FB_NUM 2 /* FE/BE */
+ #define IDX_CPU 0
+ #define IDX_CODEC 1
+ #define DAI_NAME_NUM 32
+@@ -62,9 +61,10 @@ struct rsrc_card_priv {
+ struct rsrc_card_dai cpu_dai;
+ struct rsrc_card_dai codec_dai;
+ char dai_name[DAI_NAME_NUM];
+- } dai_props[RSRC_FB_NUM];
++ } *dai_props;
+ struct snd_soc_codec_conf codec_conf;
+- struct snd_soc_dai_link dai_link[RSRC_FB_NUM];
++ struct snd_soc_dai_link *dai_link;
++ int dai_num;
+ u32 convert_rate;
+ };
+
+@@ -395,12 +395,25 @@ static int rsrc_card_parse_of(struct device_node *node,
+ struct device *dev)
+ {
+ const struct rsrc_card_of_data *of_data = rsrc_dev_to_of_data(dev);
++ struct rsrc_card_dai_props *props;
++ struct snd_soc_dai_link *links;
++
+ int ret;
+- int i;
++ int i, num;
+
+ if (!node)
+ return -EINVAL;
+
++ num = of_get_child_count(node);
++ props = devm_kzalloc(dev, sizeof(*props) * num, GFP_KERNEL);
++ links = devm_kzalloc(dev, sizeof(*links) * num, GFP_KERNEL);
++ if (!props || !links)
++ return -ENOMEM;
++
++ priv->dai_props = props;
++ priv->dai_link = links;
++ priv->dai_num = num;
++
+ /* Parse the card name from DT */
+ snd_soc_of_parse_card_name(&priv->snd_card, "card-name");
+
+@@ -408,7 +421,7 @@ static int rsrc_card_parse_of(struct device_node *node,
+ priv->snd_card.owner = THIS_MODULE;
+ priv->snd_card.dev = dev;
+ priv->snd_card.dai_link = priv->dai_link;
+- priv->snd_card.num_links = RSRC_FB_NUM;
++ priv->snd_card.num_links = num;
+ priv->snd_card.codec_conf = &priv->codec_conf;
+ priv->snd_card.num_configs = 1;
+ priv->snd_card.of_dapm_routes = of_data->routes;
+@@ -422,7 +435,7 @@ static int rsrc_card_parse_of(struct device_node *node,
+ priv->convert_rate);
+
+ /* FE/BE */
+- for (i = 0; i < RSRC_FB_NUM; i++) {
++ for (i = 0; i < num; i++) {
+ ret = rsrc_card_dai_link_of(node, priv, i);
+ if (ret < 0)
+ return ret;
+--
+2.6.2
+
diff --git a/patches.renesas/0113-ASoC-rsrc-card-remove-unused-name.patch b/patches.renesas/0113-ASoC-rsrc-card-remove-unused-name.patch
new file mode 100644
index 00000000000000..d4d118196c42c9
--- /dev/null
+++ b/patches.renesas/0113-ASoC-rsrc-card-remove-unused-name.patch
@@ -0,0 +1,29 @@
+From 84acb093618d83bf76268221e3b1ac5d5cfefc74 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Mon, 15 Jun 2015 06:22:47 +0000
+Subject: [PATCH 113/129] ASoC: rsrc-card: remove unused name
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit 1683e1a4135862c9837b768b1e2ab27623f2161a)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/rsrc-card.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/sound/soc/sh/rcar/rsrc-card.c b/sound/soc/sh/rcar/rsrc-card.c
+index ae99b3612039..8c74b089eb3c 100644
+--- a/sound/soc/sh/rcar/rsrc-card.c
++++ b/sound/soc/sh/rcar/rsrc-card.c
+@@ -46,7 +46,6 @@ static const struct of_device_id rsrc_card_of_match[] = {
+ MODULE_DEVICE_TABLE(of, rsrc_card_of_match);
+
+ struct rsrc_card_dai {
+- const char *name;
+ unsigned int fmt;
+ unsigned int sysclk;
+ struct clk *clk;
+--
+2.6.2
+
diff --git a/patches.renesas/0114-ASoC-rsnd-card-tidyup-rsrc_priv_to_.patch b/patches.renesas/0114-ASoC-rsnd-card-tidyup-rsrc_priv_to_.patch
new file mode 100644
index 00000000000000..967a8687bbfac1
--- /dev/null
+++ b/patches.renesas/0114-ASoC-rsnd-card-tidyup-rsrc_priv_to_.patch
@@ -0,0 +1,50 @@
+From be6d04c8886d5318b859e1d63d1dde20cb8bfc97 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Mon, 15 Jun 2015 06:23:08 +0000
+Subject: [PATCH 114/129] ASoC: rsnd-card: tidyup rsrc_priv_to_()
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit 8bd616c4f7717d8049276acc329bf5bd3988ac3b)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/rsrc-card.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/rsrc-card.c b/sound/soc/sh/rcar/rsrc-card.c
+index 8c74b089eb3c..8162b7d66c4d 100644
+--- a/sound/soc/sh/rcar/rsrc-card.c
++++ b/sound/soc/sh/rcar/rsrc-card.c
+@@ -68,8 +68,8 @@ struct rsrc_card_priv {
+ };
+
+ #define rsrc_priv_to_dev(priv) ((priv)->snd_card.dev)
+-#define rsrc_priv_to_link(priv, i) ((priv)->snd_card.dai_link + i)
+-#define rsrc_priv_to_props(priv, i) ((priv)->dai_props + i)
++#define rsrc_priv_to_link(priv, i) ((priv)->snd_card.dai_link + (i))
++#define rsrc_priv_to_props(priv, i) ((priv)->dai_props + (i))
+ #define rsrc_dev_to_of_data(dev) (of_match_device(rsrc_card_of_match, (dev))->data)
+
+ static int rsrc_card_startup(struct snd_pcm_substream *substream)
+@@ -77,7 +77,7 @@ static int rsrc_card_startup(struct snd_pcm_substream *substream)
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct rsrc_card_priv *priv = snd_soc_card_get_drvdata(rtd->card);
+ struct rsrc_card_dai_props *dai_props =
+- &priv->dai_props[rtd - rtd->card->rtd];
++ rsrc_priv_to_props(priv, rtd - rtd->card->rtd);
+ int ret;
+
+ ret = clk_prepare_enable(dai_props->cpu_dai.clk);
+@@ -96,7 +96,7 @@ static void rsrc_card_shutdown(struct snd_pcm_substream *substream)
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct rsrc_card_priv *priv = snd_soc_card_get_drvdata(rtd->card);
+ struct rsrc_card_dai_props *dai_props =
+- &priv->dai_props[rtd - rtd->card->rtd];
++ rsrc_priv_to_props(priv, rtd - rtd->card->rtd);
+
+ clk_disable_unprepare(dai_props->cpu_dai.clk);
+
+--
+2.6.2
+
diff --git a/patches.renesas/0115-ASoC-rsrc-card-move-rsrc_card_parse_daifmt-to-upper-.patch b/patches.renesas/0115-ASoC-rsrc-card-move-rsrc_card_parse_daifmt-to-upper-.patch
new file mode 100644
index 00000000000000..3abe98b91e2e27
--- /dev/null
+++ b/patches.renesas/0115-ASoC-rsrc-card-move-rsrc_card_parse_daifmt-to-upper-.patch
@@ -0,0 +1,108 @@
+From 997a8afcd940c4a487e1ba32852e4a56fb053507 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Mon, 15 Jun 2015 06:23:30 +0000
+Subject: [PATCH 115/129] ASoC: rsrc-card: move rsrc_card_parse_daifmt() to
+ upper side
+
+This is prepare for DPCM cleanup
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit fe3bd18432efd42642c77a1280a22551c6549040)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/rsrc-card.c | 70 +++++++++++++++++++++----------------------
+ 1 file changed, 35 insertions(+), 35 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/rsrc-card.c b/sound/soc/sh/rcar/rsrc-card.c
+index 8162b7d66c4d..d0d74b52eb1d 100644
+--- a/sound/soc/sh/rcar/rsrc-card.c
++++ b/sound/soc/sh/rcar/rsrc-card.c
+@@ -171,6 +171,41 @@ static int rsrc_card_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
+ return 0;
+ }
+
++static int rsrc_card_parse_daifmt(struct device_node *node,
++ struct rsrc_card_priv *priv,
++ struct device_node *codec,
++ int idx)
++{
++ struct device_node *bitclkmaster = NULL;
++ struct device_node *framemaster = NULL;
++ struct rsrc_card_dai_props *dai_props = rsrc_priv_to_props(priv, idx);
++ struct rsrc_card_dai *cpu_dai = &dai_props->cpu_dai;
++ struct rsrc_card_dai *codec_dai = &dai_props->codec_dai;
++ unsigned int daifmt;
++
++ daifmt = snd_soc_of_parse_daifmt(node, NULL,
++ &bitclkmaster, &framemaster);
++ daifmt &= ~SND_SOC_DAIFMT_MASTER_MASK;
++
++ if (!bitclkmaster && !framemaster)
++ return -EINVAL;
++
++ if (codec == bitclkmaster)
++ daifmt |= (codec == framemaster) ?
++ SND_SOC_DAIFMT_CBM_CFM : SND_SOC_DAIFMT_CBM_CFS;
++ else
++ daifmt |= (codec == framemaster) ?
++ SND_SOC_DAIFMT_CBS_CFM : SND_SOC_DAIFMT_CBS_CFS;
++
++ cpu_dai->fmt = daifmt;
++ codec_dai->fmt = daifmt;
++
++ of_node_put(bitclkmaster);
++ of_node_put(framemaster);
++
++ return 0;
++}
++
+ static int
+ rsrc_card_sub_parse_of(struct rsrc_card_priv *priv,
+ struct device_node *np,
+@@ -266,41 +301,6 @@ rsrc_card_sub_parse_of(struct rsrc_card_priv *priv,
+ return 0;
+ }
+
+-static int rsrc_card_parse_daifmt(struct device_node *node,
+- struct rsrc_card_priv *priv,
+- struct device_node *codec,
+- int idx)
+-{
+- struct device_node *bitclkmaster = NULL;
+- struct device_node *framemaster = NULL;
+- struct rsrc_card_dai_props *dai_props = rsrc_priv_to_props(priv, idx);
+- struct rsrc_card_dai *cpu_dai = &dai_props->cpu_dai;
+- struct rsrc_card_dai *codec_dai = &dai_props->codec_dai;
+- unsigned int daifmt;
+-
+- daifmt = snd_soc_of_parse_daifmt(node, NULL,
+- &bitclkmaster, &framemaster);
+- daifmt &= ~SND_SOC_DAIFMT_MASTER_MASK;
+-
+- if (!bitclkmaster && !framemaster)
+- return -EINVAL;
+-
+- if (codec == bitclkmaster)
+- daifmt |= (codec == framemaster) ?
+- SND_SOC_DAIFMT_CBM_CFM : SND_SOC_DAIFMT_CBM_CFS;
+- else
+- daifmt |= (codec == framemaster) ?
+- SND_SOC_DAIFMT_CBS_CFM : SND_SOC_DAIFMT_CBS_CFS;
+-
+- cpu_dai->fmt = daifmt;
+- codec_dai->fmt = daifmt;
+-
+- of_node_put(bitclkmaster);
+- of_node_put(framemaster);
+-
+- return 0;
+-}
+-
+ static int rsrc_card_dai_link_of(struct device_node *node,
+ struct rsrc_card_priv *priv,
+ int idx)
+--
+2.6.2
+
diff --git a/patches.renesas/0116-ASoC-rsrc-card-tidyup-return-value-of-clock-error.patch b/patches.renesas/0116-ASoC-rsrc-card-tidyup-return-value-of-clock-error.patch
new file mode 100644
index 00000000000000..cca8f2047e601f
--- /dev/null
+++ b/patches.renesas/0116-ASoC-rsrc-card-tidyup-return-value-of-clock-error.patch
@@ -0,0 +1,34 @@
+From 7a6d289a73c64caf9102dc92a01c6d371b67f8e7 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Mon, 15 Jun 2015 06:23:52 +0000
+Subject: [PATCH 116/129] ASoC: rsrc-card: tidyup return value of clock error
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit 061015f7bfe2e278243bcc9f04346cfc991a5342)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/rsrc-card.c | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/rsrc-card.c b/sound/soc/sh/rcar/rsrc-card.c
+index d0d74b52eb1d..52123d6ceec5 100644
+--- a/sound/soc/sh/rcar/rsrc-card.c
++++ b/sound/soc/sh/rcar/rsrc-card.c
+@@ -283,10 +283,8 @@ rsrc_card_sub_parse_of(struct rsrc_card_priv *priv,
+ */
+ if (of_property_read_bool(np, "clocks")) {
+ clk = of_clk_get(np, 0);
+- if (IS_ERR(clk)) {
+- ret = PTR_ERR(clk);
+- return ret;
+- }
++ if (IS_ERR(clk))
++ return PTR_ERR(clk);
+
+ dai->sysclk = clk_get_rate(clk);
+ dai->clk = clk;
+--
+2.6.2
+
diff --git a/patches.renesas/0117-ASoC-rsrc-card-cleanup-for-DPCM.patch b/patches.renesas/0117-ASoC-rsrc-card-cleanup-for-DPCM.patch
new file mode 100644
index 00000000000000..e40d0d6558c3a7
--- /dev/null
+++ b/patches.renesas/0117-ASoC-rsrc-card-cleanup-for-DPCM.patch
@@ -0,0 +1,513 @@
+From 67fba1e5a021d8830e07f94abc74fc04b1f39ee6 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Mon, 15 Jun 2015 06:24:15 +0000
+Subject: [PATCH 117/129] ASoC: rsrc-card: cleanup for DPCM
+
+rsrc-card driver is based on simple-card driver which is caring about
+CPU / Codec connection. OTOH, rsrc-card is used for DPCM system.
+FE portion is constituted by CPU and dummy Codec, and BE is constituted
+by dummy CPU and Codec in DPCM system.
+Because of this, current rsrc-card is doing pointless method. It works well
+if FE/BE was 1:1, but not good for multi FE/BE.
+This patch cleanups rsrc-card driver for DPCM. and this is prepare for
+MIX support for Renesas sound driver.
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit 047000278da3a17f8cfd9b2662b47500ee84338f)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/rsrc-card.c | 324 ++++++++++++++++++------------------------
+ 1 file changed, 135 insertions(+), 189 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/rsrc-card.c b/sound/soc/sh/rcar/rsrc-card.c
+index 52123d6ceec5..8caca2e180c3 100644
+--- a/sound/soc/sh/rcar/rsrc-card.c
++++ b/sound/soc/sh/rcar/rsrc-card.c
+@@ -45,23 +45,20 @@ static const struct of_device_id rsrc_card_of_match[] = {
+ };
+ MODULE_DEVICE_TABLE(of, rsrc_card_of_match);
+
++#define DAI_NAME_NUM 32
+ struct rsrc_card_dai {
+ unsigned int fmt;
+ unsigned int sysclk;
+ struct clk *clk;
++ char dai_name[DAI_NAME_NUM];
+ };
+
+ #define IDX_CPU 0
+ #define IDX_CODEC 1
+-#define DAI_NAME_NUM 32
+ struct rsrc_card_priv {
+ struct snd_soc_card snd_card;
+- struct rsrc_card_dai_props {
+- struct rsrc_card_dai cpu_dai;
+- struct rsrc_card_dai codec_dai;
+- char dai_name[DAI_NAME_NUM];
+- } *dai_props;
+ struct snd_soc_codec_conf codec_conf;
++ struct rsrc_card_dai *dai_props;
+ struct snd_soc_dai_link *dai_link;
+ int dai_num;
+ u32 convert_rate;
+@@ -76,31 +73,22 @@ static int rsrc_card_startup(struct snd_pcm_substream *substream)
+ {
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct rsrc_card_priv *priv = snd_soc_card_get_drvdata(rtd->card);
+- struct rsrc_card_dai_props *dai_props =
++ struct rsrc_card_dai *dai_props =
+ rsrc_priv_to_props(priv, rtd - rtd->card->rtd);
+ int ret;
+
+- ret = clk_prepare_enable(dai_props->cpu_dai.clk);
+- if (ret)
+- return ret;
+-
+- ret = clk_prepare_enable(dai_props->codec_dai.clk);
+- if (ret)
+- clk_disable_unprepare(dai_props->cpu_dai.clk);
+
+- return ret;
++ return clk_prepare_enable(dai_props->clk);
+ }
+
+ static void rsrc_card_shutdown(struct snd_pcm_substream *substream)
+ {
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct rsrc_card_priv *priv = snd_soc_card_get_drvdata(rtd->card);
+- struct rsrc_card_dai_props *dai_props =
++ struct rsrc_card_dai *dai_props =
+ rsrc_priv_to_props(priv, rtd - rtd->card->rtd);
+
+- clk_disable_unprepare(dai_props->cpu_dai.clk);
+-
+- clk_disable_unprepare(dai_props->codec_dai.clk);
++ clk_disable_unprepare(dai_props->clk);
+ }
+
+ static struct snd_soc_ops rsrc_card_ops = {
+@@ -108,21 +96,31 @@ static struct snd_soc_ops rsrc_card_ops = {
+ .shutdown = rsrc_card_shutdown,
+ };
+
+-static int __rsrc_card_dai_init(struct snd_soc_dai *dai,
+- struct rsrc_card_dai *set)
++static int rsrc_card_dai_init(struct snd_soc_pcm_runtime *rtd)
+ {
++ struct rsrc_card_priv *priv = snd_soc_card_get_drvdata(rtd->card);
++ struct snd_soc_dai *dai;
++ struct snd_soc_dai_link *dai_link;
++ struct rsrc_card_dai *dai_props;
++ int num = rtd - rtd->card->rtd;
+ int ret;
+
+- if (set->fmt) {
+- ret = snd_soc_dai_set_fmt(dai, set->fmt);
++ dai_link = rsrc_priv_to_link(priv, num);
++ dai_props = rsrc_priv_to_props(priv, num);
++ dai = dai_link->dynamic ?
++ rtd->cpu_dai :
++ rtd->codec_dai;
++
++ if (dai_props->fmt) {
++ ret = snd_soc_dai_set_fmt(dai, dai_props->fmt);
+ if (ret && ret != -ENOTSUPP) {
+ dev_err(dai->dev, "set_fmt error\n");
+ goto err;
+ }
+ }
+
+- if (set->sysclk) {
+- ret = snd_soc_dai_set_sysclk(dai, 0, set->sysclk, 0);
++ if (dai_props->sysclk) {
++ ret = snd_soc_dai_set_sysclk(dai, 0, dai_props->sysclk, 0);
+ if (ret && ret != -ENOTSUPP) {
+ dev_err(dai->dev, "set_sysclk error\n");
+ goto err;
+@@ -135,27 +133,6 @@ err:
+ return ret;
+ }
+
+-static int rsrc_card_dai_init(struct snd_soc_pcm_runtime *rtd)
+-{
+- struct rsrc_card_priv *priv = snd_soc_card_get_drvdata(rtd->card);
+- struct snd_soc_dai *codec = rtd->codec_dai;
+- struct snd_soc_dai *cpu = rtd->cpu_dai;
+- struct rsrc_card_dai_props *dai_props;
+- int num, ret;
+-
+- num = rtd - rtd->card->rtd;
+- dai_props = &priv->dai_props[num];
+- ret = __rsrc_card_dai_init(codec, &dai_props->codec_dai);
+- if (ret < 0)
+- return ret;
+-
+- ret = __rsrc_card_dai_init(cpu, &dai_props->cpu_dai);
+- if (ret < 0)
+- return ret;
+-
+- return 0;
+-}
+-
+ static int rsrc_card_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
+ struct snd_pcm_hw_params *params)
+ {
+@@ -172,15 +149,14 @@ static int rsrc_card_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
+ }
+
+ static int rsrc_card_parse_daifmt(struct device_node *node,
++ struct device_node *np,
+ struct rsrc_card_priv *priv,
+- struct device_node *codec,
+- int idx)
++ int idx, bool is_fe)
+ {
++ struct rsrc_card_dai *dai_props = rsrc_priv_to_props(priv, idx);
+ struct device_node *bitclkmaster = NULL;
+ struct device_node *framemaster = NULL;
+- struct rsrc_card_dai_props *dai_props = rsrc_priv_to_props(priv, idx);
+- struct rsrc_card_dai *cpu_dai = &dai_props->cpu_dai;
+- struct rsrc_card_dai *codec_dai = &dai_props->codec_dai;
++ struct device_node *codec = is_fe ? NULL : np;
+ unsigned int daifmt;
+
+ daifmt = snd_soc_of_parse_daifmt(node, NULL,
+@@ -197,8 +173,7 @@ static int rsrc_card_parse_daifmt(struct device_node *node,
+ daifmt |= (codec == framemaster) ?
+ SND_SOC_DAIFMT_CBS_CFM : SND_SOC_DAIFMT_CBS_CFS;
+
+- cpu_dai->fmt = daifmt;
+- codec_dai->fmt = daifmt;
++ dai_props->fmt = daifmt;
+
+ of_node_put(bitclkmaster);
+ of_node_put(framemaster);
+@@ -206,41 +181,15 @@ static int rsrc_card_parse_daifmt(struct device_node *node,
+ return 0;
+ }
+
+-static int
+-rsrc_card_sub_parse_of(struct rsrc_card_priv *priv,
+- struct device_node *np,
+- struct rsrc_card_dai *dai,
+- struct snd_soc_dai_link *dai_link,
+- int *args_count)
++static int rsrc_card_parse_links(struct device_node *np,
++ struct rsrc_card_priv *priv,
++ int idx, bool is_fe)
+ {
+- struct device *dev = rsrc_priv_to_dev(priv);
+- const struct rsrc_card_of_data *of_data = rsrc_dev_to_of_data(dev);
++ struct snd_soc_dai_link *dai_link = rsrc_priv_to_link(priv, idx);
++ struct rsrc_card_dai *dai_props = rsrc_priv_to_props(priv, idx);
+ struct of_phandle_args args;
+- struct device_node **p_node;
+- struct clk *clk;
+- const char **dai_name;
+- const char **name;
+- u32 val;
+ int ret;
+
+- if (args_count) {
+- p_node = &dai_link->cpu_of_node;
+- dai_name = &dai_link->cpu_dai_name;
+- name = &dai_link->cpu_name;
+- } else {
+- p_node = &dai_link->codec_of_node;
+- dai_name = &dai_link->codec_dai_name;
+- name = &dai_link->codec_name;
+- }
+-
+- if (!np) {
+- /* use snd-soc-dummy */
+- *p_node = NULL;
+- *dai_name = "snd-soc-dummy-dai";
+- *name = "snd-soc-dummy";
+- return 0;
+- }
+-
+ /*
+ * Get node via "sound-dai = <&phandle port>"
+ * it will be used as xxx_of_node on soc_bind_dai_link()
+@@ -250,31 +199,82 @@ rsrc_card_sub_parse_of(struct rsrc_card_priv *priv,
+ if (ret)
+ return ret;
+
+- *p_node = args.np;
++ if (is_fe) {
++ /* BE is dummy */
++ dai_link->codec_of_node = NULL;
++ dai_link->codec_dai_name = "snd-soc-dummy-dai";
++ dai_link->codec_name = "snd-soc-dummy";
++
++ /* FE settings */
++ dai_link->dynamic = 1;
++ dai_link->dpcm_merged_format = 1;
++ dai_link->cpu_of_node = args.np;
++ snd_soc_of_get_dai_name(np, &dai_link->cpu_dai_name);
++
++ /* set dai_name */
++ snprintf(dai_props->dai_name, DAI_NAME_NUM, "fe.%s",
++ dai_link->cpu_dai_name);
++
++ /*
++ * In soc_bind_dai_link() will check cpu name after
++ * of_node matching if dai_link has cpu_dai_name.
++ * but, it will never match if name was created by
++ * fmt_single_name() remove cpu_dai_name if cpu_args
++ * was 0. See:
++ * fmt_single_name()
++ * fmt_multiple_name()
++ */
++ if (!args.args_count)
++ dai_link->cpu_dai_name = NULL;
++ } else {
++ struct device *dev = rsrc_priv_to_dev(priv);
++ const struct rsrc_card_of_data *of_data;
+
+- /* Get dai->name */
+- ret = snd_soc_of_get_dai_name(np, dai_name);
+- if (ret < 0)
+- return ret;
++ of_data = rsrc_dev_to_of_data(dev);
+
+- /*
+- * FIXME
+- *
+- * rsrc assumes DPCM playback/capture
+- */
+- dai_link->dpcm_playback = 1;
+- dai_link->dpcm_capture = 1;
++ /* FE is dummy */
++ dai_link->cpu_of_node = NULL;
++ dai_link->cpu_dai_name = "snd-soc-dummy-dai";
++ dai_link->cpu_name = "snd-soc-dummy";
+
+- if (args_count) {
+- *args_count = args.args_count;
+- dai_link->dynamic = 1;
+- dai_link->dpcm_merged_format = 1;
+- } else {
+- dai_link->no_pcm = 1;
+- priv->codec_conf.of_node = (*p_node);
+- priv->codec_conf.name_prefix = of_data->prefix;
++ /* BE settings */
++ dai_link->no_pcm = 1;
++ dai_link->be_hw_params_fixup = rsrc_card_be_hw_params_fixup;
++ dai_link->codec_of_node = args.np;
++ snd_soc_of_get_dai_name(np, &dai_link->codec_dai_name);
++
++ /* additional name prefix */
++ priv->codec_conf.of_node = dai_link->codec_of_node;
++ priv->codec_conf.name_prefix = of_data->prefix;
++
++ /* set dai_name */
++ snprintf(dai_props->dai_name, DAI_NAME_NUM, "be.%s",
++ dai_link->codec_dai_name);
+ }
+
++ /* Simple Card assumes platform == cpu */
++ dai_link->platform_of_node = dai_link->cpu_of_node;
++ dai_link->dpcm_playback = 1;
++ dai_link->dpcm_capture = 1;
++ dai_link->name = dai_props->dai_name;
++ dai_link->stream_name = dai_props->dai_name;
++ dai_link->ops = &rsrc_card_ops;
++ dai_link->init = rsrc_card_dai_init;
++
++ return 0;
++}
++
++static int rsrc_card_parse_clk(struct device_node *np,
++ struct rsrc_card_priv *priv,
++ int idx, bool is_fe)
++{
++ struct snd_soc_dai_link *dai_link = rsrc_priv_to_link(priv, idx);
++ struct rsrc_card_dai *dai_props = rsrc_priv_to_props(priv, idx);
++ struct clk *clk;
++ struct device_node *of_np = is_fe ? dai_link->cpu_of_node :
++ dai_link->codec_of_node;
++ u32 val;
++
+ /*
+ * Parse dai->sysclk come from "clocks = <&xxx>"
+ * (if system has common clock)
+@@ -286,103 +286,48 @@ rsrc_card_sub_parse_of(struct rsrc_card_priv *priv,
+ if (IS_ERR(clk))
+ return PTR_ERR(clk);
+
+- dai->sysclk = clk_get_rate(clk);
+- dai->clk = clk;
++ dai_props->sysclk = clk_get_rate(clk);
++ dai_props->clk = clk;
+ } else if (!of_property_read_u32(np, "system-clock-frequency", &val)) {
+- dai->sysclk = val;
++ dai_props->sysclk = val;
+ } else {
+- clk = of_clk_get(args.np, 0);
++ clk = of_clk_get(of_np, 0);
+ if (!IS_ERR(clk))
+- dai->sysclk = clk_get_rate(clk);
++ dai_props->sysclk = clk_get_rate(clk);
+ }
+
+ return 0;
+ }
+
+ static int rsrc_card_dai_link_of(struct device_node *node,
++ struct device_node *np,
+ struct rsrc_card_priv *priv,
+ int idx)
+ {
+ struct device *dev = rsrc_priv_to_dev(priv);
+- struct snd_soc_dai_link *dai_link = rsrc_priv_to_link(priv, idx);
+- struct rsrc_card_dai_props *dai_props = rsrc_priv_to_props(priv, idx);
+- struct device_node *cpu = NULL;
+- struct device_node *codec = NULL;
+- char *name = dai_props->dai_name;
+- char prop[128];
+- int ret, cpu_args;
+-
+- cpu = of_get_child_by_name(node, "cpu");
+- codec = of_get_child_by_name(node, "codec");
+-
+- if (!cpu || !codec) {
+- ret = -EINVAL;
+- dev_err(dev, "%s: Can't find %s DT node\n", __func__, prop);
+- goto dai_link_of_err;
+- }
++ struct rsrc_card_dai *dai_props = rsrc_priv_to_props(priv, idx);
++ bool is_fe = false;
++ int ret;
+
+- ret = rsrc_card_parse_daifmt(node, priv, codec, idx);
+- if (ret < 0)
+- goto dai_link_of_err;
++ if (0 == strcmp(np->name, "cpu"))
++ is_fe = true;
+
+- ret = rsrc_card_sub_parse_of(priv, (idx == IDX_CPU) ? cpu : NULL,
+- &dai_props->cpu_dai,
+- dai_link,
+- &cpu_args);
++ ret = rsrc_card_parse_daifmt(node, np, priv, idx, is_fe);
+ if (ret < 0)
+- goto dai_link_of_err;
++ return ret;
+
+- ret = rsrc_card_sub_parse_of(priv, (idx == IDX_CODEC) ? codec : NULL,
+- &dai_props->codec_dai,
+- dai_link,
+- NULL);
++ ret = rsrc_card_parse_links(np, priv, idx, is_fe);
+ if (ret < 0)
+- goto dai_link_of_err;
+-
+- if (!dai_link->cpu_dai_name || !dai_link->codec_dai_name) {
+- ret = -EINVAL;
+- goto dai_link_of_err;
+- }
+-
+- /* Simple Card assumes platform == cpu */
+- dai_link->platform_of_node = dai_link->cpu_of_node;
+-
+- snprintf(name, DAI_NAME_NUM, "%s.%s",
+- dai_link->dynamic ? "fe" : "be",
+- dai_link->dynamic ? dai_link->cpu_dai_name :
+- dai_link->codec_dai_name);
+- dai_link->name = dai_link->stream_name = name;
+- dai_link->ops = &rsrc_card_ops;
+- dai_link->init = rsrc_card_dai_init;
+-
+- if (idx == IDX_CODEC)
+- dai_link->be_hw_params_fixup = rsrc_card_be_hw_params_fixup;
+-
+- dev_dbg(dev, "\tname : %s\n", dai_link->stream_name);
+- dev_dbg(dev, "\tcpu : %s / %04x / %d\n",
+- dai_link->cpu_dai_name,
+- dai_props->cpu_dai.fmt,
+- dai_props->cpu_dai.sysclk);
+- dev_dbg(dev, "\tcodec : %s / %04x / %d\n",
+- dai_link->codec_dai_name,
+- dai_props->codec_dai.fmt,
+- dai_props->codec_dai.sysclk);
++ return ret;
+
+- /*
+- * In soc_bind_dai_link() will check cpu name after
+- * of_node matching if dai_link has cpu_dai_name.
+- * but, it will never match if name was created by
+- * fmt_single_name() remove cpu_dai_name if cpu_args
+- * was 0. See:
+- * fmt_single_name()
+- * fmt_multiple_name()
+- */
+- if (!cpu_args)
+- dai_link->cpu_dai_name = NULL;
++ ret = rsrc_card_parse_clk(np, priv, idx, is_fe);
++ if (ret < 0)
++ return ret;
+
+-dai_link_of_err:
+- of_node_put(cpu);
+- of_node_put(codec);
++ dev_dbg(dev, "\t%s / %04x / %d\n",
++ dai_props->dai_name,
++ dai_props->fmt,
++ dai_props->sysclk);
+
+ return ret;
+ }
+@@ -392,9 +337,9 @@ static int rsrc_card_parse_of(struct device_node *node,
+ struct device *dev)
+ {
+ const struct rsrc_card_of_data *of_data = rsrc_dev_to_of_data(dev);
+- struct rsrc_card_dai_props *props;
++ struct rsrc_card_dai *props;
+ struct snd_soc_dai_link *links;
+-
++ struct device_node *np;
+ int ret;
+ int i, num;
+
+@@ -411,9 +356,6 @@ static int rsrc_card_parse_of(struct device_node *node,
+ priv->dai_link = links;
+ priv->dai_num = num;
+
+- /* Parse the card name from DT */
+- snd_soc_of_parse_card_name(&priv->snd_card, "card-name");
+-
+ /* Init snd_soc_card */
+ priv->snd_card.owner = THIS_MODULE;
+ priv->snd_card.dev = dev;
+@@ -424,6 +366,9 @@ static int rsrc_card_parse_of(struct device_node *node,
+ priv->snd_card.of_dapm_routes = of_data->routes;
+ priv->snd_card.num_of_dapm_routes = of_data->num_routes;
+
++ /* Parse the card name from DT */
++ snd_soc_of_parse_card_name(&priv->snd_card, "card-name");
++
+ /* sampling rate convert */
+ of_property_read_u32(node, "convert-rate", &priv->convert_rate);
+
+@@ -431,11 +376,12 @@ static int rsrc_card_parse_of(struct device_node *node,
+ priv->snd_card.name ? priv->snd_card.name : "",
+ priv->convert_rate);
+
+- /* FE/BE */
+- for (i = 0; i < num; i++) {
+- ret = rsrc_card_dai_link_of(node, priv, i);
++ i = 0;
++ for_each_child_of_node(node, np) {
++ ret = rsrc_card_dai_link_of(node, np, priv, i);
+ if (ret < 0)
+ return ret;
++ i++;
+ }
+
+ if (!priv->snd_card.name)
+--
+2.6.2
+
diff --git a/patches.renesas/0118-ASoC-rsnd-count-each-mod-SSI-SRC-DVC.patch b/patches.renesas/0118-ASoC-rsnd-count-each-mod-SSI-SRC-DVC.patch
new file mode 100644
index 00000000000000..8ebc0db1532e0e
--- /dev/null
+++ b/patches.renesas/0118-ASoC-rsnd-count-each-mod-SSI-SRC-DVC.patch
@@ -0,0 +1,109 @@
+From 48830323ccd0e2f6862a7036d3e7950b71c66a91 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Mon, 15 Jun 2015 06:24:34 +0000
+Subject: [PATCH 118/129] ASoC: rsnd: count each mod (SSI/SRC/DVC)
+
+Each Renesas sound mod (= SSI/SRC/DVC) might be called from many paths
+if it supports MIXer. Then, we don't need to re-call each mod function
+that had been called. This patch count each mod status.
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit 5451ea443bf8889a786ea394ac90a3de5af53e24)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/core.c | 17 +++++++++++------
+ sound/soc/sh/rcar/rsnd.h | 41 ++++++++++++++++++++++++++---------------
+ 2 files changed, 37 insertions(+), 21 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
+index 027b04392674..50ec28c24867 100644
+--- a/sound/soc/sh/rcar/core.c
++++ b/sound/soc/sh/rcar/core.c
+@@ -211,15 +211,20 @@ u32 rsnd_get_adinr(struct rsnd_mod *mod)
+ ({ \
+ struct rsnd_priv *priv = rsnd_mod_to_priv(mod); \
+ struct device *dev = rsnd_priv_to_dev(priv); \
+- u32 mask = (1 << __rsnd_mod_shift_##func) & ~(1 << 31); \
+- u32 call = __rsnd_mod_call_##func << __rsnd_mod_shift_##func; \
++ u32 mask = 0xF << __rsnd_mod_shift_##func; \
++ u8 val = (mod->status >> __rsnd_mod_shift_##func) & 0xF; \
++ u8 add = ((val + __rsnd_mod_add_##func) & 0xF); \
+ int ret = 0; \
+- if ((mod->status & mask) == call) { \
+- dev_dbg(dev, "%s[%d] %s\n", \
+- rsnd_mod_name(mod), rsnd_mod_id(mod), #func); \
++ int called = 0; \
++ if (val == __rsnd_mod_call_##func) { \
++ called = 1; \
+ ret = (mod)->ops->func(mod, param); \
+- mod->status = (mod->status & ~mask) | (~call & mask); \
++ mod->status = (mod->status & ~mask) + \
++ (add << __rsnd_mod_shift_##func); \
+ } \
++ dev_dbg(dev, "%s[%d] 0x%08x %s\n", \
++ rsnd_mod_name(mod), rsnd_mod_id(mod), mod->status, \
++ called ? #func : ""); \
+ ret; \
+ })
+
+diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
+index e37234ea18e6..8a114cb41925 100644
+--- a/sound/soc/sh/rcar/rsnd.h
++++ b/sound/soc/sh/rcar/rsnd.h
+@@ -259,25 +259,36 @@ struct rsnd_mod {
+ /*
+ * status
+ *
+- * bit
+- * 0 0: probe 1: remove
+- * 1 0: init 1: quit
+- * 2 0: start 1: stop
+- * 3 0: pcm_new
+- * 4 0: fallback
++ * 0xH0000CBA
+ *
+- * 31 bit is always called (see __rsnd_mod_call)
+- * 31 0: hw_params
++ * A 0: probe 1: remove
++ * B 0: init 1: quit
++ * C 0: start 1: stop
++ *
++ * H is always called (see __rsnd_mod_call)
++ * H 0: pcm_new
++ * H 0: fallback
++ * H 0: hw_params
+ */
+ #define __rsnd_mod_shift_probe 0
+ #define __rsnd_mod_shift_remove 0
+-#define __rsnd_mod_shift_init 1
+-#define __rsnd_mod_shift_quit 1
+-#define __rsnd_mod_shift_start 2
+-#define __rsnd_mod_shift_stop 2
+-#define __rsnd_mod_shift_pcm_new 3
+-#define __rsnd_mod_shift_fallback 4
+-#define __rsnd_mod_shift_hw_params 31 /* always called */
++#define __rsnd_mod_shift_init 4
++#define __rsnd_mod_shift_quit 4
++#define __rsnd_mod_shift_start 8
++#define __rsnd_mod_shift_stop 8
++#define __rsnd_mod_shift_pcm_new 28 /* always called */
++#define __rsnd_mod_shift_fallback 28 /* always called */
++#define __rsnd_mod_shift_hw_params 28 /* always called */
++
++#define __rsnd_mod_add_probe 1
++#define __rsnd_mod_add_remove -1
++#define __rsnd_mod_add_init 1
++#define __rsnd_mod_add_quit -1
++#define __rsnd_mod_add_start 1
++#define __rsnd_mod_add_stop -1
++#define __rsnd_mod_add_pcm_new 0
++#define __rsnd_mod_add_fallback 0
++#define __rsnd_mod_add_hw_params 0
+
+ #define __rsnd_mod_call_probe 0
+ #define __rsnd_mod_call_remove 1
+--
+2.6.2
+
diff --git a/patches.renesas/0119-ASoC-rsnd-rsnd_mod-has-rsnd_priv.patch b/patches.renesas/0119-ASoC-rsnd-rsnd_mod-has-rsnd_priv.patch
new file mode 100644
index 00000000000000..d439f8da9fef4b
--- /dev/null
+++ b/patches.renesas/0119-ASoC-rsnd-rsnd_mod-has-rsnd_priv.patch
@@ -0,0 +1,119 @@
+From 2c93de8545b2a79eef277fde52032711cd589781 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Mon, 15 Jun 2015 06:24:54 +0000
+Subject: [PATCH 119/129] ASoC: rsnd: rsnd_mod has rsnd_priv
+
+Each Renesas sound mod (= SSI/SRC/DVC) might be called from many paths
+if it supports MIXer. In such case, mod <-> io is no longer 1:1
+relationship. This means we can't use rsnd_mod_to_io() in SSI/SRC/DMA
+interrupt handler. In such case, we need to check all io in interrupt
+handler, and then, "priv" is needed.
+This patch adds rsnd_priv pointer in rsnd_mod for prepare it.
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit 2099bc8eb0b257196a8535fba343cb23a8a6807c)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/core.c | 4 +++-
+ sound/soc/sh/rcar/dvc.c | 2 +-
+ sound/soc/sh/rcar/rsnd.h | 6 ++++--
+ sound/soc/sh/rcar/src.c | 2 +-
+ sound/soc/sh/rcar/ssi.c | 2 +-
+ 5 files changed, 10 insertions(+), 6 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
+index 50ec28c24867..1e8d7e59998c 100644
+--- a/sound/soc/sh/rcar/core.c
++++ b/sound/soc/sh/rcar/core.c
+@@ -145,7 +145,8 @@ struct dma_chan *rsnd_mod_dma_req(struct rsnd_mod *mod)
+ return mod->ops->dma_req(mod);
+ }
+
+-int rsnd_mod_init(struct rsnd_mod *mod,
++int rsnd_mod_init(struct rsnd_priv *priv,
++ struct rsnd_mod *mod,
+ struct rsnd_mod_ops *ops,
+ struct clk *clk,
+ enum rsnd_mod_type type,
+@@ -160,6 +161,7 @@ int rsnd_mod_init(struct rsnd_mod *mod,
+ mod->ops = ops;
+ mod->type = type;
+ mod->clk = clk;
++ mod->priv = priv;
+
+ return ret;
+ }
+diff --git a/sound/soc/sh/rcar/dvc.c b/sound/soc/sh/rcar/dvc.c
+index e5fcb062ad77..2004bd00786b 100644
+--- a/sound/soc/sh/rcar/dvc.c
++++ b/sound/soc/sh/rcar/dvc.c
+@@ -366,7 +366,7 @@ int rsnd_dvc_probe(struct platform_device *pdev,
+
+ dvc->info = &info->dvc_info[i];
+
+- ret = rsnd_mod_init(&dvc->mod, &rsnd_dvc_ops,
++ ret = rsnd_mod_init(priv, &dvc->mod, &rsnd_dvc_ops,
+ clk, RSND_MOD_DVC, i);
+ if (ret)
+ return ret;
+diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
+index 8a114cb41925..4561b97d8834 100644
+--- a/sound/soc/sh/rcar/rsnd.h
++++ b/sound/soc/sh/rcar/rsnd.h
+@@ -253,6 +253,7 @@ struct rsnd_mod {
+ struct rsnd_mod_ops *ops;
+ struct rsnd_dma dma;
+ struct rsnd_dai_stream *io;
++ struct rsnd_priv *priv;
+ struct clk *clk;
+ u32 status;
+ };
+@@ -300,14 +301,15 @@ struct rsnd_mod {
+ #define __rsnd_mod_call_fallback 0
+ #define __rsnd_mod_call_hw_params 0
+
+-#define rsnd_mod_to_priv(mod) (rsnd_io_to_priv(rsnd_mod_to_io(mod)))
++#define rsnd_mod_to_priv(mod) ((mod)->priv)
+ #define rsnd_mod_to_dma(mod) (&(mod)->dma)
+ #define rsnd_mod_to_io(mod) ((mod)->io)
+ #define rsnd_mod_id(mod) ((mod)->id)
+ #define rsnd_mod_hw_start(mod) clk_enable((mod)->clk)
+ #define rsnd_mod_hw_stop(mod) clk_disable((mod)->clk)
+
+-int rsnd_mod_init(struct rsnd_mod *mod,
++int rsnd_mod_init(struct rsnd_priv *priv,
++ struct rsnd_mod *mod,
+ struct rsnd_mod_ops *ops,
+ struct clk *clk,
+ enum rsnd_mod_type type,
+diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c
+index fbe9166e26d1..316d139b7176 100644
+--- a/sound/soc/sh/rcar/src.c
++++ b/sound/soc/sh/rcar/src.c
+@@ -1046,7 +1046,7 @@ int rsnd_src_probe(struct platform_device *pdev,
+
+ src->info = &info->src_info[i];
+
+- ret = rsnd_mod_init(&src->mod, ops, clk, RSND_MOD_SRC, i);
++ ret = rsnd_mod_init(priv, &src->mod, ops, clk, RSND_MOD_SRC, i);
+ if (ret)
+ return ret;
+ }
+diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
+index 25483211a349..16ced762aa0c 100644
+--- a/sound/soc/sh/rcar/ssi.c
++++ b/sound/soc/sh/rcar/ssi.c
+@@ -782,7 +782,7 @@ int rsnd_ssi_probe(struct platform_device *pdev,
+ else if (rsnd_ssi_pio_available(ssi))
+ ops = &rsnd_ssi_pio_ops;
+
+- ret = rsnd_mod_init(&ssi->mod, ops, clk, RSND_MOD_SSI, i);
++ ret = rsnd_mod_init(priv, &ssi->mod, ops, clk, RSND_MOD_SSI, i);
+ if (ret)
+ return ret;
+
+--
+2.6.2
+
diff --git a/patches.renesas/0120-ASoC-rsnd-adds-struct-rsnd_dai_stream-as-on-each-fuc.patch b/patches.renesas/0120-ASoC-rsnd-adds-struct-rsnd_dai_stream-as-on-each-fuc.patch
new file mode 100644
index 00000000000000..3d853a6b143d1d
--- /dev/null
+++ b/patches.renesas/0120-ASoC-rsnd-adds-struct-rsnd_dai_stream-as-on-each-fuc.patch
@@ -0,0 +1,396 @@
+From 89f7d62859f54a84b823493e99ac21fae728ab3c Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Mon, 15 Jun 2015 06:25:20 +0000
+Subject: [PATCH 120/129] ASoC: rsnd: adds struct rsnd_dai_stream as on each
+ fuction as parameter
+
+Each Renesas sound mod (= SSI/SRC/DVC) might be called from many paths
+if it supports MIXer. In such case, mod <-> io is no longer 1:1
+relationship. This means we can't call rsnd_mod_to_io() any more.
+This patch adds struct rsnd_dai_stream to each function as parameter.
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit 2c0fac19de2cd74181122f7e62f4ebffdd6f8fa3)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/core.c | 10 +++++-----
+ sound/soc/sh/rcar/dvc.c | 8 ++++++--
+ sound/soc/sh/rcar/rsnd.h | 9 +++++++++
+ sound/soc/sh/rcar/src.c | 12 +++++++++++-
+ sound/soc/sh/rcar/ssi.c | 24 +++++++++++++++++-------
+ 5 files changed, 48 insertions(+), 15 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
+index 1e8d7e59998c..54297d74ea1f 100644
+--- a/sound/soc/sh/rcar/core.c
++++ b/sound/soc/sh/rcar/core.c
+@@ -209,7 +209,7 @@ u32 rsnd_get_adinr(struct rsnd_mod *mod)
+ /*
+ * rsnd_dai functions
+ */
+-#define __rsnd_mod_call(mod, func, param...) \
++#define __rsnd_mod_call(mod, io, func, param...) \
+ ({ \
+ struct rsnd_priv *priv = rsnd_mod_to_priv(mod); \
+ struct device *dev = rsnd_priv_to_dev(priv); \
+@@ -220,7 +220,7 @@ u32 rsnd_get_adinr(struct rsnd_mod *mod)
+ int called = 0; \
+ if (val == __rsnd_mod_call_##func) { \
+ called = 1; \
+- ret = (mod)->ops->func(mod, param); \
++ ret = (mod)->ops->func(mod, io, param); \
+ mod->status = (mod->status & ~mask) + \
+ (add << __rsnd_mod_shift_##func); \
+ } \
+@@ -230,10 +230,10 @@ u32 rsnd_get_adinr(struct rsnd_mod *mod)
+ ret; \
+ })
+
+-#define rsnd_mod_call(mod, func, param...) \
++#define rsnd_mod_call(mod, io, func, param...) \
+ (!(mod) ? -ENODEV : \
+ !((mod)->ops->func) ? 0 : \
+- __rsnd_mod_call(mod, func, param))
++ __rsnd_mod_call(mod, io, func, param))
+
+ #define rsnd_dai_call(fn, io, param...) \
+ ({ \
+@@ -243,7 +243,7 @@ u32 rsnd_get_adinr(struct rsnd_mod *mod)
+ mod = (io)->mod[i]; \
+ if (!mod) \
+ continue; \
+- ret = rsnd_mod_call(mod, fn, param); \
++ ret = rsnd_mod_call(mod, io, fn, param); \
+ if (ret < 0) \
+ break; \
+ } \
+diff --git a/sound/soc/sh/rcar/dvc.c b/sound/soc/sh/rcar/dvc.c
+index 2004bd00786b..52e75ebeb5b8 100644
+--- a/sound/soc/sh/rcar/dvc.c
++++ b/sound/soc/sh/rcar/dvc.c
+@@ -120,6 +120,7 @@ static void rsnd_dvc_volume_update(struct rsnd_mod *mod)
+ }
+
+ static int rsnd_dvc_remove_gen2(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ struct rsnd_dvc *dvc = rsnd_mod_to_dvc(mod);
+@@ -134,9 +135,9 @@ static int rsnd_dvc_remove_gen2(struct rsnd_mod *mod,
+ }
+
+ static int rsnd_dvc_init(struct rsnd_mod *dvc_mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(dvc_mod);
+ struct rsnd_mod *src_mod = rsnd_io_to_mod_src(io);
+ struct device *dev = rsnd_priv_to_dev(priv);
+ int dvc_id = rsnd_mod_id(dvc_mod);
+@@ -181,6 +182,7 @@ static int rsnd_dvc_init(struct rsnd_mod *dvc_mod,
+ }
+
+ static int rsnd_dvc_quit(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ rsnd_mod_hw_stop(mod);
+@@ -189,6 +191,7 @@ static int rsnd_dvc_quit(struct rsnd_mod *mod,
+ }
+
+ static int rsnd_dvc_start(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ rsnd_mod_write(mod, CMD_CTRL, 0x10);
+@@ -197,6 +200,7 @@ static int rsnd_dvc_start(struct rsnd_mod *mod,
+ }
+
+ static int rsnd_dvc_stop(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ rsnd_mod_write(mod, CMD_CTRL, 0);
+@@ -205,9 +209,9 @@ static int rsnd_dvc_stop(struct rsnd_mod *mod,
+ }
+
+ static int rsnd_dvc_pcm_new(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct snd_soc_pcm_runtime *rtd)
+ {
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ struct rsnd_dvc *dvc = rsnd_mod_to_dvc(mod);
+ int is_play = rsnd_io_is_play(io);
+ int ret;
+diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
+index 4561b97d8834..fd93a6a25749 100644
+--- a/sound/soc/sh/rcar/rsnd.h
++++ b/sound/soc/sh/rcar/rsnd.h
+@@ -226,23 +226,32 @@ struct rsnd_mod_ops {
+ char *name;
+ struct dma_chan* (*dma_req)(struct rsnd_mod *mod);
+ int (*probe)(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv);
+ int (*remove)(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv);
+ int (*init)(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv);
+ int (*quit)(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv);
+ int (*start)(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv);
+ int (*stop)(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv);
+ int (*pcm_new)(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct snd_soc_pcm_runtime *rtd);
+ int (*hw_params)(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct snd_pcm_substream *substream,
+ struct snd_pcm_hw_params *hw_params);
+ int (*fallback)(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv);
+ };
+
+diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c
+index 316d139b7176..e28d9f6ddda6 100644
+--- a/sound/soc/sh/rcar/src.c
++++ b/sound/soc/sh/rcar/src.c
+@@ -316,6 +316,7 @@ static int rsnd_src_set_convert_rate(struct rsnd_mod *mod)
+ }
+
+ static int rsnd_src_hw_params(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct snd_pcm_substream *substream,
+ struct snd_pcm_hw_params *fe_params)
+ {
+@@ -372,6 +373,7 @@ static int rsnd_src_init(struct rsnd_mod *mod,
+ }
+
+ static int rsnd_src_quit(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ struct rsnd_src *src = rsnd_mod_to_src(mod);
+@@ -532,6 +534,7 @@ static int rsnd_src_set_convert_rate_gen1(struct rsnd_mod *mod)
+ }
+
+ static int rsnd_src_init_gen1(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ int ret;
+@@ -556,6 +559,7 @@ static int rsnd_src_init_gen1(struct rsnd_mod *mod,
+ }
+
+ static int rsnd_src_start_gen1(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ int id = rsnd_mod_id(mod);
+@@ -566,6 +570,7 @@ static int rsnd_src_start_gen1(struct rsnd_mod *mod,
+ }
+
+ static int rsnd_src_stop_gen1(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ int id = rsnd_mod_id(mod);
+@@ -781,6 +786,7 @@ static int rsnd_src_set_convert_timing_gen2(struct rsnd_mod *mod)
+ }
+
+ static int rsnd_src_probe_gen2(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ struct rsnd_src *src = rsnd_mod_to_src(mod);
+@@ -810,6 +816,7 @@ static int rsnd_src_probe_gen2(struct rsnd_mod *mod,
+ }
+
+ static int rsnd_src_remove_gen2(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ rsnd_dma_quit(rsnd_mod_to_dma(mod));
+@@ -818,6 +825,7 @@ static int rsnd_src_remove_gen2(struct rsnd_mod *mod,
+ }
+
+ static int rsnd_src_init_gen2(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ int ret;
+@@ -838,6 +846,7 @@ static int rsnd_src_init_gen2(struct rsnd_mod *mod,
+ }
+
+ static int rsnd_src_start_gen2(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ rsnd_dma_start(rsnd_mod_to_dma(mod));
+@@ -846,6 +855,7 @@ static int rsnd_src_start_gen2(struct rsnd_mod *mod,
+ }
+
+ static int rsnd_src_stop_gen2(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ int ret;
+@@ -878,10 +888,10 @@ static void rsnd_src_reconvert_update(struct rsnd_mod *mod)
+ }
+
+ static int rsnd_src_pcm_new(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct snd_soc_pcm_runtime *rtd)
+ {
+ struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
+ struct rsnd_src *src = rsnd_mod_to_src(mod);
+ int ret;
+diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
+index 16ced762aa0c..41ef475c4a57 100644
+--- a/sound/soc/sh/rcar/ssi.c
++++ b/sound/soc/sh/rcar/ssi.c
+@@ -281,10 +281,10 @@ static void rsnd_ssi_hw_stop(struct rsnd_ssi *ssi)
+ * SSI mod common functions
+ */
+ static int rsnd_ssi_init(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
+ struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
+ u32 cr;
+@@ -332,6 +332,7 @@ static int rsnd_ssi_init(struct rsnd_mod *mod,
+ }
+
+ static int rsnd_ssi_quit(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
+@@ -348,6 +349,7 @@ static int rsnd_ssi_quit(struct rsnd_mod *mod,
+ }
+
+ static int rsnd_ssi_hw_params(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct snd_pcm_substream *substream,
+ struct snd_pcm_hw_params *params)
+ {
+@@ -371,7 +373,8 @@ static int rsnd_ssi_hw_params(struct rsnd_mod *mod,
+ /* It will be removed on rsnd_ssi_hw_stop */
+ ssi->chan = chan;
+ if (ssi_parent)
+- return rsnd_ssi_hw_params(&ssi_parent->mod, substream, params);
++ return rsnd_ssi_hw_params(&ssi_parent->mod, io,
++ substream, params);
+
+ return 0;
+ }
+@@ -388,10 +391,10 @@ static void rsnd_ssi_record_error(struct rsnd_ssi *ssi, u32 status)
+ }
+
+ static int rsnd_ssi_start(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+
+ rsnd_src_ssiu_start(mod, rsnd_ssi_use_busif(mod));
+
+@@ -403,6 +406,7 @@ static int rsnd_ssi_start(struct rsnd_mod *mod,
+ }
+
+ static int rsnd_ssi_stop(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
+@@ -465,9 +469,9 @@ static irqreturn_t rsnd_ssi_interrupt(int irq, void *data)
+ dev_dbg(dev, "%s[%d] restart\n",
+ rsnd_mod_name(mod), rsnd_mod_id(mod));
+
+- rsnd_ssi_stop(mod, priv);
++ rsnd_ssi_stop(mod, io, priv);
+ if (ssi->err < 1024)
+- rsnd_ssi_start(mod, priv);
++ rsnd_ssi_start(mod, io, priv);
+ else
+ dev_warn(dev, "no more SSI restart\n");
+ }
+@@ -487,6 +491,7 @@ rsnd_ssi_interrupt_out:
+ * SSI PIO
+ */
+ static int rsnd_ssi_pio_probe(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ struct device *dev = rsnd_priv_to_dev(priv);
+@@ -512,6 +517,7 @@ static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
+ };
+
+ static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
+@@ -534,6 +540,7 @@ static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
+ }
+
+ static int rsnd_ssi_dma_remove(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
+@@ -549,6 +556,7 @@ static int rsnd_ssi_dma_remove(struct rsnd_mod *mod,
+ }
+
+ static int rsnd_ssi_fallback(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ struct device *dev = rsnd_priv_to_dev(priv);
+@@ -569,23 +577,25 @@ static int rsnd_ssi_fallback(struct rsnd_mod *mod,
+ }
+
+ static int rsnd_ssi_dma_start(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
+
+ rsnd_dma_start(dma);
+
+- rsnd_ssi_start(mod, priv);
++ rsnd_ssi_start(mod, io, priv);
+
+ return 0;
+ }
+
+ static int rsnd_ssi_dma_stop(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+ struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
+
+- rsnd_ssi_stop(mod, priv);
++ rsnd_ssi_stop(mod, io, priv);
+
+ rsnd_dma_stop(dma);
+
+--
+2.6.2
+
diff --git a/patches.renesas/0121-ASoC-rsnd-add-common-interrupt-handler-for-SSI-SRC-D.patch b/patches.renesas/0121-ASoC-rsnd-add-common-interrupt-handler-for-SSI-SRC-D.patch
new file mode 100644
index 00000000000000..9d5e3342cc437f
--- /dev/null
+++ b/patches.renesas/0121-ASoC-rsnd-add-common-interrupt-handler-for-SSI-SRC-D.patch
@@ -0,0 +1,72 @@
+From 8fee8ad26cbd2382a06df16671aa03ee53082d9d Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Mon, 15 Jun 2015 06:25:48 +0000
+Subject: [PATCH 121/129] ASoC: rsnd: add common interrupt handler for
+ SSI/SRC/DMA
+
+Each Renesas sound mod (= SSI/SRC/DVC) might be called from many paths
+if it supports MIXer. In such case, mod <-> io is no longer 1:1
+relationship. Then, interrupt handler can't use rsnd_mod_to_io().
+This patch adds SSI/SRC/DMA common interrupt handler frame
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit f501b7a4e7ceb76a5d24cc0f75403072af5e85a0)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/core.c | 23 +++++++++++++++++++++++
+ sound/soc/sh/rcar/rsnd.h | 3 +++
+ 2 files changed, 26 insertions(+)
+
+diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
+index 54297d74ea1f..424d1a31c471 100644
+--- a/sound/soc/sh/rcar/core.c
++++ b/sound/soc/sh/rcar/core.c
+@@ -172,6 +172,29 @@ void rsnd_mod_quit(struct rsnd_mod *mod)
+ clk_unprepare(mod->clk);
+ }
+
++void rsnd_mod_interrupt(struct rsnd_mod *mod,
++ void (*callback)(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io))
++{
++ struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
++ struct rsnd_dai_stream *io;
++ struct rsnd_dai *rdai;
++ int i, j;
++
++ for_each_rsnd_dai(rdai, priv, j) {
++
++ for (i = 0; i < RSND_MOD_MAX; i++) {
++ io = &rdai->playback;
++ if (mod == io->mod[i])
++ callback(mod, io);
++
++ io = &rdai->capture;
++ if (mod == io->mod[i])
++ callback(mod, io);
++ }
++ }
++}
++
+ int rsnd_mod_is_working(struct rsnd_mod *mod)
+ {
+ struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
+index fd93a6a25749..e6aad5e05fad 100644
+--- a/sound/soc/sh/rcar/rsnd.h
++++ b/sound/soc/sh/rcar/rsnd.h
+@@ -327,6 +327,9 @@ void rsnd_mod_quit(struct rsnd_mod *mod);
+ char *rsnd_mod_name(struct rsnd_mod *mod);
+ int rsnd_mod_is_working(struct rsnd_mod *mod);
+ struct dma_chan *rsnd_mod_dma_req(struct rsnd_mod *mod);
++void rsnd_mod_interrupt(struct rsnd_mod *mod,
++ void (*callback)(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io));
+
+ /*
+ * R-Car sound DAI
+--
+2.6.2
+
diff --git a/patches.renesas/0122-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-rsnd_get_adinr.patch b/patches.renesas/0122-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-rsnd_get_adinr.patch
new file mode 100644
index 00000000000000..586050b3a6bfec
--- /dev/null
+++ b/patches.renesas/0122-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-rsnd_get_adinr.patch
@@ -0,0 +1,215 @@
+From a1e1f1684612ab3502bca93c4f4a7ed4ee3abde7 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Mon, 15 Jun 2015 06:26:08 +0000
+Subject: [PATCH 122/129] ASoC: rsnd: don't use rsnd_mod_to_io() on
+ rsnd_get_adinr()
+
+Each Renesas sound mod (= SSI/SRC/DVC) might be called from many paths
+if it supports MIXer. In such case, mod <-> io is no longer 1:1
+relationship. This patch removes rsnd_mod_to_io() from rsnd_get_adinr()
+and its related function
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit 4e2639ff38d28dccdd8e7cf8f60181f0c17e10d3)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/core.c | 3 +--
+ sound/soc/sh/rcar/dvc.c | 2 +-
+ sound/soc/sh/rcar/rsnd.h | 6 ++++--
+ sound/soc/sh/rcar/src.c | 28 +++++++++++++++-------------
+ sound/soc/sh/rcar/ssi.c | 4 ++--
+ 5 files changed, 23 insertions(+), 20 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
+index 424d1a31c471..e1d1b22f324f 100644
+--- a/sound/soc/sh/rcar/core.c
++++ b/sound/soc/sh/rcar/core.c
+@@ -206,10 +206,9 @@ int rsnd_mod_is_working(struct rsnd_mod *mod)
+ /*
+ * settting function
+ */
+-u32 rsnd_get_adinr(struct rsnd_mod *mod)
++u32 rsnd_get_adinr(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
+ {
+ struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
+ struct device *dev = rsnd_priv_to_dev(priv);
+ u32 adinr = runtime->channels;
+diff --git a/sound/soc/sh/rcar/dvc.c b/sound/soc/sh/rcar/dvc.c
+index 52e75ebeb5b8..691bc632f0cb 100644
+--- a/sound/soc/sh/rcar/dvc.c
++++ b/sound/soc/sh/rcar/dvc.c
+@@ -169,7 +169,7 @@ static int rsnd_dvc_init(struct rsnd_mod *dvc_mod,
+
+ rsnd_mod_write(dvc_mod, DVC_DVUIR, 1);
+
+- rsnd_mod_write(dvc_mod, DVC_ADINR, rsnd_get_adinr(dvc_mod));
++ rsnd_mod_write(dvc_mod, DVC_ADINR, rsnd_get_adinr(dvc_mod, io));
+
+ /* ch0/ch1 Volume */
+ rsnd_dvc_volume_update(dvc_mod);
+diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
+index e6aad5e05fad..b40435d08757 100644
+--- a/sound/soc/sh/rcar/rsnd.h
++++ b/sound/soc/sh/rcar/rsnd.h
+@@ -165,7 +165,7 @@ void rsnd_write(struct rsnd_priv *priv, struct rsnd_mod *mod,
+ enum rsnd_reg reg, u32 data);
+ void rsnd_bset(struct rsnd_priv *priv, struct rsnd_mod *mod, enum rsnd_reg reg,
+ u32 mask, u32 data);
+-u32 rsnd_get_adinr(struct rsnd_mod *mod);
++u32 rsnd_get_adinr(struct rsnd_mod *mod, struct rsnd_dai_stream *io);
+
+ /*
+ * R-Car DMA
+@@ -537,8 +537,10 @@ unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv,
+ struct rsnd_dai_stream *io,
+ struct snd_pcm_runtime *runtime);
+ int rsnd_src_ssiu_start(struct rsnd_mod *ssi_mod,
++ struct rsnd_dai_stream *io,
+ int use_busif);
+-int rsnd_src_ssiu_stop(struct rsnd_mod *ssi_mod);
++int rsnd_src_ssiu_stop(struct rsnd_mod *ssi_mod,
++ struct rsnd_dai_stream *io);
+ int rsnd_src_ssi_irq_enable(struct rsnd_mod *ssi_mod);
+ int rsnd_src_ssi_irq_disable(struct rsnd_mod *ssi_mod);
+
+diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c
+index e28d9f6ddda6..5693bb5c420b 100644
+--- a/sound/soc/sh/rcar/src.c
++++ b/sound/soc/sh/rcar/src.c
+@@ -129,9 +129,9 @@ static struct dma_chan *rsnd_src_dma_req(struct rsnd_mod *mod)
+ }
+
+ int rsnd_src_ssiu_start(struct rsnd_mod *ssi_mod,
++ struct rsnd_dai_stream *io,
+ int use_busif)
+ {
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(ssi_mod);
+ struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
+ struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
+ int ssi_id = rsnd_mod_id(ssi_mod);
+@@ -174,7 +174,7 @@ int rsnd_src_ssiu_start(struct rsnd_mod *ssi_mod,
+ u32 mask = ~0;
+
+ rsnd_mod_write(ssi_mod, SSI_BUSIF_ADINR,
+- rsnd_get_adinr(ssi_mod));
++ rsnd_get_adinr(ssi_mod, io));
+ rsnd_mod_write(ssi_mod, SSI_BUSIF_MODE, 1);
+ rsnd_mod_write(ssi_mod, SSI_CTRL, 0x1);
+
+@@ -196,7 +196,8 @@ int rsnd_src_ssiu_start(struct rsnd_mod *ssi_mod,
+ return 0;
+ }
+
+-int rsnd_src_ssiu_stop(struct rsnd_mod *ssi_mod)
++int rsnd_src_ssiu_stop(struct rsnd_mod *ssi_mod,
++ struct rsnd_dai_stream *io)
+ {
+ /*
+ * DMA settings for SSIU
+@@ -283,9 +284,9 @@ unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv,
+ return rate;
+ }
+
+-static int rsnd_src_set_convert_rate(struct rsnd_mod *mod)
++static int rsnd_src_set_convert_rate(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io)
+ {
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
+ struct rsnd_src *src = rsnd_mod_to_src(mod);
+ u32 convert_rate = rsnd_src_convert_rate(src);
+@@ -299,7 +300,7 @@ static int rsnd_src_set_convert_rate(struct rsnd_mod *mod)
+ rsnd_mod_write(mod, SRC_SWRSR, 1);
+
+ /* Set channel number and output bit length */
+- rsnd_mod_write(mod, SRC_ADINR, rsnd_get_adinr(mod));
++ rsnd_mod_write(mod, SRC_ADINR, rsnd_get_adinr(mod, io));
+
+ /* Enable the initial value of IFS */
+ if (fsrate) {
+@@ -508,12 +509,13 @@ static int rsnd_src_set_convert_timing_gen1(struct rsnd_mod *mod)
+ return 0;
+ }
+
+-static int rsnd_src_set_convert_rate_gen1(struct rsnd_mod *mod)
++static int rsnd_src_set_convert_rate_gen1(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io)
+ {
+ struct rsnd_src *src = rsnd_mod_to_src(mod);
+ int ret;
+
+- ret = rsnd_src_set_convert_rate(mod);
++ ret = rsnd_src_set_convert_rate(mod, io);
+ if (ret < 0)
+ return ret;
+
+@@ -547,7 +549,7 @@ static int rsnd_src_init_gen1(struct rsnd_mod *mod,
+ if (ret < 0)
+ return ret;
+
+- ret = rsnd_src_set_convert_rate_gen1(mod);
++ ret = rsnd_src_set_convert_rate_gen1(mod, io);
+ if (ret < 0)
+ return ret;
+
+@@ -706,11 +708,11 @@ rsnd_src_interrupt_gen2_out:
+ return IRQ_HANDLED;
+ }
+
+-static int rsnd_src_set_convert_rate_gen2(struct rsnd_mod *mod)
++static int rsnd_src_set_convert_rate_gen2(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io)
+ {
+ struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+ struct device *dev = rsnd_priv_to_dev(priv);
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
+ struct rsnd_src *src = rsnd_mod_to_src(mod);
+ u32 convert_rate = rsnd_src_convert_rate(src);
+@@ -731,7 +733,7 @@ static int rsnd_src_set_convert_rate_gen2(struct rsnd_mod *mod)
+ return -EINVAL;
+ }
+
+- ret = rsnd_src_set_convert_rate(mod);
++ ret = rsnd_src_set_convert_rate(mod, io);
+ if (ret < 0)
+ return ret;
+
+@@ -834,7 +836,7 @@ static int rsnd_src_init_gen2(struct rsnd_mod *mod,
+ if (ret < 0)
+ return ret;
+
+- ret = rsnd_src_set_convert_rate_gen2(mod);
++ ret = rsnd_src_set_convert_rate_gen2(mod, io);
+ if (ret < 0)
+ return ret;
+
+diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
+index 41ef475c4a57..564e8290375c 100644
+--- a/sound/soc/sh/rcar/ssi.c
++++ b/sound/soc/sh/rcar/ssi.c
+@@ -396,7 +396,7 @@ static int rsnd_ssi_start(struct rsnd_mod *mod,
+ {
+ struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
+
+- rsnd_src_ssiu_start(mod, rsnd_ssi_use_busif(mod));
++ rsnd_src_ssiu_start(mod, io, rsnd_ssi_use_busif(mod));
+
+ rsnd_ssi_hw_start(ssi, io);
+
+@@ -417,7 +417,7 @@ static int rsnd_ssi_stop(struct rsnd_mod *mod,
+
+ rsnd_ssi_hw_stop(ssi);
+
+- rsnd_src_ssiu_stop(mod);
++ rsnd_src_ssiu_stop(mod, io);
+
+ return 0;
+ }
+--
+2.6.2
+
diff --git a/patches.renesas/0123-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-rsnd_dma_xxx.patch b/patches.renesas/0123-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-rsnd_dma_xxx.patch
new file mode 100644
index 00000000000000..c5a43fc0450c74
--- /dev/null
+++ b/patches.renesas/0123-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-rsnd_dma_xxx.patch
@@ -0,0 +1,534 @@
+From ed51f2a6b6acf891b352204b8981d0c77ba5354c Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Mon, 15 Jun 2015 06:26:25 +0000
+Subject: [PATCH 123/129] ASoC: rsnd: don't use rsnd_mod_to_io() on
+ rsnd_dma_xxx()
+
+Each Renesas sound mod (= SSI/SRC/DVC) might be called from many paths
+if it supports MIXer. In such case, mod <-> io is no longer 1:1
+relationship. This patch removes rsnd_mod_to_io() from rsnd_dma_xxx()
+and related function
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit 9b99e9a7c5057684104178bb6c3815fcb2f13be4)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/core.c | 5 ++-
+ sound/soc/sh/rcar/dma.c | 102 ++++++++++++++++++++++++++---------------------
+ sound/soc/sh/rcar/dvc.c | 3 +-
+ sound/soc/sh/rcar/rsnd.h | 22 +++++-----
+ sound/soc/sh/rcar/src.c | 12 +++---
+ sound/soc/sh/rcar/ssi.c | 12 +++---
+ 6 files changed, 85 insertions(+), 71 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
+index e1d1b22f324f..daa01e2aebb6 100644
+--- a/sound/soc/sh/rcar/core.c
++++ b/sound/soc/sh/rcar/core.c
+@@ -137,12 +137,13 @@ char *rsnd_mod_name(struct rsnd_mod *mod)
+ return mod->ops->name;
+ }
+
+-struct dma_chan *rsnd_mod_dma_req(struct rsnd_mod *mod)
++struct dma_chan *rsnd_mod_dma_req(struct rsnd_dai_stream *io,
++ struct rsnd_mod *mod)
+ {
+ if (!mod || !mod->ops || !mod->ops->dma_req)
+ return NULL;
+
+- return mod->ops->dma_req(mod);
++ return mod->ops->dma_req(io, mod);
+ }
+
+ int rsnd_mod_init(struct rsnd_priv *priv,
+diff --git a/sound/soc/sh/rcar/dma.c b/sound/soc/sh/rcar/dma.c
+index ac19ab161c63..a4ac51003a57 100644
+--- a/sound/soc/sh/rcar/dma.c
++++ b/sound/soc/sh/rcar/dma.c
+@@ -32,12 +32,10 @@ struct rsnd_dma_ctrl {
+ /*
+ * Audio DMAC
+ */
+-static void rsnd_dmaen_complete(void *data)
++static void __rsnd_dmaen_complete(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io)
+ {
+- struct rsnd_dma *dma = (struct rsnd_dma *)data;
+- struct rsnd_mod *mod = rsnd_dma_to_mod(dma);
+ struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ bool elapsed = false;
+ unsigned long flags;
+
+@@ -54,7 +52,8 @@ static void rsnd_dmaen_complete(void *data)
+ */
+ spin_lock_irqsave(&priv->lock, flags);
+
+- elapsed = rsnd_dai_pointer_update(io, io->byte_per_period);
++ if (rsnd_mod_is_working(mod))
++ elapsed = rsnd_dai_pointer_update(io, io->byte_per_period);
+
+ spin_unlock_irqrestore(&priv->lock, flags);
+
+@@ -62,19 +61,25 @@ static void rsnd_dmaen_complete(void *data)
+ rsnd_dai_period_elapsed(io);
+ }
+
+-static void rsnd_dmaen_stop(struct rsnd_dma *dma)
++static void rsnd_dmaen_complete(void *data)
++{
++ struct rsnd_mod *mod = data;
++
++ rsnd_mod_interrupt(mod, __rsnd_dmaen_complete);
++}
++
++static void rsnd_dmaen_stop(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
+ {
+ struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
+
+ dmaengine_terminate_all(dmaen->chan);
+ }
+
+-static void rsnd_dmaen_start(struct rsnd_dma *dma)
++static void rsnd_dmaen_start(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
+ {
+ struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
+ struct rsnd_mod *mod = rsnd_dma_to_mod(dma);
+ struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ struct snd_pcm_substream *substream = io->substream;
+ struct device *dev = rsnd_priv_to_dev(priv);
+ struct dma_async_tx_descriptor *desc;
+@@ -93,7 +98,7 @@ static void rsnd_dmaen_start(struct rsnd_dma *dma)
+ }
+
+ desc->callback = rsnd_dmaen_complete;
+- desc->callback_param = dma;
++ desc->callback_param = mod;
+
+ if (dmaengine_submit(desc) < 0) {
+ dev_err(dev, "dmaengine_submit() fail\n");
+@@ -124,7 +129,8 @@ struct dma_chan *rsnd_dma_request_channel(struct device_node *of_node,
+ return chan;
+ }
+
+-static struct dma_chan *rsnd_dmaen_request_channel(struct rsnd_mod *mod_from,
++static struct dma_chan *rsnd_dmaen_request_channel(struct rsnd_dai_stream *io,
++ struct rsnd_mod *mod_from,
+ struct rsnd_mod *mod_to)
+ {
+ if ((!mod_from && !mod_to) ||
+@@ -132,19 +138,19 @@ static struct dma_chan *rsnd_dmaen_request_channel(struct rsnd_mod *mod_from,
+ return NULL;
+
+ if (mod_from)
+- return rsnd_mod_dma_req(mod_from);
++ return rsnd_mod_dma_req(io, mod_from);
+ else
+- return rsnd_mod_dma_req(mod_to);
++ return rsnd_mod_dma_req(io, mod_to);
+ }
+
+-static int rsnd_dmaen_init(struct rsnd_priv *priv, struct rsnd_dma *dma, int id,
++static int rsnd_dmaen_init(struct rsnd_dai_stream *io,
++ struct rsnd_dma *dma, int id,
+ struct rsnd_mod *mod_from, struct rsnd_mod *mod_to)
+ {
+ struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
++ struct rsnd_priv *priv = rsnd_io_to_priv(io);
+ struct device *dev = rsnd_priv_to_dev(priv);
+ struct dma_slave_config cfg = {};
+- struct rsnd_mod *mod = rsnd_dma_to_mod(dma);
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ int is_play = rsnd_io_is_play(io);
+ int ret;
+
+@@ -154,7 +160,7 @@ static int rsnd_dmaen_init(struct rsnd_priv *priv, struct rsnd_dma *dma, int id,
+ }
+
+ if (dev->of_node) {
+- dmaen->chan = rsnd_dmaen_request_channel(mod_from, mod_to);
++ dmaen->chan = rsnd_dmaen_request_channel(io, mod_from, mod_to);
+ } else {
+ dma_cap_mask_t mask;
+
+@@ -186,7 +192,7 @@ static int rsnd_dmaen_init(struct rsnd_priv *priv, struct rsnd_dma *dma, int id,
+ return 0;
+
+ rsnd_dma_init_err:
+- rsnd_dma_quit(dma);
++ rsnd_dma_quit(io, dma);
+ rsnd_dma_channel_err:
+
+ /*
+@@ -198,7 +204,7 @@ rsnd_dma_channel_err:
+ return -EAGAIN;
+ }
+
+-static void rsnd_dmaen_quit(struct rsnd_dma *dma)
++static void rsnd_dmaen_quit(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
+ {
+ struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
+
+@@ -247,9 +253,9 @@ static const u8 gen2_id_table_cmd[] = {
+ 0x38, /* SCU_CMD1 */
+ };
+
+-static u32 rsnd_dmapp_get_id(struct rsnd_mod *mod)
++static u32 rsnd_dmapp_get_id(struct rsnd_dai_stream *io,
++ struct rsnd_mod *mod)
+ {
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ struct rsnd_mod *ssi = rsnd_io_to_mod_ssi(io);
+ struct rsnd_mod *src = rsnd_io_to_mod_src(io);
+ struct rsnd_mod *dvc = rsnd_io_to_mod_dvc(io);
+@@ -277,11 +283,12 @@ static u32 rsnd_dmapp_get_id(struct rsnd_mod *mod)
+ return entry[id];
+ }
+
+-static u32 rsnd_dmapp_get_chcr(struct rsnd_mod *mod_from,
++static u32 rsnd_dmapp_get_chcr(struct rsnd_dai_stream *io,
++ struct rsnd_mod *mod_from,
+ struct rsnd_mod *mod_to)
+ {
+- return (rsnd_dmapp_get_id(mod_from) << 24) +
+- (rsnd_dmapp_get_id(mod_to) << 16);
++ return (rsnd_dmapp_get_id(io, mod_from) << 24) +
++ (rsnd_dmapp_get_id(io, mod_to) << 16);
+ }
+
+ #define rsnd_dmapp_addr(dmac, dma, reg) \
+@@ -308,7 +315,7 @@ static u32 rsnd_dmapp_read(struct rsnd_dma *dma, u32 reg)
+ return ioread32(rsnd_dmapp_addr(dmac, dma, reg));
+ }
+
+-static void rsnd_dmapp_stop(struct rsnd_dma *dma)
++static void rsnd_dmapp_stop(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
+ {
+ int i;
+
+@@ -321,7 +328,7 @@ static void rsnd_dmapp_stop(struct rsnd_dma *dma)
+ }
+ }
+
+-static void rsnd_dmapp_start(struct rsnd_dma *dma)
++static void rsnd_dmapp_start(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
+ {
+ struct rsnd_dmapp *dmapp = rsnd_dma_to_dmapp(dma);
+
+@@ -330,19 +337,21 @@ static void rsnd_dmapp_start(struct rsnd_dma *dma)
+ rsnd_dmapp_write(dma, dmapp->chcr, PDMACHCR);
+ }
+
+-static int rsnd_dmapp_init(struct rsnd_priv *priv, struct rsnd_dma *dma, int id,
++static int rsnd_dmapp_init(struct rsnd_dai_stream *io,
++ struct rsnd_dma *dma, int id,
+ struct rsnd_mod *mod_from, struct rsnd_mod *mod_to)
+ {
+ struct rsnd_dmapp *dmapp = rsnd_dma_to_dmapp(dma);
++ struct rsnd_priv *priv = rsnd_io_to_priv(io);
+ struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
+ struct device *dev = rsnd_priv_to_dev(priv);
+
+ dmapp->dmapp_id = dmac->dmapp_num;
+- dmapp->chcr = rsnd_dmapp_get_chcr(mod_from, mod_to) | PDMACHCR_DE;
++ dmapp->chcr = rsnd_dmapp_get_chcr(io, mod_from, mod_to) | PDMACHCR_DE;
+
+ dmac->dmapp_num++;
+
+- rsnd_dmapp_stop(dma);
++ rsnd_dmapp_stop(io, dma);
+
+ dev_dbg(dev, "id/src/dst/chcr = %d/%pad/%pad/%08x\n",
+ dmapp->dmapp_id, &dma->src_addr, &dma->dst_addr, dmapp->chcr);
+@@ -395,12 +404,12 @@ static struct rsnd_dma_ops rsnd_dmapp_ops = {
+ #define RDMA_CMD_O_P(addr, i) (addr ##_reg - 0x001f8000 + (0x400 * i))
+
+ static dma_addr_t
+-rsnd_gen2_dma_addr(struct rsnd_priv *priv,
++rsnd_gen2_dma_addr(struct rsnd_dai_stream *io,
+ struct rsnd_mod *mod,
+ int is_play, int is_from)
+ {
++ struct rsnd_priv *priv = rsnd_io_to_priv(io);
+ struct device *dev = rsnd_priv_to_dev(priv);
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ phys_addr_t ssi_reg = rsnd_gen_get_phy_addr(priv, RSND_GEN2_SSI);
+ phys_addr_t src_reg = rsnd_gen_get_phy_addr(priv, RSND_GEN2_SCU);
+ int is_ssi = !!(rsnd_io_to_mod_ssi(io) == mod);
+@@ -455,10 +464,12 @@ rsnd_gen2_dma_addr(struct rsnd_priv *priv,
+ dma_addrs[is_ssi][is_play][use_src + use_dvc].in_addr;
+ }
+
+-static dma_addr_t rsnd_dma_addr(struct rsnd_priv *priv,
++static dma_addr_t rsnd_dma_addr(struct rsnd_dai_stream *io,
+ struct rsnd_mod *mod,
+ int is_play, int is_from)
+ {
++ struct rsnd_priv *priv = rsnd_io_to_priv(io);
++
+ /*
+ * gen1 uses default DMA addr
+ */
+@@ -468,17 +479,17 @@ static dma_addr_t rsnd_dma_addr(struct rsnd_priv *priv,
+ if (!mod)
+ return 0;
+
+- return rsnd_gen2_dma_addr(priv, mod, is_play, is_from);
++ return rsnd_gen2_dma_addr(io, mod, is_play, is_from);
+ }
+
+ #define MOD_MAX 4 /* MEM/SSI/SRC/DVC */
+ static void rsnd_dma_of_path(struct rsnd_dma *dma,
++ struct rsnd_dai_stream *io,
+ int is_play,
+ struct rsnd_mod **mod_from,
+ struct rsnd_mod **mod_to)
+ {
+ struct rsnd_mod *this = rsnd_dma_to_mod(dma);
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(this);
+ struct rsnd_mod *ssi = rsnd_io_to_mod_ssi(io);
+ struct rsnd_mod *src = rsnd_io_to_mod_src(io);
+ struct rsnd_mod *dvc = rsnd_io_to_mod_dvc(io);
+@@ -533,17 +544,17 @@ static void rsnd_dma_of_path(struct rsnd_dma *dma,
+ }
+ }
+
+-void rsnd_dma_stop(struct rsnd_dma *dma)
++void rsnd_dma_stop(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
+ {
+- dma->ops->stop(dma);
++ dma->ops->stop(io, dma);
+ }
+
+-void rsnd_dma_start(struct rsnd_dma *dma)
++void rsnd_dma_start(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
+ {
+- dma->ops->start(dma);
++ dma->ops->start(io, dma);
+ }
+
+-void rsnd_dma_quit(struct rsnd_dma *dma)
++void rsnd_dma_quit(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
+ {
+ struct rsnd_mod *mod = rsnd_dma_to_mod(dma);
+ struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+@@ -552,15 +563,14 @@ void rsnd_dma_quit(struct rsnd_dma *dma)
+ if (!dmac)
+ return;
+
+- dma->ops->quit(dma);
++ dma->ops->quit(io, dma);
+ }
+
+-int rsnd_dma_init(struct rsnd_priv *priv, struct rsnd_dma *dma, int id)
++int rsnd_dma_init(struct rsnd_dai_stream *io, struct rsnd_dma *dma, int id)
+ {
+- struct rsnd_mod *mod = rsnd_dma_to_mod(dma);
+ struct rsnd_mod *mod_from;
+ struct rsnd_mod *mod_to;
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
++ struct rsnd_priv *priv = rsnd_io_to_priv(io);
+ struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
+ int is_play = rsnd_io_is_play(io);
+
+@@ -573,10 +583,10 @@ int rsnd_dma_init(struct rsnd_priv *priv, struct rsnd_dma *dma, int id)
+ if (!dmac)
+ return -EAGAIN;
+
+- rsnd_dma_of_path(dma, is_play, &mod_from, &mod_to);
++ rsnd_dma_of_path(dma, io, is_play, &mod_from, &mod_to);
+
+- dma->src_addr = rsnd_dma_addr(priv, mod_from, is_play, 1);
+- dma->dst_addr = rsnd_dma_addr(priv, mod_to, is_play, 0);
++ dma->src_addr = rsnd_dma_addr(io, mod_from, is_play, 1);
++ dma->dst_addr = rsnd_dma_addr(io, mod_to, is_play, 0);
+
+ /* for Gen2 */
+ if (mod_from && mod_to)
+@@ -588,7 +598,7 @@ int rsnd_dma_init(struct rsnd_priv *priv, struct rsnd_dma *dma, int id)
+ if (rsnd_is_gen1(priv))
+ dma->ops = &rsnd_dmaen_ops;
+
+- return dma->ops->init(priv, dma, id, mod_from, mod_to);
++ return dma->ops->init(io, dma, id, mod_from, mod_to);
+ }
+
+ int rsnd_dma_probe(struct platform_device *pdev,
+diff --git a/sound/soc/sh/rcar/dvc.c b/sound/soc/sh/rcar/dvc.c
+index 691bc632f0cb..3aac790534f0 100644
+--- a/sound/soc/sh/rcar/dvc.c
++++ b/sound/soc/sh/rcar/dvc.c
+@@ -265,7 +265,8 @@ static int rsnd_dvc_pcm_new(struct rsnd_mod *mod,
+ return 0;
+ }
+
+-static struct dma_chan *rsnd_dvc_dma_req(struct rsnd_mod *mod)
++static struct dma_chan *rsnd_dvc_dma_req(struct rsnd_dai_stream *io,
++ struct rsnd_mod *mod)
+ {
+ struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+
+diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
+index b40435d08757..19d0d8b2b9af 100644
+--- a/sound/soc/sh/rcar/rsnd.h
++++ b/sound/soc/sh/rcar/rsnd.h
+@@ -172,11 +172,11 @@ u32 rsnd_get_adinr(struct rsnd_mod *mod, struct rsnd_dai_stream *io);
+ */
+ struct rsnd_dma;
+ struct rsnd_dma_ops {
+- void (*start)(struct rsnd_dma *dma);
+- void (*stop)(struct rsnd_dma *dma);
+- int (*init)(struct rsnd_priv *priv, struct rsnd_dma *dma, int id,
++ void (*start)(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
++ void (*stop)(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
++ int (*init)(struct rsnd_dai_stream *io, struct rsnd_dma *dma, int id,
+ struct rsnd_mod *mod_from, struct rsnd_mod *mod_to);
+- void (*quit)(struct rsnd_dma *dma);
++ void (*quit)(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
+ };
+
+ struct rsnd_dmaen {
+@@ -200,10 +200,10 @@ struct rsnd_dma {
+ #define rsnd_dma_to_dmaen(dma) (&(dma)->dma.en)
+ #define rsnd_dma_to_dmapp(dma) (&(dma)->dma.pp)
+
+-void rsnd_dma_start(struct rsnd_dma *dma);
+-void rsnd_dma_stop(struct rsnd_dma *dma);
+-int rsnd_dma_init(struct rsnd_priv *priv, struct rsnd_dma *dma, int id);
+-void rsnd_dma_quit(struct rsnd_dma *dma);
++void rsnd_dma_start(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
++void rsnd_dma_stop(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
++int rsnd_dma_init(struct rsnd_dai_stream *io, struct rsnd_dma *dma, int id);
++void rsnd_dma_quit(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
+ int rsnd_dma_probe(struct platform_device *pdev,
+ const struct rsnd_of_data *of_data,
+ struct rsnd_priv *priv);
+@@ -224,7 +224,8 @@ enum rsnd_mod_type {
+
+ struct rsnd_mod_ops {
+ char *name;
+- struct dma_chan* (*dma_req)(struct rsnd_mod *mod);
++ struct dma_chan* (*dma_req)(struct rsnd_dai_stream *io,
++ struct rsnd_mod *mod);
+ int (*probe)(struct rsnd_mod *mod,
+ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv);
+@@ -326,7 +327,8 @@ int rsnd_mod_init(struct rsnd_priv *priv,
+ void rsnd_mod_quit(struct rsnd_mod *mod);
+ char *rsnd_mod_name(struct rsnd_mod *mod);
+ int rsnd_mod_is_working(struct rsnd_mod *mod);
+-struct dma_chan *rsnd_mod_dma_req(struct rsnd_mod *mod);
++struct dma_chan *rsnd_mod_dma_req(struct rsnd_dai_stream *io,
++ struct rsnd_mod *mod);
+ void rsnd_mod_interrupt(struct rsnd_mod *mod,
+ void (*callback)(struct rsnd_mod *mod,
+ struct rsnd_dai_stream *io));
+diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c
+index 5693bb5c420b..62216196af9c 100644
+--- a/sound/soc/sh/rcar/src.c
++++ b/sound/soc/sh/rcar/src.c
+@@ -117,10 +117,10 @@ struct rsnd_src {
+ /*
+ * Gen1/Gen2 common functions
+ */
+-static struct dma_chan *rsnd_src_dma_req(struct rsnd_mod *mod)
++static struct dma_chan *rsnd_src_dma_req(struct rsnd_dai_stream *io,
++ struct rsnd_mod *mod)
+ {
+ struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ int is_play = rsnd_io_is_play(io);
+
+ return rsnd_dma_request_channel(rsnd_src_of_node(priv),
+@@ -810,7 +810,7 @@ static int rsnd_src_probe_gen2(struct rsnd_mod *mod,
+ return ret;
+ }
+
+- ret = rsnd_dma_init(priv,
++ ret = rsnd_dma_init(io,
+ rsnd_mod_to_dma(mod),
+ src->info->dma_id);
+
+@@ -821,7 +821,7 @@ static int rsnd_src_remove_gen2(struct rsnd_mod *mod,
+ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+- rsnd_dma_quit(rsnd_mod_to_dma(mod));
++ rsnd_dma_quit(io, rsnd_mod_to_dma(mod));
+
+ return 0;
+ }
+@@ -851,7 +851,7 @@ static int rsnd_src_start_gen2(struct rsnd_mod *mod,
+ struct rsnd_dai_stream *io,
+ struct rsnd_priv *priv)
+ {
+- rsnd_dma_start(rsnd_mod_to_dma(mod));
++ rsnd_dma_start(io, rsnd_mod_to_dma(mod));
+
+ return _rsnd_src_start_gen2(mod);
+ }
+@@ -864,7 +864,7 @@ static int rsnd_src_stop_gen2(struct rsnd_mod *mod,
+
+ ret = _rsnd_src_stop_gen2(mod);
+
+- rsnd_dma_stop(rsnd_mod_to_dma(mod));
++ rsnd_dma_stop(io, rsnd_mod_to_dma(mod));
+
+ return ret;
+ }
+diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
+index 564e8290375c..0a32544d6f75 100644
+--- a/sound/soc/sh/rcar/ssi.c
++++ b/sound/soc/sh/rcar/ssi.c
+@@ -533,7 +533,7 @@ static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
+ return ret;
+
+ ret = rsnd_dma_init(
+- priv, rsnd_mod_to_dma(mod),
++ io, rsnd_mod_to_dma(mod),
+ dma_id);
+
+ return ret;
+@@ -547,7 +547,7 @@ static int rsnd_ssi_dma_remove(struct rsnd_mod *mod,
+ struct device *dev = rsnd_priv_to_dev(priv);
+ int irq = ssi->info->irq;
+
+- rsnd_dma_quit(rsnd_mod_to_dma(mod));
++ rsnd_dma_quit(io, rsnd_mod_to_dma(mod));
+
+ /* PIO will request IRQ again */
+ devm_free_irq(dev, irq, ssi);
+@@ -582,7 +582,7 @@ static int rsnd_ssi_dma_start(struct rsnd_mod *mod,
+ {
+ struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
+
+- rsnd_dma_start(dma);
++ rsnd_dma_start(io, dma);
+
+ rsnd_ssi_start(mod, io, priv);
+
+@@ -597,15 +597,15 @@ static int rsnd_ssi_dma_stop(struct rsnd_mod *mod,
+
+ rsnd_ssi_stop(mod, io, priv);
+
+- rsnd_dma_stop(dma);
++ rsnd_dma_stop(io, dma);
+
+ return 0;
+ }
+
+-static struct dma_chan *rsnd_ssi_dma_req(struct rsnd_mod *mod)
++static struct dma_chan *rsnd_ssi_dma_req(struct rsnd_dai_stream *io,
++ struct rsnd_mod *mod)
+ {
+ struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ int is_play = rsnd_io_is_play(io);
+ char *name;
+
+--
+2.6.2
+
diff --git a/patches.renesas/0124-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-rsnd_ssi_xxx.patch b/patches.renesas/0124-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-rsnd_ssi_xxx.patch
new file mode 100644
index 00000000000000..1c580ec95e9a34
--- /dev/null
+++ b/patches.renesas/0124-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-rsnd_ssi_xxx.patch
@@ -0,0 +1,162 @@
+From c094a04f53cbe99dcc698eba202b1f75ca98d249 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Mon, 15 Jun 2015 06:26:56 +0000
+Subject: [PATCH 124/129] ASoC: rsnd: don't use rsnd_mod_to_io() on
+ rsnd_ssi_xxx()
+
+Each Renesas sound mod (= SSI/SRC/DVC) might be called from many paths
+if it supports MIXer. In such case, mod <-> io is no longer 1:1
+relationship. This patch removes rsnd_mod_to_io() from rsnd_ssi_xxx()
+and related function.
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit bfc0cfe6b7acb1d0c318f9bc41fcb895a941f83d)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/dma.c | 2 +-
+ sound/soc/sh/rcar/rsnd.h | 2 +-
+ sound/soc/sh/rcar/ssi.c | 32 ++++++++++++++++++--------------
+ 3 files changed, 20 insertions(+), 16 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/dma.c b/sound/soc/sh/rcar/dma.c
+index a4ac51003a57..48b87bb10322 100644
+--- a/sound/soc/sh/rcar/dma.c
++++ b/sound/soc/sh/rcar/dma.c
+@@ -456,7 +456,7 @@ rsnd_gen2_dma_addr(struct rsnd_dai_stream *io,
+ dev_err(dev, "DVC is selected without SRC\n");
+
+ /* use SSIU or SSI ? */
+- if (is_ssi && rsnd_ssi_use_busif(mod))
++ if (is_ssi && rsnd_ssi_use_busif(io, mod))
+ is_ssi++;
+
+ return (is_from) ?
+diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
+index 19d0d8b2b9af..ac03d2008ee8 100644
+--- a/sound/soc/sh/rcar/rsnd.h
++++ b/sound/soc/sh/rcar/rsnd.h
+@@ -559,7 +559,7 @@ void rsnd_ssi_remove(struct platform_device *pdev,
+ struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id);
+ int rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod);
+ int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod);
+-int rsnd_ssi_use_busif(struct rsnd_mod *mod);
++int rsnd_ssi_use_busif(struct rsnd_dai_stream *io, struct rsnd_mod *mod);
+
+ /*
+ * R-Car DVC
+diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
+index 0a32544d6f75..fa1f2e5b9070 100644
+--- a/sound/soc/sh/rcar/ssi.c
++++ b/sound/soc/sh/rcar/ssi.c
+@@ -87,10 +87,9 @@ struct rsnd_ssi {
+ #define rsnd_ssi_of_node(priv) \
+ of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,ssi")
+
+-int rsnd_ssi_use_busif(struct rsnd_mod *mod)
++int rsnd_ssi_use_busif(struct rsnd_dai_stream *io, struct rsnd_mod *mod)
+ {
+ struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ int use_busif = 0;
+
+ if (!rsnd_ssi_is_dma_mode(mod))
+@@ -226,10 +225,9 @@ static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi,
+ rsnd_mod_name(&ssi->mod), rsnd_mod_id(&ssi->mod));
+ }
+
+-static void rsnd_ssi_hw_stop(struct rsnd_ssi *ssi)
++static void rsnd_ssi_hw_stop(struct rsnd_dai_stream *io, struct rsnd_ssi *ssi)
+ {
+ struct rsnd_priv *priv = rsnd_mod_to_priv(&ssi->mod);
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(&ssi->mod);
+ struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
+ struct device *dev = rsnd_priv_to_dev(priv);
+ u32 cr;
+@@ -263,7 +261,7 @@ static void rsnd_ssi_hw_stop(struct rsnd_ssi *ssi)
+ struct rsnd_ssi *ssi_parent = rsnd_ssi_parent(ssi);
+
+ if (ssi_parent)
+- rsnd_ssi_hw_stop(ssi_parent);
++ rsnd_ssi_hw_stop(io, ssi_parent);
+ else
+ rsnd_ssi_master_clk_stop(ssi);
+ }
+@@ -396,7 +394,7 @@ static int rsnd_ssi_start(struct rsnd_mod *mod,
+ {
+ struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
+
+- rsnd_src_ssiu_start(mod, io, rsnd_ssi_use_busif(mod));
++ rsnd_src_ssiu_start(mod, io, rsnd_ssi_use_busif(io, mod));
+
+ rsnd_ssi_hw_start(ssi, io);
+
+@@ -415,19 +413,18 @@ static int rsnd_ssi_stop(struct rsnd_mod *mod,
+
+ rsnd_ssi_record_error(ssi, rsnd_mod_read(mod, SSISR));
+
+- rsnd_ssi_hw_stop(ssi);
++ rsnd_ssi_hw_stop(io, ssi);
+
+ rsnd_src_ssiu_stop(mod, io);
+
+ return 0;
+ }
+
+-static irqreturn_t rsnd_ssi_interrupt(int irq, void *data)
++static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io)
+ {
+- struct rsnd_ssi *ssi = data;
+- struct rsnd_mod *mod = &ssi->mod;
++ struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
+ struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ int is_dma = rsnd_ssi_is_dma_mode(mod);
+ u32 status;
+ bool elapsed = false;
+@@ -483,6 +480,13 @@ rsnd_ssi_interrupt_out:
+
+ if (elapsed)
+ rsnd_dai_period_elapsed(io);
++}
++
++static irqreturn_t rsnd_ssi_interrupt(int irq, void *data)
++{
++ struct rsnd_mod *mod = data;
++
++ rsnd_mod_interrupt(mod, __rsnd_ssi_interrupt);
+
+ return IRQ_HANDLED;
+ }
+@@ -501,7 +505,7 @@ static int rsnd_ssi_pio_probe(struct rsnd_mod *mod,
+ ret = devm_request_irq(dev, ssi->info->irq,
+ rsnd_ssi_interrupt,
+ IRQF_SHARED,
+- dev_name(dev), ssi);
++ dev_name(dev), mod);
+
+ return ret;
+ }
+@@ -528,7 +532,7 @@ static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
+ ret = devm_request_irq(dev, ssi->info->irq,
+ rsnd_ssi_interrupt,
+ IRQF_SHARED,
+- dev_name(dev), ssi);
++ dev_name(dev), mod);
+ if (ret)
+ return ret;
+
+@@ -609,7 +613,7 @@ static struct dma_chan *rsnd_ssi_dma_req(struct rsnd_dai_stream *io,
+ int is_play = rsnd_io_is_play(io);
+ char *name;
+
+- if (rsnd_ssi_use_busif(mod))
++ if (rsnd_ssi_use_busif(io, mod))
+ name = is_play ? "rxu" : "txu";
+ else
+ name = is_play ? "rx" : "tx";
+--
+2.6.2
+
diff --git a/patches.renesas/0125-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-rsnd_src_xxx.patch b/patches.renesas/0125-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-rsnd_src_xxx.patch
new file mode 100644
index 00000000000000..3e747a34e11355
--- /dev/null
+++ b/patches.renesas/0125-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-rsnd_src_xxx.patch
@@ -0,0 +1,212 @@
+From 46bde161596dbc769df6e8f60de78d3e4b0fedb1 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Mon, 15 Jun 2015 06:27:13 +0000
+Subject: [PATCH 125/129] ASoC: rsnd: don't use rsnd_mod_to_io() on
+ rsnd_src_xxx()
+
+Each Renesas sound mod (= SSI/SRC/DVC) might be called from many paths
+if it supports MIXer. In such case, mod <-> io is no longer 1:1
+relationship. This patch removes rsnd_mod_to_io() from rsnd_src_xxx()
+and related function.
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit 88c61cff4dab7c23a101b12041c99da61df305dd)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/src.c | 57 +++++++++++++++++++++++++++----------------------
+ 1 file changed, 32 insertions(+), 25 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c
+index 62216196af9c..bc122ede3254 100644
+--- a/sound/soc/sh/rcar/src.c
++++ b/sound/soc/sh/rcar/src.c
+@@ -236,10 +236,9 @@ int rsnd_src_ssi_irq_disable(struct rsnd_mod *ssi_mod)
+ return 0;
+ }
+
+-static u32 rsnd_src_convert_rate(struct rsnd_src *src)
++static u32 rsnd_src_convert_rate(struct rsnd_dai_stream *io,
++ struct rsnd_src *src)
+ {
+- struct rsnd_mod *mod = &src->mod;
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
+ u32 convert_rate;
+
+@@ -275,7 +274,7 @@ unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv,
+ * return convert rate if SRC is used,
+ * otherwise, return runtime->rate as usual
+ */
+- rate = rsnd_src_convert_rate(src);
++ rate = rsnd_src_convert_rate(io, src);
+ }
+
+ if (!rate)
+@@ -289,7 +288,7 @@ static int rsnd_src_set_convert_rate(struct rsnd_mod *mod,
+ {
+ struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
+ struct rsnd_src *src = rsnd_mod_to_src(mod);
+- u32 convert_rate = rsnd_src_convert_rate(src);
++ u32 convert_rate = rsnd_src_convert_rate(io, src);
+ u32 fsrate = 0;
+
+ if (convert_rate)
+@@ -414,9 +413,9 @@ static int rsnd_src_stop(struct rsnd_mod *mod)
+ /*
+ * Gen1 functions
+ */
+-static int rsnd_src_set_route_gen1(struct rsnd_mod *mod)
++static int rsnd_src_set_route_gen1(struct rsnd_dai_stream *io,
++ struct rsnd_mod *mod)
+ {
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ struct src_route_config {
+ u32 mask;
+ int shift;
+@@ -451,13 +450,13 @@ static int rsnd_src_set_route_gen1(struct rsnd_mod *mod)
+ return 0;
+ }
+
+-static int rsnd_src_set_convert_timing_gen1(struct rsnd_mod *mod)
++static int rsnd_src_set_convert_timing_gen1(struct rsnd_dai_stream *io,
++ struct rsnd_mod *mod)
+ {
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+ struct rsnd_src *src = rsnd_mod_to_src(mod);
+ struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
+- u32 convert_rate = rsnd_src_convert_rate(src);
++ u32 convert_rate = rsnd_src_convert_rate(io, src);
+ u32 mask;
+ u32 val;
+ int shift;
+@@ -527,7 +526,7 @@ static int rsnd_src_set_convert_rate_gen1(struct rsnd_mod *mod,
+ rsnd_mod_read(mod, SRC_IFSVR) / 100 * 98);
+
+ /* Gen1/Gen2 are not compatible */
+- if (rsnd_src_convert_rate(src))
++ if (rsnd_src_convert_rate(io, src))
+ rsnd_mod_write(mod, SRC_ROUTE_MODE0, 1);
+
+ /* no SRC_BFSSR settings, since SRC_SRCCR::BUFMD is 0 */
+@@ -545,7 +544,7 @@ static int rsnd_src_init_gen1(struct rsnd_mod *mod,
+ if (ret < 0)
+ return ret;
+
+- ret = rsnd_src_set_route_gen1(mod);
++ ret = rsnd_src_set_route_gen1(io, mod);
+ if (ret < 0)
+ return ret;
+
+@@ -553,7 +552,7 @@ static int rsnd_src_init_gen1(struct rsnd_mod *mod,
+ if (ret < 0)
+ return ret;
+
+- ret = rsnd_src_set_convert_timing_gen1(mod);
++ ret = rsnd_src_set_convert_timing_gen1(io, mod);
+ if (ret < 0)
+ return ret;
+
+@@ -650,9 +649,9 @@ static bool rsnd_src_error_record_gen2(struct rsnd_mod *mod)
+ return ret;
+ }
+
+-static int _rsnd_src_start_gen2(struct rsnd_mod *mod)
++static int _rsnd_src_start_gen2(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io)
+ {
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ u32 val = rsnd_io_to_mod_dvc(io) ? 0x01 : 0x11;
+
+ rsnd_mod_write(mod, SRC_CTRL, val);
+@@ -677,9 +676,9 @@ static int _rsnd_src_stop_gen2(struct rsnd_mod *mod)
+ return rsnd_src_stop(mod);
+ }
+
+-static irqreturn_t rsnd_src_interrupt_gen2(int irq, void *data)
++static void __rsnd_src_interrupt_gen2(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io)
+ {
+- struct rsnd_mod *mod = data;
+ struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+
+ spin_lock(&priv->lock);
+@@ -698,12 +697,20 @@ static irqreturn_t rsnd_src_interrupt_gen2(int irq, void *data)
+
+ _rsnd_src_stop_gen2(mod);
+ if (src->err < 1024)
+- _rsnd_src_start_gen2(mod);
++ _rsnd_src_start_gen2(mod, io);
+ else
+ dev_warn(dev, "no more SRC restart\n");
+ }
++
+ rsnd_src_interrupt_gen2_out:
+ spin_unlock(&priv->lock);
++}
++
++static irqreturn_t rsnd_src_interrupt_gen2(int irq, void *data)
++{
++ struct rsnd_mod *mod = data;
++
++ rsnd_mod_interrupt(mod, __rsnd_src_interrupt_gen2);
+
+ return IRQ_HANDLED;
+ }
+@@ -715,7 +722,7 @@ static int rsnd_src_set_convert_rate_gen2(struct rsnd_mod *mod,
+ struct device *dev = rsnd_priv_to_dev(priv);
+ struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
+ struct rsnd_src *src = rsnd_mod_to_src(mod);
+- u32 convert_rate = rsnd_src_convert_rate(src);
++ u32 convert_rate = rsnd_src_convert_rate(io, src);
+ u32 cr, route;
+ uint ratio;
+ int ret;
+@@ -769,12 +776,12 @@ static int rsnd_src_set_convert_rate_gen2(struct rsnd_mod *mod,
+ return 0;
+ }
+
+-static int rsnd_src_set_convert_timing_gen2(struct rsnd_mod *mod)
++static int rsnd_src_set_convert_timing_gen2(struct rsnd_dai_stream *io,
++ struct rsnd_mod *mod)
+ {
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
+ struct rsnd_src *src = rsnd_mod_to_src(mod);
+- u32 convert_rate = rsnd_src_convert_rate(src);
++ u32 convert_rate = rsnd_src_convert_rate(io, src);
+ int ret;
+
+ if (convert_rate)
+@@ -840,7 +847,7 @@ static int rsnd_src_init_gen2(struct rsnd_mod *mod,
+ if (ret < 0)
+ return ret;
+
+- ret = rsnd_src_set_convert_timing_gen2(mod);
++ ret = rsnd_src_set_convert_timing_gen2(io, mod);
+ if (ret < 0)
+ return ret;
+
+@@ -853,7 +860,7 @@ static int rsnd_src_start_gen2(struct rsnd_mod *mod,
+ {
+ rsnd_dma_start(io, rsnd_mod_to_dma(mod));
+
+- return _rsnd_src_start_gen2(mod);
++ return _rsnd_src_start_gen2(mod, io);
+ }
+
+ static int rsnd_src_stop_gen2(struct rsnd_mod *mod,
+@@ -874,7 +881,7 @@ static void rsnd_src_reconvert_update(struct rsnd_mod *mod)
+ struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
+ struct rsnd_src *src = rsnd_mod_to_src(mod);
+- u32 convert_rate = rsnd_src_convert_rate(src);
++ u32 convert_rate = rsnd_src_convert_rate(io, src);
+ u32 fsrate;
+
+ if (!runtime)
+--
+2.6.2
+
diff --git a/patches.renesas/0126-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-snd_kcontrol.patch b/patches.renesas/0126-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-snd_kcontrol.patch
new file mode 100644
index 00000000000000..c63b614ccbc1c3
--- /dev/null
+++ b/patches.renesas/0126-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-snd_kcontrol.patch
@@ -0,0 +1,264 @@
+From e076b76193833601a9517556a9ac4c7806e0394b Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Mon, 15 Jun 2015 06:27:28 +0000
+Subject: [PATCH 126/129] ASoC: rsnd: don't use rsnd_mod_to_io() on
+ snd_kcontrol
+
+Each Renesas sound mod (= SSI/SRC/DVC) might be called from many paths
+if it supports MIXer. In such case, mod <-> io is no longer 1:1
+relationship. This patch removes rsnd_mod_to_io() from snd_kcontrol
+and related function.
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit b65a7cccb58ce5acfed579e1ca10f8a4d3d0dd04)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/core.c | 25 +++++++++++++++++--------
+ sound/soc/sh/rcar/dvc.c | 15 ++++++++-------
+ sound/soc/sh/rcar/rsnd.h | 15 +++++++++++----
+ sound/soc/sh/rcar/src.c | 8 ++++----
+ 4 files changed, 40 insertions(+), 23 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
+index daa01e2aebb6..266b24ae621d 100644
+--- a/sound/soc/sh/rcar/core.c
++++ b/sound/soc/sh/rcar/core.c
+@@ -880,16 +880,18 @@ static int rsnd_kctrl_put(struct snd_kcontrol *kctrl,
+ }
+
+ if (change)
+- cfg->update(mod);
++ cfg->update(cfg->io, mod);
+
+ return change;
+ }
+
+ static int __rsnd_kctrl_new(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct snd_soc_pcm_runtime *rtd,
+ const unsigned char *name,
+ struct rsnd_kctrl_cfg *cfg,
+- void (*update)(struct rsnd_mod *mod))
++ void (*update)(struct rsnd_dai_stream *io,
++ struct rsnd_mod *mod))
+ {
+ struct snd_soc_card *soc_card = rtd->card;
+ struct snd_card *card = rtd->card->snd_card;
+@@ -918,6 +920,7 @@ static int __rsnd_kctrl_new(struct rsnd_mod *mod,
+ cfg->update = update;
+ cfg->card = card;
+ cfg->kctrl = kctrl;
++ cfg->io = io;
+
+ return 0;
+ }
+@@ -928,36 +931,42 @@ void _rsnd_kctrl_remove(struct rsnd_kctrl_cfg *cfg)
+ }
+
+ int rsnd_kctrl_new_m(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct snd_soc_pcm_runtime *rtd,
+ const unsigned char *name,
+- void (*update)(struct rsnd_mod *mod),
++ void (*update)(struct rsnd_dai_stream *io,
++ struct rsnd_mod *mod),
+ struct rsnd_kctrl_cfg_m *_cfg,
+ u32 max)
+ {
+ _cfg->cfg.max = max;
+ _cfg->cfg.size = RSND_DVC_CHANNELS;
+ _cfg->cfg.val = _cfg->val;
+- return __rsnd_kctrl_new(mod, rtd, name, &_cfg->cfg, update);
++ return __rsnd_kctrl_new(mod, io, rtd, name, &_cfg->cfg, update);
+ }
+
+ int rsnd_kctrl_new_s(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct snd_soc_pcm_runtime *rtd,
+ const unsigned char *name,
+- void (*update)(struct rsnd_mod *mod),
++ void (*update)(struct rsnd_dai_stream *io,
++ struct rsnd_mod *mod),
+ struct rsnd_kctrl_cfg_s *_cfg,
+ u32 max)
+ {
+ _cfg->cfg.max = max;
+ _cfg->cfg.size = 1;
+ _cfg->cfg.val = &_cfg->val;
+- return __rsnd_kctrl_new(mod, rtd, name, &_cfg->cfg, update);
++ return __rsnd_kctrl_new(mod, io, rtd, name, &_cfg->cfg, update);
+ }
+
+ int rsnd_kctrl_new_e(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct snd_soc_pcm_runtime *rtd,
+ const unsigned char *name,
+ struct rsnd_kctrl_cfg_s *_cfg,
+- void (*update)(struct rsnd_mod *mod),
++ void (*update)(struct rsnd_dai_stream *io,
++ struct rsnd_mod *mod),
+ const char * const *texts,
+ u32 max)
+ {
+@@ -965,7 +974,7 @@ int rsnd_kctrl_new_e(struct rsnd_mod *mod,
+ _cfg->cfg.size = 1;
+ _cfg->cfg.val = &_cfg->val;
+ _cfg->cfg.texts = texts;
+- return __rsnd_kctrl_new(mod, rtd, name, &_cfg->cfg, update);
++ return __rsnd_kctrl_new(mod, io, rtd, name, &_cfg->cfg, update);
+ }
+
+ /*
+diff --git a/sound/soc/sh/rcar/dvc.c b/sound/soc/sh/rcar/dvc.c
+index 3aac790534f0..36fc020cbc18 100644
+--- a/sound/soc/sh/rcar/dvc.c
++++ b/sound/soc/sh/rcar/dvc.c
+@@ -63,7 +63,8 @@ static const char * const dvc_ramp_rate[] = {
+ "0.125 dB/8192 steps", /* 10111 */
+ };
+
+-static void rsnd_dvc_volume_update(struct rsnd_mod *mod)
++static void rsnd_dvc_volume_update(struct rsnd_dai_stream *io,
++ struct rsnd_mod *mod)
+ {
+ struct rsnd_dvc *dvc = rsnd_mod_to_dvc(mod);
+ u32 val[RSND_DVC_CHANNELS];
+@@ -172,7 +173,7 @@ static int rsnd_dvc_init(struct rsnd_mod *dvc_mod,
+ rsnd_mod_write(dvc_mod, DVC_ADINR, rsnd_get_adinr(dvc_mod, io));
+
+ /* ch0/ch1 Volume */
+- rsnd_dvc_volume_update(dvc_mod);
++ rsnd_dvc_volume_update(io, dvc_mod);
+
+ rsnd_mod_write(dvc_mod, DVC_DVUIR, 0);
+
+@@ -217,7 +218,7 @@ static int rsnd_dvc_pcm_new(struct rsnd_mod *mod,
+ int ret;
+
+ /* Volume */
+- ret = rsnd_kctrl_new_m(mod, rtd,
++ ret = rsnd_kctrl_new_m(mod, io, rtd,
+ is_play ?
+ "DVC Out Playback Volume" : "DVC In Capture Volume",
+ rsnd_dvc_volume_update,
+@@ -226,7 +227,7 @@ static int rsnd_dvc_pcm_new(struct rsnd_mod *mod,
+ return ret;
+
+ /* Mute */
+- ret = rsnd_kctrl_new_m(mod, rtd,
++ ret = rsnd_kctrl_new_m(mod, io, rtd,
+ is_play ?
+ "DVC Out Mute Switch" : "DVC In Mute Switch",
+ rsnd_dvc_volume_update,
+@@ -235,7 +236,7 @@ static int rsnd_dvc_pcm_new(struct rsnd_mod *mod,
+ return ret;
+
+ /* Ramp */
+- ret = rsnd_kctrl_new_s(mod, rtd,
++ ret = rsnd_kctrl_new_s(mod, io, rtd,
+ is_play ?
+ "DVC Out Ramp Switch" : "DVC In Ramp Switch",
+ rsnd_dvc_volume_update,
+@@ -243,7 +244,7 @@ static int rsnd_dvc_pcm_new(struct rsnd_mod *mod,
+ if (ret < 0)
+ return ret;
+
+- ret = rsnd_kctrl_new_e(mod, rtd,
++ ret = rsnd_kctrl_new_e(mod, io, rtd,
+ is_play ?
+ "DVC Out Ramp Up Rate" : "DVC In Ramp Up Rate",
+ &dvc->rup,
+@@ -252,7 +253,7 @@ static int rsnd_dvc_pcm_new(struct rsnd_mod *mod,
+ if (ret < 0)
+ return ret;
+
+- ret = rsnd_kctrl_new_e(mod, rtd,
++ ret = rsnd_kctrl_new_e(mod, io, rtd,
+ is_play ?
+ "DVC Out Ramp Down Rate" : "DVC In Ramp Down Rate",
+ &dvc->rdown,
+diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
+index ac03d2008ee8..fdb443b4f183 100644
+--- a/sound/soc/sh/rcar/rsnd.h
++++ b/sound/soc/sh/rcar/rsnd.h
+@@ -487,7 +487,8 @@ struct rsnd_kctrl_cfg {
+ unsigned int size;
+ u32 *val;
+ const char * const *texts;
+- void (*update)(struct rsnd_mod *mod);
++ void (*update)(struct rsnd_dai_stream *io, struct rsnd_mod *mod);
++ struct rsnd_dai_stream *io;
+ struct snd_card *card;
+ struct snd_kcontrol *kctrl;
+ };
+@@ -507,22 +508,28 @@ void _rsnd_kctrl_remove(struct rsnd_kctrl_cfg *cfg);
+ #define rsnd_kctrl_remove(_cfg) _rsnd_kctrl_remove(&((_cfg).cfg))
+
+ int rsnd_kctrl_new_m(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct snd_soc_pcm_runtime *rtd,
+ const unsigned char *name,
+- void (*update)(struct rsnd_mod *mod),
++ void (*update)(struct rsnd_dai_stream *io,
++ struct rsnd_mod *mod),
+ struct rsnd_kctrl_cfg_m *_cfg,
+ u32 max);
+ int rsnd_kctrl_new_s(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct snd_soc_pcm_runtime *rtd,
+ const unsigned char *name,
+- void (*update)(struct rsnd_mod *mod),
++ void (*update)(struct rsnd_dai_stream *io,
++ struct rsnd_mod *mod),
+ struct rsnd_kctrl_cfg_s *_cfg,
+ u32 max);
+ int rsnd_kctrl_new_e(struct rsnd_mod *mod,
++ struct rsnd_dai_stream *io,
+ struct snd_soc_pcm_runtime *rtd,
+ const unsigned char *name,
+ struct rsnd_kctrl_cfg_s *_cfg,
+- void (*update)(struct rsnd_mod *mod),
++ void (*update)(struct rsnd_dai_stream *io,
++ struct rsnd_mod *mod),
+ const char * const *texts,
+ u32 max);
+
+diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c
+index bc122ede3254..67db69686515 100644
+--- a/sound/soc/sh/rcar/src.c
++++ b/sound/soc/sh/rcar/src.c
+@@ -876,9 +876,9 @@ static int rsnd_src_stop_gen2(struct rsnd_mod *mod,
+ return ret;
+ }
+
+-static void rsnd_src_reconvert_update(struct rsnd_mod *mod)
++static void rsnd_src_reconvert_update(struct rsnd_dai_stream *io,
++ struct rsnd_mod *mod)
+ {
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+ struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
+ struct rsnd_src *src = rsnd_mod_to_src(mod);
+ u32 convert_rate = rsnd_src_convert_rate(io, src);
+@@ -931,7 +931,7 @@ static int rsnd_src_pcm_new(struct rsnd_mod *mod,
+ /*
+ * enable sync convert
+ */
+- ret = rsnd_kctrl_new_s(mod, rtd,
++ ret = rsnd_kctrl_new_s(mod, io, rtd,
+ rsnd_io_is_play(io) ?
+ "SRC Out Rate Switch" :
+ "SRC In Rate Switch",
+@@ -940,7 +940,7 @@ static int rsnd_src_pcm_new(struct rsnd_mod *mod,
+ if (ret < 0)
+ return ret;
+
+- ret = rsnd_kctrl_new_s(mod, rtd,
++ ret = rsnd_kctrl_new_s(mod, io, rtd,
+ rsnd_io_is_play(io) ?
+ "SRC Out Rate" :
+ "SRC In Rate",
+--
+2.6.2
+
diff --git a/patches.renesas/0127-ASoC-rsnd-move-rsnd_mod_is_working-to-rsnd_io_is_wor.patch b/patches.renesas/0127-ASoC-rsnd-move-rsnd_mod_is_working-to-rsnd_io_is_wor.patch
new file mode 100644
index 00000000000000..dcb39115e47832
--- /dev/null
+++ b/patches.renesas/0127-ASoC-rsnd-move-rsnd_mod_is_working-to-rsnd_io_is_wor.patch
@@ -0,0 +1,103 @@
+From b6037cfa54af64234384837621516a912f269996 Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Mon, 15 Jun 2015 06:27:47 +0000
+Subject: [PATCH 127/129] ASoC: rsnd: move rsnd_mod_is_working() to
+ rsnd_io_is_working()
+
+Each Renesas sound mod (= SSI/SRC/DVC) might be called from many paths
+if it supports MIXer. In such case, mod <-> io is no longer 1:1
+relationship.
+This patch checks module working status via io instead of mod
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit d5bbe7de563ccce62765f1183561218b6dbdbe1e)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/core.c | 4 +---
+ sound/soc/sh/rcar/dma.c | 2 +-
+ sound/soc/sh/rcar/rsnd.h | 3 +--
+ sound/soc/sh/rcar/src.c | 2 +-
+ sound/soc/sh/rcar/ssi.c | 2 +-
+ 5 files changed, 5 insertions(+), 8 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
+index 266b24ae621d..1eca85ff3e91 100644
+--- a/sound/soc/sh/rcar/core.c
++++ b/sound/soc/sh/rcar/core.c
+@@ -196,10 +196,8 @@ void rsnd_mod_interrupt(struct rsnd_mod *mod,
+ }
+ }
+
+-int rsnd_mod_is_working(struct rsnd_mod *mod)
++int rsnd_io_is_working(struct rsnd_dai_stream *io)
+ {
+- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+-
+ /* see rsnd_dai_stream_init/quit() */
+ return !!io->substream;
+ }
+diff --git a/sound/soc/sh/rcar/dma.c b/sound/soc/sh/rcar/dma.c
+index 48b87bb10322..d306e298c63d 100644
+--- a/sound/soc/sh/rcar/dma.c
++++ b/sound/soc/sh/rcar/dma.c
+@@ -52,7 +52,7 @@ static void __rsnd_dmaen_complete(struct rsnd_mod *mod,
+ */
+ spin_lock_irqsave(&priv->lock, flags);
+
+- if (rsnd_mod_is_working(mod))
++ if (rsnd_io_is_working(io))
+ elapsed = rsnd_dai_pointer_update(io, io->byte_per_period);
+
+ spin_unlock_irqrestore(&priv->lock, flags);
+diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
+index fdb443b4f183..756930bc1914 100644
+--- a/sound/soc/sh/rcar/rsnd.h
++++ b/sound/soc/sh/rcar/rsnd.h
+@@ -326,7 +326,6 @@ int rsnd_mod_init(struct rsnd_priv *priv,
+ int id);
+ void rsnd_mod_quit(struct rsnd_mod *mod);
+ char *rsnd_mod_name(struct rsnd_mod *mod);
+-int rsnd_mod_is_working(struct rsnd_mod *mod);
+ struct dma_chan *rsnd_mod_dma_req(struct rsnd_dai_stream *io,
+ struct rsnd_mod *mod);
+ void rsnd_mod_interrupt(struct rsnd_mod *mod,
+@@ -356,7 +355,7 @@ struct rsnd_dai_stream {
+ #define rsnd_io_is_play(io) (&rsnd_io_to_rdai(io)->playback == io)
+ #define rsnd_io_to_runtime(io) ((io)->substream ? \
+ (io)->substream->runtime : NULL)
+-
++int rsnd_io_is_working(struct rsnd_dai_stream *io);
+
+ struct rsnd_dai {
+ char name[RSND_DAI_NAME_SIZE];
+diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c
+index 67db69686515..c61c17180142 100644
+--- a/sound/soc/sh/rcar/src.c
++++ b/sound/soc/sh/rcar/src.c
+@@ -684,7 +684,7 @@ static void __rsnd_src_interrupt_gen2(struct rsnd_mod *mod,
+ spin_lock(&priv->lock);
+
+ /* ignore all cases if not working */
+- if (!rsnd_mod_is_working(mod))
++ if (!rsnd_io_is_working(io))
+ goto rsnd_src_interrupt_gen2_out;
+
+ if (rsnd_src_error_record_gen2(mod)) {
+diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
+index fa1f2e5b9070..2fbe59f7f9b5 100644
+--- a/sound/soc/sh/rcar/ssi.c
++++ b/sound/soc/sh/rcar/ssi.c
+@@ -432,7 +432,7 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
+ spin_lock(&priv->lock);
+
+ /* ignore all cases if not working */
+- if (!rsnd_mod_is_working(mod))
++ if (!rsnd_io_is_working(io))
+ goto rsnd_ssi_interrupt_out;
+
+ status = rsnd_mod_read(mod, SSISR);
+--
+2.6.2
+
diff --git a/patches.renesas/0128-ASoC-rsnd-remove-io-from-rsnd_mod.patch b/patches.renesas/0128-ASoC-rsnd-remove-io-from-rsnd_mod.patch
new file mode 100644
index 00000000000000..d0068f4d25cf8c
--- /dev/null
+++ b/patches.renesas/0128-ASoC-rsnd-remove-io-from-rsnd_mod.patch
@@ -0,0 +1,62 @@
+From fed80e396f6268d0659a221883da961483665c1d Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Mon, 15 Jun 2015 06:28:03 +0000
+Subject: [PATCH 128/129] ASoC: rsnd: remove io from rsnd_mod
+
+Each Renesas sound mod (= SSI/SRC/DVC) might be called from many path
+if it supports MIXer. In such case, mod <-> io is no longer 1:1
+relationship. rsnd_mod_to_io() is no longer needed. Let's remove it.
+
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit 8a4e379b54f8cf1180cfee8ad3bfe16beedac65b)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/core.c | 2 --
+ sound/soc/sh/rcar/rsnd.h | 2 --
+ 2 files changed, 4 deletions(-)
+
+diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
+index 1eca85ff3e91..f1e5920654f6 100644
+--- a/sound/soc/sh/rcar/core.c
++++ b/sound/soc/sh/rcar/core.c
+@@ -288,7 +288,6 @@ static int rsnd_dai_connect(struct rsnd_mod *mod,
+ }
+
+ io->mod[mod->type] = mod;
+- mod->io = io;
+
+ return 0;
+ }
+@@ -296,7 +295,6 @@ static int rsnd_dai_connect(struct rsnd_mod *mod,
+ static void rsnd_dai_disconnect(struct rsnd_mod *mod,
+ struct rsnd_dai_stream *io)
+ {
+- mod->io = NULL;
+ io->mod[mod->type] = NULL;
+ }
+
+diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
+index 756930bc1914..09fcc54a8ee0 100644
+--- a/sound/soc/sh/rcar/rsnd.h
++++ b/sound/soc/sh/rcar/rsnd.h
+@@ -262,7 +262,6 @@ struct rsnd_mod {
+ enum rsnd_mod_type type;
+ struct rsnd_mod_ops *ops;
+ struct rsnd_dma dma;
+- struct rsnd_dai_stream *io;
+ struct rsnd_priv *priv;
+ struct clk *clk;
+ u32 status;
+@@ -313,7 +312,6 @@ struct rsnd_mod {
+
+ #define rsnd_mod_to_priv(mod) ((mod)->priv)
+ #define rsnd_mod_to_dma(mod) (&(mod)->dma)
+-#define rsnd_mod_to_io(mod) ((mod)->io)
+ #define rsnd_mod_id(mod) ((mod)->id)
+ #define rsnd_mod_hw_start(mod) clk_enable((mod)->clk)
+ #define rsnd_mod_hw_stop(mod) clk_disable((mod)->clk)
+--
+2.6.2
+
diff --git a/patches.renesas/0129-ASoC-rsrc-card-remove-unused-ret.patch b/patches.renesas/0129-ASoC-rsrc-card-remove-unused-ret.patch
new file mode 100644
index 00000000000000..0b2370e5540d30
--- /dev/null
+++ b/patches.renesas/0129-ASoC-rsrc-card-remove-unused-ret.patch
@@ -0,0 +1,33 @@
+From f0a3d14646566fece58c9aa912b8f690303d84ff Mon Sep 17 00:00:00 2001
+From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Date: Wed, 17 Jun 2015 00:36:48 +0000
+Subject: [PATCH 129/129] ASoC: rsrc-card: remove unused ret
+
+'047000278da3a17f8("ASoC: rsrc-card: cleanup for DPCM")'
+cleanuped rsrc-card driver, but then, unused ret was left.
+Below warning happen without this patch
+
+${LINUX}/sound/soc/sh/rcar/rsrc-card.c: In function 'rsrc_card_startup':
+${LINUX}/sound/soc/sh/rcar/rsrc-card.c:78:6: warning: unused variable \
+ 'ret' [-Wunused-variable]
+
+Reported-by: kbuild test robot <fengguang.wu@intel.com>
+Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+(cherry picked from commit 329d0c0cf1be0ad711bc2f9853fdacc33c1f72b4)
+Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
+---
+ sound/soc/sh/rcar/rsrc-card.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+--- a/sound/soc/sh/rcar/rsrc-card.c
++++ b/sound/soc/sh/rcar/rsrc-card.c
+@@ -75,8 +75,6 @@ static int rsrc_card_startup(struct snd_
+ struct rsrc_card_priv *priv = snd_soc_card_get_drvdata(rtd->card);
+ struct rsrc_card_dai *dai_props =
+ rsrc_priv_to_props(priv, rtd - rtd->card->rtd);
+- int ret;
+-
+
+ return clk_prepare_enable(dai_props->clk);
+ }
diff --git a/series b/series
index 78cd418ce773a4..cbe7a82251a54b 100644
--- a/series
+++ b/series
@@ -29,12 +29,137 @@ patches.ltsi/ltsi-makefile-addition.patch
#############################################################################
# Renesas patches
#
-
-#############################################################################
-# Intel patches
-#
+patches.renesas/0001-ARM-shmobile-r8a73a4-Add-IRQC-clock-to-device-tree.patch
+patches.renesas/0002-ARM-shmobile-r8a7790-Add-IRQC-clock-to-device-tree.patch
+patches.renesas/0003-ARM-shmobile-r8a7791-Add-IRQC-clock-to-device-tree.patch
+patches.renesas/0004-ARM-shmobile-r8a7794-Add-IRQC-clock-to-device-tree.patch
+patches.renesas/0005-clk-emev2-Silence-sparse-warnings.patch
+patches.renesas/0006-clk-shmobile-Add-r8a7778-SoC-to-MSTP-bindings.patch
+patches.renesas/0007-clk-shmobile-Add-r8a7793-SoC-to-MSTP-bindings.patch
+patches.renesas/0008-clk-shmobile-mstp-Document-mandatory-compatible-fall.patch
+patches.renesas/0009-i2c-sh_mobile-add-errata-workaround.patch
+patches.renesas/0010-i2c-sh_mobile-use-adapter-default-for-timeout.patch
+patches.renesas/0011-i2c-sh_mobile-use-proper-type-for-timeout.patch
+patches.renesas/0012-irqchip-Constify-irq_domain_ops.patch
+patches.renesas/0013-irqchip-renesas-intc-irqpin-Improve-binding-document.patch
+patches.renesas/0014-irqchip-irqc-Remove-platform-data-support.patch
+patches.renesas/0015-ARM-shmobile-r8a7790-Remove-MSIOF-address-from-devic.patch
+patches.renesas/0016-ARM-shmobile-r8a7791-Remove-MSIOF-address-from-devic.patch
+patches.renesas/0017-ARM-shmobile-r8a7740-dtsi-Fix-SCIFB-naming.patch
+patches.renesas/0018-ARM-shmobile-sh73a0-dtsi-Fix-SCIFB-naming.patch
+patches.renesas/0019-ARM-shmobile-defconfig-Replace-USB_RCAR_GEN2_PHY-by-.patch
+patches.renesas/0020-ARM-shmobile-r8a7740-dtsi-Use-generic-names-for-devi.patch
+patches.renesas/0021-ARM-shmobile-r8a7778-dtsi-Use-generic-names-for-devi.patch
+patches.renesas/0022-ARM-shmobile-r8a7779-dtsi-Use-generic-names-for-devi.patch
+patches.renesas/0023-ARM-shmobile-r8a7790-dtsi-Use-generic-names-for-devi.patch
+patches.renesas/0024-ARM-shmobile-r8a7791-dtsi-Use-generic-names-for-devi.patch
+patches.renesas/0025-ARM-shmobile-sh73a0-dtsi-Use-generic-names-for-devic.patch
+patches.renesas/0026-ARM-shmobile-ape6evm-dts-Use-generic-names-for-devic.patch
+patches.renesas/0027-ARM-shmobile-kzm9d-dts-Use-generic-names-for-device-.patch
+patches.renesas/0028-ARM-shmobile-marzen-dts-Use-generic-names-for-device.patch
+patches.renesas/0029-ARM-shmobile-armadillo800eva-dts-Use-generic-names-f.patch
+patches.renesas/0030-ARM-shmobile-henninger-dts-Add-nor-jedec-compatible-.patch
+patches.renesas/0031-ARM-shmobile-bockw-reference-dts-Add-nor-jedec-compa.patch
+patches.renesas/0032-ARM-shmobile-lager-dts-Add-nor-jedec-compatible-valu.patch
+patches.renesas/0033-ARM-shmobile-bockw-dts-Add-nor-jedec-compatible-valu.patch
+patches.renesas/0034-ARM-shmobile-koelsch-dts-Add-nor-jedec-compatible-va.patch
+patches.renesas/0035-ARM-shmobile-bockw-dts-Use-generic-names-for-device-.patch
+patches.renesas/0036-ARM-shmobile-lager-dts-Use-generic-names-for-device-.patch
+patches.renesas/0037-ARM-shmobile-koelsch-dts-Use-generic-names-for-devic.patch
+patches.renesas/0038-ARM-shmobile-kzm9g-dts-Configure-the-HOME-key-as-wak.patch
+patches.renesas/0039-ARM-shmobile-r8a7790-add-USB-DMAC-device-nodes.patch
+patches.renesas/0040-ARM-shmobile-r8a7790-Enable-DMA-for-HSUSB.patch
+patches.renesas/0041-ARM-shmobile-r8a7791-add-USB-DMAC-device-nodes.patch
+patches.renesas/0042-ARM-shmobile-r8a7791-Enable-DMA-for-HSUSB.patch
+patches.renesas/0043-ARM-shmobile-lager-dts-Replace-nor-jedec-by-jedec-sp.patch
+patches.renesas/0044-ARM-shmobile-koelsch-dts-Replace-nor-jedec-by-jedec-.patch
+patches.renesas/0045-ARM-shmobile-bockw-reference-dts-Replace-nor-jedec-b.patch
+patches.renesas/0046-ARM-shmobile-henninger-dts-Replace-nor-jedec-by-jede.patch
+patches.renesas/0047-ARM-shmobile-bockw-dts-Replace-nor-jedec-by-jedec-sp.patch
+patches.renesas/0048-ARM-shmobile-r8a7790-add-MMCIF-max-frequency.patch
+patches.renesas/0049-ARM-shmobile-r8a7791-add-MMCIF-max-frequency.patch
+patches.renesas/0050-ARM-shmobile-only-select-sound-drivers-that-build.patch
+patches.renesas/0051-ARM-shmobile-r8a7794-dtsi-Describe-DMA-for-the-seria.patch
+patches.renesas/0052-ARM-shmobile-r8a7791-dtsi-Describe-DMA-for-the-seria.patch
+patches.renesas/0053-ARM-shmobile-r8a7790-dtsi-Describe-DMA-for-the-seria.patch
+patches.renesas/0055-ARM-shmobile-r8a7740-remove-I2C-errata-handling.patch
+patches.renesas/0056-phy-core-Check-requested-PHY-status-in-_of_phy_get.patch
+patches.renesas/0057-phy-rcar-gen2-Add-support-for-R-Car-E2.patch
+patches.renesas/0058-usb-phy-Remove-the-phy-rcar-gen2-usb-driver.patch
+patches.renesas/0059-pinctrl-allow-exlusive-GPIO-mux-pin-allocation.patch
+patches.renesas/0060-pinctrl-move-strict-option-to-pinmux_ops.patch
+patches.renesas/0061-pinctrl-use-ERR_CAST-instead-of-ERR_PTR-PTR_ERR.patch
+patches.renesas/0062-pinctrl-Grammar-s-used-in-as-used-as.patch
+patches.renesas/0063-pinctrl-improve-debugfs-for-strict-controllers.patch
+patches.renesas/0064-pinctrl-remove-useless-const-qualifier.patch
+patches.renesas/0065-pinctrl-use-const-struct-.-rather-than-struct-.-cons.patch
+patches.renesas/0066-pinctrl-fix-confusing-debug-message-in-pinctrl_regis.patch
+patches.renesas/0067-pinctrl-don-t-print-unavailable-function-groups.patch
+patches.renesas/0068-pinctrl-make-pinctrl_register-return-proper-error-co.patch
+patches.renesas/0069-dmaengine-rcar-dmac-fixup-spinlock-in-rcar-dmac.patch
+patches.renesas/0070-dmaengine-rcar-dmac-Use-DECLARE_BITMAP.patch
+patches.renesas/0071-drm-rcar-du-Document-the-rcar_du_crtc-structure.patch
+patches.renesas/0072-drm-rcar-du-Document-the-rcar_du_plane_state-structu.patch
+patches.renesas/0073-drm-rcar-du-Move-properties-from-rcar_du_planes-to-r.patch
+patches.renesas/0074-drm-rcar-du-Embed-rcar_du_planes-structure-into-rcar.patch
+patches.renesas/0075-drm-rcar-du-Rename-to_rcar_du_plane_state-to-to_rcar.patch
+patches.renesas/0076-drm-rcar-du-Add-plane-allocation-debugging.patch
+patches.renesas/0077-drm-rcar-du-Keep-plane-to-CRTC-associations-when-dis.patch
+patches.renesas/0078-drm-rcar-du-Consider-plane-to-CRTC-associations-in-t.patch
+patches.renesas/0079-drm-rcar-du-Store-the-number-of-CRTCs-per-group-in-t.patch
+patches.renesas/0080-drm-rcar-du-Split-planes-pre-association-4-4-between.patch
+patches.renesas/0081-drm-rcar-du-Print-the-error-value-when-DRM-KMS-init-.patch
+patches.renesas/0082-drm-rcar-du-Disable-all-planes-when-stopping-the-CRT.patch
+patches.renesas/0083-drm-rcar-du-Fix-crash-with-groups-that-have-less-tha.patch
+patches.renesas/0084-drm-rcar-du-Clarify-error-message-when-encoder-initi.patch
+patches.renesas/0085-drm-rcar-du-Convert-rcar_du_encoders_init_one-return.patch
+patches.renesas/0086-drm-rcar-du-Clean-up-planes-in-the-error-paths-of-.a.patch
+patches.renesas/0087-drm-rcar-du-Use-the-drm-atomic-state-duplication-hel.patch
+patches.renesas/0088-i2c-add-FUNC-flag-for-slave-capabilities.patch
+patches.renesas/0089-i2c-constify-platform_device_id.patch
+patches.renesas/0090-i2c-rcar-report-slave-capabilities-to-users.patch
+patches.renesas/0091-i2c-rcar-use-adapter-default-for-timeout.patch
+patches.renesas/0092-i2c-rcar-use-proper-type-for-timeout.patch
+patches.renesas/0093-media-rcar-vin-use-monotonic-timestamps.patch
+patches.renesas/0094-sh-pfc-fix-sparse-GPIOs-for-R-Car-SoCs.patch
+patches.renesas/0095-ASoC-soc-pcm-DPCM-cares-BE-format.patch
+patches.renesas/0096-ASoC-rsnd-add-rsnd_dai_to_priv-macro.patch
+patches.renesas/0097-ASoC-rsnd-make-sure-it-uses-lock-when-it-calls-rsnd_.patch
+patches.renesas/0098-ASoC-rsnd-tidyup-SSI-parent-related-function-macro-n.patch
+patches.renesas/0099-ASoC-rsnd-make-sure-SSI-parent-child-uses-same-numbe.patch
+patches.renesas/0100-ASoC-rsnd-care-snd_kcontrol-s-index.patch
+patches.renesas/0101-ASoC-rsnd-Use-generic-names-for-device-nodes.patch
+patches.renesas/0102-ASoC-rsnd-revert-lock-for-calls-to-rsnd_dai_call.patch
+patches.renesas/0103-ASoC-rsnd-indicate-unknown-HW-start.patch
+patches.renesas/0104-ASoC-rsnd-add-rsnd_dai_stream_quit.patch
+patches.renesas/0105-ASoC-rsnd-rsrc-card-uses-FE-BE-merged-format-when-DP.patch
+patches.renesas/0106-ASoC-rsnd-spin-lock-for-interrupt-handler.patch
+patches.renesas/0107-ASoC-rsnd-Document-r8a7778-specific-binding.patch
+patches.renesas/0108-ASoC-rsnd-don-t-care-under-over-run-error-when-PIO.patch
+patches.renesas/0109-ASoC-rsnd-don-t-call-snd_pcm_period_elapsed-under-sp.patch
+patches.renesas/0110-ASoC-rsrc-card-used-fe.xxx-be.xxx-name-for-dai_link.patch
+patches.renesas/0111-ASoC-rsrc-card-tidyup-priv-snd_card-setup-timing.patch
+patches.renesas/0112-ASoC-rsrc-card-enable-multi-cpu-codec-for-DPCM.patch
+patches.renesas/0113-ASoC-rsrc-card-remove-unused-name.patch
+patches.renesas/0114-ASoC-rsnd-card-tidyup-rsrc_priv_to_.patch
+patches.renesas/0115-ASoC-rsrc-card-move-rsrc_card_parse_daifmt-to-upper-.patch
+patches.renesas/0116-ASoC-rsrc-card-tidyup-return-value-of-clock-error.patch
+patches.renesas/0117-ASoC-rsrc-card-cleanup-for-DPCM.patch
+patches.renesas/0118-ASoC-rsnd-count-each-mod-SSI-SRC-DVC.patch
+patches.renesas/0119-ASoC-rsnd-rsnd_mod-has-rsnd_priv.patch
+patches.renesas/0120-ASoC-rsnd-adds-struct-rsnd_dai_stream-as-on-each-fuc.patch
+patches.renesas/0121-ASoC-rsnd-add-common-interrupt-handler-for-SSI-SRC-D.patch
+patches.renesas/0122-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-rsnd_get_adinr.patch
+patches.renesas/0123-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-rsnd_dma_xxx.patch
+patches.renesas/0124-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-rsnd_ssi_xxx.patch
+patches.renesas/0125-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-rsnd_src_xxx.patch
+patches.renesas/0126-ASoC-rsnd-don-t-use-rsnd_mod_to_io-on-snd_kcontrol.patch
+patches.renesas/0127-ASoC-rsnd-move-rsnd_mod_is_working-to-rsnd_io_is_wor.patch
+patches.renesas/0128-ASoC-rsnd-remove-io-from-rsnd_mod.patch
+patches.renesas/0129-ASoC-rsrc-card-remove-unused-ret.patch
#############################################################################
# fixes that go after all of the above
#
+